]> Creatis software - gdcm.git/commitdiff
ENH: Huge update to openjpeg 1.0 (actually more CVS)...
authormalaterre <malaterre>
Tue, 24 Jan 2006 19:54:07 +0000 (19:54 +0000)
committermalaterre <malaterre>
Tue, 24 Jan 2006 19:54:07 +0000 (19:54 +0000)
49 files changed:
src/gdcmopenjpeg/CMakeLists.txt
src/gdcmopenjpeg/codec/compat/getopt.c
src/gdcmopenjpeg/codec/compat/getopt.h
src/gdcmopenjpeg/codec/convert.c
src/gdcmopenjpeg/codec/convert.h
src/gdcmopenjpeg/codec/image_to_j2k.c
src/gdcmopenjpeg/codec/j2k_to_image.c
src/gdcmopenjpeg/libopenjpeg/CMakeLists.txt
src/gdcmopenjpeg/libopenjpeg/bio.c
src/gdcmopenjpeg/libopenjpeg/bio.h
src/gdcmopenjpeg/libopenjpeg/cio.c
src/gdcmopenjpeg/libopenjpeg/cio.h
src/gdcmopenjpeg/libopenjpeg/dwt.c
src/gdcmopenjpeg/libopenjpeg/dwt.h
src/gdcmopenjpeg/libopenjpeg/event.c [new file with mode: 0644]
src/gdcmopenjpeg/libopenjpeg/event.h [new file with mode: 0644]
src/gdcmopenjpeg/libopenjpeg/fix.c
src/gdcmopenjpeg/libopenjpeg/fix.h
src/gdcmopenjpeg/libopenjpeg/image.c [new file with mode: 0644]
src/gdcmopenjpeg/libopenjpeg/image.h [new file with mode: 0644]
src/gdcmopenjpeg/libopenjpeg/int.c
src/gdcmopenjpeg/libopenjpeg/int.h
src/gdcmopenjpeg/libopenjpeg/j2k.c
src/gdcmopenjpeg/libopenjpeg/j2k.h
src/gdcmopenjpeg/libopenjpeg/j2k_lib.c [new file with mode: 0644]
src/gdcmopenjpeg/libopenjpeg/j2k_lib.h [new file with mode: 0644]
src/gdcmopenjpeg/libopenjpeg/jp2.c
src/gdcmopenjpeg/libopenjpeg/jp2.h
src/gdcmopenjpeg/libopenjpeg/jpt.c
src/gdcmopenjpeg/libopenjpeg/jpt.h
src/gdcmopenjpeg/libopenjpeg/mct.c
src/gdcmopenjpeg/libopenjpeg/mct.h
src/gdcmopenjpeg/libopenjpeg/mqc.c
src/gdcmopenjpeg/libopenjpeg/mqc.h
src/gdcmopenjpeg/libopenjpeg/openjpeg.c [new file with mode: 0644]
src/gdcmopenjpeg/libopenjpeg/openjpeg.h
src/gdcmopenjpeg/libopenjpeg/opj_includes.h [new file with mode: 0644]
src/gdcmopenjpeg/libopenjpeg/pi.c
src/gdcmopenjpeg/libopenjpeg/pi.h
src/gdcmopenjpeg/libopenjpeg/raw.c
src/gdcmopenjpeg/libopenjpeg/raw.h
src/gdcmopenjpeg/libopenjpeg/t1.c
src/gdcmopenjpeg/libopenjpeg/t1.h
src/gdcmopenjpeg/libopenjpeg/t2.c
src/gdcmopenjpeg/libopenjpeg/t2.h
src/gdcmopenjpeg/libopenjpeg/tcd.c
src/gdcmopenjpeg/libopenjpeg/tcd.h
src/gdcmopenjpeg/libopenjpeg/tgt.c
src/gdcmopenjpeg/libopenjpeg/tgt.h

index 35d2019b2e096e5a5235fb0dd6c3c10782630c2e..9dc7f1eb1160b9c92dbe7a8db6e426b496b13fd7 100644 (file)
@@ -1,25 +1,41 @@
-PROJECT(OPENJPEG)
-
-# For openjpeg team if they ever want Dart+CMake
-IF(FALSE)
-  ENABLE_TESTING()
-  INCLUDE (${CMAKE_ROOT}/Modules/Dart.cmake)
-ENDIF(FALSE)
+PROJECT(OPENJPEG C)
 
 #-----------------------------------------------------------------------------
 # OPENJPEG version number, usefull for packaging and doxygen doc:
-SET(OPENJPEG_MAJOR_VERSION 0)
-SET(OPENJPEG_MINOR_VERSION 97)
+SET(OPENJPEG_MAJOR_VERSION 1)
+SET(OPENJPEG_MINOR_VERSION 0)
 SET(OPENJPEG_BUILD_VERSION 0)
 SET(OPENJPEG_VERSION
-      "${OPENJPEG_MAJOR_VERSION}.${OPENJPEG_MINOR_VERSION}.${OPENJPEG_BUILD_VERSION}")
+  "${OPENJPEG_MAJOR_VERSION}.${OPENJPEG_MINOR_VERSION}.${OPENJPEG_BUILD_VERSION}")
 
+#-----------------------------------------------------------------------------
+# OpenJPEG build configuration options.
+OPTION(BUILD_SHARED_LIBS "Build OpenJPEG with shared libraries." OFF)
+
+#-----------------------------------------------------------------------------
+# For the codec...
+OPTION(BUILD_EXAMPLES "Build the Examples (codec...)." OFF)
 
 #-----------------------------------------------------------------------------
+# Always build the library
 SUBDIRS(
-    libopenjpeg
-    #codec
-    )
+  libopenjpeg
+  )
+#-----------------------------------------------------------------------------
+# Build example only if requested
+IF(BUILD_EXAMPLES)
+  SUBDIRS(codec)
+ENDIF(BUILD_EXAMPLES)
 
-# TODO, technically we should not have to ...
+#-----------------------------------------------------------------------------
+# For openjpeg team if they ever want Dart+CMake
+IF(OPJ_STANDALONE)
+  INCLUDE(Dart)
+  MARK_AS_ADVANCED(BUILD_TESTING DART_ROOT TCL_TCLSH)
+  IF(BUILD_TESTING)
+    ENABLE_TESTING()
+  ENDIF(BUILD_TESTING)
+ENDIF(OPJ_STANDALONE)
+# TODO, technically we should add tests, e.g:
 # http://www.crc.ricoh.com/~gormish/jpeg2000conformance/
+
index afce7007b4d420dd5c94d5381939fcdf788e67ac..8b6c67ed3e6bcd6a4f72df1e23c9d114e3291a2b 100644 (file)
-/*
- * 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 */
-}
+/*\r
+ * Copyright (c) 1987, 1993, 1994\r
+ *  The Regents of the University of California.  All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ * 3. All advertising materials mentioning features or use of this software\r
+ *    must display the following acknowledgement:\r
+ *  This product includes software developed by the University of\r
+ *  California, Berkeley and its contributors.\r
+ * 4. Neither the name of the University nor the names of its contributors\r
+ *    may be used to endorse or promote products derived from this software\r
+ *    without specific prior written permission.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+/* last review : october 29th, 2002 */\r
+\r
+#if defined(LIBC_SCCS) && !defined(lint)\r
+static char sccsid[] = "@(#)getopt.c  8.3 (Berkeley) 4/27/95";\r
+#endif        /* LIBC_SCCS and not lint */\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+int opterr = 1,      /* if error message should be printed */\r
+ optind = 1,      /* index into parent argv vector */\r
+ optopt,      /* character checked for validity */\r
+ optreset;      /* reset getopt */\r
+char *optarg;      /* argument associated with option */\r
+\r
+#define  BADCH  (int)'?'\r
+#define  BADARG  (int)':'\r
+#define  EMSG  ""\r
+\r
+/*\r
+ * getopt --\r
+ *  Parse argc/argv argument vector.\r
+ */\r
+int getopt(int nargc, char *const *nargv, const char *ostr) {\r
+#  define __progname nargv[0]\r
+  static char *place = EMSG;  /* option letter processing */\r
+  char *oli;      /* option letter list index */\r
+\r
+  if (optreset || !*place) {  /* update scanning pointer */\r
+    optreset = 0;\r
+    if (optind >= nargc || *(place = nargv[optind]) != '-') {\r
+      place = EMSG;\r
+      return (-1);\r
+    }\r
+    if (place[1] && *++place == '-') {  /* found "--" */\r
+      ++optind;\r
+      place = EMSG;\r
+      return (-1);\r
+    }\r
+  }        /* option letter okay? */\r
+  if ((optopt = (int) *place++) == (int) ':' ||\r
+      !(oli = strchr(ostr, optopt))) {\r
+    /*\r
+     * if the user didn't specify '-' as an option,\r
+     * assume it means -1.\r
+     */\r
+    if (optopt == (int) '-')\r
+      return (-1);\r
+    if (!*place)\r
+      ++optind;\r
+    if (opterr && *ostr != ':')\r
+      (void) fprintf(stderr,\r
+         "%s: illegal option -- %c\n", __progname, optopt);\r
+    return (BADCH);\r
+  }\r
+  if (*++oli != ':') {    /* don't need argument */\r
+    optarg = NULL;\r
+    if (!*place)\r
+      ++optind;\r
+  } else {      /* need an argument */\r
+    if (*place)      /* no white space */\r
+      optarg = place;\r
+    else if (nargc <= ++optind) {  /* no arg */\r
+      place = EMSG;\r
+      if (*ostr == ':')\r
+  return (BADARG);\r
+      if (opterr)\r
+  (void) fprintf(stderr,\r
+           "%s: option requires an argument -- %c\n",\r
+           __progname, optopt);\r
+      return (BADCH);\r
+    } else      /* white space */\r
+      optarg = nargv[optind];\r
+    place = EMSG;\r
+    ++optind;\r
+  }\r
+  return (optopt);    /* dump back option letter */\r
+}\r
index f4f0f807288d407913025dc0c457db943f95c967..b5cdc35d8f528f8f857c4b7096faf21b10ff1008 100644 (file)
@@ -1,14 +1,14 @@
-/* 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_ */
+/* last review : october 29th, 2002 */\r
+\r
+#ifndef _GETOPT_H_\r
+#define _GETOPT_H_\r
+\r
+extern int opterr;\r
+extern int optind;\r
+extern int optopt;\r
+extern int optreset;\r
+extern char *optarg;\r
+\r
+extern int getopt(int nargc, char *const *nargv, const char *ostr);\r
+\r
+#endif        /* _GETOPT_H_ */\r
index 2aeed36698aa3746ac6c905388a33544dbc43d10..06b460aeca8721974fc8edfa161b8cdfb675e8eb 100644 (file)
-/*
- * 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) {
-    fprintf(stderr,"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:
-            fprintf(stderr,"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]; 
-
-  char endian1,endian2,sign;
-  char signtmp[32];
-
-  char temp[32];
-  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;
-    }
-
-    fseek(f, 0, SEEK_SET);
-    fscanf(f, "PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d",temp,&endian1,&endian2,signtmp,&prec,temp,&w,temp,&h);
-
-    i=0;
-
-    sign='+';
-
-    while (signtmp[i]!='\0') {
-      if (signtmp[i]=='-') sign='-';
-         i++;
-    }
-
-    fgetc(f);
-    if (endian1=='M' && endian2=='L')
-      bigendian = 1;
-    else if (endian2=='M' && endian1=='L')
-      bigendian = 0;
-    else {
-      fprintf(stderr, "Bad pgx header, please check input file\n");
-      return 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);
-    }
-    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;
-}
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include "openjpeg.h"\r
+\r
+/*\r
+ * Get logarithm of an integer and round downwards.\r
+ *\r
+ * log2(a)\r
+ */\r
+static int int_floorlog2(int a) {\r
+  int l;\r
+  for (l = 0; a > 1; l++) {\r
+    a >>= 1;\r
+  }\r
+  return l;\r
+}\r
+\r
+/*\r
+ * Divide an integer by a power of 2 and round upwards.\r
+ *\r
+ * a divided by 2^b\r
+ */\r
+static int int_ceildivpow2(int a, int b) {\r
+  return (a + (1 << b) - 1) >> b;\r
+}\r
+\r
+/*\r
+ * Divide an integer and round upwards.\r
+ *\r
+ * a divided by b\r
+ */\r
+static int int_ceildiv(int a, int b) {\r
+  return (a + b - 1) / b;\r
+}\r
+\r
+/* -->> -->> -->> -->>\r
+\r
+  BMP IMAGE FORMAT\r
+\r
+ <<-- <<-- <<-- <<-- */\r
+\r
+/* WORD defines a two byte word */\r
+typedef unsigned short int WORD;\r
+\r
+/* DWORD defines a four byte word */\r
+typedef unsigned long int DWORD;\r
+\r
+typedef struct {\r
+  WORD bfType;      /* 'BM' for Bitmap (19776) */\r
+  DWORD bfSize;      /* Size of the file        */\r
+  WORD bfReserved1;    /* Reserved : 0            */\r
+  WORD bfReserved2;    /* Reserved : 0            */\r
+  DWORD bfOffBits;    /* Offset                  */\r
+} BITMAPFILEHEADER_t;\r
+\r
+typedef struct {\r
+  DWORD biSize;      /* Size of the structure in bytes */\r
+  DWORD biWidth;    /* Width of the image in pixels */\r
+  DWORD biHeight;    /* Heigth of the image in pixels */\r
+  WORD biPlanes;    /* 1 */\r
+  WORD biBitCount;    /* Number of color bits by pixels */\r
+  DWORD biCompression;    /* Type of encoding 0: none 1: RLE8 2: RLE4 */\r
+  DWORD biSizeImage;    /* Size of the image in bytes */\r
+  DWORD biXpelsPerMeter;  /* Horizontal (X) resolution in pixels/meter */\r
+  DWORD biYpelsPerMeter;  /* Vertical (Y) resolution in pixels/meter */\r
+  DWORD biClrUsed;    /* Number of color used in the image (0: ALL) */\r
+  DWORD biClrImportant;    /* Number of important color (0: ALL) */\r
+} BITMAPINFOHEADER_t;\r
+\r
+opj_image_t* bmptoimage(char *filename, opj_cparameters_t *parameters) {\r
+  int subsampling_dx = parameters->subsampling_dx;\r
+  int subsampling_dy = parameters->subsampling_dy;\r
+\r
+  int i, numcomps, w, h;\r
+  OPJ_COLOR_SPACE color_space;\r
+  opj_image_cmptparm_t cmptparm[3];  /* maximum of 3 components */\r
+  opj_image_t * image = NULL;\r
+\r
+  FILE *IN;\r
+  BITMAPFILEHEADER_t File_h;\r
+  BITMAPINFOHEADER_t Info_h;\r
+  unsigned char *RGB;\r
+  unsigned char *table_R, *table_G, *table_B;\r
+  unsigned int j, PAD = 0;\r
+\r
+  int x, y, index;\r
+  int gray_scale = 1, not_end_file = 1; \r
+\r
+  unsigned int line = 0, col = 0;\r
+  unsigned char v, v2;\r
+  DWORD W, H;\r
+  \r
+  IN = fopen(filename, "rb");\r
+  if (!IN) {\r
+    fprintf(stderr, "\033[0;33mFailed to open %s for reading !!\033[0;39m\n", filename);\r
+    return 0;\r
+  }\r
+  \r
+  File_h.bfType = getc(IN);\r
+  File_h.bfType = (getc(IN) << 8) + File_h.bfType;\r
+  \r
+  if (File_h.bfType != 19778) {\r
+    fprintf(stderr,"Error, not a BMP file!\n");\r
+    return 0;\r
+  } else {\r
+    /* FILE HEADER */\r
+    /* ------------- */\r
+    File_h.bfSize = getc(IN);\r
+    File_h.bfSize = (getc(IN) << 8) + File_h.bfSize;\r
+    File_h.bfSize = (getc(IN) << 16) + File_h.bfSize;\r
+    File_h.bfSize = (getc(IN) << 24) + File_h.bfSize;\r
+\r
+    File_h.bfReserved1 = getc(IN);\r
+    File_h.bfReserved1 = (getc(IN) << 8) + File_h.bfReserved1;\r
+\r
+    File_h.bfReserved2 = getc(IN);\r
+    File_h.bfReserved2 = (getc(IN) << 8) + File_h.bfReserved2;\r
+\r
+    File_h.bfOffBits = getc(IN);\r
+    File_h.bfOffBits = (getc(IN) << 8) + File_h.bfOffBits;\r
+    File_h.bfOffBits = (getc(IN) << 16) + File_h.bfOffBits;\r
+    File_h.bfOffBits = (getc(IN) << 24) + File_h.bfOffBits;\r
+\r
+    /* INFO HEADER */\r
+    /* ------------- */\r
+\r
+    Info_h.biSize = getc(IN);\r
+    Info_h.biSize = (getc(IN) << 8) + Info_h.biSize;\r
+    Info_h.biSize = (getc(IN) << 16) + Info_h.biSize;\r
+    Info_h.biSize = (getc(IN) << 24) + Info_h.biSize;\r
+\r
+    Info_h.biWidth = getc(IN);\r
+    Info_h.biWidth = (getc(IN) << 8) + Info_h.biWidth;\r
+    Info_h.biWidth = (getc(IN) << 16) + Info_h.biWidth;\r
+    Info_h.biWidth = (getc(IN) << 24) + Info_h.biWidth;\r
+    w = Info_h.biWidth;\r
+\r
+    Info_h.biHeight = getc(IN);\r
+    Info_h.biHeight = (getc(IN) << 8) + Info_h.biHeight;\r
+    Info_h.biHeight = (getc(IN) << 16) + Info_h.biHeight;\r
+    Info_h.biHeight = (getc(IN) << 24) + Info_h.biHeight;\r
+    h = Info_h.biHeight;\r
+\r
+    Info_h.biPlanes = getc(IN);\r
+    Info_h.biPlanes = (getc(IN) << 8) + Info_h.biPlanes;\r
+\r
+    Info_h.biBitCount = getc(IN);\r
+    Info_h.biBitCount = (getc(IN) << 8) + Info_h.biBitCount;\r
+\r
+    Info_h.biCompression = getc(IN);\r
+    Info_h.biCompression = (getc(IN) << 8) + Info_h.biCompression;\r
+    Info_h.biCompression = (getc(IN) << 16) + Info_h.biCompression;\r
+    Info_h.biCompression = (getc(IN) << 24) + Info_h.biCompression;\r
+\r
+    Info_h.biSizeImage = getc(IN);\r
+    Info_h.biSizeImage = (getc(IN) << 8) + Info_h.biSizeImage;\r
+    Info_h.biSizeImage = (getc(IN) << 16) + Info_h.biSizeImage;\r
+    Info_h.biSizeImage = (getc(IN) << 24) + Info_h.biSizeImage;\r
+\r
+    Info_h.biXpelsPerMeter = getc(IN);\r
+    Info_h.biXpelsPerMeter = (getc(IN) << 8) + Info_h.biXpelsPerMeter;\r
+    Info_h.biXpelsPerMeter = (getc(IN) << 16) + Info_h.biXpelsPerMeter;\r
+    Info_h.biXpelsPerMeter = (getc(IN) << 24) + Info_h.biXpelsPerMeter;\r
+\r
+    Info_h.biYpelsPerMeter = getc(IN);\r
+    Info_h.biYpelsPerMeter = (getc(IN) << 8) + Info_h.biYpelsPerMeter;\r
+    Info_h.biYpelsPerMeter = (getc(IN) << 16) + Info_h.biYpelsPerMeter;\r
+    Info_h.biYpelsPerMeter = (getc(IN) << 24) + Info_h.biYpelsPerMeter;\r
+\r
+    Info_h.biClrUsed = getc(IN);\r
+    Info_h.biClrUsed = (getc(IN) << 8) + Info_h.biClrUsed;\r
+    Info_h.biClrUsed = (getc(IN) << 16) + Info_h.biClrUsed;\r
+    Info_h.biClrUsed = (getc(IN) << 24) + Info_h.biClrUsed;\r
+\r
+    Info_h.biClrImportant = getc(IN);\r
+    Info_h.biClrImportant = (getc(IN) << 8) + Info_h.biClrImportant;\r
+    Info_h.biClrImportant = (getc(IN) << 16) + Info_h.biClrImportant;\r
+    Info_h.biClrImportant = (getc(IN) << 24) + Info_h.biClrImportant;\r
+\r
+    /* Read the data and store them in the OUT file */\r
+    \r
+    if (Info_h.biBitCount == 24) {\r
+      numcomps = 3;\r
+      color_space = CLRSPC_SRGB;\r
+      /* initialize image components */\r
+      memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));\r
+      for(i = 0; i < numcomps; i++) {\r
+        cmptparm[i].prec = 8;\r
+        cmptparm[i].bpp = 8;\r
+        cmptparm[i].sgnd = 0;\r
+        cmptparm[i].dx = subsampling_dx;\r
+        cmptparm[i].dy = subsampling_dy;\r
+        cmptparm[i].w = w;\r
+        cmptparm[i].h = h;\r
+      }\r
+      /* create the image */\r
+      image = opj_image_create(numcomps, &cmptparm[0], color_space);\r
+      if(!image) {\r
+        fclose(IN);\r
+        return NULL;\r
+      }\r
+\r
+      /* set image offset and reference grid */\r
+      image->x0 = parameters->image_offset_x0;\r
+      image->y0 = parameters->image_offset_y0;\r
+      image->x1 =  !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1;\r
+      image->y1 =  !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1;\r
+\r
+      /* set image data */\r
+\r
+      /* Place the cursor at the beginning of the image information */\r
+      fseek(IN, 0, SEEK_SET);\r
+      fseek(IN, File_h.bfOffBits, SEEK_SET);\r
+      \r
+      W = Info_h.biWidth;\r
+      H = Info_h.biHeight;\r
+\r
+      /* PAD = 4 - (3 * W) % 4; */\r
+      /* PAD = (PAD == 4) ? 0 : PAD; */\r
+      PAD = (3 * W) % 4 ? 4 - (3 * W) % 4 : 0;\r
+      \r
+      RGB = (unsigned char *) malloc((3 * W + PAD) * H * sizeof(unsigned char));\r
+      \r
+      fread(RGB, sizeof(unsigned char), (3 * W + PAD) * H, IN);\r
+      \r
+      index = 0;\r
+\r
+      for(y = 0; y < (int)H; y++) {\r
+        unsigned char *scanline = RGB + (3 * W + PAD) * (H - 1 - y);\r
+        for(x = 0; x < (int)W; x++) {\r
+          unsigned char *pixel = &scanline[3 * x];\r
+          image->comps[0].data[index] = pixel[2];  /* R */\r
+          image->comps[1].data[index] = pixel[1];  /* G */\r
+          image->comps[2].data[index] = pixel[0];  /* B */\r
+          index++;\r
+        }\r
+      }\r
+\r
+      free(RGB);\r
+\r
+    } else if (Info_h.biBitCount == 8 && Info_h.biCompression == 0) {\r
+      table_R = (unsigned char *) malloc(256 * sizeof(unsigned char));\r
+      table_G = (unsigned char *) malloc(256 * sizeof(unsigned char));\r
+      table_B = (unsigned char *) malloc(256 * sizeof(unsigned char));\r
+      \r
+      for (j = 0; j < Info_h.biClrUsed; j++) {\r
+        table_B[j] = getc(IN);\r
+        table_G[j] = getc(IN);\r
+        table_R[j] = getc(IN);\r
+        getc(IN);\r
+        if (table_R[j] != table_G[j] && table_R[j] != table_B[j] && table_G[j] != table_B[j])\r
+          gray_scale = 0;\r
+      }\r
+      \r
+      /* Place the cursor at the beginning of the image information */\r
+      fseek(IN, 0, SEEK_SET);\r
+      fseek(IN, File_h.bfOffBits, SEEK_SET);\r
+      \r
+      W = Info_h.biWidth;\r
+      H = Info_h.biHeight;\r
+      if (Info_h.biWidth % 2)\r
+        W++;\r
+      \r
+      numcomps = gray_scale ? 1 : 3;\r
+      color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB;\r
+      /* initialize image components */\r
+      memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));\r
+      for(i = 0; i < numcomps; i++) {\r
+        cmptparm[i].prec = 8;\r
+        cmptparm[i].bpp = 8;\r
+        cmptparm[i].sgnd = 0;\r
+        cmptparm[i].dx = subsampling_dx;\r
+        cmptparm[i].dy = subsampling_dy;\r
+        cmptparm[i].w = w;\r
+        cmptparm[i].h = h;\r
+      }\r
+      /* create the image */\r
+      image = opj_image_create(numcomps, &cmptparm[0], color_space);\r
+      if(!image) {\r
+        fclose(IN);\r
+        return NULL;\r
+      }\r
+\r
+      /* set image offset and reference grid */\r
+      image->x0 = parameters->image_offset_x0;\r
+      image->y0 = parameters->image_offset_y0;\r
+      image->x1 =  !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1;\r
+      image->y1 =  !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1;\r
+\r
+      /* set image data */\r
+\r
+      RGB = (unsigned char *) malloc(W * H * sizeof(unsigned char));\r
+      \r
+      fread(RGB, sizeof(unsigned char), W * H, IN);\r
+      if (gray_scale) {\r
+        index = 0;\r
+        for (j = 0; j < W * H; j++) {\r
+          if ((j % W < W - 1 && Info_h.biWidth % 2) || !(Info_h.biWidth % 2)) {\r
+            image->comps[0].data[index] = table_R[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]];\r
+            index++;\r
+          }\r
+        }\r
+\r
+      } else {    \r
+        index = 0;\r
+        for (j = 0; j < W * H; j++) {\r
+          if ((j % W < W - 1 && Info_h.biWidth % 2) || !(Info_h.biWidth % 2)) {\r
+            unsigned char pixel_index = RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)];\r
+            image->comps[0].data[index] = table_R[pixel_index];\r
+            image->comps[1].data[index] = table_G[pixel_index];\r
+            image->comps[2].data[index] = table_B[pixel_index];\r
+            index++;\r
+          }\r
+        }\r
+      }\r
+      free(RGB);\r
+            \r
+    } else if (Info_h.biBitCount == 8 && Info_h.biCompression == 1) {        \r
+      table_R = (unsigned char *) malloc(256 * sizeof(unsigned char));\r
+      table_G = (unsigned char *) malloc(256 * sizeof(unsigned char));\r
+      table_B = (unsigned char *) malloc(256 * sizeof(unsigned char));\r
+      \r
+      for (j = 0; j < Info_h.biClrUsed; j++) {\r
+        table_B[j] = getc(IN);\r
+        table_G[j] = getc(IN);\r
+        table_R[j] = getc(IN);\r
+        getc(IN);\r
+        if (table_R[j] != table_G[j] && table_R[j] != table_B[j] && table_G[j] != table_B[j])\r
+          gray_scale = 0;\r
+      }\r
+\r
+      numcomps = gray_scale ? 1 : 3;\r
+      color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB;\r
+      /* initialize image components */\r
+      memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));\r
+      for(i = 0; i < numcomps; i++) {\r
+        cmptparm[i].prec = 8;\r
+        cmptparm[i].bpp = 8;\r
+        cmptparm[i].sgnd = 0;\r
+        cmptparm[i].dx = subsampling_dx;\r
+        cmptparm[i].dy = subsampling_dy;\r
+        cmptparm[i].w = w;\r
+        cmptparm[i].h = h;\r
+      }\r
+      /* create the image */\r
+      image = opj_image_create(numcomps, &cmptparm[0], color_space);\r
+      if(!image) {\r
+        fclose(IN);\r
+        return NULL;\r
+      }\r
+\r
+      /* set image offset and reference grid */\r
+      image->x0 = parameters->image_offset_x0;\r
+      image->y0 = parameters->image_offset_y0;\r
+      image->x1 =  !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1;\r
+      image->y1 =  !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1;\r
+\r
+      /* set image data */\r
+      \r
+      /* Place the cursor at the beginning of the image information */\r
+      fseek(IN, 0, SEEK_SET);\r
+      fseek(IN, File_h.bfOffBits, SEEK_SET);\r
+      \r
+      RGB = (unsigned char *) malloc(Info_h.biWidth * Info_h.biHeight * sizeof(unsigned char));\r
+            \r
+      while (not_end_file) {\r
+        v = getc(IN);\r
+        if (v) {\r
+          v2 = getc(IN);\r
+          for (i = 0; i < (int) v; i++) {\r
+            RGB[line * Info_h.biWidth + col] = v2;\r
+            col++;\r
+          }\r
+        } else {\r
+          v = getc(IN);\r
+          switch (v) {\r
+            case 0:\r
+              col = 0;\r
+              line++;\r
+              break;\r
+            case 1:\r
+              line++;\r
+              not_end_file = 0;\r
+              break;\r
+            case 2:\r
+              fprintf(stderr,"No Delta supported\n");\r
+              opj_image_destroy(image);\r
+              fclose(IN);\r
+              return NULL;\r
+              break;\r
+            default:\r
+              for (i = 0; i < v; i++) {\r
+                v2 = getc(IN);\r
+                RGB[line * Info_h.biWidth + col] = v2;\r
+                col++;\r
+              }\r
+              if (v % 2)\r
+                v2 = getc(IN);\r
+              break;\r
+          }\r
+        }\r
+      }\r
+      if (gray_scale) {\r
+        index = 0;\r
+        for (line = 0; line < Info_h.biHeight; line++) {\r
+          for (col = 0; col < Info_h.biWidth; col++) {\r
+            image->comps[0].data[index] = table_R[(int)RGB[(Info_h.biHeight - line - 1) * Info_h.biWidth + col]];\r
+            index++;\r
+          }\r
+        }\r
+      } else {\r
+        index = 0;\r
+        for (line = 0; line < Info_h.biHeight; line++) {\r
+          for (col = 0; col < Info_h.biWidth; col++) {\r
+            unsigned char pixel_index = (int)RGB[(Info_h.biHeight - line - 1) * Info_h.biWidth + col];\r
+            image->comps[0].data[index] = table_R[pixel_index];\r
+            image->comps[1].data[index] = table_G[pixel_index];\r
+            image->comps[2].data[index] = table_B[pixel_index];\r
+            index++;\r
+          }\r
+        }\r
+      }\r
+      free(RGB);\r
+  } else {\r
+    fprintf(stderr, \r
+      "Other system than 24 bits/pixels or 8 bits (no RLE coding) is not yet implemented [%d]\n", Info_h.biBitCount);\r
+  }\r
+  fclose(IN);\r
+ }\r
\r
+ return image;\r
+}\r
+\r
+int imagetobmp(opj_image_t * image, char *outfile) {\r
+  int w, wr, h, hr;\r
+  int i, pad;\r
+  FILE *fdest = NULL;\r
+\r
+  if (image->numcomps == 3 && image->comps[0].dx == image->comps[1].dx\r
+    && image->comps[1].dx == image->comps[2].dx\r
+    && image->comps[0].dy == image->comps[1].dy\r
+    && image->comps[1].dy == image->comps[2].dy\r
+    && image->comps[0].prec == image->comps[1].prec\r
+    && image->comps[1].prec == image->comps[2].prec) {\r
+    \r
+    /* -->> -->> -->> -->>    \r
+    24 bits color      \r
+    <<-- <<-- <<-- <<-- */\r
+      \r
+    fdest = fopen(outfile, "wb");\r
+    if (!fdest) {\r
+      fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile);\r
+      return 1;\r
+    }\r
+      \r
+    /* w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx); */\r
+    /* wr = int_ceildiv(int_ceildivpow2(image->x1 - image->x0,image->factor), image->comps[0].dx); */\r
+    w = image->comps[0].w;\r
+    wr = int_ceildivpow2(image->comps[0].w, image->comps[0].factor);\r
+      \r
+    /* h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); */\r
+    /* hr = int_ceildiv(int_ceildivpow2(image->y1 - image->y0,image->factor), image->comps[0].dy); */\r
+    h = image->comps[0].h;\r
+    hr = int_ceildivpow2(image->comps[0].h, image->comps[0].factor);\r
+      \r
+    fprintf(fdest, "BM");\r
+      \r
+    /* FILE HEADER */\r
+    /* ------------- */\r
+    fprintf(fdest, "%c%c%c%c",\r
+      (unsigned char) (hr * wr * 3 + 3 * hr * (wr % 2) + 54) & 0xff,\r
+      (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)  >> 8) & 0xff,\r
+      (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)  >> 16) & 0xff,\r
+      (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54)  >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff,((54) >> 16) & 0xff, ((54) >> 24) & 0xff);\r
+      \r
+    /* INFO HEADER   */\r
+    /* ------------- */\r
+    fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,  ((40) >> 16) & 0xff, ((40) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (unsigned char) ((wr) & 0xff),\r
+      (unsigned char) ((wr) >> 8) & 0xff,\r
+      (unsigned char) ((wr) >> 16) & 0xff,\r
+      (unsigned char) ((wr) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (unsigned char) ((hr) & 0xff),\r
+      (unsigned char) ((hr) >> 8) & 0xff,\r
+      (unsigned char) ((hr) >> 16) & 0xff,\r
+      (unsigned char) ((hr) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);\r
+    fprintf(fdest, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (unsigned char) (3 * hr * wr + 3 * hr * (wr % 2)) & 0xff,\r
+      (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >> 8) & 0xff,\r
+      (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >> 16) & 0xff,\r
+      (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,  ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);\r
+      \r
+    for (i = 0; i < wr * hr; i++) {\r
+      unsigned char R, G, B;\r
+      /* a modifier */\r
+      /* R = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; */\r
+      R = image->comps[0].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];\r
+      /* G = image->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; */\r
+      G = image->comps[1].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];\r
+      /* B = image->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; */\r
+      B = image->comps[2].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];\r
+      fprintf(fdest, "%c%c%c", B, G, R);\r
+      \r
+      if ((i + 1) % wr == 0) {\r
+        for (pad = (3 * wr) % 4 ? 4 - (3 * wr) % 4 : 0; pad > 0; pad--)  /* ADD */\r
+          fprintf(fdest, "%c", 0);\r
+      }\r
+    }\r
+    fclose(fdest);\r
+  } else {      /* Gray-scale */\r
+\r
+    /* -->> -->> -->> -->>\r
+    8 bits non code (Gray scale)\r
+    <<-- <<-- <<-- <<-- */\r
+\r
+    fdest = fopen(outfile, "wb");\r
+    /* w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx); */\r
+    /* wr = int_ceildiv(int_ceildivpow2(image->x1 - image->x0,image->factor), image->comps[0].dx); */\r
+    w = image->comps[0].w;\r
+    wr = int_ceildivpow2(image->comps[0].w, image->comps[0].factor);\r
+      \r
+    /* h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); */\r
+    /* hr = int_ceildiv(int_ceildivpow2(image->y1 - image->y0,image->factor), image->comps[0].dy); */\r
+    h = image->comps[0].h;\r
+    hr = int_ceildivpow2(image->comps[0].h, image->comps[0].factor);\r
+      \r
+    fprintf(fdest, "BM");\r
+      \r
+    /* FILE HEADER */\r
+    /* ------------- */\r
+    fprintf(fdest, "%c%c%c%c", (unsigned char) (hr * wr + 54 + 1024 + hr * (wr % 2)) & 0xff,\r
+      (unsigned char) ((hr * wr + 54 + 1024 + hr * (wr % 2)) >> 8) & 0xff,\r
+      (unsigned char) ((hr * wr + 54 + 1024 + hr * (wr % 2)) >> 16) & 0xff,\r
+      (unsigned char) ((hr * wr + 54 + 1024 + wr * (wr % 2)) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (54 + 1024) & 0xff, ((54 + 1024) >> 8) & 0xff, \r
+      ((54 + 1024) >> 16) & 0xff,\r
+      ((54 + 1024) >> 24) & 0xff);\r
+      \r
+    /* INFO HEADER */\r
+    /* ------------- */\r
+    fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,  ((40) >> 16) & 0xff, ((40) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (unsigned char) ((wr) & 0xff),\r
+      (unsigned char) ((wr) >> 8) & 0xff,\r
+      (unsigned char) ((wr) >> 16) & 0xff,\r
+      (unsigned char) ((wr) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (unsigned char) ((hr) & 0xff),\r
+      (unsigned char) ((hr) >> 8) & 0xff,\r
+      (unsigned char) ((hr) >> 16) & 0xff,\r
+      (unsigned char) ((hr) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);\r
+    fprintf(fdest, "%c%c", (8) & 0xff, ((8) >> 8) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (unsigned char) (hr * wr + hr * (wr % 2)) & 0xff,\r
+      (unsigned char) ((hr * wr + hr * (wr % 2)) >> 8) &  0xff,\r
+      (unsigned char) ((hr * wr + hr * (wr % 2)) >> 16) &  0xff,\r
+      (unsigned char) ((hr * wr + hr * (wr % 2)) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,  ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,  ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, ((256) >> 16) & 0xff, ((256) >> 24) & 0xff);\r
+    fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, ((256) >> 16) & 0xff, ((256) >> 24) & 0xff);\r
+  }\r
+\r
+  for (i = 0; i < 256; i++) {\r
+    fprintf(fdest, "%c%c%c%c", i, i, i, 0);\r
+  }\r
+\r
+  for (i = 0; i < wr * hr; i++) {\r
+    /* a modifier !! */\r
+    /* fprintf(fdest, "%c", image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]); */\r
+    fprintf(fdest, "%c", image->comps[0].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)]);\r
+    /*if (((i + 1) % w == 0 && w % 2))\r
+    fprintf(fdest, "%c", 0); */\r
+    if ((i + 1) % wr == 0) {\r
+      for (pad = wr % 4 ? 4 - wr % 4 : 0; pad > 0; pad--)  /* ADD */\r
+        fprintf(fdest, "%c", 0);\r
+    }\r
+  }\r
+  fclose(fdest);\r
+\r
+  return 0;\r
+}\r
+\r
+/* -->> -->> -->> -->>\r
+\r
+PGX IMAGE FORMAT\r
+\r
+<<-- <<-- <<-- <<-- */\r
+\r
+\r
+unsigned char readuchar(FILE * f)\r
+{\r
+  unsigned char c1;\r
+  fread(&c1, 1, 1, f);\r
+  return c1;\r
+}\r
+\r
+unsigned short readushort(FILE * f, int bigendian)\r
+{\r
+  unsigned char c1, c2;\r
+  fread(&c1, 1, 1, f);\r
+  fread(&c2, 1, 1, f);\r
+  if (bigendian)\r
+    return (c1 << 8) + c2;\r
+  else\r
+    return (c2 << 8) + c1;\r
+}\r
+\r
+unsigned int readuint(FILE * f, int bigendian)\r
+{\r
+  unsigned char c1, c2, c3, c4;\r
+  fread(&c1, 1, 1, f);\r
+  fread(&c2, 1, 1, f);\r
+  fread(&c3, 1, 1, f);\r
+  fread(&c4, 1, 1, f);\r
+  if (bigendian)\r
+    return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4;\r
+  else\r
+    return (c4 << 24) + (c3 << 16) + (c2 << 8) + c1;\r
+}\r
+\r
+opj_image_t* pgxtoimage(char *filename, opj_cparameters_t *parameters) {\r
+  FILE *f = NULL;\r
+  int w, h, prec;\r
+  int i, numcomps, max;\r
+  OPJ_COLOR_SPACE color_space;\r
+  opj_image_cmptparm_t cmptparm;  /* maximum of 1 component  */\r
+  opj_image_t * image = NULL;\r
+\r
+  char endian1,endian2,sign;\r
+  char signtmp[32];\r
+\r
+  char temp[32];\r
+  int bigendian;\r
+  opj_image_comp_t *comp = NULL;\r
+\r
+  numcomps = 1;\r
+  color_space = CLRSPC_GRAY;\r
+\r
+  memset(&cmptparm, 0, sizeof(opj_image_cmptparm_t));\r
+\r
+  max = 0;\r
+\r
+  f = fopen(filename, "rb");\r
+  if (!f) {\r
+    fprintf(stderr, "Failed to open %s for reading !\n", filename);\r
+    return NULL;\r
+  }\r
+\r
+  fseek(f, 0, SEEK_SET);\r
+  fscanf(f, "PG%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \t]%d",temp,&endian1,&endian2,signtmp,&prec,temp,&w,temp,&h);\r
+  \r
+  i=0;\r
+  sign='+';    \r
+  while (signtmp[i]!='\0') {\r
+    if (signtmp[i]=='-') sign='-';\r
+    i++;\r
+  }\r
+  \r
+  fgetc(f);\r
+  if (endian1=='M' && endian2=='L') {\r
+    bigendian = 1;\r
+  } else if (endian2=='M' && endian1=='L') {\r
+    bigendian = 0;\r
+  } else {\r
+    fprintf(stderr, "Bad pgx header, please check input file\n");\r
+    return NULL;\r
+  }\r
+\r
+  /* initialize image component */\r
+\r
+  cmptparm.x0 = parameters->image_offset_x0;\r
+  cmptparm.y0 = parameters->image_offset_y0;\r
+  cmptparm.w = !cmptparm.x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm.x0 + (w - 1) * parameters->subsampling_dx + 1;\r
+  cmptparm.h = !cmptparm.y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm.y0 + (h - 1) * parameters->subsampling_dy + 1;\r
+  \r
+  if (sign == '-') {\r
+    cmptparm.sgnd = 1;\r
+  } else {\r
+    cmptparm.sgnd = 0;\r
+  }\r
+  cmptparm.prec = prec;\r
+  cmptparm.bpp = prec;\r
+  cmptparm.dx = parameters->subsampling_dx;\r
+  cmptparm.dy = parameters->subsampling_dy;\r
+  \r
+  /* create the image */\r
+  image = opj_image_create(numcomps, &cmptparm, color_space);\r
+  if(!image) {\r
+    fclose(f);\r
+    return NULL;\r
+  }\r
+  /* set image offset and reference grid */\r
+  image->x0 = cmptparm.x0;\r
+  image->y0 = cmptparm.x0;\r
+  image->x1 = cmptparm.w;\r
+  image->y1 = cmptparm.h;\r
+\r
+  /* set image data */\r
+\r
+  comp = &image->comps[0];\r
+\r
+  for (i = 0; i < w * h; i++) {\r
+    int v;\r
+    if (comp->prec <= 8) {\r
+      if (!comp->sgnd) {\r
+        v = readuchar(f);\r
+      } else {\r
+        v = (char) readuchar(f);\r
+      }\r
+    } else if (comp->prec <= 16) {\r
+      if (!comp->sgnd) {\r
+        v = readushort(f, bigendian);\r
+      } else {\r
+        v = (short) readushort(f, bigendian);\r
+      }\r
+    } else {\r
+      if (!comp->sgnd) {\r
+        v = readuint(f, bigendian);\r
+      } else {\r
+        v = (int) readuint(f, bigendian);\r
+      }\r
+    }\r
+    if (v > max)\r
+      max = v;\r
+    comp->data[i] = v;\r
+  }\r
+  fclose(f);\r
+  comp->bpp = int_floorlog2(max) + 1;\r
+\r
+  return image;\r
+}\r
+\r
+int imagetopgx(opj_image_t * image, char *outfile) {\r
+  int w, wr, h, hr;\r
+  int i, j, compno;\r
+  FILE *fdest = NULL;\r
+\r
+  for (compno = 0; compno < image->numcomps; compno++) {\r
+    opj_image_comp_t *comp = &image->comps[compno];\r
+    char name[256];\r
+    int nbytes = 0;\r
+    char *tmp = outfile;\r
+    while (*tmp) {\r
+      tmp++;\r
+    }\r
+    while (*tmp!='.') {\r
+      tmp--;\r
+    }\r
+    *tmp='\0';\r
+\r
+    if (image->numcomps > 1) {\r
+      sprintf(name, "%s-%d.pgx", outfile, compno);\r
+    } else {\r
+      sprintf(name, "%s.pgx", outfile);\r
+    }\r
+    fdest = fopen(name, "wb");\r
+    if (!fdest) {\r
+      fprintf(stderr, "ERROR -> failed to open %s for writing\n", name);\r
+      return 1;\r
+    }\r
+    /* w = int_ceildiv(image->x1 - image->x0, comp->dx); */\r
+    /* wr = int_ceildiv(int_ceildivpow2(image->x1 - image->x0,image->factor), comp->dx); */\r
+    w = image->comps[compno].w;\r
+    wr = int_ceildivpow2(image->comps[compno].w, image->comps[compno].factor);\r
+      \r
+    /* h = int_ceildiv(image->y1 - image->y0, comp->dy); */\r
+    /* hr = int_ceildiv(int_ceildivpow2(image->y1 - image->y0,image->factor), comp->dy); */\r
+    h = image->comps[compno].h;\r
+    hr = int_ceildivpow2(image->comps[compno].h, image->comps[compno].factor);\r
+      \r
+    fprintf(fdest, "PG ML %c %d %d %d\n", comp->sgnd ? '-' : '+', comp->prec, wr, hr);\r
+    if (comp->prec <= 8) {\r
+      nbytes = 1;\r
+    } else if (comp->prec <= 16) {\r
+      nbytes = 2;\r
+    } else {\r
+      nbytes = 4;\r
+    }\r
+    for (i = 0; i < wr * hr; i++) {\r
+      int v = image->comps[compno].data[i / wr * w + i % wr];\r
+      for (j = nbytes - 1; j >= 0; j--) {\r
+        char byte = (char) (v >> (j * 8));\r
+        fwrite(&byte, 1, 1, fdest);\r
+      }\r
+    }\r
+    fclose(fdest);\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/* -->> -->> -->> -->>\r
+\r
+PNM IMAGE FORMAT\r
+\r
+<<-- <<-- <<-- <<-- */\r
+\r
+opj_image_t* pnmtoimage(char *filename, opj_cparameters_t *parameters) {\r
+  int subsampling_dx = parameters->subsampling_dx;\r
+  int subsampling_dy = parameters->subsampling_dy;\r
+\r
+  FILE *f = NULL;\r
+  int i, compno, numcomps, w, h;\r
+  OPJ_COLOR_SPACE color_space;\r
+  opj_image_cmptparm_t cmptparm[3];  /* maximum of 3 components */\r
+  opj_image_t * image = NULL;\r
+  char value;\r
+  char comment[256];\r
+\r
+  f = fopen(filename, "rb");\r
+  if (!f) {\r
+    fprintf(stderr, "\033[0;33mFailed to open %s for reading !!\033[0;39m\n", filename);\r
+    return 0;\r
+  }\r
+\r
+  if (fgetc(f) != 'P')\r
+    return 0;\r
+  value = fgetc(f);\r
+\r
+  switch(value) {\r
+    case '2':  /* greyscale image type */\r
+    case '5':\r
+    {\r
+      numcomps = 1;\r
+      color_space = CLRSPC_GRAY;\r
+\r
+      fgetc(f);\r
+\r
+      if (fgetc(f) == '#') {\r
+        /* skip comments */\r
+        fseek(f, 0, SEEK_SET);\r
+        if (value == '2') {\r
+          fscanf(f, "P2\n");\r
+        } else if (value == '5') {\r
+          fscanf(f, "P5\n");\r
+        }\r
+        fgets(comment, 256, f);\r
+        fscanf(f, "%d %d\n255", &w, &h);\r
+      } else {\r
+        fseek(f, 0, SEEK_SET);\r
+        if (value == '2') {\r
+          fscanf(f, "P2\n%d %d\n255", &w, &h);\r
+        } else if (value == '5') {\r
+          fscanf(f, "P5\n%d %d\n255", &w, &h);\r
+        }\r
+      }\r
+      \r
+      fgetc(f);  /* <cr><lf> */\r
+    }\r
+    break;\r
+\r
+    case '3':  /* RGB image type */\r
+    case '6':\r
+    {\r
+      numcomps = 3;\r
+      color_space = CLRSPC_SRGB;\r
+\r
+      fgetc(f);\r
+\r
+      if (fgetc(f) == '#') {\r
+        /* skip comments */\r
+        fseek(f, 0, SEEK_SET);\r
+        if (value == '3') {\r
+          fscanf(f, "P3\n");\r
+        } else if (value == '6') {\r
+          fscanf(f, "P6\n");\r
+        }\r
+        fgets(comment, 256, f);\r
+        fscanf(f, "%d %d\n255", &w, &h);\r
+      } else {\r
+        fseek(f, 0, SEEK_SET);\r
+        if (value == '3') {\r
+          fscanf(f, "P3\n%d %d\n255", &w, &h);\r
+        } else if (value == '6') {\r
+          fscanf(f, "P6\n%d %d\n255", &w, &h);\r
+        }\r
+      }\r
+      \r
+      fgetc(f);  /* <cr><lf> */\r
+    }\r
+    break;\r
+\r
+    default:\r
+      fclose(f);\r
+      return NULL;\r
+  }\r
+\r
+  /* initialize image components */\r
+  memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));\r
+  for(i = 0; i < numcomps; i++) {\r
+    cmptparm[i].prec = 8;\r
+    cmptparm[i].bpp = 8;\r
+    cmptparm[i].sgnd = 0;\r
+    cmptparm[i].dx = subsampling_dx;\r
+    cmptparm[i].dy = subsampling_dy;\r
+    cmptparm[i].w = w;\r
+    cmptparm[i].h = h;\r
+  }\r
+  /* create the image */\r
+  image = opj_image_create(numcomps, &cmptparm[0], color_space);\r
+  if(!image) {\r
+    fclose(f);\r
+    return NULL;\r
+  }\r
+\r
+  /* set image offset and reference grid */\r
+  image->x0 = parameters->image_offset_x0;\r
+  image->y0 = parameters->image_offset_y0;\r
+  image->x1 = parameters->image_offset_x0 + (w - 1) *  subsampling_dx + 1;\r
+  image->y1 = parameters->image_offset_y0 + (h - 1) *  subsampling_dy + 1;\r
+\r
+  /* set image data */\r
+\r
+  if ((value == '2') || (value == '3')) {  /* ASCII */\r
+    for (i = 0; i < w * h; i++) {\r
+      for(compno = 0; compno < numcomps; compno++) {\r
+        unsigned int index = 0;\r
+        fscanf(f, "%u", &index);\r
+        /* compno : 0 = GREY, (0, 1, 2) = (R, G, B) */\r
+        image->comps[compno].data[i] = index;\r
+      }\r
+    }\r
+  } else if ((value == '5') || (value == '6')) {  /* BINARY */\r
+    for (i = 0; i < w * h; i++) {\r
+      for(compno = 0; compno < numcomps; compno++) {\r
+        unsigned char index = 0;\r
+        fread(&index, 1, 1, f);\r
+        /* compno : 0 = GREY, (0, 1, 2) = (R, G, B) */\r
+        image->comps[compno].data[i] = index;\r
+      }\r
+    }\r
+  }\r
+\r
+  fclose(f);\r
+\r
+  return image;\r
+}\r
+\r
+int imagetopnm(opj_image_t * image, char *outfile) {\r
+  int w, wr, wrr, h, hr, hrr, max;\r
+  int i, compno;\r
+  int adjust;\r
+  FILE *fdest = NULL;\r
+  char S2;\r
+  char *tmp = outfile;\r
+\r
+  while (*tmp) {\r
+    tmp++;\r
+  }\r
+  tmp--;\r
+  tmp--;\r
+  S2 = *tmp;\r
+\r
+  if (image->numcomps == 3 && image->comps[0].dx == image->comps[1].dx\r
+    && image->comps[1].dx == image->comps[2].dx\r
+    && image->comps[0].dy == image->comps[1].dy\r
+    && image->comps[1].dy == image->comps[2].dy\r
+    && image->comps[0].prec == image->comps[1].prec\r
+    && image->comps[1].prec == image->comps[2].prec\r
+    && S2 !='g' && S2 !='G') {\r
+\r
+    fdest = fopen(outfile, "wb");\r
+    if (!fdest) {\r
+      fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile);\r
+      return 1;\r
+    }\r
+\r
+    w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx);\r
+    /* wr = int_ceildiv(int_ceildivpow2(image->x1 - image->x0,image->factor),image->comps[0].dx); */\r
+    wr = image->comps[0].w;\r
+    wrr = int_ceildivpow2(image->comps[0].w, image->comps[0].factor);\r
+        \r
+    h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy);\r
+    /* hr = int_ceildiv(int_ceildivpow2(image->y1 - image->y0,image->factor), image->comps[0].dy); */\r
+    hr = image->comps[0].h;\r
+    hrr = int_ceildivpow2(image->comps[0].h, image->comps[0].factor);\r
+      \r
+    max = image->comps[0].prec > 8 ? 255 : (1 << image->comps[0].prec) - 1;\r
+      \r
+    image->comps[0].x0 = int_ceildivpow2(image->comps[0].x0 - int_ceildiv(image->x0, image->comps[0].dx), image->comps[0].factor);\r
+    image->comps[0].y0 = int_ceildivpow2(image->comps[0].y0 -  int_ceildiv(image->y0, image->comps[0].dy), image->comps[0].factor);\r
+\r
+    fprintf(fdest, "P6\n%d %d\n%d\n", wrr, hrr, max);\r
+    adjust = image->comps[0].prec > 8 ? image->comps[0].prec - 8 : 0;\r
+    for (i = 0; i < wrr * hrr; i++) {\r
+      int r, g, b;\r
+      unsigned char rc,gc,bc;\r
+      r = image->comps[0].data[i / wrr * wr + i % wrr];\r
+      r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);\r
+      rc = (unsigned char) ((r >> adjust)+((r >> (adjust-1))%2));\r
+\r
+      g = image->comps[1].data[i / wrr * wr + i % wrr];\r
+      g += (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0);\r
+      gc = (unsigned char) ((g >> adjust)+((g >> (adjust-1))%2));\r
+      \r
+      b = image->comps[2].data[i / wrr * wr + i % wrr];\r
+      b += (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0);\r
+      bc = (unsigned char) ((b >> adjust)+((b >> (adjust-1))%2));\r
+      \r
+      fprintf(fdest, "%c%c%c", rc, gc, bc);\r
+    }\r
+    fclose(fdest);\r
+  } else {\r
+    int ncomp=(S2=='g' || S2=='G')?1:image->numcomps;\r
+    if (image->numcomps>ncomp) {\r
+      fprintf(stderr,"WARNING -> [PGM files] Only the first component\n");\r
+      fprintf(stderr,"           is written to the file\n");\r
+    }\r
+    for (compno = 0; compno < ncomp; compno++) {\r
+      char name[256];\r
+      if (ncomp > 1) {\r
+        sprintf(name, "%d.%s", compno, outfile);\r
+      } else {\r
+        sprintf(name, "%s", outfile);\r
+      }\r
+      \r
+      fdest = fopen(name, "wb");\r
+      if (!fdest) {\r
+        fprintf(stderr, "ERROR -> failed to open %s for writing\n", name);\r
+        return 1;\r
+      }\r
+            \r
+      w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx);\r
+      /* wr = int_ceildiv(int_ceildivpow2(image->x1 - image->x0,image->factor),image->comps[compno].dx); */\r
+      wr = image->comps[compno].w;\r
+      wrr = int_ceildivpow2(image->comps[compno].w, image->comps[compno].factor);\r
+      \r
+      h = int_ceildiv(image->y1 - image->y0, image->comps[compno].dy);\r
+      /* hr = int_ceildiv(int_ceildivpow2(image->y1 - image->y0,image->factor), image->comps[compno].dy); */\r
+      hr = image->comps[compno].h;\r
+      hrr = int_ceildivpow2(image->comps[compno].h, image->comps[compno].factor);\r
+      \r
+      max = image->comps[compno].prec > 8 ? 255 : (1 << image->comps[compno].prec) - 1;\r
+      \r
+      image->comps[compno].x0 = int_ceildivpow2(image->comps[compno].x0 - int_ceildiv(image->x0, image->comps[compno].dx), image->comps[compno].factor);\r
+      image->comps[compno].y0 = int_ceildivpow2(image->comps[compno].y0 - int_ceildiv(image->y0, image->comps[compno].dy), image->comps[compno].factor);\r
+      \r
+      fprintf(fdest, "P5\n%d %d\n%d\n", wrr, hrr, max);\r
+      adjust = image->comps[compno].prec > 8 ? image->comps[compno].prec - 8 : 0;\r
+\r
+      for (i = 0; i < wrr * hrr; i++) {\r
+        int l;\r
+        unsigned char lc;\r
+        l = image->comps[compno].data[i / wrr * wr + i % wrr];\r
+        l += (image->comps[compno].sgnd ? 1 << (image->comps[compno].prec - 1) : 0);\r
+        lc = (unsigned char) ((l >> adjust)+((l >> (adjust-1))%2));\r
+        fprintf(fdest, "%c", lc);\r
+      }\r
+      fclose(fdest);\r
+    }\r
+  }\r
+\r
+  return 0;\r
+}\r
index 59ed8a1463eea3c5ce547008f8e8f98dab6b45a7..64561d894375278b9bd4a14b9d78c4519efb7117 100644 (file)
@@ -1,39 +1,52 @@
-/*
- * 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]);
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, Herv\8e Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#ifndef __J2K_CONVERT_H\r
+#define __J2K_CONVERT_H\r
+\r
+opj_image_t* bmptoimage(char *filename, opj_cparameters_t *parameters);\r
+\r
+int imagetobmp(opj_image_t *image, char *outfile);\r
+\r
+/**\r
+Load a single image component encoded in PGX file format\r
+@param filename Name of the PGX file to load\r
+@param parameters *List ?*\r
+@return Returns a greyscale image if successful, returns NULL otherwise\r
+*/\r
+opj_image_t* pgxtoimage(char *filename, opj_cparameters_t *parameters);\r
+\r
+int imagetopgx(opj_image_t *image, char *outfile);\r
+\r
+opj_image_t* pnmtoimage(char *filename, opj_cparameters_t *parameters);\r
+\r
+int imagetopnm(opj_image_t *image, char *outfile);\r
+\r
+#endif /* __J2K_CONVERT_H */\r
+\r
index a8494927656e0d54ba90daa1b0607f6e908eb2e7..af61a2fb7c681e38985cef02c8273efb4cb3c5e6 100644 (file)
-/*
- * 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.
- */
-
-
-
-/* MEMORY LEAK */
-
-#ifdef _DEBUG
-
-#define _CRTDBG_MAP_ALLOC
-
-#include <stdlib.h>  /* Must be included first */
-
-#include <crtdbg.h>
-
-#endif
-
-/* MEM */
-
-#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()
-{
-  fprintf(stdout,"HELP\n----\n\n");
-  fprintf(stdout,"- the -h option displays this help information on screen\n\n");
-
-
-  fprintf(stdout,"List of parameters for the coder JPEG 2000:\n");
-  fprintf(stdout,"\n");
-  fprintf(stdout,"REMARKS:\n");
-  fprintf(stdout,"---------\n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"The markers written to the main_header are : SOC SIZ COD QCD COM.\n");
-  fprintf
-    (stdout,"COD and QCD never appear in the tile_header.\n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"- This coder can encode a mega image, a test was made on a 24000x24000 pixels \n");
-  fprintf
-    (stdout,"color image.  You need enough disk space memory (twice the original) to encode \n");
-  fprintf
-    (stdout,"the image,i.e. for a 1.5 GB image you need a minimum of 3GB of disk memory)\n");
-  fprintf(stdout,"\n");
-  fprintf(stdout,"By default:\n");
-  fprintf(stdout,"------------\n");
-  fprintf(stdout,"\n");
-  fprintf(stdout," * Lossless\n");
-  fprintf(stdout," * 1 tile\n");
-  fprintf(stdout," * Size of precinct : 2^15 x 2^15 (means 1 precinct)\n");
-  fprintf(stdout," * Size of code-block : 64 x 64\n");
-  fprintf(stdout," * Number of resolutions: 6\n");
-  fprintf(stdout," * No SOP marker in the codestream\n");
-  fprintf(stdout," * No EPH marker in the codestream\n");
-  fprintf(stdout," * No sub-sampling in x or y direction\n");
-  fprintf(stdout," * No mode switch activated\n");
-  fprintf(stdout," * Progression order: LRCP\n");
-  fprintf(stdout," * No index file\n");
-  fprintf(stdout," * No ROI upshifted\n");
-  fprintf(stdout," * No offset of the origin of the image\n");
-  fprintf(stdout," * No offset of the origin of the tiles\n");
-  fprintf(stdout," * Reversible DWT 5-3\n");
-  fprintf(stdout,"\n");
-  fprintf(stdout,"Parameters:\n");
-  fprintf(stdout,"------------\n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"Required Parameters (except with -h):\n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"-i           : source file  (-i source.pnm also *.pgm, *.ppm) \n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"-o           : destination file (-o dest.j2k or .jp2) \n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"Optional Parameters:\n");
-  fprintf(stdout,"\n");
-  fprintf(stdout,"-h           : display the help information \n ");
-  fprintf(stdout,"\n");
-  fprintf(stdout,"-r           : different compression ratios for successive layers (-r 20,10,5)\n ");
-  fprintf(stdout,"            - The rate specified for each quality level is the desired \n");
-  fprintf(stdout,"              compression factor.\n");
-  fprintf(stdout,"         Example: -r 20,10,1 means quality 1: compress 20x, \n");
-  fprintf(stdout,"           quality 2: compress 10x and quality 3: compress lossless\n");
-  fprintf(stdout,"\n");
-  fprintf(stdout,"               (options -r and -q cannot be used together)\n ");
-  fprintf(stdout,"\n");
-
-  fprintf(stdout,"-q           : different psnr for successive layers (-q 30,40,50) \n ");
-
-  fprintf(stdout,"               (options -r and -q cannot be used together)\n ");
-
-  fprintf(stdout,"\n");
-  fprintf(stdout,"-n           : number of resolutions (-n 3) \n");
-  fprintf(stdout,"\n");
-  fprintf(stdout,"-b           : size of code block (-b 32,32) \n");
-  fprintf(stdout,"\n");
-  fprintf(stdout,"-c           : size of precinct (-c 128,128) \n");
-  fprintf(stdout,"\n");
-  fprintf(stdout,"-t           : size of tile (-t 512,512) \n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"-p           : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"-s           : subsampling factor (-s 2,2) [-s X,Y] \n");
-  fprintf(stdout,"        Remark: subsampling bigger than 2 can produce error\n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"-SOP         : write SOP marker before each packet \n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"-EPH         : write EPH marker after each header packet \n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"-M           : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n");
-  fprintf
-    (stdout,"                 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] \n");
-  fprintf
-    (stdout,"                 Indicate multiple modes by adding their values. \n");
-  fprintf
-    (stdout,"                 ex: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"-x           : create an index file *.Idx (-x index_name.Idx) \n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"-ROI         : c=%%d,U=%%d : quantization indices upshifted \n");
-  fprintf
-    (stdout,"               for component c=%%d [%%d = 0,1,2]\n");
-  fprintf
-    (stdout,"               with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) \n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"-d           : offset of the origin of the image (-d 150,300) \n");
-  fprintf(stdout,"\n");
-  fprintf
-    (stdout,"-T           : offset of the origin of the tiles (-T 100,75) \n");
-  fprintf(stdout,"\n");
-  fprintf(stdout,"-I           : use the irreversible DWT 9-7 (-I) \n");
-  fprintf(stdout,"\n");
-  fprintf(stdout,"IMPORTANT:\n");
-  fprintf(stdout,"-----------\n");
-  fprintf(stdout,"\n");
-  fprintf(stdout,"The index file has the structure below:\n");
-  fprintf(stdout,"---------------------------------------\n");
-  fprintf(stdout,"\n");
-  fprintf(stdout,"Image_height Image_width\n");
-  fprintf(stdout,"progression order\n");
-  fprintf(stdout,"Tiles_size_X Tiles_size_Y\n");
-  fprintf(stdout,"Components_nb\n");
-  fprintf(stdout,"Layers_nb\n");
-  fprintf(stdout,"decomposition_levels\n");
-  fprintf(stdout,"[Precincts_size_X_res_Nr Precincts_size_Y_res_Nr]...\n");
-  fprintf(stdout,"   [Precincts_size_X_res_0 Precincts_size_Y_res_0]\n");
-  fprintf(stdout,"Main_header_end_position\n");
-  fprintf(stdout,"Codestream_size\n");
-  fprintf(stdout,"Tile_0 start_pos end_Theader end_pos TotalDisto NumPix MaxMSE\n");
-  fprintf(stdout,"Tile_1   ''           ''        ''        ''       ''    ''\n");
-  fprintf(stdout,"...\n");
-  fprintf(stdout,"Tile_Nt   ''           ''        ''        ''       ''    ''\n");
-  fprintf(stdout,"Tpacket_0 Tile layer res. comp. prec. start_pos end_pos disto\n");
-  fprintf(stdout,"...\n");
-  fprintf(stdout,"Tpacket_Np ''   ''    ''   ''    ''       ''       ''     ''\n");
-
-  fprintf(stdout,"MaxDisto\n");
-
-  fprintf(stdout,"TotalDisto\n\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(float stepsize, int numbps, int *expn, int *mant)
-{
-  int p, n, stepsizeTMP;
-  stepsizeTMP=(int) floor(stepsize * 8192.0);
-  p = floorlog2(stepsizeTMP) - 13;
-  n = 11 - floorlog2(stepsizeTMP);
-  *mant = (n < 0 ? stepsizeTMP >> -n : stepsizeTMP << 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++) {
-    float 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(stepsize, 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;
-  unsigned char *j2k_codestream;
-  unsigned char *jp2_codestream;
-  FILE *f;
-  int depth_0, sign, depth;
-
-
-  /* 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.decod_format = PGX_DFMT;
-        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.decod_format = PXM_DFMT;
-        break;
-      }
-
-      if ((S1 == 'b' && S2 == 'm' && S3 == 'p')
-       || (S1 == 'B' && S2 == 'M' && S3 == 'P')) {
-        cp.decod_format = BMP_DFMT;
-        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.cod_format = J2K_CFMT;
-      else if ((S1 == 'j' && S2 == 'p' && S3 == '2')
-            || (S1 == 'J' && S2 == 'P' && S3 == '2'))
-        cp.cod_format = JP2_CFMT;
-      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 cannot be used together !!\n");
-    return 1;
-  }            /* mod fixed_quality*/
-
-  /* if no rate entered, lossless by default */
-  if (tcp_init->numlayers == 0) {
-    tcp_init->rates[0] = 0;   /*MOD antonin : losslessbug*/
-    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.decod_format) {
-  case PGX_DFMT:
-    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 PXM_DFMT:
-    if (!pnmtoimage(infile, &img, subsampling_dx, subsampling_dy, Dim)) {
-      fprintf(stderr, " not a pnm file\n");
-      return 1;
-    }
-    break;
-
-  case BMP_DFMT:
-    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_data_first = 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_data_first = 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.cod_format == J2K_CFMT) {   /* 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 {
-      j2k_codestream = (unsigned char *) malloc(cp.tdx * cp.tdy * cp.tw * cp.th * 2);
-      /* Allocate memory for all tiles */
-      cio_init(j2k_codestream, cp.tdx * cp.tdy * cp.tw * cp.th * 2);
-      len =
-        j2k_encode(&img, &cp, j2k_codestream,
-         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(j2k_codestream, 1, len, f);
-      free(j2k_codestream);
-      fclose(f);
-    }
-  } else {         /* JP2 format output */
-    jp2_struct_t *jp2_struct;
-
-    if (cp.intermed_file == 1) {
-      /*For the moment, JP2 format does not use intermediary 
-      files for each tile */
-      cp.intermed_file = 0;
-    }
-    j2k_codestream = (unsigned char *) malloc(cp.tdx * cp.tdy * cp.tw * cp.th * 2);
-    jp2_codestream = (unsigned char *) malloc(cp.tdx * cp.tdy * cp.tw * cp.th * 2);
-
-    cio_init(j2k_codestream, cp.tdx * cp.tdy * cp.tw * cp.th * 2);
-    len = j2k_encode(&img, &cp, j2k_codestream,
-      cp.tdx * cp.tdy * cp.tw * cp.th * 2, index);
-    if (len == 0) {
-      fprintf(stderr, "failed to encode image\n");
-      return 1;
-    }
-
-    jp2_struct = (jp2_struct_t *) malloc(sizeof(jp2_struct_t));
-    jp2_struct->image = &img;
-    jp2_struct->j2k_codestream_len = len;
-
-    /* Initialising the standard JP2 box content */
-    /* If you wish to modify those boxes, you have to modify 
-    the jp2_struct content */
-
-    jp2_struct->numcomps = img.numcomps;   /* NC*/
-
-    if (jp2_init_stdjp2(jp2_struct)) {
-      fprintf(stderr, "Error with jp2 initialization");
-      return 1;
-    };
-
-    jp2_struct->h = img.y1 - img.y0;   /* HEIGHT*/
-    jp2_struct->w = img.x1 - img.x0;   /* WIDTH*/
-
-    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;
-    }
-
-    for (i = 0; i < img.numcomps; i++)
-      jp2_struct->comps[i].bpcc =
-      img.comps[i].prec - 1 + (img.comps[i].sgnd << 7);
-    
-    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 (??)*/
-
-    cio_init(jp2_codestream, cp.tdx * cp.tdy * cp.tw * cp.th * 2);
-    len = jp2_wrap_j2k(jp2_struct, j2k_codestream, jp2_codestream);
-    f = fopen(outfile, "wb");
-    if (!f) {
-      fprintf(stderr, "failed to open %s for writing\n", outfile);
-      return 1;
-    }
-    fwrite(jp2_codestream, 1, len, f);
-    free(jp2_codestream);
-    free(j2k_codestream);
-    free(jp2_struct->comps);
-    free(jp2_struct->cl);
-    free(jp2_struct);
-    fclose(f);
-  }
-
-  /* Remove the temporary files */
-  /* -------------------------- */
-  if (cp.decod_format != PGX_DFMT) {      /* PNM PGM PPM or BMP */
-    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);
-
-
-
-
-
-  /*MEMORY LEAK*/
-
-  #ifdef _DEBUG
-
-    _CrtDumpMemoryLeaks();
-
-  #endif
-
-  /*MEM*/
-
-  return 0;
-}
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+\r
+#include "openjpeg.h"\r
+#include "compat/getopt.h"\r
+#include "convert.h"\r
+\r
+#ifndef WIN32\r
+#define stricmp strcasecmp\r
+#define strnicmp strncasecmp\r
+#endif\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+#define J2K_CFMT 0\r
+#define JP2_CFMT 1\r
+#define JPT_CFMT 2\r
+#define MJ2_CFMT 3\r
+#define PXM_DFMT 0\r
+#define PGX_DFMT 1\r
+#define BMP_DFMT 2\r
+#define YUV_DFMT 3\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+void encode_help_display() {\r
+  fprintf(stdout,"HELP\n----\n\n");\r
+  fprintf(stdout,"- the -h option displays this help information on screen\n\n");\r
+\r
+\r
+  fprintf(stdout,"List of parameters for the JPEG 2000 encoder:\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"REMARKS:\n");\r
+  fprintf(stdout,"---------\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"The markers written to the main_header are : SOC SIZ COD QCD COM.\n");\r
+  fprintf(stdout,"COD and QCD never appear in the tile_header.\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"- This coder can encode a mega image, a test was made on a 24000x24000 pixels \n");\r
+  fprintf(stdout,"color image.  You need enough disk space memory (twice the original) to encode \n");\r
+  fprintf(stdout,"the image,i.e. for a 1.5 GB image you need a minimum of 3GB of disk memory)\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"By default:\n");\r
+  fprintf(stdout,"------------\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout," * Lossless\n");\r
+  fprintf(stdout," * 1 tile\n");\r
+  fprintf(stdout," * Size of precinct : 2^15 x 2^15 (means 1 precinct)\n");\r
+  fprintf(stdout," * Size of code-block : 64 x 64\n");\r
+  fprintf(stdout," * Number of resolutions: 6\n");\r
+  fprintf(stdout," * No SOP marker in the codestream\n");\r
+  fprintf(stdout," * No EPH marker in the codestream\n");\r
+  fprintf(stdout," * No sub-sampling in x or y direction\n");\r
+  fprintf(stdout," * No mode switch activated\n");\r
+  fprintf(stdout," * Progression order: LRCP\n");\r
+  fprintf(stdout," * No index file\n");\r
+  fprintf(stdout," * No ROI upshifted\n");\r
+  fprintf(stdout," * No offset of the origin of the image\n");\r
+  fprintf(stdout," * No offset of the origin of the tiles\n");\r
+  fprintf(stdout," * Reversible DWT 5-3\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"Parameters:\n");\r
+  fprintf(stdout,"------------\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"Required Parameters (except with -h):\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-i           : source file  (-i source.pnm also *.pgm, *.ppm) \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-o           : destination file (-o dest.j2k or .jp2) \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"Optional Parameters:\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-h           : display the help information \n ");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-r           : different compression ratios for successive layers (-r 20,10,5)\n ");\r
+  fprintf(stdout,"           - The rate specified for each quality level is the desired \n");\r
+  fprintf(stdout,"             compression factor.\n");\r
+  fprintf(stdout,"       Example: -r 20,10,1 means quality 1: compress 20x, \n");\r
+  fprintf(stdout,"         quality 2: compress 10x and quality 3: compress lossless\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"               (options -r and -q cannot be used together)\n ");\r
+  fprintf(stdout,"\n");\r
+\r
+  fprintf(stdout,"-q           : different psnr for successive layers (-q 30,40,50) \n ");\r
+\r
+  fprintf(stdout,"               (options -r and -q cannot be used together)\n ");\r
+\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-n           : number of resolutions (-n 3) \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-b           : size of code block (-b 32,32) \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-c           : size of precinct (-c 128,128) \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-t           : size of tile (-t 512,512) \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-p           : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-s           : subsampling factor (-s 2,2) [-s X,Y] \n");\r
+  fprintf(stdout,"       Remark: subsampling bigger than 2 can produce error\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-SOP         : write SOP marker before each packet \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-EPH         : write EPH marker after each header packet \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-M           : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n");\r
+  fprintf(stdout,"                 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] \n");\r
+  fprintf(stdout,"                 Indicate multiple modes by adding their values. \n");\r
+  fprintf(stdout,"                 ex: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-x           : create an index file *.Idx (-x index_name.Idx) \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-ROI         : c=%%d,U=%%d : quantization indices upshifted \n");\r
+  fprintf(stdout,"               for component c=%%d [%%d = 0,1,2]\n");\r
+  fprintf(stdout,"               with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-d           : offset of the origin of the image (-d 150,300) \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-T           : offset of the origin of the tiles (-T 100,75) \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"-I           : use the irreversible DWT 9-7 (-I) \n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"IMPORTANT:\n");\r
+  fprintf(stdout,"-----------\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"The index file has the structure below:\n");\r
+  fprintf(stdout,"---------------------------------------\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"Image_height Image_width\n");\r
+  fprintf(stdout,"progression order\n");\r
+  fprintf(stdout,"Tiles_size_X Tiles_size_Y\n");\r
+  fprintf(stdout,"Components_nb\n");\r
+  fprintf(stdout,"Layers_nb\n");\r
+  fprintf(stdout,"decomposition_levels\n");\r
+  fprintf(stdout,"[Precincts_size_X_res_Nr Precincts_size_Y_res_Nr]...\n");\r
+  fprintf(stdout,"   [Precincts_size_X_res_0 Precincts_size_Y_res_0]\n");\r
+  fprintf(stdout,"Main_header_end_position\n");\r
+  fprintf(stdout,"Codestream_size\n");\r
+  fprintf(stdout,"Tile_0 start_pos end_Theader end_pos TotalDisto NumPix MaxMSE\n");\r
+  fprintf(stdout,"Tile_1   ''           ''        ''        ''       ''    ''\n");\r
+  fprintf(stdout,"...\n");\r
+  fprintf(stdout,"Tile_Nt   ''           ''        ''        ''       ''    ''\n");\r
+  fprintf(stdout,"Tpacket_0 Tile layer res. comp. prec. start_pos end_pos disto\n");\r
+  fprintf(stdout,"...\n");\r
+  fprintf(stdout,"Tpacket_Np ''   ''    ''   ''    ''       ''       ''     ''\n");\r
+\r
+  fprintf(stdout,"MaxDisto\n");\r
+\r
+  fprintf(stdout,"TotalDisto\n\n");\r
+}\r
+\r
+OPJ_PROG_ORDER give_progression(char progression[4]) {\r
+  if(strncmp(progression, "LRCP", 4) == 0) {\r
+    return LRCP;\r
+  }\r
+  if(strncmp(progression, "RLCP", 4) == 0) {\r
+    return RLCP;\r
+  }\r
+  if(strncmp(progression, "RPCL", 4) == 0) {\r
+    return RPCL;\r
+  }\r
+  if(strncmp(progression, "PCRL", 4) == 0) {\r
+    return PCRL;\r
+  }\r
+  if(strncmp(progression, "CPRL", 4) == 0) {\r
+    return CPRL;\r
+  }\r
+\r
+  return PROG_UNKNOWN;\r
+}\r
+\r
+int get_file_format(char *filename) {\r
+  unsigned int i;\r
+  static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp", "j2k", "jp2" };\r
+  static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, J2K_CFMT, JP2_CFMT };\r
+  char * ext = strrchr(filename, '.') + 1;\r
+  for(i = 0; i < sizeof(format); i++) {\r
+    if(strnicmp(ext, extension[i], 3) == 0) {\r
+      return format[i];\r
+    }\r
+  }\r
+\r
+  return -1;\r
+}\r
+\r
+/* ------------------------------------------------------------------------------------ */\r
+\r
+int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters) {\r
+  int i, j;\r
+\r
+  /* parse the command line */\r
+\r
+  while (1) {\r
+    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");\r
+    if (c == -1)\r
+      break;\r
+    switch (c) {\r
+      case 'i':      /* input file */\r
+      {\r
+        char *infile = optarg;\r
+        parameters->decod_format = get_file_format(infile);\r
+        switch(parameters->decod_format) {\r
+          case PGX_DFMT:\r
+          case PXM_DFMT:\r
+          case BMP_DFMT:\r
+            break;\r
+          default:\r
+            fprintf(stderr, \r
+              "!! Unrecognized format for infile : %s [accept only *.pnm, *.pgm, *.ppm, *.pgx or *.bmp] !!\n\n", \r
+              infile);\r
+            return 1;\r
+            break;\r
+        }\r
+        strncpy(parameters->infile, infile, MAX_PATH);\r
+      }\r
+      break;\r
+        \r
+        /* ----------------------------------------------------- */\r
+\r
+      case 'o':      /* output file */\r
+      {\r
+        char *outfile = optarg;\r
+        parameters->cod_format = get_file_format(outfile);\r
+        switch(parameters->cod_format) {\r
+          case J2K_CFMT:\r
+          case JP2_CFMT:\r
+            break;\r
+          default:\r
+            fprintf(stderr, "Unknown output format image %s [only *.j2k, *.jp2]!! \n", outfile);\r
+            return 1;\r
+            break;\r
+        }\r
+        strncpy(parameters->outfile, outfile, MAX_PATH);\r
+      }\r
+      break;\r
+\r
+        /* ----------------------------------------------------- */\r
+      \r
+      case 'r':      /* rates rates/distorsion */\r
+      {\r
+        char *s = optarg;\r
+        while (sscanf(s, "%d", &parameters->tcp_rates[parameters->tcp_numlayers]) == 1) {\r
+          parameters->tcp_numlayers++;\r
+          while (*s && *s != ',') {\r
+            s++;\r
+          }\r
+          if (!*s)\r
+            break;\r
+          s++;\r
+        }\r
+        parameters->cp_disto_alloc = 1;\r
+      }\r
+      break;\r
+        \r
+        /* ----------------------------------------------------- */\r
+      \r
+      case 'q':      /* add fixed_quality */\r
+      {\r
+        char *s = optarg;\r
+        while (sscanf(s, "%f", &parameters->tcp_distoratio[parameters->tcp_numlayers]) == 1) {\r
+          parameters->tcp_numlayers++;\r
+          while (*s && *s != ',') {\r
+            s++;\r
+          }\r
+          if (!*s)\r
+            break;\r
+          s++;\r
+        }\r
+        parameters->cp_fixed_quality = 1;\r
+      }\r
+      break;\r
+        \r
+        /* dda */\r
+        /* ----------------------------------------------------- */\r
+\r
+      case 'f':      /* mod fixed_quality (before : -q) */\r
+      {\r
+        int *row = NULL, *col = NULL;\r
+        int numlayers = 0, numresolution = 0, matrix_width = 0;\r
+\r
+        char *s = optarg;\r
+        sscanf(s, "%d", &numlayers);\r
+        s++;\r
+        if (numlayers > 9)\r
+          s++;\r
+\r
+        parameters->tcp_numlayers = numlayers;\r
+        numresolution = parameters->numresolution;\r
+        matrix_width = numresolution * 3;\r
+        parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int));\r
+        s = s + 2;\r
+\r
+        for (i = 0; i < numlayers; i++) {\r
+          row = &parameters->cp_matrice[i * matrix_width];\r
+          col = row;\r
+          parameters->tcp_rates[i] = 1;\r
+          sscanf(s, "%d,", &col[0]);\r
+          s += 2;\r
+          if (col[0] > 9)\r
+            s++;\r
+          col[1] = 0;\r
+          col[2] = 0;\r
+          for (j = 1; j < numresolution; j++) {\r
+            col += 3;\r
+            sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]);\r
+            s += 6;\r
+            if (col[0] > 9)\r
+              s++;\r
+            if (col[1] > 9)\r
+              s++;\r
+            if (col[2] > 9)\r
+              s++;\r
+          }\r
+          if (i < numlayers - 1)\r
+            s++;\r
+        }\r
+        parameters->cp_fixed_alloc = 1;\r
+      }\r
+      break;\r
+        \r
+        /* ----------------------------------------------------- */\r
+\r
+      case 't':      /* tiles */\r
+      {\r
+        sscanf(optarg, "%d,%d", &parameters->cp_tdx, &parameters->cp_tdy);\r
+        parameters->tile_size_on = true;\r
+      }\r
+      break;\r
+        \r
+        /* ----------------------------------------------------- */\r
+      \r
+      case 'n':      /* resolution */\r
+      {\r
+        sscanf(optarg, "%d", &parameters->numresolution);\r
+      }\r
+      break;\r
+        \r
+        /* ----------------------------------------------------- */\r
+      case 'c':      /* precinct dimension */\r
+      {\r
+        char sep;\r
+        int res_spec = 0;\r
+\r
+        char *s = optarg;\r
+        do {\r
+          sep = 0;\r
+          sscanf(s, "[%d,%d]%c", &parameters->prcw_init[res_spec], &parameters->prch_init[res_spec], &sep);\r
+          parameters->csty |= 0x01;\r
+          res_spec++;\r
+          s = strpbrk(s, "]") + 2;\r
+        }\r
+        while (sep == ',');\r
+        parameters->res_spec = res_spec;\r
+      }\r
+      break;\r
+        \r
+        /* ----------------------------------------------------- */\r
+      \r
+      case 'b':      /* code-block dimension */\r
+      {\r
+        int cblockw_init = 0, cblockh_init = 0;\r
+        sscanf(optarg, "%d,%d", &cblockw_init, &cblockh_init);\r
+        if (cblockw_init * cblockh_init > 4096 || cblockw_init > 1024\r
+          || cblockw_init < 4 || cblockh_init > 1024 || cblockh_init < 4) {\r
+          fprintf(stderr,\r
+            "!! Size of code_block error (option -b) !!\n\nRestriction :\n    * width*height<=4096\n    * 4<=width,height<= 1024\n\n");\r
+          return 1;\r
+        }\r
+        parameters->cblockw_init = cblockw_init;\r
+        parameters->cblockh_init = cblockh_init;\r
+      }\r
+      break;\r
+        \r
+        /* ----------------------------------------------------- */\r
+      \r
+      case 'x':      /* creation of index file */\r
+      {\r
+        char *index = optarg;\r
+        strncpy(parameters->index, index, MAX_PATH);\r
+        parameters->index_on = 1;\r
+      }\r
+      break;\r
+        \r
+        /* ----------------------------------------------------- */\r
+      \r
+      case 'p':      /* progression order */\r
+      {\r
+        char progression[4];\r
+\r
+        strncpy(progression, optarg, 4);\r
+        parameters->prog_order = give_progression(progression);\r
+        if (parameters->prog_order == -1) {\r
+          fprintf(stderr, "Unrecognized progression order [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n");\r
+          return 1;\r
+        }\r
+      }\r
+      break;\r
+        \r
+        /* ----------------------------------------------------- */\r
+      \r
+      case 's':      /* subsampling factor */\r
+      {\r
+        if (sscanf(optarg, "%d,%d", &parameters->subsampling_dx, &parameters->subsampling_dy) != 2) {\r
+          fprintf(stderr,  "'-s' sub-sampling argument error !  [-s dx,dy]\n");\r
+          return 1;\r
+        }\r
+      }\r
+      break;\r
+        \r
+        /* ----------------------------------------------------- */\r
+      \r
+      case 'd':      /* coordonnate of the reference grid */\r
+      {\r
+        if (sscanf(optarg, "%d,%d", &parameters->image_offset_x0, &parameters->image_offset_y0) != 2) {\r
+          fprintf(stderr,  "-d 'coordonnate of the reference grid' argument error !! [-d x0,y0]\n");\r
+          return 1;\r
+        }\r
+      }\r
+      break;\r
+        \r
+        /* ----------------------------------------------------- */\r
+      \r
+      case 'h':      /* display an help description */\r
+      {\r
+        encode_help_display();\r
+        return 1;\r
+      }\r
+      break;\r
+        \r
+        /* ----------------------------------------------------- */\r
+\r
+      case 'P':      /* POC */\r
+      {\r
+        int numpocs = 0;    /* number of progression order change (POC) default 0 */\r
+        opj_poc_t *POC = NULL;  /* POC : used in case of Progression order change */\r
+\r
+        char *s = optarg;\r
+        POC = parameters->POC;\r
+\r
+        fprintf(stderr, "/----------------------------------\\\n");\r
+        fprintf(stderr, "|  POC option not fully tested !!  |\n");\r
+        fprintf(stderr, "\\----------------------------------/\n");\r
+        \r
+        while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%s", &POC[numpocs].tile,\r
+          &POC[numpocs].resno0, &POC[numpocs].compno0,\r
+          &POC[numpocs].layno1, &POC[numpocs].resno1,\r
+          &POC[numpocs].compno1, POC[numpocs].progorder) == 7) {\r
+          POC[numpocs].prg = give_progression(POC[numpocs].progorder);\r
+          /* POC[numpocs].tile; */\r
+          numpocs++;\r
+          while (*s && *s != '/') {\r
+            s++;\r
+          }\r
+          if (!*s) {\r
+            break;\r
+          }\r
+          s++;\r
+        }\r
+        parameters->numpocs = numpocs;\r
+      }\r
+      break;\r
+        \r
+        /* ------------------------------------------------------ */\r
+        \r
+      case 'S':      /* SOP marker */\r
+      {\r
+        parameters->csty |= 0x02;\r
+      }\r
+      break;\r
+        \r
+        /* ------------------------------------------------------ */\r
+      \r
+      case 'E':      /* EPH marker */\r
+      {\r
+        parameters->csty |= 0x04;\r
+      }\r
+      break;\r
+        \r
+        /* ------------------------------------------------------ */\r
+      \r
+      case 'M':      /* Mode switch pas tous au point !! */\r
+      {\r
+        int value = 0;\r
+        if (sscanf(optarg, "%d", &value) == 1) {\r
+          for (i = 0; i <= 5; i++) {\r
+            int cache = value & (1 << i);\r
+            if (cache)\r
+              parameters->mode |= (1 << i);\r
+          }\r
+        }\r
+      }\r
+      break;\r
+        \r
+        /* ------------------------------------------------------ */\r
+      \r
+      case 'R':      /* ROI */\r
+      {\r
+        if (sscanf(optarg, "OI:c=%d,U=%d", &parameters->roi_compno, &parameters->roi_shift) != 2) {\r
+          fprintf(stderr, "ROI error !! [-ROI:c='compno',U='shift']\n");\r
+          return 1;\r
+        }\r
+      }\r
+      break;\r
+        \r
+        /* ------------------------------------------------------ */\r
+      \r
+      case 'T':      /* Tile offset */\r
+      {\r
+        if (sscanf(optarg, "%d,%d", &parameters->cp_tx0, &parameters->cp_ty0) != 2) {\r
+          fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]");\r
+          return 1;\r
+        }\r
+      }\r
+      break;\r
+        \r
+        /* ------------------------------------------------------ */\r
+        \r
+      case 'C':      /* add a comment */\r
+      {\r
+        parameters->cp_comment = (char*)malloc(strlen(optarg) + 1);\r
+        if(parameters->cp_comment) {\r
+          strcpy(parameters->cp_comment, optarg);\r
+        }\r
+      }\r
+      break;\r
+        \r
+        /* ------------------------------------------------------ */\r
+      \r
+      case 'I':      /* reversible or not */\r
+      {\r
+        parameters->irreversible = 1;\r
+      }\r
+      break;\r
+        \r
+        /* ------------------------------------------------------ */\r
+      \r
+      default:\r
+        fprintf(stderr, "ERROR -> this option is not valid \"-%c %s\"\n", c, optarg);\r
+        return 1;\r
+    }\r
+  }\r
+\r
+  /* check for possible errors */\r
+\r
+  if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {\r
+    fprintf(stderr, "usage: image_to_j2k -i image-file -o j2k/jp2-file (+ options)\n");\r
+    return 1;\r
+  }\r
+\r
+  if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || parameters->cp_fixed_quality)\r
+    && (!(parameters->cp_disto_alloc ^ parameters->cp_fixed_alloc ^ parameters->cp_fixed_quality))) {\r
+    fprintf(stderr, "Error: options -r -q and -f cannot be used together !!\n");\r
+    return 1;\r
+  }        /* mod fixed_quality */\r
+\r
+  /* if no rate entered, lossless by default */\r
+  if (parameters->tcp_numlayers == 0) {\r
+    parameters->tcp_rates[0] = 0;  /* MOD antonin : losslessbug */\r
+    parameters->tcp_numlayers++;\r
+    parameters->cp_disto_alloc = 1;\r
+  }\r
+\r
+  if((parameters->cp_tx0 > parameters->image_offset_x0) || (parameters->cp_ty0 > parameters->image_offset_y0)) {\r
+    fprintf(stderr,\r
+      "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n",\r
+      parameters->cp_tx0, parameters->image_offset_x0, parameters->cp_ty0, parameters->image_offset_y0);\r
+    return 1;\r
+  }\r
+\r
+  for (i = 0; i < parameters->numpocs; i++) {\r
+    if (parameters->POC[i].prg == -1) {\r
+      fprintf(stderr,\r
+        "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n",\r
+        i + 1);\r
+    }\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+/**\r
+sample error callback expecting a FILE* client object\r
+*/\r
+void error_callback(const char *msg, void *client_data) {\r
+  FILE *stream = (FILE*)client_data;\r
+  fprintf(stream, "[ERROR] %s", msg);\r
+}\r
+/**\r
+sample warning callback expecting a FILE* client object\r
+*/\r
+void warning_callback(const char *msg, void *client_data) {\r
+  FILE *stream = (FILE*)client_data;\r
+  fprintf(stream, "[WARNING] %s", msg);\r
+}\r
+/**\r
+sample debug callback expecting a FILE* client object\r
+*/\r
+void info_callback(const char *msg, void *client_data) {\r
+  FILE *stream = (FILE*)client_data;\r
+  fprintf(stream, "[INFO] %s", msg);\r
+}\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+int main(int argc, char **argv) {\r
+  bool bSuccess;\r
+  bool delete_comment = true;\r
+  opj_cparameters_t parameters;  /* compression parameters */\r
+  opj_event_mgr_t event_mgr;    /* event manager */\r
+  opj_image_t *image = NULL;\r
+\r
+  /* \r
+  configure the event callbacks (not required)\r
+  setting of each callback is optionnal \r
+  */\r
+  memset(&event_mgr, 0, sizeof(opj_event_mgr_t));\r
+  event_mgr.error_handler = error_callback;\r
+  event_mgr.warning_handler = warning_callback;\r
+  event_mgr.info_handler = info_callback;\r
+\r
+  /* set encoding parameters to default values */\r
+  opj_set_default_encoder_parameters(&parameters);\r
+\r
+  /* parse input and get user encoding parameters */\r
+  if(parse_cmdline_encoder(argc, argv, &parameters) == 1) {\r
+    return 0;\r
+  }\r
+\r
+  if(parameters.cp_comment == NULL) {\r
+    parameters.cp_comment = "Created by OpenJPEG version 0.9";\r
+    /* no need to delete parameters.cp_comment on exit */\r
+    delete_comment = false;\r
+  }\r
+\r
+  /* decode the source image */\r
+  /* ----------------------- */\r
+\r
+  switch (parameters.decod_format) {\r
+    case PGX_DFMT:\r
+      image = pgxtoimage(parameters.infile, &parameters);\r
+      if (!image) {\r
+        fprintf(stderr, " unable to load pgx file\n");\r
+        return 1;\r
+      }\r
+      break;\r
+    \r
+    case PXM_DFMT:\r
+      image = pnmtoimage(parameters.infile, &parameters);\r
+      if (!image) {\r
+        fprintf(stderr, " not a pnm file\n");\r
+        return 1;\r
+      }\r
+      break;\r
+\r
+    case BMP_DFMT:\r
+      image = bmptoimage(parameters.infile, &parameters);\r
+      if (!image) {\r
+        fprintf(stderr, " not a bmp file\n");\r
+        return 1;\r
+      }\r
+      break;\r
+  }\r
+\r
+  /* encode the destination image */\r
+  /* ---------------------------- */\r
+\r
+  if (parameters.cod_format == J2K_CFMT) {  /* J2K format output */\r
+    int codestream_length;\r
+    opj_cio_t *cio = NULL;\r
+    FILE *f = NULL;\r
+\r
+    /* get a J2K compressor handle */\r
+    opj_cinfo_t* cinfo = opj_create_compress(CODEC_J2K);\r
+\r
+    /* catch events using our callbacks and give a local context */\r
+    opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);      \r
+\r
+    /* setup the encoder parameters using the current image and using user parameters */\r
+    opj_setup_encoder(cinfo, &parameters, image);\r
+\r
+    /* open a byte stream for writing */\r
+    /* allocate memory for all tiles */\r
+    cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);\r
+\r
+    /* encode the image */\r
+    bSuccess = opj_encode(cinfo, cio, image, parameters.index);\r
+    if (!bSuccess) {\r
+      opj_cio_close(cio);\r
+      fprintf(stderr, "failed to encode image\n");\r
+      return 1;\r
+    }\r
+    codestream_length = cio_tell(cio);\r
+\r
+    /* write the buffer to disk */\r
+    f = fopen(parameters.outfile, "wb");\r
+    if (!f) {\r
+      fprintf(stderr, "failed to open %s for writing\n", parameters.outfile);\r
+      return 1;\r
+    }\r
+    fwrite(cio->buffer, 1, codestream_length, f);\r
+    fclose(f);\r
+\r
+    /* close and free the byte stream */\r
+    opj_cio_close(cio);\r
+\r
+    /* free remaining compression structures */\r
+    opj_destroy_compress(cinfo);\r
+\r
+  } else {      /* JP2 format output */\r
+    int codestream_length;\r
+    opj_cio_t *cio = NULL;\r
+    FILE *f = NULL;\r
+\r
+    /* get a JP2 compressor handle */\r
+    opj_cinfo_t* cinfo = opj_create_compress(CODEC_JP2);\r
+\r
+    /* catch events using our callbacks and give a local context */\r
+    opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);      \r
+\r
+    /* setup the encoder parameters using the current image and using user parameters */\r
+    opj_setup_encoder(cinfo, &parameters, image);\r
+\r
+    /* open a byte stream for writing */\r
+    /* allocate memory for all tiles */\r
+    cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);\r
+\r
+    /* encode the image */\r
+    bSuccess = opj_encode(cinfo, cio, image, parameters.index);\r
+    if (!bSuccess) {\r
+      opj_cio_close(cio);\r
+      fprintf(stderr, "failed to encode image\n");\r
+      return 1;\r
+    }\r
+    codestream_length = cio_tell(cio);\r
+\r
+    /* write the buffer to disk */\r
+    f = fopen(parameters.outfile, "wb");\r
+    if (!f) {\r
+      fprintf(stderr, "failed to open %s for writing\n", parameters.outfile);\r
+      return 1;\r
+    }\r
+    fwrite(cio->buffer, 1, codestream_length, f);\r
+    fclose(f);\r
+\r
+    /* close and free the byte stream */\r
+    opj_cio_close(cio);\r
+\r
+    /* free remaining compression structures */\r
+    opj_destroy_compress(cinfo);\r
+\r
+  }\r
+\r
+  /* free user parameters structure */\r
+  if(delete_comment) {\r
+    if(parameters.cp_comment) free(parameters.cp_comment);\r
+  }\r
+  if(parameters.cp_matrice) free(parameters.cp_matrice);\r
+\r
+  /* free image data */\r
+  opj_image_destroy(image);\r
+\r
+  return 0;\r
+}\r
+\r
index 29ee7f98d14c7cb79214730ab8cb4aa4ce1c90de..a1654bf9cdc156b710c869a07afed42e6e5f3737 100644 (file)
-/* 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.
-*/
-
-
-
-/*MEMORY LEAK*/
-
-#ifdef _DEBUG
-
-#define _CRTDBG_MAP_ALLOC
-
-#include <stdlib.h>  /* Must be included first */
-
-#include <crtdbg.h>
-
-#endif
-
-/* MEM */
-
-
-
-#include <openjpeg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifndef DONT_HAVE_GETOPT
-#include <getopt.h>
-#else
-#include "compat/getopt.h"
-#endif
-
-void usage_display(char *prgm)
-{
-  fprintf(stdout,"Usage:\n");
-  fprintf(stdout,"  %s...\n",prgm);
-  fprintf(stdout,"  -i <compressed file>\n");
-  fprintf(stdout,"    REQUIRED\n");
-  fprintf(stdout,"    Currently accepts J2K-files, JP2-files and JPT-files. The file type\n");
-  fprintf(stdout,"    is identified based on its suffix.\n");
-  fprintf(stdout,"  -o <decompressed file>\n");
-  fprintf(stdout,"    REQUIRED\n");
-  fprintf(stdout,"    Currently accepts PGM-files, PPM-files, PNM-files, PGX-files and\n");
-  fprintf(stdout,"    BMP-files. Binary data is written to the file (not ascii). If a PGX\n");
-  fprintf(stdout,"    filename is given, there will be as many output files as there are\n");
-  fprintf(stdout,"    components: an indice starting from 0 will then be appended to the\n");
-  fprintf(stdout,"    output filename, just before the \"pgx\" extension. If a PGM filename\n");
-  fprintf(stdout,"    is given and there are more than one component, only the first component\n");
-  fprintf(stdout,"    will be written to the file.\n");
-  fprintf(stdout,"  -r <reduce factor>\n");
-  fprintf(stdout,"    Set the number of highest resolution levels to be discarded. The\n");
-  fprintf(stdout,"    image resolution is effectively divided by 2 to the power of the\n");
-  fprintf(stdout,"    number of discarded levels. The reduce factor is limited by the\n");
-  fprintf(stdout,"    smallest total number of decomposition levels among tiles.\n");
-  fprintf(stdout,"  -l <number of quality layers to decode>\n");
-  fprintf(stdout,"    Set the maximum number of quality layers to decode. If there are\n");
-  fprintf(stdout,"    less quality layers than the specified number, all the quality layers\n");
-  fprintf(stdout,"    are decoded.\n");
-  fprintf(stdout,"  -u\n");
-  fprintf(stdout,"    print an usage statement\n");
-  fprintf(stdout,"\n");
-}
-
-int main(int argc, char **argv)
-{
-  FILE *fsrc=NULL;
-  FILE *fdest=NULL;
-  char *infile=NULL;
-  char *outfile=NULL;
-  char *tmp=NULL;
-  char S1, S2, S3;
-  
-  char *src=NULL; 
-  
-  int len;
-  
-  j2k_image_t img;
-  j2k_cp_t cp;
-  jp2_struct_t *jp2_struct=NULL;
-  
-  int w, wr, wrr, h, hr, hrr, max;
-  int i, compno, pad, j;
-  int adjust;
-  
-  cp.layer=0;
-  cp.reduce=0;
-  cp.decod_format=-1;
-  cp.cod_format=-1;
-  
-  while (1) {
-    int c = getopt(argc, argv,"i:o:r:l:u");
-    if (c == -1)
-      break;
-    switch (c) {
-      
-      /* Input file */
-    case 'i':
-      infile = optarg;
-      tmp = optarg;
-      while (*tmp) {
-   tmp++;
-      }
-      tmp--;
-      S3 = *tmp;
-      tmp--;
-      S2 = *tmp;
-      tmp--;
-      S1 = *tmp;
-      
-      /* 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')) {
-   cp.cod_format=J2K_CFMT;
-   break;
-      }
-      
-      /* JP2 format */
-      if ((S1 == 'j' && S2 == 'p' && S3 == '2')
-   || (S1 == 'J' && S2 == 'P' && S3 == '2')) {
-   cp.cod_format=JP2_CFMT;
-   break;
-      }
-      
-      /* JPT format */
-      if ((S1 == 'j' && S2 == 'p' && S3 == 't')
-   || (S1 == 'J' && S2 == 'P' && S3 == 'T')) {
-   cp.cod_format=JPT_CFMT;
-   break;
-      }
-      
-      fprintf(stderr,
-   "j2k_to_image : Unknown input image format *.%c%c%c [only *.j2k, *.jp2, *.jpc or *.jpt]!! \n",
-   S1, S2, S3);
-      return 1;
-      break;
-      
-      /* ----------------------------------------------------- */
-      
-      /*Output file */
-    case 'o':
-      outfile = optarg;
-      tmp = optarg;
-      while (*tmp) {
-   tmp++;
-      }
-      tmp--;
-      S3 = *tmp;
-      tmp--;
-      S2 = *tmp;
-      tmp--;
-      S1 = *tmp;
-      
-      /* PGX format */     
-      if ((S1 == 'p' && S2 == 'g' && S3 == 'x')
-   || (S1 == 'P' && S2 == 'G' && S3 == 'X')) {
-   cp.decod_format = PGX_DFMT;
-   break;
-      }
-      
-      /* PxM format */
-      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.decod_format = PXM_DFMT;
-   break;
-      }
-      
-      /* BMP format */
-      if ((S1 == 'b' && S2 == 'm' && S3 == 'p')
-   || (S1 == 'B' && S2 == 'M' && S3 == 'P')) {
-   cp.decod_format = BMP_DFMT;
-   break;
-      }
-      
-      /* otherwise : error */
-      fprintf(stderr,
-   "!! Unrecognized output image format *.%c%c%c [only *.pnm, *.pgm, *.ppm, *.pgx or *.bmp] !!\n",
-   S1, S2, S3);
-      
-      return 1;
-      break;
-      
-      /* ----------------------------------------------------- */
-      
-      /*Reduce option*/
-    case 'r':
-      tmp=optarg;
-      sscanf(tmp, "%d", &cp.reduce);
-      break;
-      
-      /* ----------------------------------------------------- */
-      
-      /*Layering option*/
-    case 'l':
-      tmp=optarg;
-      sscanf(tmp, "%d", &cp.layer);
-      break;
-      
-      /* ----------------------------------------------------- */
-      
-    case 'u':         
-      usage_display(argv[0]);
-      return 0;
-      break;
-      /* ----------------------------------------------------- */
-      
-    default:
-      fprintf(stderr,"WARNING -> this option is not valid \"-%c %s\"\n",c,optarg);
-      break;
-      
-    }
-  }
-  
-  /*Check required arguments*/
-  /*------------------------*/
-  if (!infile || !outfile) {
-    fprintf(stderr,"ERROR -> At least one required argument is missing\nCheck j2k_to_image -u for usage information\n");
-    return 1;
-  }
-  
-  /*Read the input file and put it in memory*/
-  /*----------------------------------------*/
-  fsrc = fopen(infile, "rb");
-  if (!fsrc) {
-    fprintf(stderr, "ERROR -> failed to open %s for reading\n", infile);
-    return 1;
-  }
-  fseek(fsrc, 0, SEEK_END);
-  len = ftell(fsrc);
-  fseek(fsrc, 0, SEEK_SET);
-  src = (char *) malloc(len);
-  fread(src, 1, len, fsrc);
-  fclose(fsrc);
-  
-  /*Decode the code-stream*/
-  /*----------------------*/
-  switch(cp.cod_format) {
-    
-  case J2K_CFMT:
-    if (!j2k_decode(src, len, &img, &cp)) {
-      fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
-      return 1;
-    }
-    break;
-    
-  case JP2_CFMT:
-    jp2_struct = (jp2_struct_t *) malloc(sizeof(jp2_struct_t));
-    jp2_struct->image = &img;
-    
-    if (jp2_read_struct(src, jp2_struct, len)) {
-      fprintf(stderr, "ERROR -> j2k_to_image: failed to decode jp2 structure!\n");
-      return 1;
-    }
-    
-    if (!j2k_decode(src + jp2_struct->j2k_codestream_offset, jp2_struct->j2k_codestream_len, &img, &cp)) {
-      fprintf(stderr, "ERROR -> 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);
-    break;
-    
-  case JPT_CFMT:
-    if (!j2k_decode_jpt_stream(src, len, &img, &cp)) {
-      fprintf(stderr, "ERROR -> j2k_to_image: failed to decode JPT-file!\n");
-      return 1;
-    }
-    break;
-    
-  default:
-    fprintf(stderr,
-      "ERROR -> j2k_to_image : Unknown input image format\n");
-    return 1;
-    break;
-  }
-  
-  /*Free the memory containing the code-stream*/
-  /*------------------------------------------*/
-  
-  free(src);
-  
-  
-  /*Create output image*/
-  /*-------------------*/
-  
-  /* ---------------------------- / */
-  /* /                            / */
-  /* /  FORMAT : PNM, PGM or PPM  / */
-  /* /                            / */
-  /* ---------------------------- / */
-  
-  switch (cp.decod_format) {
-  case PXM_DFMT:         /* PNM PGM PPM */
-    
-    tmp=outfile;
-    while (*tmp) {
-      tmp++;
-    }
-    tmp--;
-    tmp--;
-    S2 = *tmp;
-    
-    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
-      && S2 !='g' && S2 !='G') {
-      
-      fdest = fopen(outfile, "wb");
-      if (!fdest) {
-   fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile);
-   return 1;
-      }
-      
-      w = int_ceildiv(img.x1 - img.x0, img.comps[0].dx);
-      /* wr = int_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 = int_ceildiv(img.y1 - img.y0, img.comps[0].dy);
-      /* hr = int_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(fdest, "P6\n%d %d\n%d\n", wrr, hrr, max);
-      adjust = img.comps[0].prec > 8 ? img.comps[0].prec - 8 : 0;
-      for (i = 0; i < wrr * hrr; i++) {
-   int r, g, b;
-        unsigned char rc,gc,bc;
-   r = img.comps[0].data[i / wrr * wr + i % wrr];
-   r += (img.comps[0].sgnd ? 1 << (img.comps[0].prec - 1) : 0);
-   rc = (unsigned char) ((r >> adjust)+((r >> (adjust-1))%2));
-   
-   g = img.comps[1].data[i / wrr * wr + i % wrr];
-   g += (img.comps[1].sgnd ? 1 << (img.comps[1].prec - 1) : 0);
-   gc = (unsigned char) ((g >> adjust)+((g >> (adjust-1))%2));
-   
-   b = img.comps[2].data[i / wrr * wr + i % wrr];
-   b += (img.comps[2].sgnd ? 1 << (img.comps[2].prec - 1) : 0);
-   bc = (unsigned char) ((b >> adjust)+((b >> (adjust-1))%2));
-   
-   fprintf(fdest, "%c%c%c", rc, gc, bc);
-      }
-      free(img.comps[0].data);
-      free(img.comps[1].data);
-      free(img.comps[2].data);
-      fclose(fdest);
-      
-    } else {
-      int ncomp=(S2=='g' || S2=='G')?1:img.numcomps;
-      if (img.numcomps>ncomp) {
-   fprintf(stderr,"WARNING -> [PGM files] Only the first component\n");
-   fprintf(stderr,"           is written to the file\n");
-      }
-      for (compno = 0; compno < ncomp; compno++) {
-   char name[256];
-   if (ncomp > 1) {
-     sprintf(name, "%d.%s", compno, outfile);
-   } else {
-     sprintf(name, "%s", outfile);
-   }
-   
-   fdest = fopen(name, "wb");
-   if (!fdest) {
-     fprintf(stderr, "ERROR -> failed to open %s for writing\n", name);
-     return 1;
-   }
-   
-   w = int_ceildiv(img.x1 - img.x0, img.comps[compno].dx);
-   /* wr = int_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 = int_ceildiv(img.y1 - img.y0, img.comps[compno].dy);
-   /* hr = int_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(fdest, "P5\n%d %d\n%d\n", wrr, hrr, max);
-   adjust =
-     img.comps[compno].prec > 8 ? img.comps[compno].prec - 8 : 0;
-   for (i = 0; i < wrr * hrr; i++) {
-     int l;
-          unsigned char lc;
-     l = img.comps[compno].data[i / wrr * wr + i % wrr];
-     l += (img.comps[compno].
-       sgnd ? 1 << (img.comps[compno].prec - 1) : 0);
-     lc = (unsigned char) ((l >> adjust)+((l >> (adjust-1))%2));
-     fprintf(fdest, "%c", lc);
-   }
-   fclose(fdest);
-   free(img.comps[compno].data);
-      }
-    }
-    break;
-    
-    /* ------------------------ / */
-    /* /                        / */
-    /* /     FORMAT : PGX       / */
-    /* /                        / */
-    /* /----------------------- / */
-  case PGX_DFMT:         /* PGX */
-    for (compno = 0; compno < img.numcomps; compno++) {
-      j2k_comp_t *comp = &img.comps[compno];
-      char name[256];
-      int nbytes = 0;
-      tmp = outfile;
-      while (*tmp) {
-   tmp++;
-      }
-      while (*tmp!='.') {
-   tmp--;
-      }
-      *tmp='\0';
-      
-      if (img.numcomps > 1)
-        sprintf(name, "%s-%d.pgx", outfile, compno);
-      else
-        sprintf(name, "%s.pgx", outfile);
-      
-      fdest = fopen(name, "wb");
-      if (!fdest) {
-   fprintf(stderr, "ERROR -> failed to open %s for writing\n", name);
-   return 1;
-      }
-      
-      /* w = int_ceildiv(img.x1 - img.x0, comp->dx);*/
-      /* wr = int_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 = int_ceildiv(img.y1 - img.y0, comp->dy);*/
-      /* hr = int_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(fdest, "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, fdest);
-     
-   }
-      }
-      free(img.comps[compno].data);
-      fclose(fdest);
-    }
-    break;
-    
-    /* ------------------------ / */
-    /* /                        / */
-    /* /     FORMAT : BMP       / */
-    /* /                        / */
-    /* /----------------------- / */
-    
-  case BMP_DFMT:         /* 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
-       
-      <<-- <<-- <<-- <<-- */
-      
-      fdest = fopen(outfile, "wb");
-      if (!fdest) {
-   fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile);
-   return 1;
-      }
-      
-      /* w = int_ceildiv(img.x1 - img.x0, img.comps[0].dx);*/
-      /* wr = int_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 = int_ceildiv(img.y1 - img.y0, img.comps[0].dy);*/
-      /* hr = int_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(fdest, "BM");
-      
-      /* FILE HEADER */
-      /* ------------- */
-      fprintf(fdest, "%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(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
-   ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
-      fprintf(fdest, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff,
-   ((54) >> 16) & 0xff, ((54) >> 24) & 0xff);
-      
-      /* INFO HEADER   */
-      /* ------------- */
-      fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,
-   ((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
-      fprintf(fdest, "%c%c%c%c", (unsigned char) ((wr) & 0xff),
-   (unsigned char) ((wr) >> 8) & 0xff,
-   (unsigned char) ((wr) >> 16) & 0xff,
-   (unsigned char) ((wr) >> 24) & 0xff);
-      fprintf(fdest, "%c%c%c%c", (unsigned char) ((hr) & 0xff),
-   (unsigned char) ((hr) >> 8) & 0xff,
-   (unsigned char) ((hr) >> 16) & 0xff,
-   (unsigned char) ((hr) >> 24) & 0xff);
-      fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
-      fprintf(fdest, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff);
-      fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
-   ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
-      fprintf(fdest, "%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(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
-   ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
-      fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
-   ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
-      fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
-   ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
-      fprintf(fdest, "%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(fdest, "%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(fdest, "%c", 0);
-   }
-      }
-      fclose(fdest);
-      free(img.comps[1].data);
-      free(img.comps[2].data);
-    } else {         /* Gray-scale */
-      
-            /* -->> -->> -->> -->>
-            
-             8 bits non code (Gray scale)
-             
-   <<-- <<-- <<-- <<-- */
-      fdest = fopen(outfile, "wb");
-      /* w = int_ceildiv(img.x1 - img.x0, img.comps[0].dx);*/
-      /* wr = int_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 = int_ceildiv(img.y1 - img.y0, img.comps[0].dy);*/
-      /* hr = int_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(fdest, "BM");
-      
-      /* FILE HEADER */
-      /* ------------- */
-      fprintf(fdest, "%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(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
-   ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
-      fprintf(fdest, "%c%c%c%c", (54 + 1024) & 0xff,
-   ((54 + 1024) >> 8) & 0xff, ((54 + 1024) >> 16) & 0xff,
-   ((54 + 1024) >> 24) & 0xff);
-      
-      /* INFO HEADER */
-      /* ------------- */
-      fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,
-   ((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
-      fprintf(fdest, "%c%c%c%c", (unsigned char) ((wr) & 0xff),
-   (unsigned char) ((wr) >> 8) & 0xff,
-   (unsigned char) ((wr) >> 16) & 0xff,
-   (unsigned char) ((wr) >> 24) & 0xff);
-      fprintf(fdest, "%c%c%c%c", (unsigned char) ((hr) & 0xff),
-   (unsigned char) ((hr) >> 8) & 0xff,
-   (unsigned char) ((hr) >> 16) & 0xff,
-   (unsigned char) ((hr) >> 24) & 0xff);
-      fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
-      fprintf(fdest, "%c%c", (8) & 0xff, ((8) >> 8) & 0xff);
-      fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
-   ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
-      fprintf(fdest, "%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(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
-   ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
-      fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
-   ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
-      fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff,
-   ((256) >> 16) & 0xff, ((256) >> 24) & 0xff);
-      fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff,
-   ((256) >> 16) & 0xff, ((256) >> 24) & 0xff);
-    }
-    
-    for (i = 0; i < 256; i++) {
-      fprintf(fdest, "%c%c%c%c", i, i, i, 0);
-    }
-    
-    for (i = 0; i < wr * hr; i++) {
-      /* a modifier !! */
-      /* fprintf(fdest, "%c", img.comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]);*/
-      fprintf(fdest, "%c",
-   img.comps[0].data[w * hr - ((i) / (wr) + 1) * w +
-   (i) % (wr)]);
-   /*if (((i + 1) % w == 0 && w % 2))
-      fprintf(fdest, "%c", 0); */
-      if ((i + 1) % wr == 0) {
-   for (pad = wr % 4 ? 4 - wr % 4 : 0; pad > 0; pad--)   /* ADD */
-     fprintf(fdest, "%c", 0);
-      }
-    }
-    fclose(fdest);
-    free(img.comps[0].data);
-    break;
-
-  default:
-    fprintf(stderr,
-      "ERROR -> j2k_to_image : Unknown output image format\n");
-    return 1;
-    break;
-  }
-  
-  
-  /* Free remaining structures*/
-  /*--------------------------*/
-  j2k_dec_release();
-  
-  
-  
-  /* Check memory leaks if debug mode*/
-  /*---------------------------------*/
-  
-#ifdef _DEBUG
-  
-  _CrtDumpMemoryLeaks();
-  
-#endif
-  
-  return 0;
-}
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+\r
+#include "openjpeg.h"\r
+#include "compat/getopt.h"\r
+#include "convert.h"\r
+\r
+#ifndef WIN32\r
+#define stricmp strcasecmp\r
+#define strnicmp strncasecmp\r
+#endif\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+#define J2K_CFMT 0\r
+#define JP2_CFMT 1\r
+#define JPT_CFMT 2\r
+#define MJ2_CFMT 3\r
+#define PXM_DFMT 0\r
+#define PGX_DFMT 1\r
+#define BMP_DFMT 2\r
+#define YUV_DFMT 3\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+void decode_help_display() {\r
+  fprintf(stdout,"HELP\n----\n\n");\r
+  fprintf(stdout,"- the -h option displays this help information on screen\n\n");\r
+\r
+  fprintf(stdout,"List of parameters for the JPEG 2000 encoder:\n");\r
+  fprintf(stdout,"\n");\r
+  fprintf(stdout,"  -i <compressed file>\n");\r
+  fprintf(stdout,"    REQUIRED\n");\r
+  fprintf(stdout,"    Currently accepts J2K-files, JP2-files and JPT-files. The file type\n");\r
+  fprintf(stdout,"    is identified based on its suffix.\n");\r
+  fprintf(stdout,"  -o <decompressed file>\n");\r
+  fprintf(stdout,"    REQUIRED\n");\r
+  fprintf(stdout,"    Currently accepts PGM-files, PPM-files, PNM-files, PGX-files and\n");\r
+  fprintf(stdout,"    BMP-files. Binary data is written to the file (not ascii). If a PGX\n");\r
+  fprintf(stdout,"    filename is given, there will be as many output files as there are\n");\r
+  fprintf(stdout,"    components: an indice starting from 0 will then be appended to the\n");\r
+  fprintf(stdout,"    output filename, just before the \"pgx\" extension. If a PGM filename\n");\r
+  fprintf(stdout,"    is given and there are more than one component, only the first component\n");\r
+  fprintf(stdout,"    will be written to the file.\n");\r
+  fprintf(stdout,"  -r <reduce factor>\n");\r
+  fprintf(stdout,"    Set the number of highest resolution levels to be discarded. The\n");\r
+  fprintf(stdout,"    image resolution is effectively divided by 2 to the power of the\n");\r
+  fprintf(stdout,"    number of discarded levels. The reduce factor is limited by the\n");\r
+  fprintf(stdout,"    smallest total number of decomposition levels among tiles.\n");\r
+  fprintf(stdout,"  -l <number of quality layers to decode>\n");\r
+  fprintf(stdout,"    Set the maximum number of quality layers to decode. If there are\n");\r
+  fprintf(stdout,"    less quality layers than the specified number, all the quality layers\n");\r
+  fprintf(stdout,"    are decoded.\n");\r
+  fprintf(stdout,"\n");\r
+}\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+int get_file_format(char *filename) {\r
+  unsigned int i;\r
+  static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp", "j2k", "jp2", "jpt" };\r
+  static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT };\r
+  char * ext = strrchr(filename, '.') + 1;\r
+  if(ext) {\r
+    for(i = 0; i < sizeof(format); i++) {\r
+      if(strnicmp(ext, extension[i], 3) == 0) {\r
+        return format[i];\r
+      }\r
+    }\r
+  }\r
+\r
+  return -1;\r
+}\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters) {\r
+  /* parse the command line */\r
+\r
+  while (1) {\r
+    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");\r
+    if (c == -1)\r
+      break;\r
+    switch (c) {\r
+      case 'i':      /* input file */\r
+      {\r
+        char *infile = optarg;\r
+        parameters->decod_format = get_file_format(infile);\r
+        switch(parameters->decod_format) {\r
+          case J2K_CFMT:\r
+          case JP2_CFMT:\r
+          case JPT_CFMT:\r
+            break;\r
+          default:\r
+            fprintf(stderr, \r
+              "!! Unrecognized format for infile : %s [accept only *.j2k, *.jp2, *.jpc or *.jpt] !!\n\n", \r
+              infile);\r
+            return 1;\r
+            break;\r
+        }\r
+        strncpy(parameters->infile, infile, MAX_PATH);\r
+      }\r
+      break;\r
+        \r
+        /* ----------------------------------------------------- */\r
+\r
+      case 'o':      /* output file */\r
+      {\r
+        char *outfile = optarg;\r
+        parameters->cod_format = get_file_format(outfile);\r
+        switch(parameters->cod_format) {\r
+          case PGX_DFMT:\r
+          case PXM_DFMT:\r
+          case BMP_DFMT:\r
+            break;\r
+          default:\r
+            fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx or *.bmp]!! \n", outfile);\r
+            return 1;\r
+            break;\r
+        }\r
+        strncpy(parameters->outfile, outfile, MAX_PATH);\r
+      }\r
+      break;\r
+      \r
+        /* ----------------------------------------------------- */\r
+      \r
+    \r
+      case 'r':    /* reduce option */\r
+      {\r
+        sscanf(optarg, "%d", &parameters->cp_reduce);\r
+      }\r
+      break;\r
+      \r
+        /* ----------------------------------------------------- */\r
+      \r
+\r
+      case 'l':    /* layering option */\r
+      {\r
+        sscanf(optarg, "%d", &parameters->cp_layer);\r
+      }\r
+      break;\r
+      \r
+        /* ----------------------------------------------------- */\r
+      \r
+      case 'h':       /* display an help description */\r
+      {\r
+        decode_help_display();\r
+        return 1;\r
+      }\r
+      break;\r
+            \r
+        /* ----------------------------------------------------- */\r
+      \r
+      default:\r
+        fprintf(stderr,"WARNING -> this option is not valid \"-%c %s\"\n",c, optarg);\r
+        break;\r
+    }\r
+  }\r
+\r
+  /* check for possible errors */\r
+\r
+  if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {\r
+    fprintf(stderr,"ERROR -> At least one required argument is missing\nCheck j2k_to_image -h for usage information\n");\r
+    return 1;\r
+  }\r
+\r
+  return 0;\r
+}\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+/**\r
+sample error callback expecting a FILE* client object\r
+*/\r
+void error_callback(const char *msg, void *client_data) {\r
+  FILE *stream = (FILE*)client_data;\r
+  fprintf(stream, "[ERROR] %s", msg);\r
+}\r
+/**\r
+sample warning callback expecting a FILE* client object\r
+*/\r
+void warning_callback(const char *msg, void *client_data) {\r
+  FILE *stream = (FILE*)client_data;\r
+  fprintf(stream, "[WARNING] %s", msg);\r
+}\r
+/**\r
+sample debug callback expecting no client object\r
+*/\r
+void info_callback(const char *msg, void *client_data) {\r
+  (void)client_data;\r
+  fprintf(stdout, "[INFO] %s", msg);\r
+}\r
+\r
+/* -------------------------------------------------------------------------- */\r
+\r
+int main(int argc, char **argv) {\r
+  opj_dparameters_t parameters;  /* decompression parameters */\r
+  opj_event_mgr_t event_mgr;    /* event manager */\r
+  opj_image_t *image = NULL;\r
+  FILE *fsrc = NULL;\r
+  unsigned char *src = NULL; \r
+  int file_length;\r
+\r
+  opj_dinfo_t* dinfo = NULL;  /* handle to a decompressor */\r
+  opj_cio_t *cio = NULL;\r
+\r
+  /* configure the event callbacks (not required) */\r
+  memset(&event_mgr, 0, sizeof(opj_event_mgr_t));\r
+  event_mgr.error_handler = error_callback;\r
+  event_mgr.warning_handler = warning_callback;\r
+  event_mgr.info_handler = info_callback;\r
+\r
+  /* set decoding parameters to default values */\r
+  opj_set_default_decoder_parameters(&parameters);\r
+\r
+  /* parse input and get user decoding parameters */\r
+  if(parse_cmdline_decoder(argc, argv, &parameters) == 1) {\r
+    return 0;\r
+  }\r
+  \r
+  /* read the input file and put it in memory */\r
+  /* ---------------------------------------- */\r
+  fsrc = fopen(parameters.infile, "rb");\r
+  if (!fsrc) {\r
+    fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile);\r
+    return 1;\r
+  }  \r
+  fseek(fsrc, 0, SEEK_END);\r
+  file_length = ftell(fsrc);\r
+  fseek(fsrc, 0, SEEK_SET);\r
+  src = (unsigned char *) malloc(file_length);\r
+  fread(src, 1, file_length, fsrc);\r
+  fclose(fsrc);\r
+  \r
+  /* decode the code-stream */\r
+  /* ---------------------- */\r
+\r
+    switch(parameters.decod_format) {\r
+    case J2K_CFMT:\r
+    {\r
+      /* JPEG-2000 codestream */\r
+\r
+      /* get a decoder handle */\r
+      dinfo = opj_create_decompress(CODEC_J2K);\r
+      \r
+      /* catch events using our callbacks and give a local context */\r
+      opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);      \r
+\r
+      /* setup the decoder decoding parameters using user parameters */\r
+      opj_setup_decoder(dinfo, &parameters);\r
+\r
+      /* open a byte stream */\r
+      cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);\r
+\r
+      /* decode the stream and fill the image structure */\r
+      image = opj_decode(dinfo, cio);\r
+      if(!image) {\r
+        fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");\r
+        opj_destroy_decompress(dinfo);\r
+        opj_cio_close(cio);\r
+        return 1;\r
+      }\r
+      \r
+      /* close the byte stream */\r
+      opj_cio_close(cio);\r
+    }\r
+    break;\r
+\r
+    case JP2_CFMT:\r
+    {\r
+      /* JPEG 2000 compressed image data */\r
+\r
+      /* get a decoder handle */\r
+      dinfo = opj_create_decompress(CODEC_JP2);\r
+      \r
+      /* catch events using our callbacks and give a local context */\r
+      opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);      \r
+\r
+      /* setup the decoder decoding parameters using the current image and using user parameters */\r
+      opj_setup_decoder(dinfo, &parameters);\r
+\r
+      /* open a byte stream */\r
+      cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);\r
+\r
+      /* decode the stream and fill the image structure */\r
+      image = opj_decode(dinfo, cio);\r
+      if(!image) {\r
+        fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");\r
+        opj_destroy_decompress(dinfo);\r
+        opj_cio_close(cio);\r
+        return 1;\r
+      }\r
+\r
+      /* close the byte stream */\r
+      opj_cio_close(cio);\r
+\r
+    }\r
+    break;\r
+\r
+    case JPT_CFMT:\r
+    {\r
+      /* JPEG 2000, JPIP */\r
+\r
+      /* get a decoder handle */\r
+      dinfo = opj_create_decompress(CODEC_JPT);\r
+      \r
+      /* catch events using our callbacks and give a local context */\r
+      opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);      \r
+\r
+      /* setup the decoder decoding parameters using user parameters */\r
+      opj_setup_decoder(dinfo, &parameters);\r
+\r
+      /* open a byte stream */\r
+      cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);\r
+\r
+      /* decode the stream and fill the image structure */\r
+      image = opj_decode(dinfo, cio);\r
+      if(!image) {\r
+        fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");        \r
+        opj_destroy_decompress(dinfo);\r
+        opj_cio_close(cio);\r
+        return 1;\r
+      }  \r
+\r
+      /* close the byte stream */\r
+      opj_cio_close(cio);\r
+    }\r
+    break;\r
+\r
+    default:\r
+      fprintf(stderr, "ERROR -> j2k_to_image : Unknown input image format\n");\r
+      return 1;\r
+      break;\r
+  }\r
+  \r
+  /* free the memory containing the code-stream */\r
+  free(src);\r
+  src = NULL;\r
+\r
+  /* create output image */\r
+  /* ------------------- */\r
+\r
+  switch (parameters.cod_format) {\r
+    case PXM_DFMT:      /* PNM PGM PPM */\r
+      imagetopnm(image, parameters.outfile);\r
+      break;\r
+            \r
+    case PGX_DFMT:      /* PGX */\r
+      imagetopgx(image, parameters.outfile);\r
+      break;\r
+    \r
+    case BMP_DFMT:      /* BMP */\r
+      imagetobmp(image, parameters.outfile);\r
+      break;\r
+  }\r
+\r
+  /* free remaining structures */\r
+  if(dinfo) {\r
+    opj_destroy_decompress(dinfo);\r
+  }\r
+\r
+  /* free image data structure */\r
+  opj_image_destroy(image);\r
+   \r
+  return 0;\r
+}\r
+\r
index 22d64a6daa07360e4b2dcd671e21d81a4d5769a2..a93cc9166eb10ce8dfb1f49671c62f5cbdd7bcf7 100644 (file)
@@ -4,110 +4,33 @@ SET(openjpeg_SRCS
   bio.c
   cio.c
   dwt.c
+  event.c
   fix.c
+  image.c
   int.c
   j2k.c
+  j2k_lib.c
+  jp2.c
+  jpt.c
   mct.c
   mqc.c
-
+  openjpeg.c
   pi.c
   raw.c
   t1.c
   t2.c
   tcd.c
   tgt.c
-  jpt.c
-  jp2.c
 )
 
 IF (WIN32)
   IF (BUILD_SHARED_LIBS)
-    ADD_DEFINITIONS(-DOPENJPEGDLL)
-    #SET(JPEGDLL 1)
+    ADD_DEFINITIONS(-DOPJ_SHARED)
   ELSE (BUILD_SHARED_LIBS)
-    ADD_DEFINITIONS(-DOPENJPEGSTATIC)
-    #SET(JPEGSTATIC 1)
+    ADD_DEFINITIONS(-DOPJ_STATIC)
   ENDIF (BUILD_SHARED_LIBS)
 ENDIF (WIN32)
 
+ADD_LIBRARY(openjpeg ${openjpeg_SRCS})
 
-ADD_LIBRARY(gdcmopenjpeg ${openjpeg_SRCS})
 
-## $Id: CMakeLists.txt,v 1.4 2005/10/24 20:53:32 malaterre Exp $
-##
-## 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)/*
index 84c6675b11f2f348eb7617b0cf221cae2da45147..5bcfda372cc3b007462228437940b8f22a3a3340 100644 (file)
-/*
- * 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;
-}
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+/** @defgroup BIO BIO - Individual bit input-output stream */\r
+/*@{*/\r
+\r
+/** @name Local static functions */\r
+/*@{*/\r
+\r
+/**\r
+Write a bit\r
+@param bio BIO handle\r
+@param b Bit to write (0 or 1)\r
+*/\r
+static void bio_putbit(opj_bio_t *bio, int b);\r
+/**\r
+Read a bit\r
+@param bio BIO handle\r
+@return Returns the read bit\r
+*/\r
+static int bio_getbit(opj_bio_t *bio);\r
+/**\r
+Write a byte\r
+@param bio BIO handle\r
+@return Returns 0 if successful, returns 1 otherwise\r
+*/\r
+static int bio_byteout(opj_bio_t *bio);\r
+/**\r
+Read a byte\r
+@param bio BIO handle\r
+@return Returns 0 if successful, returns 1 otherwise\r
+*/\r
+static int bio_bytein(opj_bio_t *bio);\r
+\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+/* \r
+==========================================================\r
+   local functions\r
+==========================================================\r
+*/\r
+\r
+static int bio_byteout(opj_bio_t *bio) {\r
+  bio->buf = (bio->buf << 8) & 0xffff;\r
+  bio->ct = bio->buf == 0xff00 ? 7 : 8;\r
+  if (bio->bp >= bio->end) {\r
+    return 1;\r
+  }\r
+  *bio->bp++ = bio->buf >> 8;\r
+  return 0;\r
+}\r
+\r
+static int bio_bytein(opj_bio_t *bio) {\r
+  bio->buf = (bio->buf << 8) & 0xffff;\r
+  bio->ct = bio->buf == 0xff00 ? 7 : 8;\r
+  if (bio->bp >= bio->end) {\r
+    return 1;\r
+  }\r
+  bio->buf |= *bio->bp++;\r
+  return 0;\r
+}\r
+\r
+static void bio_putbit(opj_bio_t *bio, int b) {\r
+  if (bio->ct == 0) {\r
+    bio_byteout(bio);\r
+  }\r
+  bio->ct--;\r
+  bio->buf |= b << bio->ct;\r
+}\r
+\r
+static int bio_getbit(opj_bio_t *bio) {\r
+  if (bio->ct == 0) {\r
+    bio_bytein(bio);\r
+  }\r
+  bio->ct--;\r
+  return (bio->buf >> bio->ct) & 1;\r
+}\r
+\r
+/* \r
+==========================================================\r
+   Bit Input/Output interface\r
+==========================================================\r
+*/\r
+\r
+opj_bio_t* bio_create() {\r
+  opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));\r
+  return bio;\r
+}\r
+\r
+void bio_destroy(opj_bio_t *bio) {\r
+  if(bio) {\r
+    opj_free(bio);\r
+  }\r
+}\r
+\r
+int bio_numbytes(opj_bio_t *bio) {\r
+  return (bio->bp - bio->start);\r
+}\r
+\r
+void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) {\r
+  bio->start = bp;\r
+  bio->end = bp + len;\r
+  bio->bp = bp;\r
+  bio->buf = 0;\r
+  bio->ct = 8;\r
+}\r
+\r
+void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) {\r
+  bio->start = bp;\r
+  bio->end = bp + len;\r
+  bio->bp = bp;\r
+  bio->buf = 0;\r
+  bio->ct = 0;\r
+}\r
+\r
+void bio_write(opj_bio_t *bio, int v, int n) {\r
+  int i;\r
+  for (i = n - 1; i >= 0; i--) {\r
+    bio_putbit(bio, (v >> i) & 1);\r
+  }\r
+}\r
+\r
+int bio_read(opj_bio_t *bio, int n) {\r
+  int i, v;\r
+  v = 0;\r
+  for (i = n - 1; i >= 0; i--) {\r
+    v += bio_getbit(bio) << i;\r
+  }\r
+  return v;\r
+}\r
+\r
+int bio_flush(opj_bio_t *bio) {\r
+  bio->ct = 0;\r
+  if (bio_byteout(bio)) {\r
+    return 1;\r
+  }\r
+  if (bio->ct == 7) {\r
+    bio->ct = 0;\r
+    if (bio_byteout(bio)) {\r
+      return 1;\r
+    }\r
+  }\r
+  return 0;\r
+}\r
+\r
+int bio_inalign(opj_bio_t *bio) {\r
+  bio->ct = 0;\r
+  if ((bio->buf & 0xff) == 0xff) {\r
+    if (bio_bytein(bio)) {\r
+      return 1;\r
+    }\r
+    bio->ct = 0;\r
+  }\r
+  return 0;\r
+}\r
index 476dc7d47694ea5742f305d0707616477e3877a3..ecffff28d2c9ecf24858a8d1f28b47b7e1ec87b8 100644 (file)
-/*
- * 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
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#ifndef __BIO_H\r
+#define __BIO_H\r
+/** \r
+@file bio.h\r
+@brief Implementation of an individual bit input-output (BIO)\r
+\r
+The functions in BIO.C have for goal to realize an individual bit input - output.\r
+*/\r
+\r
+/** @defgroup BIO BIO - Individual bit input-output stream */\r
+/*@{*/\r
+\r
+/**\r
+Individual bit input-output stream (BIO)\r
+*/\r
+typedef struct opj_bio {\r
+  /** pointer to the start of the buffer */\r
+  unsigned char *start;\r
+  /** pointer to the end of the buffer */\r
+  unsigned char *end;\r
+  /** pointer to the present position in the buffer */\r
+  unsigned char *bp;\r
+  /** temporary place where each byte is read or written */\r
+  unsigned int buf;\r
+  /** coder : number of bits free to write. decoder : number of bits read */\r
+  int ct;\r
+} opj_bio_t;\r
+\r
+/** @name Exported functions */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+/**\r
+Create a new BIO handle \r
+@return Returns a new BIO handle if successful, returns NULL otherwise\r
+*/\r
+opj_bio_t* bio_create();\r
+/**\r
+Destroy a previously created BIO handle\r
+@param bio BIO handle to destroy\r
+*/\r
+void bio_destroy(opj_bio_t *bio);\r
+/**\r
+Number of bytes written.\r
+@param bio BIO handle\r
+@return Returns the number of bytes written\r
+*/\r
+int bio_numbytes(opj_bio_t *bio);\r
+/**\r
+Init encoder\r
+@param bio BIO handle\r
+@param bp Output buffer\r
+@param len Output buffer length \r
+*/\r
+void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len);\r
+/**\r
+Init decoder\r
+@param bio BIO handle\r
+@param bp Input buffer\r
+@param len Input buffer length \r
+*/\r
+void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len);\r
+/**\r
+Write bits\r
+@param bio BIO handle\r
+@param v Value of bits\r
+@param n Number of bits to write\r
+*/\r
+void bio_write(opj_bio_t *bio, int v, int n);\r
+/**\r
+Read bits\r
+@param bio BIO handle\r
+@param n Number of bits to read \r
+@return Returns the corresponding read number\r
+*/\r
+int bio_read(opj_bio_t *bio, int n);\r
+/**\r
+Flush bits\r
+@param bio BIO handle\r
+@return Returns 1 if successful, returns 0 otherwise\r
+*/\r
+int bio_flush(opj_bio_t *bio);\r
+/**\r
+Passes the ending bits (coming from flushing)\r
+@param bio BIO handle\r
+@return Returns 1 if successful, returns 0 otherwise\r
+*/\r
+int bio_inalign(opj_bio_t *bio);\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __BIO_H */\r
+\r
index 6e49221ee59325c5182fbceb21fee125962a2747..4264fccee9603f7b05e20085e7fa78024bee8856 100644 (file)
@@ -1,5 +1,9 @@
 /*
- * Copyright (c) 2001-2002, David Janssens
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "cio.h"
-#include <setjmp.h>
-#include <memory.h>
+#include "opj_includes.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;
+opj_cio_t* opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length) {
+  opj_cp_t *cp = NULL;
+  opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t));
+  if(!cio) return NULL;
+  cio->cinfo = cinfo;
+  if(buffer && length) {
+    /* wrap a user buffer containing the encoded image */
+    cio->openmode = OPJ_STREAM_READ;
+    cio->buffer = buffer;
+    cio->length = length;
+  }
+  else if(!buffer && !length && cinfo) {
+    /* allocate a buffer for the encoded image */
+    cio->openmode = OPJ_STREAM_WRITE;
+    switch(cinfo->codec_format) {
+      case CODEC_J2K:
+        cp = ((opj_j2k_t*)cinfo->j2k_handle)->cp;
+        break;
+      case CODEC_JP2:
+        cp = ((opj_jp2_t*)cinfo->jp2_handle)->j2k->cp;
+        break;
+      default:
+        opj_free(cio);
+        return NULL;
+    }
+    cio->length = cp->tdx * cp->tdy * cp->tw * cp->th * 4;
+    cio->buffer = (unsigned char *)opj_malloc(cio->length);
+    if(!cio->buffer) {
+      opj_free(cio);
+      return NULL;
+    }
+  }
+  else {
+    opj_free(cio);
+    return NULL;
+  }
 
-/* 
- * Number of bytes written.
- */
-int cio_numbytes()
-{
-  return cio_bp - cio_start;
+  /* Initialize byte IO */
+  cio->start = cio->buffer;
+  cio->end = cio->buffer + cio->length;
+  cio->bp = cio->buffer;
+
+  return cio;
+}
+
+void opj_cio_close(opj_cio_t *cio) {
+  if(cio) {
+    if(cio->openmode == OPJ_STREAM_WRITE) {
+      /* destroy the allocated buffer */
+      opj_free(cio->buffer);
+    }
+    /* destroy the cio */
+    opj_free(cio);
+  }
 }
 
+
+/* ----------------------------------------------------------------------- */
+
 /*
  * Get position in byte stream.
  */
-int cio_tell()
-{
-  return cio_bp - cio_start;
+int cio_tell(opj_cio_t *cio) {
+  return cio->bp - cio->start;
 }
 
 /*
@@ -55,59 +103,45 @@ int cio_tell()
  *
  * pos : position, in number of bytes, from the beginning of the stream
  */
-void cio_seek(int pos)
-{
-  cio_bp = cio_start + pos;
+void cio_seek(opj_cio_t *cio, 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;
+int cio_numbytesleft(opj_cio_t *cio) {
+  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;
+unsigned char *cio_getbp(opj_cio_t *cio) {
+  return cio->bp;
 }
 
 /*
  * Write a byte.
  */
-void cio_byteout(unsigned char v)
-{
-  if (cio_bp >= cio_end)
-    longjmp(j2k_error, 1);
-  *cio_bp++ = v;
-
+bool cio_byteout(opj_cio_t *cio, unsigned char v) {
+  if (cio->bp >= cio->end) {
+    opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n");
+    return false;
+  }
+  *cio->bp++ = v;
+  return true;
 }
 
 /*
  * Read a byte.
  */
-unsigned char cio_bytein()
-{
-  if (cio_bp >= cio_end)
-    longjmp(j2k_error, 1);
-  return *cio_bp++;
+unsigned char cio_bytein(opj_cio_t *cio) {
+  if (cio->bp >= cio->end) {
+    opj_event_msg(cio->cinfo, EVT_ERROR, "read error\n");
+    return 0;
+  }
+  return *cio->bp++;
 }
 
 /*
@@ -116,12 +150,13 @@ unsigned char cio_bytein()
  * v : value to write
  * n : number of bytes to write
  */
-void cio_write(unsigned int v, int n)
-{
+unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n) {
   int i;
   for (i = n - 1; i >= 0; i--) {
-    cio_byteout((unsigned char) ((v >> (i << 3)) & 0xff));
+    if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) )
+      return 0;
   }
+  return n;
 }
 
 /*
@@ -131,13 +166,12 @@ void cio_write(unsigned int v, int n)
  *
  * return : value of the n bytes read
  */
-unsigned int cio_read(int n)
-{
+unsigned int cio_read(opj_cio_t *cio, int n) {
   int i;
   unsigned int v;
   v = 0;
   for (i = n - 1; i >= 0; i--) {
-    v += cio_bytein() << (i << 3);
+    v += cio_bytein(cio) << (i << 3);
   }
   return v;
 }
@@ -147,34 +181,9 @@ unsigned int cio_read(int n)
  *
  * n : number of bytes to skip
  */
-void cio_skip(int n)
-{
-  cio_bp += n;
+void cio_skip(opj_cio_t *cio, int n) {
+  cio->bp += n;
 }
 
-/* 
- * Read n bytes, copy to buffer
- *
- * n : number of bytes to transfer
- */
-void cio_read_to_buf(unsigned char* src_buf, int n)/* Glenn adds */
-{
-  if (cio_bp + n > cio_end)
-    longjmp(j2k_error, 1);
-  memcpy(cio_bp, src_buf, n);
-  cio_bp += n;
-}
 
-/* 
- * Write n bytes, copy from buffer
- *
- * n : number of bytes to transfer
- */
-void cio_write_from_buf(unsigned char* dest_buf, int n)/* Glenn adds */
-{
-  if (cio_bp + n > cio_end)
-    longjmp(j2k_error, 1);
-  memcpy(dest_buf, cio_bp, n);
-  cio_bp += n;
-}
 
index 8bf1deeec8c054ee910bb5784e4abed78b033d8f..0b05b3d12fb65dc01eedf3ad77a8b3a6e4c5f7b9 100644 (file)
-/*
- * 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);
-
-/*
- * Read n bytes, copy to buffer
- */
-void cio_read_to_buf(unsigned char* src_buf, int n);/* Glenn Pearson adds */
-
-/*
- * Write n bytes, copy from buffer
- */
-void cio_write_from_buf(unsigned char* dest_buf, int n);/* Glenn Pearson adds */
-
-#endif
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#ifndef __CIO_H\r
+#define __CIO_H\r
+/**\r
+@file cio.h\r
+@brief Implementation of a byte input-output process (CIO)\r
+\r
+The functions in CIO.C have for goal to realize a byte input / output process.\r
+*/\r
+\r
+/** @defgroup CIO CIO - byte input-output stream */\r
+/*@{*/\r
+\r
+/** @name Exported functions (see also openjpeg.h) */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+/**\r
+Number of bytes left before the end of the stream\r
+@param cio CIO handle\r
+@return Returns the number of bytes before the end of the stream\r
+*/\r
+int cio_numbytesleft(opj_cio_t *cio);\r
+/**\r
+Get pointer to the current position in the stream\r
+@param cio CIO handle\r
+@return Returns a pointer to the current position\r
+*/\r
+unsigned char *cio_getbp(opj_cio_t *cio);\r
+/**\r
+Write some bytes\r
+@param cio CIO handle\r
+@param v Value to write\r
+@param n Number of bytes to write\r
+@return Returns the number of bytes written or 0 if an error occured\r
+*/\r
+unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n);\r
+/**\r
+Read some bytes\r
+@param cio CIO handle\r
+@param n Number of bytes to read\r
+@return Returns the value of the n bytes read\r
+*/\r
+unsigned int cio_read(opj_cio_t *cio, int n);\r
+/**\r
+Skip some bytes\r
+@param cio CIO handle\r
+@param n Number of bytes to skip\r
+*/\r
+void cio_skip(opj_cio_t *cio, int n);\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __CIO_H */\r
+\r
index d4f1a77e925ecfd16e89ffd28a128ca887f8fb8d..d9a1dd635811a0e3fa3c9b4ea87e8be0bca3e070 100644 (file)
-/*
- * 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
- * Copyright (c) 2005, Reiner Wahler
- * 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.
- */
-
-/*
- *  NOTE:
- *  This is a modified version of the openjpeg dwt.c file.
- *  Average speed improvement compared to the original file (measured on
- *  my own machine, a P4 running at 3.0 GHz):
- *  5x3 wavelets about 2 times faster
- *  9x7 wavelets about 3 times faster
- *  for both, encoding and decoding.
- *
- *  The better performance is caused by doing the 1-dimensional DWT
- *  within a temporary buffer where the data can be accessed sequential
- *  for both directions, horizontal and vertical. The 2d vertical DWT was
- *  the major bottleneck in the former version.
- *
- *  I have also removed the "Add Patrick" part because it is not longer
- *  needed.  
- *
- *  6/6/2005
- *  -Ive (aka Reiner Wahler)
- *  mail: ive@lilysoft.com
- */
-
-
-#include "dwt.h"
-#include "int.h"
-#include "fix.h"
-#include "tcd.h"
-#include <stdlib.h>
-
-#define S(i) a[(i)*2]
-#define D(i) a[(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}
-};
-
-
-/* <summary>                          */
-/* Forward lazy transform (horizontal).  */
-/* </summary>                            */ 
-void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) {
-    int i;
-    for (i=0; i<sn; i++) b[i]=a[2*i+cas];
-    for (i=0; i<dn; i++) b[sn+i]=a[(2*i+1-cas)];
-}
-
-/* <summary>                             */  
-/* Forward lazy transform (vertical).    */
-/* </summary>                            */ 
-void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas) {
-    int i;
-    for (i=0; i<sn; i++) b[i*x]=a[2*i+cas];
-    for (i=0; i<dn; i++) b[(sn+i)*x]=a[(2*i+1-cas)];
-}
-
-/* <summary>                             */
-/* Inverse lazy transform (horizontal).  */
-/* </summary>                            */
-void dwt_interleave_h(int *a, int *b, int dn, int sn, int cas) {
-    int i;
-/*    for (i=0; i<sn; i++) b[2*i+cas]=a[i];*/
-/*    for (i=0; i<dn; i++) b[2*i+1-cas]=a[(sn+i)];*/
-    int* ai;
-    int* bi;
-    ai=a;
-    bi=b+cas;
-    for (i=0; i<sn; i++) {
-      *bi = *ai;  bi+=2;  ai++;
-    }
-    ai=a+sn;
-    bi=b+1-cas;
-    for (i=0; i<dn; i++) {
-      *bi = *ai;  bi+=2;  ai++;
-    }
-}
-
-/* <summary>                             */  
-/* Inverse lazy transform (vertical).    */
-/* </summary>                            */ 
-void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas) {
-    int i;
-/*    for (i=0; i<sn; i++) b[2*i+cas]=a[i*x];*/
-/*    for (i=0; i<dn; i++) b[2*i+1-cas]=a[(sn+i)*x];*/
-    int* ai;
-    int* bi;
-    ai=a;
-    bi=b+cas;
-    for (i=0; i<sn; i++) {
-      *bi = *ai;  bi+=2;  ai+=x;
-    }
-    ai=a+(sn*x);
-    bi=b+1-cas;
-    for (i=0; i<dn; i++) {
-      *bi = *ai;  bi+=2;  ai+=x;
-    }
-}
-
-
-/* <summary>                            */
-/* Forward 5-3 wavelet tranform in 1-D. */
-/* </summary>                           */
-void dwt_encode_1(int *a, int dn, int sn, int cas)
-{
-  int i;
-
-  if (!cas) {
-    if ((dn > 0) || (sn > 1)) {   /* NEW :  CASE ONE ELEMENT */
-      for (i = 0; i < dn; i++) D(i) -= (S_(i) + S_(i + 1)) >> 1;
-      for (i = 0; i < sn; i++) S(i) += (D_(i - 1) + D_(i) + 2) >> 2;
-    }
-  } else {
-    if (!sn && dn == 1)          /* NEW :  CASE ONE ELEMENT */
-      S(0) *= 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;
-    }
-
-  }
-}
-
-/* <summary>                            */
-/* Inverse 5-3 wavelet tranform in 1-D. */
-/* </summary>                           */ 
-void dwt_decode_1(int *a, int dn, int sn, int cas) 
-{
-  int i;
-
-  if (!cas) {
-     if ((dn > 0) || (sn > 1)) { /* NEW :  CASE ONE ELEMENT */
-      for (i = 0; i < sn; i++) S(i) -= (D_(i - 1) + D_(i) + 2) >> 2;
-      for (i = 0; i < dn; i++) D(i) += (S_(i) + S_(i + 1)) >> 1;
-    }
-  } else {
-    if (!sn  && dn == 1)          /* NEW :  CASE ONE ELEMENT */
-      S(0) /= 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;
-    }
-  }
-}
-
-
-/* <summary>                            */
-/* Forward 5-3 wavelet tranform in 2-D. */
-/* </summary>                           */
-void dwt_encode(tcd_tilecomp_t * tilec)
-{
-  int i, j, k;
-  int* a;
-  int* aj;
-  int* bj;
-  int w, l;
-
-  w = tilec->x1-tilec->x0;
-  l = tilec->numresolutions-1;
-  a = tilec->data;
-
-  for (i = 0; i < l; i++) {
-    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                                      */
-    int cas_col;   /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
-    int cas_row;   /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */
-    int dn, sn;
-
-    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;
-
-
-    sn = rh1;
-    dn = rh - rh1;
-    bj=(int*)malloc(rh*sizeof(int));
-    for (j=0; j<rw; j++) {
-      aj=a+j;
-      for (k=0; k<rh; k++)  bj[k]=aj[k*w];
-      dwt_encode_1(bj, dn, sn, cas_col);
-      dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
-    }
-    free(bj);
-
-    sn = rw1;
-    dn = rw - rw1;
-    bj=(int*)malloc(rw*sizeof(int));
-    for (j=0; j<rh; j++) {
-      aj=a+j*w;
-      for (k=0; k<rw; k++)  bj[k]=aj[k];
-      dwt_encode_1(bj, dn, sn, cas_row);
-      dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
-    }
-    free(bj);
-  }
-}
-
-
-/* <summary>                            */
-/* Inverse 5-3 wavelet tranform in 2-D. */
-/* </summary>                           */
-void dwt_decode(tcd_tilecomp_t * tilec, int stop)
-{
-  int i, j, k;
-  int* a;
-  int* aj;
-  int* bj;
-  int w, l;
-
-  w = tilec->x1-tilec->x0;
-  l = tilec->numresolutions-1;
-  a = tilec->data;
-
-  for (i = l - 1; i >= stop; i--) {
-    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                                      */
-    int cas_col;   /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
-    int cas_row;   /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */
-    int dn, sn;
-
-    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;
-
-    sn = rw1;
-    dn = rw - rw1;
-    bj=(int*)malloc(rw*sizeof(int));
-    for (j = 0; j < rh; j++) {
-      aj = a+j*w;
-      dwt_interleave_h(aj, bj, dn, sn, cas_row);
-      dwt_decode_1(bj, dn, sn, cas_row);
-      for (k = 0; k < rw; k++)  aj[k] = bj[k];
-    }
-    free(bj);
-
-    sn = rh1;
-    dn = rh - rh1;
-    bj=(int*)malloc(rh*sizeof(int));
-    for (j = 0; j < rw; j++) {
-      aj = a+j;
-      dwt_interleave_v(aj, bj, dn, sn, w, cas_col);
-      dwt_decode_1(bj, dn, sn, cas_col);
-      for (k = 0; k < rh; k++)  aj[k * w] = bj[k];
-    }
-    free(bj);
-
-  }
-}
-
-
-/* <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 dn, int sn, int cas)
-{
-  int i;
-  if (!cas) {
-    if ((dn > 0) || (sn > 1)) {   /* NEW :  CASE ONE ELEMENT */
-      for (i = 0; i < dn; i++)
-       D(i) -= fix_mul(S_(i) + S_(i + 1), 12993);
-      for (i = 0; i < sn; i++)
-       S(i) -= fix_mul(D_(i - 1) + D_(i), 434);
-      for (i = 0; i < dn; i++)
-       D(i) += fix_mul(S_(i) + S_(i + 1), 7233);
-      for (i = 0; i < sn; i++)
-       S(i) += fix_mul(D_(i - 1) + D_(i), 3633);
-      for (i = 0; i < dn; i++)
-       D(i) = fix_mul(D(i), 5038);   /*5038 */
-      for (i = 0; i < sn; i++)
-       S(i) = fix_mul(S(i), 6659);   /*6660 */
-    }
-  } else {
-    if ((sn > 0) || (dn > 1)) {   /* NEW :  CASE ONE ELEMENT */
-      for (i = 0; i < dn; i++)
-       S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993);
-      for (i = 0; i < sn; i++)
-       D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434);
-      for (i = 0; i < dn; i++)
-       S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233);
-      for (i = 0; i < sn; i++)
-       D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633);
-      for (i = 0; i < dn; i++)
-       S(i) = fix_mul(S(i), 5038);   /*5038 */
-      for (i = 0; i < sn; i++)
-       D(i) = fix_mul(D(i), 6659);   /*6660 */
-    }
-  }
-}
-
-/* <summary>                             */
-/* Inverse 9-7 wavelet transform in 1-D. */
-/* </summary>                            */
-void dwt_decode_1_real(int *a, int dn, int sn, int cas)
-{
-  int i;
-  if (!cas) {
-    if ((dn > 0) || (sn > 1)) {   /* NEW :  CASE ONE ELEMENT */
-      for (i = 0; i < sn; i++)
-       S(i) = fix_mul(S(i), 10078);   /* 10076 */
-      for (i = 0; i < dn; i++)
-       D(i) = fix_mul(D(i), 13318);   /* 13320 */
-      for (i = 0; i < sn; i++)
-       S(i) -= fix_mul(D_(i - 1) + D_(i), 3633);
-      for (i = 0; i < dn; i++)
-       D(i) -= fix_mul(S_(i) + S_(i + 1), 7233);
-      for (i = 0; i < sn; i++)
-       S(i) += fix_mul(D_(i - 1) + D_(i), 434);
-      for (i = 0; i < dn; i++)
-       D(i) += fix_mul(S_(i) + S_(i + 1), 12994); /* 12993 */
-    }
-  } else {
-    if ((sn > 0) || (dn > 1)) {   /* NEW :  CASE ONE ELEMENT */
-      for (i = 0; i < sn; i++)
-       D(i) = fix_mul(D(i), 10078);   /* 10076 */
-      for (i = 0; i < dn; i++)
-       S(i) = fix_mul(S(i), 13318);   /* 13320 */
-      for (i = 0; i < sn; i++)
-       D(i) -= fix_mul(SS_(i) + SS_(i + 1), 3633);
-      for (i = 0; i < dn; i++)
-       S(i) -= fix_mul(DD_(i) + DD_(i - 1), 7233);
-      for (i = 0; i < sn; i++)
-       D(i) += fix_mul(SS_(i) + SS_(i + 1), 434);
-      for (i = 0; i < dn; i++)
-       S(i) += fix_mul(DD_(i) + DD_(i - 1), 12994); /* 12993 */
-    }
-  }
-}
-
-/* <summary>                             */
-/* Forward 9-7 wavelet transform in 2-D. */
-/* </summary>                            */
-
-void dwt_encode_real(tcd_tilecomp_t * tilec)
-{
-  int i, j, k;
-  int* a;
-  int* aj;
-  int* bj;
-  int w, l;
-
-  w = tilec->x1-tilec->x0;
-  l = tilec->numresolutions-1;
-  a = tilec->data;
-
-  for (i = 0; i < l; i++) {
-    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                                */
-    int cas_col;   /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
-    int cas_row;   /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */
-    int dn, sn;
-
-    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;
-
-    sn = rh1;
-    dn = rh - rh1;
-    bj=(int*)malloc(rh*sizeof(int));
-    for (j = 0; j < rw; j++) {
-      aj = a + j;
-      for (k = 0; k < rh; k++)  bj[k] = aj[k*w];
-      dwt_encode_1_real(bj, dn, sn, cas_col);
-      dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
-    }
-    free(bj);
-
-    sn = rw1;
-    dn = rw - rw1;
-    bj=(int*)malloc(rw*sizeof(int));
-    for (j = 0; j < rh; j++) {
-      aj = a + j * w;
-      for (k = 0; k < rw; k++)  bj[k] = aj[k];
-      dwt_encode_1_real(bj, dn, sn, cas_row);
-      dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
-    }
-    free(bj);
-  }
-}
-
-
-/* <summary>                             */
-/* Inverse 9-7 wavelet transform in 2-D. */
-/* </summary>                            */
-void dwt_decode_real(tcd_tilecomp_t * tilec, int stop)
-{
-
-  int i, j, k;
-  int* a;
-  int* aj;
-  int* bj;
-  int w, l;
-
-  w = tilec->x1-tilec->x0;
-  l = tilec->numresolutions-1;
-  a = tilec->data;
-
-  for (i = l-1; i >= stop; i--) {
-    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  */
-    int cas_col;   /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
-    int cas_row;   /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */
-    int dn, sn;
-
-    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_col = tilec->resolutions[l - i].x0 % 2; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
-    cas_row = tilec->resolutions[l - i].y0 % 2; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */
-
-    sn = rw1;
-    dn = rw-rw1;
-    bj = (int*)malloc(rw * sizeof(int));
-    for (j = 0; j < rh; j++) {
-      aj = a+j*w;
-      dwt_interleave_h(aj, bj, dn, sn, cas_col);
-      dwt_decode_1_real(bj, dn, sn, cas_col);
-      for (k = 0; k < rw; k++)  aj[k] = bj[k];
-    }
-    free(bj);
-
-    sn = rh1;
-    dn = rh-rh1;
-    bj = (int*)malloc(rh * sizeof(int));
-    for (j=0; j<rw; j++) {
-      aj = a+j;
-      dwt_interleave_v(aj, bj, dn, sn, w, cas_row);
-      dwt_decode_1_real(bj, dn, sn, cas_row);
-      for (k = 0; k < rh; k++)  aj[k * w] = bj[k];
-    }
-    free(bj);
-  }
-}
-
-
-/* <summary>                          */
-/* Get gain of 9-7 wavelet transform. */
-/* </summary>                         */
-int dwt_getgain_real(int orient)
-{
-  (void)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];
-}
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+/*\r
+ *  NOTE:\r
+ *  This is a modified version of the openjpeg dwt.c file.\r
+ *  Average speed improvement compared to the original file (measured on\r
+ *  my own machine, a P4 running at 3.0 GHz):\r
+ *  5x3 wavelets about 2 times faster\r
+ *  9x7 wavelets about 3 times faster\r
+ *  for both, encoding and decoding.\r
+ *\r
+ *  The better performance is caused by doing the 1-dimensional DWT\r
+ *  within a temporary buffer where the data can be accessed sequential\r
+ *  for both directions, horizontal and vertical. The 2d vertical DWT was\r
+ *  the major bottleneck in the former version.\r
+ *\r
+ *  I have also removed the "Add Patrick" part because it is not longer\r
+ *  needed.  \r
+ *\r
+ *  6/6/2005\r
+ *  -Ive (aka Reiner Wahler)\r
+ *  mail: ive@lilysoft.com\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */\r
+/*@{*/\r
+\r
+/** @name Local static functions */\r
+/*@{*/\r
+\r
+/**\r
+Forward lazy transform (horizontal)\r
+*/\r
+static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas);\r
+/**\r
+Forward lazy transform (vertical)\r
+*/\r
+static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas);\r
+/**\r
+Inverse lazy transform (horizontal)\r
+*/\r
+static void dwt_interleave_h(int *a, int *b, int dn, int sn, int cas);\r
+/**\r
+Inverse lazy transform (vertical)\r
+*/\r
+static void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas);\r
+/**\r
+Forward 5-3 wavelet tranform in 1-D\r
+*/\r
+static void dwt_encode_1(int *a, int dn, int sn, int cas);\r
+/**\r
+Inverse 5-3 wavelet tranform in 1-D\r
+*/\r
+static void dwt_decode_1(int *a, int dn, int sn, int cas);\r
+/**\r
+Forward 9-7 wavelet transform in 1-D\r
+*/\r
+static void dwt_encode_1_real(int *a, int dn, int sn, int cas);\r
+/**\r
+Inverse 9-7 wavelet transform in 1-D\r
+*/\r
+static void dwt_decode_1_real(int *a, int dn, int sn, int cas);\r
+/**\r
+FIXME : comment ???\r
+*/\r
+static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize);\r
+\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#define S(i) a[(i)*2]\r
+#define D(i) a[(1+(i)*2)]\r
+#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i)))\r
+#define D_(i) ((i)<0?D(0):((i)>=dn?D(dn-1):D(i)))\r
+/* new */\r
+#define SS_(i) ((i)<0?S(0):((i)>=dn?S(dn-1):S(i)))\r
+#define DD_(i) ((i)<0?D(0):((i)>=sn?D(sn-1):D(i)))\r
+\r
+/* <summary>                                                              */\r
+/* This table contains the norms of the 5-3 wavelets for different bands. */\r
+/* </summary>                                                             */\r
+static const double dwt_norms[4][10] = {\r
+  {1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},\r
+  {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},\r
+  {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},\r
+  {.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}\r
+};\r
+\r
+/* <summary>                                                              */\r
+/* This table contains the norms of the 9-7 wavelets for different bands. */\r
+/* </summary>                                                             */\r
+static const double dwt_norms_real[4][10] = {\r
+  {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},\r
+  {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},\r
+  {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},\r
+  {2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2}\r
+};\r
+\r
+/* \r
+==========================================================\r
+   local functions\r
+==========================================================\r
+*/\r
+\r
+/* <summary>                       */\r
+/* Forward lazy transform (horizontal).  */\r
+/* </summary>                            */ \r
+static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas) {\r
+  int i;\r
+    for (i=0; i<sn; i++) b[i]=a[2*i+cas];\r
+    for (i=0; i<dn; i++) b[sn+i]=a[(2*i+1-cas)];\r
+}\r
+\r
+/* <summary>                             */  \r
+/* Forward lazy transform (vertical).    */\r
+/* </summary>                            */ \r
+static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas) {\r
+    int i;\r
+    for (i=0; i<sn; i++) b[i*x]=a[2*i+cas];\r
+    for (i=0; i<dn; i++) b[(sn+i)*x]=a[(2*i+1-cas)];\r
+}\r
+\r
+/* <summary>                             */\r
+/* Inverse lazy transform (horizontal).  */\r
+/* </summary>                            */\r
+static void dwt_interleave_h(int *a, int *b, int dn, int sn, int cas) {\r
+    int i;\r
+    int *ai = NULL;\r
+    int *bi = NULL;\r
+    ai = a;\r
+    bi = b + cas;\r
+    for (i = 0; i < sn; i++) {\r
+      *bi = *ai;  \r
+    bi += 2;  \r
+    ai++;\r
+    }\r
+    ai = a + sn;\r
+    bi = b + 1 - cas;\r
+    for (i = 0; i < dn; i++) {\r
+      *bi = *ai;\r
+    bi += 2;\r
+    ai++;\r
+    }\r
+}\r
+\r
+/* <summary>                             */  \r
+/* Inverse lazy transform (vertical).    */\r
+/* </summary>                            */ \r
+static void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas) {\r
+    int i;\r
+    int *ai = NULL;\r
+    int *bi = NULL;\r
+    ai = a;\r
+    bi = b + cas;\r
+    for (i = 0; i < sn; i++) {\r
+      *bi = *ai;\r
+    bi += 2;\r
+    ai += x;\r
+    }\r
+    ai = a + (sn * x);\r
+    bi = b + 1 - cas;\r
+    for (i = 0; i < dn; i++) {\r
+      *bi = *ai;\r
+    bi += 2;  \r
+    ai += x;\r
+    }\r
+}\r
+\r
+\r
+/* <summary>                            */\r
+/* Forward 5-3 wavelet tranform in 1-D. */\r
+/* </summary>                           */\r
+static void dwt_encode_1(int *a, int dn, int sn, int cas) {\r
+  int i;\r
+  \r
+  if (!cas) {\r
+    if ((dn > 0) || (sn > 1)) {  /* NEW :  CASE ONE ELEMENT */\r
+      for (i = 0; i < dn; i++) D(i) -= (S_(i) + S_(i + 1)) >> 1;\r
+      for (i = 0; i < sn; i++) S(i) += (D_(i - 1) + D_(i) + 2) >> 2;\r
+    }\r
+  } else {\r
+    if (!sn && dn == 1)        /* NEW :  CASE ONE ELEMENT */\r
+      S(0) *= 2;\r
+    else {\r
+      for (i = 0; i < dn; i++) S(i) -= (DD_(i) + DD_(i - 1)) >> 1;\r
+      for (i = 0; i < sn; i++) D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2;\r
+    }\r
+  }\r
+}\r
+\r
+/* <summary>                            */\r
+/* Inverse 5-3 wavelet tranform in 1-D. */\r
+/* </summary>                           */ \r
+static void dwt_decode_1(int *a, int dn, int sn, int cas) {\r
+  int i;\r
+  \r
+  if (!cas) {\r
+    if ((dn > 0) || (sn > 1)) { /* NEW :  CASE ONE ELEMENT */\r
+      for (i = 0; i < sn; i++) S(i) -= (D_(i - 1) + D_(i) + 2) >> 2;\r
+      for (i = 0; i < dn; i++) D(i) += (S_(i) + S_(i + 1)) >> 1;\r
+    }\r
+  } else {\r
+    if (!sn  && dn == 1)          /* NEW :  CASE ONE ELEMENT */\r
+      S(0) /= 2;\r
+    else {\r
+      for (i = 0; i < sn; i++) D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2;\r
+      for (i = 0; i < dn; i++) S(i) += (DD_(i) + DD_(i - 1)) >> 1;\r
+    }\r
+  }\r
+}\r
+\r
+/* <summary>                             */\r
+/* Forward 9-7 wavelet transform in 1-D. */\r
+/* </summary>                            */\r
+static void dwt_encode_1_real(int *a, int dn, int sn, int cas) {\r
+  int i;\r
+  if (!cas) {\r
+    if ((dn > 0) || (sn > 1)) {  /* NEW :  CASE ONE ELEMENT */\r
+      for (i = 0; i < dn; i++)\r
+        D(i) -= fix_mul(S_(i) + S_(i + 1), 12993);\r
+      for (i = 0; i < sn; i++)\r
+        S(i) -= fix_mul(D_(i - 1) + D_(i), 434);\r
+      for (i = 0; i < dn; i++)\r
+        D(i) += fix_mul(S_(i) + S_(i + 1), 7233);\r
+      for (i = 0; i < sn; i++)\r
+        S(i) += fix_mul(D_(i - 1) + D_(i), 3633);\r
+      for (i = 0; i < dn; i++)\r
+        D(i) = fix_mul(D(i), 5038);  /*5038 */\r
+      for (i = 0; i < sn; i++)\r
+        S(i) = fix_mul(S(i), 6659);  /*6660 */\r
+    }\r
+  } else {\r
+    if ((sn > 0) || (dn > 1)) {  /* NEW :  CASE ONE ELEMENT */\r
+      for (i = 0; i < dn; i++)\r
+        S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993);\r
+      for (i = 0; i < sn; i++)\r
+        D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434);\r
+      for (i = 0; i < dn; i++)\r
+        S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233);\r
+      for (i = 0; i < sn; i++)\r
+        D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633);\r
+      for (i = 0; i < dn; i++)\r
+        S(i) = fix_mul(S(i), 5038);  /*5038 */\r
+      for (i = 0; i < sn; i++)\r
+        D(i) = fix_mul(D(i), 6659);  /*6660 */\r
+    }\r
+  }\r
+}\r
+\r
+/* <summary>                             */\r
+/* Inverse 9-7 wavelet transform in 1-D. */\r
+/* </summary>                            */\r
+static void dwt_decode_1_real(int *a, int dn, int sn, int cas) {\r
+  int i;\r
+  if (!cas) {\r
+    if ((dn > 0) || (sn > 1)) {  /* NEW :  CASE ONE ELEMENT */\r
+      for (i = 0; i < sn; i++)\r
+        S(i) = fix_mul(S(i), 10078);  /* 10076 */\r
+      for (i = 0; i < dn; i++)\r
+        D(i) = fix_mul(D(i), 13318);  /* 13320 */\r
+      for (i = 0; i < sn; i++)\r
+        S(i) -= fix_mul(D_(i - 1) + D_(i), 3633);\r
+      for (i = 0; i < dn; i++)\r
+        D(i) -= fix_mul(S_(i) + S_(i + 1), 7233);\r
+      for (i = 0; i < sn; i++)\r
+        S(i) += fix_mul(D_(i - 1) + D_(i), 434);\r
+      for (i = 0; i < dn; i++)\r
+        D(i) += fix_mul(S_(i) + S_(i + 1), 12994);  /* 12993 */\r
+    }\r
+  } else {\r
+    if ((sn > 0) || (dn > 1)) {  /* NEW :  CASE ONE ELEMENT */\r
+      for (i = 0; i < sn; i++)\r
+        D(i) = fix_mul(D(i), 10078);  /* 10076 */\r
+      for (i = 0; i < dn; i++)\r
+        S(i) = fix_mul(S(i), 13318);  /* 13320 */\r
+      for (i = 0; i < sn; i++)\r
+        D(i) -= fix_mul(SS_(i) + SS_(i + 1), 3633);\r
+      for (i = 0; i < dn; i++)\r
+        S(i) -= fix_mul(DD_(i) + DD_(i - 1), 7233);\r
+      for (i = 0; i < sn; i++)\r
+        D(i) += fix_mul(SS_(i) + SS_(i + 1), 434);\r
+      for (i = 0; i < dn; i++)\r
+        S(i) += fix_mul(DD_(i) + DD_(i - 1), 12994);  /* 12993 */\r
+    }\r
+  }\r
+}\r
+\r
+static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize) {\r
+  int p, n;\r
+  p = int_floorlog2(stepsize) - 13;\r
+  n = 11 - int_floorlog2(stepsize);\r
+  bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;\r
+  bandno_stepsize->expn = numbps - p;\r
+}\r
+\r
+/* \r
+==========================================================\r
+   DWT interface\r
+==========================================================\r
+*/\r
+\r
+/* <summary>                            */\r
+/* Forward 5-3 wavelet tranform in 2-D. */\r
+/* </summary>                           */\r
+void dwt_encode(opj_tcd_tilecomp_t * tilec) {\r
+  int i, j, k;\r
+  int *a = NULL;\r
+  int *aj = NULL;\r
+  int *bj = NULL;\r
+  int w, l;\r
+  \r
+  w = tilec->x1-tilec->x0;\r
+  l = tilec->numresolutions-1;\r
+  a = tilec->data;\r
+  \r
+  for (i = 0; i < l; i++) {\r
+    int rw;      /* width of the resolution level computed                                                           */\r
+    int rh;      /* heigth of the resolution level computed                                                          */\r
+    int rw1;    /* width of the resolution level once lower than computed one                                       */\r
+    int rh1;    /* height of the resolution level once lower than computed one                                      */\r
+    int cas_col;  /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */\r
+    int cas_row;  /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */\r
+    int dn, sn;\r
+    \r
+    rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;\r
+    rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;\r
+    rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;\r
+    rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;\r
+    \r
+    cas_row = tilec->resolutions[l - i].x0 % 2;\r
+    cas_col = tilec->resolutions[l - i].y0 % 2;\r
+        \r
+    sn = rh1;\r
+    dn = rh - rh1;\r
+    bj = (int*)opj_malloc(rh * sizeof(int));\r
+    for (j = 0; j < rw; j++) {\r
+      aj = a + j;\r
+      for (k = 0; k < rh; k++)  bj[k] = aj[k*w];\r
+      dwt_encode_1(bj, dn, sn, cas_col);\r
+      dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);\r
+    }\r
+    opj_free(bj);\r
+    \r
+    sn = rw1;\r
+    dn = rw - rw1;\r
+    bj = (int*)opj_malloc(rw * sizeof(int));\r
+    for (j = 0; j < rh; j++) {\r
+      aj = a + j * w;\r
+      for (k = 0; k < rw; k++)  bj[k] = aj[k];\r
+      dwt_encode_1(bj, dn, sn, cas_row);\r
+      dwt_deinterleave_h(bj, aj, dn, sn, cas_row);\r
+    }\r
+    opj_free(bj);\r
+  }\r
+}\r
+\r
+\r
+/* <summary>                            */\r
+/* Inverse 5-3 wavelet tranform in 2-D. */\r
+/* </summary>                           */\r
+void dwt_decode(opj_tcd_tilecomp_t * tilec, int stop) {\r
+  int i, j, k;\r
+  int *a = NULL;\r
+  int *aj = NULL;\r
+  int *bj = NULL;\r
+  int w, l;\r
+  \r
+  w = tilec->x1-tilec->x0;\r
+  l = tilec->numresolutions-1;\r
+  a = tilec->data;\r
+  \r
+  for (i = l - 1; i >= stop; i--) {\r
+    int rw;      /* width of the resolution level computed                                                           */\r
+    int rh;      /* heigth of the resolution level computed                                                          */\r
+    int rw1;    /* width of the resolution level once lower than computed one                                       */\r
+    int rh1;    /* height of the resolution level once lower than computed one                                      */\r
+    int cas_col;  /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */\r
+    int cas_row;  /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */\r
+    int dn, sn;\r
+    \r
+    rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;\r
+    rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;\r
+    rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;\r
+    rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;\r
+    \r
+    cas_row = tilec->resolutions[l - i].x0 % 2;\r
+    cas_col = tilec->resolutions[l - i].y0 % 2;\r
+    \r
+    sn = rw1;\r
+    dn = rw - rw1;\r
+    bj = (int*)opj_malloc(rw * sizeof(int));\r
+    for (j = 0; j < rh; j++) {\r
+      aj = a + j*w;\r
+      dwt_interleave_h(aj, bj, dn, sn, cas_row);\r
+      dwt_decode_1(bj, dn, sn, cas_row);\r
+      for (k = 0; k < rw; k++)  aj[k] = bj[k];\r
+    }\r
+    opj_free(bj);\r
+    \r
+    sn = rh1;\r
+    dn = rh - rh1;\r
+    bj = (int*)opj_malloc(rh * sizeof(int));\r
+    for (j = 0; j < rw; j++) {\r
+      aj = a + j;\r
+      dwt_interleave_v(aj, bj, dn, sn, w, cas_col);\r
+      dwt_decode_1(bj, dn, sn, cas_col);\r
+      for (k = 0; k < rh; k++)  aj[k * w] = bj[k];\r
+    }\r
+    opj_free(bj);\r
+  }\r
+}\r
+\r
+\r
+/* <summary>                          */\r
+/* Get gain of 5-3 wavelet transform. */\r
+/* </summary>                         */\r
+int dwt_getgain(int orient) {\r
+  if (orient == 0)\r
+    return 0;\r
+  if (orient == 1 || orient == 2)\r
+    return 1;\r
+  return 2;\r
+}\r
+\r
+/* <summary>                */\r
+/* Get norm of 5-3 wavelet. */\r
+/* </summary>               */\r
+double dwt_getnorm(int level, int orient) {\r
+  return dwt_norms[orient][level];\r
+}\r
+\r
+/* <summary>                             */\r
+/* Forward 9-7 wavelet transform in 2-D. */\r
+/* </summary>                            */\r
+\r
+void dwt_encode_real(opj_tcd_tilecomp_t * tilec) {\r
+  int i, j, k;\r
+  int *a = NULL;\r
+  int *aj = NULL;\r
+  int *bj = NULL;\r
+  int w, l;\r
+  \r
+  w = tilec->x1-tilec->x0;\r
+  l = tilec->numresolutions-1;\r
+  a = tilec->data;\r
+  \r
+  for (i = 0; i < l; i++) {\r
+    int rw;      /* width of the resolution level computed                                                     */\r
+    int rh;      /* heigth of the resolution level computed                                                    */\r
+    int rw1;    /* width of the resolution level once lower than computed one                                 */\r
+    int rh1;    /* height of the resolution level once lower than computed one                                */\r
+    int cas_col;  /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */\r
+    int cas_row;  /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */\r
+    int dn, sn;\r
+    \r
+    rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;\r
+    rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;\r
+    rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;\r
+    rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;\r
+    \r
+    cas_row = tilec->resolutions[l - i].x0 % 2;\r
+    cas_col = tilec->resolutions[l - i].y0 % 2;\r
+    \r
+    sn = rh1;\r
+    dn = rh - rh1;\r
+    bj = (int*)opj_malloc(rh * sizeof(int));\r
+    for (j = 0; j < rw; j++) {\r
+      aj = a + j;\r
+      for (k = 0; k < rh; k++)  bj[k] = aj[k*w];\r
+      dwt_encode_1_real(bj, dn, sn, cas_col);\r
+      dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);\r
+    }\r
+    opj_free(bj);\r
+    \r
+    sn = rw1;\r
+    dn = rw - rw1;\r
+    bj = (int*)opj_malloc(rw * sizeof(int));\r
+    for (j = 0; j < rh; j++) {\r
+      aj = a + j * w;\r
+      for (k = 0; k < rw; k++)  bj[k] = aj[k];\r
+      dwt_encode_1_real(bj, dn, sn, cas_row);\r
+      dwt_deinterleave_h(bj, aj, dn, sn, cas_row);\r
+    }\r
+    opj_free(bj);\r
+  }\r
+}\r
+\r
+\r
+/* <summary>                             */\r
+/* Inverse 9-7 wavelet transform in 2-D. */\r
+/* </summary>                            */\r
+void dwt_decode_real(opj_tcd_tilecomp_t * tilec, int stop) {\r
+  int i, j, k;\r
+  int *a = NULL;\r
+  int *aj = NULL;\r
+  int *bj = NULL;\r
+  int w, l;\r
+  \r
+  w = tilec->x1-tilec->x0;\r
+  l = tilec->numresolutions-1;\r
+  a = tilec->data;\r
+  \r
+  for (i = l-1; i >= stop; i--) {\r
+    int rw;      /* width of the resolution level computed                       */\r
+    int rh;      /* heigth of the resolution level computed                      */\r
+    int rw1;    /* width of the resolution level once lower than computed one   */\r
+    int rh1;    /* height of the resolution level once lower than computed one  */\r
+    int cas_col;  /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */\r
+    int cas_row;  /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */\r
+    int dn, sn;\r
+    \r
+    rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;\r
+    rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;\r
+    rw1= tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;\r
+    rh1= tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;\r
+    \r
+    cas_col = tilec->resolutions[l - i].x0 % 2; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */\r
+    cas_row = tilec->resolutions[l - i].y0 % 2; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */\r
+        \r
+    sn = rw1;\r
+    dn = rw-rw1;\r
+    bj = (int*)opj_malloc(rw * sizeof(int));\r
+    for (j = 0; j < rh; j++) {\r
+      aj = a + j * w;\r
+      dwt_interleave_h(aj, bj, dn, sn, cas_col);\r
+      dwt_decode_1_real(bj, dn, sn, cas_col);\r
+      for (k = 0; k < rw; k++)  aj[k] = bj[k];\r
+    }\r
+    opj_free(bj);\r
+    \r
+    sn = rh1;\r
+    dn = rh-rh1;\r
+    bj = (int*)opj_malloc(rh * sizeof(int));\r
+    for (j = 0; j < rw; j++) {\r
+      aj = a + j;\r
+      dwt_interleave_v(aj, bj, dn, sn, w, cas_row);\r
+      dwt_decode_1_real(bj, dn, sn, cas_row);\r
+      for (k = 0; k < rh; k++)  aj[k * w] = bj[k];\r
+    }\r
+    opj_free(bj);\r
+  }\r
+}\r
+\r
+\r
+/* <summary>                          */\r
+/* Get gain of 9-7 wavelet transform. */\r
+/* </summary>                         */\r
+int dwt_getgain_real(int orient) {\r
+  (void)orient;\r
+  return 0;\r
+}\r
+\r
+/* <summary>                */\r
+/* Get norm of 9-7 wavelet. */\r
+/* </summary>               */\r
+double dwt_getnorm_real(int level, int orient) {\r
+  return dwt_norms_real[orient][level];\r
+}\r
+\r
+void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec) {\r
+  int numbands, bandno;\r
+  numbands = 3 * tccp->numresolutions - 2;\r
+  for (bandno = 0; bandno < numbands; bandno++) {\r
+    double stepsize;\r
+    int resno, level, orient, gain;\r
+\r
+    resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1);\r
+    orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1);\r
+    level = tccp->numresolutions - 1 - resno;\r
+    gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2));\r
+    if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {\r
+      stepsize = 1.0;\r
+    } else {\r
+      double norm = dwt_norms_real[orient][level];\r
+      stepsize = (1 << (gain + 1)) / norm;\r
+    }\r
+    dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, &tccp->stepsizes[bandno]);\r
+  }\r
+}\r
index a9c30ca7d594ba0c8576de4202cdbf45f82b721b..96ada27eaacaa389572ecc5bbf46c1add5cadb59 100644 (file)
-/*
- * 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  
- * tilec : tile component information (present tile)
- */
-/* void dwt_encode(int* a, int w, int h, int l); */
-void dwt_encode(tcd_tilecomp_t * tilec);
-/*
- * Apply a reversible inverse DWT transform to a component of an image  
- * tilec : tile component information (present tile)
- */
-void dwt_decode(tcd_tilecomp_t * tilec, int stop);
-
-/*
- * 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  
- */
-void dwt_encode_real(tcd_tilecomp_t * tilec);
-
-/*
- * Apply an irreversible inverse DWT transform to a component of an image  
- */
-void dwt_decode_real(tcd_tilecomp_t * tilec, 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
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#ifndef __DWT_H\r
+#define __DWT_H\r
+/**\r
+@file dwt.h\r
+@brief Implementation of a discrete wavelet transform (DWT)\r
+\r
+The functions in DWT.C have for goal to realize forward and inverse discret wavelet\r
+transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in\r
+DWT.C are used by some function in TCD.C.\r
+*/\r
+\r
+/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */\r
+/*@{*/\r
+\r
+\r
+/** @name Exported functions */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+/**\r
+Forward 5-3 wavelet tranform in 2-D. \r
+Apply a reversible DWT transform to a component of an image.\r
+@param tilec Tile component information (current tile)\r
+*/\r
+void dwt_encode(opj_tcd_tilecomp_t * tilec);\r
+/**\r
+Inverse 5-3 wavelet tranform in 2-D.\r
+Apply a reversible inverse DWT transform to a component of an image.\r
+@param tilec Tile component information (current tile)\r
+@param stop FIXME Number of decoded resolution levels ?\r
+*/\r
+void dwt_decode(opj_tcd_tilecomp_t * tilec, int stop);\r
+/**\r
+Get the gain of a subband for the reversible 5-3 DWT.\r
+@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)\r
+@return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise\r
+*/\r
+int dwt_getgain(int orient);\r
+/**\r
+Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT.\r
+@param level Level of the wavelet function\r
+@param orient Band of the wavelet function\r
+@return Returns the norm of the wavelet function\r
+*/\r
+double dwt_getnorm(int level, int orient);\r
+/**\r
+Forward 9-7 wavelet transform in 2-D. \r
+Apply an irreversible DWT transform to a component of an image.\r
+@param tilec Tile component information (current tile)\r
+*/\r
+void dwt_encode_real(opj_tcd_tilecomp_t * tilec);\r
+/**\r
+Inverse 9-7 wavelet transform in 2-D. \r
+Apply an irreversible inverse DWT transform to a component of an image.\r
+@param tilec Tile component information (current tile)\r
+@param stop FIXME Number of decoded resolution levels ?\r
+*/\r
+void dwt_decode_real(opj_tcd_tilecomp_t * tilec, int stop);\r
+/**\r
+Get the gain of a subband for the irreversible 9-7 DWT.\r
+@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)\r
+@return Returns the gain of the 9-7 wavelet transform\r
+*/\r
+int dwt_getgain_real(int orient);\r
+/**\r
+Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT\r
+@param level Level of the wavelet function\r
+@param orient Band of the wavelet function\r
+@return Returns the norm of the 9-7 wavelet\r
+*/\r
+double dwt_getnorm_real(int level, int orient);\r
+/**\r
+FIXME : comment ???\r
+@param tccp\r
+@param prec\r
+*/\r
+void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec);\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __DWT_H */\r
diff --git a/src/gdcmopenjpeg/libopenjpeg/event.c b/src/gdcmopenjpeg/libopenjpeg/event.c
new file mode 100644 (file)
index 0000000..5dd162d
--- /dev/null
@@ -0,0 +1,181 @@
+/*\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+/* ==========================================================\r
+     Utility functions\r
+   ==========================================================*/\r
+\r
+#ifndef WIN32\r
+static char*\r
+i2a(unsigned i, char *a, unsigned r) {\r
+  if (i/r > 0) a = i2a(i/r,a,r);\r
+  *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i%r];\r
+  return a+1;\r
+}\r
+\r
+/** \r
+ Transforms integer i into an ascii string and stores the result in a; \r
+ string is encoded in the base indicated by r.\r
+ @param i Number to be converted\r
+ @param a String result\r
+ @param r Base of value; must be in the range 2 - 36\r
+ @return Returns a\r
+*/\r
+static char *\r
+_itoa(int i, char *a, int r) {\r
+  r = ((r < 2) || (r > 36)) ? 10 : r;\r
+  if(i < 0) {\r
+    *a = '-';\r
+    *i2a(-i, a+1, r) = 0;\r
+  }\r
+  else *i2a(i, a, r) = 0;\r
+  return a;\r
+}\r
+\r
+#endif /* !WIN32 */\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+opj_event_mgr_t* opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context) {\r
+  if(cinfo) {\r
+    opj_event_mgr_t *previous = cinfo->event_mgr;\r
+    cinfo->event_mgr = event_mgr;\r
+    cinfo->client_data = context;\r
+    return previous;\r
+  }\r
+\r
+  return NULL;\r
+}\r
+\r
+bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) {\r
+#define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */\r
+  opj_msg_callback msg_handler = NULL;\r
+\r
+  opj_event_mgr_t *event_mgr = cinfo->event_mgr;\r
+  if(event_mgr != NULL) {\r
+    switch(event_type) {\r
+      case EVT_ERROR:\r
+        msg_handler = event_mgr->error_handler;\r
+        break;\r
+      case EVT_WARNING:\r
+        msg_handler = event_mgr->warning_handler;\r
+        break;\r
+      case EVT_INFO:\r
+        msg_handler = event_mgr->info_handler;\r
+        break;\r
+      default:\r
+        break;\r
+    }\r
+    if(msg_handler == NULL) {\r
+      return false;\r
+    }\r
+  } else {\r
+    return false;\r
+  }\r
+\r
+  if ((fmt != NULL) && (event_mgr != NULL)) {\r
+    va_list arg;\r
+    int str_length, i, j;\r
+    char message[MSG_SIZE];\r
+    memset(message, 0, MSG_SIZE);\r
+    /* initialize the optional parameter list */\r
+    va_start(arg, fmt);\r
+    /* check the length of the format string */\r
+    str_length = (strlen(fmt) > MSG_SIZE) ? MSG_SIZE : strlen(fmt);\r
+    /* parse the format string and put the result in 'message' */\r
+    for (i = 0, j = 0; i < str_length; ++i) {\r
+      if (fmt[i] == '%') {\r
+        if (i + 1 < str_length) {\r
+          switch(tolower(fmt[i + 1])) {\r
+            case '%' :\r
+              message[j++] = '%';\r
+              break;\r
+            case 'o' : /* octal numbers */\r
+            {\r
+              char tmp[16];\r
+              _itoa(va_arg(arg, int), tmp, 8);\r
+              strcat(message, tmp);\r
+              j += strlen(tmp);\r
+              ++i;\r
+              break;\r
+            }\r
+            case 'i' : /* decimal numbers */\r
+            case 'd' :\r
+            {\r
+              char tmp[16];\r
+              _itoa(va_arg(arg, int), tmp, 10);\r
+              strcat(message, tmp);\r
+              j += strlen(tmp);\r
+              ++i;\r
+              break;\r
+            }\r
+            case 'x' : /* hexadecimal numbers */\r
+            {\r
+              char tmp[16];\r
+              _itoa(va_arg(arg, int), tmp, 16);\r
+              strcat(message, tmp);\r
+              j += strlen(tmp);\r
+              ++i;\r
+              break;\r
+            }\r
+            case 's' : /* strings */\r
+            {\r
+              char *tmp = va_arg(arg, char*);\r
+              strcat(message, tmp);\r
+              j += strlen(tmp);\r
+              ++i;\r
+              break;\r
+            }\r
+            case 'f' :  /* floats */\r
+            {\r
+              char tmp[16];\r
+              double value = va_arg(arg, double);\r
+              sprintf(tmp, "%f", value);\r
+              strcat(message, tmp);\r
+              j += strlen(tmp);\r
+              ++i;\r
+              break;\r
+            }\r
+          };\r
+        } else {\r
+          message[j++] = fmt[i];\r
+        }\r
+      } else {\r
+        message[j++] = fmt[i];\r
+      };\r
+    }\r
+    /* deinitialize the optional parameter list */\r
+    va_end(arg);\r
+\r
+    /* output the message to the user program */\r
+    msg_handler(message, cinfo->client_data);\r
+  }\r
+\r
+  return true;\r
+}\r
+\r
diff --git a/src/gdcmopenjpeg/libopenjpeg/event.h b/src/gdcmopenjpeg/libopenjpeg/event.h
new file mode 100644 (file)
index 0000000..5a8666c
--- /dev/null
@@ -0,0 +1,58 @@
+/*\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#ifndef __EVENT_H\r
+#define __EVENT_H\r
+/**\r
+@file event.h\r
+@brief Implementation of a event callback system\r
+\r
+The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user.\r
+*/\r
+\r
+#define EVT_ERROR  1  /**< Error event type */\r
+#define EVT_WARNING  2  /**< Warning event type */\r
+#define EVT_INFO  4  /**< Debug event type */\r
+\r
+/** @defgroup EVENT EVENT - Implementation of a event callback system */\r
+/*@{*/\r
+\r
+/** @name Exported functions (see also openjpeg.h) */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+/**\r
+Write formatted data to a string and send the string to a user callback. \r
+@param cinfo Codec context info\r
+@param event_type Event type or callback to use to send the message\r
+@param fmt Format-control string (plus optionnal arguments)\r
+@return Returns true if successful, returns false otherwise\r
+*/\r
+bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...);\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __EVENT_H */\r
index 81cc5f1fede3b2a6c7fbeb0e44d6fbea3ad46d08..69081a3d0f6e168b848ac3b6d601c5a857d4d572 100644 (file)
@@ -1,63 +1,45 @@
-/*
- * 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*/
-
-int fix_mul(int a, int b)   /* Luke Lee optimized : 11/16/2004*/
-{
-    int64 temp = (int64) a * (int64) b >> 12;
-    return (int) ((temp >> 1) + (temp & 1)) ;
-}
-
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "fix.h"\r
+\r
+#ifdef WIN32\r
+#define int64 __int64\r
+#else\r
+#define int64 long long\r
+#endif\r
+\r
+int fix_mul(int a, int b) {\r
+    int64 temp = (int64) a * (int64) b >> 12;\r
+    return (int) ((temp >> 1) + (temp & 1)) ;\r
+}\r
+\r
+\r
+\r
index 768cada2659289b5d411cd5bf57298593135ec94..b52753e1afc543c924144aca16ef57d2a958769a 100644 (file)
@@ -1,33 +1,52 @@
-/*
- * 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
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#ifndef __FIX_H\r
+#define __FIX_H\r
+/**\r
+@file fix.h\r
+@brief Implementation of operations of specific multiplication (FIX)\r
+\r
+The functions in FIX.C have for goal to realize specific multiplication.\r
+*/\r
+\r
+/** @defgroup FIX FIX - Implementation of operations of specific multiplication */\r
+/*@{*/\r
+\r
+/**\r
+Multiply two fixed-precision rational numbers.\r
+@param a\r
+@param b\r
+@return Returns a * b\r
+*/\r
+int fix_mul(int a, int b);\r
+\r
+/*@}*/\r
+\r
+#endif /* __FIX_H */\r
diff --git a/src/gdcmopenjpeg/libopenjpeg/image.c b/src/gdcmopenjpeg/libopenjpeg/image.c
new file mode 100644 (file)
index 0000000..bc39016
--- /dev/null
@@ -0,0 +1,87 @@
+/*\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+opj_image_t* opj_image_create0() {\r
+  opj_image_t *image = (opj_image_t*)opj_malloc(sizeof(opj_image_t));\r
+  return image;\r
+}\r
+\r
+opj_image_t *opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {\r
+  int compno;\r
+  opj_image_t *image = NULL;\r
+\r
+  image = (opj_image_t*)opj_malloc(sizeof(opj_image_t));\r
+  if(image) {\r
+    image->color_space = clrspc;\r
+    image->numcomps = numcmpts;\r
+    /* allocate memory for the per-component information */\r
+    image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(opj_image_comp_t));\r
+    if(!image->comps) {\r
+      opj_image_destroy(image);\r
+      return NULL;\r
+    }\r
+    /* create the individual image components */\r
+    for(compno = 0; compno < numcmpts; compno++) {\r
+      opj_image_comp_t *comp = &image->comps[compno];\r
+      comp->dx = cmptparms[compno].dx;\r
+      comp->dy = cmptparms[compno].dy;\r
+      comp->w = cmptparms[compno].w;\r
+      comp->h = cmptparms[compno].h;\r
+      comp->x0 = cmptparms[compno].x0;\r
+      comp->y0 = cmptparms[compno].y0;\r
+      comp->prec = cmptparms[compno].prec;\r
+      comp->bpp = cmptparms[compno].bpp;\r
+      comp->sgnd = cmptparms[compno].sgnd;\r
+      comp->data = (int*)opj_malloc(comp->w * comp->h * sizeof(int));\r
+      if(!comp->data) {\r
+        opj_image_destroy(image);\r
+        return NULL;\r
+      }\r
+    }\r
+  }\r
+\r
+  return image;\r
+}\r
+\r
+void opj_image_destroy(opj_image_t *image) {\r
+  int i;\r
+  if(image) {\r
+    if(image->comps) {\r
+      /* image components */\r
+      for(i = 0; i < image->numcomps; i++) {\r
+        opj_image_comp_t *image_comp = &image->comps[i];\r
+        if(image_comp->data) {\r
+          opj_free(image_comp->data);\r
+        }\r
+      }\r
+      opj_free(image->comps);\r
+    }\r
+    opj_free(image);\r
+  }\r
+}\r
+\r
diff --git a/src/gdcmopenjpeg/libopenjpeg/image.h b/src/gdcmopenjpeg/libopenjpeg/image.h
new file mode 100644 (file)
index 0000000..8aa8d84
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#ifndef __IMAGE_H\r
+#define __IMAGE_H\r
+/**\r
+@file image.h\r
+@brief Implementation of operations on images (IMAGE)\r
+\r
+The functions in IMAGE.C have for goal to realize operations on images.\r
+*/\r
+\r
+/** @defgroup IMAGE IMAGE - Implementation of operations on images */\r
+/*@{*/\r
+\r
+/**\r
+Create an empty image\r
+@todo this function should be removed\r
+@return returns an empty image if successful, returns NULL otherwise\r
+*/\r
+opj_image_t* opj_image_create0();\r
+\r
+/*@}*/\r
+\r
+#endif /* __IMAGE_H */\r
+\r
index a5e6a582fa16aacfe0f171e25ab3d7cdb49ef303..a969bea697942154e26da9ed1922d2fc9bc422fb 100644 (file)
-/*
- * 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 "int.h"
-
-/*
- * 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;
-}
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+int int_min(int a, int b) {\r
+  return a < b ? a : b;\r
+}\r
+\r
+int int_max(int a, int b) {\r
+  return (a > b) ? a : b;\r
+}\r
+\r
+int int_clamp(int a, int min, int max) {\r
+  if (a < min)\r
+    return min;\r
+  if (a > max)\r
+    return max;\r
+  return a;\r
+}\r
+\r
+int int_abs(int a) {\r
+  return a < 0 ? -a : a;\r
+}\r
+\r
+int int_ceildiv(int a, int b) {\r
+  return (a + b - 1) / b;\r
+}\r
+\r
+int int_ceildivpow2(int a, int b) {\r
+  return (a + (1 << b) - 1) >> b;\r
+}\r
+\r
+int int_floordivpow2(int a, int b) {\r
+  return a >> b;\r
+}\r
+\r
+int int_floorlog2(int a) {\r
+  int l;\r
+  for (l = 0; a > 1; l++) {\r
+    a >>= 1;\r
+  }\r
+  return l;\r
+}\r
+\r
index 52add1acf1a97028b34b447938ff9307f57674e1..accfd64e4830507c8ac2fc12d506043189bebd55 100644 (file)
@@ -1,88 +1,95 @@
-/*
- * 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 "j2k.h"
-
-#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
- */
-LIBJ2K_API int int_ceildivpow2(int a, int b);
-
-/*
- * Divide an integer by a power of 2 and round downwards.
- *
- * a divided by 2^b
- */
-LIBJ2K_API int int_floordivpow2(int a, int b);
-
-/*
- * Get logarithm of an integer and round downwards.
- *
- * log2(a)
- */
-int int_floorlog2(int a);
-
-#endif
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#ifndef __INT_H\r
+#define __INT_H\r
+/**\r
+@file int.h\r
+@brief Implementation of operations on integers (INT)\r
+\r
+The functions in INT.C have for goal to realize operations on integers.\r
+*/\r
+\r
+/** @defgroup INT INT - Implementation of operations on integers */\r
+/*@{*/\r
+\r
+/** @name Exported functions (see also openjpeg.h) */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+/**\r
+Get the minimum of two integers\r
+@return Returns a if a < b else b\r
+*/\r
+int int_min(int a, int b);\r
+/**\r
+Get the maximum of two integers\r
+@return Returns a if a > b else b\r
+*/\r
+int int_max(int a, int b);\r
+/**\r
+Clamp an integer inside an interval\r
+@return\r
+<ul>\r
+<li>Returns a if (min < a < max)\r
+<li>Returns max if (a > max)\r
+<li>Returns min if (a < min) \r
+</ul>\r
+*/\r
+int int_clamp(int a, int min, int max);\r
+/**\r
+@return Get absolute value of integer\r
+*/\r
+int int_abs(int a);\r
+/**\r
+Divide an integer and round upwards\r
+@return Returns a divided by b\r
+*/\r
+int int_ceildiv(int a, int b);\r
+/**\r
+Divide an integer by a power of 2 and round upwards\r
+@return Returns a divided by 2^b\r
+*/\r
+int int_ceildivpow2(int a, int b);\r
+/**\r
+Divide an integer by a power of 2 and round downwards\r
+@return Returns a divided by 2^b\r
+*/\r
+int int_floordivpow2(int a, int b);\r
+/**\r
+Get logarithm of an integer and round downwards\r
+@return Returns log2(a)\r
+*/\r
+int int_floorlog2(int a);\r
+\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif\r
index 09868ca63351a65c582f9928a0de478f1b8cb051..7481dfd6e322273f0bec09055c8d4623a29f910c 100644 (file)
 /*
-* 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.
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Write the SOC marker (Start Of Codestream)
+@param j2k J2K handle
+*/
+static void j2k_write_soc(opj_j2k_t *j2k);
+/**
+Read the SOC marker (Start of Codestream)
+@param j2k J2K handle
+*/
+static void j2k_read_soc(opj_j2k_t *j2k);
+/**
+Write the SIZ marker (image and tile size)
+@param j2k J2K handle
+*/
+static void j2k_write_siz(opj_j2k_t *j2k);
+/**
+Read the SIZ marker (image and tile size)
+@param j2k J2K handle
+*/
+static void j2k_read_siz(opj_j2k_t *j2k);
+/**
+Write the COM marker (comment)
+@param j2k J2K handle
+*/
+static void j2k_write_com(opj_j2k_t *j2k);
+/**
+Read the COM marker (comment)
+@param j2k J2K handle
+*/
+static void j2k_read_com(opj_j2k_t *j2k);
+/**
+Write the value concerning the specified component in the marker COD and COC
+@param j2k J2K handle
+@param compno Number of the component concerned by the information written
+*/
+static void j2k_write_cox(opj_j2k_t *j2k, int compno);
+/**
+Read the value concerning the specified component in the marker COD and COC
+@param j2k J2K handle
+@param compno Number of the component concerned by the information read
+*/
+static void j2k_read_cox(opj_j2k_t *j2k, int compno);
+/**
+Write the COD marker (coding style default)
+@param j2k J2K handle
+*/
+static void j2k_write_cod(opj_j2k_t *j2k);
+/**
+Read the COD marker (coding style default)
+@param j2k J2K handle
+*/
+static void j2k_read_cod(opj_j2k_t *j2k);
+/**
+Write the COC marker (coding style component)
+@param j2k J2K handle
+@param compno Number of the component concerned by the information written
+*/
+static void j2k_write_coc(opj_j2k_t *j2k, int compno);
+/**
+Read the COC marker (coding style component)
+@param j2k J2K handle
+*/
+static void j2k_read_coc(opj_j2k_t *j2k);
+/**
+Write the value concerning the specified component in the marker QCD and QCC
+@param j2k J2K handle
+@param compno Number of the component concerned by the information written
+*/
+static void j2k_write_qcx(opj_j2k_t *j2k, int compno);
+/**
+Read the value concerning the specified component in the marker QCD and QCC
+@param j2k J2K handle
+@param compno Number of the component concern by the information read
+@param len Length of the information in the QCX part of the marker QCD/QCC
+*/
+static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len);
+/**
+Write the QCD marker (quantization default)
+@param j2k J2K handle
+*/
+static void j2k_write_qcd(opj_j2k_t *j2k);
+/**
+Read the QCD marker (quantization default)
+@param j2k J2K handle
+*/
+static void j2k_read_qcd(opj_j2k_t *j2k);
+/**
+Write the QCC marker (quantization component)
+@param j2k J2K handle
+@param compno Number of the component concerned by the information written
+*/
+static void j2k_write_qcc(opj_j2k_t *j2k, int compno);
+/**
+Read the QCC marker (quantization component)
+@param j2k J2K handle
+*/
+static void j2k_read_qcc(opj_j2k_t *j2k);
+/**
+Write the POC marker (progression order change)
+@param j2k J2K handle
+*/
+static void j2k_write_poc(opj_j2k_t *j2k);
+/**
+Read the POC marker (progression order change)
+@param j2k J2K handle
+*/
+static void j2k_read_poc(opj_j2k_t *j2k);
+/**
+Read the CRG marker (component registration)
+@param j2k J2K handle
+*/
+static void j2k_read_crg(opj_j2k_t *j2k);
+/**
+Read the TLM marker (tile-part lengths)
+@param j2k J2K handle
+*/
+static void j2k_read_tlm(opj_j2k_t *j2k);
+/**
+Read the PLM marker (packet length, main header)
+@param j2k J2K handle
+*/
+static void j2k_read_plm(opj_j2k_t *j2k);
+/**
+Read the PLT marker (packet length, tile-part header)
+@param j2k J2K handle
+*/
+static void j2k_read_plt(opj_j2k_t *j2k);
+/**
+Read the PPM marker (packet packet headers, main header)
+@param j2k J2K handle
+*/
+static void j2k_read_ppm(opj_j2k_t *j2k);
+/**
+Read the PPT marker (packet packet headers, tile-part header)
+@param j2k J2K handle
+*/
+static void j2k_read_ppt(opj_j2k_t *j2k);
+/**
+Write the SOT marker (start of tile-part)
+@param j2k J2K handle
+*/
+static void j2k_write_sot(opj_j2k_t *j2k);
+/**
+Read the SOT marker (start of tile-part)
+@param j2k J2K handle
 */
+static void j2k_read_sot(opj_j2k_t *j2k);
+/**
+Write the SOD marker (start of data)
+@param j2k J2K handle
+@param tile_coder Pointer to a TCD handle
+*/
+static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder);
+/**
+Read the SOD marker (start of data)
+@param j2k J2K handle
+*/
+static void j2k_read_sod(opj_j2k_t *j2k);
+/**
+Write the RGN marker (region-of-interest)
+@param j2k J2K handle
+@param compno Number of the component concerned by the information written
+@param tileno Number of the tile concerned by the information written
+*/
+static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno);
+/**
+Read the RGN marker (region-of-interest)
+@param j2k J2K handle
+*/
+static void j2k_read_rgn(opj_j2k_t *j2k);
+/**
+Write the EOC marker (end of codestream)
+@param j2k J2K handle
+*/
+static void j2k_write_eoc(opj_j2k_t *j2k);
+/**
+Read the EOC marker (end of codestream)
+@param j2k J2K handle
+*/
+static void j2k_read_eoc(opj_j2k_t *j2k);
+/**
+Read an unknown marker
+@param j2k J2K handle
+*/
+static void j2k_read_unk(opj_j2k_t *j2k);
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <setjmp.h>
-#include <math.h>
-
-#include "j2k.h"
-#include "cio.h"
-#include "tcd.h"
-#include "dwt.h"
-#include "int.h"
-#include "jpt.h"
-
-#define J2K_MS_SOC 0xff4f
-#define J2K_MS_SOT 0xff90
-#define J2K_MS_SOD 0xff93
-#define J2K_MS_EOC 0xffd9
-#define J2K_MS_SIZ 0xff51
-#define J2K_MS_COD 0xff52
-#define J2K_MS_COC 0xff53
-#define J2K_MS_RGN 0xff5e
-#define J2K_MS_QCD 0xff5c
-#define J2K_MS_QCC 0xff5d
-#define J2K_MS_POC 0xff5f
-#define J2K_MS_TLM 0xff55
-#define J2K_MS_PLM 0xff57
-#define J2K_MS_PLT 0xff58
-#define J2K_MS_PPM 0xff60
-#define J2K_MS_PPT 0xff61
-#define J2K_MS_SOP 0xff91
-#define J2K_MS_EPH 0xff92
-#define J2K_MS_CRG 0xff63
-#define J2K_MS_COM 0xff64
-
-#define J2K_STATE_MHSOC 0x0001
-#define J2K_STATE_MHSIZ 0x0002
-#define J2K_STATE_MH 0x0004
-#define J2K_STATE_TPHSOT 0x0008
-#define J2K_STATE_TPH 0x0010
-#define J2K_STATE_MT 0x0020
-#define J2K_STATE_NEOC 0x0040
-
-
-jmp_buf j2k_error;
-
-static int j2k_state;
-static int j2k_curtileno;
-j2k_tcp_t j2k_default_tcp;
-static unsigned char *j2k_eot;
-static int j2k_sot_start;
-static int pos_correction;
-
-static j2k_image_t *j2k_img;
-static j2k_cp_t *j2k_cp;
-
-static unsigned char **j2k_tile_data;
-static int *j2k_tile_len;
-
-static info_image info_IM;
-
-/* Add Patrick */
-void j2k_clean()
-{
-  int tileno = 0;
-#ifndef NO_PACKETS_DECODING
-  tcd_free_encode(j2k_img, j2k_cp, j2k_curtileno);
-#endif
-  
-  if (info_IM.index_on) {
-    for (tileno = 0; tileno < j2k_cp->tw * j2k_cp->th; tileno++) {
-      free(info_IM.tile[tileno].packet);
-    }
-    free(info_IM.tile);
-  }
-}
+/*@}*/
 
-/* \Add Patrick */
+/*@}*/
 
-void j2k_dump_image(j2k_image_t * img)
-{
+/* ----------------------------------------------------------------------- */
+
+void j2k_dump_image(FILE *fd, opj_image_t * img) {
   int compno;
-  fprintf(stdout, "image {\n");
-  fprintf(stdout, "  x0=%d, y0=%d, x1=%d, y1=%d\n", img->x0, img->y0,
-    img->x1, img->y1);
-  fprintf(stdout, "  numcomps=%d\n", img->numcomps);
+  fprintf(fd, "image {\n");
+  fprintf(fd, "  x0=%d, y0=%d, x1=%d, y1=%d\n", img->x0, img->y0, img->x1, img->y1);
+  fprintf(fd, "  numcomps=%d\n", img->numcomps);
   for (compno = 0; compno < img->numcomps; compno++) {
-    j2k_comp_t *comp = &img->comps[compno];
-    fprintf(stdout, "  comp %d {\n", compno);
-    fprintf(stdout, "    dx=%d, dy=%d\n", comp->dx, comp->dy);
-    fprintf(stdout, "    prec=%d\n", comp->prec);
-    fprintf(stdout, "    sgnd=%d\n", comp->sgnd);
-    fprintf(stdout, "  }\n");
-  }
-  fprintf(stdout, "}\n");
+    opj_image_comp_t *comp = &img->comps[compno];
+    fprintf(fd, "  comp %d {\n", compno);
+    fprintf(fd, "    dx=%d, dy=%d\n", comp->dx, comp->dy);
+    fprintf(fd, "    prec=%d\n", comp->prec);
+    fprintf(fd, "    sgnd=%d\n", comp->sgnd);
+    fprintf(fd, "  }\n");
+  }
+  fprintf(fd, "}\n");
 }
 
-void j2k_dump_cp(j2k_image_t * img, j2k_cp_t * cp)
-{
+void j2k_dump_cp(FILE *fd, opj_image_t * img, opj_cp_t * cp) {
   int tileno, compno, layno, bandno, resno, numbands;
-  fprintf(stdout, "coding parameters {\n");
-  fprintf(stdout, "  tx0=%d, ty0=%d\n", cp->tx0, cp->ty0);
-  fprintf(stdout, "  tdx=%d, tdy=%d\n", cp->tdx, cp->tdy);
-  fprintf(stdout, "  tw=%d, th=%d\n", cp->tw, cp->th);
+  fprintf(fd, "coding parameters {\n");
+  fprintf(fd, "  tx0=%d, ty0=%d\n", cp->tx0, cp->ty0);
+  fprintf(fd, "  tdx=%d, tdy=%d\n", cp->tdx, cp->tdy);
+  fprintf(fd, "  tw=%d, th=%d\n", cp->tw, cp->th);
   for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
-    j2k_tcp_t *tcp = &cp->tcps[tileno];
-    fprintf(stdout, "  tile %d {\n", tileno);
-    fprintf(stdout, "    csty=%x\n", tcp->csty);
-    fprintf(stdout, "    prg=%d\n", tcp->prg);
-    fprintf(stdout, "    numlayers=%d\n", tcp->numlayers);
-    fprintf(stdout, "    mct=%d\n", tcp->mct);
-    fprintf(stdout, "    rates=");
+    opj_tcp_t *tcp = &cp->tcps[tileno];
+    fprintf(fd, "  tile %d {\n", tileno);
+    fprintf(fd, "    csty=%x\n", tcp->csty);
+    fprintf(fd, "    prg=%d\n", tcp->prg);
+    fprintf(fd, "    numlayers=%d\n", tcp->numlayers);
+    fprintf(fd, "    mct=%d\n", tcp->mct);
+    fprintf(fd, "    rates=");
     for (layno = 0; layno < tcp->numlayers; layno++) {
-      fprintf(stdout, "%d ", tcp->rates[layno]);
+      fprintf(fd, "%d ", tcp->rates[layno]);
     }
-    fprintf(stdout, "\n");
+    fprintf(fd, "\n");
     for (compno = 0; compno < img->numcomps; compno++) {
-      j2k_tccp_t *tccp = &tcp->tccps[compno];
-      fprintf(stdout, "    comp %d {\n", compno);
-      fprintf(stdout, "      csty=%x\n", tccp->csty);
-      fprintf(stdout, "      numresolutions=%d\n", tccp->numresolutions);
-      fprintf(stdout, "      cblkw=%d\n", tccp->cblkw);
-      fprintf(stdout, "      cblkh=%d\n", tccp->cblkh);
-      fprintf(stdout, "      cblksty=%x\n", tccp->cblksty);
-      fprintf(stdout, "      qmfbid=%d\n", tccp->qmfbid);
-      fprintf(stdout, "      qntsty=%d\n", tccp->qntsty);
-      fprintf(stdout, "      numgbits=%d\n", tccp->numgbits);
-      fprintf(stdout, "      roishift=%d\n", tccp->roishift);
-      fprintf(stdout, "      stepsizes=");
-      numbands =
-   tccp->qntsty ==
-   J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2;
+      opj_tccp_t *tccp = &tcp->tccps[compno];
+      fprintf(fd, "    comp %d {\n", compno);
+      fprintf(fd, "      csty=%x\n", tccp->csty);
+      fprintf(fd, "      numresolutions=%d\n", tccp->numresolutions);
+      fprintf(fd, "      cblkw=%d\n", tccp->cblkw);
+      fprintf(fd, "      cblkh=%d\n", tccp->cblkh);
+      fprintf(fd, "      cblksty=%x\n", tccp->cblksty);
+      fprintf(fd, "      qmfbid=%d\n", tccp->qmfbid);
+      fprintf(fd, "      qntsty=%d\n", tccp->qntsty);
+      fprintf(fd, "      numgbits=%d\n", tccp->numgbits);
+      fprintf(fd, "      roishift=%d\n", tccp->roishift);
+      fprintf(fd, "      stepsizes=");
+      numbands = tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2;
       for (bandno = 0; bandno < numbands; bandno++) {
-   fprintf(stdout, "(%d,%d) ", tccp->stepsizes[bandno].mant,
-     tccp->stepsizes[bandno].expn);
+        fprintf(fd, "(%d,%d) ", tccp->stepsizes[bandno].mant,
+          tccp->stepsizes[bandno].expn);
       }
-      fprintf(stdout, "\n");
+      fprintf(fd, "\n");
       
       if (tccp->csty & J2K_CCP_CSTY_PRT) {
-   fprintf(stdout, "      prcw=");
-   for (resno = 0; resno < tccp->numresolutions; resno++) {
-     fprintf(stdout, "%d ", tccp->prcw[resno]);
-   }
-   fprintf(stdout, "\n");
-   fprintf(stdout, "      prch=");
-   for (resno = 0; resno < tccp->numresolutions; resno++) {
-     fprintf(stdout, "%d ", tccp->prch[resno]);
-   }
-   fprintf(stdout, "\n");
+        fprintf(fd, "      prcw=");
+        for (resno = 0; resno < tccp->numresolutions; resno++) {
+          fprintf(fd, "%d ", tccp->prcw[resno]);
+        }
+        fprintf(fd, "\n");
+        fprintf(fd, "      prch=");
+        for (resno = 0; resno < tccp->numresolutions; resno++) {
+          fprintf(fd, "%d ", tccp->prch[resno]);
+        }
+        fprintf(fd, "\n");
       }
-      fprintf(stdout, "    }\n");
+      fprintf(fd, "    }\n");
     }
-    fprintf(stdout, "  }\n");
+    fprintf(fd, "  }\n");
   }
-  fprintf(stdout, "}\n");
+  fprintf(fd, "}\n");
 }
 
-void j2k_write_soc()
-{
-  cio_write(J2K_MS_SOC, 2);
+/* ----------------------------------------------------------------------- */
+
+static void j2k_write_soc(opj_j2k_t *j2k) {
+  opj_cio_t *cio = j2k->cio;
+  cio_write(cio, J2K_MS_SOC, 2);
 }
 
-void j2k_read_soc()
-{
-  j2k_state = J2K_STATE_MHSIZ;
+static void j2k_read_soc(opj_j2k_t *j2k) {
+  j2k->state = J2K_STATE_MHSIZ;
 }
 
-void j2k_write_siz()
-{
+static void j2k_write_siz(opj_j2k_t *j2k) {
   int i;
   int lenp, len;
-  
-  cio_write(J2K_MS_SIZ, 2);   /* SIZ                 */
-  lenp = cio_tell();
-  cio_skip(2);
-  cio_write(0, 2);      /* Rsiz (capabilities) */
-  cio_write(j2k_img->x1, 4);   /* Xsiz                */
-  cio_write(j2k_img->y1, 4);   /* Ysiz                */
-  cio_write(j2k_img->x0, 4);   /* X0siz               */
-  cio_write(j2k_img->y0, 4);   /* Y0siz               */
-  cio_write(j2k_cp->tdx, 4);   /* XTsiz               */
-  cio_write(j2k_cp->tdy, 4);   /* YTsiz               */
-  cio_write(j2k_cp->tx0, 4);   /* XT0siz              */
-  cio_write(j2k_cp->ty0, 4);   /* YT0siz              */
-  cio_write(j2k_img->numcomps, 2);   /* Csiz                */
-  for (i = 0; i < j2k_img->numcomps; i++) {
-    cio_write(j2k_img->comps[i].prec - 1 + (j2k_img->comps[i].sgnd << 7), 1);   /* Ssiz_i */
-    cio_write(j2k_img->comps[i].dx, 1);   /* XRsiz_i             */
-    cio_write(j2k_img->comps[i].dy, 1);   /* YRsiz_i             */
-  }
-  len = cio_tell() - lenp;
-  cio_seek(lenp);
-  cio_write(len, 2);      /* Lsiz                */
-  cio_seek(lenp + len);
-  
+
+  opj_cio_t *cio = j2k->cio;
+  opj_image_t *image = j2k->image;
+  opj_cp_t *cp = j2k->cp;
+  
+  cio_write(cio, J2K_MS_SIZ, 2);  /* SIZ */
+  lenp = cio_tell(cio);
+  cio_skip(cio, 2);
+  cio_write(cio, 0, 2);      /* Rsiz (capabilities) */
+  cio_write(cio, image->x1, 4);  /* Xsiz */
+  cio_write(cio, image->y1, 4);  /* Ysiz */
+  cio_write(cio, image->x0, 4);  /* X0siz */
+  cio_write(cio, image->y0, 4);  /* Y0siz */
+  cio_write(cio, cp->tdx, 4);    /* XTsiz */
+  cio_write(cio, cp->tdy, 4);    /* YTsiz */
+  cio_write(cio, cp->tx0, 4);    /* XT0siz */
+  cio_write(cio, cp->ty0, 4);    /* YT0siz */
+  cio_write(cio, image->numcomps, 2);  /* Csiz */
+  for (i = 0; i < image->numcomps; i++) {
+    cio_write(cio, image->comps[i].prec - 1 + (image->comps[i].sgnd << 7), 1);  /* Ssiz_i */
+    cio_write(cio, image->comps[i].dx, 1);  /* XRsiz_i */
+    cio_write(cio, image->comps[i].dy, 1);  /* YRsiz_i */
+  }
+  len = cio_tell(cio) - lenp;
+  cio_seek(cio, lenp);
+  cio_write(cio, len, 2);    /* Lsiz */
+  cio_seek(cio, lenp + len);
 }
 
-void j2k_read_siz()
-{
+static void j2k_read_siz(opj_j2k_t *j2k) {
   int len, i;
   
-  len = cio_read(2);      /* Lsiz                */
-  cio_read(2);         /* Rsiz (capabilities) */
-  j2k_img->x1 = cio_read(4);   /* Xsiz                */
-  j2k_img->y1 = cio_read(4);   /* Ysiz                */
-  j2k_img->x0 = cio_read(4);   /* X0siz               */
-  j2k_img->y0 = cio_read(4);   /* Y0siz               */
-  j2k_cp->tdx = cio_read(4);   /* XTsiz               */
-  j2k_cp->tdy = cio_read(4);   /* YTsiz               */
-  j2k_cp->tx0 = cio_read(4);   /* XT0siz              */
-  j2k_cp->ty0 = cio_read(4);   /* YT0siz              */
-  
-  j2k_img->numcomps = cio_read(2);   /* Csiz                */
-  j2k_img->comps =
-    (j2k_comp_t *) malloc(j2k_img->numcomps * sizeof(j2k_comp_t));
-  for (i = 0; i < j2k_img->numcomps; i++) {
+  opj_cio_t *cio = j2k->cio;
+  opj_image_t *image = j2k->image;
+  opj_cp_t *cp = j2k->cp;
+  
+  len = cio_read(cio, 2);      /* Lsiz */
+  cio_read(cio, 2);        /* Rsiz (capabilities) */
+  image->x1 = cio_read(cio, 4);  /* Xsiz */
+  image->y1 = cio_read(cio, 4);  /* Ysiz */
+  image->x0 = cio_read(cio, 4);  /* X0siz */
+  image->y0 = cio_read(cio, 4);  /* Y0siz */
+  cp->tdx = cio_read(cio, 4);    /* XTsiz */
+  cp->tdy = cio_read(cio, 4);    /* YTsiz */
+  cp->tx0 = cio_read(cio, 4);    /* XT0siz */
+  cp->ty0 = cio_read(cio, 4);    /* YT0siz */
+  
+  image->numcomps = cio_read(cio, 2);  /* Csiz */
+  image->comps = (opj_image_comp_t *) opj_malloc(image->numcomps * sizeof(opj_image_comp_t));
+  for (i = 0; i < image->numcomps; i++) {
     int tmp, w, h;
-    tmp = cio_read(1);      /* Ssiz_i          */
-    j2k_img->comps[i].prec = (tmp & 0x7f) + 1;
-    j2k_img->comps[i].sgnd = tmp >> 7;
-    j2k_img->comps[i].dx = cio_read(1);   /* XRsiz_i         */
-    j2k_img->comps[i].dy = cio_read(1);   /* YRsiz_i         */
-    w = int_ceildiv(j2k_img->x1 - j2k_img->x0, j2k_img->comps[i].dx);
-    h = int_ceildiv(j2k_img->y1 - j2k_img->y0, j2k_img->comps[i].dy);
-    j2k_img->comps[i].resno_decoded = 0;   /* number of resolution decoded */
-    j2k_img->comps[i].factor = 0;   /* reducing factor by component */
-  }
-  
-  j2k_cp->tw = int_ceildiv(j2k_img->x1 - j2k_cp->tx0, j2k_cp->tdx);
-  j2k_cp->th = int_ceildiv(j2k_img->y1 - j2k_cp->ty0, j2k_cp->tdy);
-  j2k_cp->tcps =
-    (j2k_tcp_t *) calloc(j2k_cp->tw * j2k_cp->th, sizeof(j2k_tcp_t));
-  j2k_cp->tileno = (int *) calloc(j2k_cp->tw * j2k_cp->th, sizeof(int));
-  j2k_cp->tileno_size = 0;
-  
-  for (i = 0; i < j2k_cp->tw * j2k_cp->th; i++) {
-    j2k_cp->tcps[i].POC = 0;
-    j2k_cp->tcps[i].numpocs = 0;
-    j2k_cp->tcps[i].first = 1;
+    tmp = cio_read(cio, 1);    /* Ssiz_i */
+    image->comps[i].prec = (tmp & 0x7f) + 1;
+    image->comps[i].sgnd = tmp >> 7;
+    image->comps[i].dx = cio_read(cio, 1);  /* XRsiz_i */
+    image->comps[i].dy = cio_read(cio, 1);  /* YRsiz_i */
+    
+    /* TODO: unused ? */
+    w = int_ceildiv(image->x1 - image->x0, image->comps[i].dx);
+    h = int_ceildiv(image->y1 - image->y0, image->comps[i].dy);
+
+    image->comps[i].resno_decoded = 0;  /* number of resolution decoded */
+    image->comps[i].factor = 0;      /* reducing factor per component */
   }
   
-  /* Initialization for PPM marker */
-  j2k_cp->ppm = 0;
-  j2k_cp->ppm_data = NULL;
-  j2k_cp->ppm_data_first = NULL;
-  j2k_cp->ppm_previous = 0;
-  j2k_cp->ppm_store = 0;
+  cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx);
+  cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy);
+  cp->tcps = (opj_tcp_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tcp_t));
+  cp->tileno = (int *) opj_malloc(cp->tw * cp->th * sizeof(int));
+  cp->tileno_size = 0;
   
-  j2k_default_tcp.tccps =
-    (j2k_tccp_t *) calloc(sizeof(j2k_tccp_t), j2k_img->numcomps);
-  for (i = 0; i < j2k_cp->tw * j2k_cp->th; i++) {
-    j2k_cp->tcps[i].tccps =
-      (j2k_tccp_t *) calloc(sizeof(j2k_tccp_t), j2k_img->numcomps);
+  for (i = 0; i < cp->tw * cp->th; i++) {
+    cp->tcps[i].POC = 0;
+    cp->tcps[i].numpocs = 0;
+    cp->tcps[i].first = 1;
   }
-  j2k_tile_data =
-    (unsigned char **) calloc(j2k_cp->tw * j2k_cp->th, sizeof(char *));
-  j2k_tile_len = (int *) calloc(j2k_cp->tw * j2k_cp->th, sizeof(int));
-  j2k_state = J2K_STATE_MH;
-  
   
+  /* Initialization for PPM marker */
+  cp->ppm = 0;
+  cp->ppm_data = NULL;
+  cp->ppm_data_first = NULL;
+  cp->ppm_previous = 0;
+  cp->ppm_store = 0;
+  
+  j2k->default_tcp->tccps = (opj_tccp_t *) opj_malloc(sizeof(opj_tccp_t) * image->numcomps);
+  for (i = 0; i < cp->tw * cp->th; i++) {
+    cp->tcps[i].tccps = (opj_tccp_t *) opj_malloc(sizeof(opj_tccp_t) * image->numcomps);
+  }
+  j2k->tile_data = (unsigned char **) opj_malloc(cp->tw * cp->th * sizeof(unsigned char *));
+  j2k->tile_len = (int *) opj_malloc(cp->tw * cp->th * sizeof(int));
+  j2k->state = J2K_STATE_MH;
 }
 
-void j2k_write_com()
-{
+static void j2k_write_com(opj_j2k_t *j2k) {
   unsigned int i;
   int lenp, len;
-  char str[256];
-  sprintf(str, "%s", j2k_cp->comment);
-  
-  cio_write(J2K_MS_COM, 2);
-  lenp = cio_tell();
-  cio_skip(2);
-  cio_write(0, 2);
-  for (i = 0; i < strlen(str); i++) {
-    cio_write(str[i], 1);
+
+  if(j2k->cp->comment) {
+    opj_cio_t *cio = j2k->cio;
+    char *comment = j2k->cp->comment;
+
+    cio_write(cio, J2K_MS_COM, 2);
+    lenp = cio_tell(cio);
+    cio_skip(cio, 2);
+    cio_write(cio, 0, 2);
+    for (i = 0; i < strlen(comment); i++) {
+      cio_write(cio, comment[i], 1);
+    }
+    len = cio_tell(cio) - lenp;
+    cio_seek(cio, lenp);
+    cio_write(cio, len, 2);
+    cio_seek(cio, lenp + len);
   }
-  len = cio_tell() - lenp;
-  cio_seek(lenp);
-  cio_write(len, 2);
-  cio_seek(lenp + len);
-  
 }
 
-void j2k_read_com()
-{
+static void j2k_read_com(opj_j2k_t *j2k) {
   int len;
   
-  len = cio_read(2);
-  cio_skip(len - 2);
-  
+  opj_cio_t *cio = j2k->cio;
+
+  len = cio_read(cio, 2);
+  cio_skip(cio, len - 2);  
 }
 
-void j2k_write_cox(int compno)
-{
+static void j2k_write_cox(opj_j2k_t *j2k, int compno) {
   int i;
-  j2k_tcp_t *tcp;
-  j2k_tccp_t *tccp;
-  tcp = &j2k_cp->tcps[j2k_curtileno];
-  tccp = &tcp->tccps[compno];
+
+  opj_cp_t *cp = j2k->cp;
+  opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
+  opj_tccp_t *tccp = &tcp->tccps[compno];
+  opj_cio_t *cio = j2k->cio;
   
-  cio_write(tccp->numresolutions - 1, 1);   /* SPcox (D) */
-  cio_write(tccp->cblkw - 2, 1);   /* SPcox (E) */
-  cio_write(tccp->cblkh - 2, 1);   /* SPcox (F) */
-  cio_write(tccp->cblksty, 1);   /* SPcox (G) */
-  cio_write(tccp->qmfbid, 1);   /* SPcox (H) */
+  cio_write(cio, tccp->numresolutions - 1, 1);  /* SPcox (D) */
+  cio_write(cio, tccp->cblkw - 2, 1);        /* SPcox (E) */
+  cio_write(cio, tccp->cblkh - 2, 1);        /* SPcox (F) */
+  cio_write(cio, tccp->cblksty, 1);        /* SPcox (G) */
+  cio_write(cio, tccp->qmfbid, 1);        /* SPcox (H) */
   
   if (tccp->csty & J2K_CCP_CSTY_PRT) {
     for (i = 0; i < tccp->numresolutions; i++) {
-      cio_write(tccp->prcw[i] + (tccp->prch[i] << 4), 1);   /* SPcox (I_i) */
+      cio_write(cio, tccp->prcw[i] + (tccp->prch[i] << 4), 1);  /* SPcox (I_i) */
     }
   }
 }
 
-void j2k_read_cox(int compno)
-{
+static void j2k_read_cox(opj_j2k_t *j2k, int compno) {
   int i;
-  j2k_tcp_t *tcp;
-  j2k_tccp_t *tccp;
-  tcp =
-    j2k_state ==
-    J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp;
-  tccp = &tcp->tccps[compno];
-  tccp->numresolutions = cio_read(1) + 1;   /* SPcox (D) */
-  /*Check the reduce value*/
-  j2k_cp->reduce=int_min((tccp->numresolutions)-1,j2k_cp->reduce);
-  tccp->cblkw = cio_read(1) + 2;   /* SPcox (E) */
-  tccp->cblkh = cio_read(1) + 2;   /* SPcox (F) */
-  tccp->cblksty = cio_read(1);   /* SPcox (G) */
-  tccp->qmfbid = cio_read(1);   /* SPcox (H) */
+
+  opj_cp_t *cp = j2k->cp;
+  opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
+  opj_tccp_t *tccp = &tcp->tccps[compno];
+  opj_cio_t *cio = j2k->cio;
+
+  tccp->numresolutions = cio_read(cio, 1) + 1;  /* SPcox (D) */
+
+  /* check the reduce value */
+  cp->reduce = int_min((tccp->numresolutions)-1, cp->reduce);
+  tccp->cblkw = cio_read(cio, 1) + 2;  /* SPcox (E) */
+  tccp->cblkh = cio_read(cio, 1) + 2;  /* SPcox (F) */
+  tccp->cblksty = cio_read(cio, 1);  /* SPcox (G) */
+  tccp->qmfbid = cio_read(cio, 1);  /* SPcox (H) */
   if (tccp->csty & J2K_CP_CSTY_PRT) {
     for (i = 0; i < tccp->numresolutions; i++) {
-      int tmp = cio_read(1);   /* SPcox (I_i) */
+      int tmp = cio_read(cio, 1);  /* SPcox (I_i) */
       tccp->prcw[i] = tmp & 0xf;
       tccp->prch[i] = tmp >> 4;
     }
   }
 }
 
-void j2k_write_cod()
-{
-  j2k_tcp_t *tcp;
+static void j2k_write_cod(opj_j2k_t *j2k) {
+  opj_cp_t *cp = NULL;
+  opj_tcp_t *tcp = NULL;
   int lenp, len;
+
+  opj_cio_t *cio = j2k->cio;
   
-  cio_write(J2K_MS_COD, 2);   /* COD */
+  cio_write(cio, J2K_MS_COD, 2);  /* COD */
   
-  lenp = cio_tell();
-  cio_skip(2);
+  lenp = cio_tell(cio);
+  cio_skip(cio, 2);
   
-  tcp = &j2k_cp->tcps[j2k_curtileno];
-  cio_write(tcp->csty, 1);   /* Scod */
-  cio_write(tcp->prg, 1);   /* SGcod (A) */
-  cio_write(tcp->numlayers, 2);   /* SGcod (B) */
-  cio_write(tcp->mct, 1);   /* SGcod (C) */
+  cp = j2k->cp;
+  tcp = &cp->tcps[j2k->curtileno];
+
+  cio_write(cio, tcp->csty, 1);    /* Scod */
+  cio_write(cio, tcp->prg, 1);    /* SGcod (A) */
+  cio_write(cio, tcp->numlayers, 2);  /* SGcod (B) */
+  cio_write(cio, tcp->mct, 1);    /* SGcod (C) */
   
-  j2k_write_cox(0);
-  len = cio_tell() - lenp;
-  cio_seek(lenp);
-  cio_write(len, 2);      /* Lcod */
-  cio_seek(lenp + len);
+  j2k_write_cox(j2k, 0);
+  len = cio_tell(cio) - lenp;
+  cio_seek(cio, lenp);
+  cio_write(cio, len, 2);    /* Lcod */
+  cio_seek(cio, lenp + len);
 }
 
-void j2k_read_cod()
-{
+static void j2k_read_cod(opj_j2k_t *j2k) {
   int len, i, pos;
-  j2k_tcp_t *tcp;
-  
-  tcp =
-    j2k_state ==
-    J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp;
-  len = cio_read(2);      /* Lcod */
-  tcp->csty = cio_read(1);   /* Scod */
-  tcp->prg = cio_read(1);   /* SGcod (A) */
-  tcp->numlayers = cio_read(2);   /* SGcod (B) */
-  tcp->mct = cio_read(1);   /* SGcod (C) */
-  
-  pos = cio_tell();
-  for (i = 0; i < j2k_img->numcomps; i++) {
+  
+  opj_cio_t *cio = j2k->cio;
+  opj_cp_t *cp = j2k->cp;
+  opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
+  opj_image_t *image = j2k->image;
+  
+  len = cio_read(cio, 2);        /* Lcod */
+  tcp->csty = cio_read(cio, 1);    /* Scod */
+  tcp->prg = (OPJ_PROG_ORDER)cio_read(cio, 1);    /* SGcod (A) */
+  tcp->numlayers = cio_read(cio, 2);  /* SGcod (B) */
+  tcp->mct = cio_read(cio, 1);    /* SGcod (C) */
+  
+  pos = cio_tell(cio);
+  for (i = 0; i < image->numcomps; i++) {
     tcp->tccps[i].csty = tcp->csty & J2K_CP_CSTY_PRT;
-    cio_seek(pos);
-    j2k_read_cox(i);
+    cio_seek(cio, pos);
+    j2k_read_cox(j2k, i);
   }
 }
 
-void j2k_write_coc(int compno)
-{
-  j2k_tcp_t *tcp;
+static void j2k_write_coc(opj_j2k_t *j2k, int compno) {
   int lenp, len;
-  
-  cio_write(J2K_MS_COC, 2);   /* COC */
-  lenp = cio_tell();
-  cio_skip(2);
-  tcp = &j2k_cp->tcps[j2k_curtileno];
-  cio_write(compno, j2k_img->numcomps <= 256 ? 1 : 2);   /* Ccoc */
-  cio_write(tcp->tccps[compno].csty, 1);   /* Scoc */
-  j2k_write_cox(compno);
-  len = cio_tell() - lenp;
-  cio_seek(lenp);
-  cio_write(len, 2);      /* Lcoc */
-  cio_seek(lenp + len);
+
+  opj_cp_t *cp = j2k->cp;
+  opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
+  opj_image_t *image = j2k->image;
+  opj_cio_t *cio = j2k->cio;
+  
+  cio_write(cio, J2K_MS_COC, 2);  /* COC */
+  lenp = cio_tell(cio);
+  cio_skip(cio, 2);
+  cio_write(cio, compno, image->numcomps <= 256 ? 1 : 2);  /* Ccoc */
+  cio_write(cio, tcp->tccps[compno].csty, 1);  /* Scoc */
+  j2k_write_cox(j2k, compno);
+  len = cio_tell(cio) - lenp;
+  cio_seek(cio, lenp);
+  cio_write(cio, len, 2);      /* Lcoc */
+  cio_seek(cio, lenp + len);
 }
 
-void j2k_read_coc()
-{
+static void j2k_read_coc(opj_j2k_t *j2k) {
   int len, compno;
-  j2k_tcp_t *tcp;
-  
-  tcp =
-    j2k_state ==
-    J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp;
-  len = cio_read(2);      /* Lcoc */
-  compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2);   /* Ccoc */
-  tcp->tccps[compno].csty = cio_read(1);   /* Scoc */
-  j2k_read_cox(compno);
+
+  opj_cp_t *cp = j2k->cp;
+  opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
+  opj_image_t *image = j2k->image;
+  opj_cio_t *cio = j2k->cio;
+  
+  len = cio_read(cio, 2);    /* Lcoc */
+  compno = cio_read(cio, image->numcomps <= 256 ? 1 : 2);  /* Ccoc */
+  tcp->tccps[compno].csty = cio_read(cio, 1);  /* Scoc */
+  j2k_read_cox(j2k, compno);
 }
 
-void j2k_write_qcx(int compno)
-{
-  j2k_tcp_t *tcp;
-  j2k_tccp_t *tccp;
+static void j2k_write_qcx(opj_j2k_t *j2k, int compno) {
   int bandno, numbands;
   int expn, mant;
   
-  tcp = &j2k_cp->tcps[j2k_curtileno];
-  tccp = &tcp->tccps[compno];
+  opj_cp_t *cp = j2k->cp;
+  opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
+  opj_tccp_t *tccp = &tcp->tccps[compno];
+  opj_cio_t *cio = j2k->cio;
   
-  cio_write(tccp->qntsty + (tccp->numgbits << 5), 1);   /* Sqcx */
-  numbands =
-    tccp->qntsty ==
-    J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2;
+  cio_write(cio, tccp->qntsty + (tccp->numgbits << 5), 1);  /* Sqcx */
+  numbands = tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2;
   
   for (bandno = 0; bandno < numbands; bandno++) {
     expn = tccp->stepsizes[bandno].expn;
     mant = tccp->stepsizes[bandno].mant;
     
     if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
-      cio_write(expn << 3, 1);   /* SPqcx_i */
+      cio_write(cio, expn << 3, 1);  /* SPqcx_i */
     } else {
-      cio_write((expn << 11) + mant, 2);   /* SPqcx_i */
+      cio_write(cio, (expn << 11) + mant, 2);  /* SPqcx_i */
     }
   }
-  
 }
 
-void j2k_read_qcx(int compno, int len)
-{
+static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len) {
   int tmp;
-  j2k_tcp_t *tcp;
-  j2k_tccp_t *tccp;
   int bandno, numbands;
-  
-  tcp =
-    j2k_state ==
-    J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp;
-  tccp = &tcp->tccps[compno];
-  tmp = cio_read(1);      /* Sqcx */
+
+  opj_cp_t *cp = j2k->cp;
+  opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
+  opj_tccp_t *tccp = &tcp->tccps[compno];
+  opj_cio_t *cio = j2k->cio;
+
+  tmp = cio_read(cio, 1);    /* Sqcx */
   tccp->qntsty = tmp & 0x1f;
   tccp->numgbits = tmp >> 5;
-  numbands =
-    tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : (tccp->qntsty ==
-    J2K_CCP_QNTSTY_NOQNT ?
-    len - 1 : (len - 1) / 2);
+  numbands = (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 
+    1 : ((tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ? len - 1 : (len - 1) / 2);
   for (bandno = 0; bandno < numbands; bandno++) {
     int expn, mant;
     if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
-      expn = cio_read(1) >> 3;   /* SPqcx_i */
+      expn = cio_read(cio, 1) >> 3;  /* SPqcx_i */
       mant = 0;
     } else {
-      tmp = cio_read(2);   /* SPqcx_i */
+      tmp = cio_read(cio, 2);  /* SPqcx_i */
       expn = tmp >> 11;
       mant = tmp & 0x7ff;
     }
@@ -500,200 +620,197 @@ void j2k_read_qcx(int compno, int len)
     tccp->stepsizes[bandno].mant = mant;
   }
   
-  
-  
   /* Add Antonin : if scalar_derived -> compute other stepsizes */
-  
-  
-  
   if (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
-    
     for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) {
-      
-      tccp->stepsizes[bandno].expn =
-   ((tccp->stepsizes[0].expn) - ((bandno - 1) / 3) >
-   0) ? (tccp->stepsizes[0].expn) - ((bandno - 1) / 3) : 0;
-      
+      tccp->stepsizes[bandno].expn = 
+        ((tccp->stepsizes[0].expn) - ((bandno - 1) / 3) > 0) ? 
+          (tccp->stepsizes[0].expn) - ((bandno - 1) / 3) : 0;
       tccp->stepsizes[bandno].mant = tccp->stepsizes[0].mant;
-      
     }
-    
   }
-  
-  
-  
   /* ddA */
 }
 
-void j2k_write_qcd()
-{
+static void j2k_write_qcd(opj_j2k_t *j2k) {
   int lenp, len;
+
+  opj_cio_t *cio = j2k->cio;
   
-  cio_write(J2K_MS_QCD, 2);   /* QCD */
-  lenp = cio_tell();
-  cio_skip(2);
-  j2k_write_qcx(0);
-  len = cio_tell() - lenp;
-  cio_seek(lenp);
-  cio_write(len, 2);      /* Lqcd */
-  cio_seek(lenp + len);
+  cio_write(cio, J2K_MS_QCD, 2);  /* QCD */
+  lenp = cio_tell(cio);
+  cio_skip(cio, 2);
+  j2k_write_qcx(j2k, 0);
+  len = cio_tell(cio) - lenp;
+  cio_seek(cio, lenp);
+  cio_write(cio, len, 2);      /* Lqcd */
+  cio_seek(cio, lenp + len);
 }
 
-void j2k_read_qcd()
-{
+static void j2k_read_qcd(opj_j2k_t *j2k) {
   int len, i, pos;
+
+  opj_cio_t *cio = j2k->cio;
+  opj_image_t *image = j2k->image;
   
-  len = cio_read(2);      /* Lqcd */
-  pos = cio_tell();
-  for (i = 0; i < j2k_img->numcomps; i++) {
-    cio_seek(pos);
-    j2k_read_qcx(i, len - 2);
+  len = cio_read(cio, 2);    /* Lqcd */
+  pos = cio_tell(cio);
+  for (i = 0; i < image->numcomps; i++) {
+    cio_seek(cio, pos);
+    j2k_read_qcx(j2k, i, len - 2);
   }
 }
 
-void j2k_write_qcc(int compno)
-{
+static void j2k_write_qcc(opj_j2k_t *j2k, int compno) {
   int lenp, len;
-  
-  cio_write(J2K_MS_QCC, 2);   /* QCC */
-  lenp = cio_tell();
-  cio_skip(2);
-  cio_write(compno, j2k_img->numcomps <= 256 ? 1 : 2);   /* Cqcc */
-  j2k_write_qcx(compno);
-  len = cio_tell() - lenp;
-  cio_seek(lenp);
-  cio_write(len, 2);      /* Lqcc */
-  cio_seek(lenp + len);
+
+  opj_cio_t *cio = j2k->cio;
+  
+  cio_write(cio, J2K_MS_QCC, 2);  /* QCC */
+  lenp = cio_tell(cio);
+  cio_skip(cio, 2);
+  cio_write(cio, compno, j2k->image->numcomps <= 256 ? 1 : 2);  /* Cqcc */
+  j2k_write_qcx(j2k, compno);
+  len = cio_tell(cio) - lenp;
+  cio_seek(cio, lenp);
+  cio_write(cio, len, 2);      /* Lqcc */
+  cio_seek(cio, lenp + len);
 }
 
-void j2k_read_qcc()
-{
+static void j2k_read_qcc(opj_j2k_t *j2k) {
   int len, compno;
+  int numcomp = j2k->image->numcomps;
+  opj_cio_t *cio = j2k->cio;
   
-  len = cio_read(2);      /* Lqcc */
-  compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2);   /* Cqcc */
-  j2k_read_qcx(compno, len - 2 - (j2k_img->numcomps <= 256 ? 1 : 2));
+  len = cio_read(cio, 2);  /* Lqcc */
+  compno = cio_read(cio, numcomp <= 256 ? 1 : 2);  /* Cqcc */
+  j2k_read_qcx(j2k, compno, len - 2 - (numcomp <= 256 ? 1 : 2));
 }
 
-void j2k_write_poc()
-{
+static void j2k_write_poc(opj_j2k_t *j2k) {
   int len, numpchgs, i;
-  j2k_tcp_t *tcp;
-  j2k_tccp_t *tccp;
+
+  int numcomps = j2k->image->numcomps;
   
-  tcp = &j2k_cp->tcps[j2k_curtileno];
-  tccp = &tcp->tccps[0];
+  opj_cp_t *cp = j2k->cp;
+  opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
+  opj_tccp_t *tccp = &tcp->tccps[0];
+  opj_cio_t *cio = j2k->cio;
+
   numpchgs = tcp->numpocs;
-  cio_write(J2K_MS_POC, 2);   /* POC  */
-  len = 2 + (5 + 2 * (j2k_img->numcomps <= 256 ? 1 : 2)) * numpchgs;
-  cio_write(len, 2);      /* Lpoc */
+  cio_write(cio, J2K_MS_POC, 2);  /* POC  */
+  len = 2 + (5 + 2 * (numcomps <= 256 ? 1 : 2)) * numpchgs;
+  cio_write(cio, len, 2);    /* Lpoc */
   for (i = 0; i < numpchgs; i++) {
-    /* MODIF*/
-    j2k_poc_t *poc;
-    poc = &tcp->pocs[i];
-    cio_write(poc->resno0, 1);   /* RSpoc_i */
-    cio_write(poc->compno0, (j2k_img->numcomps <= 256 ? 1 : 2));   /* CSpoc_i */
-    cio_write(poc->layno1, 2);   /* LYEpoc_i */
+    opj_poc_t *poc = &tcp->pocs[i];
+    cio_write(cio, poc->resno0, 1);  /* RSpoc_i */
+    cio_write(cio, poc->compno0, (numcomps <= 256 ? 1 : 2));  /* CSpoc_i */
+    cio_write(cio, poc->layno1, 2);  /* LYEpoc_i */
     poc->layno1 = int_min(poc->layno1, tcp->numlayers);
-    cio_write(poc->resno1, 1);   /* REpoc_i */
+    cio_write(cio, poc->resno1, 1);  /* REpoc_i */
     poc->resno1 = int_min(poc->resno1, tccp->numresolutions);
-    cio_write(poc->compno1, (j2k_img->numcomps <= 256 ? 1 : 2));   /* CEpoc_i */
-    poc->compno1 = int_min(poc->compno1, j2k_img->numcomps);
-    cio_write(poc->prg, 1);   /* Ppoc_i */
+    cio_write(cio, poc->compno1, (numcomps <= 256 ? 1 : 2));  /* CEpoc_i */
+    poc->compno1 = int_min(poc->compno1, numcomps);
+    cio_write(cio, poc->prg, 1);  /* Ppoc_i */
   }
 }
 
-void j2k_read_poc()
-{
+static void j2k_read_poc(opj_j2k_t *j2k) {
   int len, numpchgs, i, old_poc;
-  j2k_tcp_t *tcp;
-  j2k_tccp_t *tccp;
+
+  int numcomps = j2k->image->numcomps;
   
-  tcp =
-    j2k_state ==
-    J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp;
+  opj_cp_t *cp = j2k->cp;
+  opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
+  opj_tccp_t *tccp = &tcp->tccps[0];
+  opj_cio_t *cio = j2k->cio;
   
   old_poc = tcp->POC ? tcp->numpocs + 1 : 0;
   tcp->POC = 1;
-  tccp = &tcp->tccps[0];
-  len = cio_read(2);      /* Lpoc */
-  numpchgs = (len - 2) / (5 + 2 * (j2k_img->numcomps <= 256 ? 1 : 2));
+  len = cio_read(cio, 2);    /* Lpoc */
+  numpchgs = (len - 2) / (5 + 2 * (numcomps <= 256 ? 1 : 2));
   
   for (i = old_poc; i < numpchgs + old_poc; i++) {
-    j2k_poc_t *poc;
+    opj_poc_t *poc;
     poc = &tcp->pocs[i];
-    poc->resno0 = cio_read(1);   /* RSpoc_i */
-    poc->compno0 = cio_read(j2k_img->numcomps <= 256 ? 1 : 2);   /* CSpoc_i */
-    poc->layno1 = int_min(cio_read(2), (unsigned int) tcp->numlayers);   /* LYEpoc_i */
-    poc->resno1 = int_min(cio_read(1), (unsigned int) tccp->numresolutions);   /* REpoc_i */
-    poc->compno1 = int_min(cio_read(j2k_img->numcomps <= 256 ? 1 : 2), (unsigned int) j2k_img->numcomps);   /* CEpoc_i */
-    poc->prg = cio_read(1);   /* Ppoc_i */
+    poc->resno0 = cio_read(cio, 1);  /* RSpoc_i */
+    poc->compno0 = cio_read(cio, numcomps <= 256 ? 1 : 2);  /* CSpoc_i */
+    poc->layno1 = int_min(cio_read(cio, 2), (unsigned int) tcp->numlayers);  /* LYEpoc_i */
+    poc->resno1 = int_min(cio_read(cio, 1), (unsigned int) tccp->numresolutions);  /* REpoc_i */
+    poc->compno1 = int_min(
+      cio_read(cio, numcomps <= 256 ? 1 : 2), (unsigned int) numcomps);  /* CEpoc_i */
+    poc->prg = (OPJ_PROG_ORDER)cio_read(cio, 1);  /* Ppoc_i */
   }
   
   tcp->numpocs = numpchgs + old_poc - 1;
 }
 
-void j2k_read_crg()
-{
+static void j2k_read_crg(opj_j2k_t *j2k) {
   int len, i, Xcrg_i, Ycrg_i;
   
-  len = cio_read(2);      /* Lcrg */
-  for (i = 0; i < j2k_img->numcomps; i++) {
-    Xcrg_i = cio_read(2);   /* Xcrg_i */
-    Ycrg_i = cio_read(2);   /* Ycrg_i */
+  opj_cio_t *cio = j2k->cio;
+  int numcomps = j2k->image->numcomps;
+  
+  len = cio_read(cio, 2);      /* Lcrg */
+  for (i = 0; i < numcomps; i++) {
+    Xcrg_i = cio_read(cio, 2);  /* Xcrg_i */
+    Ycrg_i = cio_read(cio, 2);  /* Ycrg_i */
   }
 }
 
-void j2k_read_tlm()
-{
+static void j2k_read_tlm(opj_j2k_t *j2k) {
   int len, Ztlm, Stlm, ST, SP, tile_tlm, i;
   long int Ttlm_i, Ptlm_i;
+
+  opj_cio_t *cio = j2k->cio;
   
-  len = cio_read(2);      /* Ltlm */
-  Ztlm = cio_read(1);      /* Ztlm */
-  Stlm = cio_read(1);      /* Stlm */
+  len = cio_read(cio, 2);    /* Ltlm */
+  Ztlm = cio_read(cio, 1);  /* Ztlm */
+  Stlm = cio_read(cio, 1);  /* Stlm */
   ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
   SP = (Stlm >> 6) & 0x01;
   tile_tlm = (len - 4) / ((SP + 1) * 2 + ST);
   for (i = 0; i < tile_tlm; i++) {
-    Ttlm_i = cio_read(ST);   /* Ttlm_i */
-    Ptlm_i = cio_read(SP ? 4 : 2);   /* Ptlm_i */
+    Ttlm_i = cio_read(cio, ST);  /* Ttlm_i */
+    Ptlm_i = cio_read(cio, SP ? 4 : 2);  /* Ptlm_i */
   }
 }
 
-void j2k_read_plm()
-{
+static void j2k_read_plm(opj_j2k_t *j2k) {
   int len, i, Zplm, Nplm, add, packet_len = 0;
   
-  len = cio_read(2);      /* Lplm */
-  Zplm = cio_read(1);      /* Zplm */
+  opj_cio_t *cio = j2k->cio;
+
+  len = cio_read(cio, 2);    /* Lplm */
+  Zplm = cio_read(cio, 1);  /* Zplm */
   len -= 3;
   while (len > 0) {
-    Nplm = cio_read(4);      /* Nplm */
+    Nplm = cio_read(cio, 4);    /* Nplm */
     len -= 4;
     for (i = Nplm; i > 0; i--) {
-      add = cio_read(1);
+      add = cio_read(cio, 1);
       len--;
-      packet_len = (packet_len << 7) + add;   /* Iplm_ij */
+      packet_len = (packet_len << 7) + add;  /* Iplm_ij */
       if ((add & 0x80) == 0) {
-   /* New packet */
-   packet_len = 0;
+        /* New packet */
+        packet_len = 0;
       }
       if (len <= 0)
-   break;
+        break;
     }
   }
 }
 
-void j2k_read_plt()
-{
+static void j2k_read_plt(opj_j2k_t *j2k) {
   int len, i, Zplt, packet_len = 0, add;
   
-  len = cio_read(2);      /* Lplt */
-  Zplt = cio_read(1);      /* Zplt */
+  opj_cio_t *cio = j2k->cio;
+  
+  len = cio_read(cio, 2);    /* Lplt */
+  Zplt = cio_read(cio, 1);  /* Zplt */
   for (i = len - 3; i > 0; i--) {
-    add = cio_read(1);
-    packet_len = (packet_len << 7) + add;   /* Iplt_i */
+    add = cio_read(cio, 1);
+    packet_len = (packet_len << 7) + add;  /* Iplt_i */
     if ((add & 0x80) == 0) {
       /* New packet */
       packet_len = 0;
@@ -701,685 +818,296 @@ void j2k_read_plt()
   }
 }
 
-void j2k_read_ppm()
-{
+static void j2k_read_ppm(opj_j2k_t *j2k) {
   int len, Z_ppm, i, j;
   int N_ppm;
+
+  opj_cp_t *cp = j2k->cp;
+  opj_cio_t *cio = j2k->cio;
   
-  len = cio_read(2);
-  j2k_cp->ppm = 1;
+  len = cio_read(cio, 2);
+  cp->ppm = 1;
   
-  Z_ppm = cio_read(1);      /* Z_ppm */
+  Z_ppm = cio_read(cio, 1);  /* Z_ppm */
   len -= 3;
   while (len > 0) {
-    if (j2k_cp->ppm_previous == 0) {
-      N_ppm = cio_read(4);   /* N_ppm */
+    if (cp->ppm_previous == 0) {
+      N_ppm = cio_read(cio, 4);  /* N_ppm */
       len -= 4;
     } else {
-      N_ppm = j2k_cp->ppm_previous;
+      N_ppm = cp->ppm_previous;
     }
-    
-    j = j2k_cp->ppm_store;
-    if (Z_ppm == 0) {      /* First PPM marker */
-      j2k_cp->ppm_data =
-   (unsigned char *) calloc(N_ppm, sizeof(unsigned char));
-      j2k_cp->ppm_data_first = j2k_cp->ppm_data;
-      
-      j2k_cp->ppm_len = N_ppm;   /*Add antonin : ppmbug1*/
-      
-    } else {         /* NON-first PPM marker */
-      j2k_cp->ppm_data =
-   (unsigned char *) realloc(j2k_cp->ppm_data,
-   (N_ppm +
-   j2k_cp->ppm_store) *
-   sizeof(unsigned char));
-      j2k_cp->ppm_data_first = j2k_cp->ppm_data;
-      
-      j2k_cp->ppm_len = N_ppm + j2k_cp->ppm_store;   /*Add antonin : ppmbug1*/
-      
+    j = cp->ppm_store;
+    if (Z_ppm == 0) {  /* First PPM marker */
+      cp->ppm_data = (unsigned char *) opj_malloc(N_ppm * sizeof(unsigned char));
+      cp->ppm_data_first = cp->ppm_data;
+      cp->ppm_len = N_ppm;
+    } else {      /* NON-first PPM marker */
+      cp->ppm_data = (unsigned char *) opj_realloc(cp->ppm_data, (N_ppm +  cp->ppm_store) * sizeof(unsigned char));
+      cp->ppm_data_first = cp->ppm_data;
+      cp->ppm_len = N_ppm + cp->ppm_store;
     }
-    
-    for (i = N_ppm; i > 0; i--) {   /* Read packet header */
-      j2k_cp->ppm_data[j] = cio_read(1);
+    for (i = N_ppm; i > 0; i--) {  /* Read packet header */
+      cp->ppm_data[j] = cio_read(cio, 1);
       j++;
       len--;
       if (len == 0)
-   break;         /* Case of non-finished packet header in present marker but finished in next one */
+        break;      /* Case of non-finished packet header in present marker but finished in next one */
     }
-    
-    j2k_cp->ppm_previous = i - 1;
-    j2k_cp->ppm_store = j;
+    cp->ppm_previous = i - 1;
+    cp->ppm_store = j;
   }
 }
 
-void j2k_read_ppt()
-{
+static void j2k_read_ppt(opj_j2k_t *j2k) {
   int len, Z_ppt, i, j = 0;
-  j2k_tcp_t *tcp;
-  
-  len = cio_read(2);
-  Z_ppt = cio_read(1);
-  tcp = &j2k_cp->tcps[j2k_curtileno];
+
+  opj_cp_t *cp = j2k->cp;
+  opj_tcp_t *tcp = cp->tcps + j2k->curtileno;
+  opj_cio_t *cio = j2k->cio;
+
+  len = cio_read(cio, 2);
+  Z_ppt = cio_read(cio, 1);
   tcp->ppt = 1;
-  if (Z_ppt == 0) {      /* First PPT marker */
-    tcp->ppt_data =
-      (unsigned char *) calloc(len - 3, sizeof(unsigned char));
+  if (Z_ppt == 0) {    /* First PPT marker */
+    tcp->ppt_data = (unsigned char *) opj_malloc((len - 3) * sizeof(unsigned char));
     tcp->ppt_data_first = tcp->ppt_data;
     tcp->ppt_store = 0;
-    
-    tcp->ppt_len = len - 3;   /*Add antonin : ppmbug1*/
-  } else {         /* NON-first PPT marker */
-    tcp->ppt_data =
-      (unsigned char *) realloc(tcp->ppt_data,
-      (len - 3 +
-      tcp->ppt_store) * sizeof(unsigned char));
+    tcp->ppt_len = len - 3;
+  } else {      /* NON-first PPT marker */
+    tcp->ppt_data =  (unsigned char *) opj_realloc(tcp->ppt_data, (len - 3 + tcp->ppt_store) * sizeof(unsigned char));
     tcp->ppt_data_first = tcp->ppt_data;
-    
-    tcp->ppt_len = len - 3 + tcp->ppt_store;   /*Add antonin : ppmbug1*/
-    
+    tcp->ppt_len = len - 3 + tcp->ppt_store;
   }
-  
   j = tcp->ppt_store;
   for (i = len - 3; i > 0; i--) {
-    tcp->ppt_data[j] = cio_read(1);
+    tcp->ppt_data[j] = cio_read(cio, 1);
     j++;
   }
   tcp->ppt_store = j;
 }
 
-void j2k_write_sot()
-{
+static void j2k_write_sot(opj_j2k_t *j2k) {
   int lenp, len;
-  
-  j2k_sot_start = cio_tell();
-  cio_write(J2K_MS_SOT, 2);   /* SOT */
-  lenp = cio_tell();
-  cio_skip(2);         /* Lsot (further) */
-  cio_write(j2k_curtileno, 2);   /* Isot */
-  cio_skip(4);         /* Psot (further in j2k_write_sod) */
-  cio_write(0, 1);      /* TPsot */
-  cio_write(1, 1);      /* TNsot */
-  len = cio_tell() - lenp;
-  cio_seek(lenp);
-  cio_write(len, 2);      /* Lsot */
-  cio_seek(lenp + len);
+
+  opj_cio_t *cio = j2k->cio;
+
+  j2k->sot_start = cio_tell(cio);
+  cio_write(cio, J2K_MS_SOT, 2);    /* SOT */
+  lenp = cio_tell(cio);
+  cio_skip(cio, 2);          /* Lsot (further) */
+  cio_write(cio, j2k->curtileno, 2);  /* Isot */
+  cio_skip(cio, 4);          /* Psot (further in j2k_write_sod) */
+  cio_write(cio, 0, 1);        /* TPsot */
+  cio_write(cio, 1, 1);        /* TNsot */
+  len = cio_tell(cio) - lenp;
+  cio_seek(cio, lenp);
+  cio_write(cio, len, 2);        /* Lsot */
+  cio_seek(cio, lenp + len);
 }
 
-void j2k_read_sot()
-{
+static void j2k_read_sot(opj_j2k_t *j2k) {
   int len, tileno, totlen, partno, numparts, i;
-  j2k_tcp_t *tcp;
-  j2k_tccp_t *tmp;
+  opj_tcp_t *tcp = NULL;
   char status = 0;
+
+  opj_cp_t *cp = j2k->cp;
+  opj_cio_t *cio = j2k->cio;
   
-  len = cio_read(2);
-  tileno = cio_read(2);
+  len = cio_read(cio, 2);
+  tileno = cio_read(cio, 2);
   
-  if (j2k_cp->tileno_size == 0) {
-    j2k_cp->tileno[j2k_cp->tileno_size] = tileno;
-    j2k_cp->tileno_size++;
+  if (cp->tileno_size == 0) {
+    cp->tileno[cp->tileno_size] = tileno;
+    cp->tileno_size++;
   } else {
     i = 0;
-    while (i < j2k_cp->tileno_size && status == 0) {
-      status = j2k_cp->tileno[i] == tileno ? 1 : 0;
+    while (i < cp->tileno_size && status == 0) {
+      status = cp->tileno[i] == tileno ? 1 : 0;
       i++;
     }
     if (status == 0) {
-      j2k_cp->tileno[j2k_cp->tileno_size] = tileno;
-      j2k_cp->tileno_size++;
+      cp->tileno[cp->tileno_size] = tileno;
+      cp->tileno_size++;
     }
   }
   
-  totlen = cio_read(4);
+  totlen = cio_read(cio, 4);
   if (!totlen)
-    totlen = cio_numbytesleft() + 8;
+    totlen = cio_numbytesleft(cio) + 8;
   
-  partno = cio_read(1);
-  numparts = cio_read(1);
+  partno = cio_read(cio, 1);
+  numparts = cio_read(cio, 1);
   
-  j2k_curtileno = tileno;
-  j2k_eot = cio_getbp() - 12 + totlen;
-  j2k_state = J2K_STATE_TPH;
-  tcp = &j2k_cp->tcps[j2k_curtileno];
+  j2k->curtileno = tileno;
+  j2k->eot = cio_getbp(cio) - 12 + totlen;
+  j2k->state = J2K_STATE_TPH;
+  tcp = &cp->tcps[j2k->curtileno];
   
   if (tcp->first == 1) {
-    tmp = tcp->tccps;
-    *tcp = j2k_default_tcp;
     
     /* Initialization PPT */
+    opj_tccp_t *tmp = tcp->tccps;
+    memcpy(tcp, j2k->default_tcp, sizeof(opj_tcp_t));
     tcp->ppt = 0;
     tcp->ppt_data = NULL;
     tcp->ppt_data_first = NULL;
-    
     tcp->tccps = tmp;
-    for (i = 0; i < j2k_img->numcomps; i++) {
-      tcp->tccps[i] = j2k_default_tcp.tccps[i];
+
+    for (i = 0; i < j2k->image->numcomps; i++) {
+      tcp->tccps[i] = j2k->default_tcp->tccps[i];
     }
-    j2k_cp->tcps[j2k_curtileno].first = 0;
+    cp->tcps[j2k->curtileno].first = 0;
   }
 }
 
-void j2k_write_sod()
-{
+static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder) {
   int l, layno;
   int totlen;
-  j2k_tcp_t *tcp;
-  static int j2k_sod_start;
+  opj_tcp_t *tcp = NULL;
+  opj_image_info_t *image_info = NULL;
   
-  cio_write(J2K_MS_SOD, 2);
-  if (j2k_curtileno == 0) {
-    j2k_sod_start = cio_tell() + pos_correction;
+  opj_tcd_t *tcd = (opj_tcd_t*)tile_coder;  /* cast is needed because of conflicts in header inclusions */
+  opj_cp_t *cp = j2k->cp;
+  opj_cio_t *cio = j2k->cio;
+  
+  cio_write(cio, J2K_MS_SOD, 2);
+  if (j2k->curtileno == 0) {
+    j2k->sod_start = cio_tell(cio) + j2k->pos_correction;
   }
   
   /* INDEX >> */
-  if (info_IM.index_on) {
-    info_IM.tile[j2k_curtileno].end_header =
-      cio_tell() + pos_correction - 1;
+  image_info = j2k->image_info;
+  if (image_info && image_info->index_on) {
+    image_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction - 1;
   }
   /* << INDEX */
   
-  tcp = &j2k_cp->tcps[j2k_curtileno];
+  tcp = &cp->tcps[j2k->curtileno];
   for (layno = 0; layno < tcp->numlayers; layno++) {
-    tcp->rates[layno] -= tcp->rates[layno] ? (j2k_sod_start / (j2k_cp->th * j2k_cp->tw)) : 0;   /*Mod antonin losslessbug*/
+    tcp->rates[layno] -= tcp->rates[layno] ? (j2k->sod_start / (cp->th * cp->tw)) : 0;
+  }
+  if(image_info) {
+    image_info->num = 0;
   }
   
-  info_IM.num = 0;
-  if (j2k_cp->decod_format != PGX_DFMT)
-    l = tcd_encode_tile_pxm(j2k_curtileno, cio_getbp(),
-    cio_numbytesleft() - 2, &info_IM);
-  else
-    l = tcd_encode_tile_pgx(j2k_curtileno, cio_getbp(),
-    cio_numbytesleft() - 2, &info_IM);
+  l = tcd_encode_tile(tcd, j2k->curtileno, cio_getbp(cio), cio_numbytesleft(cio) - 2, image_info);
   
   /* Writing Psot in SOT marker */
-  totlen = cio_tell() + l - j2k_sot_start;
-  cio_seek(j2k_sot_start + 6);
-  cio_write(totlen, 4);
-  cio_seek(j2k_sot_start + totlen);
+  totlen = cio_tell(cio) + l - j2k->sot_start;
+  cio_seek(cio, j2k->sot_start + 6);
+  cio_write(cio, totlen, 4);
+  cio_seek(cio, j2k->sot_start + totlen);
 }
 
-void j2k_read_sod()
-{
+static void j2k_read_sod(opj_j2k_t *j2k) {
   int len, truncate = 0, i;
-  unsigned char *data;
-  
-  len = int_min(j2k_eot - cio_getbp(), cio_numbytesleft() + 1);
-  
-  if (len == cio_numbytesleft() + 1)
-    truncate = 1;      /* Case of a truncate codestream */
-  
-  data =
-    (unsigned char *) malloc((j2k_tile_len[j2k_curtileno] + len) *
-    sizeof(unsigned char));
-  for (i = 0; i < j2k_tile_len[j2k_curtileno]; i++)
-    data[i] = j2k_tile_data[j2k_curtileno][i];
-  for (i = 0; i < len; i++)
-    data[i + j2k_tile_len[j2k_curtileno]] = cio_read(1);
-  
-  j2k_tile_len[j2k_curtileno] += len;
-  free(j2k_tile_data[j2k_curtileno]);
-  j2k_tile_data[j2k_curtileno] = data;
-  data = NULL;
-  
-  if (!truncate)
-    j2k_state = J2K_STATE_TPHSOT;
-  else
-    j2k_state = J2K_STATE_NEOC;   /* RAJOUTE !! */
-}
+  unsigned char *data = NULL, *data_ptr = NULL;
 
-void j2k_write_rgn(int compno, int tileno)
-{
-  j2k_tcp_t *tcp = &j2k_cp->tcps[tileno];
+  opj_cio_t *cio = j2k->cio;
+  int curtileno = j2k->curtileno;
   
-  cio_write(J2K_MS_RGN, 2);   /* RGN  */
-  cio_write(j2k_img->numcomps <= 256 ? 5 : 6, 2);   /* Lrgn */
-  cio_write(compno, j2k_img->numcomps <= 256 ? 1 : 2);   /* Crgn */
-  cio_write(0, 1);      /* Srgn */
-  cio_write(tcp->tccps[compno].roishift, 1);   /* SPrgn */
-}
-
-void j2k_read_rgn()
-{
-  int len, compno, roisty;
-  j2k_tcp_t *tcp;
-  
-  tcp =
-    j2k_state ==
-    J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp;
-  len = cio_read(2);      /* Lrgn */
-  compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2);   /* Crgn */
-  roisty = cio_read(1);      /* Srgn */
-  tcp->tccps[compno].roishift = cio_read(1);   /* SPrgn */
-}
-
-void j2k_write_eoc()
-{
-  /* fprintf(stderr, "%.8x: EOC\n", cio_tell() + pos_correction); */
-  cio_write(J2K_MS_EOC, 2);
-}
-
-void j2k_read_eoc()
-{
-  int i, tileno;
-
-#ifndef NO_PACKETS_DECODING  
-  tcd_init(j2k_img, j2k_cp);
-#endif
+  len = int_min(j2k->eot - cio_getbp(cio), cio_numbytesleft(cio) + 1);
   
-  for (i = 0; i < j2k_cp->tileno_size; i++) {
-    tileno = j2k_cp->tileno[i];
-#ifndef NO_PACKETS_DECODING  
-    tcd_decode_tile(j2k_tile_data[tileno], j2k_tile_len[tileno], tileno);
-#endif
-    free(j2k_tile_data[tileno]);
+  if (len == cio_numbytesleft(cio) + 1) {
+    truncate = 1;    /* Case of a truncate codestream */
   }
   
-  j2k_state = J2K_STATE_MT;
-  longjmp(j2k_error, 1);
-}
-
-void j2k_read_unk()
-{
-  fprintf(stderr, "warning: unknown marker\n");
-}
+  data = (unsigned char *) opj_malloc((j2k->tile_len[curtileno] + len) * sizeof(unsigned char));
 
-LIBJ2K_API int
-j2k_encode(j2k_image_t * img, j2k_cp_t * cp, char *output,
-      int len, char *index)
-{
-  int tileno, compno, layno, resno, precno, pack_nb, x, y;
-  unsigned char *dest = NULL;
-  FILE *INDEX = NULL;
-  FILE *f = NULL;
-  
-  if (setjmp(j2k_error)) {
-    return 0;
-  }
-  
-  if (cp->intermed_file == 1) {
-    f = fopen(output, "wb");
-    if (!f) {
-      fprintf(stderr, "failed to open %s for writing\n", output);
-      return 1;
-    }
-    dest = (unsigned char *) malloc(len);
-    cio_init(dest, len);
-  }
-  
-  j2k_img = img;
-  j2k_cp = cp;
-  /* j2k_dump_cp(j2k_img, j2k_cp); */
-  
-  /* INDEX >> */
-  info_IM.index_on = j2k_cp->index_on;
-  if (info_IM.index_on) {
-    info_IM.tile =
-      (info_tile *) malloc(j2k_cp->tw * j2k_cp->th * sizeof(info_tile));
-    info_IM.Im_w = j2k_img->x1 - j2k_img->x0;
-    info_IM.Im_h = j2k_img->y1 - j2k_img->y0;
-    info_IM.Prog = (&j2k_cp->tcps[0])->prg;
-    info_IM.tw = j2k_cp->tw;
-    info_IM.th = j2k_cp->th;
-    info_IM.Tile_x = j2k_cp->tdx;   /* new version parser */
-    info_IM.Tile_y = j2k_cp->tdy;   /* new version parser */
-    info_IM.Tile_Ox = j2k_cp->tx0;   /* new version parser */
-    info_IM.Tile_Oy = j2k_cp->ty0;   /* new version parser */
-    info_IM.Comp = j2k_img->numcomps;
-    info_IM.Layer = (&j2k_cp->tcps[0])->numlayers;
-    info_IM.Decomposition = (&j2k_cp->tcps[0])->tccps->numresolutions - 1;
-    info_IM.D_max = 0;      /* ADD Marcela */
-  }
-  /* << INDEX */
-  
-  j2k_write_soc();
-  j2k_write_siz();
-  j2k_write_cod();
-  j2k_write_qcd();
-  for (compno = 0; compno < j2k_img->numcomps; compno++) {
-    j2k_tcp_t *tcp = &j2k_cp->tcps[0];
-    if (tcp->tccps[compno].roishift)
-      j2k_write_rgn(compno, 0);
-  }
-  if (j2k_cp->comment != NULL)
-    j2k_write_com();
-  
-  if (cp->intermed_file == 1) {
-    /* Writing the main header */
-    pos_correction = cio_tell();
-    fwrite(dest, 1, cio_tell(), f);
-  }
-  
-  /* INDEX >> */
-  if (info_IM.index_on) {
-    info_IM.Main_head_end = cio_tell() - 1;
-  }
-  /* << INDEX */
-  
-  
-  for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
-    fprintf(stdout, "Tile number %d / %d ", tileno + 1, cp->tw * cp->th);
-    
-    if (cp->intermed_file == 1) {
-      /* new dest for each tile  */
-      free(dest);
-      dest = (unsigned char *) malloc(len);
-      cio_init(dest, len);
-    }
-    j2k_curtileno = tileno;
-    /* initialisation before tile encoding  */
-    
-    if (tileno == 0) {
-      tcd_malloc_encode(j2k_img, j2k_cp, j2k_curtileno);
-    } else {
-      tcd_init_encode(j2k_img, j2k_cp, j2k_curtileno);
-    }
-    
-    /* INDEX >> */
-    if (info_IM.index_on) {
-      info_IM.tile[j2k_curtileno].num_tile = j2k_curtileno;
-      info_IM.tile[j2k_curtileno].start_pos = cio_tell() + pos_correction;
-    }
-    /* << INDEX */
-    j2k_write_sot();
-    
-    for (compno = 1; compno < img->numcomps; compno++) {
-      j2k_write_coc(compno);
-      j2k_write_qcc(compno);
-    }
-    
-    if (cp->tcps[tileno].numpocs)
-      j2k_write_poc();
-    j2k_write_sod();
-    
-    /* INDEX >> */
-    if (info_IM.index_on) {
-      info_IM.tile[j2k_curtileno].end_pos =
-   cio_tell() + pos_correction - 1;
-    }
-    /* << INDEX */
-    
-    /*
-    if (tile->PPT)  BAD PPT !!!
-    {
-    FILE *PPT_file;
-    
-     int i;
-     PPT_file=fopen("PPT","rb");
-     fprintf(stderr,"%c%c%c%c",255,97,tile->len_ppt/256,tile->len_ppt%256);
-     for (i=0;i<tile->len_ppt;i++)
-     {
-     unsigned char elmt;
-     fread(&elmt, 1, 1, PPT_file);
-     fwrite(&elmt,1,1,f);
-     }
-     fclose(PPT_file);
-     unlink("PPT");
-     }
-    */
-    if (cp->intermed_file == 1) {
-      fwrite(dest, 1, cio_tell(), f);
-      pos_correction = cio_tell() + pos_correction;
-    }
+  for (i = 0; i < j2k->tile_len[curtileno]; i++) {
+    data[i] = j2k->tile_data[curtileno][i];
   }
-  
-  if (cp->intermed_file == 1) {
-    free(dest);
-    dest = (unsigned char *) malloc(len);
-    cio_init(dest, len);
+
+  data_ptr = data + j2k->tile_len[curtileno];
+  for (i = 0; i < len; i++) {
+    data_ptr[i] = cio_read(cio, 1);
   }
   
-  j2k_write_eoc();
+  j2k->tile_len[curtileno] += len;
+  opj_free(j2k->tile_data[curtileno]);
+  j2k->tile_data[curtileno] = data;
   
-  if (cp->intermed_file == 1) {
-    fwrite(dest, 1, 2, f);
-    free(dest);
-    /* closing file *.j2k */
-    fclose(f);
+  if (!truncate) {
+    j2k->state = J2K_STATE_TPHSOT;
+  } else {
+    j2k->state = J2K_STATE_NEOC;  /* RAJOUTE !! */
   }
+}
+
+static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno) {
   
-  /* Creation of the index file     */
+  opj_cp_t *cp = j2k->cp;
+  opj_tcp_t *tcp = &cp->tcps[tileno];
+  opj_cio_t *cio = j2k->cio;
+  int numcomps = j2k->image->numcomps;
   
-  if (info_IM.index_on) {
-    
-    double DistoTotal = 0;
-    
-    info_IM.codestream_size = cio_tell() + pos_correction;   /* Correction 14/4/03 suite rmq de Patrick */
-    
-    INDEX = fopen(index, "w");
-    
-    
-    
-    if (!INDEX) {
-      
-      fprintf(stderr, "failed to open %s for writing\n", index);
-      
-      return 1;
-      
-    }
-    
-    fprintf(INDEX, "%d %d\n", info_IM.Im_w, info_IM.Im_h);
-
-    fprintf(INDEX, "%d\n", info_IM.Prog);
-
-    fprintf(INDEX, "%d %d\n", info_IM.Tile_x, info_IM.Tile_y);
-
-    fprintf(INDEX, "%d %d\n", info_IM.tw, info_IM.th);
-
-    fprintf(INDEX, "%d\n", info_IM.Comp);
-
-    fprintf(INDEX, "%d\n", info_IM.Layer);
-
-    fprintf(INDEX, "%d\n", info_IM.Decomposition);
-
-    for (resno = info_IM.Decomposition; resno >= 0; resno--) {
-
-      fprintf(INDEX, "[%d,%d] ", (1 << info_IM.tile[0].pdx[resno]), (1 << info_IM.tile[0].pdx[resno]));   /*based on tile 0*/
-
-    }
-
-    fprintf(INDEX, "\n");
-
-    fprintf(INDEX, "%d\n", info_IM.Main_head_end);
-
-    fprintf(INDEX, "%d\n", info_IM.codestream_size);
-
-    for (tileno = 0; tileno < info_IM.tw * info_IM.th; tileno++) {
-
-      fprintf(INDEX, "%4d %9d %9d %9d %9e %9d %9e\n",
-         info_IM.tile[tileno].num_tile,
-         info_IM.tile[tileno].start_pos,
-         info_IM.tile[tileno].end_header,
-         info_IM.tile[tileno].end_pos,
-         info_IM.tile[tileno].distotile, info_IM.tile[tileno].nbpix,
-         info_IM.tile[tileno].distotile / info_IM.tile[tileno].nbpix);
-
-    }
+  cio_write(cio, J2K_MS_RGN, 2);            /* RGN  */
+  cio_write(cio, numcomps <= 256 ? 5 : 6, 2);      /* Lrgn */
+  cio_write(cio, compno, numcomps <= 256 ? 1 : 2);  /* Crgn */
+  cio_write(cio, 0, 1);                /* Srgn */
+  cio_write(cio, tcp->tccps[compno].roishift, 1);    /* SPrgn */
+}
 
-    for (tileno = 0; tileno < info_IM.tw * info_IM.th; tileno++) {
+static void j2k_read_rgn(opj_j2k_t *j2k) {
+  int len, compno, roisty;
 
-      int start_pos, end_pos;
+  opj_cp_t *cp = j2k->cp;
+  opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] : j2k->default_tcp;
+  opj_cio_t *cio = j2k->cio;
+  int numcomps = j2k->image->numcomps;
 
-      double disto = 0;
+  len = cio_read(cio, 2);                    /* Lrgn */
+  compno = cio_read(cio, numcomps <= 256 ? 1 : 2);      /* Crgn */
+  roisty = cio_read(cio, 1);                  /* Srgn */
+  tcp->tccps[compno].roishift = cio_read(cio, 1);        /* SPrgn */
+}
 
-      pack_nb = 0;
+static void j2k_write_eoc(opj_j2k_t *j2k) {
+  opj_cio_t *cio = j2k->cio;
+  /* opj_event_msg(j2k->cinfo, "%.8x: EOC\n", cio_tell(cio) + j2k->pos_correction); */
+  cio_write(cio, J2K_MS_EOC, 2);
+}
 
-      /* fprintf(INDEX,
+static void j2k_read_eoc(opj_j2k_t *j2k) {
+  int i, tileno;
 
-         "pkno tileno layerno resno compno precno start_pos   end_pos       deltaSE        \n"); */
-      
-      if (info_IM.Prog == 0) {   /* LRCP */
-   /*fprintf(INDEX, "pack_nb tileno layno resno compno precno start_pos  end_pos   disto");*/
-   for (layno = 0; layno < info_IM.Layer; layno++) {
-     for (resno = 0; resno < info_IM.Decomposition + 1; resno++) {
-       for (compno = 0; compno < info_IM.Comp; compno++) {
-         for (precno = 0;
-         precno <
-      info_IM.tile[tileno].pw[resno] * info_IM.tile[tileno].ph[resno];
-         precno++) {
-      start_pos = info_IM.tile[tileno].packet[pack_nb].start_pos;
-      end_pos = info_IM.tile[tileno].packet[pack_nb].end_pos;
-      disto = info_IM.tile[tileno].packet[pack_nb].disto;
-      fprintf(INDEX, "%4d %6d %7d %5d %6d %6d %9d %9d %8e\n",
-        pack_nb, tileno, layno, resno, compno, precno,
-        start_pos, end_pos, disto);
-      DistoTotal += disto;
-      pack_nb++;
-         }
-       }
-     }
-   }
-      } else if (info_IM.Prog == 1) {   /* RLCP */
-   /*fprintf(INDEX, "pack_nb tileno resno layno compno precno start_pos  end_pos   disto");*/
-   for (resno = 0; resno < info_IM.Decomposition + 1; resno++) {
-     for (layno = 0; layno < info_IM.Layer; layno++) {
-       for (compno = 0; compno < info_IM.Comp; compno++) {
-         for (precno = 0; precno < info_IM.tile[tileno].pw[resno] * info_IM.tile[tileno].ph[resno]; precno++) {
-      start_pos = info_IM.tile[tileno].packet[pack_nb].start_pos;
-      end_pos = info_IM.tile[tileno].packet[pack_nb].end_pos;
-      disto = info_IM.tile[tileno].packet[pack_nb].disto;
-      fprintf(INDEX, "%4d %6d %5d %7d %6d %6d %9d %9d %8e\n",
-        pack_nb, tileno, resno, layno, compno, precno,
-        start_pos, end_pos, disto);
-      DistoTotal += disto;
-      pack_nb++;
-         }
-       }
-     }
-   }
-      } else if (info_IM.Prog == 2) {   /* RPCL */
-   /*fprintf(INDEX, "\npack_nb tileno resno precno compno layno start_pos  end_pos   disto\n"); */
-   for (resno = 0; resno < info_IM.Decomposition + 1; resno++) {
-     /* I suppose components have same XRsiz, YRsiz */
-     int x0 = info_IM.Tile_Ox + tileno - (int)floor( tileno/info_IM.tw ) * info_IM.tw * info_IM.Tile_x;
-     int y0 = info_IM.Tile_Ox + (int)floor( tileno/info_IM.tw ) * info_IM.Tile_y;
-     int x1 = x0 + info_IM.Tile_x;
-     int y1 = y0 + info_IM.Tile_y;
-     for (y=y0; y<y1; y++) {
-       for (x=x0; x<x1; x++) {
-         for (compno = 0; compno < info_IM.Comp; compno++) {
-      int prec_max = info_IM.tile[tileno].pw[resno] * info_IM.tile[tileno].ph[resno];
-      for (precno = 0; precno < prec_max; precno++) {
-        int pcnx = info_IM.tile[tileno].pw[resno];
-        int pcx = (int) pow( 2, info_IM.tile[tileno].pdx[resno] + info_IM.Decomposition - resno );
-        int pcy = (int) pow( 2, info_IM.tile[tileno].pdy[resno] + info_IM.Decomposition - resno );
-        int precno_x = precno - (int) floor( precno/pcnx ) * pcnx;
-        int precno_y = (int) floor( precno/pcnx );                     
-        if (precno_y*pcy == y ) {
-          if (precno_x*pcx == x ) {
-            for (layno = 0; layno < info_IM.Layer; layno++) {
-         start_pos = info_IM.tile[tileno].packet[pack_nb].start_pos;
-         end_pos = info_IM.tile[tileno].packet[pack_nb].end_pos;
-         disto = info_IM.tile[tileno].packet[pack_nb].disto;
-         fprintf(INDEX, "%4d %6d %5d %6d %6d %7d %9d %9d %8e\n",
-           pack_nb, tileno, resno, precno, compno, layno,
-           start_pos, end_pos, disto); 
-         DistoTotal += disto;
-         pack_nb++; 
-            }
-          }
-        }
-      }
-         }
-       }
-     }
-   }
-      } else if (info_IM.Prog == 3) {   /* PCRL */
-   /* I suppose components have same XRsiz, YRsiz*/ 
-   int x0 = info_IM.Tile_Ox + tileno - (int)floor( tileno/info_IM.tw ) * info_IM.tw * info_IM.Tile_x;
-   int y0 = info_IM.Tile_Ox + (int)floor( tileno/info_IM.tw ) * info_IM.Tile_y;
-   int x1 = x0 + info_IM.Tile_x;
-   int y1 = y0 + info_IM.Tile_y;
-   
-   /*fprintf(INDEX, "\npack_nb tileno precno compno resno layno start_pos  end_pos   disto\n"); */
-   for (y=y0; y<y1; y++) {
-     for (x=x0; x<x1; x++) {
-       for (compno = 0; compno < info_IM.Comp; compno++) {
-         for (resno = 0; resno < info_IM.Decomposition + 1; resno++) {
-      int prec_max = info_IM.tile[tileno].pw[resno] * info_IM.tile[tileno].ph[resno];
-      for (precno = 0; precno < prec_max; precno++) {
-        int pcnx = info_IM.tile[tileno].pw[resno];
-        int pcx = (int) pow( 2, info_IM.tile[tileno].pdx[resno] + info_IM.Decomposition - resno );
-        int pcy = (int) pow( 2, info_IM.tile[tileno].pdy[resno] + info_IM.Decomposition - resno );
-        int precno_x = precno - (int) floor( precno/pcnx ) * pcnx;
-        int precno_y = (int) floor( precno/pcnx );                     
-        if (precno_y*pcy == y ) {
-          if (precno_x*pcx == x ) {
-            for (layno = 0; layno < info_IM.Layer; layno++) {
-         start_pos = info_IM.tile[tileno].packet[pack_nb].start_pos;
-         end_pos = info_IM.tile[tileno].packet[pack_nb].end_pos;
-         disto = info_IM.tile[tileno].packet[pack_nb].disto;
-         fprintf(INDEX, "%4d %6d %6d %6d %5d %7d %9d %9d %8e\n",
-           pack_nb, tileno, precno, compno, resno, layno,
-           start_pos, end_pos, disto); 
-         DistoTotal += disto;
-         pack_nb++; 
-            }
-          }
-        }
-      }
-         }
-       }
-     }
-   }
-      } else {         /* CPRL */
-   /*fprintf(INDEX, "\npack_nb tileno compno precno resno layno start_pos  end_pos   disto\n"); */
-   for (compno = 0; compno < info_IM.Comp; compno++) {
-     /* I suppose components have same XRsiz, YRsiz */
-     int x0 = info_IM.Tile_Ox + tileno - (int)floor( tileno/info_IM.tw ) * info_IM.tw * info_IM.Tile_x;
-     int y0 = info_IM.Tile_Ox + (int)floor( tileno/info_IM.tw ) * info_IM.Tile_y;
-     int x1 = x0 + info_IM.Tile_x;
-     int y1 = y0 + info_IM.Tile_y;
-     for (y=y0; y<y1; y++) {
-       for (x=x0; x<x1; x++) {
-         for (resno = 0; resno < info_IM.Decomposition + 1; resno++) {
-      int prec_max = info_IM.tile[tileno].pw[resno] * info_IM.tile[tileno].ph[resno];
-      for (precno = 0; precno < prec_max; precno++) {
-        int pcnx = info_IM.tile[tileno].pw[resno];
-        int pcx = (int) pow( 2, info_IM.tile[tileno].pdx[resno] + info_IM.Decomposition - resno );
-        int pcy = (int) pow( 2, info_IM.tile[tileno].pdy[resno] + info_IM.Decomposition - resno );
-        int precno_x = precno - (int) floor( precno/pcnx ) * pcnx;
-        int precno_y = (int) floor( precno/pcnx );                     
-        if (precno_y*pcy == y ) {
-          if (precno_x*pcx == x ) {
-            for (layno = 0; layno < info_IM.Layer; layno++) {
-         start_pos = info_IM.tile[tileno].packet[pack_nb].start_pos;
-         end_pos = info_IM.tile[tileno].packet[pack_nb].end_pos;
-         disto = info_IM.tile[tileno].packet[pack_nb].disto;
-         fprintf(INDEX, "%4d %6d %6d %6d %5d %7d %9d %9d %8e\n",
-           pack_nb, tileno, compno, precno, resno, layno, start_pos, end_pos, disto); 
-         DistoTotal += disto;
-         pack_nb++; 
-            }
-          }
-        }
-      }
-         }
-       }
-     }
-   }
-      }   
-    }
-    
-    fprintf(INDEX, "%8e\n", info_IM.D_max); /*SE max*/
-    
-    fprintf(INDEX, "%.8e\n", DistoTotal); /* SE totale*/
-    
-    fclose(INDEX);
-    
+#ifndef NO_PACKETS_DECODING  
+  opj_tcd_t *tcd = tcd_create(j2k->cinfo);
+  tcd_malloc_decode(tcd, j2k->image, j2k->cp);
+  for (i = 0; i < j2k->cp->tileno_size; i++) {
+    tileno = j2k->cp->tileno[i];
+    tcd_decode_tile(tcd, j2k->tile_data[tileno], j2k->tile_len[tileno], tileno);
+    opj_free(j2k->tile_data[tileno]);
+    j2k->tile_data[tileno] = NULL;
   }
+  tcd_free_decode(tcd);
+  tcd_destroy(tcd);
+#else 
+  for (i = 0; i < j2k->cp->tileno_size; i++) {
+    tileno = j2k->cp->tileno[i];
+    opj_free(j2k->tile_data[tileno]);
+    j2k->tile_data[tileno] = NULL;
+  }
+#endif
   
-  j2k_clean();
-  
-  return cio_tell();
+  j2k->state = J2K_STATE_MT;
 }
 
-typedef struct {
+static void j2k_read_unk(opj_j2k_t *j2k) {
+  opj_event_msg(j2k->cinfo, EVT_WARNING, "Unknown marker\n");
+}
+
+typedef struct opj_dec_mstabent {
+  /** marker value */
   int id;
+  /** value of the state when the marker can appear */
   int states;
-  void (*handler) ();
-} j2k_dec_mstabent_t;
+  /** action linked to the marker */
+  void (*handler) (opj_j2k_t *j2k);
+} opj_dec_mstabent_t;
 
-j2k_dec_mstabent_t j2k_dec_mstab[] = {
+opj_dec_mstabent_t j2k_dec_mstab[] = {
   {J2K_MS_SOC, J2K_STATE_MHSOC, j2k_read_soc},
   {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, j2k_read_sot},
   {J2K_MS_SOD, J2K_STATE_TPH, j2k_read_sod},
@@ -1402,9 +1130,12 @@ j2k_dec_mstabent_t j2k_dec_mstab[] = {
   {0, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_unk}
 };
 
-j2k_dec_mstabent_t *j2k_dec_mstab_lookup(int id)
-{
-  j2k_dec_mstabent_t *e;
+/**
+Read the lookup table containing all the marker, status and action
+@param id Marker value
+*/
+static opj_dec_mstabent_t *j2k_dec_mstab_lookup(int id) {
+  opj_dec_mstabent_t *e;
   for (e = j2k_dec_mstab; e->id != 0; e++) {
     if (e->id == id) {
       break;
@@ -1413,190 +1144,781 @@ j2k_dec_mstabent_t *j2k_dec_mstab_lookup(int id)
   return e;
 }
 
+/* ----------------------------------------------------------------------- */
+/* J2K / JPT decoder interface                                             */
+/* ----------------------------------------------------------------------- */
+
+opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo) {
+  opj_j2k_t *j2k = (opj_j2k_t*)opj_malloc(sizeof(opj_j2k_t));
+  if(j2k) {
+    j2k->cinfo = cinfo;
+    j2k->default_tcp = (opj_tcp_t*)opj_malloc(sizeof(opj_tcp_t));
+    if(!j2k->default_tcp) {
+      opj_free(j2k);
+      return NULL;
+    }
+  }
+  return j2k;
+}
 
+void j2k_destroy_decompress(opj_j2k_t *j2k) {
+  int i = 0;
 
-LIBJ2K_API int
-j2k_decode(unsigned char *src, int len, j2k_image_t * img, j2k_cp_t * cp)
-{
-  
-  if (setjmp(j2k_error)) {
-    if (j2k_state != J2K_STATE_MT) {
-      fprintf(stderr, "WARNING: incomplete bitstream\n");
-      return 0;
+  if(j2k->tile_len != NULL) {
+    opj_free(j2k->tile_len);
+  }
+  if(j2k->tile_data != NULL) {
+    opj_free(j2k->tile_data);
+  }
+  if(j2k->default_tcp != NULL) {
+    opj_tcp_t *default_tcp = j2k->default_tcp;
+    if(default_tcp->ppt_data_first != NULL) {
+      opj_free(default_tcp->ppt_data_first);
+    }
+    if(j2k->default_tcp->tccps != NULL) {
+      opj_free(j2k->default_tcp->tccps);
     }
-    j2k_clean();
-    return cio_numbytes();   /* Correct way of ending j2k_decode */
+    opj_free(j2k->default_tcp);
   }
-  
-  j2k_img = img;
-  
-  j2k_cp = cp;
-  
-  j2k_state = J2K_STATE_MHSOC;
-  cio_init(src, len);
-  
+  if(j2k->cp != NULL) {
+    opj_cp_t *cp = j2k->cp;
+    if(cp->tcps != NULL) {
+      for(i = 0; i < cp->tw * cp->th; i++) {
+        if(cp->tcps[i].ppt_data_first != NULL) {
+          opj_free(cp->tcps[i].ppt_data_first);
+        }
+        if(cp->tcps[i].tccps != NULL) {
+          opj_free(cp->tcps[i].tccps);
+        }
+      }
+      opj_free(cp->tcps);
+    }
+    if(cp->ppm_data_first != NULL) {
+      opj_free(cp->ppm_data_first);
+    }
+    if(cp->tileno != NULL) {
+      opj_free(cp->tileno);  
+    }
+    if(cp->comment != NULL) {
+      opj_free(cp->comment);
+    }
+
+    opj_free(cp);
+  }
+
+  opj_free(j2k);
+}
+
+void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters) {
+  if(j2k && parameters) {
+    /* create and initialize the coding parameters structure */
+    opj_cp_t *cp = (opj_cp_t*)opj_malloc(sizeof(opj_cp_t));
+    cp->reduce = parameters->cp_reduce;  
+    cp->layer = parameters->cp_layer;
+
+    /* keep a link to cp so that we can destroy it later in j2k_destroy_decompress */
+    j2k->cp = cp;
+  }
+}
+
+opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio) {
+  opj_image_t *image = NULL;
+
+  opj_common_ptr cinfo = j2k->cinfo;
+
+  j2k->cio = cio;
+
+  /* create an empty image */
+  image = opj_image_create0();
+  j2k->image = image;
+
+  j2k->state = J2K_STATE_MHSOC;
+
   for (;;) {
-    
-    
-    j2k_dec_mstabent_t *e;
-    int id = cio_read(2);
+    opj_dec_mstabent_t *e;
+    int id = cio_read(cio, 2);
     if (id >> 8 != 0xff) {
-      fprintf(stderr, "%.8x: expected a marker instead of %x\n",
-   cio_tell() - 2, id);
+      opj_image_destroy(image);
+      opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id);
       return 0;
     }
     e = j2k_dec_mstab_lookup(id);
-    if (!(j2k_state & e->states)) {
-      fprintf(stderr, "%.8x: unexpected marker %x\n", cio_tell() - 2, id);
+    if (!(j2k->state & e->states)) {
+      opj_image_destroy(image);
+      opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id);
       return 0;
     }
     if (e->handler) {
-      (*e->handler) ();
+      (*e->handler)(j2k);
+    }
+    if (j2k->state == J2K_STATE_MT) {
+      break;
+    }
+    if (j2k->state == J2K_STATE_NEOC) {
+      break;
     }
-    
-    
-    if (j2k_state == J2K_STATE_NEOC)
-      break;         /* RAJOUTE */
   }
-  if (j2k_state == J2K_STATE_NEOC)
-    j2k_read_eoc();      /* RAJOUTE */
-  
-  return 0;
+  if (j2k->state == J2K_STATE_NEOC) {
+    j2k_read_eoc(j2k);
+  }
+
+  if (j2k->state != J2K_STATE_MT) {
+    opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n");
+  }
+
+  return image;
 }
 
 /*
 * Read a JPT-stream and decode file
 *
 */
-int
-j2k_decode_jpt_stream(unsigned char *src, int len, j2k_image_t * img,
-            j2k_cp_t * cp)
-{
-  jpt_msg_header_struct_t header;
+opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio) {
+  opj_image_t *image = NULL;
+  opj_jpt_msg_header_t header;
   int position;
+
+  opj_common_ptr cinfo = j2k->cinfo;
   
-  if (setjmp(j2k_error)) {
-    if (j2k_state != J2K_STATE_MT) {
-      fprintf(stderr, "WARNING: incomplete bitstream\n");
-      return 0;
-    }
-    return cio_numbytes();
-  }
-  
-  j2k_img = img;
-  
-  j2k_cp = cp;
-  
-  j2k_state = J2K_STATE_MHSOC;
-  cio_init(src, len);
+  j2k->cio = cio;
+
+  /* create an empty image */
+  image = opj_image_create0();
+
+  j2k->state = J2K_STATE_MHSOC;
   
   /* Initialize the header */
-  jpt_init_Msg_Header(&header);
+  jpt_init_msg_header(&header);
   /* Read the first header of the message */
-  jpt_read_Msg_Header(&header);
+  jpt_read_msg_header(cinfo, cio, &header);
   
-  position = cio_tell();
-  if (header.Class_Id != 6) {   /* 6 : Main header data-bin message */
-    fprintf(stderr,
-      "[JPT-stream] : Expecting Main header first [class_Id %d] !\n",
-      header.Class_Id);
+  position = cio_tell(cio);
+  if (header.Class_Id != 6) {  /* 6 : Main header data-bin message */
+    opj_image_destroy(image);
+    opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Main header first [class_Id %d] !\n", header.Class_Id);
     return 0;
   }
   
   for (;;) {
-    j2k_dec_mstabent_t *e;
+    opj_dec_mstabent_t *e = NULL;
     int id;
     
-    if (!cio_numbytesleft()) {
-      j2k_read_eoc();
-      return 0;
+    if (!cio_numbytesleft(cio)) {
+      j2k_read_eoc(j2k);
+      return image;
     }
     /* data-bin read -> need to read a new header */
-    if ((unsigned int) (cio_tell() - position) == header.Msg_length) {
-      jpt_read_Msg_Header(&header);
-      position = cio_tell();
-      if (header.Class_Id != 4) {   /* 4 : Tile data-bin message */
-   fprintf(stderr, "[JPT-stream] : Expecting Tile info !\n");
-   return 0;
+    if ((unsigned int) (cio_tell(cio) - position) == header.Msg_length) {
+      jpt_read_msg_header(cinfo, cio, &header);
+      position = cio_tell(cio);
+      if (header.Class_Id != 4) {  /* 4 : Tile data-bin message */
+        opj_image_destroy(image);
+        opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Tile info !\n");
+        return 0;
       }
     }
     
-    id = cio_read(2);
+    id = cio_read(cio, 2);
     if (id >> 8 != 0xff) {
-      fprintf(stderr, "%.8x: expected a marker instead of %x\n",
-   cio_tell() - 2, id);
+      opj_image_destroy(image);
+      opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n", cio_tell(cio) - 2, id);
       return 0;
     }
     e = j2k_dec_mstab_lookup(id);
-    if (!(j2k_state & e->states)) {
-      fprintf(stderr, "%.8x: unexpected marker %x\n", cio_tell() - 2, id);
+    if (!(j2k->state & e->states)) {
+      opj_image_destroy(image);
+      opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id);
       return 0;
     }
     if (e->handler) {
-      (*e->handler) ();
+      (*e->handler)(j2k);
+    }
+    if (j2k->state == J2K_STATE_MT) {
+      break;
     }
-    if (j2k_state == J2K_STATE_NEOC)
-      break;         /* RAJOUTE */
+    if (j2k->state == J2K_STATE_NEOC) {
+      break;
+    }
+  }
+  if (j2k->state == J2K_STATE_NEOC) {
+    j2k_read_eoc(j2k);
   }
-  if (j2k_state == J2K_STATE_NEOC)
-    j2k_read_eoc();      /* RAJOUTE */
   
-  return 0;
+  if (j2k->state != J2K_STATE_MT) {
+    opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n");
+  }
+
+  return image;
 }
 
+/* ----------------------------------------------------------------------- */
+/* J2K encoder interface                                                       */
+/* ----------------------------------------------------------------------- */
 
+opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo) {
+  opj_j2k_t *j2k = (opj_j2k_t*)opj_malloc(sizeof(opj_j2k_t));
+  if(j2k) {
+    j2k->cinfo = cinfo;
+  }
+  return j2k;
+}
 
-void j2k_dec_release()
+void j2k_destroy_compress(opj_j2k_t *j2k) {
+  int tileno;
 
-{
-  
-  int i=0;
-  
-  
-  
-  /*tcd_dec_release();*/
-  
-  
-  
-  if (j2k_tile_len!=NULL) free(j2k_tile_len);
-  
-  if (j2k_tile_data!=NULL) free(j2k_tile_data);
+  if(!j2k) return;
+
+  if(j2k->image_info != NULL) {
+    opj_image_info_t *image_info = j2k->image_info;
+    if (image_info->index_on && j2k->cp) {
+      opj_cp_t *cp = j2k->cp;
+      for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
+        opj_tile_info_t *tile_info = &image_info->tile[tileno];
+        opj_free(tile_info->thresh);
+        opj_free(tile_info->packet);
+      }
+      opj_free(image_info->tile);
+    }
+    opj_free(image_info);
+  }
+  if(j2k->cp != NULL) {
+    opj_cp_t *cp = j2k->cp;
+
+    if(cp->comment) {
+      opj_free(cp->comment);
+    }
+    if(cp->matrice) {
+      opj_free(cp->matrice);
+    }
+    for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
+      opj_free(cp->tcps[tileno].tccps);
+    }
+    opj_free(cp->tcps);
+    opj_free(cp);
+  }
+
+  opj_free(j2k);
+}
+
+void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image) {
+  int i, j, tileno, numpocs_tile;
+  opj_cp_t *cp = NULL;
+
+  if(!j2k || !parameters || ! image) {
+    return;
+  }
+
+  /* create and initialize the coding parameters structure */
+  cp = (opj_cp_t*)opj_malloc(sizeof(opj_cp_t));
+
+  /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
+  j2k->cp = cp;
+
+  /* set default values for cp */
+  cp->tw = 1;
+  cp->th = 1;
+
+  /* 
+  copy user encoding parameters 
+  */
+
+  cp->disto_alloc = parameters->cp_disto_alloc;
+  cp->fixed_alloc = parameters->cp_fixed_alloc;
+  cp->fixed_quality = parameters->cp_fixed_quality;
+
+  /* mod fixed_quality */
+  if(parameters->cp_matrice) {
+    size_t array_size = parameters->tcp_numlayers * parameters->numresolution * 3 * sizeof(int);
+    cp->matrice = (int *) opj_malloc(array_size);
+    memcpy(cp->matrice, parameters->cp_matrice, array_size);
+  }
+
+  /* creation of an index file ? */
+  cp->index_on = parameters->index_on;
+  if(cp->index_on) {
+    j2k->image_info = (opj_image_info_t*)opj_malloc(sizeof(opj_image_info_t));
+  }
+
+  /* tiles */
+  cp->tdx = parameters->cp_tdx;
+  cp->tdy = parameters->cp_tdy;
+
+  /* tile offset */
+  cp->tx0 = parameters->cp_tx0;
+  cp->ty0 = parameters->cp_ty0;
+
+  /* comment string */
+  if(parameters->cp_comment) {
+    cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1);
+    if(cp->comment) {
+      strcpy(cp->comment, parameters->cp_comment);
+    }
+  }
+
+  /*
+  calculate other encoding parameters
+  */
+
+  if (parameters->tile_size_on) {
+    cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx);
+    cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy);
+  } else {
+    cp->tdx = image->x1 - cp->tx0;
+    cp->tdy = image->y1 - cp->ty0;
+  }
+
+  /* initialize the mutiple tiles */
+  /* ---------------------------- */
+  cp->tcps = (opj_tcp_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tcp_t));
+
+  for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
+    opj_tcp_t *tcp = &cp->tcps[tileno];
+    tcp->numlayers = parameters->tcp_numlayers;
+    for (j = 0; j < tcp->numlayers; j++) {
+      if (cp->fixed_quality) {  /* add fixed_quality */
+        tcp->distoratio[j] = parameters->tcp_distoratio[j];
+      } else {
+        tcp->rates[j] = parameters->tcp_rates[j];
+      }
+    }
+    tcp->csty = parameters->csty;
+    tcp->prg = parameters->prog_order;
+    tcp->mct = image->numcomps == 3 ? 1 : 0;
+
+    numpocs_tile = 0;
+    tcp->POC = 0;
+    if (parameters->numpocs) {
+      /* initialisation of POC */
+      tcp->POC = 1;
+      for (i = 0; i < parameters->numpocs; i++) {
+        if((tileno == parameters->POC[i].tile - 1) || (parameters->POC[i].tile == -1)) {
+          opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
+          tcp_poc->resno0    = parameters->POC[numpocs_tile].resno0;
+          tcp_poc->compno0  = parameters->POC[numpocs_tile].compno0;
+          tcp_poc->layno1    = parameters->POC[numpocs_tile].layno1;
+          tcp_poc->resno1    = parameters->POC[numpocs_tile].resno1;
+          tcp_poc->compno1  = parameters->POC[numpocs_tile].compno1;
+          tcp_poc->prg    = parameters->POC[numpocs_tile].prg;
+          tcp_poc->tile    = parameters->POC[numpocs_tile].tile;
+          numpocs_tile++;
+        }
+      }
+    }
+    tcp->numpocs = numpocs_tile;
+
+    tcp->tccps = (opj_tccp_t *) opj_malloc(image->numcomps * sizeof(opj_tccp_t));
+    
+    for (i = 0; i < image->numcomps; i++) {
+      opj_tccp_t *tccp = &tcp->tccps[i];
+      tccp->csty = parameters->csty & 0x01;  /* 0 => one precinct || 1 => custom precinct  */
+      tccp->numresolutions = parameters->numresolution;
+      tccp->cblkw = int_floorlog2(parameters->cblockw_init);
+      tccp->cblkh = int_floorlog2(parameters->cblockh_init);
+      tccp->cblksty = parameters->mode;
+      tccp->qmfbid = parameters->irreversible ? 0 : 1;
+      tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT;
+      tccp->numgbits = 2;
+      if (i == parameters->roi_compno) {
+        tccp->roishift = parameters->roi_shift;
+      } else {
+        tccp->roishift = 0;
+      }
+      if (parameters->csty & J2K_CCP_CSTY_PRT) {
+        int p = 0;
+        for (j = tccp->numresolutions - 1; j >= 0; j--) {
+          if (p < parameters->res_spec) {
+            if (parameters->prcw_init[p] < 1) {
+              tccp->prcw[j] = 1;
+            } else {
+              tccp->prcw[j] = int_floorlog2(parameters->prcw_init[p]);
+            }
+            if (parameters->prch_init[p] < 1) {
+              tccp->prch[j] = 1;
+            } else {
+              tccp->prch[j] = int_floorlog2(parameters->prch_init[p]);
+            }
+          } else {
+            int res_spec = parameters->res_spec;
+            int size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
+            int size_prch = parameters->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 for 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;
+        }
+      }
+
+      dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
+    }
+  }
+}
+
+/**
+Create an index file
+@param j2k
+@param cio
+@param image_info
+@param index Index filename
+@return Returns 1 if successful, returns 0 otherwise
+*/
+static int j2k_create_index(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_info_t *image_info, char *index) {
+  int tileno, compno, layno, resno, precno, pack_nb, x, y;
+  FILE *stream = NULL;
+  double total_disto = 0;
+
+  image_info->codestream_size = cio_tell(cio) + j2k->pos_correction;  /* Correction 14/4/03 suite rmq de Patrick */
+
+  stream = fopen(index, "w");
+  if (!stream) {
+    opj_event_msg(j2k->cinfo, EVT_ERROR, "failed to open %s for writing\n", index);
+    return 0;
+  }
   
-  if (j2k_default_tcp.ppt_data_first!=NULL) free(j2k_default_tcp.ppt_data_first);
+  fprintf(stream, "%d %d\n", image_info->image_w, image_info->image_h);
+  fprintf(stream, "%d\n", image_info->prog);
+  fprintf(stream, "%d %d\n", image_info->tile_x, image_info->tile_y);
+  fprintf(stream, "%d %d\n", image_info->tw, image_info->th);
+  fprintf(stream, "%d\n", image_info->comp);
+  fprintf(stream, "%d\n", image_info->layer);
+  fprintf(stream, "%d\n", image_info->decomposition);
+  
+  for (resno = image_info->decomposition; resno >= 0; resno--) {
+    fprintf(stream, "[%d,%d] ", 
+      (1 << image_info->tile[0].pdx[resno]), (1 << image_info->tile[0].pdx[resno]));  /* based on tile 0 */
+  }
+  fprintf(stream, "\n");
+  fprintf(stream, "%d\n", image_info->main_head_end);
+  fprintf(stream, "%d\n", image_info->codestream_size);
+  
+  for (tileno = 0; tileno < image_info->tw * image_info->th; tileno++) {
+    fprintf(stream, "%4d %9d %9d %9d %9e %9d %9e\n",
+      image_info->tile[tileno].num_tile,
+      image_info->tile[tileno].start_pos,
+      image_info->tile[tileno].end_header,
+      image_info->tile[tileno].end_pos,
+      image_info->tile[tileno].distotile, image_info->tile[tileno].nbpix,
+      image_info->tile[tileno].distotile / image_info->tile[tileno].nbpix);
+  }
   
-  if (j2k_default_tcp.tccps!=NULL) free(j2k_default_tcp.tccps);
+  for (tileno = 0; tileno < image_info->tw * image_info->th; tileno++) {
+    int start_pos, end_pos;
+    double disto = 0;
+    pack_nb = 0;
+    
+    /*
+    fprintf(stream, "pkno tileno layerno resno compno precno start_pos   end_pos       deltaSE        \n");
+    */
+    
+    if (image_info->prog == LRCP) {  /* LRCP */
+      /*
+      fprintf(stream, "pack_nb tileno layno resno compno precno start_pos  end_pos   disto");
+      */
+      for (layno = 0; layno < image_info->layer; layno++) {
+        for (resno = 0; resno < image_info->decomposition + 1; resno++) {
+          for (compno = 0; compno < image_info->comp; compno++) {
+            int prec_max = image_info->tile[tileno].pw[resno] * image_info->tile[tileno].ph[resno];
+            for (precno = 0; precno < prec_max; precno++) {
+              start_pos = image_info->tile[tileno].packet[pack_nb].start_pos;
+              end_pos = image_info->tile[tileno].packet[pack_nb].end_pos;
+              disto = image_info->tile[tileno].packet[pack_nb].disto;
+              fprintf(stream, "%4d %6d %7d %5d %6d %6d %9d %9d %8e\n",
+                pack_nb, tileno, layno, resno, compno, precno, start_pos, end_pos, disto);
+              total_disto += disto;
+              pack_nb++;
+            }
+          }
+        }
+      }
+    } /* LRCP */
+    else if (image_info->prog == RLCP) {  /* RLCP */
+      /*
+      fprintf(stream, "pack_nb tileno resno layno compno precno start_pos  end_pos   disto");
+      */
+      for (resno = 0; resno < image_info->decomposition + 1; resno++) {
+        for (layno = 0; layno < image_info->layer; layno++) {
+          for (compno = 0; compno < image_info->comp; compno++) {
+            int prec_max = image_info->tile[tileno].pw[resno] * image_info->tile[tileno].ph[resno];
+            for (precno = 0; precno < prec_max; precno++) {
+              start_pos = image_info->tile[tileno].packet[pack_nb].start_pos;
+              end_pos = image_info->tile[tileno].packet[pack_nb].end_pos;
+              disto = image_info->tile[tileno].packet[pack_nb].disto;
+              fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d %9d %8e\n",
+                pack_nb, tileno, resno, layno, compno, precno, start_pos, end_pos, disto);
+              total_disto += disto;
+              pack_nb++;
+            }
+          }
+        }
+      }
+    } /* RLCP */
+    else if (image_info->prog == RPCL) {  /* RPCL */
+      /*
+      fprintf(stream, "\npack_nb tileno resno precno compno layno start_pos  end_pos   disto\n"); 
+      */
+      for (resno = 0; resno < image_info->decomposition + 1; resno++) {
+        /* I suppose components have same XRsiz, YRsiz */
+        int x0 = image_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)image_info->tw ) * image_info->tw * image_info->tile_x;
+        int y0 = image_info->tile_Ox + (int)floor( (float)tileno/(float)image_info->tw ) * image_info->tile_y;
+        int x1 = x0 + image_info->tile_x;
+        int y1 = y0 + image_info->tile_y;
+        for(y = y0; y < y1; y++) {
+          for(x = x0; x < x1; x++) {
+            for (compno = 0; compno < image_info->comp; compno++) {
+              int prec_max = image_info->tile[tileno].pw[resno] * image_info->tile[tileno].ph[resno];
+              for (precno = 0; precno < prec_max; precno++) {
+                int pcnx = image_info->tile[tileno].pw[resno];
+                int pcx = (int) pow( 2, image_info->tile[tileno].pdx[resno] + image_info->decomposition - resno );
+                int pcy = (int) pow( 2, image_info->tile[tileno].pdy[resno] + image_info->decomposition - resno );
+                int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
+                int precno_y = (int) floor( (float)precno/(float)pcnx );
+                if (precno_y*pcy == y ) {
+                  if (precno_x*pcx == x ) {
+                    for (layno = 0; layno < image_info->layer; layno++) {
+                      start_pos = image_info->tile[tileno].packet[pack_nb].start_pos;
+                      end_pos = image_info->tile[tileno].packet[pack_nb].end_pos;
+                      disto = image_info->tile[tileno].packet[pack_nb].disto;
+                      fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d %9d %8e\n",
+                        pack_nb, tileno, resno, precno, compno, layno, start_pos, end_pos, disto); 
+                      total_disto += disto;
+                      pack_nb++; 
+                    }
+                  }
+                }
+              } /* precno */
+            } /* compno */
+          } /* x = x0..x1 */
+        } /* y = y0..y1 */
+      } /* resno */
+    } /* RPCL */
+    else if (image_info->prog == PCRL) {  /* PCRL */
+      /* I suppose components have same XRsiz, YRsiz */
+      int x0 = image_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)image_info->tw ) * image_info->tw * image_info->tile_x;
+      int y0 = image_info->tile_Ox + (int)floor( (float)tileno/(float)image_info->tw ) * image_info->tile_y;
+      int x1 = x0 + image_info->tile_x;
+      int y1 = y0 + image_info->tile_y;
+      /*
+      fprintf(stream, "\npack_nb tileno precno compno resno layno start_pos  end_pos   disto\n"); 
+      */
+      for(y = y0; y < y1; y++) {
+        for(x = x0; x < x1; x++) {
+          for (compno = 0; compno < image_info->comp; compno++) {
+            for (resno = 0; resno < image_info->decomposition + 1; resno++) {
+              int prec_max = image_info->tile[tileno].pw[resno] * image_info->tile[tileno].ph[resno];
+              for (precno = 0; precno < prec_max; precno++) {
+                int pcnx = image_info->tile[tileno].pw[resno];
+                int pcx = (int) pow( 2, image_info->tile[tileno].pdx[resno] + image_info->decomposition - resno );
+                int pcy = (int) pow( 2, image_info->tile[tileno].pdy[resno] + image_info->decomposition - resno );
+                int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
+                int precno_y = (int) floor( (float)precno/(float)pcnx );
+                if (precno_y*pcy == y ) {
+                  if (precno_x*pcx == x ) {
+                    for (layno = 0; layno < image_info->layer; layno++) {
+                      start_pos = image_info->tile[tileno].packet[pack_nb].start_pos;
+                      end_pos = image_info->tile[tileno].packet[pack_nb].end_pos;
+                      disto = image_info->tile[tileno].packet[pack_nb].disto;
+                      fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %8e\n",
+                        pack_nb, tileno, precno, compno, resno, layno, start_pos, end_pos, disto); 
+                      total_disto += disto;
+                      pack_nb++; 
+                    }
+                  }
+                }
+              } /* precno */
+            } /* resno */
+          } /* compno */
+        } /* x = x0..x1 */
+      } /* y = y0..y1 */
+    } /* PCRL */
+    else {  /* CPRL */
+      /*
+      fprintf(stream, "\npack_nb tileno compno precno resno layno start_pos  end_pos   disto\n"); 
+      */
+      for (compno = 0; compno < image_info->comp; compno++) {
+        /* I suppose components have same XRsiz, YRsiz */
+        int x0 = image_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)image_info->tw ) * image_info->tw * image_info->tile_x;
+        int y0 = image_info->tile_Ox + (int)floor( (float)tileno/(float)image_info->tw ) * image_info->tile_y;
+        int x1 = x0 + image_info->tile_x;
+        int y1 = y0 + image_info->tile_y;
+        for(y = y0; y < y1; y++) {
+          for(x = x0; x < x1; x++) {
+            for (resno = 0; resno < image_info->decomposition + 1; resno++) {
+              int prec_max = image_info->tile[tileno].pw[resno] * image_info->tile[tileno].ph[resno];
+              for (precno = 0; precno < prec_max; precno++) {
+                int pcnx = image_info->tile[tileno].pw[resno];
+                int pcx = (int) pow( 2, image_info->tile[tileno].pdx[resno] + image_info->decomposition - resno );
+                int pcy = (int) pow( 2, image_info->tile[tileno].pdy[resno] + image_info->decomposition - resno );
+                int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
+                int precno_y = (int) floor( (float)precno/(float)pcnx );
+                if (precno_y*pcy == y ) {
+                  if (precno_x*pcx == x ) {
+                    for (layno = 0; layno < image_info->layer; layno++) {
+                      start_pos = image_info->tile[tileno].packet[pack_nb].start_pos;
+                      end_pos = image_info->tile[tileno].packet[pack_nb].end_pos;
+                      disto = image_info->tile[tileno].packet[pack_nb].disto;
+                      fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %8e\n",
+                        pack_nb, tileno, compno, precno, resno, layno, start_pos, end_pos, disto); 
+                      total_disto += disto;
+                      pack_nb++; 
+                    }
+                  }
+                }
+              } /* precno */
+            } /* resno */
+          } /* x = x0..x1 */
+        } /* y = y0..y1 */
+      } /* comno */
+    } /* CPRL */   
+  } /* tileno */
+  
+  fprintf(stream, "%8e\n", image_info->D_max); /* SE max */
+  fprintf(stream, "%.8e\n", total_disto);  /* SE totale */
+  fclose(stream);
+
+  return 1;
+}
+
+bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, char *index) {
+  int tileno, compno;
+  opj_image_info_t *image_info = NULL;
+  opj_cp_t *cp = NULL;
+
+  opj_tcd_t *tcd = NULL;  /* TCD component */
+
+  j2k->cio = cio;  
+  j2k->image = image;
+
+  cp = j2k->cp;
+
+  /* j2k_dump_cp(stdout, image, cp); */
+
+  /* INDEX >> */
+  image_info = j2k->image_info;
+  if (image_info && cp->index_on) {
+    image_info->index_on = cp->index_on;
+    image_info->tile = (opj_tile_info_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tile_info_t));
+    image_info->image_w = image->x1 - image->x0;
+    image_info->image_h = image->y1 - image->y0;
+    image_info->prog = (&cp->tcps[0])->prg;
+    image_info->tw = cp->tw;
+    image_info->th = cp->th;
+    image_info->tile_x = cp->tdx;  /* new version parser */
+    image_info->tile_y = cp->tdy;  /* new version parser */
+    image_info->tile_Ox = cp->tx0;  /* new version parser */
+    image_info->tile_Oy = cp->ty0;  /* new version parser */
+    image_info->comp = image->numcomps;
+    image_info->layer = (&cp->tcps[0])->numlayers;
+    image_info->decomposition = (&cp->tcps[0])->tccps->numresolutions - 1;
+    image_info->D_max = 0;    /* ADD Marcela */
+  }
+  /* << INDEX */
   
-  for (i=0;i<j2k_cp->tw*j2k_cp->th;i++) {
+  j2k_write_soc(j2k);
+  j2k_write_siz(j2k);
+  j2k_write_cod(j2k);
+  j2k_write_qcd(j2k);
+  for (compno = 0; compno < image->numcomps; compno++) {
+    opj_tcp_t *tcp = &cp->tcps[0];
+    if (tcp->tccps[compno].roishift)
+      j2k_write_rgn(j2k, compno, 0);
+  }
+  if (cp->comment != NULL) {
+    j2k_write_com(j2k);
+  }
+  /* INDEX >> */
+  if(image_info && image_info->index_on) {
+    image_info->main_head_end = cio_tell(cio) - 1;
+  }
+  /* << INDEX */
+
+  /* create the tile encoder */
+  tcd = tcd_create(j2k->cinfo);
+
+  /* encode each tile */
+
+  for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
+    opj_event_msg(j2k->cinfo, EVT_INFO, "tile number %d / %d\n", tileno + 1, cp->tw * cp->th);
     
-    if (j2k_cp->tcps[i].ppt_data_first!=NULL) free(j2k_cp->tcps[i].ppt_data_first);
+    j2k->curtileno = tileno;
+
+    /* initialisation before tile encoding  */
+    if (tileno == 0) {
+      tcd_malloc_encode(tcd, image, cp, j2k->curtileno);
+    } else {
+      tcd_init_encode(tcd, image, cp, j2k->curtileno);
+    }
     
-    if (j2k_cp->tcps[i].tccps!=NULL) free(j2k_cp->tcps[i].tccps);
+    /* INDEX >> */
+    if(image_info && image_info->index_on) {
+      image_info->tile[j2k->curtileno].num_tile = j2k->curtileno;
+      image_info->tile[j2k->curtileno].start_pos = cio_tell(cio) + j2k->pos_correction;
+    }
+    /* << INDEX */
+
+    j2k_write_sot(j2k);
+    
+    for (compno = 1; compno < image->numcomps; compno++) {
+      j2k_write_coc(j2k, compno);
+      j2k_write_qcc(j2k, compno);
+    }
+    if (cp->tcps[tileno].numpocs) {
+      j2k_write_poc(j2k);
+    }
+
+    j2k_write_sod(j2k, tcd);
+    
+    /* INDEX >> */
+    if(image_info && image_info->index_on) {
+      image_info->tile[j2k->curtileno].end_pos = cio_tell(cio) + j2k->pos_correction - 1;
+    }
+    /* << INDEX */
+    
+    
+    /*
+    if (tile->PPT) { // BAD PPT !!! 
+      FILE *PPT_file;
+      int i;
+      PPT_file=fopen("PPT","rb");
+      fprintf(stderr,"%c%c%c%c",255,97,tile->len_ppt/256,tile->len_ppt%256);
+      for (i=0;i<tile->len_ppt;i++) {
+        unsigned char elmt;
+        fread(&elmt, 1, 1, PPT_file);
+        fwrite(&elmt,1,1,f);
+      }
+      fclose(PPT_file);
+      unlink("PPT");
+    }
+    */
     
   }
   
-  if (j2k_cp->ppm_data_first!=NULL) free(j2k_cp->ppm_data_first);
-  
-  if (j2k_cp->tcps!=NULL) free(j2k_cp->tcps);
-  
-  if (j2k_img->comps!=NULL) free(j2k_img->comps);
-  
-  if (j2k_cp->tileno!=NULL) free(j2k_cp->tileno);
-  
-}
-
-#ifdef WIN32
-#include <windows.h>
+  /* destroy the tile encoder */
+  tcd_free_encode(tcd);
+  tcd_destroy(tcd);
 
-BOOL APIENTRY
-DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
-{
-  switch (ul_reason_for_call) {
-  case DLL_PROCESS_ATTACH:
-  case DLL_THREAD_ATTACH:
-  case DLL_THREAD_DETACH:
-  case DLL_PROCESS_DETACH:
-    break;
+  j2k_write_eoc(j2k);
+  
+  /* Creation of the index file */
+  if(image_info && image_info->index_on) {
+    if(!j2k_create_index(j2k, cio, image_info, index)) {
+      opj_event_msg(j2k->cinfo, EVT_ERROR, "failed to create index file %s\n", index);
+      return false;
+    }
   }
-  return TRUE;
+    
+  return true;
 }
-#endif
+
index b42ecf800f44a1109391708a99353cc634e25108..e80b68bfcadbe61501b32ca03507b25c3c198d96 100644 (file)
-/*
- * 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.9"
-
-#if defined(_WIN32) && defined (OPENJPEGDLL)
-#ifdef gdcmopenjpeg_EXPORTS /*LIBJ2K_EXPORTS*/
-#define LIBJ2K_API __declspec(dllexport)
-#else
-#define LIBJ2K_API __declspec(dllimport)
-#endif
-#else
-#ifdef OPENJPEGSTATIC
-#define LIBJ2K_API extern
-#else
-#define LIBJ2K_API
-#endif
-#endif
-
-
-#ifndef __J2K_H
-#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_CFMT 0
-#define JP2_CFMT 1
-#define JPT_CFMT 2
-#define MJ2_CFMT 3
-#define PXM_DFMT 0
-#define PGX_DFMT 1
-#define BMP_DFMT 2
-#define YUV_DFMT 3
-
-#define J2K_CP_CSTY_PRT 0x01
-#define J2K_CP_CSTY_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       */
-  unsigned char *ppt_data_first;   /* pointer remaining on the first byte of the first header if ppt is used */
-  int ppt;         /* If ppt == 1 --> there was a PPT marker for the present tile       */
-  int ppt_store;      /* Use in case of multiple marker PPT (number of info already store) */
-  int ppt_len;         /* ppmbug1 */
-  float distoratio[100];   /* add fixed_quality */
-  j2k_tccp_t *tccps;      /* tile-component coding parameters                                  */
-} j2k_tcp_t;
-
-typedef struct {
-  int intermed_file;      /* 1: Store each encoded tile one by one in the output file (for mega-Images)*/
-  int decod_format;      /* 0: PGX, 1: PxM, 2: BMP */
-  int cod_format;      /* 0: J2K, 1: JP2, 2: JPT */
-  int disto_alloc;      /* Allocation by rate/distortion     */
-  int fixed_alloc;      /* Allocation by fixed layer         */
-  int fixed_quality;      /* add fixed_quality */
-  int reduce;         /* if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
-  int layer;         /* if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
-  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             */
-  unsigned char *ppm_data_first;   /* pointer remaining on the first byte of the first header if ppm is used */
-  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 Tile_Ox, Tile_Oy;
-  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
- */
-LIBJ2K_API int j2k_encode(j2k_image_t * i, j2k_cp_t * cp, char *output,
-           int len, char *index);
-
-/* LIBJ2K_API int j2k_encode(j2k_image_t *i, j2k_cp_t *cp,unsigned char *dest, int len); */
-/*
- * Decode an image from a JPEG-2000 codestream
- * src: source buffer
- * len: length of source buffer
- * i: decode image
- * cp: coding parameters that were used to encode the image
- */
-
-LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t * img,
-           j2k_cp_t * cp);
-
-
-/*
- * Decode an image form a JPT-stream (JPEG 2000, JPIP)
- * src: source buffer
- * len: length of source buffer
- * i: decode image
- * cp: coding parameters that were used to encode the image
- *
- */
-int j2k_decode_jpt_stream(unsigned char *src, int len, j2k_image_t * img,
-           j2k_cp_t * cp);
-
-LIBJ2K_API void j2k_dec_release();/*antonin*/
-
-#endif
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#ifndef __J2K_H\r
+#define __J2K_H\r
+/**\r
+@file j2k.h\r
+@brief The JPEG-2000 Codestream Reader/Writer (J2K)\r
+\r
+The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data.\r
+*/\r
+\r
+/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */\r
+/*@{*/\r
+\r
+#define J2K_CP_CSTY_PRT 0x01\r
+#define J2K_CP_CSTY_SOP 0x02\r
+#define J2K_CP_CSTY_EPH 0x04\r
+#define J2K_CCP_CSTY_PRT 0x01\r
+#define J2K_CCP_CBLKSTY_LAZY 0x01\r
+#define J2K_CCP_CBLKSTY_RESET 0x02\r
+#define J2K_CCP_CBLKSTY_TERMALL 0x04\r
+#define J2K_CCP_CBLKSTY_VSC 0x08\r
+#define J2K_CCP_CBLKSTY_PTERM 0x10\r
+#define J2K_CCP_CBLKSTY_SEGSYM 0x20\r
+#define J2K_CCP_QNTSTY_NOQNT 0\r
+#define J2K_CCP_QNTSTY_SIQNT 1\r
+#define J2K_CCP_QNTSTY_SEQNT 2\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+#define J2K_MS_SOC 0xff4f  /**< SOC marker value */\r
+#define J2K_MS_SOT 0xff90  /**< SOT marker value */\r
+#define J2K_MS_SOD 0xff93  /**< SOD marker value */\r
+#define J2K_MS_EOC 0xffd9  /**< EOC marker value */\r
+#define J2K_MS_SIZ 0xff51  /**< SIZ marker value */\r
+#define J2K_MS_COD 0xff52  /**< COD marker value */\r
+#define J2K_MS_COC 0xff53  /**< COC marker value */\r
+#define J2K_MS_RGN 0xff5e  /**< RGN marker value */\r
+#define J2K_MS_QCD 0xff5c  /**< QCD marker value */\r
+#define J2K_MS_QCC 0xff5d  /**< QCC marker value */\r
+#define J2K_MS_POC 0xff5f  /**< POC marker value */\r
+#define J2K_MS_TLM 0xff55  /**< TLM marker value */\r
+#define J2K_MS_PLM 0xff57  /**< PLM marker value */\r
+#define J2K_MS_PLT 0xff58  /**< PLT marker value */\r
+#define J2K_MS_PPM 0xff60  /**< PPM marker value */\r
+#define J2K_MS_PPT 0xff61  /**< PPT marker value */\r
+#define J2K_MS_SOP 0xff91  /**< SOP marker value */\r
+#define J2K_MS_EPH 0xff92  /**< EPH marker value */\r
+#define J2K_MS_CRG 0xff63  /**< CRG marker value */\r
+#define J2K_MS_COM 0xff64  /**< COM marker value */\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+/**\r
+Values that specify the status of the decoding process when decoding the main header. \r
+These values may be combined with a | operator. \r
+*/\r
+typedef enum J2K_STATUS {\r
+  J2K_STATE_MHSOC  = 0x0001, /**< a SOC marker is expected */\r
+  J2K_STATE_MHSIZ  = 0x0002, /**< a SIZ marker is expected */\r
+  J2K_STATE_MH     = 0x0004, /**< the decoding process is in the main header */\r
+  J2K_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */\r
+  J2K_STATE_TPH    = 0x0010, /**< the decoding process is in a tile part header */\r
+  J2K_STATE_MT     = 0x0020, /**< the EOC marker has just been read */\r
+  J2K_STATE_NEOC   = 0x0040  /**< the decoding process must not expect a EOC marker because the codestream is truncated */\r
+} J2K_STATUS;\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+/**\r
+Quantization stepsize\r
+*/\r
+typedef struct opj_stepsize {\r
+  /** exponent */\r
+  int expn;\r
+  /** mantissa */\r
+  int mant;\r
+} opj_stepsize_t;\r
+\r
+/**\r
+Tile-component coding parameters\r
+*/\r
+typedef struct opj_tccp {\r
+  /** coding style */\r
+  int csty;\r
+  /** number of resolutions */\r
+  int numresolutions;\r
+  /** code-blocks width */\r
+  int cblkw;\r
+  /** code-blocks height */\r
+  int cblkh;\r
+  /** code-block coding style */\r
+  int cblksty;\r
+  /** discrete wavelet transform identifier */\r
+  int qmfbid;\r
+  /** quantisation style */\r
+  int qntsty;\r
+  /** stepsizes used for quantization */\r
+  opj_stepsize_t stepsizes[J2K_MAXBANDS];\r
+  /** number of guard bits */\r
+  int numgbits;\r
+  /** Region Of Interest shift */\r
+  int roishift;\r
+  /** precinct width */\r
+  int prcw[J2K_MAXRLVLS];\r
+  /** precinct height */\r
+  int prch[J2K_MAXRLVLS];  \r
+} opj_tccp_t;\r
+\r
+/**\r
+Tile coding parameters : \r
+this structure is used to store coding/decoding parameters common to all\r
+tiles (information like COD, COC in main header)\r
+*/\r
+typedef struct opj_tcp {\r
+  /** 1 : first part-tile of a tile */\r
+  int first;\r
+  /** coding style */\r
+  int csty;\r
+  /** progression order */\r
+  OPJ_PROG_ORDER prg;\r
+  /** number of layers */\r
+  int numlayers;\r
+  /** multi-component transform identifier */\r
+  int mct;\r
+  /** rates of layers */\r
+  int rates[100];\r
+  /** number of progression order changes */\r
+  int numpocs;\r
+  /** indicates if a POC marker has been used O:NO, 1:YES */\r
+  int POC;\r
+  /** progression order changes */\r
+  opj_poc_t pocs[32];\r
+  /** packet header store there for futur use in t2_decode_packet */\r
+  unsigned char *ppt_data;\r
+  /** pointer remaining on the first byte of the first header if ppt is used */\r
+  unsigned char *ppt_data_first;\r
+  /** If ppt == 1 --> there was a PPT marker for the present tile */\r
+  int ppt;\r
+  /** used in case of multiple marker PPT (number of info already stored) */\r
+  int ppt_store;\r
+  /** ppmbug1 */\r
+  int ppt_len;\r
+  /** add fixed_quality */\r
+  float distoratio[100];\r
+  /** tile-component coding parameters */\r
+  opj_tccp_t *tccps;\r
+} opj_tcp_t;\r
+\r
+/**\r
+Coding parameters\r
+*/\r
+typedef struct opj_cp {\r
+  /** allocation by rate/distortion */\r
+  int disto_alloc;\r
+  /** allocation by fixed layer */\r
+  int fixed_alloc;\r
+  /** add fixed_quality */\r
+  int fixed_quality;\r
+  /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */\r
+  int reduce;\r
+  /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */\r
+  int layer;\r
+  /** 0 = no index || 1 = index */\r
+  int index_on;\r
+  /** XTOsiz */\r
+  int tx0;\r
+  /** YTOsiz */\r
+  int ty0;\r
+  /** XTsiz */\r
+  int tdx;\r
+  /** YTsiz */\r
+  int tdy;\r
+  /** comment for coding */\r
+  char *comment;\r
+  /** number of tiles in width */\r
+  int tw;\r
+  /** number of tiles in heigth */\r
+  int th;\r
+  /** ID number of the tiles present in the codestream */\r
+  int *tileno;\r
+  /** size of the vector tileno */\r
+  int tileno_size;\r
+  /** packet header store there for futur use in t2_decode_packet */\r
+  unsigned char *ppm_data;\r
+  /** pointer remaining on the first byte of the first header if ppm is used */\r
+  unsigned char *ppm_data_first;\r
+  /** if ppm == 1 --> there was a PPM marker for the present tile */\r
+  int ppm;\r
+  /** use in case of multiple marker PPM (number of info already store) */\r
+  int ppm_store;\r
+  /** use in case of multiple marker PPM (case on non-finished previous info) */\r
+  int ppm_previous;\r
+  /** ppmbug1 */\r
+  int ppm_len;\r
+  /** tile coding parameters */\r
+  opj_tcp_t *tcps;\r
+  /** fixed layer */\r
+  int *matrice;\r
+} opj_cp_t;\r
+\r
+/**\r
+Information concerning a packet inside tile\r
+*/\r
+typedef struct opj_packet_info {\r
+  /** start position */\r
+  int start_pos;\r
+  /** end position */\r
+  int end_pos;\r
+  /** ADD for Marcela */\r
+  double disto;\r
+} opj_packet_info_t;\r
+\r
+/**\r
+Index structure : information regarding tiles inside image\r
+*/\r
+typedef struct opj_tile_info {\r
+  /** value of thresh for each layer by tile cfr. Marcela   */\r
+  double *thresh;\r
+  /** number of tile */\r
+  int num_tile;\r
+  /** start position */\r
+  int start_pos;\r
+  /** end position of the header */\r
+  int end_header;\r
+  /** end position */\r
+  int end_pos;\r
+  /** precinct number for each resolution level (width) */\r
+  int pw[33];\r
+  /** precinct number for each resolution level (height) */\r
+  int ph[33];\r
+  /** precinct size (in power of 2), in X for each resolution level */\r
+  int pdx[33];\r
+  /** precinct size (in power of 2), in Y for each resolution level */\r
+  int pdy[33];\r
+  /** information concerning packets inside tile */\r
+  opj_packet_info_t *packet;\r
+  /** add fixed_quality */\r
+  int nbpix;\r
+  /** add fixed_quality */\r
+  double distotile;\r
+} opj_tile_info_t;\r
+\r
+/**\r
+Index structure\r
+*/\r
+typedef struct opj_image_info {\r
+  /** 0 = no index || 1 = index */\r
+  int index_on;\r
+  /** maximum distortion reduction on the whole image (add for Marcela) */\r
+  double D_max;\r
+  /** packet number */\r
+  int num;\r
+  /** writing the packet in the index with t2_encode_packets */\r
+  int index_write;\r
+  /** image width */\r
+  int image_w;\r
+  /** image height */\r
+  int image_h;\r
+  /** progression order */\r
+  OPJ_PROG_ORDER prog;\r
+  /** tile size in x */\r
+  int tile_x;\r
+  /** tile size in y */\r
+  int tile_y;\r
+  /** */\r
+  int tile_Ox;\r
+  /** */\r
+  int tile_Oy;\r
+  /** number of tiles in X */\r
+  int tw;\r
+  /** number of tiles in Y */\r
+  int th;\r
+  /** component numbers */\r
+  int comp;\r
+  /** number of layer */\r
+  int layer;\r
+  /** number of decomposition */\r
+  int decomposition;\r
+  /** main header position */\r
+  int main_head_end;\r
+  /** codestream's size */\r
+  int codestream_size;\r
+  /** information regarding tiles inside image */\r
+  opj_tile_info_t *tile;\r
+} opj_image_info_t;\r
+\r
+/**\r
+JPEG-2000 codestream reader/writer\r
+*/\r
+typedef struct opj_j2k {\r
+  /** codec context */\r
+  opj_common_ptr cinfo;\r
+\r
+  /** locate in which part of the codestream the decoder is (main header, tile header, end) */\r
+  int state;\r
+  /** number of the tile curently concern by coding/decoding */\r
+  int curtileno;\r
+  /** \r
+  locate the position of the end of the tile in the codestream, \r
+  used to detect a truncated codestream (in j2k_read_sod)\r
+  */\r
+  unsigned char *eot;\r
+  /**\r
+  locate the start position of the SOT marker of the current coded tile:  \r
+  after encoding the tile, a jump (in j2k_write_sod) is done to the SOT marker to store the value of its length. \r
+  */\r
+  int sot_start;\r
+  int sod_start;\r
+  /**\r
+  as the J2K-file is written in several parts during encoding, \r
+  it enables to make the right correction in position return by cio_tell\r
+  */\r
+  int pos_correction;\r
+  /** array used to store the data of each tile */\r
+  unsigned char **tile_data;\r
+  /** array used to store the length of each tile */\r
+  int *tile_len;\r
+  /** \r
+  decompression only : \r
+  store decoding parameters common to all tiles (information like COD, COC in main header)\r
+  */\r
+  opj_tcp_t *default_tcp;\r
+  /** pointer to the encoded / decoded image */\r
+  opj_image_t *image;\r
+  /** pointer to the coding parameters */\r
+  opj_cp_t *cp;\r
+  /** helper used to write the index file */\r
+  opj_image_info_t *image_info;\r
+  /** pointer to the byte i/o stream */\r
+  opj_cio_t *cio;\r
+} opj_j2k_t;\r
+\r
+/** @name Exported functions */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+/**\r
+Creates a J2K decompression structure\r
+@param cinfo Codec context info\r
+@return Returns a handle to a J2K decompressor if successful, returns NULL otherwise\r
+*/\r
+opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo);\r
+/**\r
+Destroy a J2K decompressor handle\r
+@param j2k J2K decompressor handle to destroy\r
+*/\r
+void j2k_destroy_decompress(opj_j2k_t *j2k);\r
+/**\r
+Setup the decoder decoding parameters using user parameters.\r
+Decoding parameters are returned in j2k->cp. \r
+@param j2k J2K decompressor handle\r
+@param parameters decompression parameters\r
+*/\r
+void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);\r
+/**\r
+Decode an image from a JPEG-2000 codestream\r
+@param j2k J2K decompressor handle\r
+@param cio Input buffer stream\r
+@return Returns a decoded image if successful, returns NULL otherwise\r
+*/\r
+opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio);\r
+/**\r
+Decode an image form a JPT-stream (JPEG 2000, JPIP)\r
+@param j2k J2K decompressor handle\r
+@param cio Input buffer stream\r
+@return Returns a decoded image if successful, returns NULL otherwise\r
+*/\r
+opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio);\r
+/**\r
+Creates a J2K compression structure\r
+@param cinfo Codec context info\r
+@return Returns a handle to a J2K compressor if successful, returns NULL otherwise\r
+*/\r
+opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo);\r
+/**\r
+Destroy a J2K compressor handle\r
+@param j2k J2K compressor handle to destroy\r
+*/\r
+void j2k_destroy_compress(opj_j2k_t *j2k);\r
+/**\r
+Setup the encoder parameters using the current image and using user parameters. \r
+Coding parameters are returned in j2k->cp. \r
+@param j2k J2K compressor handle\r
+@param parameters compression parameters\r
+@param image input filled image\r
+*/\r
+void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image);\r
+/**\r
+Encode an image into a JPEG-2000 codestream\r
+@param j2k J2K compressor handle\r
+@param cio Output buffer stream\r
+@param image Image to encode\r
+@param index Name of the index file if required, NULL otherwise\r
+@return Returns true if successful, returns false otherwise\r
+*/\r
+bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, char *index);\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __J2K_H */\r
diff --git a/src/gdcmopenjpeg/libopenjpeg/j2k_lib.c b/src/gdcmopenjpeg/libopenjpeg/j2k_lib.c
new file mode 100644 (file)
index 0000000..230be80
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sys/times.h>
+#endif /* WIN32 */
+#include "opj_includes.h"
+
+double opj_clock() {
+#ifdef WIN32
+  /* WIN32: use QueryPerformance (very accurate) */
+    LARGE_INTEGER freq , t ;
+    /* freq is the clock speed of the CPU */
+    QueryPerformanceFrequency(&freq) ;
+  /* cout << "freq = " << ((double) freq.QuadPart) << endl; */
+    /* t is the high resolution performance counter (see MSDN) */
+    QueryPerformanceCounter ( & t ) ;
+    return ( t.QuadPart /(double) freq.QuadPart ) ;
+#else
+  /* Unix or Linux: use resource usage */
+    struct rusage t;
+    double procTime;
+    /* (1) Get the rusage data structure at this moment (man getrusage) */
+    getrusage(0,&t);
+    /* (2) What is the elapsed time ? - CPU time = User time + System time */
+  /* (2a) Get the seconds */
+    procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec;
+    /* (2b) More precisely! Get the microseconds part ! */
+    return ( procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ;
+#endif
+}
+
+void* opj_malloc( size_t size ) {
+  void *memblock = malloc(size);
+  if(memblock) {
+    memset(memblock, 0, size);
+  }
+  return memblock;
+}
+
+void* opj_realloc( void *memblock, size_t size ) {
+  return realloc(memblock, size);
+}
+
+void opj_free( void *memblock ) {
+  free(memblock);
+}
+
+
diff --git a/src/gdcmopenjpeg/libopenjpeg/j2k_lib.h b/src/gdcmopenjpeg/libopenjpeg/j2k_lib.h
new file mode 100644 (file)
index 0000000..3d1b53c
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __J2K_LIB_H
+#define __J2K_LIB_H
+/**
+@file j2k_lib.h
+@brief Internal functions
+
+The functions in J2K_LIB.C are internal utilities mainly used for memory management.
+*/
+
+/** @defgroup MISC MISC - Miscellaneous internal functions */
+/*@{*/
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Difference in successive opj_clock() calls tells you the elapsed time
+@return Returns time in seconds
+*/
+double opj_clock();
+
+/**
+Allocate a memory block with elements initialized to 0
+@param size Bytes to allocate
+@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
+*/
+void* opj_malloc( size_t size );
+
+/**
+Reallocate memory blocks.
+@param memblock Pointer to previously allocated memory block
+@param size New size in bytes
+@return Returns a void pointer to the reallocated (and possibly moved) memory block
+*/
+void* opj_realloc( void *memblock, size_t size );
+
+/**
+Deallocates or frees a memory block.
+@param memblock Previously allocated memory block to be freed
+*/
+void opj_free( void *memblock );
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __J2K_LIB_H */
+
index 1886eafa469c8178d11e3b6efed0135ca44522a5..29aa311e687c8efd9c8ddae1535b152309c2b08a 100644 (file)
 /*
-* 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.
+ * Copyright (c) 2004, Yannick Verschueren
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Read box headers
+@param cinfo Codec context info
+@param cio Input stream
+@param box
+@return Returns true if successful, returns false otherwise
 */
+static bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box);
+/*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/
+/**
+Read the IHDR box - Image Header box
+@param jp2 JP2 handle
+@param cio Input buffer stream
+@return Returns true if successful, returns false otherwise
+*/
+static bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio);
+static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio);
+static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio);
+static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio);
+static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio);
+static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio);
+/**
+Write the JP2H box - JP2 Header box
+@param jp2 JP2 handle
+@param cio Output buffer stream
+*/
+static void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio);
+/**
+Read the JP2H box - JP2 Header box
+@param jp2 JP2 handle
+@param cio Input buffer stream
+@return Returns true if successful, returns false otherwise
+*/
+static bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio);
+/**
+Write the FTYP box - File type box
+@param jp2 JP2 handle
+@param cio Output buffer stream
+*/
+static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio);
+/**
+Read the FTYP box - File type box
+@param jp2 JP2 handle
+@param cio Input buffer stream
+@return Returns true if successful, returns false otherwise
+*/
+static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio);
+static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, char *index);
+static bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset);
+static void jp2_write_jp(opj_cio_t *cio);
+/**
+Read the JP box - JPEG 2000 signature
+@param jp2 JP2 handle
+@param cio Input buffer stream
+@return Returns true if successful, returns false otherwise
+*/
+static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio);
+/**
+Decode the structure of a JP2 file
+@param jp2 JP2 handle
+@param cio Input buffer stream
+@return Returns true if successful, returns false otherwise
+*/
+static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio);
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "j2k.h"
-#include "jp2.h"
-#include "cio.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);
+static bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box) {
+  box->init_pos = cio_tell(cio);
+  box->length = cio_read(cio, 4);
+  box->type = cio_read(cio, 4);
   if (box->length == 1) {
-    if (cio_read(4) != 0) {
-      fprintf(stderr, "Error: Cannot handle box sizes higher than 2^32\n");
-      return 1;
+    if (cio_read(cio, 4) != 0) {
+      opj_event_msg(cinfo, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
+      return false;
     }
-    box->length = cio_read(4);
-    if (box->length == 0)
-      box->length = cio_numbytesleft() + 12;
-  } else if (box->length == 0) {
-    box->length = cio_numbytesleft() + 8;
+    box->length = cio_read(cio, 4);
+    if (box->length == 0) 
+      box->length = cio_numbytesleft(cio) + 12;
   }
-  return 0;
-}
-
-/*
-* 
-* Initialisation of a Standard JP2 structure
-*/
-
-int jp2_init_stdjp2(jp2_struct_t * jp2_struct)
-{
-
-  jp2_struct->comps =
-    (jp2_comps_t *) malloc(jp2_struct->numcomps * sizeof(jp2_comps_t));
-
-  jp2_struct->precedence = 0;   /* PRECEDENCE*/
-  jp2_struct->approx = 0;   /* APPROX*/
-
-  jp2_struct->brand = JP2_JP2;   /* BR         */
-  jp2_struct->minversion = 0;   /* MinV       */
-  jp2_struct->numcl = 1;
-  jp2_struct->cl = (unsigned int *) malloc(jp2_struct->numcl * sizeof(int));
-  jp2_struct->cl[0] = JP2_JP2;   /* CL0 : JP2  */
-
-  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*/
-
-  return 0;
+  else if (box->length == 0) {
+    box->length = cio_numbytesleft(cio) + 8;
+  }
+  
+  return true;
 }
 
-
-void jp2_write_url(char *Idx_file)
-{
+#if 0
+static void jp2_write_url(opj_cio_t *cio, char *Idx_file) {
   unsigned int i;
-  char str[256];
-  jp2_box_t box;
-
-  sprintf(str, "%s", Idx_file);
+  opj_jp2_box_t box;
 
+  box.init_pos = cio_tell(cio);
+  cio_skip(cio, 4);
+  cio_write(cio, JP2_URL, 4);  /* DBTL */
+  cio_write(cio, 0, 1);    /* VERS */
+  cio_write(cio, 0, 3);    /* FLAG */
 
-  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);
+  if(Idx_file) {
+    for (i = 0; i < strlen(Idx_file); i++) {
+      cio_write(cio, Idx_file[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);
+  box.length = cio_tell(cio) - box.init_pos;
+  cio_seek(cio, box.init_pos);
+  cio_write(cio, box.length, 4);  /* L */
+  cio_seek(cio, box.init_pos + box.length);
 }
+#endif
 
-/*
-* Read the IHDR box
-*
-* Image Header box
-*
-*/
-int jp2_read_ihdr(jp2_struct_t * jp2_struct)
-{
-  jp2_box_t box;
+static bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) {
+  opj_jp2_box_t box;
+
+  opj_common_ptr cinfo = jp2->cinfo;
 
-  jp2_read_boxhdr(&box);
+  jp2_read_boxhdr(cinfo, cio, &box);
   if (JP2_IHDR != box.type) {
-    fprintf(stderr, "Error: Expected IHDR Marker\n");
-    return 1;
+    opj_event_msg(cinfo, EVT_ERROR, "Expected IHDR Marker\n");
+    return false;
   }
 
-  jp2_struct->h = cio_read(4);   /* HEIGHT*/
-  jp2_struct->w = cio_read(4);   /* WIDTH*/
-  jp2_struct->numcomps = cio_read(2);   /* NC*/
+  jp2->h = cio_read(cio, 4);      /* HEIGHT */
+  jp2->w = cio_read(cio, 4);      /* WIDTH */
+  jp2->numcomps = cio_read(cio, 2);  /* NC */
+  jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
 
-  jp2_struct->bpc = cio_read(1);   /* BPC*/
+  jp2->bpc = cio_read(cio, 1);    /* BPC */
 
-  jp2_struct->C = cio_read(1);   /* C */
-  jp2_struct->UnkC = cio_read(1);   /* UnkC*/
-  jp2_struct->IPR = cio_read(1);   /* IPR*/
+  jp2->C = cio_read(cio, 1);      /* C */
+  jp2->UnkC = cio_read(cio, 1);    /* UnkC */
+  jp2->IPR = cio_read(cio, 1);    /* IPR */
 
-  if (cio_tell() - box.init_pos != box.length) {
-    fprintf(stderr, "Error with IHDR Box\n");
-    return 1;
+  if (cio_tell(cio) - box.init_pos != box.length) {
+    opj_event_msg(cinfo, EVT_ERROR, "Error with IHDR Box\n");
+    return false;
   }
-  return 0;
+
+  return true;
 }
 
-void jp2_write_ihdr(jp2_struct_t * jp2_struct)
-{
-  jp2_box_t box;
+static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) {
+  opj_jp2_box_t box;
 
-  box.init_pos = cio_tell();
-  cio_skip(4);
-  cio_write(JP2_IHDR, 4);   /* IHDR*/
+  box.init_pos = cio_tell(cio);
+  cio_skip(cio, 4);
+  cio_write(cio, 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(cio, jp2->h, 4);      /* HEIGHT */
+  cio_write(cio, jp2->w, 4);      /* WIDTH */
+  cio_write(cio, jp2->numcomps, 2);  /* NC */
 
-  cio_write(jp2_struct->bpc, 1);   /* BPC  */
+  cio_write(cio, jp2->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*/
+  cio_write(cio, jp2->C, 1);      /* C : Always 7 */
+  cio_write(cio, jp2->UnkC, 1);    /* UnkC, colorspace unknown */
+  cio_write(cio, jp2->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);
+  box.length = cio_tell(cio) - box.init_pos;
+  cio_seek(cio, box.init_pos);
+  cio_write(cio, box.length, 4);  /* L */
+  cio_seek(cio, box.init_pos + box.length);
 }
 
-
-void jp2_write_bpcc(jp2_struct_t * jp2_struct)
-{
+static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) {
   unsigned int i;
-  jp2_box_t box;
+  opj_jp2_box_t box;
 
-  box.init_pos = cio_tell();
-  cio_skip(4);
-  cio_write(JP2_BPCC, 4);   /* BPCC*/
+  box.init_pos = cio_tell(cio);
+  cio_skip(cio, 4);
+  cio_write(cio, JP2_BPCC, 4);  /* BPCC */
 
-  for (i = 0; i < jp2_struct->numcomps; i++)
-    cio_write(jp2_struct->comps[i].bpcc, 1);
+  for (i = 0; i < jp2->numcomps; i++) {
+    cio_write(cio, jp2->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);
+  box.length = cio_tell(cio) - box.init_pos;
+  cio_seek(cio, box.init_pos);
+  cio_write(cio, box.length, 4);  /* L */
+  cio_seek(cio, box.init_pos + box.length);
 }
 
 
-int jp2_read_bpcc(jp2_struct_t * jp2_struct)
-{
+static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) {
   unsigned int i;
-  jp2_box_t box;
+  opj_jp2_box_t box;
+
+  opj_common_ptr cinfo = jp2->cinfo;
 
-  jp2_read_boxhdr(&box);
+  jp2_read_boxhdr(cinfo, cio, &box);
   if (JP2_BPCC != box.type) {
-    fprintf(stderr, "Error: Expected BPCC Marker\n");
-    return 1;
+    opj_event_msg(cinfo, EVT_ERROR, "Expected BPCC Marker\n");
+    return false;
   }
 
-  for (i = 0; i < jp2_struct->numcomps; i++)
-    jp2_struct->comps[i].bpcc = cio_read(1);
+  for (i = 0; i < jp2->numcomps; i++) {
+    jp2->comps[i].bpcc = cio_read(cio, 1);
+  }
 
-  if (cio_tell() - box.init_pos != box.length) {
-    fprintf(stderr, "Error with BPCC Box\n");
-    return 1;
+  if (cio_tell(cio) - box.init_pos != box.length) {
+    opj_event_msg(cinfo, EVT_ERROR, "Error with BPCC Box\n");
+    return false;
   }
-  return 0;
+
+  return true;
 }
 
-void jp2_write_colr(jp2_struct_t * jp2_struct)
-{
-  jp2_box_t box;
+static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio) {
+  opj_jp2_box_t box;
 
-  box.init_pos = cio_tell();
-  cio_skip(4);
-  cio_write(JP2_COLR, 4);   /* COLR*/
+  box.init_pos = cio_tell(cio);
+  cio_skip(cio, 4);
+  cio_write(cio, 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*/
+  cio_write(cio, jp2->meth, 1);    /* METH */
+  cio_write(cio, jp2->precedence, 1);  /* PRECEDENCE */
+  cio_write(cio, jp2->approx, 1);    /* APPROX */
 
-  if (jp2_struct->meth == 1)
-    cio_write(jp2_struct->enumcs, 4);   /* EnumCS*/
-  else
-    cio_write(0, 1);      /* PROFILE (??)*/
+  if (jp2->meth == 1) {
+    cio_write(cio, jp2->enumcs, 4);  /* EnumCS */
+  } else {
+    cio_write(cio, 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);
+  box.length = cio_tell(cio) - box.init_pos;
+  cio_seek(cio, box.init_pos);
+  cio_write(cio, box.length, 4);  /* L */
+  cio_seek(cio, box.init_pos + box.length);
 }
 
-int jp2_read_colr(jp2_struct_t * jp2_struct)
-{
-  jp2_box_t box;
+static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio) {
+  opj_jp2_box_t box;
   int skip_len;
 
-  jp2_read_boxhdr(&box);
+  opj_common_ptr cinfo = jp2->cinfo;
+
+  jp2_read_boxhdr(cinfo, cio, &box);
   do {
     if (JP2_COLR != box.type) {
-      cio_skip(box.length - 8);
-      jp2_read_boxhdr(&box);
+      cio_skip(cio, box.length - 8);
+      jp2_read_boxhdr(cinfo, cio, &box);
     }
-  } while (JP2_COLR != box.type);
+  } while(JP2_COLR != box.type);
 
-  jp2_struct->meth = cio_read(1);   /* METH*/
-  jp2_struct->precedence = cio_read(1);   /* PRECEDENCE*/
-  jp2_struct->approx = cio_read(1);   /* APPROX*/
+  jp2->meth = cio_read(cio, 1);    /* METH */
+  jp2->precedence = cio_read(cio, 1);  /* PRECEDENCE */
+  jp2->approx = cio_read(cio, 1);    /* APPROX */
 
-  if (jp2_struct->meth == 1)
-    jp2_struct->enumcs = cio_read(4);   /* EnumCS*/
-  else {
-    /* SKIP PROFILE     */
-    skip_len = box.init_pos + box.length - cio_tell();
+  if (jp2->meth == 1) {
+    jp2->enumcs = cio_read(cio, 4);  /* EnumCS */
+  else {
+    /* skip PROFILE */
+    skip_len = box.init_pos + box.length - cio_tell(cio);
     if (skip_len < 0) {
-      fprintf(stderr, "Error with JP2H box size\n");
-      return 1;
+      opj_event_msg(cinfo, EVT_ERROR, "Error with JP2H box size\n");
+      return false;
     }
-    cio_skip(box.init_pos + box.length - cio_tell());
+    cio_skip(cio, box.init_pos + box.length - cio_tell(cio));
   }
 
-  if (cio_tell() - box.init_pos != box.length) {
-    fprintf(stderr, "Error with BPCC Box\n");
-    return 1;
+  if (cio_tell(cio) - box.init_pos != box.length) {
+    opj_event_msg(cinfo, EVT_ERROR, "Error with BPCC Box\n");
+    return false;
   }
-  return 0;
+  return true;
 }
 
-/*
-* Write the JP2H box
-*
-* JP2 Header box
-*
-*/
-void jp2_write_jp2h(jp2_struct_t * jp2_struct)
-{
-  jp2_box_t box;
+static void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) {
+  opj_jp2_box_t box;
 
-  box.init_pos = cio_tell();
-  cio_skip(4);;
-  cio_write(JP2_JP2H, 4);   /* JP2H */
+  box.init_pos = cio_tell(cio);
+  cio_skip(cio, 4);
+  cio_write(cio, JP2_JP2H, 4);  /* JP2H */
 
-  jp2_write_ihdr(jp2_struct);
+  jp2_write_ihdr(jp2, cio);
 
-  if (jp2_struct->bpc == 255)
-    jp2_write_bpcc(jp2_struct);
-  jp2_write_colr(jp2_struct);
+  if (jp2->bpc == 255) {
+    jp2_write_bpcc(jp2, cio);
+  }
+  jp2_write_colr(jp2, cio);
 
-  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);
+  box.length = cio_tell(cio) - box.init_pos;
+  cio_seek(cio, box.init_pos);
+  cio_write(cio, box.length, 4);  /* L */
+  cio_seek(cio, 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;
+static bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) {
+  opj_jp2_box_t box;
   int skip_len;
 
-  jp2_read_boxhdr(&box);
+  opj_common_ptr cinfo = jp2->cinfo;
+
+  jp2_read_boxhdr(cinfo, cio, &box);
   do {
     if (JP2_JP2H != box.type) {
       if (box.type == JP2_JP2C) {
-   fprintf(stderr, "Error: Expected JP2H Marker\n");
-   return 1;
+        opj_event_msg(cinfo, EVT_ERROR, "Expected JP2H Marker\n");
+        return false;
       }
-      cio_skip(box.length - 8);
-      jp2_read_boxhdr(&box);
+      cio_skip(cio, box.length - 8);
+      jp2_read_boxhdr(cinfo, cio, &box);
     }
-  } while (JP2_JP2H != box.type);
+  } while(JP2_JP2H != box.type);
 
-  if (jp2_read_ihdr(jp2_struct))
-    return 1;
+  if (!jp2_read_ihdr(jp2, cio))
+    return false;
 
-  if (jp2_struct->bpc == 255) {
-    if (jp2_read_bpcc(jp2_struct))
-      return 1;
+  if (jp2->bpc == 255) {
+    if (!jp2_read_bpcc(jp2, cio))
+      return false;
   }
+  if (!jp2_read_colr(jp2, cio))
+    return false;
 
-  if (jp2_read_colr(jp2_struct))
-    return 1;
-
-  skip_len = box.init_pos + box.length - cio_tell();
+  skip_len = box.init_pos + box.length - cio_tell(cio);
   if (skip_len < 0) {
-    fprintf(stderr, "Error with JP2H box size\n");
-    return 1;
+    opj_event_msg(cinfo, EVT_ERROR, "Error with JP2H Box\n");
+    return false;
   }
-  cio_skip(box.init_pos + box.length - cio_tell());
+  cio_skip(cio, box.init_pos + box.length - cio_tell(cio));
 
-  return 0;
+  return true;
 }
 
-/*
-* Write the FTYP box
-*
-* File type box
-*
-*/
-void jp2_write_ftyp(jp2_struct_t * jp2_struct)
-{
+static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) {
   unsigned int i;
-  jp2_box_t box;
+  opj_jp2_box_t box;
 
-  box.init_pos = cio_tell();
-  cio_skip(4);
-  cio_write(JP2_FTYP, 4);   /* FTYP       */
+  box.init_pos = cio_tell(cio);
+  cio_skip(cio, 4);
+  cio_write(cio, JP2_FTYP, 4);    /* FTYP */
 
-  cio_write(jp2_struct->brand, 4);   /* BR         */
-  cio_write(jp2_struct->minversion, 4);   /* MinV       */
+  cio_write(cio, jp2->brand, 4);    /* BR */
+  cio_write(cio, jp2->minversion, 4);  /* MinV */
 
-  for (i = 0; i < jp2_struct->numcl; i++)
-    cio_write(jp2_struct->cl[i], 4);   /* CL           */
+  for (i = 0; i < jp2->numcl; i++) {
+    cio_write(cio, jp2->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);
+  box.length = cio_tell(cio) - box.init_pos;
+  cio_seek(cio, box.init_pos);
+  cio_write(cio, box.length, 4);  /* L */
+  cio_seek(cio, box.init_pos + box.length);
 }
 
-/*
-* Read the FTYP box
-*
-* File type box
-*
-*/
-int jp2_read_ftyp(jp2_struct_t * jp2_struct)
-{
+static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) {
   int i;
-  jp2_box_t box;
+  opj_jp2_box_t box;
+
+  opj_common_ptr cinfo = jp2->cinfo;
 
-  jp2_read_boxhdr(&box);
+  jp2_read_boxhdr(cinfo, cio, &box);
 
   if (JP2_FTYP != box.type) {
-    fprintf(stderr, "Error: Excpected FTYP Marker\n");
-    return 1;
+    opj_event_msg(cinfo, EVT_ERROR, "Expected FTYP Marker\n");
+    return false;
   }
 
-  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));
+  jp2->brand = cio_read(cio, 4);    /* BR */
+  jp2->minversion = cio_read(cio, 4);  /* MinV */
+  jp2->numcl = (box.length - 16) / 4;
+  jp2->cl = (unsigned int *) opj_malloc(jp2->numcl * sizeof(unsigned int));
 
-  for (i = 0; i < (int) jp2_struct->numcl; i++)
-    jp2_struct->cl[i] = cio_read(4);   /* CLi */
+  for (i = 0; i < (int)jp2->numcl; i++) {
+    jp2->cl[i] = cio_read(cio, 4);  /* CLi */
+  }
 
-  if (cio_tell() - box.init_pos != box.length) {
-    fprintf(stderr, "Error with FTYP Box\n");
-    return 1;
+  if (cio_tell(cio) - box.init_pos != box.length) {
+    opj_event_msg(cinfo, EVT_ERROR, "Error with FTYP Box\n");
+    return false;
   }
-  return 0;
+
+  return true;
 }
 
-int jp2_write_jp2c(int j2k_codestream_len, int *j2k_codestream_offset,
-         char *j2k_codestream)
-{
-  jp2_box_t box;
+static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, char *index) {
+  unsigned int j2k_codestream_offset, j2k_codestream_length;
+  opj_jp2_box_t box;
 
-  box.init_pos = cio_tell();
-  cio_skip(4);
-  cio_write(JP2_JP2C, 4);   /* JP2C*/
+  opj_j2k_t *j2k = jp2->j2k;
+  opj_image_t *image = jp2->image;
 
-  *j2k_codestream_offset = cio_tell();
-  memcpy(cio_getbp(), j2k_codestream, j2k_codestream_len);
+  box.init_pos = cio_tell(cio);
+  cio_skip(cio, 4);
+  cio_write(cio, JP2_JP2C, 4);  /* JP2C */
 
-  box.length = 8 + j2k_codestream_len;
-  cio_seek(box.init_pos);
-  cio_write(box.length, 4);   /*    L       */
-  cio_seek(box.init_pos + box.length);
+  /* J2K encoding */
+  j2k_codestream_offset = cio_tell(cio);
+  if(!j2k_encode(j2k, cio, image, index)) {
+    opj_event_msg(j2k->cinfo, EVT_ERROR, "Failed to encode image\n");
+    return 0;
+  }
+  j2k_codestream_length = cio_tell(cio) - j2k_codestream_offset;
+
+  jp2->j2k_codestream_offset = j2k_codestream_offset;
+  jp2->j2k_codestream_length = j2k_codestream_length;
+
+  box.length = 8 + jp2->j2k_codestream_length;
+  cio_seek(cio, box.init_pos);
+  cio_write(cio, box.length, 4);  /* L */
+  cio_seek(cio, box.init_pos + box.length);
 
   return box.length;
 }
 
+static bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset) {
+  opj_jp2_box_t box;
 
-int jp2_read_jp2c(unsigned int *j2k_codestream_len,
-        unsigned int *j2k_codestream_offset)
-{
-  jp2_box_t box;
+  opj_common_ptr cinfo = jp2->cinfo;
 
-  jp2_read_boxhdr(&box);
+  jp2_read_boxhdr(cinfo, cio, &box);
   do {
-    if (JP2_JP2C != box.type) {
-      cio_skip(box.length - 8);
-      jp2_read_boxhdr(&box);
+    if(JP2_JP2C != box.type) {
+      cio_skip(cio, box.length - 8);
+      jp2_read_boxhdr(cinfo, cio, &box);
     }
-  } while (JP2_JP2C != box.type);
+  } while(JP2_JP2C != box.type);
 
-  *j2k_codestream_offset = cio_tell();
-  *j2k_codestream_len = box.length - 8;
+  *j2k_codestream_offset = cio_tell(cio);
+  *j2k_codestream_length = box.length - 8;
 
-  return 0;
+  return true;
 }
 
-void jp2_write_jp()
-{
-  jp2_box_t box;
+static void jp2_write_jp(opj_cio_t *cio) {
+  opj_jp2_box_t box;
 
-  box.init_pos = cio_tell();
-  cio_skip(4);
-  cio_write(JP2_JP, 4);      /* JP*/
-  cio_write(0x0d0a870a, 4);
+  box.init_pos = cio_tell(cio);
+  cio_skip(cio, 4);
+  cio_write(cio, JP2_JP, 4);    /* JP2 signature */
+  cio_write(cio, 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);
+  box.length = cio_tell(cio) - box.init_pos;
+  cio_seek(cio, box.init_pos);
+  cio_write(cio, box.length, 4);  /* L */
+  cio_seek(cio, 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;
+static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio) {
+  opj_jp2_box_t box;
 
-  jp2_read_boxhdr(&box);
+  opj_common_ptr cinfo = jp2->cinfo;
+
+  jp2_read_boxhdr(cinfo, cio, &box);
   if (JP2_JP != box.type) {
-    fprintf(stderr, "Error: Expected JP Marker\n");
-    return 1;
+    opj_event_msg(cinfo, EVT_ERROR, "Expected JP Marker\n");
+    return false;
   }
-  if (0x0d0a870a != cio_read(4)) {
-    fprintf(stderr, "Error with JP Marker\n");
-    return 1;
+  if (0x0d0a870a != cio_read(cio, 4)) {
+    opj_event_msg(cinfo, EVT_ERROR, "Error with JP Marker\n");
+    return false;
   }
-  if (cio_tell() - box.init_pos != box.length) {
-    fprintf(stderr, "Error with JP Box size\n");
-    return 1;
+  if (cio_tell(cio) - box.init_pos != box.length) {
+    opj_event_msg(cinfo, EVT_ERROR, "Error with JP Box size\n");
+    return false;
   }
-  return 0;
 
+  return true;
 }
 
 
-int jp2_read_struct(unsigned char *src, jp2_struct_t * jp2_struct, int len)
-{
-  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
-      (&jp2_struct->j2k_codestream_len,
-       &jp2_struct->j2k_codestream_offset))
-    return 1;
-  return 0;
+static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio) {
+  if (!jp2_read_jp(jp2, cio))
+    return false;
+  if (!jp2_read_ftyp(jp2, cio))
+    return false;
+  if (!jp2_read_jp2h(jp2, cio))
+    return false;
+  if (!jp2_read_jp2c(jp2, cio, &jp2->j2k_codestream_length, &jp2->j2k_codestream_offset))
+    return false;
+  
+  return true;
+}
+
+/* ----------------------------------------------------------------------- */
+/* JP2 decoder interface                                             */
+/* ----------------------------------------------------------------------- */
+
+opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo) {
+  opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t));
+  if(jp2) {
+    jp2->cinfo = cinfo;
+    /* create the J2K codec */
+    jp2->j2k = j2k_create_decompress(cinfo);
+    if(jp2->j2k == NULL) {
+      jp2_destroy_decompress(jp2);
+      return NULL;
+    }
+  }
+  return jp2;
 }
 
-int jp2_wrap_j2k(jp2_struct_t * jp2_struct, char *j2k_codestream,
-       char *output)
-{
-  (void)output;
-  jp2_write_jp();
-  jp2_write_ftyp(jp2_struct);
-  jp2_write_jp2h(jp2_struct);
+void jp2_destroy_decompress(opj_jp2_t *jp2) {
+  if(jp2) {
+    /* destroy the J2K codec */
+    j2k_destroy_decompress(jp2->j2k);
 
-  jp2_write_jp2c(jp2_struct->j2k_codestream_len,
-       &jp2_struct->j2k_codestream_offset, j2k_codestream);
+    if(jp2->comps) {
+      opj_free(jp2->comps);
+    }
+    if(jp2->cl) {
+      opj_free(jp2->cl);
+    }
+    opj_free(jp2);
+  }
+}
 
-  return cio_tell();
+void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters) {
+  /* setup the J2K codec */
+  j2k_setup_decoder(jp2->j2k, parameters);
+  /* further JP2 initializations go here */
+}
+
+opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio) {
+  opj_common_ptr cinfo;
+  opj_image_t *image = NULL;
+
+  if(!jp2 || !cio) {
+    return NULL;
+  }
+
+  cinfo = jp2->cinfo;
+
+  /* JP2 decoding */
+  if(!jp2_read_struct(jp2, cio)) {
+    opj_event_msg(cinfo, EVT_ERROR, "Failed to decode jp2 structure\n");
+    return NULL;
+  }
+
+  /* J2K decoding */
+  image = j2k_decode(jp2->j2k, cio);
+  if(!image) {
+    opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n");
+  }
+
+  return image;
+}
+
+/* ----------------------------------------------------------------------- */
+/* JP2 encoder interface                                             */
+/* ----------------------------------------------------------------------- */
+
+opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo) {
+  opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t));
+  if(jp2) {
+    jp2->cinfo = cinfo;
+    /* create the J2K codec */
+    jp2->j2k = j2k_create_compress(cinfo);
+    if(jp2->j2k == NULL) {
+      jp2_destroy_compress(jp2);
+      return NULL;
+    }
+  }
+  return jp2;
 }
+
+void jp2_destroy_compress(opj_jp2_t *jp2) {
+  if(jp2) {
+    /* destroy the J2K codec */
+    j2k_destroy_compress(jp2->j2k);
+
+    if(jp2->comps) {
+      opj_free(jp2->comps);
+    }
+    if(jp2->cl) {
+      opj_free(jp2->cl);
+    }
+    opj_free(jp2);
+  }
+}
+
+void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image) {
+  int i;
+  int depth_0, sign;
+
+  if(!jp2 || !parameters || !image)
+    return;
+
+  /* setup the J2K codec */
+  /* ------------------- */
+
+  j2k_setup_encoder(jp2->j2k, parameters, image);
+
+  /* setup the JP2 codec */
+  /* ------------------- */
+  
+  /* Profile box */
+
+  jp2->brand = JP2_JP2;  /* BR */
+  jp2->minversion = 0;  /* MinV */
+  jp2->numcl = 1;
+  jp2->cl = (unsigned int*) opj_malloc(jp2->numcl * sizeof(unsigned int));
+  jp2->cl[0] = JP2_JP2;  /* CL0 : JP2 */
+
+  /* Image Header box */
+
+  jp2->image = image;
+
+  jp2->numcomps = image->numcomps;  /* NC */
+  jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
+  jp2->h = image->y1 - image->y0;    /* HEIGHT */
+  jp2->w = image->x1 - image->x0;    /* WIDTH */
+  /* BPC */
+  depth_0 = image->comps[0].prec - 1;
+  sign = image->comps[0].sgnd;
+  jp2->bpc = depth_0 + (sign << 7);
+  for (i = 1; i < image->numcomps; i++) {
+    int depth = image->comps[i].prec - 1;
+    sign = image->comps[i].sgnd;
+    if (depth_0 != depth)
+      jp2->bpc = 255;
+  }
+  jp2->C = 7;      /* C : Always 7 */
+  jp2->UnkC = 0;    /* UnkC, colorspace specified in colr box */
+  jp2->IPR = 0;    /* IPR, no intellectual property */
+  
+  /* BitsPerComponent box */
+
+  for (i = 0; i < image->numcomps; i++) {
+    jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);
+  }
+
+  /* Colour Specification box */
+
+  if ((image->numcomps == 1 || image->numcomps == 3) && (jp2->bpc != 255)) {
+    jp2->meth = 1;  /* METH: Enumerated colourspace */
+  } else {
+    jp2->meth = 2;  /* METH: Restricted ICC profile */
+  }
+  if (jp2->meth == 1) {
+    if (image->color_space == 1)
+      jp2->enumcs = 16;  /* sRGB as defined by IEC 61966\962\961 */
+    else if (image->color_space == 2)
+      jp2->enumcs = 17;  /* greyscale */
+    else if (image->color_space == 3)
+      jp2->enumcs = 18;  /* YUV */
+  } else {
+    jp2->enumcs = 0;    /* PROFILE (??) */
+  }
+  jp2->precedence = 0;  /* PRECEDENCE */
+  jp2->approx = 0;    /* APPROX */
+
+}
+
+bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, char *index) {
+  (void)image;
+
+  /* JP2 encoding */
+
+  /* JPEG 2000 Signature box */
+  jp2_write_jp(cio);
+  /* File Type box */
+  jp2_write_ftyp(jp2, cio);
+  /* JP2 Header box */
+  jp2_write_jp2h(jp2, cio);
+
+  /* J2K encoding */
+
+  if(!jp2_write_jp2c(jp2, cio, index)) {
+    opj_event_msg(jp2->cinfo, EVT_ERROR, "Failed to encode image\n");
+    return false;
+  }
+
+  return true;
+}
+
+
index da45aba2d314e7247801473fe4949afee7aa5366..1d47fa6e29d662ec3dcb1e9e52cab8748edbcbec 100644 (file)
-/*
- * 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;
-  unsigned int j2k_codestream_offset;
-  unsigned int j2k_codestream_len;
-} 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);
-
-/* int jp2_write_jp2c(int j2k_len, int *j2k_codestream_offset, char *j2k_codestream)
- *
- * Write the jp2c codestream box 
- * j2k_len: the j2k codestream length
- * j2k_codestream_offset: the function will return the j2k codestream offset
- * j2k_codestream: the j2k codestream to include in jp2 file
- */
-int jp2_write_jp2c(int j2k_len, int *j2k_codestream_offset, char *j2k_codestream);
-
-/* 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_wrap_j2k(jp2_struct_t * jp2_struct, char *j2k_codestream, 
-     int j2k_len, char *output)
- *
- * Wrap a J2K codestream in a JP2 file
- * jp2_struct: the jp2 structure used to create jp2 boxes
- * j2k_codestream: the j2k codestream to include in jp2 file
- * output: pointer to jp2 codestream that will be created
- */
-int jp2_wrap_j2k(jp2_struct_t * jp2_struct, char *j2k_codestream, 
-        char *output);
-
-
-/* int jp2_read_struct(unsigned char *src, jp2_struct_t * jp2_struct);
- *
- * Decode the structure of a JP2 file
- * src: pointer to memory where compressed data is stored
- * jp2_struct: the jp2 structure that will be created 
- * len: length of jp2 codestream
- */
-int jp2_read_struct(unsigned char *src, jp2_struct_t * jp2_struct, int len);
-
-#endif
+/*\r
+ * Copyright (c) 2004, Yannick Verschueren\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#ifndef __JP2_H\r
+#define __JP2_H\r
+/**\r
+@file jp2.h\r
+@brief The JPEG-2000 file format Reader/Writer (JP2)\r
+\r
+*/\r
+\r
+/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */\r
+/*@{*/\r
+\r
+#define JPIP_JPIP 0x6a706970\r
+\r
+#define JP2_JP   0x6a502020    /**< JPEG 2000 signature box */\r
+#define JP2_FTYP 0x66747970    /**< File type box */\r
+#define JP2_JP2H 0x6a703268    /**< JP2 header box */\r
+#define JP2_IHDR 0x69686472    /**< Image header box */\r
+#define JP2_COLR 0x636f6c72    /**< Colour specification box */\r
+#define JP2_JP2C 0x6a703263    /**< Contiguous codestream box */\r
+#define JP2_URL  0x75726c20    /**< URL box */\r
+#define JP2_DBTL 0x6474626c    /**< ??? */\r
+#define JP2_BPCC 0x62706363    /**< Bits per component box */\r
+#define JP2_JP2  0x6a703220    /**< File type fields */\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+/** \r
+JP2 component\r
+*/\r
+typedef struct opj_jp2_comps {\r
+  int depth;      \r
+  int sgnd;       \r
+  int bpcc;\r
+} opj_jp2_comps_t;\r
+\r
+/**\r
+JPEG-2000 file format reader/writer\r
+*/\r
+typedef struct opj_jp2 {\r
+  /** codec context */\r
+  opj_common_ptr cinfo;\r
+  /** handle to the J2K codec  */\r
+  opj_j2k_t *j2k;\r
+  unsigned int w;\r
+  unsigned int h;\r
+  unsigned int numcomps;\r
+  unsigned int bpc;\r
+  unsigned int C;\r
+  unsigned int UnkC;\r
+  unsigned int IPR;\r
+  unsigned int meth;\r
+  unsigned int approx;\r
+  unsigned int enumcs;\r
+  unsigned int precedence;\r
+  unsigned int brand;\r
+  unsigned int minversion;\r
+  unsigned int numcl;\r
+  unsigned int *cl;\r
+  opj_jp2_comps_t *comps;\r
+  opj_image_t *image;\r
+  unsigned int j2k_codestream_offset;\r
+  unsigned int j2k_codestream_length;\r
+} opj_jp2_t;\r
+\r
+/**\r
+JP2 Box\r
+*/\r
+typedef struct opj_jp2_box {\r
+  int length;\r
+  int type;\r
+  int init_pos;\r
+} opj_jp2_box_t;\r
+\r
+/** @name Exported functions */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+/**\r
+Creates a JP2 decompression structure\r
+@param cinfo Codec context info\r
+@return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise\r
+*/\r
+opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo);\r
+/**\r
+Destroy a JP2 decompressor handle\r
+@param jp2 JP2 decompressor handle to destroy\r
+*/\r
+void jp2_destroy_decompress(opj_jp2_t *jp2);\r
+/**\r
+Setup the decoder decoding parameters using user parameters.\r
+Decoding parameters are returned in jp2->j2k->cp. \r
+@param jp2 JP2 decompressor handle\r
+@param parameters decompression parameters\r
+*/\r
+void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);\r
+/**\r
+Decode an image from a JPEG-2000 file stream\r
+@param jp2 JP2 decompressor handle\r
+@param cio Input buffer stream\r
+@return Returns a decoded image if successful, returns NULL otherwise\r
+*/\r
+opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio);\r
+/**\r
+Creates a JP2 compression structure\r
+@param cinfo Codec context info\r
+@return Returns a handle to a JP2 compressor if successful, returns NULL otherwise\r
+*/\r
+opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo);\r
+/**\r
+Destroy a JP2 compressor handle\r
+@param jp2 JP2 compressor handle to destroy\r
+*/\r
+void jp2_destroy_compress(opj_jp2_t *jp2);\r
+/**\r
+Setup the encoder parameters using the current image and using user parameters. \r
+Coding parameters are returned in jp2->j2k->cp. \r
+@param jp2 JP2 compressor handle\r
+@param parameters compression parameters\r
+@param image input filled image\r
+*/\r
+void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image);\r
+/**\r
+Encode an image into a JPEG-2000 file stream\r
+@param jp2 JP2 compressor handle\r
+@param cio Output buffer stream\r
+@param image Image to encode\r
+@param index Name of the index file if required, NULL otherwise\r
+@return Returns true if successful, returns false otherwise\r
+*/\r
+bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, char *index);\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __JP2_H */\r
+\r
index 909cc6302111dcba4c7e45ed69e868ad276c392e..032d3bcf2d8a8c0aa26778476a4a9670b8f16d03 100644 (file)
-/*
- * 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 >> 4) & 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->Class_Id & 0x01) == 1) {
-    header->Layer_nb = 0;
-    header->Layer_nb = jpt_read_VBAS_info(header->Layer_nb);
-  }
-}
+/*\r
+ * Copyright (c) 2004, Yannick Verschueren\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+/*\r
+ * Read the information contains in VBAS [JPP/JPT stream message header]\r
+ * Store information (7 bits) in value\r
+ *\r
+ */\r
+unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) {\r
+  unsigned char elmt;\r
+\r
+  elmt = cio_read(cio, 1);\r
+  while ((elmt >> 7) == 1) {\r
+    value = (value << 7);\r
+    value |= (elmt & 0x7f);\r
+    elmt = cio_read(cio, 1);\r
+  }\r
+  value = (value << 7);\r
+  value |= (elmt & 0x7f);\r
+\r
+  return value;\r
+}\r
+\r
+/*\r
+ * Initialize the value of the message header structure \r
+ *\r
+ */\r
+void jpt_init_msg_header(opj_jpt_msg_header_t * header) {\r
+  header->Id = 0;    /* In-class Identifier    */\r
+  header->last_byte = 0;  /* Last byte information  */\r
+  header->Class_Id = 0;    /* Class Identifier       */\r
+  header->CSn_Id = 0;    /* CSn : index identifier */\r
+  header->Msg_offset = 0;  /* Message offset         */\r
+  header->Msg_length = 0;  /* Message length         */\r
+  header->Layer_nb = 0;    /* Auxiliary for JPP case */\r
+}\r
+\r
+/*\r
+ * Re-initialize the value of the message header structure\r
+ *\r
+ * Only parameters always present in message header\r
+ *\r
+ */\r
+void jpt_reinit_msg_header(opj_jpt_msg_header_t * header) {\r
+  header->Id = 0;    /* In-class Identifier    */\r
+  header->last_byte = 0;  /* Last byte information  */\r
+  header->Msg_offset = 0;  /* Message offset         */\r
+  header->Msg_length = 0;  /* Message length         */\r
+}\r
+\r
+/*\r
+ * Read the message header for a JPP/JPT - stream\r
+ *\r
+ */\r
+void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header) {\r
+  unsigned char elmt, Class = 0, CSn = 0;\r
+  jpt_reinit_msg_header(header);\r
+\r
+  /* ------------- */\r
+  /* VBAS : Bin-ID */\r
+  /* ------------- */\r
+  elmt = cio_read(cio, 1);\r
+\r
+  /* See for Class and CSn */\r
+  switch ((elmt >> 5) & 0x03) {\r
+    case 0:\r
+      opj_event_msg(cinfo, EVT_ERROR, "Forbidden value encounter in message header !!\n");\r
+      break;\r
+    case 1:\r
+      Class = 0;\r
+      CSn = 0;\r
+      break;\r
+    case 2:\r
+      Class = 1;\r
+      CSn = 0;\r
+      break;\r
+    case 3:\r
+      Class = 1;\r
+      CSn = 1;\r
+      break;\r
+    default:\r
+      break;\r
+  }\r
+\r
+  /* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */\r
+  if (((elmt >> 4) & 0x01) == 1)\r
+    header->last_byte = 1;\r
+\r
+  /* In-class identifier */\r
+  header->Id |= (elmt & 0x0f);\r
+  if ((elmt >> 7) == 1)\r
+    header->Id = jpt_read_VBAS_info(cio, header->Id);\r
+\r
+  /* ------------ */\r
+  /* VBAS : Class */\r
+  /* ------------ */\r
+  if (Class == 1) {\r
+    header->Class_Id = 0;\r
+    header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id);\r
+  }\r
+\r
+  /* ---------- */\r
+  /* VBAS : CSn */\r
+  /* ---------- */\r
+  if (CSn == 1) {\r
+    header->CSn_Id = 0;\r
+    header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id);\r
+  }\r
+\r
+  /* ----------------- */\r
+  /* VBAS : Msg_offset */\r
+  /* ----------------- */\r
+  header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset);\r
+\r
+  /* ----------------- */\r
+  /* VBAS : Msg_length */\r
+  /* ----------------- */\r
+  header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length);\r
+\r
+  /* ---------- */\r
+  /* VBAS : Aux */\r
+  /* ---------- */\r
+  if ((header->Class_Id & 0x01) == 1) {\r
+    header->Layer_nb = 0;\r
+    header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb);\r
+  }\r
+}\r
index 37cf631f69e6bb52a641aa9ac08954fd975c0a29..71b32842b269c2932c50caa1e7e2d4f3f3a4bed1 100644 (file)
@@ -1,56 +1,74 @@
-/*
- * 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);
+/*\r
+ * Copyright (c) 2004, Yannick Verschueren\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#ifndef __JPT_H\r
+#define __JPT_H\r
+/**\r
+@file jpt.h\r
+@brief JPT-stream reader (JPEG 2000, JPIP)\r
+\r
+JPT-stream functions are implemented in J2K.C. \r
+*/\r
+\r
+/**\r
+Message Header JPT stream structure\r
+*/\r
+typedef struct opj_jpt_msg_header {\r
+  /** In-class Identifier */\r
+  unsigned int Id;\r
+  /** Last byte information */\r
+  unsigned int last_byte;  \r
+  /** Class Identifier */\r
+  unsigned int Class_Id;  \r
+  /** CSn : index identifier */\r
+  unsigned int CSn_Id;\r
+  /** Message offset */\r
+  unsigned int Msg_offset;\r
+  /** Message length */\r
+  unsigned int Msg_length;\r
+  /** Auxiliary for JPP case */\r
+  unsigned int Layer_nb;\r
+} opj_jpt_msg_header_t;\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+/**\r
+Initialize the value of the message header structure \r
+@param header Message header structure\r
+*/\r
+void jpt_init_msg_header(opj_jpt_msg_header_t * header);\r
+\r
+/**\r
+Read the message header for a JPP/JPT - stream\r
+@param cinfo Codec context info\r
+@param cio CIO handle\r
+@param header Message header structure\r
+*/\r
+void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header);\r
+\r
+#endif\r
index 185c1b66dc351a6fadba150bd1a14e679e8df667..4dee4b3a8e8fe29e5f247010c62175411f164853 100644 (file)
-/*
- * 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];
-}
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+/* <summary> */\r
+/* This table contains the norms of the basis function of the reversible MCT. */\r
+/* </summary> */\r
+static const double mct_norms[3] = { 1.732, .8292, .8292 };\r
+\r
+/* <summary> */\r
+/* This table contains the norms of the basis function of the irreversible MCT. */\r
+/* </summary> */\r
+static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 };\r
+\r
+/* <summary> */\r
+/* Foward reversible MCT. */\r
+/* </summary> */\r
+void mct_encode(int *c0, int *c1, int *c2, int n) {\r
+  int i;\r
+  for (i = 0; i < n; i++) {\r
+    int r, g, b, y, u, v;\r
+    r = c0[i];\r
+    g = c1[i];\r
+    b = c2[i];\r
+    y = (r + (g << 1) + b) >> 2;\r
+    u = b - g;\r
+    v = r - g;\r
+    c0[i] = y;\r
+    c1[i] = u;\r
+    c2[i] = v;\r
+  }\r
+}\r
+\r
+/* <summary> */\r
+/* Inverse reversible MCT. */\r
+/* </summary> */\r
+void mct_decode(int *c0, int *c1, int *c2, int n) {\r
+  int i;\r
+  for (i = 0; i < n; i++) {\r
+    int y, u, v, r, g, b;\r
+    y = c0[i];\r
+    u = c1[i];\r
+    v = c2[i];\r
+    g = y - ((u + v) >> 2);\r
+    r = v + g;\r
+    b = u + g;\r
+    c0[i] = r;\r
+    c1[i] = g;\r
+    c2[i] = b;\r
+  }\r
+}\r
+\r
+/* <summary> */\r
+/* Get norm of basis function of reversible MCT. */\r
+/* </summary> */\r
+double mct_getnorm(int compno) {\r
+  return mct_norms[compno];\r
+}\r
+\r
+/* <summary> */\r
+/* Foward irreversible MCT. */\r
+/* </summary> */\r
+void mct_encode_real(int *c0, int *c1, int *c2, int n) {\r
+  int i;\r
+  for (i = 0; i < n; i++) {\r
+    int r, g, b, y, u, v;\r
+    r = c0[i];\r
+    g = c1[i];\r
+    b = c2[i];\r
+    y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934);\r
+    u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096);\r
+    v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666);\r
+    c0[i] = y;\r
+    c1[i] = u;\r
+    c2[i] = v;\r
+  }\r
+}\r
+\r
+/* <summary> */\r
+/* Inverse irreversible MCT. */\r
+/* </summary> */\r
+void mct_decode_real(int *c0, int *c1, int *c2, int n) {\r
+  int i;\r
+  for (i = 0; i < n; i++) {\r
+    int y, u, v, r, g, b;\r
+    y = c0[i];\r
+    u = c1[i];\r
+    v = c2[i];\r
+    r = y + fix_mul(v, 11485);\r
+    g = y - fix_mul(u, 2819) - fix_mul(v, 5850);\r
+    b = y + fix_mul(u, 14516);\r
+    c0[i] = r;\r
+    c1[i] = g;\r
+    c2[i] = b;\r
+  }\r
+}\r
+\r
+/* <summary> */\r
+/* Get norm of basis function of irreversible MCT. */\r
+/* </summary> */\r
+double mct_getnorm_real(int compno) {\r
+  return mct_norms_real[compno];\r
+}\r
index 196dc6d3c64955a7807072117f41d8ffae31e2b9..aad10ec29a2ddac3ec7aaa4c764b69b20eed0f4f 100644 (file)
@@ -1,74 +1,97 @@
-/*
- * 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
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#ifndef __MCT_H\r
+#define __MCT_H\r
+/**\r
+@file mct.h\r
+@brief Implementation of a multi-component transforms (MCT)\r
+\r
+The functions in MCT.C have for goal to realize reversible and irreversible multicomponent\r
+transform. The functions in MCT.C are used by some function in TCD.C.\r
+*/\r
+\r
+/** @defgroup MCT MCT - Implementation of a multi-component transform */\r
+/*@{*/\r
+\r
+/** @name Exported functions */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+/**\r
+Apply a reversible multi-component transform to an image\r
+@param c0 Samples for red component\r
+@param c1 Samples for green component\r
+@param c2 Samples blue component\r
+@param n Number of samples for each component\r
+*/\r
+void mct_encode(int *c0, int *c1, int *c2, int n);\r
+/**\r
+Apply a reversible multi-component inverse transform to an image\r
+@param c0 Samples for luminance component\r
+@param c1 Samples for red chrominance component\r
+@param c2 Samples for blue chrominance component\r
+@param n Number of samples for each component\r
+*/\r
+void mct_decode(int *c0, int *c1, int *c2, int n);\r
+/**\r
+Get norm of the basis function used for the reversible multi-component transform\r
+@param compno Number of the component (0->Y, 1->U, 2->V)\r
+@return \r
+*/\r
+double mct_getnorm(int compno);\r
+\r
+/**\r
+Apply an irreversible multi-component transform to an image\r
+@param c0 Samples for red component\r
+@param c1 Samples for green component\r
+@param c2 Samples blue component\r
+@param n Number of samples for each component\r
+*/\r
+void mct_encode_real(int *c0, int *c1, int *c2, int n);\r
+/**\r
+Apply an irreversible multi-component inverse transform to an image\r
+@param c0 Samples for luminance component\r
+@param c1 Samples for red chrominance component\r
+@param c2 Samples for blue chrominance component\r
+@param n Number of samples for each component\r
+*/\r
+void mct_decode_real(int *c0, int *c1, int *c2, int n);\r
+/**\r
+Get norm of the basis function used for the irreversible multi-component transform\r
+@param compno Number of the component (0->Y, 1->U, 2->V)\r
+@return \r
+*/\r
+double mct_getnorm_real(int compno);\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __MCT_H */\r
index 492d704f1828b0688f7881c5eea59e5092b49d61..e37e132e4acbb7662fae78b70caeaa999511aa7d 100644 (file)
-/*
- * 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)];
-}
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+/** @defgroup MQC MQC - Implementation of an MQ-Coder */\r
+/*@{*/\r
+\r
+/** @name Local static functions */\r
+/*@{*/\r
+\r
+/**\r
+Output a byte, doing bit-stuffing if necessary.\r
+After a 0xff byte, the next byte must be smaller than 0x90.\r
+@param mqc MQC handle\r
+*/\r
+static void mqc_byteout(opj_mqc_t *mqc);\r
+/**\r
+Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000\r
+@param mqc MQC handle\r
+*/\r
+static void mqc_renorme(opj_mqc_t *mqc);\r
+/**\r
+Encode the most probable symbol\r
+@param mqc MQC handle\r
+*/\r
+static void mqc_codemps(opj_mqc_t *mqc);\r
+/**\r
+Encode the most least symbol\r
+@param mqc MQC handle\r
+*/\r
+static void mqc_codelps(opj_mqc_t *mqc);\r
+/**\r
+Fill mqc->c with 1's for flushing\r
+@param mqc MQC handle\r
+*/\r
+static void mqc_setbits(opj_mqc_t *mqc);\r
+/**\r
+FIXME: documentation ???\r
+@param mqc MQC handle\r
+@return \r
+*/\r
+static int mqc_mpsexchange(opj_mqc_t *mqc);\r
+/**\r
+FIXME: documentation ???\r
+@param mqc MQC handle\r
+@return \r
+*/\r
+static int mqc_lpsexchange(opj_mqc_t *mqc);\r
+/**\r
+Input a byte\r
+@param mqc MQC handle\r
+*/\r
+static void mqc_bytein(opj_mqc_t *mqc);\r
+/**\r
+Renormalize mqc->a and mqc->c while decoding\r
+@param mqc MQC handle\r
+*/\r
+static void mqc_renormd(opj_mqc_t *mqc);\r
+\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+/* <summary> */\r
+/* This array defines all the possible states for a context. */\r
+/* </summary> */\r
+static opj_mqc_state_t mqc_states[47 * 2] = {\r
+  {0x5601, 0, &mqc_states[2], &mqc_states[3]},\r
+  {0x5601, 1, &mqc_states[3], &mqc_states[2]},\r
+  {0x3401, 0, &mqc_states[4], &mqc_states[12]},\r
+  {0x3401, 1, &mqc_states[5], &mqc_states[13]},\r
+  {0x1801, 0, &mqc_states[6], &mqc_states[18]},\r
+  {0x1801, 1, &mqc_states[7], &mqc_states[19]},\r
+  {0x0ac1, 0, &mqc_states[8], &mqc_states[24]},\r
+  {0x0ac1, 1, &mqc_states[9], &mqc_states[25]},\r
+  {0x0521, 0, &mqc_states[10], &mqc_states[58]},\r
+  {0x0521, 1, &mqc_states[11], &mqc_states[59]},\r
+  {0x0221, 0, &mqc_states[76], &mqc_states[66]},\r
+  {0x0221, 1, &mqc_states[77], &mqc_states[67]},\r
+  {0x5601, 0, &mqc_states[14], &mqc_states[13]},\r
+  {0x5601, 1, &mqc_states[15], &mqc_states[12]},\r
+  {0x5401, 0, &mqc_states[16], &mqc_states[28]},\r
+  {0x5401, 1, &mqc_states[17], &mqc_states[29]},\r
+  {0x4801, 0, &mqc_states[18], &mqc_states[28]},\r
+  {0x4801, 1, &mqc_states[19], &mqc_states[29]},\r
+  {0x3801, 0, &mqc_states[20], &mqc_states[28]},\r
+  {0x3801, 1, &mqc_states[21], &mqc_states[29]},\r
+  {0x3001, 0, &mqc_states[22], &mqc_states[34]},\r
+  {0x3001, 1, &mqc_states[23], &mqc_states[35]},\r
+  {0x2401, 0, &mqc_states[24], &mqc_states[36]},\r
+  {0x2401, 1, &mqc_states[25], &mqc_states[37]},\r
+  {0x1c01, 0, &mqc_states[26], &mqc_states[40]},\r
+  {0x1c01, 1, &mqc_states[27], &mqc_states[41]},\r
+  {0x1601, 0, &mqc_states[58], &mqc_states[42]},\r
+  {0x1601, 1, &mqc_states[59], &mqc_states[43]},\r
+  {0x5601, 0, &mqc_states[30], &mqc_states[29]},\r
+  {0x5601, 1, &mqc_states[31], &mqc_states[28]},\r
+  {0x5401, 0, &mqc_states[32], &mqc_states[28]},\r
+  {0x5401, 1, &mqc_states[33], &mqc_states[29]},\r
+  {0x5101, 0, &mqc_states[34], &mqc_states[30]},\r
+  {0x5101, 1, &mqc_states[35], &mqc_states[31]},\r
+  {0x4801, 0, &mqc_states[36], &mqc_states[32]},\r
+  {0x4801, 1, &mqc_states[37], &mqc_states[33]},\r
+  {0x3801, 0, &mqc_states[38], &mqc_states[34]},\r
+  {0x3801, 1, &mqc_states[39], &mqc_states[35]},\r
+  {0x3401, 0, &mqc_states[40], &mqc_states[36]},\r
+  {0x3401, 1, &mqc_states[41], &mqc_states[37]},\r
+  {0x3001, 0, &mqc_states[42], &mqc_states[38]},\r
+  {0x3001, 1, &mqc_states[43], &mqc_states[39]},\r
+  {0x2801, 0, &mqc_states[44], &mqc_states[38]},\r
+  {0x2801, 1, &mqc_states[45], &mqc_states[39]},\r
+  {0x2401, 0, &mqc_states[46], &mqc_states[40]},\r
+  {0x2401, 1, &mqc_states[47], &mqc_states[41]},\r
+  {0x2201, 0, &mqc_states[48], &mqc_states[42]},\r
+  {0x2201, 1, &mqc_states[49], &mqc_states[43]},\r
+  {0x1c01, 0, &mqc_states[50], &mqc_states[44]},\r
+  {0x1c01, 1, &mqc_states[51], &mqc_states[45]},\r
+  {0x1801, 0, &mqc_states[52], &mqc_states[46]},\r
+  {0x1801, 1, &mqc_states[53], &mqc_states[47]},\r
+  {0x1601, 0, &mqc_states[54], &mqc_states[48]},\r
+  {0x1601, 1, &mqc_states[55], &mqc_states[49]},\r
+  {0x1401, 0, &mqc_states[56], &mqc_states[50]},\r
+  {0x1401, 1, &mqc_states[57], &mqc_states[51]},\r
+  {0x1201, 0, &mqc_states[58], &mqc_states[52]},\r
+  {0x1201, 1, &mqc_states[59], &mqc_states[53]},\r
+  {0x1101, 0, &mqc_states[60], &mqc_states[54]},\r
+  {0x1101, 1, &mqc_states[61], &mqc_states[55]},\r
+  {0x0ac1, 0, &mqc_states[62], &mqc_states[56]},\r
+  {0x0ac1, 1, &mqc_states[63], &mqc_states[57]},\r
+  {0x09c1, 0, &mqc_states[64], &mqc_states[58]},\r
+  {0x09c1, 1, &mqc_states[65], &mqc_states[59]},\r
+  {0x08a1, 0, &mqc_states[66], &mqc_states[60]},\r
+  {0x08a1, 1, &mqc_states[67], &mqc_states[61]},\r
+  {0x0521, 0, &mqc_states[68], &mqc_states[62]},\r
+  {0x0521, 1, &mqc_states[69], &mqc_states[63]},\r
+  {0x0441, 0, &mqc_states[70], &mqc_states[64]},\r
+  {0x0441, 1, &mqc_states[71], &mqc_states[65]},\r
+  {0x02a1, 0, &mqc_states[72], &mqc_states[66]},\r
+  {0x02a1, 1, &mqc_states[73], &mqc_states[67]},\r
+  {0x0221, 0, &mqc_states[74], &mqc_states[68]},\r
+  {0x0221, 1, &mqc_states[75], &mqc_states[69]},\r
+  {0x0141, 0, &mqc_states[76], &mqc_states[70]},\r
+  {0x0141, 1, &mqc_states[77], &mqc_states[71]},\r
+  {0x0111, 0, &mqc_states[78], &mqc_states[72]},\r
+  {0x0111, 1, &mqc_states[79], &mqc_states[73]},\r
+  {0x0085, 0, &mqc_states[80], &mqc_states[74]},\r
+  {0x0085, 1, &mqc_states[81], &mqc_states[75]},\r
+  {0x0049, 0, &mqc_states[82], &mqc_states[76]},\r
+  {0x0049, 1, &mqc_states[83], &mqc_states[77]},\r
+  {0x0025, 0, &mqc_states[84], &mqc_states[78]},\r
+  {0x0025, 1, &mqc_states[85], &mqc_states[79]},\r
+  {0x0015, 0, &mqc_states[86], &mqc_states[80]},\r
+  {0x0015, 1, &mqc_states[87], &mqc_states[81]},\r
+  {0x0009, 0, &mqc_states[88], &mqc_states[82]},\r
+  {0x0009, 1, &mqc_states[89], &mqc_states[83]},\r
+  {0x0005, 0, &mqc_states[90], &mqc_states[84]},\r
+  {0x0005, 1, &mqc_states[91], &mqc_states[85]},\r
+  {0x0001, 0, &mqc_states[90], &mqc_states[86]},\r
+  {0x0001, 1, &mqc_states[91], &mqc_states[87]},\r
+  {0x5601, 0, &mqc_states[92], &mqc_states[92]},\r
+  {0x5601, 1, &mqc_states[93], &mqc_states[93]},\r
+};\r
+\r
+/* \r
+==========================================================\r
+   local functions\r
+==========================================================\r
+*/\r
+\r
+static void mqc_byteout(opj_mqc_t *mqc) {\r
+  if (*mqc->bp == 0xff) {\r
+    mqc->bp++;\r
+    *mqc->bp = mqc->c >> 20;\r
+    mqc->c &= 0xfffff;\r
+    mqc->ct = 7;\r
+  } else {\r
+    if ((mqc->c & 0x8000000) == 0) {  /* ((mqc->c&0x8000000)==0) CHANGE */\r
+      mqc->bp++;\r
+      *mqc->bp = mqc->c >> 19;\r
+      mqc->c &= 0x7ffff;\r
+      mqc->ct = 8;\r
+    } else {\r
+      (*mqc->bp)++;\r
+      if (*mqc->bp == 0xff) {\r
+        mqc->c &= 0x7ffffff;\r
+        mqc->bp++;\r
+        *mqc->bp = mqc->c >> 20;\r
+        mqc->c &= 0xfffff;\r
+        mqc->ct = 7;\r
+      } else {\r
+        mqc->bp++;\r
+        *mqc->bp = mqc->c >> 19;\r
+        mqc->c &= 0x7ffff;\r
+        mqc->ct = 8;\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+static void mqc_renorme(opj_mqc_t *mqc) {\r
+  do {\r
+    mqc->a <<= 1;\r
+    mqc->c <<= 1;\r
+    mqc->ct--;\r
+    if (mqc->ct == 0) {\r
+      mqc_byteout(mqc);\r
+    }\r
+  } while ((mqc->a & 0x8000) == 0);\r
+}\r
+\r
+static void mqc_codemps(opj_mqc_t *mqc) {\r
+  mqc->a -= (*mqc->curctx)->qeval;\r
+  if ((mqc->a & 0x8000) == 0) {\r
+    if (mqc->a < (*mqc->curctx)->qeval) {\r
+      mqc->a = (*mqc->curctx)->qeval;\r
+    } else {\r
+      mqc->c += (*mqc->curctx)->qeval;\r
+    }\r
+    *mqc->curctx = (*mqc->curctx)->nmps;\r
+    mqc_renorme(mqc);\r
+  } else {\r
+    mqc->c += (*mqc->curctx)->qeval;\r
+  }\r
+}\r
+\r
+static void mqc_codelps(opj_mqc_t *mqc) {\r
+  mqc->a -= (*mqc->curctx)->qeval;\r
+  if (mqc->a < (*mqc->curctx)->qeval) {\r
+    mqc->c += (*mqc->curctx)->qeval;\r
+  } else {\r
+    mqc->a = (*mqc->curctx)->qeval;\r
+  }\r
+  *mqc->curctx = (*mqc->curctx)->nlps;\r
+  mqc_renorme(mqc);\r
+}\r
+\r
+static void mqc_setbits(opj_mqc_t *mqc) {\r
+  unsigned int tempc = mqc->c + mqc->a;\r
+  mqc->c |= 0xffff;\r
+  if (mqc->c >= tempc) {\r
+    mqc->c -= 0x8000;\r
+  }\r
+}\r
+\r
+static int mqc_mpsexchange(opj_mqc_t *mqc) {\r
+  int d;\r
+  if (mqc->a < (*mqc->curctx)->qeval) {\r
+    d = 1 - (*mqc->curctx)->mps;\r
+    *mqc->curctx = (*mqc->curctx)->nlps;\r
+  } else {\r
+    d = (*mqc->curctx)->mps;\r
+    *mqc->curctx = (*mqc->curctx)->nmps;\r
+  }\r
+  \r
+  return d;\r
+}\r
+\r
+static int mqc_lpsexchange(opj_mqc_t *mqc) {\r
+  int d;\r
+  if (mqc->a < (*mqc->curctx)->qeval) {\r
+    mqc->a = (*mqc->curctx)->qeval;\r
+    d = (*mqc->curctx)->mps;\r
+    *mqc->curctx = (*mqc->curctx)->nmps;\r
+  } else {\r
+    mqc->a = (*mqc->curctx)->qeval;\r
+    d = 1 - (*mqc->curctx)->mps;\r
+    *mqc->curctx = (*mqc->curctx)->nlps;\r
+  }\r
+  \r
+  return d;\r
+}\r
+\r
+static void mqc_bytein(opj_mqc_t *mqc) {\r
+  if (mqc->bp != mqc->end) {\r
+    unsigned int c;\r
+    if (mqc->bp + 1 != mqc->end) {\r
+      c = *(mqc->bp + 1);\r
+    } else {\r
+      c = 0xff;\r
+    }\r
+    if (*mqc->bp == 0xff) {\r
+      if (c > 0x8f) {\r
+        mqc->c += 0xff00;\r
+        mqc->ct = 8;\r
+      } else {\r
+        mqc->bp++;\r
+        mqc->c += c << 9;\r
+        mqc->ct = 7;\r
+      }\r
+    } else {\r
+      mqc->bp++;\r
+      mqc->c += c << 8;\r
+      mqc->ct = 8;\r
+    }\r
+  } else {\r
+    mqc->c += 0xff00;\r
+    mqc->ct = 8;\r
+  }\r
+}\r
+\r
+static void mqc_renormd(opj_mqc_t *mqc) {\r
+  do {\r
+    if (mqc->ct == 0) {\r
+      mqc_bytein(mqc);\r
+    }\r
+    mqc->a <<= 1;\r
+    mqc->c <<= 1;\r
+    mqc->ct--;\r
+  } while (mqc->a < 0x8000);\r
+}\r
+\r
+/* \r
+==========================================================\r
+   MQ-Coder interface\r
+==========================================================\r
+*/\r
+\r
+opj_mqc_t* mqc_create() {\r
+  opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));\r
+  return mqc;\r
+}\r
+\r
+void mqc_destroy(opj_mqc_t *mqc) {\r
+  if(mqc) {\r
+    opj_free(mqc);\r
+  }\r
+}\r
+\r
+int mqc_numbytes(opj_mqc_t *mqc) {\r
+  return mqc->bp - mqc->start;\r
+}\r
+\r
+void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) {\r
+  mqc_setcurctx(mqc, 0);\r
+  mqc->a = 0x8000;\r
+  mqc->c = 0;\r
+  mqc->bp = bp - 1;\r
+  mqc->ct = 12;\r
+  if (*mqc->bp == 0xff) {\r
+    mqc->ct = 13;\r
+  }\r
+  mqc->start = bp;\r
+}\r
+\r
+void mqc_setcurctx(opj_mqc_t *mqc, int ctxno) {\r
+  mqc->curctx = &mqc->ctxs[ctxno];\r
+}\r
+\r
+void mqc_encode(opj_mqc_t *mqc, int d) {\r
+  if ((*mqc->curctx)->mps == d) {\r
+    mqc_codemps(mqc);\r
+  } else {\r
+    mqc_codelps(mqc);\r
+  }\r
+}\r
+\r
+void mqc_flush(opj_mqc_t *mqc) {\r
+  mqc_setbits(mqc);\r
+  mqc->c <<= mqc->ct;\r
+  mqc_byteout(mqc);\r
+  mqc->c <<= mqc->ct;\r
+  mqc_byteout(mqc);\r
+  \r
+  if (*mqc->bp != 0xff) {\r
+    mqc->bp++;\r
+  }\r
+}\r
+\r
+void mqc_bypass_init_enc(opj_mqc_t *mqc) {\r
+  mqc->c = 0;\r
+  mqc->ct = 8;\r
+  /*if (*mqc->bp == 0xff) {\r
+  mqc->ct = 7;\r
+     } */\r
+}\r
+\r
+void mqc_bypass_enc(opj_mqc_t *mqc, int d) {\r
+  mqc->ct--;\r
+  mqc->c = mqc->c + (d << mqc->ct);\r
+  if (mqc->ct == 0) {\r
+    mqc->bp++;\r
+    *mqc->bp = mqc->c;\r
+    mqc->ct = 8;\r
+    if (*mqc->bp == 0xff) {\r
+      mqc->ct = 7;\r
+    }\r
+    mqc->c = 0;\r
+  }\r
+}\r
+\r
+int mqc_bypass_flush_enc(opj_mqc_t *mqc) {\r
+  unsigned char bit_padding;\r
+  \r
+  bit_padding = 0;\r
+  \r
+  if (mqc->ct != 0) {\r
+    while (mqc->ct > 0) {\r
+      mqc->ct--;\r
+      mqc->c += bit_padding << mqc->ct;\r
+      bit_padding = (bit_padding + 1) & 0x01;\r
+    }\r
+    mqc->bp++;\r
+    *mqc->bp = mqc->c;\r
+    mqc->ct = 8;\r
+    mqc->c = 0;\r
+  }\r
+  \r
+  return 1;\r
+}\r
+\r
+void mqc_reset_enc(opj_mqc_t *mqc) {\r
+  mqc_resetstates(mqc);\r
+  mqc_setstate(mqc, 18, 0, 46);\r
+  mqc_setstate(mqc, 0, 0, 3);\r
+  mqc_setstate(mqc, 1, 0, 4);\r
+}\r
+\r
+int mqc_restart_enc(opj_mqc_t *mqc) {\r
+  int correction = 1;\r
+  \r
+  /* <flush part> */\r
+  int n = 27 - 15 - mqc->ct;\r
+  mqc->c <<= mqc->ct;\r
+  while (n > 0) {\r
+    mqc_byteout(mqc);\r
+    n -= mqc->ct;\r
+    mqc->c <<= mqc->ct;\r
+  }\r
+  mqc_byteout(mqc);\r
+  \r
+  return correction;\r
+}\r
+\r
+void mqc_restart_init_enc(opj_mqc_t *mqc) {\r
+  /* <Re-init part> */\r
+  mqc_setcurctx(mqc, 0);\r
+  mqc->a = 0x8000;\r
+  mqc->c = 0;\r
+  mqc->ct = 12;\r
+  mqc->bp--;\r
+  if (*mqc->bp == 0xff) {\r
+    mqc->ct = 13;\r
+  }\r
+}\r
+\r
+void mqc_erterm_enc(opj_mqc_t *mqc) {\r
+  int k = 11 - mqc->ct + 1;\r
+  \r
+  while (k > 0) {\r
+    mqc->c <<= mqc->ct;\r
+    mqc->ct = 0;\r
+    mqc_byteout(mqc);\r
+    k -= mqc->ct;\r
+  }\r
+  \r
+  if (*mqc->bp != 0xff) {\r
+    mqc_byteout(mqc);\r
+  }\r
+}\r
+\r
+void mqc_segmark_enc(opj_mqc_t *mqc) {\r
+  int i;\r
+  mqc_setcurctx(mqc, 18);\r
+  \r
+  for (i = 1; i < 5; i++) {\r
+    mqc_encode(mqc, i % 2);\r
+  }\r
+}\r
+\r
+void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) {\r
+  mqc_setcurctx(mqc, 0);\r
+  mqc->start = bp;\r
+  mqc->end = bp + len;\r
+  mqc->bp = bp;\r
+  if (len==0) mqc->c = 0xff << 16;\r
+  else mqc->c = *mqc->bp << 16;\r
+  mqc_bytein(mqc);\r
+  mqc->c <<= 7;\r
+  mqc->ct -= 7;\r
+  mqc->a = 0x8000;\r
+}\r
+\r
+int mqc_decode(opj_mqc_t *mqc) {\r
+  int d;\r
+  mqc->a -= (*mqc->curctx)->qeval;\r
+  if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {\r
+    d = mqc_lpsexchange(mqc);\r
+    mqc_renormd(mqc);\r
+  } else {\r
+    mqc->c -= (*mqc->curctx)->qeval << 16;\r
+    if ((mqc->a & 0x8000) == 0) {\r
+      d = mqc_mpsexchange(mqc);\r
+      mqc_renormd(mqc);\r
+    } else {\r
+      d = (*mqc->curctx)->mps;\r
+    }\r
+  }\r
+\r
+  return d;\r
+}\r
+\r
+void mqc_resetstates(opj_mqc_t *mqc) {\r
+  int i;\r
+  for (i = 0; i < MQC_NUMCTXS; i++) {\r
+    mqc->ctxs[i] = mqc_states;\r
+  }\r
+}\r
+\r
+void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) {\r
+  mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)];\r
+}\r
+\r
+\r
index ea01d809f6773be40b0a7f474b11c2c12c907d5f..6b38bd36e4504edc682d42a1cad1827b53b3d7f8 100644 (file)
-/*
- * 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
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#ifndef __MQC_H\r
+#define __MQC_H\r
+/**\r
+@file mqc.h\r
+@brief Implementation of an MQ-Coder (MQC)\r
+\r
+The functions in MQC.C have for goal to realize the MQ-coder operations. The functions\r
+in MQC.C are used by some function in T1.C.\r
+*/\r
+\r
+/** @defgroup MQC MQC - Implementation of an MQ-Coder */\r
+/*@{*/\r
+\r
+/**\r
+This struct defines the state of a context.\r
+*/\r
+typedef struct opj_mqc_state {\r
+  /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */\r
+  unsigned int qeval;\r
+  /** the Most Probable Symbol (0 or 1) */\r
+  int mps;\r
+  /** next state if the next encoded symbol is the MPS */\r
+  struct opj_mqc_state *nmps;\r
+  /** next state if the next encoded symbol is the LPS */\r
+  struct opj_mqc_state *nlps;\r
+} opj_mqc_state_t;\r
+\r
+#define MQC_NUMCTXS 32\r
+\r
+/**\r
+MQ coder\r
+*/\r
+typedef struct opj_mqc {\r
+  unsigned int c;\r
+  unsigned int a;\r
+  unsigned int ct;\r
+  unsigned char *bp;\r
+  unsigned char *start;\r
+  unsigned char *end;\r
+  opj_mqc_state_t *ctxs[MQC_NUMCTXS];\r
+  opj_mqc_state_t **curctx;\r
+} opj_mqc_t;\r
+\r
+/** @name Exported functions */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+/**\r
+Create a new MQC handle \r
+@return Returns a new MQC handle if successful, returns NULL otherwise\r
+*/\r
+opj_mqc_t* mqc_create();\r
+/**\r
+Destroy a previously created MQC handle\r
+@param mqc MQC handle to destroy\r
+*/\r
+void mqc_destroy(opj_mqc_t *mqc);\r
+/**\r
+Return the number of bytes written/read since initialisation\r
+@param mqc MQC handle\r
+@return Returns the number of bytes already encoded\r
+*/\r
+int mqc_numbytes(opj_mqc_t *mqc);\r
+/**\r
+Reset the states of all the context of the coder/decoder \r
+(each context is set to a state where 0 and 1 are more or less equiprobable)\r
+@param mqc MQC handle\r
+*/\r
+void mqc_resetstates(opj_mqc_t *mqc);\r
+/**\r
+Set the state of a particular context\r
+@param mqc MQC handle\r
+@param ctxno Number that identifies the context\r
+@param msb The MSB of the new state of the context\r
+@param prob Number that identifies the probability of the symbols for the new state of the context\r
+*/\r
+void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob);\r
+/**\r
+Initialize the encoder\r
+@param mqc MQC handle\r
+@param bp Pointer to the start of the buffer where the bytes will be written\r
+*/\r
+void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp);\r
+/**\r
+Set the current context used for coding/decoding\r
+@param mqc MQC handle\r
+@param ctxno Number that identifies the context\r
+*/\r
+void mqc_setcurctx(opj_mqc_t *mqc, int ctxno);\r
+/**\r
+Encode a symbol using the MQ-coder\r
+@param mqc MQC handle\r
+@param d The symbol to be encoded (0 or 1)\r
+*/\r
+void mqc_encode(opj_mqc_t *mqc, int d);\r
+/**\r
+Flush the encoder, so that all remaining data is written\r
+@param mqc MQC handle\r
+*/\r
+void mqc_flush(opj_mqc_t *mqc);\r
+/**\r
+BYPASS mode switch, initialization operation. \r
+JPEG 2000 p 505. \r
+<h2>Not fully implemented and tested !!</h2>\r
+@param mqc MQC handle\r
+*/\r
+void mqc_bypass_init_enc(opj_mqc_t *mqc);\r
+/**\r
+BYPASS mode switch, coding operation. \r
+JPEG 2000 p 505. \r
+<h2>Not fully implemented and tested !!</h2>\r
+@param mqc MQC handle\r
+@param d The symbol to be encoded (0 or 1)\r
+*/\r
+void mqc_bypass_enc(opj_mqc_t *mqc, int d);\r
+/**\r
+BYPASS mode switch, flush operation\r
+<h2>Not fully implemented and tested !!</h2>\r
+@param mqc MQC handle\r
+@return Returns 1 (always)\r
+*/\r
+int mqc_bypass_flush_enc(opj_mqc_t *mqc);\r
+/**\r
+RESET mode switch\r
+@param mqc MQC handle\r
+*/\r
+void mqc_reset_enc(opj_mqc_t *mqc);\r
+/**\r
+RESTART mode switch (TERMALL)\r
+@param mqc MQC handle\r
+@return Returns 1 (always)\r
+*/\r
+int mqc_restart_enc(opj_mqc_t *mqc);\r
+/**\r
+RESTART mode switch (TERMALL) reinitialisation\r
+@param mqc MQC handle\r
+*/\r
+void mqc_restart_init_enc(opj_mqc_t *mqc);\r
+/**\r
+ERTERM mode switch (PTERM)\r
+@param mqc MQC handle\r
+*/\r
+void mqc_erterm_enc(opj_mqc_t *mqc);\r
+/**\r
+SEGMARK mode switch (SEGSYM)\r
+@param mqc MQC handle\r
+*/\r
+void mqc_segmark_enc(opj_mqc_t *mqc);\r
+/**\r
+Initialize the decoder\r
+@param mqc MQC handle\r
+@param bp Pointer to the start of the buffer from which the bytes will be read\r
+@param len Length of the input buffer\r
+*/\r
+void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len);\r
+/**\r
+Decode a symbol\r
+@param mqc MQC handle\r
+@return Returns the decoded symbol (0 or 1)\r
+*/\r
+int mqc_decode(opj_mqc_t *mqc);\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __MQC_H */\r
diff --git a/src/gdcmopenjpeg/libopenjpeg/openjpeg.c b/src/gdcmopenjpeg/libopenjpeg/openjpeg.c
new file mode 100644 (file)
index 0000000..0028b4f
--- /dev/null
@@ -0,0 +1,213 @@
+/*\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+const char * opj_version() {\r
+    return OPENJPEG_VERSION;\r
+}\r
+\r
+opj_dinfo_t* opj_create_decompress(OPJ_CODEC_FORMAT format) {\r
+  opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_malloc(sizeof(opj_dinfo_t));\r
+  if(!dinfo) return NULL;\r
+  dinfo->is_decompressor = true;\r
+  switch(format) {\r
+    case CODEC_J2K:\r
+    case CODEC_JPT:\r
+      /* get a J2K decoder handle */\r
+      dinfo->j2k_handle = (void*)j2k_create_decompress((opj_common_ptr)dinfo);\r
+      if(!dinfo->j2k_handle) {\r
+        opj_free(dinfo);\r
+        return NULL;\r
+      }\r
+      break;\r
+    case CODEC_JP2:\r
+      /* get a JP2 decoder handle */\r
+      dinfo->jp2_handle = (void*)jp2_create_decompress((opj_common_ptr)dinfo);\r
+      if(!dinfo->jp2_handle) {\r
+        opj_free(dinfo);\r
+        return NULL;\r
+      }\r
+      break;\r
+    default:\r
+      opj_free(dinfo);\r
+      return NULL;\r
+  }\r
+\r
+  dinfo->codec_format = format;\r
+\r
+  return dinfo;\r
+}\r
+\r
+void opj_destroy_decompress(opj_dinfo_t *dinfo) {\r
+  if(dinfo) {\r
+    /* destroy the codec */\r
+    switch(dinfo->codec_format) {\r
+      case CODEC_J2K:\r
+      case CODEC_JPT:\r
+        j2k_destroy_decompress((opj_j2k_t*)dinfo->j2k_handle);\r
+        break;\r
+      case CODEC_JP2:\r
+        jp2_destroy_decompress((opj_jp2_t*)dinfo->jp2_handle);\r
+        break;\r
+    }\r
+    /* destroy the decompressor */\r
+    opj_free(dinfo);\r
+  }\r
+}\r
+\r
+void opj_set_default_decoder_parameters(opj_dparameters_t *parameters) {\r
+  if(parameters) {\r
+    memset(parameters, 0, sizeof(opj_dparameters_t));\r
+    /* default decoding parameters */\r
+    parameters->cp_layer = 0;\r
+    parameters->cp_reduce = 0;\r
+\r
+    parameters->decod_format = -1;\r
+    parameters->cod_format = -1;\r
+  }\r
+}\r
+\r
+void opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters) {\r
+  if(dinfo && parameters) {\r
+    switch(dinfo->codec_format) {\r
+      case CODEC_J2K:\r
+      case CODEC_JPT:\r
+        j2k_setup_decoder((opj_j2k_t*)dinfo->j2k_handle, parameters);\r
+        break;\r
+      case CODEC_JP2:\r
+        jp2_setup_decoder((opj_jp2_t*)dinfo->jp2_handle, parameters);\r
+        break;\r
+    }\r
+  }\r
+}\r
+\r
+opj_image_t* opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio) {\r
+  if(dinfo && cio) {\r
+    switch(dinfo->codec_format) {\r
+      case CODEC_J2K:\r
+        return j2k_decode((opj_j2k_t*)dinfo->j2k_handle, cio);\r
+      case CODEC_JPT:\r
+        return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio);\r
+      case CODEC_JP2:\r
+        return jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio);\r
+    }\r
+  }\r
+\r
+  return NULL;\r
+}\r
+\r
+opj_cinfo_t* opj_create_compress(OPJ_CODEC_FORMAT format) {\r
+  opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_malloc(sizeof(opj_cinfo_t));\r
+  if(!cinfo) return NULL;\r
+  cinfo->is_decompressor = false;\r
+  switch(format) {\r
+    case CODEC_J2K:\r
+      /* get a J2K coder handle */\r
+      cinfo->j2k_handle = (void*)j2k_create_compress((opj_common_ptr)cinfo);\r
+      if(!cinfo->j2k_handle) {\r
+        opj_free(cinfo);\r
+        return NULL;\r
+      }\r
+      break;\r
+    case CODEC_JP2:\r
+      /* get a JP2 coder handle */\r
+      cinfo->jp2_handle = (void*)jp2_create_compress((opj_common_ptr)cinfo);\r
+      if(!cinfo->jp2_handle) {\r
+        opj_free(cinfo);\r
+        return NULL;\r
+      }\r
+      break;\r
+    default:\r
+      opj_free(cinfo);\r
+      return NULL;\r
+  }\r
+\r
+  cinfo->codec_format = format;\r
+\r
+  return cinfo;\r
+}\r
+\r
+void opj_destroy_compress(opj_cinfo_t *cinfo) {\r
+  if(cinfo) {\r
+    /* destroy the codec */\r
+    switch(cinfo->codec_format) {\r
+      case CODEC_J2K:\r
+        j2k_destroy_decompress((opj_j2k_t*)cinfo->j2k_handle);\r
+        break;\r
+      case CODEC_JP2:\r
+        jp2_destroy_decompress((opj_jp2_t*)cinfo->jp2_handle);\r
+        break;\r
+    }\r
+    /* destroy the decompressor */\r
+    opj_free(cinfo);\r
+  }\r
+}\r
+\r
+void opj_set_default_encoder_parameters(opj_cparameters_t *parameters) {\r
+  if(parameters) {\r
+    memset(parameters, 0, sizeof(opj_cparameters_t));\r
+    /* default coding parameters */\r
+    parameters->numresolution = 6;\r
+    parameters->cblockw_init = 64;\r
+    parameters->cblockh_init = 64;\r
+    parameters->prog_order = LRCP;\r
+    parameters->roi_compno = -1;    /* no ROI */\r
+    parameters->subsampling_dx = 1;\r
+    parameters->subsampling_dy = 1;\r
+\r
+    parameters->decod_format = -1;\r
+    parameters->cod_format = -1;\r
+  }\r
+}\r
+\r
+void opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image) {\r
+  if(cinfo && parameters && image) {\r
+    switch(cinfo->codec_format) {\r
+      case CODEC_J2K:\r
+        j2k_setup_encoder((opj_j2k_t*)cinfo->j2k_handle, parameters, image);\r
+        break;\r
+      case CODEC_JP2:\r
+        jp2_setup_encoder((opj_jp2_t*)cinfo->jp2_handle, parameters, image);\r
+        break;\r
+    }\r
+  }\r
+}\r
+\r
+bool opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index) {\r
+  if(cinfo && cio && image) {\r
+    switch(cinfo->codec_format) {\r
+      case CODEC_J2K:\r
+        return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, index);\r
+      case CODEC_JP2:\r
+        return jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, index);\r
+    }\r
+  }\r
+\r
+  return false;\r
+}\r
+\r
+\r
index a2543e6471b0603c9584a23f7c4ebd31eb958870..23f7d04b01e1f0e7f14436b09298bfe0518d2ca1 100644 (file)
-/*
- * 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
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#ifndef OPENJPEG_H\r
+#define OPENJPEG_H\r
+\r
+#define OPENJPEG_VERSION "1.0.0"\r
+\r
+/* \r
+==========================================================\r
+   Compiler directives\r
+==========================================================\r
+*/\r
+#ifndef __cplusplus\r
+#if defined(HAVE_STDBOOL_H)\r
+/*\r
+The C language implementation does correctly provide the standard header\r
+file "stdbool.h".\r
+ */\r
+#include <stdbool.h>\r
+#else\r
+/*\r
+The C language implementation does not provide the standard header file\r
+"stdbool.h" as required by ISO/IEC 9899:1999.  Try to compensate for this\r
+braindamage below.\r
+*/\r
+#if !defined(bool)\r
+#define  bool  int\r
+#endif\r
+#if !defined(true)\r
+#define true  1\r
+#endif\r
+#if !defined(false)\r
+#define  false  0\r
+#endif\r
+#endif\r
+#endif /* __cplusplus */\r
+\r
+/* \r
+==========================================================\r
+   Useful constant definitions\r
+==========================================================\r
+*/\r
+\r
+#ifndef MAX_PATH\r
+#define MAX_PATH 260  /**< Maximum allowed size for filenames */\r
+#endif /* MAX_PATH */\r
+\r
+#define J2K_MAXRLVLS 33          /**< Number of maximum resolution level authorized */\r
+#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2)  /**< Number of maximum sub-band linked to number of resolution level */\r
+\r
+/* \r
+==========================================================\r
+   enum definitions\r
+==========================================================\r
+*/\r
+\r
+/** Progression order */\r
+typedef enum PROG_ORDER {\r
+  PROG_UNKNOWN = -1,  /**< place-holder */\r
+  LRCP = 0,    /**< layer-resolution-component-precinct order */\r
+  RLCP = 1,    /**< resolution-layer-component-precinct order */\r
+  RPCL = 2,    /**< resolution-precinct-component-layer order */\r
+  PCRL = 3,    /**< precinct-component-resolution-layer order */\r
+  CPRL = 4    /**< component-precinct-resolution-layer order */\r
+} OPJ_PROG_ORDER;\r
+\r
+/**\r
+Supported image color spaces\r
+*/\r
+typedef enum COLOR_SPACE {\r
+  CLRSPC_UNKNOWN = -1,  /**< place-holder */\r
+  CLRSPC_SRGB = 1,    /**< sRGB */\r
+  CLRSPC_GRAY = 2,    /**< grayscale */\r
+  CLRSPC_SYCC = 3      /**< YUV */\r
+} OPJ_COLOR_SPACE;\r
+\r
+/**\r
+Supported codec\r
+*/\r
+typedef enum CODEC_FORMAT {\r
+  CODEC_UNKNOWN = -1,  /**< place-holder */\r
+  CODEC_J2K = 0,    /**< JPEG-2000 codestream : read/write */\r
+  CODEC_JPT = 1,    /**< JPT-stream (JPEG 2000, JPIP) : read only */\r
+  CODEC_JP2 = 2    /**< JPEG-2000 file format : read/write */\r
+} OPJ_CODEC_FORMAT;\r
+\r
+/* \r
+==========================================================\r
+   event manager typedef definitions\r
+==========================================================\r
+*/\r
+\r
+/**\r
+Callback function prototype for events\r
+@param msg Event message\r
+@param client_data \r
+*/\r
+typedef void (*opj_msg_callback) (const char *msg, void *client_data);\r
+\r
+/**\r
+Message handler object\r
+used for \r
+<ul>\r
+<li>Error messages\r
+<li>Warning messages\r
+<li>Debugging messages\r
+</ul>\r
+*/\r
+typedef struct opj_event_mgr {\r
+  /** Error message callback if available, NULL otherwise */\r
+  opj_msg_callback error_handler;\r
+  /** Warning message callback if available, NULL otherwise */\r
+  opj_msg_callback warning_handler;\r
+  /** Debug message callback if available, NULL otherwise */\r
+  opj_msg_callback info_handler;\r
+} opj_event_mgr_t;\r
+\r
+\r
+/* \r
+==========================================================\r
+   codec typedef definitions\r
+==========================================================\r
+*/\r
+\r
+/**\r
+Progression order changes\r
+*/\r
+typedef struct opj_poc {\r
+  int resno0, compno0;\r
+  int layno1, resno1, compno1;\r
+  OPJ_PROG_ORDER prg;\r
+  int tile;\r
+  char progorder[4];\r
+} opj_poc_t;\r
+\r
+/**\r
+Compression parameters\r
+*/\r
+typedef struct opj_cparameters {\r
+  /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */\r
+  bool tile_size_on;\r
+  /** XTOsiz */\r
+  int cp_tx0;\r
+  /** YTOsiz */\r
+  int cp_ty0;\r
+  /** XTsiz */\r
+  int cp_tdx;\r
+  /** YTsiz */\r
+  int cp_tdy;\r
+  /** allocation by rate/distortion */\r
+  int cp_disto_alloc;\r
+  /** allocation by fixed layer */\r
+  int cp_fixed_alloc;\r
+  /** add fixed_quality */\r
+  int cp_fixed_quality;\r
+  /** fixed layer */\r
+  int *cp_matrice;\r
+  /** comment for coding */\r
+  char *cp_comment;\r
+  /** csty : coding style */\r
+  int csty;\r
+  /** progression order (default LRCP) */\r
+  OPJ_PROG_ORDER prog_order;\r
+  /** progression order changes */\r
+  opj_poc_t POC[32];\r
+  /** number of progression order changes (POC), default to 0 */\r
+  int numpocs;\r
+  /** number of layers */\r
+  int tcp_numlayers;\r
+  /** rates of layers */\r
+  int tcp_rates[100];\r
+  /** different psnr for successive layers */\r
+  float tcp_distoratio[100];\r
+  /** number of resolutions */\r
+  int numresolution;\r
+  /** initial code block width, default to 64 */\r
+   int cblockw_init;\r
+  /** initial code block height, default to 64 */\r
+  int cblockh_init;\r
+  /** mode switch (cblk_style) */\r
+  int mode;\r
+  /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */\r
+  int irreversible;\r
+  /** region of interest: affected component in [0..3], -1 means no ROI */\r
+  int roi_compno;\r
+  /** region of interest: upshift value */\r
+  int roi_shift;\r
+  /* number of precinct size specifications */\r
+  int res_spec;\r
+  /** initial precinct width */\r
+  int prcw_init[J2K_MAXRLVLS];\r
+  /** initial precinct height */\r
+  int prch_init[J2K_MAXRLVLS];\r
+\r
+  /**@name command line encoder parameters (not used inside the library) */\r
+  /*@{*/\r
+  /** input file name */\r
+  char infile[MAX_PATH];\r
+  /** output file name */\r
+  char outfile[MAX_PATH];\r
+  /** creation of an index file, default to 0 (false) */\r
+  int index_on;\r
+  /** index file name */\r
+  char index[MAX_PATH];\r
+  /** subimage encoding: origin image offset in x direction */\r
+  int image_offset_x0;\r
+  /** subimage encoding: origin image offset in y direction */\r
+  int image_offset_y0;\r
+  /** subsampling value for dx */\r
+  int subsampling_dx;\r
+  /** subsampling value for dy */\r
+  int subsampling_dy;\r
+  /** input file format 0: PGX, 1: PxM, 2: BMP */\r
+  int decod_format;\r
+  /** output file format 0: J2K, 1: JP2, 2: JPT */\r
+  int cod_format;\r
+  /*@}*/\r
+} opj_cparameters_t;\r
+\r
+/**\r
+Decompression parameters\r
+*/\r
+typedef struct opj_dparameters {\r
+  /** \r
+  Set the number of highest resolution levels to be discarded. \r
+  The image resolution is effectively divided by 2 to the power of the number of discarded levels. \r
+  The reduce factor is limited by the smallest total number of decomposition levels among tiles.\r
+  if != 0, then original dimension divided by 2^(reduce); \r
+  if == 0 or not used, image is decoded to the full resolution \r
+  */\r
+  int cp_reduce;\r
+  /** \r
+  Set the maximum number of quality layers to decode. \r
+  If there are less quality layers than the specified number, all the quality layers are decoded.\r
+  if != 0, then only the first "layer" layers are decoded; \r
+  if == 0 or not used, all the quality layers are decoded \r
+  */\r
+  int cp_layer;\r
+\r
+  /**@name command line encoder parameters (not used inside the library) */\r
+  /*@{*/\r
+  /** input file name */\r
+  char infile[MAX_PATH];\r
+  /** output file name */\r
+  char outfile[MAX_PATH];\r
+  /** input file format 0: J2K, 1: JP2, 2: JPT */\r
+  int decod_format;\r
+  /** output file format 0: PGX, 1: PxM, 2: BMP */\r
+  int cod_format;\r
+  /*@}*/\r
+} opj_dparameters_t;\r
+\r
+/** Common fields between JPEG-2000 compression and decompression master structs. */\r
+\r
+#define opj_common_fields \\r
+  opj_event_mgr_t *event_mgr;  /**< pointer to the event manager */\\r
+  void * client_data;      /**< Available for use by application */\\r
+  bool is_decompressor;    /**< So common code can tell which is which */\\r
+  OPJ_CODEC_FORMAT codec_format;  /**< selected codec */\\r
+  void *j2k_handle;      /**< pointer to the J2K codec */\\r
+  void *jp2_handle      /**< pointer to the JP2 codec */\r
+  \r
+/* Routines that are to be used by both halves of the library are declared\r
+ * to receive a pointer to this structure.  There are no actual instances of\r
+ * opj_common_struct_t, only of opj_cinfo_t and opj_dinfo_t.\r
+ */\r
+typedef struct opj_common_struct {\r
+  opj_common_fields;    /* Fields common to both master struct types */\r
+  /* Additional fields follow in an actual opj_cinfo_t or\r
+   * opj_dinfo_t.  All three structs must agree on these\r
+   * initial fields!  (This would be a lot cleaner in C++.)\r
+   */\r
+} opj_common_struct_t;\r
+\r
+typedef opj_common_struct_t * opj_common_ptr;\r
+\r
+/**\r
+Compression context info\r
+*/\r
+typedef struct opj_cinfo {\r
+  /** Fields shared with opj_dinfo_t */\r
+  opj_common_fields;  \r
+  /* other specific fields go here */\r
+} opj_cinfo_t;\r
+\r
+/**\r
+Decompression context info\r
+*/\r
+typedef struct opj_dinfo {\r
+  /** Fields shared with opj_cinfo_t */\r
+  opj_common_fields;  \r
+  /* other specific fields go here */\r
+} opj_dinfo_t;\r
+\r
+/* \r
+==========================================================\r
+   I/O stream typedef definitions\r
+==========================================================\r
+*/\r
+\r
+/*\r
+ * Stream open flags.\r
+ */\r
+/** The stream was opened for reading. */\r
+#define OPJ_STREAM_READ  0x0001\r
+/** The stream was opened for writing. */\r
+#define OPJ_STREAM_WRITE 0x0002\r
+\r
+/**\r
+Byte input-output stream (CIO)\r
+*/\r
+typedef struct opj_cio {\r
+  /** codec context */\r
+  opj_common_ptr cinfo;\r
+\r
+  /** open mode (read/write) either OPJ_STREAM_READ or OPJ_STREAM_WRITE */\r
+  int openmode;\r
+  /** pointer to the start of the buffer */\r
+  unsigned char *buffer;\r
+  /** buffer size in bytes */\r
+  int length;\r
+\r
+  /** pointer to the start of the stream */\r
+  unsigned char *start;\r
+  /** pointer to the end of the stream */\r
+  unsigned char *end;\r
+  /** pointer to the current position */\r
+  unsigned char *bp;\r
+} opj_cio_t;\r
+\r
+/* \r
+==========================================================\r
+   image typedef definitions\r
+==========================================================\r
+*/\r
+\r
+/**\r
+Defines a single image component\r
+*/\r
+typedef struct opj_image_comp {\r
+  /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */\r
+  int dx;\r
+  /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */\r
+  int dy;\r
+  /** data width */\r
+  int w;\r
+  /** data height */\r
+  int h;\r
+  /** x component offset compared to the whole image */\r
+  int x0;\r
+  /** y component offset compared to the whole image */\r
+  int y0;\r
+  /** precision */\r
+  int prec;\r
+  /** image depth in bits */\r
+  int bpp;\r
+  /** signed (1) / unsigned (0) */\r
+  int sgnd;\r
+  /** number of decoded resolution */\r
+  int resno_decoded;\r
+  /** number of division by 2 of the out image compared to the original size of image */\r
+  int factor;\r
+  /** image component data */\r
+  int *data;\r
+} opj_image_comp_t;\r
+\r
+/** \r
+Defines image data and characteristics\r
+*/\r
+typedef struct opj_image {\r
+  /** XOsiz: horizontal offset from the origin of the reference grid to the left side of the image area */\r
+  int x0;\r
+  /** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */\r
+  int y0;\r
+  /** Xsiz: width of the reference grid */\r
+  int x1;\r
+  /** Ysiz: height of the reference grid */\r
+  int y1;\r
+  /** number of components in the image */\r
+  int numcomps;\r
+  /** color space: sRGB, Greyscale or YUV */\r
+  OPJ_COLOR_SPACE color_space;\r
+  /** image components */\r
+  opj_image_comp_t *comps;\r
+} opj_image_t;\r
+\r
+/**\r
+Component parameters structure used by the opj_image_create function\r
+*/\r
+typedef struct opj_image_comptparm {\r
+  /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */\r
+  int dx;\r
+  /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */\r
+  int dy;\r
+  /** data width */\r
+  int w;\r
+  /** data height */\r
+  int h;\r
+  /** x component offset compared to the whole image */\r
+  int x0;\r
+  /** y component offset compared to the whole image */\r
+  int y0;\r
+  /** precision */\r
+  int prec;\r
+  /** image depth in bits */\r
+  int bpp;\r
+  /** signed (1) / unsigned (0) */\r
+  int sgnd;\r
+} opj_image_cmptparm_t;\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+\r
+/* \r
+==========================================================\r
+   openjpeg version\r
+==========================================================\r
+*/\r
+\r
+const char * opj_version();\r
+\r
+/* \r
+==========================================================\r
+   image functions definitions\r
+==========================================================\r
+*/\r
+\r
+/**\r
+Create an image\r
+@param numcmpts number of components\r
+@param cmptparms components parameters\r
+@param clrspc image color space\r
+@return returns a new image structure if successful, returns NULL otherwise\r
+*/\r
+opj_image_t *opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);\r
+\r
+/**\r
+Deallocate any resources associated with an image\r
+@param image image to be destroyed\r
+*/\r
+void opj_image_destroy(opj_image_t *image);\r
+\r
+/* \r
+==========================================================\r
+   stream functions definitions\r
+==========================================================\r
+*/\r
+\r
+/**\r
+Open and allocate a memory stream for read / write. \r
+On reading, the user must provide a buffer containing encoded data. The buffer will be \r
+wrapped by the returned CIO handle. \r
+On writing, buffer parameters must be set to 0: a buffer will be allocated by the library \r
+to contain encoded data. \r
+@param cinfo Codec context info\r
+@param buffer Reading: buffer address. Writing: NULL\r
+@param length Reading: buffer length. Writing: 0\r
+@return Returns a CIO handle if successful, returns NULL otherwise\r
+*/\r
+opj_cio_t* opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length);\r
+\r
+/**\r
+Close and free a CIO handle\r
+@param cio CIO handle to free\r
+*/\r
+void opj_cio_close(opj_cio_t *cio);\r
+\r
+/**\r
+Get position in byte stream\r
+@param cio CIO handle\r
+@return Returns the position in bytes\r
+*/\r
+int cio_tell(opj_cio_t *cio);\r
+/**\r
+Set position in byte stream\r
+@param cio CIO handle\r
+@param pos Position, in number of bytes, from the beginning of the stream\r
+*/\r
+void cio_seek(opj_cio_t *cio, int pos);\r
+\r
+/* \r
+==========================================================\r
+   event manager functions definitions\r
+==========================================================\r
+*/\r
+\r
+opj_event_mgr_t* opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context);\r
+\r
+/* \r
+==========================================================\r
+   codec functions definitions\r
+==========================================================\r
+*/\r
+/**\r
+Creates a J2K/JPT/JP2 decompression structure\r
+@param format Decoder to select\r
+@return Returns a handle to a decompressor if successful, returns NULL otherwise\r
+*/\r
+opj_dinfo_t* opj_create_decompress(OPJ_CODEC_FORMAT format);\r
+/**\r
+Destroy a decompressor handle\r
+@param dinfo decompressor handle to destroy\r
+*/\r
+void opj_destroy_decompress(opj_dinfo_t *dinfo);\r
+/**\r
+Set decoding parameters to default values\r
+@param parameters Decompression parameters\r
+*/\r
+void opj_set_default_decoder_parameters(opj_dparameters_t *parameters);\r
+/**\r
+Setup the decoder decoding parameters using user parameters.\r
+Decoding parameters are returned in j2k->cp. \r
+@param dinfo decompressor handle\r
+@param parameters decompression parameters\r
+*/\r
+void opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters);\r
+/**\r
+Decode an image from a JPEG-2000 codestream\r
+@param dinfo decompressor handle\r
+@param cio Input buffer stream\r
+@return Returns a decoded image if successful, returns NULL otherwise\r
+*/\r
+opj_image_t* opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio);\r
+/**\r
+Creates a J2K/JP2 compression structure\r
+@param format Coder to select\r
+@return Returns a handle to a compressor if successful, returns NULL otherwise\r
+*/\r
+opj_cinfo_t* opj_create_compress(OPJ_CODEC_FORMAT format);\r
+/**\r
+Destroy a compressor handle\r
+@param cinfo compressor handle to destroy\r
+*/\r
+void opj_destroy_compress(opj_cinfo_t *cinfo);\r
+/**\r
+Set encoding parameters to default values, that means : \r
+<ul>\r
+<li>Lossless\r
+<li>1 tile\r
+<li>Size of precinct : 2^15 x 2^15 (means 1 precinct)\r
+<li>Size of code-block : 64 x 64\r
+<li>Number of resolutions: 6\r
+<li>No SOP marker in the codestream\r
+<li>No EPH marker in the codestream\r
+<li>No sub-sampling in x or y direction\r
+<li>No mode switch activated\r
+<li>Progression order: LRCP\r
+<li>No index file\r
+<li>No ROI upshifted\r
+<li>No offset of the origin of the image\r
+<li>No offset of the origin of the tiles\r
+<li>Reversible DWT 5-3\r
+</ul>\r
+@param parameters Compression parameters\r
+*/\r
+void opj_set_default_encoder_parameters(opj_cparameters_t *parameters);\r
+/**\r
+Setup the encoder parameters using the current image and using user parameters. \r
+@param cinfo compressor handle\r
+@param parameters compression parameters\r
+@param image input filled image\r
+*/\r
+void opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image);\r
+/**\r
+Encode an image into a JPEG-2000 codestream\r
+@param cinfo compressor handle\r
+@param cio Output buffer stream\r
+@param image Image to encode\r
+@param index Name of the index file if required, NULL otherwise\r
+@return Returns true if successful, returns false otherwise\r
+*/\r
+bool opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* OPENJPEG_H */\r
diff --git a/src/gdcmopenjpeg/libopenjpeg/opj_includes.h b/src/gdcmopenjpeg/libopenjpeg/opj_includes.h
new file mode 100644 (file)
index 0000000..6acb2f8
--- /dev/null
@@ -0,0 +1,80 @@
+/*\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#ifndef OPJ_INCLUDES_H\r
+#define OPJ_INCLUDES_H\r
+\r
+/*\r
+ ==========================================================\r
+   Standard includes used by the library\r
+ ==========================================================\r
+*/\r
+#include <memory.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <math.h>\r
+#include <float.h>\r
+#include <time.h>\r
+#include <stdio.h>\r
+#include <stdarg.h>\r
+#include <ctype.h>\r
+\r
+/*\r
+ ==========================================================\r
+   OpenJPEG interface\r
+ ==========================================================\r
+ */\r
+#include "openjpeg.h"\r
+\r
+/*\r
+ ==========================================================\r
+   OpenJPEG modules\r
+ ==========================================================\r
+*/\r
+\r
+#include "j2k_lib.h"\r
+#include "event.h"\r
+#include "cio.h"\r
+\r
+#include "image.h"\r
+#include "j2k.h"\r
+#include "jp2.h"\r
+#include "jpt.h"\r
+\r
+#include "mqc.h"\r
+#include "raw.h"\r
+#include "bio.h"\r
+#include "tgt.h"\r
+#include "tcd.h"\r
+#include "t1.h"\r
+#include "dwt.h"\r
+#include "pi.h"\r
+#include "t2.h"\r
+#include "mct.h"\r
+#include "int.h"\r
+#include "fix.h"\r
+\r
+\r
+#endif /* OPJ_INCLUDES_H */\r
index ce618362092c844bafb8f9444b421f3e96fa9478..521e966ed2ff8ff51fb60c642b1e8c5e12b3d3ac 100644 (file)
-/*
- * 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;
-}
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+/** @defgroup PI PI - Implementation of a packet iterator */\r
+/*@{*/\r
+\r
+/** @name Local static functions */\r
+/*@{*/\r
+\r
+/**\r
+Get next packet in layer-resolution-component-precinct order.\r
+@param pi packet iterator to modify\r
+@return returns false if pi pointed to the last packet or else returns true \r
+*/\r
+static bool pi_next_lrcp(opj_pi_iterator_t * pi);\r
+/**\r
+Get next packet in resolution-layer-component-precinct order.\r
+@param pi packet iterator to modify\r
+@return returns false if pi pointed to the last packet or else returns true \r
+*/\r
+static bool pi_next_rlcp(opj_pi_iterator_t * pi);\r
+/**\r
+Get next packet in resolution-precinct-component-layer order.\r
+@param pi packet iterator to modify\r
+@return returns false if pi pointed to the last packet or else returns true \r
+*/\r
+static bool pi_next_rpcl(opj_pi_iterator_t * pi);\r
+/**\r
+Get next packet in precinct-component-resolution-layer order.\r
+@param pi packet iterator to modify\r
+@return returns false if pi pointed to the last packet or else returns true \r
+*/\r
+static bool pi_next_pcrl(opj_pi_iterator_t * pi);\r
+/**\r
+Get next packet in component-precinct-resolution-layer order.\r
+@param pi packet iterator to modify\r
+@return returns false if pi pointed to the last packet or else returns true \r
+*/\r
+static bool pi_next_cprl(opj_pi_iterator_t * pi);\r
+\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+/* \r
+==========================================================\r
+   local functions\r
+==========================================================\r
+*/\r
+\r
+static bool pi_next_lrcp(opj_pi_iterator_t * pi) {\r
+  opj_pi_comp_t *comp = NULL;\r
+  opj_pi_resolution_t *res = NULL;\r
+  long index = 0;\r
+  \r
+  if (!pi->first) {\r
+    comp = &pi->comps[pi->compno];\r
+    res = &comp->resolutions[pi->resno];\r
+    goto LABEL_SKIP;\r
+  } else {\r
+    pi->first = 0;\r
+  }\r
+\r
+  for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {\r
+    for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1;\r
+    pi->resno++) {\r
+      for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {\r
+        comp = &pi->comps[pi->compno];\r
+        if (pi->resno >= comp->numresolutions) {\r
+          continue;\r
+        }\r
+        res = &comp->resolutions[pi->resno];\r
+        for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) {\r
+          index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;\r
+          if (!pi->include[index]) {\r
+            pi->include[index] = 1;\r
+            return true;\r
+          }\r
+LABEL_SKIP:;\r
+        }\r
+      }\r
+    }\r
+  }\r
+  \r
+  return false;\r
+}\r
+\r
+static bool pi_next_rlcp(opj_pi_iterator_t * pi) {\r
+  opj_pi_comp_t *comp = NULL;\r
+  opj_pi_resolution_t *res = NULL;\r
+  long index = 0;\r
+\r
+  if (!pi->first) {\r
+    comp = &pi->comps[pi->compno];\r
+    res = &comp->resolutions[pi->resno];\r
+    goto LABEL_SKIP;\r
+  } else {\r
+    pi->first = 0;\r
+  }\r
+\r
+  for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {\r
+    for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {\r
+      for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {\r
+        comp = &pi->comps[pi->compno];\r
+        if (pi->resno >= comp->numresolutions) {\r
+          continue;\r
+        }\r
+        res = &comp->resolutions[pi->resno];\r
+        for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) {\r
+          index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;\r
+          if (!pi->include[index]) {\r
+            pi->include[index] = 1;\r
+            return true;\r
+          }\r
+LABEL_SKIP:;\r
+        }\r
+      }\r
+    }\r
+  }\r
+  \r
+  return false;\r
+}\r
+\r
+static bool pi_next_rpcl(opj_pi_iterator_t * pi) {\r
+  opj_pi_comp_t *comp = NULL;\r
+  opj_pi_resolution_t *res = NULL;\r
+  long index = 0;\r
+\r
+  if (!pi->first) {\r
+    goto LABEL_SKIP;\r
+  } else {\r
+    int compno, resno;\r
+    pi->first = 0;\r
+    pi->dx = 0;\r
+    pi->dy = 0;\r
+    for (compno = 0; compno < pi->numcomps; compno++) {\r
+      comp = &pi->comps[compno];\r
+      for (resno = 0; resno < comp->numresolutions; resno++) {\r
+        int dx, dy;\r
+        res = &comp->resolutions[resno];\r
+        dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));\r
+        dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));\r
+        pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);\r
+        pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);\r
+      }\r
+    }\r
+  }\r
+\r
+  for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {\r
+    for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) {\r
+      for (pi->x = pi->tx0; pi->x < pi->tx1; pi->x += pi->dx - (pi->x % pi->dx)) {\r
+        for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {\r
+          int levelno;\r
+          int trx0, try0;\r
+          int trx1, try1;\r
+          int rpx, rpy;\r
+          int prci, prcj;\r
+          comp = &pi->comps[pi->compno];\r
+          if (pi->resno >= comp->numresolutions) {\r
+            continue;\r
+          }\r
+          res = &comp->resolutions[pi->resno];\r
+          levelno = comp->numresolutions - 1 - pi->resno;\r
+          trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);\r
+          try0 = int_ceildiv(pi->ty0, comp->dy << levelno);\r
+          trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);\r
+          try1 = int_ceildiv(pi->ty1, comp->dy << levelno);\r
+          rpx = res->pdx + levelno;\r
+          rpy = res->pdy + levelno;\r
+          if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {\r
+            continue;\r
+          }\r
+          if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {\r
+            continue;\r
+          }\r
+          \r
+          if ((res->pw==0)||(res->pw==0)) continue;\r
+          \r
+          if ((trx0==trx1)||(try0==try1)) continue;\r
+          \r
+          prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) \r
+             - int_floordivpow2(trx0, res->pdx);\r
+          prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) \r
+             - int_floordivpow2(try0, res->pdy);\r
+          pi->precno = prci + prcj * res->pw;\r
+          for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {\r
+            index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;\r
+            if (!pi->include[index]) {\r
+              pi->include[index] = 1;\r
+              return true;\r
+            }\r
+LABEL_SKIP:;\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+  \r
+  return false;\r
+}\r
+\r
+static bool pi_next_pcrl(opj_pi_iterator_t * pi) {\r
+  opj_pi_comp_t *comp = NULL;\r
+  opj_pi_resolution_t *res = NULL;\r
+  long index = 0;\r
+\r
+  if (!pi->first) {\r
+    comp = &pi->comps[pi->compno];\r
+    goto LABEL_SKIP;\r
+  } else {\r
+    int compno, resno;\r
+    pi->first = 0;\r
+    pi->dx = 0;\r
+    pi->dy = 0;\r
+    for (compno = 0; compno < pi->numcomps; compno++) {\r
+      comp = &pi->comps[compno];\r
+      for (resno = 0; resno < comp->numresolutions; resno++) {\r
+        int dx, dy;\r
+        res = &comp->resolutions[resno];\r
+        dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));\r
+        dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));\r
+        pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);\r
+        pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);\r
+      }\r
+    }\r
+  }\r
+\r
+  for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) {\r
+    for (pi->x = pi->tx0; pi->x < pi->tx1; pi->x += pi->dx - (pi->x % pi->dx)) {\r
+      for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {\r
+        comp = &pi->comps[pi->compno];\r
+        for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {\r
+          int levelno;\r
+          int trx0, try0;\r
+          int trx1, try1;\r
+          int rpx, rpy;\r
+          int prci, prcj;\r
+          res = &comp->resolutions[pi->resno];\r
+          levelno = comp->numresolutions - 1 - pi->resno;\r
+          trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);\r
+          try0 = int_ceildiv(pi->ty0, comp->dy << levelno);\r
+          trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);\r
+          try1 = int_ceildiv(pi->ty1, comp->dy << levelno);\r
+          rpx = res->pdx + levelno;\r
+          rpy = res->pdy + levelno;\r
+          if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {\r
+            continue;\r
+          }\r
+          if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {\r
+            continue;\r
+          }\r
+          \r
+          if ((res->pw==0)||(res->pw==0)) continue;\r
+          \r
+          if ((trx0==trx1)||(try0==try1)) continue;\r
+          \r
+          prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) \r
+             - int_floordivpow2(trx0, res->pdx);\r
+          prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) \r
+             - int_floordivpow2(try0, res->pdy);\r
+          pi->precno = prci + prcj * res->pw;\r
+          for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {\r
+            index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;\r
+            if (!pi->include[index]) {\r
+              pi->include[index] = 1;\r
+              return true;\r
+            }  \r
+LABEL_SKIP:;\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+  \r
+  return false;\r
+}\r
+\r
+static bool pi_next_cprl(opj_pi_iterator_t * pi) {\r
+  opj_pi_comp_t *comp = NULL;\r
+  opj_pi_resolution_t *res = NULL;\r
+  long index = 0;\r
+\r
+  if (!pi->first) {\r
+    comp = &pi->comps[pi->compno];\r
+    goto LABEL_SKIP;\r
+  } else {\r
+    pi->first = 0;\r
+  }\r
+\r
+  for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {\r
+    int resno;\r
+    comp = &pi->comps[pi->compno];\r
+    pi->dx = 0;\r
+    pi->dy = 0;\r
+    for (resno = 0; resno < comp->numresolutions; resno++) {\r
+      int dx, dy;\r
+      res = &comp->resolutions[resno];\r
+      dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));\r
+      dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));\r
+      pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);\r
+      pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);\r
+    }\r
+    for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) {\r
+      for (pi->x = pi->tx0; pi->x < pi->tx1; pi->x += pi->dx - (pi->x % pi->dx)) {\r
+        for (pi->resno = pi->poc.resno0; pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {\r
+          int levelno;\r
+          int trx0, try0;\r
+          int trx1, try1;\r
+          int rpx, rpy;\r
+          int prci, prcj;\r
+          res = &comp->resolutions[pi->resno];\r
+          levelno = comp->numresolutions - 1 - pi->resno;\r
+          trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);\r
+          try0 = int_ceildiv(pi->ty0, comp->dy << levelno);\r
+          trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);\r
+          try1 = int_ceildiv(pi->ty1, comp->dy << levelno);\r
+          rpx = res->pdx + levelno;\r
+          rpy = res->pdy + levelno;\r
+          if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {\r
+            continue;\r
+          }\r
+          if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {\r
+            continue;\r
+          }\r
+          \r
+          if ((res->pw==0)||(res->pw==0)) continue;\r
+          \r
+          if ((trx0==trx1)||(try0==try1)) continue;\r
+          \r
+          prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) \r
+             - int_floordivpow2(trx0, res->pdx);\r
+          prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) \r
+             - int_floordivpow2(try0, res->pdy);\r
+          pi->precno = prci + prcj * res->pw;\r
+          for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {\r
+            index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;\r
+            if (!pi->include[index]) {\r
+              pi->include[index] = 1;\r
+              return true;\r
+            }\r
+LABEL_SKIP:;\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+  \r
+  return false;\r
+}\r
+\r
+/* \r
+==========================================================\r
+   Packet iterator interface\r
+==========================================================\r
+*/\r
+\r
+opj_pi_iterator_t *pi_create(opj_image_t *image, opj_cp_t *cp, int tileno) {\r
+  int p, q;\r
+  int compno, resno, pino;\r
+  int maxres = 0;\r
+  opj_pi_iterator_t *pi = NULL;\r
+  opj_tcp_t *tcp = NULL;\r
+  opj_tccp_t *tccp = NULL;\r
+  size_t array_size;\r
+  \r
+  tcp = &cp->tcps[tileno];\r
+\r
+  array_size = (tcp->numpocs + 1) * sizeof(opj_pi_iterator_t);\r
+  pi = (opj_pi_iterator_t *) opj_malloc(array_size);\r
+  if(!pi) {\r
+    /* TODO: throw an error */\r
+    return NULL;\r
+  }\r
+  \r
+  for (pino = 0; pino < tcp->numpocs + 1; pino++) {  /* change */\r
+    p = tileno % cp->tw;\r
+    q = tileno / cp->tw;\r
+\r
+    pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0);\r
+    pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0);\r
+    pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);\r
+    pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);\r
+    pi[pino].numcomps = image->numcomps;\r
+\r
+    array_size = image->numcomps * sizeof(opj_pi_comp_t);\r
+    pi[pino].comps = (opj_pi_comp_t *) opj_malloc(array_size);\r
+    if(!pi[pino].comps) {\r
+      /* TODO: throw an error */\r
+      pi_destroy(pi, cp, tileno);\r
+      return NULL;\r
+    }\r
+    memset(pi[pino].comps, 0, array_size);\r
+    \r
+    for (compno = 0; compno < pi->numcomps; compno++) {\r
+      int tcx0, tcy0, tcx1, tcy1;\r
+      opj_pi_comp_t *comp = &pi[pino].comps[compno];\r
+      tccp = &tcp->tccps[compno];\r
+      comp->dx = image->comps[compno].dx;\r
+      comp->dy = image->comps[compno].dy;\r
+      comp->numresolutions = tccp->numresolutions;\r
+\r
+      array_size = comp->numresolutions * sizeof(opj_pi_resolution_t);\r
+      comp->resolutions =  (opj_pi_resolution_t *) opj_malloc(array_size);\r
+      if(!comp->resolutions) {\r
+        /* TODO: throw an error */\r
+        pi_destroy(pi, cp, tileno);\r
+        return NULL;\r
+      }\r
+\r
+      tcx0 = int_ceildiv(pi->tx0, comp->dx);\r
+      tcy0 = int_ceildiv(pi->ty0, comp->dy);\r
+      tcx1 = int_ceildiv(pi->tx1, comp->dx);\r
+      tcy1 = int_ceildiv(pi->ty1, comp->dy);\r
+      if (comp->numresolutions > maxres) {\r
+        maxres = comp->numresolutions;\r
+      }\r
+\r
+      for (resno = 0; resno < comp->numresolutions; resno++) {\r
+        int levelno;\r
+        int rx0, ry0, rx1, ry1;\r
+        int px0, py0, px1, py1;\r
+        opj_pi_resolution_t *res = &comp->resolutions[resno];\r
+        if (tccp->csty & J2K_CCP_CSTY_PRT) {\r
+          res->pdx = tccp->prcw[resno];\r
+          res->pdy = tccp->prch[resno];\r
+        } else {\r
+          res->pdx = 15;\r
+          res->pdy = 15;\r
+        }\r
+        levelno = comp->numresolutions - 1 - resno;\r
+        rx0 = int_ceildivpow2(tcx0, levelno);\r
+        ry0 = int_ceildivpow2(tcy0, levelno);\r
+        rx1 = int_ceildivpow2(tcx1, levelno);\r
+        ry1 = int_ceildivpow2(tcy1, levelno);\r
+        px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;\r
+        py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;\r
+        px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;\r
+        py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;\r
+        res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx);\r
+        res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy);\r
+      }\r
+    }\r
+    \r
+    tccp = &tcp->tccps[0];\r
+    pi[pino].step_p = 1;\r
+    pi[pino].step_c = 100 * pi[pino].step_p;\r
+    pi[pino].step_r = image->numcomps * pi[pino].step_c;\r
+    pi[pino].step_l = maxres * pi[pino].step_r;\r
+    \r
+    if (pino == 0) {\r
+      array_size = image->numcomps * maxres * tcp->numlayers * 100 * sizeof(short int);\r
+      pi[pino].include = (short int *) opj_malloc(array_size);\r
+      if(!pi[pino].include) {\r
+        /* TODO: throw an error */\r
+        pi_destroy(pi, cp, tileno);\r
+        return NULL;\r
+      }\r
+    }\r
+    else {\r
+      pi[pino].include = pi[pino - 1].include;\r
+    }\r
+    \r
+    if (tcp->POC == 0) {\r
+      pi[pino].first = 1;\r
+      pi[pino].poc.resno0 = 0;\r
+      pi[pino].poc.compno0 = 0;\r
+      pi[pino].poc.layno1 = tcp->numlayers;\r
+      pi[pino].poc.resno1 = maxres;\r
+      pi[pino].poc.compno1 = image->numcomps;\r
+      pi[pino].poc.prg = tcp->prg;\r
+    } else {\r
+      pi[pino].first = 1;\r
+      pi[pino].poc.resno0 = tcp->pocs[pino].resno0;\r
+      pi[pino].poc.compno0 = tcp->pocs[pino].compno0;\r
+      pi[pino].poc.layno1 = tcp->pocs[pino].layno1;\r
+      pi[pino].poc.resno1 = tcp->pocs[pino].resno1;\r
+      pi[pino].poc.compno1 = tcp->pocs[pino].compno1;\r
+      pi[pino].poc.prg = tcp->pocs[pino].prg;\r
+    }\r
+  }\r
+  \r
+  return pi;\r
+}\r
+\r
+void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) {\r
+  int compno, pino;\r
+  opj_tcp_t *tcp = &cp->tcps[tileno];\r
+  if(pi) {\r
+    for (pino = 0; pino < tcp->numpocs + 1; pino++) {  \r
+      if(pi[pino].comps) {\r
+        for (compno = 0; compno < pi->numcomps; compno++) {\r
+          opj_pi_comp_t *comp = &pi[pino].comps[compno];\r
+          if(comp->resolutions) {\r
+            opj_free(comp->resolutions);\r
+          }\r
+        }\r
+        opj_free(pi[pino].comps);\r
+      }\r
+    }\r
+    if(pi->include) {\r
+      opj_free(pi->include);\r
+    }\r
+    opj_free(pi);\r
+  }\r
+}\r
+\r
+bool pi_next(opj_pi_iterator_t * pi) {\r
+  switch (pi->poc.prg) {\r
+    case LRCP:\r
+      return pi_next_lrcp(pi);\r
+    case RLCP:\r
+      return pi_next_rlcp(pi);\r
+    case RPCL:\r
+      return pi_next_rpcl(pi);\r
+    case PCRL:\r
+      return pi_next_pcrl(pi);\r
+    case CPRL:\r
+      return pi_next_cprl(pi);\r
+  }\r
+  \r
+  return false;\r
+}\r
+\r
index 0d1ab427ed1f839e5af5648edc92ccdf2ae66dda..814926c389c87801c00e144e3fb75a9eebe48979 100644 (file)
-/*
- * 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
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#ifndef __PI_H\r
+#define __PI_H\r
+/**\r
+@file pi.h\r
+@brief Implementation of a packet iterator (PI)\r
+\r
+The functions in PI.C have for goal to realize a packet iterator that permits to get the next\r
+packet following the progression order and change of it. The functions in PI.C are used\r
+by some function in T2.C.\r
+*/\r
+\r
+/** @defgroup PI PI - Implementation of a packet iterator */\r
+/*@{*/\r
+\r
+/**\r
+FIXME: documentation\r
+*/\r
+typedef struct opj_pi_resolution {\r
+  int pdx, pdy;\r
+  int pw, ph;\r
+} opj_pi_resolution_t;\r
+\r
+/**\r
+FIXME: documentation\r
+*/\r
+typedef struct opj_pi_comp {\r
+  int dx, dy;\r
+  /** number of resolution levels */\r
+  int numresolutions;\r
+  opj_pi_resolution_t *resolutions;\r
+} opj_pi_comp_t;\r
+\r
+/** \r
+Packet iterator \r
+*/\r
+typedef struct opj_pi_iterator {\r
+  /** precise if the packet has been already used (usefull for progression order change) */\r
+  short int *include;\r
+  /** layer step used to localize the packet in the include vector */\r
+  int step_l;\r
+  /** resolution step used to localize the packet in the include vector */\r
+  int step_r;  \r
+  /** component step used to localize the packet in the include vector */\r
+  int step_c;  \r
+  /** precinct step used to localize the packet in the include vector */\r
+  int step_p;  \r
+  /** component that identify the packet */\r
+  int compno;\r
+  /** resolution that identify the packet */\r
+  int resno;\r
+  /** precinct that identify the packet */\r
+  int precno;\r
+  /** layer that identify the packet */\r
+  int layno;   \r
+  /** 0 if the first packet */\r
+  int first;\r
+  /** progression order change information */\r
+  opj_poc_t poc;\r
+  /** */\r
+  int numcomps;\r
+  /** */\r
+  opj_pi_comp_t *comps;\r
+  int tx0, ty0, tx1, ty1;\r
+  int x, y, dx, dy;\r
+} opj_pi_iterator_t;\r
+\r
+/** @name Exported functions */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+/**\r
+Create a packet iterator\r
+@param image Raw image for which the packets will be listed\r
+@param cp Coding parameters\r
+@param tileno Number that identifies the tile for which to list the packets\r
+@return Returns a packet iterator that points to the first packet of the tile\r
+@see pi_destroy\r
+*/\r
+opj_pi_iterator_t *pi_create(opj_image_t * image, opj_cp_t * cp, int tileno);\r
+\r
+/**\r
+Destroy a packet iterator\r
+@param pi Previously created packet iterator\r
+@param cp Coding parameters\r
+@param tileno Number that identifies the tile for which the packets were listed\r
+@see pi_create\r
+*/\r
+void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno);\r
+\r
+/**\r
+Modify the packet iterator to point to the next packet\r
+@param pi Packet iterator to modify\r
+@return Returns false if pi pointed to the last packet or else returns true \r
+*/\r
+bool pi_next(opj_pi_iterator_t * pi);\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __PI_H */\r
index e114e98b4e6e668e9895073d5262eb6902033bd4..d752b8cd2f904af83a7a9008780946d07e145731 100644 (file)
@@ -1,81 +1,86 @@
-/*
- * 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;
-}
+/*\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+/* \r
+==========================================================\r
+   local functions\r
+==========================================================\r
+*/\r
+\r
+\r
+/* \r
+==========================================================\r
+   RAW encoding interface\r
+==========================================================\r
+*/\r
+\r
+opj_raw_t* raw_create() {\r
+  opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t));\r
+  return raw;\r
+}\r
+\r
+void raw_destroy(opj_raw_t *raw) {\r
+  if(raw) {\r
+    opj_free(raw);\r
+  }\r
+}\r
+\r
+int raw_numbytes(opj_raw_t *raw) {\r
+  return raw->bp - raw->start;\r
+}\r
+\r
+void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) {\r
+  raw->start = bp;\r
+  raw->lenmax = len;\r
+  raw->len = 0;\r
+  raw->c = 0;\r
+  raw->ct = 0;\r
+}\r
+\r
+int raw_decode(opj_raw_t *raw) {\r
+  int d;\r
+  if (raw->ct == 0) {\r
+    raw->ct = 8;\r
+    if (raw->len == raw->lenmax) {\r
+      raw->c = 0xff;\r
+    } else {\r
+      if (raw->c == 0xff) {\r
+        raw->ct = 7;\r
+      }\r
+      raw->c = *(raw->start + raw->len);\r
+      raw->len++;\r
+    }\r
+  }\r
+  raw->ct--;\r
+  d = (raw->c >> raw->ct) & 0x01;\r
+  \r
+  return d;\r
+}\r
+\r
index 08b20bc63c77ee67d40afc5f59e9cbfd5cb202d8..03d8f3e74778263b85510ba36940888baa25b818 100644 (file)
@@ -1,48 +1,99 @@
-/*
- * 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
+/*\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#ifndef __RAW_H\r
+#define __RAW_H\r
+/**\r
+@file raw.h\r
+@brief Implementation of operations for raw encoding (RAW)\r
+\r
+The functions in RAW.C have for goal to realize the operation of raw encoding linked\r
+with the corresponding mode switch.\r
+*/\r
+\r
+/** @defgroup RAW RAW - Implementation of operations for raw encoding */\r
+/*@{*/\r
+\r
+/**\r
+RAW encoding operations\r
+*/\r
+typedef struct opj_raw {\r
+  /** temporary buffer where bits are coded or decoded */\r
+  unsigned char c;\r
+  /** number of bits already read or free to write */\r
+  unsigned int ct;\r
+  /** maximum length to decode */\r
+  unsigned int lenmax;\r
+  /** length decoded */\r
+  unsigned int len;\r
+  /** pointer to the current position in the buffer */\r
+  unsigned char *bp;\r
+  /** pointer to the start of the buffer */\r
+  unsigned char *start;\r
+  /** pointer to the end of the buffer */\r
+  unsigned char *end;\r
+} opj_raw_t;\r
+\r
+/** @name Exported functions */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+/**\r
+Create a new RAW handle \r
+@return Returns a new RAW handle if successful, returns NULL otherwise\r
+*/\r
+opj_raw_t* raw_create();\r
+/**\r
+Destroy a previously created RAW handle\r
+@param raw RAW handle to destroy\r
+*/\r
+void raw_destroy(opj_raw_t *raw);\r
+/**\r
+Return the number of bytes written/read since initialisation\r
+@param raw RAW handle to destroy\r
+@return Returns the number of bytes already encoded\r
+*/\r
+int raw_numbytes(opj_raw_t *raw);\r
+/**\r
+Initialize the decoder\r
+@param raw RAW handle\r
+@param bp Pointer to the start of the buffer from which the bytes will be read\r
+@param len Length of the input buffer\r
+*/\r
+void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len);\r
+/**\r
+Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN\r
+@param raw RAW handle\r
+@return Returns the decoded symbol (0 or 1)\r
+*/\r
+int raw_decode(opj_raw_t *raw);\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __RAW_H */\r
index fee3315ddd0f7704f38ae606edb09716ba8b46c5..b764358f51116513e8f4e7b63bbf0d70420bb7ee 100644 (file)
-/*
- * 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 "t1.h"
-#include "j2k.h"
-#include "mqc.h"
-#include "raw.h"      /* Antonin */
-#include "int.h"
-#include "mct.h"
-#include "dwt.h"
-#include "fix.h"
-#include <stdio.h>
-#include <math.h>
-#include <stdlib.h>
-
-#define T1_MAXCBLKW 1024
-#define T1_MAXCBLKH 1024
-
-#define T1_SIG_NE 0x0001
-#define T1_SIG_SE 0x0002
-#define T1_SIG_SW 0x0004
-#define T1_SIG_NW 0x0008
-#define T1_SIG_N 0x0010
-#define T1_SIG_E 0x0020
-#define T1_SIG_S 0x0040
-#define T1_SIG_W 0x0080
-#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)
-#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)
-
-#define T1_SGN_N 0x0100
-#define T1_SGN_E 0x0200
-#define T1_SGN_S 0x0400
-#define T1_SGN_W 0x0800
-#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)
-
-#define T1_SIG 0x1000
-#define T1_REFINE 0x2000
-#define T1_VISIT 0x4000
-
-#define T1_NUMCTXS_AGG 1
-#define T1_NUMCTXS_ZC 9
-#define T1_NUMCTXS_MAG 3
-#define T1_NUMCTXS_SC 5
-#define T1_NUMCTXS_UNI 1
-
-#define T1_CTXNO_AGG 0
-#define T1_CTXNO_ZC (T1_CTXNO_AGG+T1_NUMCTXS_AGG)
-#define T1_CTXNO_MAG (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
-#define T1_CTXNO_SC (T1_CTXNO_MAG+T1_NUMCTXS_MAG)
-#define T1_CTXNO_UNI (T1_CTXNO_SC+T1_NUMCTXS_SC)
-#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)
-
-#define T1_NMSEDEC_BITS 7
-#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)
-
-/* add TONY */
-#define T1_TYPE_MQ 0
-#define T1_TYPE_RAW 1
-/* dda */
-
-static int t1_lut_ctxno_zc[1024];
-static int t1_lut_ctxno_sc[256];
-static int t1_lut_ctxno_mag[4096];
-static int t1_lut_spb[256];
-static int t1_lut_nmsedec_sig[1 << T1_NMSEDEC_BITS];
-static int t1_lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS];
-static int t1_lut_nmsedec_ref[1 << T1_NMSEDEC_BITS];
-static int t1_lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS];
-
-static int t1_data[T1_MAXCBLKH][T1_MAXCBLKW];
-static int t1_flags[T1_MAXCBLKH + 2][T1_MAXCBLKH + 2];
-
-int t1_getctxno_zc(int f, int orient)
-{
-  return t1_lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
-}
-
-int t1_getctxno_sc(int f)
-{
-  return t1_lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
-}
-
-int t1_getctxno_mag(int f)
-{
-  return t1_lut_ctxno_mag[(f & T1_SIG_OTH) |
-           (((f & T1_REFINE) != 0) << 11)];
-}
-
-int t1_getspb(int f)
-{
-  return t1_lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
-}
-
-int t1_getnmsedec_sig(int x, int bitpos)
-{
-  if (bitpos > T1_NMSEDEC_FRACBITS)
-    return t1_lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) &
-               ((1 << T1_NMSEDEC_BITS) - 1)];
-  else
-    return t1_lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
-}
-
-int t1_getnmsedec_ref(int x, int bitpos)
-{
-  if (bitpos > T1_NMSEDEC_FRACBITS)
-    return t1_lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) &
-               ((1 << T1_NMSEDEC_BITS) - 1)];
-  else
-    return t1_lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
-}
-
-void t1_updateflags(int *fp, int s)
-{
-  int *np = fp - (T1_MAXCBLKW + 2);
-  int *sp = fp + (T1_MAXCBLKW + 2);
-  np[-1] |= T1_SIG_SE;
-  np[1] |= T1_SIG_SW;
-  sp[-1] |= T1_SIG_NE;
-  sp[1] |= T1_SIG_NW;
-  *np |= T1_SIG_S;
-  *sp |= T1_SIG_N;
-  fp[-1] |= T1_SIG_E;
-  fp[1] |= T1_SIG_W;
-  if (s) {
-    *np |= T1_SGN_S;
-    *sp |= T1_SGN_N;
-    fp[-1] |= T1_SGN_E;
-    fp[1] |= T1_SGN_W;
-  }
-}
-
-void t1_enc_sigpass_step(int *fp, int *dp, int orient, int bpno, int one,
-          int *nmsedec, char type, int vsc)
-{
-  int v, flag;
-  flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S)))
-    : (*fp);
-  if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
-    v = int_abs(*dp) & one ? 1 : 0;
-    if (type == T1_TYPE_RAW) {   /* BYPASS/LAZY MODE */
-      mqc_setcurctx(t1_getctxno_zc(flag, orient));   /* ESSAI */
-      mqc_bypass_enc(v);
-    } else {
-      mqc_setcurctx(t1_getctxno_zc(flag, orient));
-      mqc_encode(v);
-    }
-    if (v) {
-      v = *dp < 0 ? 1 : 0;
-      *nmsedec +=
-   t1_getnmsedec_sig(int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
-      if (type == T1_TYPE_RAW) {   /* BYPASS/LAZY MODE */
-   mqc_setcurctx(t1_getctxno_sc(flag));   /* ESSAI */
-   mqc_bypass_enc(v);
-      } else {
-   mqc_setcurctx(t1_getctxno_sc(flag));
-   mqc_encode(v ^ t1_getspb(flag));
-      }
-      t1_updateflags(fp, v);
-      *fp |= T1_SIG;
-    }
-    *fp |= T1_VISIT;
-  }
-}
-
-
-
-void t1_dec_sigpass_step(int *fp, int *dp, int orient, int oneplushalf,
-          char type, int vsc)
-{
-  int v, flag;
-  flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S)))
-    : (*fp);
-  if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
-    if (type == T1_TYPE_RAW) {
-      if (raw_decode()) {
-   v = raw_decode();   /* ESSAI */
-   *dp = v ? -oneplushalf : oneplushalf;
-   t1_updateflags(fp, v);
-   *fp |= T1_SIG;
-      }
-    } else {
-      mqc_setcurctx(t1_getctxno_zc(flag, orient));
-      if (mqc_decode()) {
-   mqc_setcurctx(t1_getctxno_sc(flag));
-   v = mqc_decode() ^ t1_getspb(flag);
-   *dp = v ? -oneplushalf : oneplushalf;
-   t1_updateflags(fp, v);
-   *fp |= T1_SIG;
-      }
-    }
-    *fp |= T1_VISIT;
-  }
-}            /* VSC and  BYPASS by Antonin */
-
-void t1_enc_sigpass(int w, int h, int bpno, int orient, int *nmsedec,
-          char type, int cblksty)
-{
-  int i, j, k, one, vsc;
-  *nmsedec = 0;
-  one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
-  for (k = 0; k < h; k += 4) {
-    for (i = 0; i < w; i++) {
-      for (j = k; j < k + 4 && j < h; j++) {
-   vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC)
-          && (j == k + 3 || j == h - 1)) ? 1 : 0;
-   t1_enc_sigpass_step(&t1_flags[1 + j][1 + i],
-             &t1_data[j][i], orient, bpno, one,
-             nmsedec, type, vsc);
-      }
-    }
-  }
-}
-
-void t1_dec_sigpass(int w, int h, int bpno, int orient, char type,
-          int cblksty)
-{
-  int i, j, k, one, half, oneplushalf, vsc;
-  one = 1 << bpno;
-  half = one >> 1;
-  oneplushalf = one | half;
-  for (k = 0; k < h; k += 4) {
-    for (i = 0; i < w; i++) {
-      for (j = k; j < k + 4 && j < h; j++) {
-   vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC)
-          && (j == k + 3 || j == h - 1)) ? 1 : 0;
-   t1_dec_sigpass_step(&t1_flags[1 + j][1 + i],
-             &t1_data[j][i], 
-
-             orient, 
-
-             oneplushalf,
-             type, vsc);
-      }
-    }
-  }
-}            /* VSC and  BYPASS by Antonin */
-
-void t1_enc_refpass_step(int *fp, int *dp, int bpno, int one, int *nmsedec,
-          char type, int vsc)
-{
-  int v, flag;
-  flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S)))
-    : (*fp);
-  if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
-    *nmsedec +=
-      t1_getnmsedec_ref(int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
-    v = int_abs(*dp) & one ? 1 : 0;
-    if (type == T1_TYPE_RAW) {   /* BYPASS/LAZY MODE */
-      mqc_setcurctx(t1_getctxno_mag(flag));   /* ESSAI */
-      mqc_bypass_enc(v);
-    } else {
-      mqc_setcurctx(t1_getctxno_mag(flag));
-      mqc_encode(v);
-    }
-    *fp |= T1_REFINE;
-  }
-}
-
-
-
-void t1_dec_refpass_step(int *fp, int *dp, int poshalf, int neghalf,
-          char type, int vsc)
-{
-  int v, t, flag;
-  flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S)))
-    : (*fp);
-  if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
-    if (type == T1_TYPE_RAW) {
-      mqc_setcurctx(t1_getctxno_mag(flag));   /* ESSAI */
-      v = raw_decode();
-    } else {
-      mqc_setcurctx(t1_getctxno_mag(flag));
-      v = mqc_decode();
-    }
-    t = v ? poshalf : neghalf;
-    *dp += *dp < 0 ? -t : t;
-    *fp |= T1_REFINE;
-  }
-}            /* VSC and  BYPASS by Antonin  */
-
-void t1_enc_refpass(int w, int h, int bpno, int *nmsedec, char type,
-          int cblksty)
-{
-  int i, j, k, one, vsc;
-  *nmsedec = 0;
-  one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
-  for (k = 0; k < h; k += 4) {
-    for (i = 0; i < w; i++) {
-      for (j = k; j < k + 4 && j < h; j++) {
-   vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC)
-          && (j == k + 3 || j == h - 1)) ? 1 : 0;
-   t1_enc_refpass_step(&t1_flags[1 + j][1 + i],
-             &t1_data[j][i], bpno, one, nmsedec, type, vsc);
-      }
-    }
-  }
-}
-
-void t1_dec_refpass(int w, int h, int bpno, char type, int cblksty)
-{
-  int i, j, k, one, poshalf, neghalf;
-  int vsc;
-  one = 1 << bpno;
-  poshalf = one >> 1;
-  neghalf = bpno > 0 ? -poshalf : -1;
-  for (k = 0; k < h; k += 4) {
-    for (i = 0; i < w; i++) {
-      for (j = k; j < k + 4 && j < h; j++) {
-   vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC)
-          && (j == k + 3 || j == h - 1)) ? 1 : 0;
-   t1_dec_refpass_step(&t1_flags[1 + j][1 + i],
-             &t1_data[j][i], 
-
-             poshalf, 
-
-             neghalf, 
-
-             type, vsc);
-      }
-    }
-  }
-}            /* VSC and  BYPASS by Antonin */
-
-void t1_enc_clnpass_step(int *fp, int *dp, int orient, int bpno, int one,
-          int *nmsedec, int partial, int vsc)
-{
-  int v, flag;
-  flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S)))
-    : (*fp);
-  if (partial)
-    goto label_partial;
-  if (!(*fp & (T1_SIG | T1_VISIT))) {
-    mqc_setcurctx(t1_getctxno_zc(flag, orient));
-    v = int_abs(*dp) & one ? 1 : 0;
-    mqc_encode(v);
-    if (v) {
-    label_partial:
-      *nmsedec +=
-   t1_getnmsedec_sig(int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
-      mqc_setcurctx(t1_getctxno_sc(flag));
-      v = *dp < 0 ? 1 : 0;
-      mqc_encode(v ^ t1_getspb(flag));
-      t1_updateflags(fp, v);
-      *fp |= T1_SIG;
-    }
-  }
-  *fp &= ~T1_VISIT;
-}
-
-
-
-
-void t1_dec_clnpass_step(int *fp, int *dp, int orient, int oneplushalf,
-          int partial, int vsc)
-{
-  int v, flag;
-  flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S)))
-    : (*fp);
-  if (partial)
-    goto label_partial;
-  if (!(flag & (T1_SIG | T1_VISIT))) {
-    mqc_setcurctx(t1_getctxno_zc(flag, orient));
-    if (mqc_decode()) {
-    label_partial:
-      mqc_setcurctx(t1_getctxno_sc(flag));
-      v = mqc_decode() ^ t1_getspb(flag);
-      *dp = v ? -oneplushalf : oneplushalf;
-      t1_updateflags(fp, v);
-      *fp |= T1_SIG;
-    }
-  }
-  *fp &= ~T1_VISIT;
-}            /* VSC and  BYPASS by Antonin */
-
-void t1_enc_clnpass(int w, int h, int bpno, int orient, int *nmsedec,
-          int cblksty)
-{
-  int i, j, k, one, agg, runlen, vsc;
-  *nmsedec = 0;
-  one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
-  for (k = 0; k < h; k += 4) {
-    for (i = 0; i < w; i++) {
-      if (k + 3 < h) {
-   if (cblksty & J2K_CCP_CBLKSTY_VSC) {
-     agg = !(t1_flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
-        || t1_flags[1 + k + 1][1 +
-                i] & (T1_SIG | T1_VISIT |
-                      T1_SIG_OTH)
-        || t1_flags[1 + k + 2][1 +
-                i] & (T1_SIG | T1_VISIT |
-                      T1_SIG_OTH)
-        || (t1_flags[1 + k + 3][1 + i] &
-            (~
-             (T1_SIG_S | T1_SIG_SE | T1_SIG_SW |
-         T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
-   } else {
-     agg = !(t1_flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
-        || t1_flags[1 + k + 1][1 +
-                i] & (T1_SIG | T1_VISIT |
-                      T1_SIG_OTH)
-        || t1_flags[1 + k + 2][1 +
-                i] & (T1_SIG | T1_VISIT |
-                      T1_SIG_OTH)
-        || t1_flags[1 + k + 3][1 +
-                i] & (T1_SIG | T1_VISIT |
-                      T1_SIG_OTH));
-   }
-      } else {
-   agg = 0;
-      }
-      if (agg) {
-   for (runlen = 0; runlen < 4; runlen++) {
-     if (int_abs(t1_data[k + runlen][i]) & one)
-       break;
-   }
-   mqc_setcurctx(T1_CTXNO_AGG);
-   mqc_encode(runlen != 4);
-   if (runlen == 4) {
-     continue;
-   }
-   mqc_setcurctx(T1_CTXNO_UNI);
-   mqc_encode(runlen >> 1);
-   mqc_encode(runlen & 1);
-      } else {
-   runlen = 0;
-      }
-      for (j = k + runlen; j < k + 4 && j < h; j++) {
-   vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC)
-          && (j == k + 3 || j == h - 1)) ? 1 : 0;
-   t1_enc_clnpass_step(&t1_flags[1 + j][1 + i],
-             &t1_data[j][i], orient, bpno, one,
-             nmsedec, agg && (j == k + runlen), vsc);
-      }
-    }
-  }
-}
-
-void t1_dec_clnpass(int w, int h, int bpno, int orient, int cblksty)
-{
-  int i, j, k, one, half, oneplushalf, agg, runlen, vsc;
-  int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;
-  one = 1 << bpno;
-  half = one >> 1;
-  oneplushalf = one | half;
-  for (k = 0; k < h; k += 4) {
-    for (i = 0; i < w; i++) {
-      if (k + 3 < h) {
-   if (cblksty & J2K_CCP_CBLKSTY_VSC) {
-     agg = !(t1_flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
-        || t1_flags[1 + k + 1][1 +
-                i] & (T1_SIG | T1_VISIT |
-                      T1_SIG_OTH)
-        || t1_flags[1 + k + 2][1 +
-                i] & (T1_SIG | T1_VISIT |
-                      T1_SIG_OTH)
-        || (t1_flags[1 + k + 3][1 + i] &
-            (~
-             (T1_SIG_S | T1_SIG_SE | T1_SIG_SW |
-         T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
-   } else {
-     agg = !(t1_flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
-        || t1_flags[1 + k + 1][1 +
-                i] & (T1_SIG | T1_VISIT |
-                      T1_SIG_OTH)
-        || t1_flags[1 + k + 2][1 +
-                i] & (T1_SIG | T1_VISIT |
-                      T1_SIG_OTH)
-        || t1_flags[1 + k + 3][1 +
-                i] & (T1_SIG | T1_VISIT |
-                      T1_SIG_OTH));
-   }
-      } else {
-   agg = 0;
-      }
-      if (agg) {
-   mqc_setcurctx(T1_CTXNO_AGG);
-   if (!mqc_decode()) {
-     continue;
-   }
-   mqc_setcurctx(T1_CTXNO_UNI);
-   runlen = mqc_decode();
-   runlen = (runlen << 1) | mqc_decode();
-      } else {
-   runlen = 0;
-      }
-      for (j = k + runlen; j < k + 4 && j < h; j++) {
-   vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC)
-          && (j == k + 3 || j == h - 1)) ? 1 : 0;
-   t1_dec_clnpass_step(&t1_flags[1 + j][1 + i],
-             &t1_data[j][i], 
-
-             orient, 
-
-             oneplushalf,
-             agg && (j == k + runlen), vsc);
-      }
-    }
-  }
-  if (segsym) {
-    int v = 0;
-    mqc_setcurctx(T1_CTXNO_UNI);
-    v = mqc_decode();
-    v = (v << 1) | mqc_decode();
-    v = (v << 1) | mqc_decode();
-    v = (v << 1) | mqc_decode();
-    /*  if (v!=0xa) 
-       {
-       fprintf(stderr, "warning: bad segmentation symbol %x\n",v);
-       } */
-  }
-}            /* VSC and  BYPASS by Antonin */
-
-double t1_getwmsedec(int nmsedec, int compno, int level, int orient, int bpno, int qmfbid, float stepsize, int numcomps)   /*mod fixed_quality*/
-{
-  double w1, w2, wmsedec;
-  if (qmfbid == 1) {
-    w1 = (numcomps > 1) ? mct_getnorm(compno) : 1;
-    w2 = dwt_getnorm(level, orient);
-  } else {         /* if (qmfbid == 0) */
-    w1 = (numcomps > 1) ? mct_getnorm_real(compno) : 1;
-    w2 = dwt_getnorm_real(level, orient);
-  }
-  wmsedec = w1 * w2 * (stepsize / 8192.0) * (1 << bpno);
-  wmsedec *= wmsedec * nmsedec / 8192.0;
-  return wmsedec;
-}
-
-void t1_encode_cblk(tcd_cblk_t * cblk, int orient, int compno, int level, int qmfbid, float stepsize, int cblksty, int numcomps, tcd_tile_t * tile)   /*mod fixed_quality*/
-{
-  int i, j;
-  int w, h;
-  int passno;
-  int bpno, passtype;
-  int max;
-  int nmsedec;
-  double cumwmsedec = 0;
-  char type = T1_TYPE_MQ;
-
-  w = cblk->x1 - cblk->x0;
-  h = cblk->y1 - cblk->y0;
-
-  max = 0;
-  for (j = 0; j < h; j++) {
-    for (i = 0; i < w; i++) {
-      max = int_max(max, int_abs(t1_data[j][i]));
-    }
-  }
-
-  cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0;
-
-  /* Changed by Dmitry Kolyadin */
-  for (i = 0; i <= w; i++)
-    for (j = 0; j <= h; j++){
-      t1_flags[j][i] = 0;
-    }
-
-  bpno = cblk->numbps - 1;
-  passtype = 2;
-
-  mqc_resetstates();
-  mqc_setstate(T1_CTXNO_UNI, 0, 46);
-  mqc_setstate(T1_CTXNO_AGG, 0, 3);
-  mqc_setstate(T1_CTXNO_ZC, 0, 4);
-  mqc_init_enc(cblk->data);
-
-  for (passno = 0; bpno >= 0; passno++) {
-    tcd_pass_t *pass = &cblk->passes[passno];
-    int correction = 3;
-    type = ((bpno < (cblk->numbps - 4)) && (passtype < 2)
-       && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW :
-      T1_TYPE_MQ;
-
-    switch (passtype) {
-    case 0:
-      t1_enc_sigpass(w, h, bpno, orient, &nmsedec, type, cblksty);
-      break;
-    case 1:
-      t1_enc_refpass(w, h, bpno, &nmsedec, type, cblksty);
-      break;
-    case 2:
-      t1_enc_clnpass(w, h, bpno, orient, &nmsedec, cblksty);
-      /* code switch SEGMARK (i.e. SEGSYM) */
-      if (cblksty & J2K_CCP_CBLKSTY_SEGSYM)
-   mqc_segmark_enc();
-      break;
-    }
-
-    cumwmsedec += t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps);   /*mod fixed_quality*/
-    tile->distotile += t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps);   /*add antonin quality*/
-
-
-    /* Code switch "RESTART" (i.e. TERMALL) */
-    if ((cblksty & J2K_CCP_CBLKSTY_TERMALL)
-   && !((passtype == 2) && (bpno - 1 < 0))) {
-      if (type == T1_TYPE_RAW) {
-   mqc_flush();
-   correction = 1;
-   /* correction = mqc_bypass_flush_enc(); */
-      } else {         /* correction = mqc_restart_enc(); */
-   mqc_flush();
-   correction = 1;
-      }
-      pass->term = 1;
-    } else {
-      if (((bpno < (cblk->numbps - 4) && (passtype > 0))
-      || ((bpno == (cblk->numbps - 4)) && (passtype == 2)))
-     && (cblksty & J2K_CCP_CBLKSTY_LAZY)) {
-   if (type == T1_TYPE_RAW) {
-     mqc_flush();
-     correction = 1;
-     /* correction = mqc_bypass_flush_enc(); */
-   } else {      /* correction = mqc_restart_enc(); */
-     mqc_flush();
-     correction = 1;
-   }
-   pass->term = 1;
-      } else {
-   pass->term = 0;
-      }
-    }
-
-    if (++passtype == 3) {
-      passtype = 0;
-      bpno--;
-    }
-
-    if (pass->term && bpno > 0) {
-      type = ((bpno < (cblk->numbps - 4)) && (passtype < 2)
-         && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW :
-   T1_TYPE_MQ;
-      if (type == T1_TYPE_RAW)
-   mqc_bypass_init_enc();
-      else
-   mqc_restart_init_enc();
-    }
-
-    pass->distortiondec = cumwmsedec;
-    pass->rate = mqc_numbytes() + correction;   /* FIXME */
-    pass->len =
-      pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
-
-    /* Code-switch "RESET" */
-    if (cblksty & J2K_CCP_CBLKSTY_RESET)
-      mqc_reset_enc();
-  }
-
-  /* Code switch "ERTERM" (i.e. PTERM) */
-  if (cblksty & J2K_CCP_CBLKSTY_PTERM)
-    mqc_erterm_enc();
-  else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY))
-    mqc_flush();
-
-  cblk->totalpasses = passno;
-}
-
-void t1_decode_cblk(tcd_cblk_t * cblk, int orient, int roishift,
-          int cblksty)
-{
-  int i, j, w, h;
-  int bpno, passtype;
-  int segno, passno;
-  char type = T1_TYPE_MQ; /*BYPASS mode*/
-  
-  w = cblk->x1 - cblk->x0;
-  h = cblk->y1 - cblk->y0;
-  
-  /* Changed by Dmitry Kolyadin */
-  for (j = 0; j <= h; j++){
-    for (i = 0; i <= w; i++) {
-      t1_flags[j][i] = 0;
-  }
-  }
-    
-  /* Changed by Dmitry Kolyadin */
-  for (i = 0; i < w; i++) {
-      for (j = 0; j < h; j++){
-   t1_data[j][i] = 0;
-      }
-  }
-      
-  bpno = roishift + cblk->numbps - 1;
-  passtype = 2;
-
-  mqc_resetstates();
-  mqc_setstate(T1_CTXNO_UNI, 0, 46);
-  mqc_setstate(T1_CTXNO_AGG, 0, 3);
-  mqc_setstate(T1_CTXNO_ZC, 0, 4);
-
-  for (segno = 0; segno < cblk->numsegs; segno++) {
-    tcd_seg_t *seg = &cblk->segs[segno];
-    
-    /* Add BYPASS mode */
-    type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2)
-      && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW :
-    T1_TYPE_MQ;
-    if (type == T1_TYPE_RAW) 
-      raw_init_dec(seg->data, seg->len);
-    else
-      mqc_init_dec(seg->data, seg->len);
-    /* ddA */
-    
-    for (passno = 0; passno < seg->numpasses; passno++) {
-      switch (passtype) {
-      case 0:
-   t1_dec_sigpass(w, h, bpno+1, orient, type, cblksty);
-   break;
-      case 1:
-   t1_dec_refpass(w, h, bpno+1, type, cblksty);
-   break;
-      case 2:
-   t1_dec_clnpass(w, h, bpno+1, orient, cblksty);
-   break;
-      }
-      
-      if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
-   mqc_resetstates();
-
-   mqc_setstate(T1_CTXNO_UNI, 0, 46);
-
-   mqc_setstate(T1_CTXNO_AGG, 0, 3);
-
-   mqc_setstate(T1_CTXNO_ZC, 0, 4);
-
-      }
-      
-      if (++passtype == 3) {
-   passtype = 0;
-   bpno--;
-      }
-    }
-  }
-}
-
-void t1_encode_cblks(tcd_tile_t * tile, j2k_tcp_t * tcp)
-{
-  int compno, resno, bandno, precno, cblkno;
-  int x, y, i, j, orient;
-  tcd_tilecomp_t *tilec;
-  tcd_resolution_t *res;
-  tcd_band_t *band;
-  tcd_precinct_t *prc;
-  tcd_cblk_t *cblk;
-
-  tile->distotile = 0;      /*add fixed_quality*/
-
-  for (compno = 0; compno < tile->numcomps; compno++) {
-    tilec = &tile->comps[compno];
-    for (resno = 0; resno < tilec->numresolutions; resno++) {
-      res = &tilec->resolutions[resno];
-      for (bandno = 0; bandno < res->numbands; bandno++) {
-   band = &res->bands[bandno];
-   for (precno = 0; precno < res->pw * res->ph; precno++) {
-     prc = &band->precincts[precno];
-     for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
-       cblk = &prc->cblks[cblkno];
-
-       if (band->bandno == 0) {
-         x = cblk->x0 - band->x0;
-         y = cblk->y0 - band->y0;
-       } else if (band->bandno == 1) {
-         tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
-         x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
-         y = cblk->y0 - band->y0;
-       } else if (band->bandno == 2) {
-         tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
-         x = cblk->x0 - band->x0;
-         y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
-       } else {      /* if (band->bandno == 3) */
-         tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
-         x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
-         y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
-       }
-
-       if (tcp->tccps[compno].qmfbid == 1) {
-
-         for (j = 0; j < cblk->y1 - cblk->y0; j++) {
-      for (i = 0; i < cblk->x1 - cblk->x0; i++) {
-        t1_data[j][i] =
-          tilec->data[(x + i) +
-            (y + j) * (tilec->x1 -
-                  tilec->
-                  x0)] << T1_NMSEDEC_FRACBITS;
-      }
-         }
-       } else if (tcp->tccps[compno].qmfbid == 0) {
-         for (j = 0; j < cblk->y1 - cblk->y0; j++) {
-      for (i = 0; i < cblk->x1 - cblk->x0; i++) {
-        t1_data[j][i] =
-          fix_mul(tilec->
-             data[x + i +
-             (y + j) * (tilec->x1 -
-                   tilec->
-                   x0)],
-             8192 * 8192 /
-             ((int) floor(band->stepsize * 8192))) >> (13 - T1_NMSEDEC_FRACBITS);
-      }
-         }
-       }
-       orient = band->bandno;   /* FIXME */
-       if (orient == 2) {
-         orient = 1;
-       } else if (orient == 1) {
-         orient = 2;
-       }
-       t1_encode_cblk(cblk, orient, compno, tilec->numresolutions - 1 - resno, tcp->tccps[compno].qmfbid, band->stepsize, tcp->tccps[compno].cblksty, tile->numcomps, tile);   /*mod fixed_quality*/
-     }         /* cblkno */
-   }         /* precno */
-      }            /* bandno */
-    }            /* resno  */
-  }            /* compo  */
-}
-
-
-void t1_decode_cblks(tcd_tile_t * tile, j2k_tcp_t * tcp)
-{
-  int compno, resno, bandno, precno, cblkno;
-
-  for (compno = 0; compno < tile->numcomps; compno++) {
-    tcd_tilecomp_t *tilec = &tile->comps[compno];
-    for (resno = 0; resno < tilec->numresolutions; resno++) {
-      tcd_resolution_t *res = &tilec->resolutions[resno];
-      for (bandno = 0; bandno < res->numbands; bandno++) {
-   tcd_band_t *band = &res->bands[bandno];
-   for (precno = 0; precno < res->pw * res->ph; precno++) {
-     tcd_precinct_t *prc = &band->precincts[precno];
-     for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
-       int x, y, i, j, orient;
-       tcd_cblk_t *cblk = &prc->cblks[cblkno];
-       orient = band->bandno;   /* FIXME */
-       if (orient == 2)
-         orient = 1;
-       else if (orient == 1)
-         orient = 2;
-       t1_decode_cblk(cblk, orient,
-            tcp->tccps[compno].roishift,
-            tcp->tccps[compno].cblksty);
-       if (band->bandno == 0) {
-         x = cblk->x0 - band->x0;
-         y = cblk->y0 - band->y0;
-       } else if (band->bandno == 1) {
-         tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
-         x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
-         y = cblk->y0 - band->y0;
-       } else if (band->bandno == 2) {
-         tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
-         x = cblk->x0 - band->x0;
-         y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
-       } else {      /* if (band->bandno == 3) */
-         tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
-         x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
-         y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
-       }
-
-       if (tcp->tccps[compno].roishift) {
-         int thresh, val, mag;
-         thresh = 1 << tcp->tccps[compno].roishift;
-         for (j = 0; j < cblk->y1 - cblk->y0; j++) {
-      for (i = 0; i < cblk->x1 - cblk->x0; i++) {
-        val = t1_data[j][i];
-        mag = int_abs(val);
-        if (mag >= thresh) {
-          mag >>= tcp->tccps[compno].roishift;
-          t1_data[j][i] = val < 0 ? -mag : mag;
-        }
-      }
-         }
-       }
-
-       if (tcp->tccps[compno].qmfbid == 1) {
-         for (j = 0; j < cblk->y1 - cblk->y0; j++) {
-      for (i = 0; i < cblk->x1 - cblk->x0; i++) {
-                  int tmp=t1_data[j][i];
-                  if (tmp>>1==0) tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)] = 0;
-        else tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)] = tmp<0?(tmp>>1)+1:(tmp>>1);
-      }
-         }
-       } else {      /* if (tcp->tccps[compno].qmfbid == 0) */
-
-         for (j = 0; j < cblk->y1 - cblk->y0; j++) {
-      for (i = 0; i < cblk->x1 - cblk->x0; i++) {
-                  double tmp=t1_data[j][i] * band->stepsize * 4096.0;
-                  int tmp2;
-        if (t1_data[j][i]>>1 == 0) {
-          tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)] = 0;
-        } else {
-                    tmp2=((int) (floor(fabs(tmp)))) + ((int) floor(fabs(tmp*2))%2);
-          tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)] = ((tmp<0)?-tmp2:tmp2);  
-        }
-      }
-         }
-       }
-     }
-   }
-      }
-    }
-  }
-}
-
-int t1_init_ctxno_zc(int f, int orient)
-{
-  int h, v, d, n, t, hv;
-  n = 0;
-  h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0);
-  v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0);
-  d = ((f & T1_SIG_NW) != 0) + ((f & T1_SIG_NE) !=
-            0) + ((f & T1_SIG_SE) !=
-                  0) + ((f & T1_SIG_SW) != 0);
-  switch (orient) {
-  case 2:
-    t = h;
-    h = v;
-    v = t;
-  case 0:
-  case 1:
-    if (!h) {
-      if (!v) {
-   if (!d)
-     n = 0;
-   else if (d == 1)
-     n = 1;
-   else
-     n = 2;
-      } else if (v == 1)
-   n = 3;
-      else
-   n = 4;
-    } else if (h == 1) {
-      if (!v) {
-   if (!d)
-     n = 5;
-   else
-     n = 6;
-      } else
-   n = 7;
-    } else
-      n = 8;
-    break;
-  case 3:
-    hv = h + v;
-    if (!d) {
-      if (!hv)
-   n = 0;
-      else if (hv == 1)
-   n = 1;
-      else
-   n = 2;
-    } else if (d == 1) {
-      if (!hv)
-   n = 3;
-      else if (hv == 1)
-   n = 4;
-      else
-   n = 5;
-    } else if (d == 2) {
-      if (!hv)
-   n = 6;
-      else
-   n = 7;
-    } else
-      n = 8;
-    break;
-  }
-  return T1_CTXNO_ZC + n;
-}
-
-int t1_init_ctxno_sc(int f)
-{
-  int hc, vc, n;
-  n = 0;
-  hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
-      T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
-          1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
-              (T1_SIG_E | T1_SGN_E)) +
-             ((f & (T1_SIG_W | T1_SGN_W)) ==
-              (T1_SIG_W | T1_SGN_W)), 1);
-  vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
-      T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
-          1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
-              (T1_SIG_N | T1_SGN_N)) +
-             ((f & (T1_SIG_S | T1_SGN_S)) ==
-              (T1_SIG_S | T1_SGN_S)), 1);
-  if (hc < 0) {
-    hc = -hc;
-    vc = -vc;
-  }
-  if (!hc) {
-    if (vc == -1)
-      n = 1;
-    else if (!vc)
-      n = 0;
-    else
-      n = 1;
-  } else if (hc == 1) {
-    if (vc == -1)
-      n = 2;
-    else if (!vc)
-      n = 3;
-    else
-      n = 4;
-  }
-  return T1_CTXNO_SC + n;
-}
-
-int t1_init_ctxno_mag(int f)
-{
-  int n;
-  if (!(f & T1_REFINE))
-    n = (f & (T1_SIG_OTH)) ? 1 : 0;
-  else
-    n = 2;
-  return T1_CTXNO_MAG + n;
-}
-
-int t1_init_spb(int f)
-{
-  int hc, vc, n;
-  hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
-      T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
-          1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
-              (T1_SIG_E | T1_SGN_E)) +
-             ((f & (T1_SIG_W | T1_SGN_W)) ==
-              (T1_SIG_W | T1_SGN_W)), 1);
-  vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
-      T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
-          1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
-              (T1_SIG_N | T1_SGN_N)) +
-             ((f & (T1_SIG_S | T1_SGN_S)) ==
-              (T1_SIG_S | T1_SGN_S)), 1);
-  if (!hc && !vc)
-    n = 0;
-  else
-    n = (!(hc > 0 || (!hc && vc > 0)));
-  return n;
-}
-
-void t1_init_luts()
-{
-  int i, j;
-  double u, v, t;
-  for (j = 0; j < 4; j++) {
-    for (i = 0; i < 256; ++i) {
-      t1_lut_ctxno_zc[(j << 8) | i] = t1_init_ctxno_zc(i, j);
-    }
-  }
-  for (i = 0; i < 256; i++) {
-    t1_lut_ctxno_sc[i] = t1_init_ctxno_sc(i << 4);
-  }
-  for (j = 0; j < 2; j++) {
-    for (i = 0; i < 2048; ++i) {
-      t1_lut_ctxno_mag[(j << 11) + i] =
-   t1_init_ctxno_mag((j ? T1_REFINE : 0) | i);
-    }
-  }
-  for (i = 0; i < 256; ++i) {
-    t1_lut_spb[i] = t1_init_spb(i << 4);
-  }
-  /* FIXME FIXME FIXME */
-  /* fprintf(stdout,"nmsedec luts:\n"); */
-  for (i = 0; i < (1 << T1_NMSEDEC_BITS); i++) {
-    t = i / pow(2, T1_NMSEDEC_FRACBITS);
-    u = t;
-    v = t - 1.5;
-    t1_lut_nmsedec_sig[i] =
-      int_max(0,
-         (int) (floor
-           ((u * u - v * v) * pow(2,
-                   T1_NMSEDEC_FRACBITS) +
-            0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
-    t1_lut_nmsedec_sig0[i] =
-      int_max(0,
-         (int) (floor
-           ((u * u) * pow(2, T1_NMSEDEC_FRACBITS) +
-            0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
-    u = t - 1.0;
-    if (i & (1 << (T1_NMSEDEC_BITS - 1))) {
-      v = t - 1.5;
-    } else {
-      v = t - 0.5;
-    }
-    t1_lut_nmsedec_ref[i] =
-      int_max(0,
-         (int) (floor
-           ((u * u - v * v) * pow(2,
-                   T1_NMSEDEC_FRACBITS) +
-            0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
-    t1_lut_nmsedec_ref0[i] =
-      int_max(0,
-         (int) (floor
-           ((u * u) * pow(2, T1_NMSEDEC_FRACBITS) +
-            0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
-  }
-}
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+/** @defgroup T1 T1 - Implementation of the tier-1 coding */\r
+/*@{*/\r
+\r
+/** @name Local static functions */\r
+/*@{*/\r
+\r
+static int t1_getctxno_zc(opj_t1_t *t1, int f, int orient);\r
+static int t1_getctxno_sc(opj_t1_t *t1, int f);\r
+static int t1_getctxno_mag(opj_t1_t *t1, int f);\r
+static int t1_getspb(opj_t1_t *t1, int f);\r
+static int t1_getnmsedec_sig(opj_t1_t *t1, int x, int bitpos);\r
+static int t1_getnmsedec_ref(opj_t1_t *t1, int x, int bitpos);\r
+static void t1_updateflags(int *fp, int s);\r
+/**\r
+Encode significant pass\r
+*/\r
+static void t1_enc_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int bpno, int one, int *nmsedec, char type, int vsc);\r
+/**\r
+Decode significant pass\r
+*/\r
+static void t1_dec_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int oneplushalf, char type, int vsc);\r
+/**\r
+Encode significant pass\r
+*/\r
+static void t1_enc_sigpass(opj_t1_t *t1, int w, int h, int bpno, int orient, int *nmsedec, char type, int cblksty);\r
+/**\r
+Decode significant pass\r
+*/\r
+static void t1_dec_sigpass(opj_t1_t *t1, int w, int h, int bpno, int orient, char type, int cblksty);\r
+/**\r
+Encode refinement pass\r
+*/\r
+static void t1_enc_refpass_step(opj_t1_t *t1, int *fp, int *dp, int bpno, int one, int *nmsedec, char type, int vsc);\r
+/**\r
+Decode refinement pass\r
+*/\r
+static void t1_dec_refpass_step(opj_t1_t *t1, int *fp, int *dp, int poshalf, int neghalf, char type, int vsc);\r
+/**\r
+Encode refinement pass\r
+*/\r
+static void t1_enc_refpass(opj_t1_t *t1, int w, int h, int bpno, int *nmsedec, char type, int cblksty);\r
+/**\r
+Decode refinement pass\r
+*/\r
+static void t1_dec_refpass(opj_t1_t *t1, int w, int h, int bpno, char type, int cblksty);\r
+/**\r
+Encode clean-up pass\r
+*/\r
+static void t1_enc_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int bpno, int one, int *nmsedec, int partial, int vsc);\r
+/**\r
+Decode clean-up pass\r
+*/\r
+static void t1_dec_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int oneplushalf, int partial, int vsc);\r
+/**\r
+Encode clean-up pass\r
+*/\r
+static void t1_enc_clnpass(opj_t1_t *t1, int w, int h, int bpno, int orient, int *nmsedec, int cblksty);\r
+/**\r
+Decode clean-up pass\r
+*/\r
+static void t1_dec_clnpass(opj_t1_t *t1, int w, int h, int bpno, int orient, int cblksty);\r
+static double t1_getwmsedec(int nmsedec, int compno, int level, int orient, int bpno, int qmfbid, double stepsize, int numcomps);\r
+/**\r
+Encode 1 code-block\r
+@param t1 T1 handle\r
+@param cblk Code-block coding parameters\r
+@param orient\r
+@param compno Component number\r
+@param level\r
+@param qmfbid\r
+@param stepsize\r
+@param cblksty Code-block style\r
+@param numcomps\r
+@param tile\r
+*/\r
+static void t1_encode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient, int compno, int level, int qmfbid, double stepsize, int cblksty, int numcomps, opj_tcd_tile_t * tile);\r
+/**\r
+Decode 1 code-block\r
+@param t1 T1 handle\r
+@param cblk Code-block coding parameters\r
+@param orient\r
+@param roishift Region of interest shifting value\r
+@param cblksty Code-block style\r
+*/\r
+static void t1_decode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient, int roishift, int cblksty);\r
+static int t1_init_ctxno_zc(int f, int orient);\r
+static int t1_init_ctxno_sc(int f);\r
+static int t1_init_ctxno_mag(int f);\r
+static int t1_init_spb(int f);\r
+/**\r
+Initialize the look-up tables of the Tier-1 coder/decoder\r
+@param t1 T1 handle\r
+*/\r
+static void t1_init_luts(opj_t1_t *t1);\r
+\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+static int t1_getctxno_zc(opj_t1_t *t1, int f, int orient) {\r
+  return t1->lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];\r
+}\r
+\r
+static int t1_getctxno_sc(opj_t1_t *t1, int f) {\r
+  return t1->lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];\r
+}\r
+\r
+static int t1_getctxno_mag(opj_t1_t *t1, int f) {\r
+  return t1->lut_ctxno_mag[(f & T1_SIG_OTH) | (((f & T1_REFINE) != 0) << 11)];\r
+}\r
+\r
+static int t1_getspb(opj_t1_t *t1, int f) {\r
+  return t1->lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];\r
+}\r
+\r
+static int t1_getnmsedec_sig(opj_t1_t *t1, int x, int bitpos) {\r
+  if (bitpos > T1_NMSEDEC_FRACBITS) {\r
+    return t1->lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];\r
+  }\r
+  \r
+  return t1->lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];\r
+}\r
+\r
+static int t1_getnmsedec_ref(opj_t1_t *t1, int x, int bitpos) {\r
+  if (bitpos > T1_NMSEDEC_FRACBITS) {\r
+    return t1->lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];\r
+  }\r
+\r
+    return t1->lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];\r
+}\r
+\r
+static void t1_updateflags(int *fp, int s) {\r
+  int *np = fp - (T1_MAXCBLKW + 2);\r
+  int *sp = fp + (T1_MAXCBLKW + 2);\r
+  np[-1] |= T1_SIG_SE;\r
+  np[1] |= T1_SIG_SW;\r
+  sp[-1] |= T1_SIG_NE;\r
+  sp[1] |= T1_SIG_NW;\r
+  *np |= T1_SIG_S;\r
+  *sp |= T1_SIG_N;\r
+  fp[-1] |= T1_SIG_E;\r
+  fp[1] |= T1_SIG_W;\r
+  if (s) {\r
+    *np |= T1_SGN_S;\r
+    *sp |= T1_SGN_N;\r
+    fp[-1] |= T1_SGN_E;\r
+    fp[1] |= T1_SGN_W;\r
+  }\r
+}\r
+\r
+static void t1_enc_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int bpno, int one, int *nmsedec, char type, int vsc) {\r
+  int v, flag;\r
+  \r
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */\r
+  \r
+  flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp);\r
+  if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {\r
+    v = int_abs(*dp) & one ? 1 : 0;\r
+    if (type == T1_TYPE_RAW) {  /* BYPASS/LAZY MODE */\r
+      mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient));  /* ESSAI */\r
+      mqc_bypass_enc(mqc, v);\r
+    } else {\r
+      mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient));\r
+      mqc_encode(mqc, v);\r
+    }\r
+    if (v) {\r
+      v = *dp < 0 ? 1 : 0;\r
+      *nmsedec +=  t1_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);\r
+      if (type == T1_TYPE_RAW) {  /* BYPASS/LAZY MODE */\r
+        mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));  /* ESSAI */\r
+        mqc_bypass_enc(mqc, v);\r
+      } else {\r
+        mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));\r
+        mqc_encode(mqc, v ^ t1_getspb(t1, flag));\r
+      }\r
+      t1_updateflags(fp, v);\r
+      *fp |= T1_SIG;\r
+    }\r
+    *fp |= T1_VISIT;\r
+  }\r
+}\r
+\r
+static void t1_dec_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int oneplushalf, char type, int vsc) {\r
+  int v, flag;\r
+  \r
+  opj_raw_t *raw = t1->raw;  /* RAW component */\r
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */\r
+  \r
+  flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp);\r
+  if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {\r
+    if (type == T1_TYPE_RAW) {\r
+      if (raw_decode(raw)) {\r
+        v = raw_decode(raw);  /* ESSAI */\r
+        *dp = v ? -oneplushalf : oneplushalf;\r
+        t1_updateflags(fp, v);\r
+        *fp |= T1_SIG;\r
+      }\r
+    } else {\r
+      mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient));\r
+      if (mqc_decode(mqc)) {\r
+        mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));\r
+        v = mqc_decode(mqc) ^ t1_getspb(t1, flag);\r
+        *dp = v ? -oneplushalf : oneplushalf;\r
+        t1_updateflags(fp, v);\r
+        *fp |= T1_SIG;\r
+      }\r
+    }\r
+    *fp |= T1_VISIT;\r
+  }\r
+}        /* VSC and  BYPASS by Antonin */\r
+\r
+static void t1_enc_sigpass(opj_t1_t *t1, int w, int h, int bpno, int orient, int *nmsedec, char type, int cblksty) {\r
+  int i, j, k, one, vsc;\r
+  *nmsedec = 0;\r
+  one = 1 << (bpno + T1_NMSEDEC_FRACBITS);\r
+  for (k = 0; k < h; k += 4) {\r
+    for (i = 0; i < w; i++) {\r
+      for (j = k; j < k + 4 && j < h; j++) {\r
+        vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;\r
+        t1_enc_sigpass_step(t1, &t1->flags[1 + j][1 + i], &t1->data[j][i], orient, bpno, one, nmsedec, type, vsc);\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+static void t1_dec_sigpass(opj_t1_t *t1, int w, int h, int bpno, int orient, char type, int cblksty) {\r
+  int i, j, k, one, half, oneplushalf, vsc;\r
+  one = 1 << bpno;\r
+  half = one >> 1;\r
+  oneplushalf = one | half;\r
+  for (k = 0; k < h; k += 4) {\r
+    for (i = 0; i < w; i++) {\r
+      for (j = k; j < k + 4 && j < h; j++) {\r
+        vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;\r
+        t1_dec_sigpass_step(t1, &t1->flags[1 + j][1 + i], &t1->data[j][i], orient, oneplushalf, type, vsc);\r
+      }\r
+    }\r
+  }\r
+}        /* VSC and  BYPASS by Antonin */\r
+\r
+static void t1_enc_refpass_step(opj_t1_t *t1, int *fp, int *dp, int bpno, int one, int *nmsedec, char type, int vsc) {\r
+  int v, flag;\r
+  \r
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */\r
+  \r
+  flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp);\r
+  if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {\r
+    *nmsedec += t1_getnmsedec_ref(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);\r
+    v = int_abs(*dp) & one ? 1 : 0;\r
+    if (type == T1_TYPE_RAW) {  /* BYPASS/LAZY MODE */\r
+      mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag));  /* ESSAI */\r
+      mqc_bypass_enc(mqc, v);\r
+    } else {\r
+      mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag));\r
+      mqc_encode(mqc, v);\r
+    }\r
+    *fp |= T1_REFINE;\r
+  }\r
+}\r
+\r
+static void t1_dec_refpass_step(opj_t1_t *t1, int *fp, int *dp, int poshalf, int neghalf, char type, int vsc) {\r
+  int v, t, flag;\r
+  \r
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */\r
+  opj_raw_t *raw = t1->raw;  /* RAW component */\r
+  \r
+  flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp);\r
+  if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {\r
+    if (type == T1_TYPE_RAW) {\r
+      mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag));  /* ESSAI */\r
+      v = raw_decode(raw);\r
+    } else {\r
+      mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag));\r
+      v = mqc_decode(mqc);\r
+    }\r
+    t = v ? poshalf : neghalf;\r
+    *dp += *dp < 0 ? -t : t;\r
+    *fp |= T1_REFINE;\r
+  }\r
+}        /* VSC and  BYPASS by Antonin  */\r
+\r
+static void t1_enc_refpass(opj_t1_t *t1, int w, int h, int bpno, int *nmsedec, char type, int cblksty) {\r
+  int i, j, k, one, vsc;\r
+  *nmsedec = 0;\r
+  one = 1 << (bpno + T1_NMSEDEC_FRACBITS);\r
+  for (k = 0; k < h; k += 4) {\r
+    for (i = 0; i < w; i++) {\r
+      for (j = k; j < k + 4 && j < h; j++) {\r
+        vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;\r
+        t1_enc_refpass_step(t1, &t1->flags[1 + j][1 + i], &t1->data[j][i], bpno, one, nmsedec, type, vsc);\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+static void t1_dec_refpass(opj_t1_t *t1, int w, int h, int bpno, char type, int cblksty) {\r
+  int i, j, k, one, poshalf, neghalf;\r
+  int vsc;\r
+  one = 1 << bpno;\r
+  poshalf = one >> 1;\r
+  neghalf = bpno > 0 ? -poshalf : -1;\r
+  for (k = 0; k < h; k += 4) {\r
+    for (i = 0; i < w; i++) {\r
+      for (j = k; j < k + 4 && j < h; j++) {\r
+        vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;\r
+        t1_dec_refpass_step(t1, &t1->flags[1 + j][1 + i], &t1->data[j][i], poshalf, neghalf, type, vsc);\r
+      }\r
+    }\r
+  }\r
+}        /* VSC and  BYPASS by Antonin */\r
+\r
+static void t1_enc_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int bpno, int one, int *nmsedec, int partial, int vsc) {\r
+  int v, flag;\r
+  \r
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */\r
+  \r
+  flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp);\r
+  if (partial) {\r
+    goto LABEL_PARTIAL;\r
+  }\r
+  if (!(*fp & (T1_SIG | T1_VISIT))) {\r
+    mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient));\r
+    v = int_abs(*dp) & one ? 1 : 0;\r
+    mqc_encode(mqc, v);\r
+    if (v) {\r
+LABEL_PARTIAL:\r
+      *nmsedec += t1_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);\r
+      mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));\r
+      v = *dp < 0 ? 1 : 0;\r
+      mqc_encode(mqc, v ^ t1_getspb(t1, flag));\r
+      t1_updateflags(fp, v);\r
+      *fp |= T1_SIG;\r
+    }\r
+  }\r
+  *fp &= ~T1_VISIT;\r
+}\r
+\r
+static void t1_dec_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int oneplushalf, int partial, int vsc) {\r
+  int v, flag;\r
+  \r
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */\r
+  \r
+  flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp);\r
+  if (partial) {\r
+    goto LABEL_PARTIAL;\r
+  }\r
+  if (!(flag & (T1_SIG | T1_VISIT))) {\r
+    mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient));\r
+    if (mqc_decode(mqc)) {\r
+LABEL_PARTIAL:\r
+      mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));\r
+      v = mqc_decode(mqc) ^ t1_getspb(t1, flag);\r
+      *dp = v ? -oneplushalf : oneplushalf;\r
+      t1_updateflags(fp, v);\r
+      *fp |= T1_SIG;\r
+    }\r
+  }\r
+  *fp &= ~T1_VISIT;\r
+}        /* VSC and  BYPASS by Antonin */\r
+\r
+static void t1_enc_clnpass(opj_t1_t *t1, int w, int h, int bpno, int orient, int *nmsedec, int cblksty) {\r
+  int i, j, k, one, agg, runlen, vsc;\r
+  \r
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */\r
+  \r
+  *nmsedec = 0;\r
+  one = 1 << (bpno + T1_NMSEDEC_FRACBITS);\r
+  for (k = 0; k < h; k += 4) {\r
+    for (i = 0; i < w; i++) {\r
+      if (k + 3 < h) {\r
+        if (cblksty & J2K_CCP_CBLKSTY_VSC) {\r
+          agg = !(t1->flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)\r
+            || t1->flags[1 + k + 1][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)\r
+            || t1->flags[1 + k + 2][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)\r
+            || (t1->flags[1 + k + 3][1 + i] \r
+            & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW |  T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));\r
+        } else {\r
+          agg = !(t1->flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)\r
+            || t1->flags[1 + k + 1][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)\r
+            || t1->flags[1 + k + 2][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)\r
+            || t1->flags[1 + k + 3][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH));\r
+        }\r
+      } else {\r
+        agg = 0;\r
+      }\r
+      if (agg) {\r
+        for (runlen = 0; runlen < 4; runlen++) {\r
+          if (int_abs(t1->data[k + runlen][i]) & one)\r
+            break;\r
+        }\r
+        mqc_setcurctx(mqc, T1_CTXNO_AGG);\r
+        mqc_encode(mqc, runlen != 4);\r
+        if (runlen == 4) {\r
+          continue;\r
+        }\r
+        mqc_setcurctx(mqc, T1_CTXNO_UNI);\r
+        mqc_encode(mqc, runlen >> 1);\r
+        mqc_encode(mqc, runlen & 1);\r
+      } else {\r
+        runlen = 0;\r
+      }\r
+      for (j = k + runlen; j < k + 4 && j < h; j++) {\r
+        vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;\r
+        t1_enc_clnpass_step(t1, &t1->flags[1 + j][1 + i], &t1->data[j][i], orient, bpno, one, nmsedec, agg && (j == k + runlen), vsc);\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+static void t1_dec_clnpass(opj_t1_t *t1, int w, int h, int bpno, int orient, int cblksty) {\r
+  int i, j, k, one, half, oneplushalf, agg, runlen, vsc;\r
+  int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;\r
+  \r
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */\r
+  \r
+  one = 1 << bpno;\r
+  half = one >> 1;\r
+  oneplushalf = one | half;\r
+  for (k = 0; k < h; k += 4) {\r
+    for (i = 0; i < w; i++) {\r
+      if (k + 3 < h) {\r
+        if (cblksty & J2K_CCP_CBLKSTY_VSC) {\r
+          agg = !(t1->flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)\r
+            || t1->flags[1 + k + 1][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)\r
+            || t1->flags[1 + k + 2][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)\r
+            || (t1->flags[1 + k + 3][1 + i] \r
+            & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW |  T1_SGN_S))) & (T1_SIG | T1_VISIT | T1_SIG_OTH));\r
+        } else {\r
+          agg = !(t1->flags[1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)\r
+            || t1->flags[1 + k + 1][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)\r
+            || t1->flags[1 + k + 2][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)\r
+            || t1->flags[1 + k + 3][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH));\r
+        }\r
+      } else {\r
+        agg = 0;\r
+      }\r
+      if (agg) {\r
+        mqc_setcurctx(mqc, T1_CTXNO_AGG);\r
+        if (!mqc_decode(mqc)) {\r
+          continue;\r
+        }\r
+        mqc_setcurctx(mqc, T1_CTXNO_UNI);\r
+        runlen = mqc_decode(mqc);\r
+        runlen = (runlen << 1) | mqc_decode(mqc);\r
+      } else {\r
+        runlen = 0;\r
+      }\r
+      for (j = k + runlen; j < k + 4 && j < h; j++) {\r
+        vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;\r
+        t1_dec_clnpass_step(t1, &t1->flags[1 + j][1 + i], &t1->data[j][i], orient, oneplushalf, agg && (j == k + runlen), vsc);\r
+      }\r
+    }\r
+  }\r
+  if (segsym) {\r
+    int v = 0;\r
+    mqc_setcurctx(mqc, T1_CTXNO_UNI);\r
+    v = mqc_decode(mqc);\r
+    v = (v << 1) | mqc_decode(mqc);\r
+    v = (v << 1) | mqc_decode(mqc);\r
+    v = (v << 1) | mqc_decode(mqc);\r
+    /*\r
+    if (v!=0xa) {\r
+      opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);\r
+    } \r
+    */\r
+  }\r
+}        /* VSC and  BYPASS by Antonin */\r
+\r
+\r
+/** mod fixed_quality */\r
+static double t1_getwmsedec(int nmsedec, int compno, int level, int orient, int bpno, int qmfbid, double stepsize, int numcomps)  {\r
+  double w1, w2, wmsedec;\r
+  if (qmfbid == 1) {\r
+    w1 = (numcomps > 1) ? mct_getnorm(compno) : 1;\r
+    w2 = dwt_getnorm(level, orient);\r
+  } else {      /* if (qmfbid == 0) */\r
+    w1 = (numcomps > 1) ? mct_getnorm_real(compno) : 1;\r
+    w2 = dwt_getnorm_real(level, orient);\r
+  }\r
+  wmsedec = w1 * w2 * stepsize * (1 << bpno);\r
+  wmsedec *= wmsedec * nmsedec / 8192.0;\r
+  \r
+  return wmsedec;\r
+}\r
+\r
+/** mod fixed_quality */\r
+static void t1_encode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient, int compno, int level, int qmfbid, double stepsize, int cblksty, int numcomps, opj_tcd_tile_t * tile) {\r
+  int i, j;\r
+  int w, h;\r
+  int passno;\r
+  int bpno, passtype;\r
+  int max;\r
+  int nmsedec;\r
+  double cumwmsedec = 0;\r
+  char type = T1_TYPE_MQ;\r
+  \r
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */\r
+  \r
+  w = cblk->x1 - cblk->x0;\r
+  h = cblk->y1 - cblk->y0;\r
+  \r
+  max = 0;\r
+  for (j = 0; j < h; j++) {\r
+    for (i = 0; i < w; i++) {\r
+      max = int_max(max, int_abs(t1->data[j][i]));\r
+    }\r
+  }\r
+  \r
+  cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0;\r
+  \r
+  /* Changed by Dmitry Kolyadin */\r
+  for (i = 0; i <= w; i++) {\r
+    for (j = 0; j <= h; j++) {\r
+      t1->flags[j][i] = 0;\r
+    }\r
+  }\r
+  \r
+  bpno = cblk->numbps - 1;\r
+  passtype = 2;\r
+  \r
+  mqc_resetstates(mqc);\r
+  mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);\r
+  mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);\r
+  mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);\r
+  mqc_init_enc(mqc, cblk->data);\r
+  \r
+  for (passno = 0; bpno >= 0; passno++) {\r
+    opj_tcd_pass_t *pass = &cblk->passes[passno];\r
+    int correction = 3;\r
+    type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;\r
+    \r
+    switch (passtype) {\r
+      case 0:\r
+        t1_enc_sigpass(t1, w, h, bpno, orient, &nmsedec, type, cblksty);\r
+        break;\r
+      case 1:\r
+        t1_enc_refpass(t1, w, h, bpno, &nmsedec, type, cblksty);\r
+        break;\r
+      case 2:\r
+        t1_enc_clnpass(t1, w, h, bpno, orient, &nmsedec, cblksty);\r
+        /* code switch SEGMARK (i.e. SEGSYM) */\r
+        if (cblksty & J2K_CCP_CBLKSTY_SEGSYM)\r
+          mqc_segmark_enc(mqc);\r
+        break;\r
+    }\r
+    \r
+    /* fixed_quality */\r
+    cumwmsedec += t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps);\r
+    tile->distotile += t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps);\r
+    \r
+    /* Code switch "RESTART" (i.e. TERMALL) */\r
+    if ((cblksty & J2K_CCP_CBLKSTY_TERMALL)  && !((passtype == 2) && (bpno - 1 < 0))) {\r
+      if (type == T1_TYPE_RAW) {\r
+        mqc_flush(mqc);\r
+        correction = 1;\r
+        /* correction = mqc_bypass_flush_enc(); */\r
+      } else {      /* correction = mqc_restart_enc(); */\r
+        mqc_flush(mqc);\r
+        correction = 1;\r
+      }\r
+      pass->term = 1;\r
+    } else {\r
+      if (((bpno < (cblk->numbps - 4) && (passtype > 0)) \r
+        || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) {\r
+        if (type == T1_TYPE_RAW) {\r
+          mqc_flush(mqc);\r
+          correction = 1;\r
+          /* correction = mqc_bypass_flush_enc(); */\r
+        } else {    /* correction = mqc_restart_enc(); */\r
+          mqc_flush(mqc);\r
+          correction = 1;\r
+        }\r
+        pass->term = 1;\r
+      } else {\r
+        pass->term = 0;\r
+      }\r
+    }\r
+    \r
+    if (++passtype == 3) {\r
+      passtype = 0;\r
+      bpno--;\r
+    }\r
+    \r
+    if (pass->term && bpno > 0) {\r
+      type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;\r
+      if (type == T1_TYPE_RAW)\r
+        mqc_bypass_init_enc(mqc);\r
+      else\r
+        mqc_restart_init_enc(mqc);\r
+    }\r
+    \r
+    pass->distortiondec = cumwmsedec;\r
+    pass->rate = mqc_numbytes(mqc) + correction;  /* FIXME */\r
+    pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);\r
+    \r
+    /* Code-switch "RESET" */\r
+    if (cblksty & J2K_CCP_CBLKSTY_RESET)\r
+      mqc_reset_enc(mqc);\r
+  }\r
+  \r
+  /* Code switch "ERTERM" (i.e. PTERM) */\r
+  if (cblksty & J2K_CCP_CBLKSTY_PTERM)\r
+    mqc_erterm_enc(mqc);\r
+  else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY))\r
+    mqc_flush(mqc);\r
+  \r
+  cblk->totalpasses = passno;\r
+}\r
+\r
+static void t1_decode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient, int roishift, int cblksty) {\r
+  int i, j, w, h;\r
+  int bpno, passtype;\r
+  int segno, passno;\r
+  char type = T1_TYPE_MQ; /* BYPASS mode */\r
+  \r
+  opj_raw_t *raw = t1->raw;  /* RAW component */\r
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */\r
+  \r
+  w = cblk->x1 - cblk->x0;\r
+  h = cblk->y1 - cblk->y0;\r
+  \r
+  /* Changed by Dmitry Kolyadin */\r
+  for (j = 0; j <= h; j++) {\r
+    for (i = 0; i <= w; i++) {\r
+      t1->flags[j][i] = 0;\r
+    }\r
+  }\r
+  \r
+  /* Changed by Dmitry Kolyadin */\r
+  for (i = 0; i < w; i++) {\r
+    for (j = 0; j < h; j++){\r
+      t1->data[j][i] = 0;\r
+    }\r
+  }\r
+  \r
+  bpno = roishift + cblk->numbps - 1;\r
+  passtype = 2;\r
+  \r
+  mqc_resetstates(mqc);\r
+  mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);\r
+  mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);\r
+  mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);\r
+  \r
+  for (segno = 0; segno < cblk->numsegs; segno++) {\r
+    opj_tcd_seg_t *seg = &cblk->segs[segno];\r
+    \r
+    /* BYPASS mode */\r
+    type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;\r
+    if (type == T1_TYPE_RAW) {\r
+      raw_init_dec(raw, seg->data, seg->len);\r
+    } else {\r
+      mqc_init_dec(mqc, seg->data, seg->len);\r
+    }\r
+    \r
+    for (passno = 0; passno < seg->numpasses; passno++) {\r
+      switch (passtype) {\r
+        case 0:\r
+          t1_dec_sigpass(t1, w, h, bpno+1, orient, type, cblksty);\r
+          break;\r
+        case 1:\r
+          t1_dec_refpass(t1, w, h, bpno+1, type, cblksty);\r
+          break;\r
+        case 2:\r
+          t1_dec_clnpass(t1, w, h, bpno+1, orient, cblksty);\r
+          break;\r
+      }\r
+      \r
+      if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {\r
+        mqc_resetstates(mqc);\r
+        mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);        \r
+        mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);\r
+        mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);\r
+      }\r
+      if (++passtype == 3) {\r
+        passtype = 0;\r
+        bpno--;\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+static int t1_init_ctxno_zc(int f, int orient) {\r
+  int h, v, d, n, t, hv;\r
+  n = 0;\r
+  h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0);\r
+  v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0);\r
+  d = ((f & T1_SIG_NW) != 0) + ((f & T1_SIG_NE) != 0) + ((f & T1_SIG_SE) != 0) + ((f & T1_SIG_SW) != 0);\r
+  \r
+  switch (orient) {\r
+    case 2:\r
+      t = h;\r
+      h = v;\r
+      v = t;\r
+    case 0:\r
+    case 1:\r
+      if (!h) {\r
+        if (!v) {\r
+          if (!d)\r
+            n = 0;\r
+          else if (d == 1)\r
+            n = 1;\r
+          else\r
+            n = 2;\r
+        } else if (v == 1) {\r
+          n = 3;\r
+        } else {\r
+          n = 4;\r
+        }\r
+      } else if (h == 1) {\r
+        if (!v) {\r
+          if (!d)\r
+            n = 5;\r
+          else\r
+            n = 6;\r
+        } else {\r
+          n = 7;\r
+        }\r
+      } else\r
+        n = 8;\r
+      break;\r
+    case 3:\r
+      hv = h + v;\r
+      if (!d) {\r
+        if (!hv) {\r
+          n = 0;\r
+        } else if (hv == 1) {\r
+          n = 1;\r
+        } else {\r
+          n = 2;\r
+        }\r
+      } else if (d == 1) {\r
+        if (!hv) {\r
+          n = 3;\r
+        } else if (hv == 1) {\r
+          n = 4;\r
+        } else {\r
+          n = 5;\r
+        }\r
+      } else if (d == 2) {\r
+        if (!hv) {\r
+          n = 6;\r
+        } else {\r
+          n = 7;\r
+        }\r
+      } else {\r
+        n = 8;\r
+      }\r
+      break;\r
+  }\r
+  \r
+  return (T1_CTXNO_ZC + n);\r
+}\r
+\r
+static int t1_init_ctxno_sc(int f) {\r
+  int hc, vc, n;\r
+  n = 0;\r
+\r
+  hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) ==\r
+    T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),\r
+         1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) ==\r
+       (T1_SIG_E | T1_SGN_E)) +\r
+       ((f & (T1_SIG_W | T1_SGN_W)) ==\r
+       (T1_SIG_W | T1_SGN_W)), 1);\r
+  \r
+  vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) ==\r
+    T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),\r
+         1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) ==\r
+       (T1_SIG_N | T1_SGN_N)) +\r
+       ((f & (T1_SIG_S | T1_SGN_S)) ==\r
+       (T1_SIG_S | T1_SGN_S)), 1);\r
+  \r
+  if (hc < 0) {\r
+    hc = -hc;\r
+    vc = -vc;\r
+  }\r
+  if (!hc) {\r
+    if (vc == -1)\r
+      n = 1;\r
+    else if (!vc)\r
+      n = 0;\r
+    else\r
+      n = 1;\r
+  } else if (hc == 1) {\r
+    if (vc == -1)\r
+      n = 2;\r
+    else if (!vc)\r
+      n = 3;\r
+    else\r
+      n = 4;\r
+  }\r
+  \r
+  return (T1_CTXNO_SC + n);\r
+}\r
+\r
+static int t1_init_ctxno_mag(int f) {\r
+  int n;\r
+  if (!(f & T1_REFINE))\r
+    n = (f & (T1_SIG_OTH)) ? 1 : 0;\r
+  else\r
+    n = 2;\r
+  \r
+  return (T1_CTXNO_MAG + n);\r
+}\r
+\r
+static int t1_init_spb(int f) {\r
+  int hc, vc, n;\r
+  \r
+  hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) ==\r
+    T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),\r
+         1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) ==\r
+       (T1_SIG_E | T1_SGN_E)) +\r
+       ((f & (T1_SIG_W | T1_SGN_W)) ==\r
+       (T1_SIG_W | T1_SGN_W)), 1);\r
+  \r
+  vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) ==\r
+    T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),\r
+         1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) ==\r
+       (T1_SIG_N | T1_SGN_N)) +\r
+       ((f & (T1_SIG_S | T1_SGN_S)) ==\r
+       (T1_SIG_S | T1_SGN_S)), 1);\r
+  \r
+  if (!hc && !vc)\r
+    n = 0;\r
+  else\r
+    n = (!(hc > 0 || (!hc && vc > 0)));\r
+  \r
+  return n;\r
+}\r
+\r
+static void t1_init_luts(opj_t1_t *t1) {\r
+  int i, j;\r
+  double u, v, t;\r
+  for (j = 0; j < 4; j++) {\r
+    for (i = 0; i < 256; ++i) {\r
+      t1->lut_ctxno_zc[(j << 8) | i] = t1_init_ctxno_zc(i, j);\r
+    }\r
+  }\r
+  for (i = 0; i < 256; i++) {\r
+    t1->lut_ctxno_sc[i] = t1_init_ctxno_sc(i << 4);\r
+  }\r
+  for (j = 0; j < 2; j++) {\r
+    for (i = 0; i < 2048; ++i) {\r
+      t1->lut_ctxno_mag[(j << 11) + i] = t1_init_ctxno_mag((j ? T1_REFINE : 0) | i);\r
+    }\r
+  }\r
+  for (i = 0; i < 256; ++i) {\r
+    t1->lut_spb[i] = t1_init_spb(i << 4);\r
+  }\r
+  /* FIXME FIXME FIXME */\r
+  /* fprintf(stdout,"nmsedec luts:\n"); */\r
+  for (i = 0; i < (1 << T1_NMSEDEC_BITS); i++) {\r
+    t = i / pow(2, T1_NMSEDEC_FRACBITS);\r
+    u = t;\r
+    v = t - 1.5;\r
+    t1->lut_nmsedec_sig[i] = \r
+      int_max(0, \r
+      (int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));\r
+    t1->lut_nmsedec_sig0[i] =\r
+      int_max(0,\r
+      (int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));\r
+    u = t - 1.0;\r
+    if (i & (1 << (T1_NMSEDEC_BITS - 1))) {\r
+      v = t - 1.5;\r
+    } else {\r
+      v = t - 0.5;\r
+    }\r
+    t1->lut_nmsedec_ref[i] =\r
+      int_max(0,\r
+      (int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));\r
+    t1->lut_nmsedec_ref0[i] =\r
+      int_max(0,\r
+      (int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));\r
+  }\r
+}\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+opj_t1_t* t1_create(opj_common_ptr cinfo) {\r
+  opj_t1_t *t1 = (opj_t1_t*)opj_malloc(sizeof(opj_t1_t));\r
+  if(t1) {\r
+    t1->cinfo = cinfo;\r
+    /* create MQC and RAW handles */\r
+    t1->mqc = mqc_create();\r
+    t1->raw = raw_create();\r
+    /* initialize the look-up tables of the Tier-1 coder/decoder */\r
+    t1_init_luts(t1);\r
+  }\r
+  return t1;\r
+}\r
+\r
+void t1_destroy(opj_t1_t *t1) {\r
+  if(t1) {\r
+    /* destroy MQC and RAW handles */\r
+    mqc_destroy(t1->mqc);\r
+    raw_destroy(t1->raw);\r
+    opj_free(t1);\r
+  }\r
+}\r
+\r
+void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp) {\r
+  int compno, resno, bandno, precno, cblkno;\r
+  int x, y, i, j, orient;\r
+  \r
+  tile->distotile = 0;    /* fixed_quality */\r
+\r
+  for (compno = 0; compno < tile->numcomps; compno++) {\r
+    opj_tcd_tilecomp_t *tilec = &tile->comps[compno];\r
+\r
+    for (resno = 0; resno < tilec->numresolutions; resno++) {\r
+      opj_tcd_resolution_t *res = &tilec->resolutions[resno];\r
+\r
+      for (bandno = 0; bandno < res->numbands; bandno++) {\r
+        opj_tcd_band_t *band = &res->bands[bandno];\r
+\r
+        for (precno = 0; precno < res->pw * res->ph; precno++) {\r
+          opj_tcd_precinct_t *prc = &band->precincts[precno];\r
+\r
+          for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {\r
+            opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];\r
+\r
+            if (band->bandno == 0) {\r
+              x = cblk->x0 - band->x0;\r
+              y = cblk->y0 - band->y0;\r
+            } else if (band->bandno == 1) {\r
+              opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
+              x = pres->x1 - pres->x0 + cblk->x0 - band->x0;\r
+              y = cblk->y0 - band->y0;\r
+            } else if (band->bandno == 2) {\r
+              opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
+              x = cblk->x0 - band->x0;\r
+              y = pres->y1 - pres->y0 + cblk->y0 - band->y0;\r
+            } else {    /* if (band->bandno == 3) */\r
+              opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
+              x = pres->x1 - pres->x0 + cblk->x0 - band->x0;\r
+              y = pres->y1 - pres->y0 + cblk->y0 - band->y0;\r
+            }\r
+            \r
+            if (tcp->tccps[compno].qmfbid == 1) {\r
+              for (j = 0; j < cblk->y1 - cblk->y0; j++) {\r
+                for (i = 0; i < cblk->x1 - cblk->x0; i++) {\r
+                  t1->data[j][i] = \r
+                    tilec->data[(x + i) + (y + j) * (tilec->x1 - tilec->x0)] << T1_NMSEDEC_FRACBITS;\r
+                }\r
+              }\r
+            } else if (tcp->tccps[compno].qmfbid == 0) {\r
+              for (j = 0; j < cblk->y1 - cblk->y0; j++) {\r
+                for (i = 0; i < cblk->x1 - cblk->x0; i++) {\r
+                  t1->data[j][i] = \r
+                    fix_mul(\r
+                    tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)], \r
+                    8192 * 8192 / ((int) floor(band->stepsize * 8192))) >> (13 - T1_NMSEDEC_FRACBITS);\r
+                }\r
+              }\r
+            }\r
+            orient = band->bandno;  /* FIXME */\r
+            if (orient == 2) {\r
+              orient = 1;\r
+            } else if (orient == 1) {\r
+              orient = 2;\r
+            }\r
+\r
+            t1_encode_cblk(t1, cblk, orient, compno, tilec->numresolutions - 1 - resno, tcp->tccps[compno].qmfbid, band->stepsize, tcp->tccps[compno].cblksty, tile->numcomps, tile);\r
+\r
+          } /* cblkno */\r
+        } /* precno */\r
+      } /* bandno */\r
+    } /* resno  */\r
+  } /* compno  */\r
+}\r
+\r
+void t1_decode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp) {\r
+  int compno, resno, bandno, precno, cblkno;\r
+  \r
+  for (compno = 0; compno < tile->numcomps; compno++) {\r
+    opj_tcd_tilecomp_t *tilec = &tile->comps[compno];\r
+\r
+    for (resno = 0; resno < tilec->numresolutions; resno++) {\r
+      opj_tcd_resolution_t *res = &tilec->resolutions[resno];\r
+\r
+      for (bandno = 0; bandno < res->numbands; bandno++) {\r
+        opj_tcd_band_t *band = &res->bands[bandno];\r
+\r
+        for (precno = 0; precno < res->pw * res->ph; precno++) {\r
+          opj_tcd_precinct_t *prc = &band->precincts[precno];\r
+\r
+          for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {\r
+            int x, y, i, j, orient;\r
+            opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];\r
+\r
+            orient = band->bandno;  /* FIXME */\r
+            if (orient == 2) {\r
+              orient = 1;\r
+            } else if (orient == 1) {\r
+              orient = 2;\r
+            }\r
+            \r
+            t1_decode_cblk(t1, cblk, orient, tcp->tccps[compno].roishift, tcp->tccps[compno].cblksty);\r
+\r
+            if (band->bandno == 0) {\r
+              x = cblk->x0 - band->x0;\r
+              y = cblk->y0 - band->y0;\r
+            } else if (band->bandno == 1) {\r
+              opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
+              x = pres->x1 - pres->x0 + cblk->x0 - band->x0;\r
+              y = cblk->y0 - band->y0;\r
+            } else if (band->bandno == 2) {\r
+              opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
+              x = cblk->x0 - band->x0;\r
+              y = pres->y1 - pres->y0 + cblk->y0 - band->y0;\r
+            } else {    /* if (band->bandno == 3) */\r
+              opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];\r
+              x = pres->x1 - pres->x0 + cblk->x0 - band->x0;\r
+              y = pres->y1 - pres->y0 + cblk->y0 - band->y0;\r
+            }\r
+            \r
+            if (tcp->tccps[compno].roishift) {\r
+              int thresh, val, mag;\r
+              thresh = 1 << tcp->tccps[compno].roishift;\r
+              for (j = 0; j < cblk->y1 - cblk->y0; j++) {\r
+                for (i = 0; i < cblk->x1 - cblk->x0; i++) {\r
+                  val = t1->data[j][i];\r
+                  mag = int_abs(val);\r
+                  if (mag >= thresh) {\r
+                    mag >>= tcp->tccps[compno].roishift;\r
+                    t1->data[j][i] = val < 0 ? -mag : mag;\r
+                  }\r
+                }\r
+              }\r
+            }\r
+            \r
+            if (tcp->tccps[compno].qmfbid == 1) {\r
+              for (j = 0; j < cblk->y1 - cblk->y0; j++) {\r
+                for (i = 0; i < cblk->x1 - cblk->x0; i++) {\r
+                  int tmp = t1->data[j][i];\r
+                  if(tmp >> 1 == 0) {\r
+                    tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)] = 0;\r
+                  } else {\r
+                    tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)] = tmp<0?(tmp>>1)+1:(tmp>>1);\r
+                  }\r
+                }\r
+              }\r
+            } else {    /* if (tcp->tccps[compno].qmfbid == 0) */\r
+              for (j = 0; j < cblk->y1 - cblk->y0; j++) {\r
+                for (i = 0; i < cblk->x1 - cblk->x0; i++) {\r
+                  double tmp = (double)(t1->data[j][i] * band->stepsize * 4096.0);\r
+                  if (t1->data[j][i] >> 1 == 0) {\r
+                    tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)] = 0;\r
+                  } else {\r
+                    int tmp2 = ((int) (floor(fabs(tmp)))) + ((int) floor(fabs(tmp*2))%2);\r
+                    tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)] = ((tmp<0)?-tmp2:tmp2);\r
+                  }\r
+                }\r
+              }\r
+            }\r
+          } /* cblkno */\r
+        } /* precno */\r
+      } /* bandno */\r
+    } /* resno */\r
+  } /* compno */\r
+}\r
+\r
index 5e98bc093ad0a8b2ef51c9ce86e5e499b38986af..9cf8f04e67c94f11112e7d97a5cb27554b9bf81b 100644 (file)
-/*
- * 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
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#ifndef __T1_H\r
+#define __T1_H\r
+/**\r
+@file t1.h\r
+@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1)\r
+\r
+The functions in T1.C have for goal to realize the tier-1 coding operation. The functions\r
+in T1.C are used by some function in TCD.C.\r
+*/\r
+\r
+/** @defgroup T1 T1 - Implementation of the tier-1 coding */\r
+/*@{*/\r
+\r
+/* ----------------------------------------------------------------------- */\r
+#define T1_NMSEDEC_BITS 7\r
+\r
+#define T1_MAXCBLKW 1024  /**< Maximum size of code-block (width) */\r
+#define T1_MAXCBLKH 1024  /**< Maximum size of code-block (heigth) */\r
+\r
+#define T1_SIG_NE 0x0001  /**< Context orientation : North-East direction */\r
+#define T1_SIG_SE 0x0002  /**< Context orientation : South-East direction */\r
+#define T1_SIG_SW 0x0004  /**< Context orientation : South-West direction */\r
+#define T1_SIG_NW 0x0008  /**< Context orientation : North-West direction */\r
+#define T1_SIG_N 0x0010    /**< Context orientation : North direction */\r
+#define T1_SIG_E 0x0020    /**< Context orientation : East direction */\r
+#define T1_SIG_S 0x0040    /**< Context orientation : South direction */\r
+#define T1_SIG_W 0x0080    /**< Context orientation : West direction */\r
+#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)\r
+#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)\r
+\r
+#define T1_SGN_N 0x0100\r
+#define T1_SGN_E 0x0200\r
+#define T1_SGN_S 0x0400\r
+#define T1_SGN_W 0x0800\r
+#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)\r
+\r
+#define T1_SIG 0x1000\r
+#define T1_REFINE 0x2000\r
+#define T1_VISIT 0x4000\r
+\r
+#define T1_NUMCTXS_AGG 1\r
+#define T1_NUMCTXS_ZC 9\r
+#define T1_NUMCTXS_MAG 3\r
+#define T1_NUMCTXS_SC 5\r
+#define T1_NUMCTXS_UNI 1\r
+\r
+#define T1_CTXNO_AGG 0\r
+#define T1_CTXNO_ZC (T1_CTXNO_AGG+T1_NUMCTXS_AGG)\r
+#define T1_CTXNO_MAG (T1_CTXNO_ZC+T1_NUMCTXS_ZC)\r
+#define T1_CTXNO_SC (T1_CTXNO_MAG+T1_NUMCTXS_MAG)\r
+#define T1_CTXNO_UNI (T1_CTXNO_SC+T1_NUMCTXS_SC)\r
+#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)\r
+\r
+#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)\r
+\r
+#define T1_TYPE_MQ 0  /**< Normal coding using entropy coder */\r
+#define T1_TYPE_RAW 1  /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+/**\r
+Tier-1 coding (coding of code-block coefficients)\r
+*/\r
+typedef struct opj_t1 {\r
+  /** codec context */\r
+  opj_common_ptr cinfo;\r
+\r
+  /** MQC component */\r
+  opj_mqc_t *mqc;\r
+  /** RAW component */\r
+  opj_raw_t *raw;\r
+\r
+  int lut_ctxno_zc[1024];\r
+  int lut_ctxno_sc[256];\r
+  int lut_ctxno_mag[4096];\r
+  int lut_spb[256];\r
+  int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS];\r
+  int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS];\r
+  int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS];\r
+  int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS];\r
+\r
+  int data[T1_MAXCBLKH][T1_MAXCBLKW];\r
+  int flags[T1_MAXCBLKH + 2][T1_MAXCBLKH + 2];\r
+\r
+} opj_t1_t;\r
+\r
+/** @name Exported functions */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+/**\r
+Create a new T1 handle \r
+and initialize the look-up tables of the Tier-1 coder/decoder\r
+@return Returns a new T1 handle if successful, returns NULL otherwise\r
+@see t1_init_luts\r
+*/\r
+opj_t1_t* t1_create(opj_common_ptr cinfo);\r
+/**\r
+Destroy a previously created T1 handle\r
+@param t1 T1 handle to destroy\r
+*/\r
+void t1_destroy(opj_t1_t *t1);\r
+/**\r
+Encode the code-blocks of a tile\r
+@param t1 T1 handle\r
+@param tile The tile to encode\r
+@param tcp Tile coding parameters\r
+*/\r
+void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);\r
+/**\r
+Decode the code-blocks of a tile\r
+@param t1 T1 handle\r
+@param tile The tile to decode\r
+@param tcp Tile coding parameters\r
+*/\r
+void t1_decode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __T1_H */\r
index 6bab17f86e9a94c030f24cebc4deb90432500ec7..368acda2e603297ee534103eb5c4685eb583147e 100644 (file)
-/*
- * 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)) {
-
-      fprintf(stderr,"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)) {
-      fprintf(stderr,"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])) {
-      
-      if ((cp->layer==0) || (cp->layer>=((pi[pino].layno)+1))) {
-   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);
-      } else {
-   e = 0;
-      }
-      
-      /* 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;
-}
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+/** @defgroup T2 T2 - Implementation of a tier-2 coding */\r
+/*@{*/\r
+\r
+/** @name Local static functions */\r
+/*@{*/\r
+\r
+static void t2_putcommacode(opj_bio_t *bio, int n);\r
+static int t2_getcommacode(opj_bio_t *bio);\r
+/**\r
+Variable length code for signalling delta Zil (truncation point)\r
+@param bio Bit Input/Output component\r
+@param n delta Zil\r
+*/\r
+static void t2_putnumpasses(opj_bio_t *bio, int n);\r
+static int t2_getnumpasses(opj_bio_t *bio);\r
+/**\r
+Encode a packet of a tile to a destination buffer\r
+@param tile Tile for which to write the packets\r
+@param tcp Tile coding parameters\r
+@param pi Packet identity\r
+@param dest Destination buffer\r
+@param len Length of the destination buffer\r
+@param image_info Structure to create an index file\r
+@param tileno Number of the tile encoded\r
+@return \r
+*/\r
+static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi, unsigned char *dest, int len, opj_image_info_t *image_info, int tileno);\r
+/**\r
+@param seg\r
+@param cblksty\r
+@param first\r
+*/\r
+static void t2_init_seg(opj_tcd_seg_t *seg, int cblksty, int first);\r
+/**\r
+Decode a packet of a tile from a source buffer\r
+@param t2 T2 handle\r
+@param src Source buffer\r
+@param len Length of the source buffer\r
+@param tile Tile for which to write the packets\r
+@param tcp Tile coding parameters\r
+@param pi Packet identity\r
+@return \r
+*/\r
+int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi);\r
+\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+/* #define RESTART 0x04 */\r
+\r
+static void t2_putcommacode(opj_bio_t *bio, int n) {\r
+  while (--n >= 0) {\r
+    bio_write(bio, 1, 1);\r
+  }\r
+  bio_write(bio, 0, 1);\r
+}\r
+\r
+static int t2_getcommacode(opj_bio_t *bio) {\r
+  int n;\r
+  for (n = 0; bio_read(bio, 1); n++) {\r
+    ;\r
+  }\r
+  return n;\r
+}\r
+\r
+static void t2_putnumpasses(opj_bio_t *bio, int n) {\r
+  if (n == 1) {\r
+    bio_write(bio, 0, 1);\r
+  } else if (n == 2) {\r
+    bio_write(bio, 2, 2);\r
+  } else if (n <= 5) {\r
+    bio_write(bio, 0xc | (n - 3), 4);\r
+  } else if (n <= 36) {\r
+    bio_write(bio, 0x1e0 | (n - 6), 9);\r
+  } else if (n <= 164) {\r
+    bio_write(bio, 0xff80 | (n - 37), 16);\r
+  }\r
+}\r
+\r
+static int t2_getnumpasses(opj_bio_t *bio) {\r
+  int n;\r
+  if (!bio_read(bio, 1))\r
+    return 1;\r
+  if (!bio_read(bio, 1))\r
+    return 2;\r
+  if ((n = bio_read(bio, 2)) != 3)\r
+    return (3 + n);\r
+  if ((n = bio_read(bio, 5)) != 31)\r
+    return (6 + n);\r
+  return (37 + bio_read(bio, 7));\r
+}\r
+\r
+static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_iterator_t *pi, unsigned char *dest, int len, opj_image_info_t * image_info, int tileno) {\r
+  int bandno, cblkno;\r
+  unsigned char *sop = 0, *eph = 0;\r
+  unsigned char *c = dest;\r
+\r
+  int compno = pi->compno;  /* component value */\r
+  int resno  = pi->resno;    /* resolution level value */\r
+  int precno = pi->precno;  /* precinct value */\r
+  int layno  = pi->layno;    /* quality layer value */\r
+\r
+  opj_tcd_tilecomp_t *tilec = &tile->comps[compno];\r
+  opj_tcd_resolution_t *res = &tilec->resolutions[resno];\r
+  \r
+  opj_bio_t *bio = NULL;  /* BIO component */\r
+  \r
+  /* <SOP 0xff91> */\r
+  if (tcp->csty & J2K_CP_CSTY_SOP) {\r
+    sop = (unsigned char *) opj_malloc(6 * sizeof(unsigned char));\r
+    sop[0] = 255;\r
+    sop[1] = 145;\r
+    sop[2] = 0;\r
+    sop[3] = 4;\r
+    sop[4] = (image_info->num % 65536) / 256;\r
+    sop[5] = (image_info->num % 65536) % 256;\r
+    memcpy(c, sop, 6);\r
+    opj_free(sop);\r
+    c += 6;\r
+  }\r
+  /* </SOP> */\r
+  \r
+  if (!layno) {\r
+    for (bandno = 0; bandno < res->numbands; bandno++) {\r
+      opj_tcd_band_t *band = &res->bands[bandno];\r
+      opj_tcd_precinct_t *prc = &band->precincts[precno];\r
+      tgt_reset(prc->incltree);\r
+      tgt_reset(prc->imsbtree);\r
+      for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {\r
+        opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];\r
+        cblk->numpasses = 0;\r
+        tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps);\r
+      }\r
+    }\r
+  }\r
+  \r
+  bio = bio_create();\r
+  bio_init_enc(bio, c, len);\r
+  bio_write(bio, 1, 1);    /* Empty header bit */\r
+  \r
+  /* Writing Packet header */\r
+  for (bandno = 0; bandno < res->numbands; bandno++) {\r
+    opj_tcd_band_t *band = &res->bands[bandno];\r
+    opj_tcd_precinct_t *prc = &band->precincts[precno];\r
+    for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {\r
+      opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];\r
+      opj_tcd_layer_t *layer = &cblk->layers[layno];\r
+      if (!cblk->numpasses && layer->numpasses) {\r
+        tgt_setvalue(prc->incltree, cblkno, layno);\r
+      }\r
+    }\r
+    for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {\r
+      opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];\r
+      opj_tcd_layer_t *layer = &cblk->layers[layno];\r
+      int increment = 0;\r
+      int nump = 0;\r
+      int len = 0, passno;\r
+      /* cblk inclusion bits */\r
+      if (!cblk->numpasses) {\r
+        tgt_encode(bio, prc->incltree, cblkno, layno + 1);\r
+      } else {\r
+        bio_write(bio, layer->numpasses != 0, 1);\r
+      }\r
+      /* if cblk not included, go to the next cblk  */\r
+      if (!layer->numpasses) {\r
+        continue;\r
+      }\r
+      /* if first instance of cblk --> zero bit-planes information */\r
+      if (!cblk->numpasses) {\r
+        cblk->numlenbits = 3;\r
+        tgt_encode(bio, prc->imsbtree, cblkno, 999);\r
+      }\r
+      /* number of coding passes included */\r
+      t2_putnumpasses(bio, layer->numpasses);\r
+      \r
+      /* computation of the increase of the length indicator and insertion in the header     */\r
+      for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) {\r
+        opj_tcd_pass_t *pass = &cblk->passes[passno];\r
+        nump++;\r
+        len += pass->len;\r
+        if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {\r
+          increment = int_max(increment, int_floorlog2(len) + 1 - (cblk->numlenbits + int_floorlog2(nump)));\r
+          len = 0;\r
+          nump = 0;\r
+        }\r
+      }\r
+      t2_putcommacode(bio, increment);\r
+\r
+      /* computation of the new Length indicator */\r
+      cblk->numlenbits += increment;\r
+\r
+      /* insertion of the codeword segment length */\r
+      for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses; passno++) {\r
+        opj_tcd_pass_t *pass = &cblk->passes[passno];\r
+        nump++;\r
+        len += pass->len;\r
+        if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {\r
+          bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump));\r
+          len = 0;\r
+          nump = 0;\r
+        }\r
+      }\r
+    }\r
+  }\r
+  \r
+  if (bio_flush(bio)) {\r
+    return -999;    /* modified to eliminate longjmp !! */\r
+  }\r
+  \r
+  c += bio_numbytes(bio);\r
+\r
+  bio_destroy(bio);\r
+  \r
+  /* <EPH 0xff92> */\r
+  if (tcp->csty & J2K_CP_CSTY_EPH) {\r
+    eph = (unsigned char *) opj_malloc(2 * sizeof(unsigned char));\r
+    eph[0] = 255;\r
+    eph[1] = 146;\r
+    memcpy(c, eph, 2);\r
+    opj_free(eph);\r
+    c += 2;\r
+  }\r
+  /* </EPH> */\r
+  \r
+  /* Writing the packet body */\r
+  \r
+  for (bandno = 0; bandno < res->numbands; bandno++) {\r
+    opj_tcd_band_t *band = &res->bands[bandno];\r
+    opj_tcd_precinct_t *prc = &band->precincts[precno];\r
+    for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {\r
+      opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];\r
+      opj_tcd_layer_t *layer = &cblk->layers[layno];\r
+      if (!layer->numpasses) {\r
+        continue;\r
+      }\r
+      if (c + layer->len > dest + len) {\r
+        return -999;\r
+      }\r
+      \r
+      memcpy(c, layer->data, layer->len);\r
+      cblk->numpasses += layer->numpasses;\r
+      c += layer->len;\r
+      /* ADD for index Cfr. Marcela --> delta disto by packet */\r
+      if(image_info && image_info->index_write && image_info->index_on) {\r
+        opj_tile_info_t *info_TL = &image_info->tile[tileno];\r
+        opj_packet_info_t *info_PK = &info_TL->packet[image_info->num];\r
+        info_PK->disto += layer->disto;\r
+        if (image_info->D_max < info_PK->disto) {\r
+          image_info->D_max = info_PK->disto;\r
+        }\r
+      }\r
+      /* </ADD> */\r
+    }\r
+  }\r
+  \r
+  return (c - dest);\r
+}\r
+\r
+static void t2_init_seg(opj_tcd_seg_t * seg, int cblksty, int first) {\r
+  seg->numpasses = 0;\r
+  seg->len = 0;\r
+  if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {\r
+    seg->maxpasses = 1;\r
+  }\r
+  else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {\r
+    if (first) {\r
+      seg->maxpasses = 10;\r
+    } else {\r
+      seg->maxpasses = (((seg - 1)->maxpasses == 1) || ((seg - 1)->maxpasses == 10)) ? 2 : 1;\r
+    }\r
+  } else {\r
+    seg->maxpasses = 109;\r
+  }\r
+}\r
+\r
+int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi) {\r
+  int bandno, cblkno;\r
+  unsigned char *c = src;\r
+\r
+  opj_cp_t *cp = t2->cp;\r
+\r
+  int compno = pi->compno;  /* component value */\r
+  int resno  = pi->resno;    /* resolution level value */\r
+  int precno = pi->precno;  /* precinct value */\r
+  int layno  = pi->layno;    /* quality layer value */\r
+\r
+  opj_tcd_tilecomp_t *tilec = &tile->comps[compno];\r
+  opj_tcd_resolution_t *res = &tilec->resolutions[resno];\r
+  \r
+  unsigned char *hd = NULL;\r
+  int present;\r
+  \r
+  opj_bio_t *bio = NULL;  /* BIO component */\r
+  \r
+  if (layno == 0) {\r
+    for (bandno = 0; bandno < res->numbands; bandno++) {\r
+      opj_tcd_band_t *band = &res->bands[bandno];\r
+      opj_tcd_precinct_t *prc = &band->precincts[precno];\r
+      \r
+      if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;\r
+      \r
+      tgt_reset(prc->incltree);\r
+      tgt_reset(prc->imsbtree);\r
+      for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {\r
+        opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];\r
+        cblk->numsegs = 0;\r
+      }\r
+    }\r
+  }\r
+  \r
+  /* SOP markers */\r
+  \r
+  if (tcp->csty & J2K_CP_CSTY_SOP) {\r
+    if ((*c) != 0xff || (*(c + 1) != 0x91)) {\r
+      opj_event_msg(t2->cinfo, EVT_WARNING, "Expected SOP marker\n");\r
+    } else {\r
+      c += 6;\r
+    }\r
+    \r
+    /** TODO : check the Nsop value */\r
+  }\r
+  \r
+  /* \r
+  When the marker PPT/PPM is used the packet header are store in PPT/PPM marker\r
+  This part deal with this caracteristic\r
+  step 1: Read packet header in the saved structure\r
+  step 2: Return to codestream for decoding \r
+  */\r
+\r
+  bio = bio_create();\r
+  \r
+  if (cp->ppm == 1) {    /* PPM */\r
+    hd = cp->ppm_data;\r
+    bio_init_dec(bio, hd, cp->ppm_len);\r
+  } else if (tcp->ppt == 1) {  /* PPT */\r
+    hd = tcp->ppt_data;\r
+    bio_init_dec(bio, hd, tcp->ppt_len);\r
+  } else {      /* Normal Case */\r
+    hd = c;\r
+    bio_init_dec(bio, hd, src+len-hd);\r
+  }\r
+  \r
+  present = bio_read(bio, 1);\r
+  \r
+  if (!present) {\r
+    bio_inalign(bio);\r
+    hd += bio_numbytes(bio);\r
+    bio_destroy(bio);\r
+    \r
+    /* EPH markers */\r
+    \r
+    if (tcp->csty & J2K_CP_CSTY_EPH) {\r
+      if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {\r
+        printf("Error : expected EPH marker\n");\r
+      } else {\r
+        hd += 2;\r
+      }\r
+    }\r
+    \r
+    if (cp->ppm == 1) {    /* PPM case */\r
+      cp->ppm_len += cp->ppm_data-hd;\r
+      cp->ppm_data = hd;\r
+      return (c - src);\r
+    }\r
+    if (tcp->ppt == 1) {  /* PPT case */\r
+      tcp->ppt_len+=tcp->ppt_data-hd;\r
+      tcp->ppt_data = hd;\r
+      return (c - src);\r
+    }\r
+    \r
+    return (hd - src);\r
+  }\r
+  \r
+  for (bandno = 0; bandno < res->numbands; bandno++) {\r
+    opj_tcd_band_t *band = &res->bands[bandno];\r
+    opj_tcd_precinct_t *prc = &band->precincts[precno];\r
+    \r
+    if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;\r
+    \r
+    for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {\r
+      int included, increment, n;\r
+      opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];\r
+      opj_tcd_seg_t *seg = NULL;\r
+      /* if cblk not yet included before --> inclusion tagtree */\r
+      if (!cblk->numsegs) {\r
+        included = tgt_decode(bio, prc->incltree, cblkno, layno + 1);\r
+        /* else one bit */\r
+      } else {\r
+        included = bio_read(bio, 1);\r
+      }\r
+      /* if cblk not included */\r
+      if (!included) {\r
+        cblk->numnewpasses = 0;\r
+        continue;\r
+      }\r
+      /* if cblk not yet included --> zero-bitplane tagtree */\r
+      if (!cblk->numsegs) {\r
+        int i, numimsbs;\r
+        for (i = 0; !tgt_decode(bio, prc->imsbtree, cblkno, i); i++) {\r
+          ;\r
+        }\r
+        numimsbs = i - 1;\r
+        cblk->numbps = band->numbps - numimsbs;\r
+        cblk->numlenbits = 3;\r
+      }\r
+      /* number of coding passes */\r
+      cblk->numnewpasses = t2_getnumpasses(bio);\r
+      increment = t2_getcommacode(bio);\r
+      /* length indicator increment */\r
+      cblk->numlenbits += increment;\r
+      if (!cblk->numsegs) {\r
+        seg = &cblk->segs[0];\r
+        t2_init_seg(seg, tcp->tccps[compno].cblksty, 1);\r
+      } else {\r
+        seg = &cblk->segs[cblk->numsegs - 1];\r
+        if (seg->numpasses == seg->maxpasses) {\r
+          t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0);\r
+        }\r
+      }\r
+      n = cblk->numnewpasses;\r
+      \r
+      do {\r
+        seg->numnewpasses = int_min(seg->maxpasses - seg->numpasses, n);\r
+        seg->newlen = bio_read(bio, cblk->numlenbits + int_floorlog2(seg->numnewpasses));\r
+        n -= seg->numnewpasses;\r
+        if (n > 0) {\r
+          t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0);\r
+        }\r
+      } while (n > 0);\r
+    }\r
+  }\r
+  \r
+  if (bio_inalign(bio)) {\r
+    bio_destroy(bio);\r
+    return -999;\r
+  }\r
+  \r
+  hd += bio_numbytes(bio);\r
+  bio_destroy(bio);\r
+  \r
+  /* EPH markers */\r
+  if (tcp->csty & J2K_CP_CSTY_EPH) {\r
+    if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {\r
+      opj_event_msg(t2->cinfo, EVT_ERROR, "Expected EPH marker\n");\r
+    } else {\r
+      hd += 2;\r
+    }\r
+  }\r
+  \r
+  if (cp->ppm==1) {\r
+    cp->ppm_len+=cp->ppm_data-hd;\r
+    cp->ppm_data = hd;\r
+  } else if (tcp->ppt == 1) {\r
+    tcp->ppt_len+=tcp->ppt_data-hd;\r
+    tcp->ppt_data = hd;\r
+  } else {\r
+    c=hd;\r
+  }\r
+  \r
+  for (bandno = 0; bandno < res->numbands; bandno++) {\r
+    opj_tcd_band_t *band = &res->bands[bandno];\r
+    opj_tcd_precinct_t *prc = &band->precincts[precno];\r
+    \r
+    if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;\r
+    \r
+    for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {\r
+      opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];\r
+      opj_tcd_seg_t *seg = NULL;\r
+      if (!cblk->numnewpasses)\r
+        continue;\r
+      if (!cblk->numsegs) {\r
+        seg = &cblk->segs[0];\r
+        cblk->numsegs++;\r
+        cblk->len = 0;\r
+      } else {\r
+        seg = &cblk->segs[cblk->numsegs - 1];\r
+        if (seg->numpasses == seg->maxpasses) {\r
+          seg++;\r
+          cblk->numsegs++;\r
+        }\r
+      }\r
+      \r
+      do {\r
+        if (c + seg->newlen > src + len) {\r
+          return -999;\r
+        }\r
+        \r
+        memcpy(cblk->data + cblk->len, c, seg->newlen);\r
+        if (seg->numpasses == 0) {\r
+          seg->data = cblk->data + cblk->len;\r
+        }\r
+        c += seg->newlen;\r
+        cblk->len += seg->newlen;\r
+        seg->len += seg->newlen;\r
+        seg->numpasses += seg->numnewpasses;\r
+        cblk->numnewpasses -= seg->numnewpasses;\r
+        if (cblk->numnewpasses > 0) {\r
+          seg++;\r
+          cblk->numsegs++;\r
+        }\r
+      } while (cblk->numnewpasses > 0);\r
+    }\r
+  }\r
+  \r
+  return (c - src);\r
+}\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+int t2_encode_packets(opj_t2_t* t2, int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_image_info_t *image_info) {\r
+  unsigned char *c = dest;\r
+  int e = 0;\r
+  opj_pi_iterator_t *pi = NULL;\r
+  int pino;\r
+\r
+  opj_image_t *image = t2->image;\r
+  opj_cp_t *cp = t2->cp;\r
+  \r
+  /* create a packet iterator */\r
+  pi = pi_create(image, cp, tileno);\r
+  if(!pi) {\r
+    /* TODO: throw an error */\r
+    return -999;\r
+  }\r
+  \r
+  if(image_info) {\r
+    image_info->num = 0;\r
+  }\r
+  \r
+  for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) {\r
+    while (pi_next(&pi[pino])) {\r
+      if (pi[pino].layno < maxlayers) {\r
+        e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[pino], c, dest + len - c, image_info, tileno);\r
+        if (e == -999) {\r
+          break;\r
+        } else {\r
+          c += e;\r
+        }\r
+        \r
+        /* INDEX >> */\r
+        if(image_info && image_info->index_on) {\r
+          if(image_info->index_write) {\r
+            opj_tile_info_t *info_TL = &image_info->tile[tileno];\r
+            opj_packet_info_t *info_PK = &info_TL->packet[image_info->num];\r
+            if (!image_info->num) {\r
+              info_PK->start_pos = info_TL->end_header + 1;\r
+            } else {\r
+              info_PK->start_pos = info_TL->packet[image_info->num - 1].end_pos + 1;\r
+            }\r
+            info_PK->end_pos = info_PK->start_pos + e - 1;\r
+          }\r
+\r
+          image_info->num++;\r
+        }\r
+        /* << INDEX */\r
+      }\r
+    }\r
+  }\r
+\r
+  /* don't forget to release pi */\r
+  pi_destroy(pi, cp, tileno);\r
+  \r
+  if (e == -999) {\r
+    return e;\r
+  }\r
+\r
+    return (c - dest);\r
+}\r
+\r
+int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile) {\r
+  unsigned char *c = src;\r
+  opj_pi_iterator_t *pi;\r
+  int pino, e = 0;\r
+  int n = 0;\r
+\r
+  opj_image_t *image = t2->image;\r
+  opj_cp_t *cp = t2->cp;\r
+  \r
+  /* create a packet iterator */\r
+  pi = pi_create(image, cp, tileno);\r
+  if(!pi) {\r
+    /* TODO: throw an error */\r
+    return -999;\r
+  }\r
+  \r
+  for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) {\r
+    while (pi_next(&pi[pino])) {\r
+      if ((cp->layer==0) || (cp->layer>=((pi[pino].layno)+1))) {\r
+        e = t2_decode_packet(t2, c, src + len - c, tile, &cp->tcps[tileno], &pi[pino]);\r
+      } else {\r
+        e = 0;\r
+      }\r
+      \r
+      /* progression in resolution */\r
+      image->comps[pi[pino].compno].resno_decoded =  \r
+        (e > 0) ? \r
+        int_max(pi[pino].resno, image->comps[pi[pino].compno].resno_decoded) \r
+        : image->comps[pi[pino].compno].resno_decoded;\r
+      n++;\r
+      \r
+      if (e == -999) {    /* ADD */\r
+        break;\r
+      } else {\r
+        c += e;\r
+      }\r
+    }\r
+  }\r
+\r
+  /* don't forget to release pi */\r
+  pi_destroy(pi, cp, tileno);\r
+  \r
+  if (e == -999) {\r
+    return e;\r
+  }\r
+  \r
+    return (c - src);\r
+}\r
+\r
+/* ----------------------------------------------------------------------- */\r
+\r
+opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp) {\r
+  /* create the tcd structure */\r
+  opj_t2_t *t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t));\r
+  if(!t2) return NULL;\r
+  t2->cinfo = cinfo;\r
+  t2->image = image;\r
+  t2->cp = cp;\r
+\r
+  return t2;\r
+}\r
+\r
+void t2_destroy(opj_t2_t *t2) {\r
+  if(t2) {\r
+    opj_free(t2);\r
+  }\r
+}\r
+\r
index c8596e95633311bb1fb9cfe16cdd4bcd1c1ab7be..39d7abfa6262179e49a2dbef6e1a781564d4c277 100644 (file)
@@ -1,64 +1,99 @@
-/*
- * 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
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#ifndef __T2_H\r
+#define __T2_H\r
+/**\r
+@file t2.h\r
+@brief Implementation of a tier-2 coding (packetization of code-block data) (T2)\r
+\r
+*/\r
+\r
+/** @defgroup T2 T2 - Implementation of a tier-2 coding */\r
+/*@{*/\r
+\r
+/**\r
+Tier-2 coding\r
+*/\r
+typedef struct opj_t2 {\r
+  /** codec context */\r
+  opj_common_ptr cinfo;\r
+\r
+  /** Encoding: pointer to the src image. Decoding: pointer to the dst image. */\r
+  opj_image_t *image;\r
+  /** pointer to the image coding parameters */\r
+  opj_cp_t *cp;\r
+} opj_t2_t;\r
+\r
+/** @name Exported functions */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+\r
+/**\r
+Encode the packets of a tile to a destination buffer\r
+@param t2 T2 handle\r
+@param tileno number of the tile encoded\r
+@param tile the tile for which to write the packets\r
+@param maxlayers maximum number of layers\r
+@param dest the destination buffer\r
+@param len the length of the destination buffer\r
+@param image_info structure to create an index file\r
+*/\r
+int t2_encode_packets(opj_t2_t* t2, int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_image_info_t *image_info);\r
+\r
+/**\r
+Decode the packets of a tile from a source buffer\r
+@param t2 T2 handle\r
+@param src the source buffer\r
+@param len length of the source buffer\r
+@param tileno number that identifies the tile for which to decode the packets\r
+@param tile tile for which to decode the packets\r
+ */\r
+int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile);\r
+\r
+/**\r
+Create a T2 handle\r
+@param cinfo Codec context info\r
+@param image Source or destination image\r
+@param cp Image coding parameters\r
+@return Returns a new T2 handle if successful, returns NULL otherwise\r
+*/\r
+opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp);\r
+/**\r
+Destroy a T2 handle\r
+@param t2 T2 handle to destroy\r
+*/\r
+void t2_destroy(opj_t2_t *t2);\r
+\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __T2_H */\r
index 911955d72574469d0aa70b996d00082d3152813d..763ab67eb26953a6317a847468979cd32c7ea01b 100644 (file)
@@ -1,7 +1,9 @@
 /*
- * 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
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "tcd.h"
-#include "int.h"
-#include "t1.h"
-#include "t2.h"
-#include "dwt.h"
-#include "mct.h"
-#include <setjmp.h>
-#include <float.h>
-#include <stdio.h>
-#include <time.h>
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-static tcd_image_t tcd_image;
-
-static j2k_image_t *tcd_img;
-static j2k_cp_t *tcd_cp;
-
-static tcd_tile_t *tcd_tile;
-static j2k_tcp_t *tcd_tcp;
-static int tcd_tileno;
-
-static tcd_tile_t *tile;
-static tcd_tilecomp_t *tilec;
-static tcd_resolution_t *res;
-static tcd_band_t *band;
-static tcd_precinct_t *prc;
-static tcd_cblk_t *cblk;
-
-extern jmp_buf j2k_error;
-
-void tcd_dump(tcd_image_t * img, int curtileno)
-{
+#include "opj_includes.h"
+
+void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) {
   int tileno, compno, resno, bandno, precno, cblkno;
-  (void)curtileno;
-  fprintf(stdout, "image {\n");
-  fprintf(stdout, "  tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n", img->tw,
-     img->th, tcd_img->x0, tcd_img->x1, tcd_img->y0, tcd_img->y1);
+
+  fprintf(fd, "image {\n");
+  fprintf(fd, "  tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n", 
+    img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, tcd->image->y1);
+
   for (tileno = 0; tileno < img->th * img->tw; tileno++) {
-    tcd_tile_t *tile = &tcd_image.tiles[tileno];
-    fprintf(stdout, "  tile {\n");
-    fprintf(stdout, "    x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n",
-       tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps);
+    opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno];
+    fprintf(fd, "  tile {\n");
+    fprintf(fd, "    x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n",
+      tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps);
     for (compno = 0; compno < tile->numcomps; compno++) {
-      tcd_tilecomp_t *tilec = &tile->comps[compno];
-      fprintf(stdout, "    tilec {\n");
-      fprintf(stdout,
-         "      x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n",
-         tilec->x0, tilec->y0, tilec->x1, tilec->y1,
-         tilec->numresolutions);
+      opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+      fprintf(fd, "    tilec {\n");
+      fprintf(fd,
+        "      x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n",
+        tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions);
       for (resno = 0; resno < tilec->numresolutions; resno++) {
-        tcd_resolution_t *res = &tilec->resolutions[resno];
-        fprintf(stdout, "\n   res {\n");
-        fprintf(stdout,
+        opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+        fprintf(fd, "\n   res {\n");
+        fprintf(fd,
           "          x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n",
-        res->x0, res->y0, res->x1, res->y1, res->pw, res->ph,
-        res->numbands);
+          res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands);
         for (bandno = 0; bandno < res->numbands; bandno++) {
-          tcd_band_t *band = &res->bands[bandno];
-          fprintf(stdout, "        band {\n");
-          fprintf(stdout,
-             "          x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n",
-             band->x0, band->y0, band->x1, band->y1,
-             band->stepsize, band->numbps);
+          opj_tcd_band_t *band = &res->bands[bandno];
+          fprintf(fd, "        band {\n");
+          fprintf(fd,
+            "          x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n",
+            band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps);
           for (precno = 0; precno < res->pw * res->ph; precno++) {
-            tcd_precinct_t *prec = &band->precincts[precno];
-            fprintf(stdout, "          prec {\n");
-            fprintf(stdout,
-               "            x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n",
-            prec->x0, prec->y0, prec->x1, prec->y1,
-            prec->cw, prec->ch);
-          for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) {
-            tcd_cblk_t *cblk = &prec->cblks[cblkno];
-            fprintf(stdout, "            cblk {\n");
-            fprintf(stdout,
-              "              x0=%d, y0=%d, x1=%d, y1=%d\n",
-              cblk->x0, cblk->y0, cblk->x1, cblk->y1);
-            fprintf(stdout, "            }\n");
+            opj_tcd_precinct_t *prec = &band->precincts[precno];
+            fprintf(fd, "          prec {\n");
+            fprintf(fd,
+              "            x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n",
+              prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch);
+            for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) {
+              opj_tcd_cblk_t *cblk = &prec->cblks[cblkno];
+              fprintf(fd, "            cblk {\n");
+              fprintf(fd,
+                "              x0=%d, y0=%d, x1=%d, y1=%d\n",
+                cblk->x0, cblk->y0, cblk->x1, cblk->y1);
+              fprintf(fd, "            }\n");
+            }
+            fprintf(fd, "          }\n");
           }
-          fprintf(stdout, "          }\n");
+          fprintf(fd, "        }\n");
         }
-        fprintf(stdout, "        }\n");
-      }
-      fprintf(stdout, "      }\n");
+        fprintf(fd, "      }\n");
       }
-      fprintf(stdout, "    }\n");
+      fprintf(fd, "    }\n");
     }
-    fprintf(stdout, "  }\n");
+    fprintf(fd, "  }\n");
+  }
+  fprintf(fd, "}\n");
+}
+
+/* ----------------------------------------------------------------------- */
+
+/**
+Create a new TCD handle
+*/
+opj_tcd_t* tcd_create(opj_common_ptr cinfo) {
+  /* create the tcd structure */
+  opj_tcd_t *tcd = (opj_tcd_t*)opj_malloc(sizeof(opj_tcd_t));
+  if(!tcd) return NULL;
+  tcd->cinfo = cinfo;
+  tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t));
+  if(!tcd->tcd_image) {
+    opj_free(tcd);
+    return NULL;
+  }
+
+  return tcd;
+}
+
+/**
+Destroy a previously created TCD handle
+*/
+void tcd_destroy(opj_tcd_t *tcd) {
+  if(tcd) {
+    opj_free(tcd->tcd_image);
+    opj_free(tcd);
   }
-  fprintf(stdout, "}\n");
 }
 
-void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno)
-{
+/* ----------------------------------------------------------------------- */
+
+void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) {
   int tileno, compno, resno, bandno, precno, cblkno;
-  tcd_img = img;
-  tcd_cp = cp;
-  tcd_image.tw = cp->tw;
-  tcd_image.th = cp->th;
-  tcd_image.tiles = (tcd_tile_t *) malloc(sizeof(tcd_tile_t));
 
+  opj_tcd_tile_t *tile = NULL;    /* pointer to tcd->tile */
+  opj_tcd_tilecomp_t *tilec = NULL;  /* pointer to tcd->tilec */
+  opj_tcd_resolution_t *res = NULL;  /* pointer to tcd->res */
+  opj_tcd_band_t *band = NULL;    /* pointer to tcd->band */
+  opj_tcd_precinct_t *prc = NULL;    /* pointer to tcd->prc */
+  opj_tcd_cblk_t *cblk = NULL;    /* pointer to tcd->cblk */
+
+  tcd->image = image;
+  tcd->cp = cp;
+  tcd->tcd_image->tw = cp->tw;
+  tcd->tcd_image->th = cp->th;
+  tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t));
+  
   for (tileno = 0; tileno < 1; tileno++) {
-    j2k_tcp_t *tcp = &cp->tcps[curtileno];
+    opj_tcp_t *tcp = &cp->tcps[curtileno];
     int j;
+
     /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
-    int p = curtileno % cp->tw;   /* si numerotation matricielle .. */
-    int q = curtileno / cp->tw;   /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */
-    /* tcd_tile_t *tile=&tcd_image.tiles[tileno]; */
-    tile = tcd_image.tiles;
+    int p = curtileno % cp->tw;  /* si numerotation matricielle .. */
+    int q = curtileno / cp->tw;  /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */
+
+    /* opj_tcd_tile_t *tile=&tcd->tcd_image->tiles[tileno]; */
+    tcd->tile = tcd->tcd_image->tiles;
+    tile = tcd->tile;
+
     /* 4 borders of the tile rescale on the image if necessary */
-    tile->x0 = int_max(cp->tx0 + p * cp->tdx, img->x0);
-    tile->y0 = int_max(cp->ty0 + q * cp->tdy, img->y0);
-    tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, img->x1);
-    tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, img->y1);
-    tile->numcomps = img->numcomps;
-    /* tile->PPT=img->PPT;  */
+    tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
+    tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
+    tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
+    tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
+    tile->numcomps = image->numcomps;
+    /* tile->PPT=image->PPT;  */
+
     /* Modification of the RATE >> */
     for (j = 0; j < tcp->numlayers; j++) {
-      tcp->rates[j] = tcp->rates[j] ? int_ceildiv(tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * img->comps[0].prec, (tcp->rates[j] * 8 * img->comps[0].dx * img->comps[0].dy)) : 0;   /*Mod antonin losslessbug*/
+      tcp->rates[j] = tcp->rates[j] ? 
+        int_ceildiv(tile->numcomps 
+          * (tile->x1 - tile->x0) 
+          * (tile->y1 - tile->y0) 
+          * image->comps[0].prec, 
+          (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) 
+          : 0;
+
       if (tcp->rates[j]) {
         if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) {
           tcp->rates[j] = tcp->rates[j - 1] + 20;
@@ -156,29 +174,26 @@ void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno)
       }
     }
     /* << Modification of the RATE */
-
-    tile->comps =
-      (tcd_tilecomp_t *) malloc(img->numcomps * sizeof(tcd_tilecomp_t));
+    
+    tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(image->numcomps * sizeof(opj_tcd_tilecomp_t));
     for (compno = 0; compno < tile->numcomps; compno++) {
-      j2k_tccp_t *tccp = &tcp->tccps[compno];
-      /* tcd_tilecomp_t *tilec=&tile->comps[compno]; */
-      tilec = &tile->comps[compno];
-      /* border of each tile component (global) */
-      tilec->x0 = int_ceildiv(tile->x0, img->comps[compno].dx);
+      opj_tccp_t *tccp = &tcp->tccps[compno];
 
-      tilec->y0 = int_ceildiv(tile->y0, img->comps[compno].dy);
-      tilec->x1 = int_ceildiv(tile->x1, img->comps[compno].dx);
-      tilec->y1 = int_ceildiv(tile->y1, img->comps[compno].dy);
+      /* opj_tcd_tilecomp_t *tilec=&tile->comps[compno]; */
+      tcd->tilec = &tile->comps[compno];
+      tilec = tcd->tilec;
 
-      tilec->data =
-        (int *) malloc((tilec->x1 - tilec->x0) *
-             (tilec->y1 - tilec->y0) * sizeof(int));
+      /* border of each tile component (global) */
+      tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
+      tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
+      tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
+      tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
+      
+      tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
       tilec->numresolutions = tccp->numresolutions;
 
-      tilec->resolutions =
-        (tcd_resolution_t *) malloc(tilec->numresolutions *
-                sizeof(tcd_resolution_t));
-
+      tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t));
+      
       for (resno = 0; resno < tilec->numresolutions; resno++) {
         int pdx, pdy;
         int levelno = tilec->numresolutions - 1 - resno;
@@ -186,18 +201,19 @@ void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno)
         int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
         int cbgwidthexpn, cbgheightexpn;
         int cblkwidthexpn, cblkheightexpn;
-     /* tcd_resolution_t *res=&tilec->resolutions[resno]; */
 
-        res = &tilec->resolutions[resno];
-
-   /* border for each resolution level (global) */
+        /* opj_tcd_resolution_t *res=&tilec->resolutions[resno]; */
+        tcd->res = &tilec->resolutions[resno];
+        res = tcd->res;
+        
+        /* border for each resolution level (global) */
         res->x0 = int_ceildivpow2(tilec->x0, levelno);
         res->y0 = int_ceildivpow2(tilec->y0, levelno);
         res->x1 = int_ceildivpow2(tilec->x1, levelno);
         res->y1 = int_ceildivpow2(tilec->y1, levelno);
-
+        
         res->numbands = resno == 0 ? 1 : 3;
-   /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
+        /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
         if (tccp->csty & J2K_CCP_CSTY_PRT) {
           pdx = tccp->prcw[resno];
           pdy = tccp->prch[resno];
@@ -205,15 +221,16 @@ void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno)
           pdx = 15;
           pdy = 15;
         }
-   /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */
+        /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */
         tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
         tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
+        
         brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
         brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
-
+        
         res->pw = (brprcxend - tlprcxstart) >> pdx;
         res->ph = (brprcyend - tlprcystart) >> pdy;
-
+        
         if (resno == 0) {
           tlcbgxstart = tlprcxstart;
           tlcbgystart = tlprcystart;
@@ -229,103 +246,89 @@ void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno)
           cbgwidthexpn = pdx - 1;
           cbgheightexpn = pdy - 1;
         }
-
+        
         cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
         cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
-
+        
         for (bandno = 0; bandno < res->numbands; bandno++) {
           int x0b, y0b, i;
           int gain, numbps;
-          j2k_stepsize_t *ss;
-          band = &res->bands[bandno];
+          opj_stepsize_t *ss = NULL;
+
+          tcd->band = &res->bands[bandno];
+          band = tcd->band;
+
           band->bandno = resno == 0 ? 0 : bandno + 1;
           x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
           y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
-
+          
           if (band->bandno == 0) {
-       /* band border (global) */
+            /* band border (global) */
             band->x0 = int_ceildivpow2(tilec->x0, levelno);
             band->y0 = int_ceildivpow2(tilec->y0, levelno);
             band->x1 = int_ceildivpow2(tilec->x1, levelno);
             band->y1 = int_ceildivpow2(tilec->y1, levelno);
           } else {
-       /* band border (global) */
-            band->x0 =
-              int_ceildivpow2(tilec->x0 -
-                (1 << levelno) * x0b, levelno + 1);
-            band->y0 =
-              int_ceildivpow2(tilec->y0 -
-                (1 << levelno) * y0b, levelno + 1);
-            band->x1 =
-              int_ceildivpow2(tilec->x1 -
-                 (1 << levelno) * x0b, levelno + 1);
-            band->y1 =
-              int_ceildivpow2(tilec->y1 -
-                 (1 << levelno) * y0b, levelno + 1);
-
+            /* band border (global) */
+            band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
+            band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
+            band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
+            band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
           }
-
-          ss = &tccp->stepsizes[resno ==
-              0 ? 0 : 3 * (resno - 1) + bandno + 1];
-          gain =
-            tccp->qmfbid ==
-            0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
-          numbps = img->comps[compno].prec + gain;
+          
+          ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
+          gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);          
+          numbps = image->comps[compno].prec + gain;
+          
           band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn));
-          band->numbps = ss->expn + tccp->numgbits - 1;   /* WHY -1 ? */
-
-          band->precincts =
-            (tcd_precinct_t *) malloc(3 * res->pw * res->ph *
-                  sizeof(tcd_precinct_t));
-
+          band->numbps = ss->expn + tccp->numgbits - 1;  /* WHY -1 ? */
+          
+          band->precincts = (opj_tcd_precinct_t *) opj_malloc(3 * res->pw * res->ph * sizeof(opj_tcd_precinct_t));
+          
           for (i = 0; i < res->pw * res->ph * 3; i++) {
             band->precincts[i].imsbtree = NULL;
             band->precincts[i].incltree = NULL;
           }
-
+          
           for (precno = 0; precno < res->pw * res->ph; precno++) {
             int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
-            int cbgxstart =
-              tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
-            int cbgystart =
-              tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
+
+            int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
+            int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
             int cbgxend = cbgxstart + (1 << cbgwidthexpn);
             int cbgyend = cbgystart + (1 << cbgheightexpn);
-         /* tcd_precinct_t *prc=&band->precincts[precno]; */
-            prc = &band->precincts[precno];
-         /* precinct size (global) */
+
+            /* opj_tcd_precinct_t *prc=&band->precincts[precno]; */
+            tcd->prc = &band->precincts[precno];
+            prc = tcd->prc;
+
+            /* precinct size (global) */
             prc->x0 = int_max(cbgxstart, band->x0);
             prc->y0 = int_max(cbgystart, band->y0);
             prc->x1 = int_min(cbgxend, band->x1);
             prc->y1 = int_min(cbgyend, band->y1);
 
-            tlcblkxstart =
-             int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
-            tlcblkystart =
-             int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
-            brcblkxend =
-             int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
-            brcblkyend =
-             int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
+            tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
+            tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
+            brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
+            brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
             prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
             prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
 
-            prc->cblks =
-             (tcd_cblk_t *) malloc((prc->cw * prc->ch) *
-                sizeof(tcd_cblk_t));
+            prc->cblks = (opj_tcd_cblk_t *) opj_malloc((prc->cw * prc->ch) * sizeof(opj_tcd_cblk_t));
             prc->incltree = tgt_create(prc->cw, prc->ch);
             prc->imsbtree = tgt_create(prc->cw, prc->ch);
-
+            
             for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
-              int cblkxstart =
-                tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
-              int cblkystart =
-                tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
+              int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
+              int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
               int cblkxend = cblkxstart + (1 << cblkwidthexpn);
               int cblkyend = cblkystart + (1 << cblkheightexpn);
+              
+              tcd->cblk = &prc->cblks[cblkno];
+              cblk = tcd->cblk;
 
-              cblk = &prc->cblks[cblkno];
-           /* code-block size (global) */
+              /* code-block size (global) */
               cblk->x0 = int_max(cblkxstart, prc->x0);
               cblk->y0 = int_max(cblkystart, prc->y0);
               cblk->x1 = int_min(cblkxend, prc->x1);
@@ -336,69 +339,103 @@ void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno)
       }
     }
   }
-  /* tcd_dump(&tcd_image,curtileno); */
+  
+  /* tcd_dump(stdout, tcd, &tcd->tcd_image); */
 }
 
-void tcd_free_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno)
-{
+void tcd_free_encode(opj_tcd_t *tcd) {
   int tileno, compno, resno, bandno, precno;
-  (void)curtileno;
-  tcd_img = img;
-  tcd_cp = cp;
-  tcd_image.tw = cp->tw;
-  tcd_image.th = cp->th;
+
+  opj_tcd_tile_t *tile = NULL;    /* pointer to tcd->tile    */
+  opj_tcd_tilecomp_t *tilec = NULL;  /* pointer to tcd->tilec  */
+  opj_tcd_resolution_t *res = NULL;  /* pointer to tcd->res    */
+  opj_tcd_band_t *band = NULL;    /* pointer to tcd->band    */
+  opj_tcd_precinct_t *prc = NULL;    /* pointer to tcd->prc    */
+
   for (tileno = 0; tileno < 1; tileno++) {
-    /* j2k_tcp_t *tcp=&cp->tcps[curtileno]; */
-    tile = tcd_image.tiles;
+    tcd->tile = tcd->tcd_image->tiles;
+    tile = tcd->tile;
+
     for (compno = 0; compno < tile->numcomps; compno++) {
-      tilec = &tile->comps[compno];
+      tcd->tilec = &tile->comps[compno];
+      tilec = tcd->tilec;
+
       for (resno = 0; resno < tilec->numresolutions; resno++) {
-        res = &tilec->resolutions[resno];
+        tcd->res = &tilec->resolutions[resno];
+        res = tcd->res;
+
         for (bandno = 0; bandno < res->numbands; bandno++) {
-          band = &res->bands[bandno];
+          tcd->band = &res->bands[bandno];
+          band = tcd->band;
+
           for (precno = 0; precno < res->pw * res->ph; precno++) {
-            prc = &band->precincts[precno];
+            tcd->prc = &band->precincts[precno];
+            prc = tcd->prc;
 
-            if (prc->incltree != NULL)
+            if (prc->incltree != NULL) {
               tgt_destroy(prc->incltree);
-            if (prc->imsbtree != NULL)
-              tgt_destroy(prc->imsbtree);
-            free(prc->cblks);
-          }         /* for (precno */
-          free(band->precincts);
-        }         /* for (bandno */
-      }            /* for (resno */
-      free(tilec->resolutions);
-    }            /* for (compno */
-    free(tile->comps);
-  }            /* for (tileno */
-  free(tcd_image.tiles);
+              prc->incltree = NULL;
+            }
+            if (prc->imsbtree != NULL) {
+              tgt_destroy(prc->imsbtree);  
+              prc->imsbtree = NULL;
+            }
+            opj_free(prc->cblks);
+            prc->cblks = NULL;
+          } /* for (precno */
+          opj_free(band->precincts);
+          band->precincts = NULL;
+        } /* for (bandno */
+      } /* for (resno */
+      opj_free(tilec->resolutions);
+      tilec->resolutions = NULL;
+    } /* for (compno */
+    opj_free(tile->comps);
+    tile->comps = NULL;
+  } /* for (tileno */
+  opj_free(tcd->tcd_image->tiles);
+  tcd->tcd_image->tiles = NULL;
 }
 
-void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno)
-{
+void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno) {
   int tileno, compno, resno, bandno, precno, cblkno;
 
+  opj_tcd_tile_t *tile = NULL;    /* pointer to tcd->tile */
+  opj_tcd_tilecomp_t *tilec = NULL;  /* pointer to tcd->tilec */
+  opj_tcd_resolution_t *res = NULL;  /* pointer to tcd->res */
+  opj_tcd_band_t *band = NULL;    /* pointer to tcd->band */
+  opj_tcd_precinct_t *prc = NULL;    /* pointer to tcd->prc */
+  opj_tcd_cblk_t *cblk = NULL;    /* pointer to tcd->cblk */
+
   for (tileno = 0; tileno < 1; tileno++) {
-    j2k_tcp_t *tcp = &cp->tcps[curtileno];
+    opj_tcp_t *tcp = &cp->tcps[curtileno];
     int j;
-    /*              int previous_x0, previous_x1, previous_y0, previous_y1;*/
     /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
     int p = curtileno % cp->tw;
     int q = curtileno / cp->tw;
-    tile = tcd_image.tiles;
 
+    tcd->tile = tcd->tcd_image->tiles;
+    tile = tcd->tile;
+    
     /* 4 borders of the tile rescale on the image if necessary */
-    tile->x0 = int_max(cp->tx0 + p * cp->tdx, img->x0);
-    tile->y0 = int_max(cp->ty0 + q * cp->tdy, img->y0);
-    tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, img->x1);
-    tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, img->y1);
+    tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
+    tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
+    tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
+    tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
+    
+    tile->numcomps = image->numcomps;
+    /* tile->PPT=image->PPT; */
 
-    tile->numcomps = img->numcomps;
-    /* tile->PPT=img->PPT; */
     /* Modification of the RATE >> */
     for (j = 0; j < tcp->numlayers; j++) {
-      tcp->rates[j] = tcp->rates[j] ? int_ceildiv(tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * img->comps[0].prec, (tcp->rates[j] * 8 * img->comps[0].dx * img->comps[0].dy)) : 0;   /*Mod antonin losslessbug*/
+      tcp->rates[j] = tcp->rates[j] ? 
+        int_ceildiv(tile->numcomps 
+        * (tile->x1 - tile->x0) 
+        * (tile->y1 - tile->y0) 
+        * image->comps[0].prec, 
+        (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) 
+        : 0;
+
       if (tcp->rates[j]) {
         if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) {
           tcp->rates[j] = tcp->rates[j - 1] + 20;
@@ -409,40 +446,43 @@ void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno)
       }
     }
     /* << Modification of the RATE */
-    /* tile->comps=(tcd_tilecomp_t*)realloc(tile->comps,img->numcomps*sizeof(tcd_tilecomp_t)); */
+
+    /* tile->comps=(opj_tcd_tilecomp_t*)opj_realloc(tile->comps,image->numcomps*sizeof(opj_tcd_tilecomp_t)); */
     for (compno = 0; compno < tile->numcomps; compno++) {
-      j2k_tccp_t *tccp = &tcp->tccps[compno];
-      /* int realloc_op; */
+      opj_tccp_t *tccp = &tcp->tccps[compno];
+      
+      tcd->tilec = &tile->comps[compno];
+      tilec = tcd->tilec;
 
-      tilec = &tile->comps[compno];
       /* border of each tile component (global) */
-      tilec->x0 = int_ceildiv(tile->x0, img->comps[compno].dx);
-      tilec->y0 = int_ceildiv(tile->y0, img->comps[compno].dy);
-      tilec->x1 = int_ceildiv(tile->x1, img->comps[compno].dx);
-      tilec->y1 = int_ceildiv(tile->y1, img->comps[compno].dy);
-
-      tilec->data =
-        (int *) malloc((tilec->x1 - tilec->x0) *
-             (tilec->y1 - tilec->y0) * sizeof(int));
+      tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
+      tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
+      tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
+      tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
+      
+      tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
       tilec->numresolutions = tccp->numresolutions;
-      /* tilec->resolutions=(tcd_resolution_t*)realloc(tilec->resolutions,tilec->numresolutions*sizeof(tcd_resolution_t)); */
+      /* tilec->resolutions=(opj_tcd_resolution_t*)opj_realloc(tilec->resolutions,tilec->numresolutions*sizeof(opj_tcd_resolution_t)); */
       for (resno = 0; resno < tilec->numresolutions; resno++) {
         int pdx, pdy;
+
         int levelno = tilec->numresolutions - 1 - resno;
         int tlprcxstart, tlprcystart, brprcxend, brprcyend;
         int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
         int cbgwidthexpn, cbgheightexpn;
         int cblkwidthexpn, cblkheightexpn;
+        
+        tcd->res = &tilec->resolutions[resno];
+        res = tcd->res;
 
-        res = &tilec->resolutions[resno];
-   /* border for each resolution level (global) */
+        /* border for each resolution level (global) */
         res->x0 = int_ceildivpow2(tilec->x0, levelno);
         res->y0 = int_ceildivpow2(tilec->y0, levelno);
         res->x1 = int_ceildivpow2(tilec->x1, levelno);
-        res->y1 = int_ceildivpow2(tilec->y1, levelno);
-
+        res->y1 = int_ceildivpow2(tilec->y1, levelno);  
         res->numbands = resno == 0 ? 1 : 3;
-   /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
+
+        /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
         if (tccp->csty & J2K_CCP_CSTY_PRT) {
           pdx = tccp->prcw[resno];
           pdy = tccp->prch[resno];
@@ -450,15 +490,15 @@ void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno)
           pdx = 15;
           pdy = 15;
         }
-   /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */
+        /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */
         tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
         tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
         brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
         brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
-
+        
         res->pw = (brprcxend - tlprcxstart) >> pdx;
         res->ph = (brprcyend - tlprcystart) >> pdy;
-
+        
         if (resno == 0) {
           tlcbgxstart = tlprcxstart;
           tlcbgystart = tlprcystart;
@@ -474,164 +514,143 @@ void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno)
           cbgwidthexpn = pdx - 1;
           cbgheightexpn = pdy - 1;
         }
-
+        
         cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
         cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
-
+        
         for (bandno = 0; bandno < res->numbands; bandno++) {
           int x0b, y0b;
           int gain, numbps;
-          j2k_stepsize_t *ss;
-          band = &res->bands[bandno];
+          opj_stepsize_t *ss = NULL;
+
+          tcd->band = &res->bands[bandno];
+          band = tcd->band;
+
           band->bandno = resno == 0 ? 0 : bandno + 1;
           x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
           y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
-
+          
           if (band->bandno == 0) {
-       /* band border */
+            /* band border */
             band->x0 = int_ceildivpow2(tilec->x0, levelno);
             band->y0 = int_ceildivpow2(tilec->y0, levelno);
             band->x1 = int_ceildivpow2(tilec->x1, levelno);
             band->y1 = int_ceildivpow2(tilec->y1, levelno);
           } else {
-            band->x0 =
-              int_ceildivpow2(tilec->x0 -
-                (1 << levelno) * x0b, levelno + 1);
-              band->y0 =
-                 int_ceildivpow2(tilec->y0 -
-                 (1 << levelno) * y0b, levelno + 1);
-            band->x1 =
-              int_ceildivpow2(tilec->x1 -
-                (1 << levelno) * x0b, levelno + 1);
-            band->y1 =
-              int_ceildivpow2(tilec->y1 -
-                (1 << levelno) * y0b, levelno + 1);
+            band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
+            band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
+            band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
+            band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
           }
-
-          ss = &tccp->stepsizes[resno ==
-            0 ? 0 : 3 * (resno - 1) + bandno + 1];
-          gain =
-            tccp->qmfbid ==
-            0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
-          numbps = img->comps[compno].prec + gain;
+          
+          ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
+          gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
+          numbps = image->comps[compno].prec + gain;
           band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn));
-          band->numbps = ss->expn + tccp->numgbits - 1;   /* WHY -1 ? */
-
+          band->numbps = ss->expn + tccp->numgbits - 1;  /* WHY -1 ? */
+          
           for (precno = 0; precno < res->pw * res->ph; precno++) {
             int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
-            int cbgxstart =
-              tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
-            int cbgystart =
-              tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
+
+            int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
+            int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
             int cbgxend = cbgxstart + (1 << cbgwidthexpn);
             int cbgyend = cbgystart + (1 << cbgheightexpn);
+            
+            tcd->prc = &band->precincts[precno];
+            prc = tcd->prc;
 
-            prc = &band->precincts[precno];
-       /* precinct size (global) */
+            /* precinct size (global) */
             prc->x0 = int_max(cbgxstart, band->x0);
             prc->y0 = int_max(cbgystart, band->y0);
             prc->x1 = int_min(cbgxend, band->x1);
             prc->y1 = int_min(cbgyend, band->y1);
 
-            tlcblkxstart =
-              int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
-            tlcblkystart =
-              int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
-            brcblkxend =
-              int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
-            brcblkyend =
-              int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
+            tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
+            tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
+            brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
+            brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
             prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
             prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
 
-            free(prc->cblks);
-            prc->cblks =
-              (tcd_cblk_t *) malloc(prc->cw * prc->ch *
-                sizeof(tcd_cblk_t));
+            opj_free(prc->cblks);
+            prc->cblks = (opj_tcd_cblk_t *) opj_malloc(prc->cw * prc->ch * sizeof(opj_tcd_cblk_t));
 
-            if (prc->incltree != NULL)
+            if (prc->incltree != NULL) {
               tgt_destroy(prc->incltree);
-            if (prc->imsbtree != NULL)
+            }
+            if (prc->imsbtree != NULL) {
               tgt_destroy(prc->imsbtree);
-
+            }
+            
             prc->incltree = tgt_create(prc->cw, prc->ch);
             prc->imsbtree = tgt_create(prc->cw, prc->ch);
 
             for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
-              int cblkxstart =
-                tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
-              int cblkystart =
-                tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
+              int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
+              int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
               int cblkxend = cblkxstart + (1 << cblkwidthexpn);
               int cblkyend = cblkystart + (1 << cblkheightexpn);
-              cblk = &prc->cblks[cblkno];
 
-         /* code-block size (global) */
+              tcd->cblk = &prc->cblks[cblkno];
+              cblk = tcd->cblk;
+              
+              /* code-block size (global) */
               cblk->x0 = int_max(cblkxstart, prc->x0);
               cblk->y0 = int_max(cblkystart, prc->y0);
               cblk->x1 = int_min(cblkxend, prc->x1);
               cblk->y1 = int_min(cblkyend, prc->y1);
-
             }
-          }
-        }
-      }
-    }
-  }
-  /* tcd_dump(&tcd_image,0); */
+          } /* precno */
+        } /* bandno */
+      } /* resno */
+    } /* compno */
+  } /* tileno */
+
+  /* tcd_dump(stdout, tcd, &tcd->tcd_image); */
 }
 
-void tcd_init(j2k_image_t * img, j2k_cp_t * cp)
-{
+void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp) {
   int tileno, compno, resno, bandno, precno, cblkno, i, j, p, q;
   unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0, w, h;
-  tcd_img = img;
-  tcd_cp = cp;
-  tcd_image.tw = cp->tw;
-  tcd_image.th = cp->th;
-  tcd_image.tiles =
-    (tcd_tile_t *) malloc(cp->tw * cp->th * sizeof(tcd_tile_t));
-
-  /*for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
-     j2k_tcp_t *tcp = &cp->tcps[tileno];
-     tcd_tile_t *tile = &tcd_image.tiles[tileno]; */
 
+  tcd->image = image;
+  tcd->cp = cp;
+  tcd->tcd_image->tw = cp->tw;
+  tcd->tcd_image->th = cp->th;
+  tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(cp->tw * cp->th * sizeof(opj_tcd_tile_t));
+  
   for (i = 0; i < cp->tileno_size; i++) {
-    j2k_tcp_t *tcp = &cp->tcps[cp->tileno[i]];
-    tcd_tile_t *tile = &tcd_image.tiles[cp->tileno[i]];
-    tileno = cp->tileno[i];
-
-
-    /*              int previous_x0, previous_x1, previous_y0, previous_y1;*/
+    opj_tcp_t *tcp = &(cp->tcps[cp->tileno[i]]);
+    opj_tcd_tile_t *tile = &(tcd->tcd_image->tiles[cp->tileno[i]]);
+  
     /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
-    p = tileno % cp->tw;   /* si numerotation matricielle .. */
-    q = tileno / cp->tw;   /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */
+    tileno = cp->tileno[i];
+    p = tileno % cp->tw;  /* si numerotation matricielle .. */
+    q = tileno / cp->tw;  /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */
 
     /* 4 borders of the tile rescale on the image if necessary */
-    tile->x0 = int_max(cp->tx0 + p * cp->tdx, img->x0);
-    tile->y0 = int_max(cp->ty0 + q * cp->tdy, img->y0);
-    tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, img->x1);
-    tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, img->y1);
-
-    tile->numcomps = img->numcomps;
-    tile->comps =
-      (tcd_tilecomp_t *) malloc(img->numcomps * sizeof(tcd_tilecomp_t));
+    tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
+    tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
+    tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
+    tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
+    
+    tile->numcomps = image->numcomps;
+    tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(image->numcomps * sizeof(opj_tcd_tilecomp_t));
     for (compno = 0; compno < tile->numcomps; compno++) {
-      j2k_tccp_t *tccp = &tcp->tccps[compno];
-      tcd_tilecomp_t *tilec = &tile->comps[compno];
+      opj_tccp_t *tccp = &tcp->tccps[compno];
+      opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+
       /* border of each tile component (global) */
-      tilec->x0 = int_ceildiv(tile->x0, img->comps[compno].dx);
-      tilec->y0 = int_ceildiv(tile->y0, img->comps[compno].dy);
-      tilec->x1 = int_ceildiv(tile->x1, img->comps[compno].dx);
-      tilec->y1 = int_ceildiv(tile->y1, img->comps[compno].dy);
-
-      tilec->data =
-        (int *) malloc((tilec->x1 - tilec->x0) *
-             (tilec->y1 - tilec->y0) * sizeof(int));
+      tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
+      tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
+      tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
+      tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
+      
+      tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0) * sizeof(int));
       tilec->numresolutions = tccp->numresolutions;
-      tilec->resolutions =
-        (tcd_resolution_t *) malloc(tilec->numresolutions *
-                sizeof(tcd_resolution_t));
+      tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(tilec->numresolutions * sizeof(opj_tcd_resolution_t));
+
       for (resno = 0; resno < tilec->numresolutions; resno++) {
         int pdx, pdy;
         int levelno = tilec->numresolutions - 1 - resno;
@@ -639,16 +658,17 @@ void tcd_init(j2k_image_t * img, j2k_cp_t * cp)
         int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
         int cbgwidthexpn, cbgheightexpn;
         int cblkwidthexpn, cblkheightexpn;
-        tcd_resolution_t *res = &tilec->resolutions[resno];
 
-   /* border for each resolution level (global) */
+        opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+        
+        /* border for each resolution level (global) */
         res->x0 = int_ceildivpow2(tilec->x0, levelno);
         res->y0 = int_ceildivpow2(tilec->y0, levelno);
         res->x1 = int_ceildivpow2(tilec->x1, levelno);
         res->y1 = int_ceildivpow2(tilec->y1, levelno);
-
         res->numbands = resno == 0 ? 1 : 3;
-   /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
+        
+        /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
         if (tccp->csty & J2K_CCP_CSTY_PRT) {
           pdx = tccp->prcw[resno];
           pdy = tccp->prch[resno];
@@ -656,14 +676,16 @@ void tcd_init(j2k_image_t * img, j2k_cp_t * cp)
           pdx = 15;
           pdy = 15;
         }
-   /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */
+        
+        /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */
         tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
         tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
         brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
         brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
-        res->pw = (res->x0 == res->x1) ? 0 : ((brprcxend - tlprcxstart) >> pdx);   /* Mod Antonin : sizebug1*/
-        res->ph = (res->y0 == res->y1) ? 0 : ((brprcyend - tlprcystart) >> pdy);   /* Mod Antonin : sizebug1*/
 
+        res->pw = (res->x0 == res->x1) ? 0 : ((brprcxend - tlprcxstart) >> pdx);
+        res->ph = (res->y0 == res->y1) ? 0 : ((brprcyend - tlprcystart) >> pdy);
+        
         if (resno == 0) {
           tlcbgxstart = tlprcxstart;
           tlcbgystart = tlprcystart;
@@ -679,365 +701,313 @@ void tcd_init(j2k_image_t * img, j2k_cp_t * cp)
           cbgwidthexpn = pdx - 1;
           cbgheightexpn = pdy - 1;
         }
-
+        
         cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
         cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
-
+        
         for (bandno = 0; bandno < res->numbands; bandno++) {
           int x0b, y0b;
           int gain, numbps;
-          j2k_stepsize_t *ss;
-          tcd_band_t *band = &res->bands[bandno];
+          opj_stepsize_t *ss = NULL;
+
+          opj_tcd_band_t *band = &res->bands[bandno];
           band->bandno = resno == 0 ? 0 : bandno + 1;
           x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
           y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
-
+          
           if (band->bandno == 0) {
-       /* band border (global) */
+            /* band border (global) */
             band->x0 = int_ceildivpow2(tilec->x0, levelno);
             band->y0 = int_ceildivpow2(tilec->y0, levelno);
             band->x1 = int_ceildivpow2(tilec->x1, levelno);
             band->y1 = int_ceildivpow2(tilec->y1, levelno);
           } else {
-       /* band border (global) */
-            band->x0 =
-              int_ceildivpow2(tilec->x0 -
-               (1 << levelno) * x0b, levelno + 1);
-            band->y0 =
-              int_ceildivpow2(tilec->y0 -
-               (1 << levelno) * y0b, levelno + 1);
-            band->x1 =
-              int_ceildivpow2(tilec->x1 -
-               (1 << levelno) * x0b, levelno + 1);
-            band->y1 =
-              int_ceildivpow2(tilec->y1 -
-               (1 << levelno) * y0b, levelno + 1);
+            /* band border (global) */
+            band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
+            band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
+            band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
+            band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
           }
-
-          ss = &tccp->stepsizes[resno ==
-            0 ? 0 : 3 * (resno - 1) + bandno + 1];
-          gain =
-            tccp->qmfbid ==
-            0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
-          numbps = img->comps[compno].prec + gain;
+          
+          ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
+          gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno);
+          numbps = image->comps[compno].prec + gain;
           band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn));
-          band->numbps = ss->expn + tccp->numgbits - 1;   /* WHY -1 ? */
-
-          band->precincts =
-            (tcd_precinct_t *) malloc(res->pw * res->ph *
-                  sizeof(tcd_precinct_t));
-
+          band->numbps = ss->expn + tccp->numgbits - 1;  /* WHY -1 ? */
+          
+          band->precincts = (opj_tcd_precinct_t *) opj_malloc(res->pw * res->ph * sizeof(opj_tcd_precinct_t));
+          
           for (precno = 0; precno < res->pw * res->ph; precno++) {
             int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
-            int cbgxstart =
-              tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
-            int cbgystart =
-              tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
+            int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
+            int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
             int cbgxend = cbgxstart + (1 << cbgwidthexpn);
             int cbgyend = cbgystart + (1 << cbgheightexpn);
-            tcd_precinct_t *prc = &band->precincts[precno];
-       /* precinct size (global) */
+
+            opj_tcd_precinct_t *prc = &band->precincts[precno];
+            /* precinct size (global) */
             prc->x0 = int_max(cbgxstart, band->x0);
             prc->y0 = int_max(cbgystart, band->y0);
             prc->x1 = int_min(cbgxend, band->x1);
             prc->y1 = int_min(cbgyend, band->y1);
-
-            tlcblkxstart =
-              int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
-            tlcblkystart =
-              int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
-            brcblkxend =
-              int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
-            brcblkyend =
-              int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
+            
+            tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
+            tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
+            brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
+            brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
             prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
             prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
-
-            prc->cblks =
-              (tcd_cblk_t *) malloc(prc->cw * prc->ch *
-                sizeof(tcd_cblk_t));
-
+            
+            prc->cblks = (opj_tcd_cblk_t *) opj_malloc(prc->cw * prc->ch * sizeof(opj_tcd_cblk_t));
+            
             prc->incltree = tgt_create(prc->cw, prc->ch);
             prc->imsbtree = tgt_create(prc->cw, prc->ch);
-
+            
             for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
-              int cblkxstart =
-                tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
-              int cblkystart =
-                tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
+              int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
+              int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
               int cblkxend = cblkxstart + (1 << cblkwidthexpn);
-              int cblkyend = cblkystart + (1 << cblkheightexpn);
-              tcd_cblk_t *cblk = &prc->cblks[cblkno];
-         /* code-block size (global) */
+              int cblkyend = cblkystart + (1 << cblkheightexpn);          
+              
+              /* code-block size (global) */
+              opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
               cblk->x0 = int_max(cblkxstart, prc->x0);
               cblk->y0 = int_max(cblkystart, prc->y0);
               cblk->x1 = int_min(cblkxend, prc->x1);
               cblk->y1 = int_min(cblkyend, prc->y1);
             }
-          }
-        }
-      }
-    }
-  }
-  /*tcd_dump(&tcd_image,0);*/
-
-
-  /* Allocate place to store the data decoded = final image */
-  /* Place limited by the tile really present in the codestream */
-
-
-  for (i = 0; i < img->numcomps; i++) {
+          } /* precno */
+        } /* bandno */
+      } /* resno */
+    } /* compno */
+  } /* i = 0..cp->tileno_size */
+
+  /* tcd_dump(stdout, tcd, &tcd->tcd_image); */
+
+  /* 
+  Allocate place to store the decoded data = final image
+  Place limited by the tile really present in the codestream 
+  */
+  
+  for (i = 0; i < image->numcomps; i++) {
     for (j = 0; j < cp->tileno_size; j++) {
       tileno = cp->tileno[j];
-      x0 = j == 0 ? tcd_image.tiles[tileno].comps[i].x0 : int_min(x0,
-                          (unsigned int) 
-                          tcd_image.
-                          tiles
-                          [tileno].
-                          comps
-                          [i].x0);
-      y0 =
-        j == 0 ? tcd_image.tiles[tileno].comps[i].y0 : int_min(y0,
-                            (unsigned int) 
-                            tcd_image.
-                            tiles
-                            [tileno].
-                            comps[i].
-                            y0);
-      x1 =
-        j == 0 ? tcd_image.tiles[tileno].comps[i].x1 : int_max(x1,
-                            (unsigned int) 
-                            tcd_image.
-                            tiles
-                            [tileno].
-                            comps[i].
-                            x1);
-      y1 =
-        j == 0 ? tcd_image.tiles[tileno].comps[i].y1 : int_max(y1,
-                            (unsigned int) 
-                            tcd_image.
-                            tiles
-                            [tileno].
-                            comps[i].
-                            y1);
+      x0 = j == 0 ? tcd->tcd_image->tiles[tileno].comps[i].x0 : int_min(x0,
+        (unsigned int) tcd->tcd_image->tiles[tileno].comps[i].x0);
+      y0 = j == 0 ? tcd->tcd_image->tiles[tileno].comps[i].y0 : int_min(y0,
+        (unsigned int) tcd->tcd_image->tiles[tileno].comps[i].y0);
+      x1 = j == 0 ? tcd->tcd_image->tiles[tileno].comps[i].x1 : int_max(x1,
+        (unsigned int) tcd->tcd_image->tiles[tileno].comps[i].x1);
+      y1 = j == 0 ? tcd->tcd_image->tiles[tileno].comps[i].y1 : int_max(y1, 
+        (unsigned int) tcd->tcd_image->tiles[tileno].comps[i].y1);
     }
-
+    
     w = x1 - x0;
-
     h = y1 - y0;
-    img->comps[i].data = (int *) calloc(w * h, sizeof(int));
-    img->comps[i].w = w;
-    img->comps[i].h = h;
-    img->comps[i].x0 = x0;
-    img->comps[i].y0 = y0;
+    
+    image->comps[i].data = (int *) opj_malloc(w * h * sizeof(int));
+    image->comps[i].w = w;
+    image->comps[i].h = h;
+    image->comps[i].x0 = x0;
+    image->comps[i].y0 = y0;
   }
 }
 
-void tcd_makelayer_fixed(int layno, int final)
-{
+void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final) {
   int compno, resno, bandno, precno, cblkno;
-  int value;         /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3];*/
+  int value;      /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */
   int matrice[10][10][3];
   int i, j, k;
 
-  /*matrice=(int*)malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int)); */
+  opj_cp_t *cp = tcd->cp;
+  opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
+  opj_tcp_t *tcd_tcp = tcd->tcp;
 
+  /*matrice=(int*)opj_malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int)); */
+  
   for (compno = 0; compno < tcd_tile->numcomps; compno++) {
-    tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
+    opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
     for (i = 0; i < tcd_tcp->numlayers; i++) {
       for (j = 0; j < tilec->numresolutions; j++) {
         for (k = 0; k < 3; k++) {
           matrice[i][j][k] =
-            (int) (tcd_cp->
-             matrice[i * tilec->numresolutions * 3 +
-             j * 3 +
-             k] *
-            (float) (tcd_img->comps[compno].prec / 16.0));
+            (int) (cp->matrice[i * tilec->numresolutions * 3 + j * 3 + k] 
+            * (float) (tcd->image->comps[compno].prec / 16.0));
         }
       }
     }
-
+        
     for (resno = 0; resno < tilec->numresolutions; resno++) {
-      tcd_resolution_t *res = &tilec->resolutions[resno];
+      opj_tcd_resolution_t *res = &tilec->resolutions[resno];
       for (bandno = 0; bandno < res->numbands; bandno++) {
-        tcd_band_t *band = &res->bands[bandno];
+        opj_tcd_band_t *band = &res->bands[bandno];
         for (precno = 0; precno < res->pw * res->ph; precno++) {
-          tcd_precinct_t *prc = &band->precincts[precno];
+          opj_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];
+            opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
+            opj_tcd_layer_t *layer = &cblk->layers[layno];
             int n;
-            int imsb = tcd_img->comps[compno].prec - cblk->numbps;   /* number of bit-plan equal to zero */
-       /* Correction of the matrix of coefficient to include the IMSB information */
-
+            int imsb = tcd->image->comps[compno].prec - cblk->numbps;  /* number of bit-plan equal to zero */
+            /* Correction of the matrix of coefficient to include the IMSB information */
             if (layno == 0) {
               value = matrice[layno][resno][bandno];
-              if (imsb >= value)
+              if (imsb >= value) {
                 value = 0;
-              else
+              } else {
                 value -= imsb;
+              }
             } else {
-              value =
-                 matrice[layno][resno][bandno] -
-                 matrice[layno - 1][resno][bandno];
+              value =  matrice[layno][resno][bandno] -  matrice[layno - 1][resno][bandno];
               if (imsb >= matrice[layno - 1][resno][bandno]) {
                 value -= (imsb - matrice[layno - 1][resno][bandno]);
-                if (value < 0)
+                if (value < 0) {
                   value = 0;
+                }
               }
             }
-
-            if (layno == 0)
-               cblk->numpassesinlayers = 0;
-
+            
+            if (layno == 0) {
+              cblk->numpassesinlayers = 0;
+            }
+            
             n = cblk->numpassesinlayers;
             if (cblk->numpassesinlayers == 0) {
-            if (value != 0)
-                 n = 3 * value - 2 + cblk->numpassesinlayers;
-            else
-                   n = cblk->numpassesinlayers;
-            } else
+              if (value != 0) {
+                n = 3 * value - 2 + cblk->numpassesinlayers;
+              } else {
+                n = cblk->numpassesinlayers;
+              }
+            } else {
               n = 3 * value + cblk->numpassesinlayers;
-
+            }
+            
             layer->numpasses = n - cblk->numpassesinlayers;
-
+            
             if (!layer->numpasses)
-               continue;
-
+              continue;
+            
             if (cblk->numpassesinlayers == 0) {
               layer->len = cblk->passes[n - 1].rate;
               layer->data = cblk->data;
             } else {
-              layer->len =
-                   cblk->passes[n - 1].rate -
-                   cblk->passes[cblk->numpassesinlayers - 1].rate;
-              layer->data =
-                   cblk->data +
-                   cblk->passes[cblk->numpassesinlayers - 1].rate;
-           }
-           if (final)
-             cblk->numpassesinlayers = n;
+              layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;
+              layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
+            }
+            if (final)
+              cblk->numpassesinlayers = n;
+          }
         }
-       }
       }
     }
   }
 }
 
-void tcd_rateallocate_fixed()
-{
+void tcd_rateallocate_fixed(opj_tcd_t *tcd) {
   int layno;
-
-  for (layno = 0; layno < tcd_tcp->numlayers; layno++) {
-    tcd_makelayer_fixed(layno, 1);
+  for (layno = 0; layno < tcd->tcp->numlayers; layno++) {
+    tcd_makelayer_fixed(tcd, layno, 1);
   }
 }
 
-void tcd_makelayer(int layno, double thresh, int final)
-{
+void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final) {
   int compno, resno, bandno, precno, cblkno, passno;
+  
+  opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
 
-  tcd_tile->distolayer[layno] = 0;   /*add fixed_quality*/
-
+  tcd_tile->distolayer[layno] = 0;  /* fixed_quality */
+  
   for (compno = 0; compno < tcd_tile->numcomps; compno++) {
-    tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
+    opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
     for (resno = 0; resno < tilec->numresolutions; resno++) {
-      tcd_resolution_t *res = &tilec->resolutions[resno];
+      opj_tcd_resolution_t *res = &tilec->resolutions[resno];
       for (bandno = 0; bandno < res->numbands; bandno++) {
-        tcd_band_t *band = &res->bands[bandno];
+        opj_tcd_band_t *band = &res->bands[bandno];
         for (precno = 0; precno < res->pw * res->ph; precno++) {
-          tcd_precinct_t *prc = &band->precincts[precno];
+          opj_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];
+            opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
+            opj_tcd_layer_t *layer = &cblk->layers[layno];
+            
             int n;
-
             if (layno == 0) {
               cblk->numpassesinlayers = 0;
             }
             n = cblk->numpassesinlayers;
-            for (passno = cblk->numpassesinlayers;
-                 passno < cblk->totalpasses; passno++) {
+            for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) {
               int dr;
               double dd;
-              tcd_pass_t *pass = &cblk->passes[passno];
+              opj_tcd_pass_t *pass = &cblk->passes[passno];
               if (n == 0) {
                 dr = pass->rate;
                 dd = pass->distortiondec;
               } else {
                 dr = pass->rate - cblk->passes[n - 1].rate;
-                dd = pass->distortiondec - cblk->passes[n -
-                     1].distortiondec;
+                dd = pass->distortiondec - cblk->passes[n - 1].distortiondec;
               }
               if (!dr) {
                 if (dd)
                   n = passno + 1;
                 continue;
               }
-
               if (dd / dr >= thresh)
                 n = passno + 1;
-             }
-             layer->numpasses = n - cblk->numpassesinlayers;
-
-             if (!layer->numpasses) {
-               layer->disto = 0;
-               continue;
-             }
-
-             if (cblk->numpassesinlayers == 0) {
-               layer->len = cblk->passes[n - 1].rate;
-               layer->data = cblk->data;
-               layer->disto = cblk->passes[n - 1].distortiondec;
-             } else {
-               layer->len = cblk->passes[n - 1].rate -
-                 cblk->passes[cblk->numpassesinlayers - 1].rate;
-               layer->data =
-                 cblk->data +
-                 cblk->passes[cblk->numpassesinlayers - 1].rate;
-               layer->disto =
-                 cblk->passes[n - 1].distortiondec -
-                 cblk->passes[cblk->numpassesinlayers - 1].distortiondec;
-             }
-
-             tcd_tile->distolayer[layno] += layer->disto;   /*add fixed_quality*/
-
-             if (final)
-               cblk->numpassesinlayers = n;
-           }
-         }
+            }
+            layer->numpasses = n - cblk->numpassesinlayers;
+            
+            if (!layer->numpasses) {
+              layer->disto = 0;
+              continue;
+            }
+            if (cblk->numpassesinlayers == 0) {
+              layer->len = cblk->passes[n - 1].rate;
+              layer->data = cblk->data;
+              layer->disto = cblk->passes[n - 1].distortiondec;
+            } else {
+              layer->len = cblk->passes[n - 1].rate -  cblk->passes[cblk->numpassesinlayers - 1].rate;
+              layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
+              layer->disto = cblk->passes[n - 1].distortiondec - cblk->passes[cblk->numpassesinlayers - 1].distortiondec;
+            }
+            
+            tcd_tile->distolayer[layno] += layer->disto;  /* fixed_quality */
+            
+            if (final)
+              cblk->numpassesinlayers = n;
+          }
+        }
       }
     }
   }
 }
 
-void tcd_rateallocate(unsigned char *dest, int len, info_image * info_IM)
-{
+bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_image_info_t * image_info) {
   int compno, resno, bandno, precno, cblkno, passno, layno;
   double min, max;
-  double cumdisto[100];      /*add fixed_quality*/
-  const double K = 1;      /* 1.1; //add fixed_quality*/
-
+  double cumdisto[100];  /* fixed_quality */
+  const double K = 1;    /* 1.1; // fixed_quality */
   double maxSE = 0;
-  min = DBL_MAX;
-  max = 0;
 
-  tcd_tile->nbpix = 0;      /*add fixed_quality*/
+  opj_cp_t *cp = tcd->cp;
+  opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
+  opj_tcp_t *tcd_tcp = tcd->tcp;
 
+  min = DBL_MAX;
+  max = 0;
+  
+  tcd_tile->nbpix = 0;    /* fixed_quality */
+  
   for (compno = 0; compno < tcd_tile->numcomps; compno++) {
-    tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
-
+    opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
     tilec->nbpix = 0;
     for (resno = 0; resno < tilec->numresolutions; resno++) {
-      tcd_resolution_t *res = &tilec->resolutions[resno];
+      opj_tcd_resolution_t *res = &tilec->resolutions[resno];
       for (bandno = 0; bandno < res->numbands; bandno++) {
-        tcd_band_t *band = &res->bands[bandno];
+        opj_tcd_band_t *band = &res->bands[bandno];
         for (precno = 0; precno < res->pw * res->ph; precno++) {
-          tcd_precinct_t *prc = &band->precincts[precno];
+          opj_tcd_precinct_t *prc = &band->precincts[precno];
           for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
-            tcd_cblk_t *cblk = &prc->cblks[cblkno];
+            opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
             for (passno = 0; passno < cblk->totalpasses; passno++) {
-              tcd_pass_t *pass = &cblk->passes[passno];
+              opj_tcd_pass_t *pass = &cblk->passes[passno];
               int dr;
               double dd, rdslope;
               if (passno == 0) {
@@ -1045,584 +1015,403 @@ void tcd_rateallocate(unsigned char *dest, int len, info_image * info_IM)
                 dd = pass->distortiondec;
               } else {
                 dr = pass->rate - cblk->passes[passno - 1].rate;
-                   dd = pass->distortiondec -
-                   cblk->passes[passno - 1].distortiondec;
+                dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec;
               }
               if (dr == 0) {
                 continue;
               }
-
               rdslope = dd / dr;
-
               if (rdslope < min) {
                 min = rdslope;
               }
               if (rdslope > max) {
-                 max = rdslope;
+                max = rdslope;
               }
-            }         /* passno */
-
-            tcd_tile->nbpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));   /*add fixed_quality*/
-
-            tilec->nbpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));   /*add fixed_quality*/
-
-          }         /* cbklno */
-        }         /* precno */
-      }            /* bandno */
-    }            /* resno */
-    maxSE += (((double)(1 << tcd_img->comps[compno].prec) - 1.0) * ((double)(1 << tcd_img->comps[compno].prec) -1.0)) * ((double)(tilec->nbpix));
-  }            /* compno */
-
+            } /* passno */
+            
+            /* fixed_quality */
+            tcd_tile->nbpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
+            tilec->nbpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
+          } /* cbklno */
+        } /* precno */
+      } /* bandno */
+    } /* resno */
+    
+    maxSE += (((double)(1 << tcd->image->comps[compno].prec) - 1.0) 
+      * ((double)(1 << tcd->image->comps[compno].prec) -1.0)) 
+      * ((double)(tilec->nbpix));
+  } /* compno */
+  
   /* add antonin index */
-  if (info_IM->index_on) {
-    info_tile *info_TL = &info_IM->tile[tcd_tileno];
+  if(image_info && image_info->index_on) {
+    opj_tile_info_t *info_TL = &image_info->tile[tcd->tcd_tileno];
     info_TL->nbpix = tcd_tile->nbpix;
     info_TL->distotile = tcd_tile->distotile;
-    info_TL->thresh =
-      (double *) malloc(tcd_tcp->numlayers * sizeof(double));
+    info_TL->thresh = (double *) opj_malloc(tcd_tcp->numlayers * sizeof(double));
   }
   /* dda */
-
+  
   for (layno = 0; layno < tcd_tcp->numlayers; layno++) {
-    volatile double lo = min;
-    volatile double hi = max;
-    volatile int success = 0;
-    volatile int maxlen = tcd_tcp->rates[layno] ? int_min(tcd_tcp->rates[layno], len) : len;   /*Mod antonin losslessbug*/
-    volatile double goodthresh;
-    volatile int i;
-    double distotarget;      /*add fixed_quality*/
-
-    distotarget = tcd_tile->distotile - ((K * maxSE) / pow(10, tcd_tcp->distoratio[layno] / 10));   /* add fixed_quality*/
+    double lo = min;
+    double hi = max;
+    int success = 0;
+    int maxlen = tcd_tcp->rates[layno] ? int_min(tcd_tcp->rates[layno], len) : len;
+    double goodthresh;
+    int i;
+    double distotarget;    /* fixed_quality */
     
-    if ((tcd_tcp->rates[layno]) || (tcd_cp->disto_alloc==0)) {
+    /* fixed_quality */
+    distotarget = tcd_tile->distotile - ((K * maxSE) / pow((float)10, tcd_tcp->distoratio[layno] / 10));
+        
+    if ((tcd_tcp->rates[layno]) || (cp->disto_alloc==0)) {
+      opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->image, cp);
+
       for (i = 0; i < 32; i++) {
-        volatile double thresh = (lo + hi) / 2;
+        double thresh = (lo + hi) / 2;
         int l = 0;
-        double distoachieved = 0;   /* add fixed_quality*/
-
-        tcd_makelayer(layno, thresh, 0);
-
-        if (tcd_cp->fixed_quality) {   /* add fixed_quality*/
-          distoachieved =
-            layno ==
-            0 ? tcd_tile->distolayer[0] : cumdisto[layno - 1] +
-            tcd_tile->distolayer[layno];
+        double distoachieved = 0;  /* fixed_quality */
+        
+        tcd_makelayer(tcd, layno, thresh, 0);
+        
+        if (cp->fixed_quality) {  /* fixed_quality */
+          distoachieved =  layno == 0 ? 
+            tcd_tile->distolayer[0]  : cumdisto[layno - 1] + tcd_tile->distolayer[layno];
           if (distoachieved < distotarget) {
             hi = thresh;
             continue;
           }
           lo = thresh;
         } else {
-        l =
-           t2_encode_packets(tcd_img, tcd_cp, tcd_tileno, tcd_tile,
-           layno + 1, dest, maxlen, info_IM);
-     /* fprintf(stderr, "rate alloc: len=%d, max=%d\n", l, maxlen); */
-        if (l == -999) {
-          lo = thresh;
-          continue;
+          l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen, image_info);
+          /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */
+          if (l == -999) {
+            lo = thresh;
+            continue;
+          }
+          hi = thresh;
         }
-        hi = thresh;
-      }
-
-      success = 1;
-      goodthresh = thresh;
+        
+        success = 1;
+        goodthresh = thresh;
       }
+      t2_destroy(t2);
     } else {
       success = 1;
       goodthresh = min;
     }
-
+    
     if (!success) {
-      longjmp(j2k_error, 1);
+      return false;
     }
-
-    if (info_IM->index_on) {   /* Threshold for Marcela Index */
-      info_IM->tile[tcd_tileno].thresh[layno] = goodthresh;
+    
+    if(image_info && image_info->index_on) {  /* Threshold for Marcela Index */
+      image_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh;
     }
-    tcd_makelayer(layno, goodthresh, 1);
-
-    cumdisto[layno] = layno == 0 ? tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno];   /* add fixed_quality*/
+    tcd_makelayer(tcd, layno, goodthresh, 1);
+        
+    /* fixed_quality */
+    cumdisto[layno] = layno == 0 ? tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno];  
   }
+
+  return true;
 }
 
-int
-tcd_encode_tile_pxm(int tileno, unsigned char *dest, int len,
-          info_image * info_IM)
-{
+int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_image_info_t * image_info) {
   int compno;
-  int l, i, npck=0;
-  clock_t time7;
-  tcd_tile_t *tile;
-  j2k_tcp_t *tcp = &tcd_cp->tcps[0];
-  j2k_tccp_t *tccp = &tcp->tccps[0];
+  int l, i, npck = 0;
+  double encoding_time;
+  opj_tcd_tile_t *tile = NULL;
+  opj_tcp_t *tcd_tcp = NULL;
+  opj_cp_t *cp = NULL;
+
+  opj_tcp_t *tcp = &tcd->cp->tcps[0];
+  opj_tccp_t *tccp = &tcp->tccps[0];
+  opj_image_t *image = tcd->image;
   
-  tcd_tileno = tileno;
-  tcd_tile = tcd_image.tiles;
-  tcd_tcp = &tcd_cp->tcps[tileno];
-  tile = tcd_tile;
-  /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
-  if (info_IM->index_on) {
-    tcd_tilecomp_t *tilec_idx = &tile->comps[0];   /*Based on Component 0*/
-    
-    for (i = 0; i < tilec_idx->numresolutions; i++) {
-      
-      tcd_resolution_t *res_idx = &tilec_idx->resolutions[i];
-      
-      info_IM->tile[tileno].pw[i] = res_idx->pw;
-      info_IM->tile[tileno].ph[i] = res_idx->ph;
-      
-      npck+=res_idx->pw * res_idx->ph;
-      
-      info_IM->tile[tileno].pdx[i] = tccp->prcw[i];
-      info_IM->tile[tileno].pdy[i] = tccp->prch[i];
-      
-    }
-    info_IM->tile[tileno].packet = (info_packet *) calloc(info_IM->Comp * info_IM->Layer * npck, sizeof(info_packet));
-  }
-  /* << INDEX */
+  opj_t1_t *t1 = NULL;    /* T1 component */
+  opj_t2_t *t2 = NULL;    /* T2 component */
 
-/*---------------TILE-------------------*/
+  tcd->tcd_tileno = tileno;
+  tcd->tcd_tile = tcd->tcd_image->tiles;
+  tcd->tcp = &tcd->cp->tcps[tileno];
 
-  time7 = clock();
+  tile = tcd->tcd_tile;
+  tcd_tcp = tcd->tcp;
+  cp = tcd->cp;
 
-  for (compno = 0; compno < tile->numcomps; compno++) {
-    FILE *src;
-    char tmp[256];
-    int k;
-    unsigned char elmt;
-    int i, j;
-    int tw, w;
-    tcd_tilecomp_t *tilec = &tile->comps[compno];
-    int adjust =
-      tcd_img->comps[compno].sgnd ? 0 : 1 << (tcd_img->comps[compno].
-                     prec - 1);
-    int offset_x, offset_y;
-
-    offset_x = int_ceildiv(tcd_img->x0, tcd_img->comps[compno].dx);
-    offset_y = int_ceildiv(tcd_img->y0, tcd_img->comps[compno].dy);
-    tw = tilec->x1 - tilec->x0;
-    w = int_ceildiv(tcd_img->x1 - tcd_img->x0, tcd_img->comps[compno].dx);
-    sprintf(tmp, "Compo%d", compno);   /* component file */
-    src = fopen(tmp, "rb");
-    if (!src) {
-      fprintf(stderr, "failed to open %s for reading\n", tmp);
-      return 1;
-    }
-
-    /* read the Compo file to extract data of the tile */
-    k = 0;
-    fseek(src, (tilec->x0 - offset_x) + (tilec->y0 - offset_y) * w,
-     SEEK_SET);
-    k = (tilec->x0 - offset_x) + (tilec->y0 - offset_y) * w;
-    for (j = tilec->y0; j < tilec->y1; j++) {
-      for (i = tilec->x0; i < tilec->x1; i++) {
-        if (tcd_tcp->tccps[compno].qmfbid == 1) {
-          elmt = fgetc(src);
-          tilec->data[i - tilec->x0 + (j - tilec->y0) * tw] =
-            elmt - adjust;
-          k++;
-        } else if (tcd_tcp->tccps[compno].qmfbid == 0) {
-          elmt = fgetc(src);
-          tilec->data[i - tilec->x0 + (j - tilec->y0) * tw] =
-            (elmt - adjust) << 13;
-          k++;
-        }
-      }
-      fseek(src, (tilec->x0 - offset_x) + (j + 1 - offset_y) * w - k,
-        SEEK_CUR);
-      k = tilec->x0 - offset_x + (j + 1 - offset_y) * w;
+  /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
+  if(image_info && image_info->index_on) {
+    opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0];  /* based on component 0 */
+    for (i = 0; i < tilec_idx->numresolutions; i++) {
+      opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i];
 
-    }
-    fclose(src);
-  }
+      image_info->tile[tileno].pw[i] = res_idx->pw;
+      image_info->tile[tileno].ph[i] = res_idx->ph;
 
-/*----------------MCT-------------------*/
+      npck += res_idx->pw * res_idx->ph;
 
-  if (tcd_tcp->mct) {
-    if (tcd_tcp->tccps[0].qmfbid == 0) {
-      mct_encode_real(tile->comps[0].data, tile->comps[1].data,
-            tile->comps[2].data,
-            (tile->comps[0].x1 -
-             tile->comps[0].x0) * (tile->comps[0].y1 -
-                    tile->comps[0].y0));
-    } else {
-      mct_encode(tile->comps[0].data, tile->comps[1].data,
-       tile->comps[2].data,
-       (tile->comps[0].x1 -
-        tile->comps[0].x0) * (tile->comps[0].y1 -
-               tile->comps[0].y0));
+      image_info->tile[tileno].pdx[i] = tccp->prcw[i];
+      image_info->tile[tileno].pdy[i] = tccp->prch[i];
     }
+    image_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc(image_info->comp * image_info->layer * npck * sizeof(opj_packet_info_t));
   }
-/*----------------DWT---------------------*/
-
-/* mod Ive*/
-for (compno = 0; compno < tile->numcomps; compno++) {
-  tcd_tilecomp_t *tilec = &tile->comps[compno];
-  if (tcd_tcp->tccps[compno].qmfbid == 1) {
-    dwt_encode(tilec);
-  } else if (tcd_tcp->tccps[compno].qmfbid == 0) {
-    dwt_encode_real(tilec);
-  }
-}
-/* /mod Ive*/
-/*------------------TIER1-----------------*/
-
-  t1_init_luts();
-  t1_encode_cblks(tile, tcd_tcp);
-
-/*-----------RATE-ALLOCATE------------------*/
-  info_IM->index_write = 0;   /* INDEX     */
-
-  if (tcd_cp->disto_alloc || tcd_cp->fixed_quality)   /* mod fixed_quality*/
-    /* Normal Rate/distortion allocation */
-    tcd_rateallocate(dest, len, info_IM);
-  else
-    /* Fixed layer allocation */
-    tcd_rateallocate_fixed();
-
-/*--------------TIER2------------------*/
-  info_IM->index_write = 1;   /* INDEX     */
-  l = t2_encode_packets(tcd_img, tcd_cp, tileno, tile,
-         tcd_tcp->numlayers, dest, len, info_IM);
-/*---------------CLEAN-------------------*/
-
-  time7 = clock() - time7;
-  fprintf(stdout,"total:     %ld.%.3ld s\n", time7 / CLOCKS_PER_SEC,
-    (time7 % (int)CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC);
-
-  /* cleaning memory */
+  /* << INDEX */
+  
+  /*---------------TILE-------------------*/
+  encoding_time = opj_clock();  /* time needed to encode a tile */
+  
   for (compno = 0; compno < tile->numcomps; compno++) {
-    tilec = &tile->comps[compno];
-    free(tilec->data);
-  }
+    int x, y;
 
-  return l;
-}
-
-int
-tcd_encode_tile_pgx(int tileno, unsigned char *dest, int len,
-          info_image * info_IM)
-{
-  int compno;
-  int l, i, npck=0;
-  clock_t time;
-  tcd_tile_t *tile;
-  j2k_tcp_t *tcp = &tcd_cp->tcps[0];
-  j2k_tccp_t *tccp = &tcp->tccps[0];
-  
-  tcd_tileno = tileno;
-  tcd_tile = tcd_image.tiles;
-  tcd_tcp = &tcd_cp->tcps[tileno];
-  tile = tcd_tile;
-  /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
-  if (info_IM->index_on) {
-    tcd_tilecomp_t *tilec_idx = &tile->comps[0];   /*Based on Component 0*/
+    int adjust = image->comps[compno].sgnd ? 0 : 1 << (image->comps[compno].prec - 1);
+    int offset_x = int_ceildiv(image->x0, image->comps[compno].dx);
+    int offset_y = int_ceildiv(image->y0, image->comps[compno].dy);
     
-    for (i = 0; i < tilec_idx->numresolutions; i++) {
-      
-      tcd_resolution_t *res_idx = &tilec_idx->resolutions[i];
-      
-      info_IM->tile[tileno].pw[i] = res_idx->pw;
-      info_IM->tile[tileno].ph[i] = res_idx->ph;
-      
-      npck+=res_idx->pw * res_idx->ph;
-      
-      info_IM->tile[tileno].pdx[i] = tccp->prcw[i];
-      info_IM->tile[tileno].pdy[i] = tccp->prch[i];
-      
-    }
-    info_IM->tile[tileno].packet = (info_packet *) calloc(info_IM->Comp * info_IM->Layer * npck, sizeof(info_packet));
-  }
-  /* << INDEX */
-/*---------------TILE-------------------*/
-  time = clock();
+    opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+    int tw = tilec->x1 - tilec->x0;
+    int w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx);
 
-  for (compno = 0; compno < tile->numcomps; compno++) {
-    FILE *src;
-    char tmp[256];
-    int k;
-    int elmt;
-    int i, j;
-    int tw, w;
-    tcd_tilecomp_t *tilec = &tile->comps[compno];
-    int adjust =
-      tcd_img->comps[compno].sgnd ? 0 : 1 << (tcd_img->comps[compno].
-                     prec - 1);
-    int offset_x, offset_y;
-
-    offset_x = int_ceildiv(tcd_img->x0, tcd_img->comps[compno].dx);
-    offset_y = int_ceildiv(tcd_img->y0, tcd_img->comps[compno].dy);
-    tw = tilec->x1 - tilec->x0;
-    w = int_ceildiv(tcd_img->x1 - tcd_img->x0, tcd_img->comps[compno].dx);
-    sprintf(tmp, "bandtile%d", tileno / tcd_cp->tw + 1);   /* bandtile file opening */
-    src = fopen(tmp, "rb");
-    if (!src) {
-      fprintf(stderr, "failed to open %s for reading\n", tmp);
-      return 1;
-    }
-    /* Extract data from bandtile file limited to the current tile */
-    k = 0;
-    while (k < tilec->x0 - offset_x) {
-      k++;
-      fscanf(src, "%d", &elmt);
-    }
+    /* extract tile data */
 
-    for (j = 0; j < tilec->y1 - tilec->y0; j++) {
-      for (i = tilec->x0; i < tilec->x1; i++) {
-        if (tcd_tcp->tccps[compno].qmfbid == 1) {
-          fscanf(src, "%d", &elmt);
-          tilec->data[i - tilec->x0 + (j) * tw] = elmt - adjust;
-          k++;
-        } else if (tcd_tcp->tccps[compno].qmfbid == 0) {
-          fscanf(src, "%d", &elmt);
-          tilec->data[i - tilec->x0 + (j) * tw] = (elmt - adjust) << 13;
-          k++;
+    if (tcd_tcp->tccps[compno].qmfbid == 1) {
+      for (y = tilec->y0; y < tilec->y1; y++) {
+        /* start of the src tile scanline */
+        int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w];
+        /* start of the dst tile scanline */
+        int *tile_data = &tilec->data[(y - tilec->y0) * tw];
+        for (x = tilec->x0; x < tilec->x1; x++) {
+          *tile_data++ = *data++ - adjust;
         }
       }
-      while (k < tilec->x0 - offset_x + (j + 1) * w) {
-        k++;
-        fscanf(src, "%d", &elmt);
+    } else if (tcd_tcp->tccps[compno].qmfbid == 0) {
+      for (y = tilec->y0; y < tilec->y1; y++) {
+        /* start of the src tile scanline */
+        int *data = &image->comps[compno].data[(tilec->x0 - offset_x) + (y - offset_y) * w];
+        /* start of the dst tile scanline */
+        int *tile_data = &tilec->data[(y - tilec->y0) * tw];
+        for (x = tilec->x0; x < tilec->x1; x++) {
+          *tile_data++ = (*data++ - adjust) << 13;
+        }
       }
     }
-    fclose(src);
   }
-
-/*----------------MCT-------------------*/
-
+  
+  /*----------------MCT-------------------*/
   if (tcd_tcp->mct) {
+    int samples = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0);
     if (tcd_tcp->tccps[0].qmfbid == 0) {
-      mct_encode_real(tile->comps[0].data, tile->comps[1].data,
-            tile->comps[2].data,
-            (tile->comps[0].x1 -
-             tile->comps[0].x0) * (tile->comps[0].y1 -
-                    tile->comps[0].y0));
+      mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples);
     } else {
-      mct_encode(tile->comps[0].data, tile->comps[1].data,
-       tile->comps[2].data,
-       (tile->comps[0].x1 -
-        tile->comps[0].x0) * (tile->comps[0].y1 -
-               tile->comps[0].y0));
+      mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, samples);
     }
   }
+  
+  /*----------------DWT---------------------*/
 
-/*----------------DWT---------------------*/
-
-/* mod Ive*/
-for (compno = 0; compno < tile->numcomps; compno++) {
-  tcd_tilecomp_t *tilec = &tile->comps[compno];
-  if (tcd_tcp->tccps[compno].qmfbid == 1) {
-    dwt_encode(tilec);
-  } else if (tcd_tcp->tccps[compno].qmfbid == 0) {
-    dwt_encode_real(tilec);
+  for (compno = 0; compno < tile->numcomps; compno++) {
+    opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+    if (tcd_tcp->tccps[compno].qmfbid == 1) {
+      dwt_encode(tilec);
+    } else if (tcd_tcp->tccps[compno].qmfbid == 0) {
+      dwt_encode_real(tilec);
+    }
   }
-}
-/* /mod Ive*/
-
-/*------------------TIER1-----------------*/
-
-  t1_init_luts();
-  t1_encode_cblks(tile, tcd_tcp);
-
-/*-----------RATE-ALLOCATE------------------*/
-
-  info_IM->index_write = 0;   /* INDEX */
 
-  if (tcd_cp->disto_alloc || tcd_cp->fixed_quality)   /* mod fixed_quality*/
+  /*------------------TIER1-----------------*/
+  t1 = t1_create(tcd->cinfo);
+  t1_encode_cblks(t1, tile, tcd_tcp);
+  t1_destroy(t1);
+  
+  /*-----------RATE-ALLOCATE------------------*/
 
+  /* INDEX */
+  if(image_info) {
+    image_info->index_write = 0;
+  }
+  if (cp->disto_alloc || cp->fixed_quality) {  /* fixed_quality */
     /* Normal Rate/distortion allocation */
-
-    tcd_rateallocate(dest, len, info_IM);
-
-  else
+    tcd_rateallocate(tcd, dest, len, image_info);
+  } else {
     /* Fixed layer allocation */
+    tcd_rateallocate_fixed(tcd);
+  }
+  
+  /*--------------TIER2------------------*/
 
-    tcd_rateallocate_fixed();
-
-/*--------------TIER2------------------*/
-  info_IM->index_write = 1;   /* INDEX */
-
-  l = t2_encode_packets(tcd_img, tcd_cp, tileno, tile,
-         tcd_tcp->numlayers, dest, len, info_IM);
+  /* INDEX */
+  if(image_info) {
+    image_info->index_write = 1;
+  }
 
- /*---------------CLEAN-------------------*/
-  time = clock() - time;
-  fprintf(stdout,"total:     %ld.%.3ld s\n", time / CLOCKS_PER_SEC,
-    (time % (int)CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC);
+  t2 = t2_create(tcd->cinfo, image, cp);
+  l = t2_encode_packets(t2, tileno, tile, tcd_tcp->numlayers, dest, len, image_info);
+  t2_destroy(t2);
+  
+  /*---------------CLEAN-------------------*/
 
+  encoding_time = opj_clock() - encoding_time;
+  opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", encoding_time);
+  
+  /* cleaning memory */
   for (compno = 0; compno < tile->numcomps; compno++) {
-    tilec = &tile->comps[compno];
-    free(tilec->data);
+    tcd->tilec = &tile->comps[compno];
+    opj_free(tcd->tilec->data);
   }
-
+  
   return l;
 }
 
-
-int tcd_decode_tile(unsigned char *src, int len, int tileno)
-{
+bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno) {
   int l;
   int compno;
   int eof = 0;
-  clock_t time;
-  tcd_tile_t *tile;
-
-  tcd_tileno = tileno;
-  tcd_tile = &tcd_image.tiles[tileno];
-  tcd_tcp = &tcd_cp->tcps[tileno];
-  tile = tcd_tile;
-
-  time = clock();
+  double tile_time, t1_time, dwt_time;
+  opj_tcd_tile_t *tile = NULL;
 
-  fprintf(stdout, "Tile %d of %d decoded in ", tileno + 1,
-     tcd_cp->tw * tcd_cp->th);
-
-   /*--------------TIER2------------------*/
-
-  l = t2_decode_packets(src, len, tcd_img, tcd_cp, tileno, tile);
+  opj_t1_t *t1 = NULL;    /* T1 component */
+  opj_t2_t *t2 = NULL;    /* T2 component */
+  
+  tcd->tcd_tileno = tileno;
+  tcd->tcd_tile = &(tcd->tcd_image->tiles[tileno]);
+  tcd->tcp = &(tcd->cp->tcps[tileno]);
+  tile = tcd->tcd_tile;
+  
+  tile_time = opj_clock();  /* time needed to decode a tile */
+  opj_event_msg(tcd->cinfo, EVT_INFO, "tile %d of %d\n", tileno + 1, tcd->cp->tw * tcd->cp->th);
+  
+  /*--------------TIER2------------------*/
+  
+  t2 = t2_create(tcd->cinfo, tcd->image, tcd->cp);
+  l = t2_decode_packets(t2, src, len, tileno, tile);
+  t2_destroy(t2);
 
   if (l == -999) {
     eof = 1;
-    fprintf(stderr, "tcd_decode: incomplete bistream\n");
+    opj_event_msg(tcd->cinfo, EVT_ERROR, "tcd_decode: incomplete bistream\n");
   }
+  
+  /*------------------TIER1-----------------*/
+  
+  t1_time = opj_clock();  /* time needed to decode a tile */
+  t1 = t1_create(tcd->cinfo);
+  t1_decode_cblks(t1, tile, tcd->tcp);
+  t1_destroy(t1);
+  t1_time = opj_clock() - t1_time;
+  opj_event_msg(tcd->cinfo, EVT_INFO, "- tiers-1 took %f s\n", t1_time);
+  
+  /*----------------DWT---------------------*/
 
-   /*------------------TIER1-----------------*/
-  t1_init_luts();
-  t1_decode_cblks(tile, tcd_tcp);
-
-   /*----------------DWT---------------------*/
-
+  dwt_time = opj_clock();  /* time needed to decode a tile */
   for (compno = 0; compno < tile->numcomps; compno++) {
-    tcd_tilecomp_t *tilec = &tile->comps[compno];
-    if (tcd_cp->reduce != 0) {
-      tcd_img->comps[compno].resno_decoded =
-        tile->comps[compno].numresolutions - tcd_cp->reduce - 1;
+    opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+    if (tcd->cp->reduce != 0) {
+      tcd->image->comps[compno].resno_decoded =
+        tile->comps[compno].numresolutions - tcd->cp->reduce - 1;
     }
-    /* mod Ive  */
-    if (tcd_tcp->tccps[compno].qmfbid == 1) {
-      dwt_decode(tilec, 
-                 tilec->numresolutions - 1 - 
-                 tcd_img->comps[compno].resno_decoded);
+        
+    if (tcd->tcp->tccps[compno].qmfbid == 1) {
+      dwt_decode(tilec, tilec->numresolutions - 1 - tcd->image->comps[compno].resno_decoded);
     } else {
-      dwt_decode_real(tilec,
-            tilec->numresolutions - 1 -
-            tcd_img->comps[compno].resno_decoded);
+      dwt_decode_real(tilec, tilec->numresolutions - 1 - tcd->image->comps[compno].resno_decoded);
     }
-    /* /mod Ive*/
-    
-    if (tile->comps[compno].numresolutions > 0)
-      tcd_img->comps[compno].factor =
-        tile->comps[compno].numresolutions -
-        (tcd_img->comps[compno].resno_decoded + 1);
-  }
-
-   /*----------------MCT-------------------*/
 
-  if (tcd_tcp->mct) {
-    if (tcd_tcp->tccps[0].qmfbid == 1) {
-      mct_decode(tile->comps[0].data, tile->comps[1].data,
-        tile->comps[2].data,
-       (tile->comps[0].x1 -
-        tile->comps[0].x0) * (tile->comps[0].y1 -
-               tile->comps[0].y0));
+    if (tile->comps[compno].numresolutions > 0) {
+      tcd->image->comps[compno].factor = tile->comps[compno].numresolutions - (tcd->image->comps[compno].resno_decoded + 1);
+    }
+  }
+  dwt_time = opj_clock() - dwt_time;
+  opj_event_msg(tcd->cinfo, EVT_INFO, "- dwt took %f s\n", dwt_time);
+  
+  /*----------------MCT-------------------*/
+  
+  if (tcd->tcp->mct) {
+    if (tcd->tcp->tccps[0].qmfbid == 1) {
+      mct_decode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, 
+        (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0));
     } else {
-      mct_decode_real(tile->comps[0].data, tile->comps[1].data,
-            tile->comps[2].data,
-            (tile->comps[0].x1 -
-             tile->comps[0].x0) * (tile->comps[0].y1 -
-                    tile->comps[0].y0));
+      mct_decode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, 
+        (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0));
     }
   }
-
-   /*---------------TILE-------------------*/
-
+  
+  /*---------------TILE-------------------*/
+  
   for (compno = 0; compno < tile->numcomps; compno++) {
-    tcd_tilecomp_t *tilec = &tile->comps[compno];
-    tcd_resolution_t *res =
-      &tilec->resolutions[tcd_img->comps[compno].resno_decoded];
-    int adjust =
-      tcd_img->comps[compno].sgnd ? 0 : 1 << (tcd_img->comps[compno].
-                     prec - 1);
-    int min =
-      tcd_img->comps[compno].
-      sgnd ? -(1 << (tcd_img->comps[compno].prec - 1)) : 0;
-    int max =
-      tcd_img->comps[compno].
-      sgnd ? (1 << (tcd_img->comps[compno].prec - 1)) -
-      1 : (1 << tcd_img->comps[compno].prec) - 1;
-
+    opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+    opj_tcd_resolution_t *res =  &tilec->resolutions[tcd->image->comps[compno].resno_decoded];
+    int adjust = tcd->image->comps[compno].sgnd ? 0 : 1 << (tcd->image->comps[compno].prec - 1);
+    int min = tcd->image->comps[compno].sgnd ? 
+      -(1 << (tcd->image->comps[compno].prec - 1)) : 0;
+    int max = tcd->image->comps[compno].sgnd ? 
+      (1 << (tcd->image->comps[compno].prec - 1)) - 1 : (1 << tcd->image->comps[compno].prec) - 1;
+    
     int tw = tilec->x1 - tilec->x0;
-    int w = tcd_img->comps[compno].w;
-
+    int w = tcd->image->comps[compno].w;
+    
     int i, j;
-    int offset_x = int_ceildivpow2(tcd_img->comps[compno].x0,
-               tcd_img->comps[compno].factor);
-    int offset_y = int_ceildivpow2(tcd_img->comps[compno].y0,
-               tcd_img->comps[compno].factor);
-
+    int offset_x = int_ceildivpow2(tcd->image->comps[compno].x0, tcd->image->comps[compno].factor);
+    int offset_y = int_ceildivpow2(tcd->image->comps[compno].y0, tcd->image->comps[compno].factor);
+    
     for (j = res->y0; j < res->y1; j++) {
       for (i = res->x0; i < res->x1; i++) {
-
         int v;
-        double tmp = (tilec->data[i - res->x0 + (j - res->y0) * tw])/8192.0;
-        int tmp2;
-        
-        if (tcd_tcp->tccps[compno].qmfbid == 1) {
+        float tmp = (float)((tilec->data[i - res->x0 + (j - res->y0) * tw]) / 8192.0);
+
+        if (tcd->tcp->tccps[compno].qmfbid == 1) {
           v = tilec->data[i - res->x0 + (j - res->y0) * tw];
         } else {
-          tmp2=((int) (floor(fabs(tmp)))) + ((int) floor(fabs(tmp*2))%2);
-          v = ((tmp<0)?-tmp2:tmp2);
+          int tmp2 = ((int) (floor(fabs(tmp)))) + ((int) floor(fabs(tmp*2))%2);
+          v = ((tmp < 0) ? -tmp2:tmp2);
         }
-        
         v += adjust;
-
-        tcd_img->comps[compno].data[(i - offset_x) +
-                (j - offset_y) * w] =
-                int_clamp(v, min, max);
+        
+        tcd->image->comps[compno].data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max);
       }
     }
   }
-
-  time = clock() - time;
-  fprintf(stdout, "%ld.%.3ld s\n", time / CLOCKS_PER_SEC,
-     (time % (int)CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC);
-
+  
+  tile_time = opj_clock() - tile_time;  /* time needed to decode a tile */
+  opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time);
+    
   for (compno = 0; compno < tile->numcomps; compno++) {
-    free(tcd_image.tiles[tileno].comps[compno].data);
+    opj_free(tcd->tcd_image->tiles[tileno].comps[compno].data);
+    tcd->tcd_image->tiles[tileno].comps[compno].data = NULL;
   }
-
+  
   if (eof) {
-    longjmp(j2k_error, 1);
+    return false;
   }
-
-  return l;
+  
+  return true;
 }
 
-
-
-void tcd_dec_release()
-
-{
+void tcd_free_decode(opj_tcd_t *tcd) {
   int tileno,compno,resno,bandno,precno;
-  for (tileno=0;tileno<tcd_image.tw*tcd_image.th;tileno++) {
-    tcd_tile_t tile=tcd_image.tiles[tileno];
-    for (compno=0;compno<tile.numcomps;compno++) {
-      tcd_tilecomp_t tilec=tile.comps[compno];
-      for (resno=0;resno<tilec.numresolutions;resno++) {
-        tcd_resolution_t res=tilec.resolutions[resno];
-        for (bandno=0;bandno<res.numbands;bandno++) {
-          tcd_band_t band=res.bands[bandno];
-          for (precno=0;precno<res.ph*res.pw;precno++) {
-            tcd_precinct_t prec=band.precincts[precno];
-            if (prec.cblks!=NULL) free(prec.cblks);
-            if (prec.imsbtree!=NULL) free(prec.imsbtree);
-            if (prec.incltree!=NULL) free(prec.incltree);
+
+  opj_tcd_image_t *tcd_image = tcd->tcd_image;
+  
+  for (tileno = 0; tileno < tcd_image->tw * tcd_image->th; tileno++) {
+    opj_tcd_tile_t *tile = &tcd_image->tiles[tileno];
+    for (compno = 0; compno < tile->numcomps; compno++) {
+      opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+      for (resno = 0; resno < tilec->numresolutions; resno++) {
+        opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+        for (bandno = 0; bandno < res->numbands; bandno++) {
+          opj_tcd_band_t *band = &res->bands[bandno];
+          for (precno = 0; precno < res->ph * res->pw; precno++) {
+            opj_tcd_precinct_t *prec = &band->precincts[precno];
+            if (prec->cblks != NULL) opj_free(prec->cblks);
+            if (prec->imsbtree != NULL) tgt_destroy(prec->imsbtree);
+            if (prec->incltree != NULL) tgt_destroy(prec->incltree);
           }
-          if (band.precincts!=NULL) free(band.precincts);
+          if (band->precincts != NULL) opj_free(band->precincts);
         }
       }
-      if (tilec.resolutions!=NULL) free(tilec.resolutions);
+      if (tilec->resolutions != NULL) opj_free(tilec->resolutions);
     }
-    if (tile.comps!=NULL) free(tile.comps);
+    if (tile->comps != NULL) opj_free(tile->comps);
   }
-  if (tcd_image.tiles!=NULL) free(tcd_image.tiles);
+
+  if (tcd_image->tiles != NULL) opj_free(tcd_image->tiles);
 }
+
index a05d9755bcbf712b2ad95c7c787f0018d569c321..6f94de616d76c526c9d5a81b4618c56c38b9eb5f 100644 (file)
-/*
- * 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 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;
-  float 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);
-
-void tcd_dec_release();
-
-#endif
-
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#ifndef __TCD_H\r
+#define __TCD_H\r
+/**\r
+@file tcd.h\r
+@brief Implementation of a tile coder/decoder (TCD)\r
+\r
+The functions in TCD.C have for goal to encode or decode each tile independently from\r
+each other. The functions in TCD.C are used by some function in J2K.C.\r
+*/\r
+\r
+/** @defgroup TCD TCD - Implementation of a tile coder/decoder */\r
+/*@{*/\r
+\r
+/**\r
+FIXME: documentation\r
+*/\r
+typedef struct opj_tcd_seg {\r
+  int numpasses;\r
+  int len;\r
+  unsigned char *data;\r
+  int maxpasses;\r
+  int numnewpasses;\r
+  int newlen;\r
+} opj_tcd_seg_t;\r
+\r
+/**\r
+FIXME: documentation\r
+*/\r
+typedef struct opj_tcd_pass {\r
+  int rate;\r
+  double distortiondec;\r
+  int term, len;\r
+} opj_tcd_pass_t;\r
+\r
+/**\r
+FIXME: documentation\r
+*/\r
+typedef struct opj_tcd_layer {\r
+  int numpasses;    /* Number of passes in the layer */\r
+  int len;      /* len of information */\r
+  double disto;      /* add for index (Cfr. Marcela) */\r
+  unsigned char *data;    /* data */\r
+} opj_tcd_layer_t;\r
+\r
+/**\r
+FIXME: documentation\r
+*/\r
+typedef struct opj_tcd_cblk {\r
+  int x0, y0, x1, y1;    /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */\r
+  int numbps;\r
+  int numlenbits;\r
+  int len;      /* length */\r
+  int numpasses;    /* number of pass already done for the code-blocks */\r
+  int numnewpasses;    /* number of pass added to the code-blocks */\r
+  int numsegs;      /* number of segments */\r
+  opj_tcd_seg_t segs[100];    /* segments informations */\r
+  unsigned char data[8192];  /* Data */\r
+  int numpassesinlayers;  /* number of passes in the layer */\r
+  opj_tcd_layer_t layers[100];  /* layer information */\r
+  int totalpasses;    /* total number of passes */\r
+  opj_tcd_pass_t passes[100];  /* information about the passes */\r
+} opj_tcd_cblk_t;\r
+\r
+/**\r
+FIXME: documentation\r
+*/\r
+typedef struct opj_tcd_precinct {\r
+  int x0, y0, x1, y1;    /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */\r
+  int cw, ch;      /* number of precinct in width and heigth */\r
+  opj_tcd_cblk_t *cblks;    /* code-blocks informations */\r
+  opj_tgt_tree_t *incltree;    /* inclusion tree */\r
+  opj_tgt_tree_t *imsbtree;    /* IMSB tree */\r
+} opj_tcd_precinct_t;\r
+\r
+/**\r
+FIXME: documentation\r
+*/\r
+typedef struct opj_tcd_band {\r
+  int x0, y0, x1, y1;    /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */\r
+  int bandno;\r
+  opj_tcd_precinct_t *precincts;  /* precinct information */\r
+  int numbps;\r
+  float stepsize;\r
+} opj_tcd_band_t;\r
+\r
+/**\r
+FIXME: documentation\r
+*/\r
+typedef struct opj_tcd_resolution {\r
+  int x0, y0, x1, y1;    /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */\r
+  int pw, ph;\r
+  int numbands;      /* number sub-band for the resolution level */\r
+  opj_tcd_band_t bands[3];    /* subband information */\r
+} opj_tcd_resolution_t;\r
+\r
+/**\r
+FIXME: documentation\r
+*/\r
+typedef struct opj_tcd_tilecomp {\r
+  int x0, y0, x1, y1;    /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */\r
+  int numresolutions;    /* number of resolutions level */\r
+  opj_tcd_resolution_t *resolutions;  /* resolutions information */\r
+  int *data;      /* data of the component */\r
+  int nbpix;      /* add fixed_quality */\r
+} opj_tcd_tilecomp_t;\r
+\r
+/**\r
+FIXME: documentation\r
+*/\r
+typedef struct opj_tcd_tile {\r
+  int x0, y0, x1, y1;    /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */\r
+  int numcomps;      /* number of components in tile */\r
+  opj_tcd_tilecomp_t *comps;  /* Components information */\r
+  int nbpix;      /* add fixed_quality */\r
+  double distotile;    /* add fixed_quality */\r
+  double distolayer[100];  /* add fixed_quality */\r
+} opj_tcd_tile_t;\r
+\r
+/**\r
+FIXME: documentation\r
+*/\r
+typedef struct opj_tcd_image {\r
+  int tw, th;      /* number of tiles in width and heigth */\r
+  opj_tcd_tile_t *tiles;    /* Tiles information */\r
+} opj_tcd_image_t;\r
+\r
+/**\r
+Tile coder/decoder\r
+*/\r
+typedef struct opj_tcd {\r
+  /** codec context */\r
+  opj_common_ptr cinfo;\r
+\r
+  /** info on each image tile */\r
+  opj_tcd_image_t *tcd_image;\r
+  /** image */\r
+  opj_image_t *image;\r
+  /** coding parameters */\r
+  opj_cp_t *cp;\r
+  /** pointer to the current encoded/decoded tile */\r
+  opj_tcd_tile_t *tcd_tile;\r
+  /** coding/decoding parameters common to all tiles */\r
+  opj_tcp_t *tcp;\r
+  /** current encoded/decoded tile */\r
+  int tcd_tileno;\r
+  /**@name working variables */\r
+  /*@{*/\r
+  opj_tcd_tile_t *tile;\r
+  opj_tcd_tilecomp_t *tilec;\r
+  opj_tcd_resolution_t *res;\r
+  opj_tcd_band_t *band;\r
+  opj_tcd_precinct_t *prc;\r
+  opj_tcd_cblk_t *cblk;\r
+  /*@}*/\r
+} opj_tcd_t;\r
+\r
+/** @name Exported functions */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+\r
+/**\r
+Dump the content of a tcd structure\r
+*/\r
+void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);\r
+/**\r
+Create a new TCD handle\r
+@param cinfo Codec context info\r
+@return Returns a new TCD handle if successful returns NULL otherwise\r
+*/\r
+opj_tcd_t* tcd_create(opj_common_ptr cinfo);\r
+/**\r
+Destroy a previously created TCD handle\r
+@param tcd TCD handle to destroy\r
+*/\r
+void tcd_destroy(opj_tcd_t *tcd);\r
+/**\r
+Initialize the tile coder (allocate the memory)\r
+@param tcd TCD handle\r
+@param image Raw image\r
+@param cp Coding parameters\r
+@param curtileno Number that identifies the tile that will be encoded\r
+*/\r
+void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno);\r
+/**\r
+Free the memory allocated for encoding\r
+@param tcd TCD handle\r
+*/\r
+void tcd_free_encode(opj_tcd_t *tcd);\r
+/**\r
+Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode)\r
+@param tcd TCD handle\r
+@param image Raw image\r
+@param cp Coding parameters\r
+@param curtileno Number that identifies the tile that will be encoded\r
+*/\r
+void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno);\r
+/**\r
+Initialize the tile decoder\r
+@param tcd TCD handle\r
+@param image Raw image\r
+@param cp Coding parameters\r
+*/\r
+void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp);\r
+void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final);\r
+void tcd_rateallocate_fixed(opj_tcd_t *tcd);\r
+void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final);\r
+bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_image_info_t * image_info);\r
+/**\r
+Encode a tile from the raw image into a buffer\r
+@param tcd TCD handle\r
+@param tileno Number that identifies one of the tiles to be encoded\r
+@param dest Destination buffer\r
+@param len Length of destination buffer\r
+@param image_info Creation of index file\r
+@return \r
+*/\r
+int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_image_info_t * image_info);\r
+/**\r
+Decode a tile from a buffer into a raw image\r
+@param tcd TCD handle\r
+@param src Source buffer\r
+@param len Length of source buffer\r
+@param tileno Number that identifies one of the tiles to be decoded\r
+*/\r
+bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno);\r
+/**\r
+Free the memory allocated for decoding\r
+@param tcd TCD handle\r
+*/\r
+void tcd_free_decode(opj_tcd_t *tcd);\r
+\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __TCD_H */\r
index 66d4d82b817aa09e2782d390b3f9bf6402935a76..f63f9f962b9ead8ded648ea43b6182117c57b918 100644 (file)
-/*
- * 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;
-}
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#include "opj_includes.h"\r
+\r
+/* \r
+==========================================================\r
+   Tag-tree coder interface\r
+==========================================================\r
+*/\r
+\r
+opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) {\r
+  int nplh[32];\r
+  int nplv[32];\r
+  opj_tgt_node_t *node = NULL;\r
+  opj_tgt_node_t *parentnode = NULL;\r
+  opj_tgt_node_t *parentnode0 = NULL;\r
+  opj_tgt_tree_t *tree = NULL;\r
+  int i, j, k;\r
+  int numlvls;\r
+  int n;\r
+\r
+  tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t));\r
+  if(!tree) return NULL;\r
+  tree->numleafsh = numleafsh;\r
+  tree->numleafsv = numleafsv;\r
+\r
+  numlvls = 0;\r
+  nplh[0] = numleafsh;\r
+  nplv[0] = numleafsv;\r
+  tree->numnodes = 0;\r
+  do {\r
+    n = nplh[numlvls] * nplv[numlvls];\r
+    nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2;\r
+    nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2;\r
+    tree->numnodes += n;\r
+    ++numlvls;\r
+  } while (n > 1);\r
+  \r
+  /* ADD */\r
+  if (tree->numnodes == 0) {\r
+    opj_free(tree);\r
+    return NULL;\r
+  }\r
+\r
+  tree->nodes = (opj_tgt_node_t *) opj_malloc(tree->numnodes * sizeof(opj_tgt_node_t));\r
+  if(!tree->nodes) {\r
+    opj_free(tree);\r
+    return NULL;\r
+  }\r
+\r
+  node = tree->nodes;\r
+  parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv];\r
+  parentnode0 = parentnode;\r
+  \r
+  for (i = 0; i < numlvls - 1; ++i) {\r
+    for (j = 0; j < nplv[i]; ++j) {\r
+      k = nplh[i];\r
+      while (--k >= 0) {\r
+        node->parent = parentnode;\r
+        ++node;\r
+        if (--k >= 0) {\r
+          node->parent = parentnode;\r
+          ++node;\r
+        }\r
+        ++parentnode;\r
+      }\r
+      if ((j & 1) || j == nplv[i] - 1) {\r
+        parentnode0 = parentnode;\r
+      } else {\r
+        parentnode = parentnode0;\r
+        parentnode0 += nplh[i];\r
+      }\r
+    }\r
+  }\r
+  node->parent = 0;\r
+  \r
+  tgt_reset(tree);\r
+  \r
+  return tree;\r
+}\r
+\r
+void tgt_destroy(opj_tgt_tree_t *tree) {\r
+  opj_free(tree->nodes);\r
+  opj_free(tree);\r
+}\r
+\r
+void tgt_reset(opj_tgt_tree_t *tree) {\r
+  int i;\r
+\r
+  if (NULL == tree)\r
+    return;\r
+  \r
+  for (i = 0; i < tree->numnodes; i++) {\r
+    tree->nodes[i].value = 999;\r
+    tree->nodes[i].low = 0;\r
+    tree->nodes[i].known = 0;\r
+  }\r
+}\r
+\r
+void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) {\r
+  opj_tgt_node_t *node;\r
+  node = &tree->nodes[leafno];\r
+  while (node && node->value > value) {\r
+    node->value = value;\r
+    node = node->parent;\r
+  }\r
+}\r
+\r
+void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) {\r
+  opj_tgt_node_t *stk[31];\r
+  opj_tgt_node_t **stkptr;\r
+  opj_tgt_node_t *node;\r
+  int low;\r
+\r
+  stkptr = stk;\r
+  node = &tree->nodes[leafno];\r
+  while (node->parent) {\r
+    *stkptr++ = node;\r
+    node = node->parent;\r
+  }\r
+  \r
+  low = 0;\r
+  for (;;) {\r
+    if (low > node->low) {\r
+      node->low = low;\r
+    } else {\r
+      low = node->low;\r
+    }\r
+    \r
+    while (low < threshold) {\r
+      if (low >= node->value) {\r
+        if (!node->known) {\r
+          bio_write(bio, 1, 1);\r
+          node->known = 1;\r
+        }\r
+        break;\r
+      }\r
+      bio_write(bio, 0, 1);\r
+      ++low;\r
+    }\r
+    \r
+    node->low = low;\r
+    if (stkptr == stk)\r
+      break;\r
+    node = *--stkptr;\r
+  }\r
+}\r
+\r
+int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) {\r
+  opj_tgt_node_t *stk[31];\r
+  opj_tgt_node_t **stkptr;\r
+  opj_tgt_node_t *node;\r
+  int low;\r
+\r
+  stkptr = stk;\r
+  node = &tree->nodes[leafno];\r
+  while (node->parent) {\r
+    *stkptr++ = node;\r
+    node = node->parent;\r
+  }\r
+  \r
+  low = 0;\r
+  for (;;) {\r
+    if (low > node->low) {\r
+      node->low = low;\r
+    } else {\r
+      low = node->low;\r
+    }\r
+    while (low < threshold && low < node->value) {\r
+      if (bio_read(bio, 1)) {\r
+        node->value = low;\r
+      } else {\r
+        ++low;\r
+      }\r
+    }\r
+    node->low = low;\r
+    if (stkptr == stk) {\r
+      break;\r
+    }\r
+    node = *--stkptr;\r
+  }\r
+  \r
+  return (node->value < threshold) ? 1 : 0;\r
+}\r
index d7b5ab7eb6fe7e3705fd2f6a7835c9afefdf1010..c77e027a133a11e749fdc3072f67968c84b556f2 100644 (file)
-/*
- * 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
+/*\r
+ * Copyright (c) 2001-2003, David Janssens\r
+ * Copyright (c) 2002-2003, Yannick Verschueren\r
+ * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe\r
+ * Copyright (c) 2005, HervĂ© Drolon, FreeImage Team\r
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+#ifndef __TGT_H\r
+#define __TGT_H\r
+/**\r
+@file tgt.h\r
+@brief Implementation of a tag-tree coder (TGT)\r
+\r
+The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C\r
+are used by some function in T2.C.\r
+*/\r
+\r
+/** @defgroup TGT TGT - Implementation of a tag-tree coder */\r
+/*@{*/\r
+\r
+/**\r
+Tag node\r
+*/\r
+typedef struct opj_tgt_node {\r
+  struct opj_tgt_node *parent;\r
+  int value;\r
+  int low;\r
+  int known;\r
+} opj_tgt_node_t;\r
+\r
+/**\r
+Tag tree\r
+*/\r
+typedef struct opj_tgt_tree {\r
+  int numleafsh;\r
+  int numleafsv;\r
+  int numnodes;\r
+  opj_tgt_node_t *nodes;\r
+} opj_tgt_tree_t;\r
+\r
+/** @name Exported functions */\r
+/*@{*/\r
+/* ----------------------------------------------------------------------- */\r
+/**\r
+Create a tag-tree\r
+@param numleafsh Width of the array of leafs of the tree\r
+@param numleafsv Height of the array of leafs of the tree\r
+@return Returns a new tag-tree if successful, returns NULL otherwise\r
+*/\r
+opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv);\r
+/**\r
+Destroy a tag-tree, liberating memory\r
+@param tree Tag-tree to destroy\r
+*/\r
+void tgt_destroy(opj_tgt_tree_t *tree);\r
+/**\r
+Reset a tag-tree (set all leaves to 0)\r
+@param tree Tag-tree to reset\r
+*/\r
+void tgt_reset(opj_tgt_tree_t *tree);\r
+/**\r
+Set the value of a leaf of a tag-tree\r
+@param tree Tag-tree to modify\r
+@param leafno Number that identifies the leaf to modify\r
+@param value New value of the leaf\r
+*/\r
+void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value);\r
+/**\r
+Encode the value of a leaf of the tag-tree up to a given threshold\r
+@param bio Pointer to a BIO handle\r
+@param tree Tag-tree to modify\r
+@param leafno Number that identifies the leaf to encode\r
+@param threshold Threshold to use when encoding value of the leaf\r
+*/\r
+void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold);\r
+/**\r
+Decode the value of a leaf of the tag-tree up to a given threshold\r
+@param bio Pointer to a BIO handle\r
+@param tree Tag-tree to decode\r
+@param leafno Number that identifies the leaf to decode\r
+@param threshold Threshold to use when decoding value of the leaf\r
+@return Returns 1 if the node's value < threshold, returns 0 otherwise\r
+*/\r
+int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold);\r
+/* ----------------------------------------------------------------------- */\r
+/*@}*/\r
+\r
+/*@}*/\r
+\r
+#endif /* __TGT_H */\r