]> Creatis software - gdcm.git/commitdiff
BUG: No cvs script to make sure this is unix eol
authormalaterre <malaterre>
Tue, 24 Jan 2006 19:55:32 +0000 (19:55 +0000)
committermalaterre <malaterre>
Tue, 24 Jan 2006 19:55:32 +0000 (19:55 +0000)
41 files changed:
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/bio.c
src/gdcmopenjpeg/libopenjpeg/bio.h
src/gdcmopenjpeg/libopenjpeg/cio.h
src/gdcmopenjpeg/libopenjpeg/dwt.c
src/gdcmopenjpeg/libopenjpeg/dwt.h
src/gdcmopenjpeg/libopenjpeg/event.c
src/gdcmopenjpeg/libopenjpeg/event.h
src/gdcmopenjpeg/libopenjpeg/fix.c
src/gdcmopenjpeg/libopenjpeg/fix.h
src/gdcmopenjpeg/libopenjpeg/image.c
src/gdcmopenjpeg/libopenjpeg/image.h
src/gdcmopenjpeg/libopenjpeg/int.c
src/gdcmopenjpeg/libopenjpeg/int.h
src/gdcmopenjpeg/libopenjpeg/j2k.h
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
src/gdcmopenjpeg/libopenjpeg/openjpeg.h
src/gdcmopenjpeg/libopenjpeg/opj_includes.h
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.h
src/gdcmopenjpeg/libopenjpeg/tgt.c
src/gdcmopenjpeg/libopenjpeg/tgt.h

index 8b6c67ed3e6bcd6a4f72df1e23c9d114e3291a2b..58c6143b9c6d922e049f5ac394d218cb01dd6f8d 100644 (file)
-/*\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
+/*
+ * 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(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 */
+}
index b5cdc35d8f528f8f857c4b7096faf21b10ff1008..c2b4dddef913730a31eb3235a8f5a5e9f538a148 100644 (file)
@@ -1,14 +1,14 @@
-/* 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
+/* 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_ */
index 06b460aeca8721974fc8edfa161b8cdfb675e8eb..b65dd064bdc72715a690bff1baaf7fcd9470eb26 100644 (file)
-/*\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
+/*
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "openjpeg.h"
+
+/*
+ * Get logarithm of an integer and round downwards.
+ *
+ * log2(a)
+ */
+static int int_floorlog2(int a) {
+  int l;
+  for (l = 0; a > 1; l++) {
+    a >>= 1;
+  }
+  return l;
+}
+
+/*
+ * Divide an integer by a power of 2 and round upwards.
+ *
+ * a divided by 2^b
+ */
+static int int_ceildivpow2(int a, int b) {
+  return (a + (1 << b) - 1) >> b;
+}
+
+/*
+ * Divide an integer and round upwards.
+ *
+ * a divided by b
+ */
+static int int_ceildiv(int a, int b) {
+  return (a + b - 1) / b;
+}
+
+/* -->> -->> -->> -->>
+
+  BMP IMAGE FORMAT
+
+ <<-- <<-- <<-- <<-- */
+
+/* WORD defines a two byte word */
+typedef unsigned short int WORD;
+
+/* DWORD defines a four byte word */
+typedef unsigned long int DWORD;
+
+typedef struct {
+  WORD bfType;      /* 'BM' for Bitmap (19776) */
+  DWORD bfSize;      /* Size of the file        */
+  WORD bfReserved1;    /* Reserved : 0            */
+  WORD bfReserved2;    /* Reserved : 0            */
+  DWORD bfOffBits;    /* Offset                  */
+} BITMAPFILEHEADER_t;
+
+typedef struct {
+  DWORD biSize;      /* Size of the structure in bytes */
+  DWORD biWidth;    /* Width of the image in pixels */
+  DWORD biHeight;    /* Heigth of the image in pixels */
+  WORD biPlanes;    /* 1 */
+  WORD biBitCount;    /* Number of color bits by pixels */
+  DWORD biCompression;    /* Type of encoding 0: none 1: RLE8 2: RLE4 */
+  DWORD biSizeImage;    /* Size of the image in bytes */
+  DWORD biXpelsPerMeter;  /* Horizontal (X) resolution in pixels/meter */
+  DWORD biYpelsPerMeter;  /* Vertical (Y) resolution in pixels/meter */
+  DWORD biClrUsed;    /* Number of color used in the image (0: ALL) */
+  DWORD biClrImportant;    /* Number of important color (0: ALL) */
+} BITMAPINFOHEADER_t;
+
+opj_image_t* bmptoimage(char *filename, opj_cparameters_t *parameters) {
+  int subsampling_dx = parameters->subsampling_dx;
+  int subsampling_dy = parameters->subsampling_dy;
+
+  int i, numcomps, w, h;
+  OPJ_COLOR_SPACE color_space;
+  opj_image_cmptparm_t cmptparm[3];  /* maximum of 3 components */
+  opj_image_t * image = NULL;
+
+  FILE *IN;
+  BITMAPFILEHEADER_t File_h;
+  BITMAPINFOHEADER_t Info_h;
+  unsigned char *RGB;
+  unsigned char *table_R, *table_G, *table_B;
+  unsigned int j, PAD = 0;
+
+  int x, y, index;
+  int gray_scale = 1, not_end_file = 1; 
+
+  unsigned int line = 0, col = 0;
+  unsigned char v, v2;
+  DWORD 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) {
+      numcomps = 3;
+      color_space = CLRSPC_SRGB;
+      /* initialize image components */
+      memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
+      for(i = 0; i < numcomps; i++) {
+        cmptparm[i].prec = 8;
+        cmptparm[i].bpp = 8;
+        cmptparm[i].sgnd = 0;
+        cmptparm[i].dx = subsampling_dx;
+        cmptparm[i].dy = subsampling_dy;
+        cmptparm[i].w = w;
+        cmptparm[i].h = h;
+      }
+      /* create the image */
+      image = opj_image_create(numcomps, &cmptparm[0], color_space);
+      if(!image) {
+        fclose(IN);
+        return NULL;
+      }
+
+      /* set image offset and reference grid */
+      image->x0 = parameters->image_offset_x0;
+      image->y0 = parameters->image_offset_y0;
+      image->x1 =  !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1;
+      image->y1 =  !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1;
+
+      /* set image data */
+
+      /* 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);
+      
+      index = 0;
+
+      for(y = 0; y < (int)H; y++) {
+        unsigned char *scanline = RGB + (3 * W + PAD) * (H - 1 - y);
+        for(x = 0; x < (int)W; x++) {
+          unsigned char *pixel = &scanline[3 * x];
+          image->comps[0].data[index] = pixel[2];  /* R */
+          image->comps[1].data[index] = pixel[1];  /* G */
+          image->comps[2].data[index] = pixel[0];  /* B */
+          index++;
+        }
+      }
+
+      free(RGB);
+
+    } else if (Info_h.biBitCount == 8 && Info_h.biCompression == 0) {
+      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++;
+      
+      numcomps = gray_scale ? 1 : 3;
+      color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB;
+      /* initialize image components */
+      memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
+      for(i = 0; i < numcomps; i++) {
+        cmptparm[i].prec = 8;
+        cmptparm[i].bpp = 8;
+        cmptparm[i].sgnd = 0;
+        cmptparm[i].dx = subsampling_dx;
+        cmptparm[i].dy = subsampling_dy;
+        cmptparm[i].w = w;
+        cmptparm[i].h = h;
+      }
+      /* create the image */
+      image = opj_image_create(numcomps, &cmptparm[0], color_space);
+      if(!image) {
+        fclose(IN);
+        return NULL;
+      }
+
+      /* set image offset and reference grid */
+      image->x0 = parameters->image_offset_x0;
+      image->y0 = parameters->image_offset_y0;
+      image->x1 =  !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1;
+      image->y1 =  !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1;
+
+      /* set image data */
+
+      RGB = (unsigned char *) malloc(W * H * sizeof(unsigned char));
+      
+      fread(RGB, sizeof(unsigned char), W * H, IN);
+      if (gray_scale) {
+        index = 0;
+        for (j = 0; j < W * H; j++) {
+          if ((j % W < W - 1 && Info_h.biWidth % 2) || !(Info_h.biWidth % 2)) {
+            image->comps[0].data[index] = table_R[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]];
+            index++;
+          }
+        }
+
+      } else {    
+        index = 0;
+        for (j = 0; j < W * H; j++) {
+          if ((j % W < W - 1 && Info_h.biWidth % 2) || !(Info_h.biWidth % 2)) {
+            unsigned char pixel_index = RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)];
+            image->comps[0].data[index] = table_R[pixel_index];
+            image->comps[1].data[index] = table_G[pixel_index];
+            image->comps[2].data[index] = table_B[pixel_index];
+            index++;
+          }
+        }
+      }
+      free(RGB);
+            
+    } else if (Info_h.biBitCount == 8 && Info_h.biCompression == 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;
+      }
+
+      numcomps = gray_scale ? 1 : 3;
+      color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB;
+      /* initialize image components */
+      memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
+      for(i = 0; i < numcomps; i++) {
+        cmptparm[i].prec = 8;
+        cmptparm[i].bpp = 8;
+        cmptparm[i].sgnd = 0;
+        cmptparm[i].dx = subsampling_dx;
+        cmptparm[i].dy = subsampling_dy;
+        cmptparm[i].w = w;
+        cmptparm[i].h = h;
+      }
+      /* create the image */
+      image = opj_image_create(numcomps, &cmptparm[0], color_space);
+      if(!image) {
+        fclose(IN);
+        return NULL;
+      }
+
+      /* set image offset and reference grid */
+      image->x0 = parameters->image_offset_x0;
+      image->y0 = parameters->image_offset_y0;
+      image->x1 =  !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - 1) * subsampling_dx + 1;
+      image->y1 =  !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - 1) * subsampling_dy + 1;
+
+      /* set image data */
+      
+      /* Place the cursor at the beginning of the image information */
+      fseek(IN, 0, SEEK_SET);
+      fseek(IN, File_h.bfOffBits, SEEK_SET);
+      
+      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");
+              opj_image_destroy(image);
+              fclose(IN);
+              return NULL;
+              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);
+              break;
+          }
+        }
+      }
+      if (gray_scale) {
+        index = 0;
+        for (line = 0; line < Info_h.biHeight; line++) {
+          for (col = 0; col < Info_h.biWidth; col++) {
+            image->comps[0].data[index] = table_R[(int)RGB[(Info_h.biHeight - line - 1) * Info_h.biWidth + col]];
+            index++;
+          }
+        }
+      } else {
+        index = 0;
+        for (line = 0; line < Info_h.biHeight; line++) {
+          for (col = 0; col < Info_h.biWidth; col++) {
+            unsigned char pixel_index = (int)RGB[(Info_h.biHeight - line - 1) * Info_h.biWidth + col];
+            image->comps[0].data[index] = table_R[pixel_index];
+            image->comps[1].data[index] = table_G[pixel_index];
+            image->comps[2].data[index] = table_B[pixel_index];
+            index++;
+          }
+        }
+      }
+      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 image;
+}
+
+int imagetobmp(opj_image_t * image, char *outfile) {
+  int w, wr, h, hr;
+  int i, pad;
+  FILE *fdest = NULL;
+
+  if (image->numcomps == 3 && image->comps[0].dx == image->comps[1].dx
+    && image->comps[1].dx == image->comps[2].dx
+    && image->comps[0].dy == image->comps[1].dy
+    && image->comps[1].dy == image->comps[2].dy
+    && image->comps[0].prec == image->comps[1].prec
+    && image->comps[1].prec == image->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(image->x1 - image->x0, image->comps[0].dx); */
+    /* wr = int_ceildiv(int_ceildivpow2(image->x1 - image->x0,image->factor), image->comps[0].dx); */
+    w = image->comps[0].w;
+    wr = int_ceildivpow2(image->comps[0].w, image->comps[0].factor);
+      
+    /* h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); */
+    /* hr = int_ceildiv(int_ceildivpow2(image->y1 - image->y0,image->factor), image->comps[0].dy); */
+    h = image->comps[0].h;
+    hr = int_ceildivpow2(image->comps[0].h, image->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 = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; */
+      R = image->comps[0].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
+      /* G = image->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; */
+      G = image->comps[1].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
+      /* B = image->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; */
+      B = image->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);
+  } else {      /* Gray-scale */
+
+    /* -->> -->> -->> -->>
+    8 bits non code (Gray scale)
+    <<-- <<-- <<-- <<-- */
+
+    fdest = fopen(outfile, "wb");
+    /* w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx); */
+    /* wr = int_ceildiv(int_ceildivpow2(image->x1 - image->x0,image->factor), image->comps[0].dx); */
+    w = image->comps[0].w;
+    wr = int_ceildivpow2(image->comps[0].w, image->comps[0].factor);
+      
+    /* h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); */
+    /* hr = int_ceildiv(int_ceildivpow2(image->y1 - image->y0,image->factor), image->comps[0].dy); */
+    h = image->comps[0].h;
+    hr = int_ceildivpow2(image->comps[0].h, image->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", image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]); */
+    fprintf(fdest, "%c", image->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);
+
+  return 0;
+}
+
+/* -->> -->> -->> -->>
+
+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;
+}
+
+opj_image_t* pgxtoimage(char *filename, opj_cparameters_t *parameters) {
+  FILE *f = NULL;
+  int w, h, prec;
+  int i, numcomps, max;
+  OPJ_COLOR_SPACE color_space;
+  opj_image_cmptparm_t cmptparm;  /* maximum of 1 component  */
+  opj_image_t * image = NULL;
+
+  char endian1,endian2,sign;
+  char signtmp[32];
+
+  char temp[32];
+  int bigendian;
+  opj_image_comp_t *comp = NULL;
+
+  numcomps = 1;
+  color_space = CLRSPC_GRAY;
+
+  memset(&cmptparm, 0, sizeof(opj_image_cmptparm_t));
+
+  max = 0;
+
+  f = fopen(filename, "rb");
+  if (!f) {
+    fprintf(stderr, "Failed to open %s for reading !\n", filename);
+    return NULL;
+  }
+
+  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 NULL;
+  }
+
+  /* initialize image component */
+
+  cmptparm.x0 = parameters->image_offset_x0;
+  cmptparm.y0 = parameters->image_offset_y0;
+  cmptparm.w = !cmptparm.x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm.x0 + (w - 1) * parameters->subsampling_dx + 1;
+  cmptparm.h = !cmptparm.y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm.y0 + (h - 1) * parameters->subsampling_dy + 1;
+  
+  if (sign == '-') {
+    cmptparm.sgnd = 1;
+  } else {
+    cmptparm.sgnd = 0;
+  }
+  cmptparm.prec = prec;
+  cmptparm.bpp = prec;
+  cmptparm.dx = parameters->subsampling_dx;
+  cmptparm.dy = parameters->subsampling_dy;
+  
+  /* create the image */
+  image = opj_image_create(numcomps, &cmptparm, color_space);
+  if(!image) {
+    fclose(f);
+    return NULL;
+  }
+  /* set image offset and reference grid */
+  image->x0 = cmptparm.x0;
+  image->y0 = cmptparm.x0;
+  image->x1 = cmptparm.w;
+  image->y1 = cmptparm.h;
+
+  /* set image data */
+
+  comp = &image->comps[0];
+
+  for (i = 0; i < w * h; i++) {
+    int v;
+    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;
+    comp->data[i] = v;
+  }
+  fclose(f);
+  comp->bpp = int_floorlog2(max) + 1;
+
+  return image;
+}
+
+int imagetopgx(opj_image_t * image, char *outfile) {
+  int w, wr, h, hr;
+  int i, j, compno;
+  FILE *fdest = NULL;
+
+  for (compno = 0; compno < image->numcomps; compno++) {
+    opj_image_comp_t *comp = &image->comps[compno];
+    char name[256];
+    int nbytes = 0;
+    char *tmp = outfile;
+    while (*tmp) {
+      tmp++;
+    }
+    while (*tmp!='.') {
+      tmp--;
+    }
+    *tmp='\0';
+
+    if (image->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(image->x1 - image->x0, comp->dx); */
+    /* wr = int_ceildiv(int_ceildivpow2(image->x1 - image->x0,image->factor), comp->dx); */
+    w = image->comps[compno].w;
+    wr = int_ceildivpow2(image->comps[compno].w, image->comps[compno].factor);
+      
+    /* h = int_ceildiv(image->y1 - image->y0, comp->dy); */
+    /* hr = int_ceildiv(int_ceildivpow2(image->y1 - image->y0,image->factor), comp->dy); */
+    h = image->comps[compno].h;
+    hr = int_ceildivpow2(image->comps[compno].h, image->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 = image->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);
+      }
+    }
+    fclose(fdest);
+  }
+
+  return 0;
+}
+
+/* -->> -->> -->> -->>
+
+PNM IMAGE FORMAT
+
+<<-- <<-- <<-- <<-- */
+
+opj_image_t* pnmtoimage(char *filename, opj_cparameters_t *parameters) {
+  int subsampling_dx = parameters->subsampling_dx;
+  int subsampling_dy = parameters->subsampling_dy;
+
+  FILE *f = NULL;
+  int i, compno, numcomps, w, h;
+  OPJ_COLOR_SPACE color_space;
+  opj_image_cmptparm_t cmptparm[3];  /* maximum of 3 components */
+  opj_image_t * image = NULL;
+  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);
+
+  switch(value) {
+    case '2':  /* greyscale image type */
+    case '5':
+    {
+      numcomps = 1;
+      color_space = CLRSPC_GRAY;
+
+      fgetc(f);
+
+      if (fgetc(f) == '#') {
+        /* skip comments */
+        fseek(f, 0, SEEK_SET);
+        if (value == '2') {
+          fscanf(f, "P2\n");
+        } else if (value == '5') {
+          fscanf(f, "P5\n");
+        }
+        fgets(comment, 256, f);
+        fscanf(f, "%d %d\n255", &w, &h);
+      } else {
+        fseek(f, 0, SEEK_SET);
+        if (value == '2') {
+          fscanf(f, "P2\n%d %d\n255", &w, &h);
+        } else if (value == '5') {
+          fscanf(f, "P5\n%d %d\n255", &w, &h);
+        }
+      }
+      
+      fgetc(f);  /* <cr><lf> */
+    }
+    break;
+
+    case '3':  /* RGB image type */
+    case '6':
+    {
+      numcomps = 3;
+      color_space = CLRSPC_SRGB;
+
+      fgetc(f);
+
+      if (fgetc(f) == '#') {
+        /* skip comments */
+        fseek(f, 0, SEEK_SET);
+        if (value == '3') {
+          fscanf(f, "P3\n");
+        } else if (value == '6') {
+          fscanf(f, "P6\n");
+        }
+        fgets(comment, 256, f);
+        fscanf(f, "%d %d\n255", &w, &h);
+      } else {
+        fseek(f, 0, SEEK_SET);
+        if (value == '3') {
+          fscanf(f, "P3\n%d %d\n255", &w, &h);
+        } else if (value == '6') {
+          fscanf(f, "P6\n%d %d\n255", &w, &h);
+        }
+      }
+      
+      fgetc(f);  /* <cr><lf> */
+    }
+    break;
+
+    default:
+      fclose(f);
+      return NULL;
+  }
+
+  /* initialize image components */
+  memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
+  for(i = 0; i < numcomps; i++) {
+    cmptparm[i].prec = 8;
+    cmptparm[i].bpp = 8;
+    cmptparm[i].sgnd = 0;
+    cmptparm[i].dx = subsampling_dx;
+    cmptparm[i].dy = subsampling_dy;
+    cmptparm[i].w = w;
+    cmptparm[i].h = h;
+  }
+  /* create the image */
+  image = opj_image_create(numcomps, &cmptparm[0], color_space);
+  if(!image) {
+    fclose(f);
+    return NULL;
+  }
+
+  /* set image offset and reference grid */
+  image->x0 = parameters->image_offset_x0;
+  image->y0 = parameters->image_offset_y0;
+  image->x1 = parameters->image_offset_x0 + (w - 1) *  subsampling_dx + 1;
+  image->y1 = parameters->image_offset_y0 + (h - 1) *  subsampling_dy + 1;
+
+  /* set image data */
+
+  if ((value == '2') || (value == '3')) {  /* ASCII */
+    for (i = 0; i < w * h; i++) {
+      for(compno = 0; compno < numcomps; compno++) {
+        unsigned int index = 0;
+        fscanf(f, "%u", &index);
+        /* compno : 0 = GREY, (0, 1, 2) = (R, G, B) */
+        image->comps[compno].data[i] = index;
+      }
+    }
+  } else if ((value == '5') || (value == '6')) {  /* BINARY */
+    for (i = 0; i < w * h; i++) {
+      for(compno = 0; compno < numcomps; compno++) {
+        unsigned char index = 0;
+        fread(&index, 1, 1, f);
+        /* compno : 0 = GREY, (0, 1, 2) = (R, G, B) */
+        image->comps[compno].data[i] = index;
+      }
+    }
+  }
+
+  fclose(f);
+
+  return image;
+}
+
+int imagetopnm(opj_image_t * image, char *outfile) {
+  int w, wr, wrr, h, hr, hrr, max;
+  int i, compno;
+  int adjust;
+  FILE *fdest = NULL;
+  char S2;
+  char *tmp = outfile;
+
+  while (*tmp) {
+    tmp++;
+  }
+  tmp--;
+  tmp--;
+  S2 = *tmp;
+
+  if (image->numcomps == 3 && image->comps[0].dx == image->comps[1].dx
+    && image->comps[1].dx == image->comps[2].dx
+    && image->comps[0].dy == image->comps[1].dy
+    && image->comps[1].dy == image->comps[2].dy
+    && image->comps[0].prec == image->comps[1].prec
+    && image->comps[1].prec == image->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(image->x1 - image->x0, image->comps[0].dx);
+    /* wr = int_ceildiv(int_ceildivpow2(image->x1 - image->x0,image->factor),image->comps[0].dx); */
+    wr = image->comps[0].w;
+    wrr = int_ceildivpow2(image->comps[0].w, image->comps[0].factor);
+        
+    h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy);
+    /* hr = int_ceildiv(int_ceildivpow2(image->y1 - image->y0,image->factor), image->comps[0].dy); */
+    hr = image->comps[0].h;
+    hrr = int_ceildivpow2(image->comps[0].h, image->comps[0].factor);
+      
+    max = image->comps[0].prec > 8 ? 255 : (1 << image->comps[0].prec) - 1;
+      
+    image->comps[0].x0 = int_ceildivpow2(image->comps[0].x0 - int_ceildiv(image->x0, image->comps[0].dx), image->comps[0].factor);
+    image->comps[0].y0 = int_ceildivpow2(image->comps[0].y0 -  int_ceildiv(image->y0, image->comps[0].dy), image->comps[0].factor);
+
+    fprintf(fdest, "P6\n%d %d\n%d\n", wrr, hrr, max);
+    adjust = image->comps[0].prec > 8 ? image->comps[0].prec - 8 : 0;
+    for (i = 0; i < wrr * hrr; i++) {
+      int r, g, b;
+      unsigned char rc,gc,bc;
+      r = image->comps[0].data[i / wrr * wr + i % wrr];
+      r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0);
+      rc = (unsigned char) ((r >> adjust)+((r >> (adjust-1))%2));
+
+      g = image->comps[1].data[i / wrr * wr + i % wrr];
+      g += (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0);
+      gc = (unsigned char) ((g >> adjust)+((g >> (adjust-1))%2));
+      
+      b = image->comps[2].data[i / wrr * wr + i % wrr];
+      b += (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0);
+      bc = (unsigned char) ((b >> adjust)+((b >> (adjust-1))%2));
+      
+      fprintf(fdest, "%c%c%c", rc, gc, bc);
+    }
+    fclose(fdest);
+  } else {
+    int ncomp=(S2=='g' || S2=='G')?1:image->numcomps;
+    if (image->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(image->x1 - image->x0, image->comps[compno].dx);
+      /* wr = int_ceildiv(int_ceildivpow2(image->x1 - image->x0,image->factor),image->comps[compno].dx); */
+      wr = image->comps[compno].w;
+      wrr = int_ceildivpow2(image->comps[compno].w, image->comps[compno].factor);
+      
+      h = int_ceildiv(image->y1 - image->y0, image->comps[compno].dy);
+      /* hr = int_ceildiv(int_ceildivpow2(image->y1 - image->y0,image->factor), image->comps[compno].dy); */
+      hr = image->comps[compno].h;
+      hrr = int_ceildivpow2(image->comps[compno].h, image->comps[compno].factor);
+      
+      max = image->comps[compno].prec > 8 ? 255 : (1 << image->comps[compno].prec) - 1;
+      
+      image->comps[compno].x0 = int_ceildivpow2(image->comps[compno].x0 - int_ceildiv(image->x0, image->comps[compno].dx), image->comps[compno].factor);
+      image->comps[compno].y0 = int_ceildivpow2(image->comps[compno].y0 - int_ceildiv(image->y0, image->comps[compno].dy), image->comps[compno].factor);
+      
+      fprintf(fdest, "P5\n%d %d\n%d\n", wrr, hrr, max);
+      adjust = image->comps[compno].prec > 8 ? image->comps[compno].prec - 8 : 0;
+
+      for (i = 0; i < wrr * hrr; i++) {
+        int l;
+        unsigned char lc;
+        l = image->comps[compno].data[i / wrr * wr + i % wrr];
+        l += (image->comps[compno].sgnd ? 1 << (image->comps[compno].prec - 1) : 0);
+        lc = (unsigned char) ((l >> adjust)+((l >> (adjust-1))%2));
+        fprintf(fdest, "%c", lc);
+      }
+      fclose(fdest);
+    }
+  }
+
+  return 0;
+}
index 64561d894375278b9bd4a14b9d78c4519efb7117..a3876547926556b9340194923739110c1b7907bf 100644 (file)
@@ -1,52 +1,52 @@
-/*\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
+/*
+ * 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\8e 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.
+ */
+#ifndef __J2K_CONVERT_H
+#define __J2K_CONVERT_H
+
+opj_image_t* bmptoimage(char *filename, opj_cparameters_t *parameters);
+
+int imagetobmp(opj_image_t *image, char *outfile);
+
+/**
+Load a single image component encoded in PGX file format
+@param filename Name of the PGX file to load
+@param parameters *List ?*
+@return Returns a greyscale image if successful, returns NULL otherwise
+*/
+opj_image_t* pgxtoimage(char *filename, opj_cparameters_t *parameters);
+
+int imagetopgx(opj_image_t *image, char *outfile);
+
+opj_image_t* pnmtoimage(char *filename, opj_cparameters_t *parameters);
+
+int imagetopnm(opj_image_t *image, char *outfile);
+
+#endif /* __J2K_CONVERT_H */
+
index af61a2fb7c681e38985cef02c8273efb4cb3c5e6..ca0503ddc55d53fdc5a3e1f702bfd1b00311f308 100644 (file)
-/*\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
+/*
+ * 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 <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "openjpeg.h"
+#include "compat/getopt.h"
+#include "convert.h"
+
+#ifndef WIN32
+#define stricmp strcasecmp
+#define strnicmp strncasecmp
+#endif
+
+/* ----------------------------------------------------------------------- */
+
+#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
+
+/* ----------------------------------------------------------------------- */
+
+void encode_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 JPEG 2000 encoder:\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");
+}
+
+OPJ_PROG_ORDER give_progression(char progression[4]) {
+  if(strncmp(progression, "LRCP", 4) == 0) {
+    return LRCP;
+  }
+  if(strncmp(progression, "RLCP", 4) == 0) {
+    return RLCP;
+  }
+  if(strncmp(progression, "RPCL", 4) == 0) {
+    return RPCL;
+  }
+  if(strncmp(progression, "PCRL", 4) == 0) {
+    return PCRL;
+  }
+  if(strncmp(progression, "CPRL", 4) == 0) {
+    return CPRL;
+  }
+
+  return PROG_UNKNOWN;
+}
+
+int get_file_format(char *filename) {
+  unsigned int i;
+  static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp", "j2k", "jp2" };
+  static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, J2K_CFMT, JP2_CFMT };
+  char * ext = strrchr(filename, '.') + 1;
+  for(i = 0; i < sizeof(format); i++) {
+    if(strnicmp(ext, extension[i], 3) == 0) {
+      return format[i];
+    }
+  }
+
+  return -1;
+}
+
+/* ------------------------------------------------------------------------------------ */
+
+int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters) {
+  int i, j;
+
+  /* parse the command line */
+
+  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':      /* input file */
+      {
+        char *infile = optarg;
+        parameters->decod_format = get_file_format(infile);
+        switch(parameters->decod_format) {
+          case PGX_DFMT:
+          case PXM_DFMT:
+          case BMP_DFMT:
+            break;
+          default:
+            fprintf(stderr, 
+              "!! Unrecognized format for infile : %s [accept only *.pnm, *.pgm, *.ppm, *.pgx or *.bmp] !!\n\n", 
+              infile);
+            return 1;
+            break;
+        }
+        strncpy(parameters->infile, infile, MAX_PATH);
+      }
+      break;
+        
+        /* ----------------------------------------------------- */
+
+      case 'o':      /* output file */
+      {
+        char *outfile = optarg;
+        parameters->cod_format = get_file_format(outfile);
+        switch(parameters->cod_format) {
+          case J2K_CFMT:
+          case JP2_CFMT:
+            break;
+          default:
+            fprintf(stderr, "Unknown output format image %s [only *.j2k, *.jp2]!! \n", outfile);
+            return 1;
+            break;
+        }
+        strncpy(parameters->outfile, outfile, MAX_PATH);
+      }
+      break;
+
+        /* ----------------------------------------------------- */
+      
+      case 'r':      /* rates rates/distorsion */
+      {
+        char *s = optarg;
+        while (sscanf(s, "%d", &parameters->tcp_rates[parameters->tcp_numlayers]) == 1) {
+          parameters->tcp_numlayers++;
+          while (*s && *s != ',') {
+            s++;
+          }
+          if (!*s)
+            break;
+          s++;
+        }
+        parameters->cp_disto_alloc = 1;
+      }
+      break;
+        
+        /* ----------------------------------------------------- */
+      
+      case 'q':      /* add fixed_quality */
+      {
+        char *s = optarg;
+        while (sscanf(s, "%f", &parameters->tcp_distoratio[parameters->tcp_numlayers]) == 1) {
+          parameters->tcp_numlayers++;
+          while (*s && *s != ',') {
+            s++;
+          }
+          if (!*s)
+            break;
+          s++;
+        }
+        parameters->cp_fixed_quality = 1;
+      }
+      break;
+        
+        /* dda */
+        /* ----------------------------------------------------- */
+
+      case 'f':      /* mod fixed_quality (before : -q) */
+      {
+        int *row = NULL, *col = NULL;
+        int numlayers = 0, numresolution = 0, matrix_width = 0;
+
+        char *s = optarg;
+        sscanf(s, "%d", &numlayers);
+        s++;
+        if (numlayers > 9)
+          s++;
+
+        parameters->tcp_numlayers = numlayers;
+        numresolution = parameters->numresolution;
+        matrix_width = numresolution * 3;
+        parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int));
+        s = s + 2;
+
+        for (i = 0; i < numlayers; i++) {
+          row = &parameters->cp_matrice[i * matrix_width];
+          col = row;
+          parameters->tcp_rates[i] = 1;
+          sscanf(s, "%d,", &col[0]);
+          s += 2;
+          if (col[0] > 9)
+            s++;
+          col[1] = 0;
+          col[2] = 0;
+          for (j = 1; j < numresolution; j++) {
+            col += 3;
+            sscanf(s, "%d,%d,%d", &col[0], &col[1], &col[2]);
+            s += 6;
+            if (col[0] > 9)
+              s++;
+            if (col[1] > 9)
+              s++;
+            if (col[2] > 9)
+              s++;
+          }
+          if (i < numlayers - 1)
+            s++;
+        }
+        parameters->cp_fixed_alloc = 1;
+      }
+      break;
+        
+        /* ----------------------------------------------------- */
+
+      case 't':      /* tiles */
+      {
+        sscanf(optarg, "%d,%d", &parameters->cp_tdx, &parameters->cp_tdy);
+        parameters->tile_size_on = true;
+      }
+      break;
+        
+        /* ----------------------------------------------------- */
+      
+      case 'n':      /* resolution */
+      {
+        sscanf(optarg, "%d", &parameters->numresolution);
+      }
+      break;
+        
+        /* ----------------------------------------------------- */
+      case 'c':      /* precinct dimension */
+      {
+        char sep;
+        int res_spec = 0;
+
+        char *s = optarg;
+        do {
+          sep = 0;
+          sscanf(s, "[%d,%d]%c", &parameters->prcw_init[res_spec], &parameters->prch_init[res_spec], &sep);
+          parameters->csty |= 0x01;
+          res_spec++;
+          s = strpbrk(s, "]") + 2;
+        }
+        while (sep == ',');
+        parameters->res_spec = res_spec;
+      }
+      break;
+        
+        /* ----------------------------------------------------- */
+      
+      case 'b':      /* code-block dimension */
+      {
+        int cblockw_init = 0, cblockh_init = 0;
+        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;
+        }
+        parameters->cblockw_init = cblockw_init;
+        parameters->cblockh_init = cblockh_init;
+      }
+      break;
+        
+        /* ----------------------------------------------------- */
+      
+      case 'x':      /* creation of index file */
+      {
+        char *index = optarg;
+        strncpy(parameters->index, index, MAX_PATH);
+        parameters->index_on = 1;
+      }
+      break;
+        
+        /* ----------------------------------------------------- */
+      
+      case 'p':      /* progression order */
+      {
+        char progression[4];
+
+        strncpy(progression, optarg, 4);
+        parameters->prog_order = give_progression(progression);
+        if (parameters->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", &parameters->subsampling_dx, &parameters->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", &parameters->image_offset_x0, &parameters->image_offset_y0) != 2) {
+          fprintf(stderr,  "-d 'coordonnate of the reference grid' argument error !! [-d x0,y0]\n");
+          return 1;
+        }
+      }
+      break;
+        
+        /* ----------------------------------------------------- */
+      
+      case 'h':      /* display an help description */
+      {
+        encode_help_display();
+        return 1;
+      }
+      break;
+        
+        /* ----------------------------------------------------- */
+
+      case 'P':      /* POC */
+      {
+        int numpocs = 0;    /* number of progression order change (POC) default 0 */
+        opj_poc_t *POC = NULL;  /* POC : used in case of Progression order change */
+
+        char *s = optarg;
+        POC = parameters->POC;
+
+        fprintf(stderr, "/----------------------------------\\\n");
+        fprintf(stderr, "|  POC option not fully tested !!  |\n");
+        fprintf(stderr, "\\----------------------------------/\n");
+        
+        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++;
+        }
+        parameters->numpocs = numpocs;
+      }
+      break;
+        
+        /* ------------------------------------------------------ */
+        
+      case 'S':      /* SOP marker */
+      {
+        parameters->csty |= 0x02;
+      }
+      break;
+        
+        /* ------------------------------------------------------ */
+      
+      case 'E':      /* EPH marker */
+      {
+        parameters->csty |= 0x04;
+      }
+      break;
+        
+        /* ------------------------------------------------------ */
+      
+      case 'M':      /* Mode switch pas tous au point !! */
+      {
+        int value = 0;
+        if (sscanf(optarg, "%d", &value) == 1) {
+          for (i = 0; i <= 5; i++) {
+            int cache = value & (1 << i);
+            if (cache)
+              parameters->mode |= (1 << i);
+          }
+        }
+      }
+      break;
+        
+        /* ------------------------------------------------------ */
+      
+      case 'R':      /* ROI */
+      {
+        if (sscanf(optarg, "OI:c=%d,U=%d", &parameters->roi_compno, &parameters->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", &parameters->cp_tx0, &parameters->cp_ty0) != 2) {
+          fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]");
+          return 1;
+        }
+      }
+      break;
+        
+        /* ------------------------------------------------------ */
+        
+      case 'C':      /* add a comment */
+      {
+        parameters->cp_comment = (char*)malloc(strlen(optarg) + 1);
+        if(parameters->cp_comment) {
+          strcpy(parameters->cp_comment, optarg);
+        }
+      }
+      break;
+        
+        /* ------------------------------------------------------ */
+      
+      case 'I':      /* reversible or not */
+      {
+        parameters->irreversible = 1;
+      }
+      break;
+        
+        /* ------------------------------------------------------ */
+      
+      default:
+        fprintf(stderr, "ERROR -> this option is not valid \"-%c %s\"\n", c, optarg);
+        return 1;
+    }
+  }
+
+  /* check for possible errors */
+
+  if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {
+    fprintf(stderr, "usage: image_to_j2k -i image-file -o j2k/jp2-file (+ options)\n");
+    return 1;
+  }
+
+  if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || parameters->cp_fixed_quality)
+    && (!(parameters->cp_disto_alloc ^ parameters->cp_fixed_alloc ^ parameters->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 (parameters->tcp_numlayers == 0) {
+    parameters->tcp_rates[0] = 0;  /* MOD antonin : losslessbug */
+    parameters->tcp_numlayers++;
+    parameters->cp_disto_alloc = 1;
+  }
+
+  if((parameters->cp_tx0 > parameters->image_offset_x0) || (parameters->cp_ty0 > parameters->image_offset_y0)) {
+    fprintf(stderr,
+      "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n",
+      parameters->cp_tx0, parameters->image_offset_x0, parameters->cp_ty0, parameters->image_offset_y0);
+    return 1;
+  }
+
+  for (i = 0; i < parameters->numpocs; i++) {
+    if (parameters->POC[i].prg == -1) {
+      fprintf(stderr,
+        "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n",
+        i + 1);
+    }
+  }
+
+  return 0;
+}
+
+/* -------------------------------------------------------------------------- */
+
+/**
+sample error callback expecting a FILE* client object
+*/
+void error_callback(const char *msg, void *client_data) {
+  FILE *stream = (FILE*)client_data;
+  fprintf(stream, "[ERROR] %s", msg);
+}
+/**
+sample warning callback expecting a FILE* client object
+*/
+void warning_callback(const char *msg, void *client_data) {
+  FILE *stream = (FILE*)client_data;
+  fprintf(stream, "[WARNING] %s", msg);
+}
+/**
+sample debug callback expecting a FILE* client object
+*/
+void info_callback(const char *msg, void *client_data) {
+  FILE *stream = (FILE*)client_data;
+  fprintf(stream, "[INFO] %s", msg);
+}
+
+/* -------------------------------------------------------------------------- */
+
+int main(int argc, char **argv) {
+  bool bSuccess;
+  bool delete_comment = true;
+  opj_cparameters_t parameters;  /* compression parameters */
+  opj_event_mgr_t event_mgr;    /* event manager */
+  opj_image_t *image = NULL;
+
+  /* 
+  configure the event callbacks (not required)
+  setting of each callback is optionnal 
+  */
+  memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
+  event_mgr.error_handler = error_callback;
+  event_mgr.warning_handler = warning_callback;
+  event_mgr.info_handler = info_callback;
+
+  /* set encoding parameters to default values */
+  opj_set_default_encoder_parameters(&parameters);
+
+  /* parse input and get user encoding parameters */
+  if(parse_cmdline_encoder(argc, argv, &parameters) == 1) {
+    return 0;
+  }
+
+  if(parameters.cp_comment == NULL) {
+    parameters.cp_comment = "Created by OpenJPEG version 0.9";
+    /* no need to delete parameters.cp_comment on exit */
+    delete_comment = false;
+  }
+
+  /* decode the source image */
+  /* ----------------------- */
+
+  switch (parameters.decod_format) {
+    case PGX_DFMT:
+      image = pgxtoimage(parameters.infile, &parameters);
+      if (!image) {
+        fprintf(stderr, " unable to load pgx file\n");
+        return 1;
+      }
+      break;
+    
+    case PXM_DFMT:
+      image = pnmtoimage(parameters.infile, &parameters);
+      if (!image) {
+        fprintf(stderr, " not a pnm file\n");
+        return 1;
+      }
+      break;
+
+    case BMP_DFMT:
+      image = bmptoimage(parameters.infile, &parameters);
+      if (!image) {
+        fprintf(stderr, " not a bmp file\n");
+        return 1;
+      }
+      break;
+  }
+
+  /* encode the destination image */
+  /* ---------------------------- */
+
+  if (parameters.cod_format == J2K_CFMT) {  /* J2K format output */
+    int codestream_length;
+    opj_cio_t *cio = NULL;
+    FILE *f = NULL;
+
+    /* get a J2K compressor handle */
+    opj_cinfo_t* cinfo = opj_create_compress(CODEC_J2K);
+
+    /* catch events using our callbacks and give a local context */
+    opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);      
+
+    /* setup the encoder parameters using the current image and using user parameters */
+    opj_setup_encoder(cinfo, &parameters, image);
+
+    /* open a byte stream for writing */
+    /* allocate memory for all tiles */
+    cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
+
+    /* encode the image */
+    bSuccess = opj_encode(cinfo, cio, image, parameters.index);
+    if (!bSuccess) {
+      opj_cio_close(cio);
+      fprintf(stderr, "failed to encode image\n");
+      return 1;
+    }
+    codestream_length = cio_tell(cio);
+
+    /* write the buffer to disk */
+    f = fopen(parameters.outfile, "wb");
+    if (!f) {
+      fprintf(stderr, "failed to open %s for writing\n", parameters.outfile);
+      return 1;
+    }
+    fwrite(cio->buffer, 1, codestream_length, f);
+    fclose(f);
+
+    /* close and free the byte stream */
+    opj_cio_close(cio);
+
+    /* free remaining compression structures */
+    opj_destroy_compress(cinfo);
+
+  } else {      /* JP2 format output */
+    int codestream_length;
+    opj_cio_t *cio = NULL;
+    FILE *f = NULL;
+
+    /* get a JP2 compressor handle */
+    opj_cinfo_t* cinfo = opj_create_compress(CODEC_JP2);
+
+    /* catch events using our callbacks and give a local context */
+    opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);      
+
+    /* setup the encoder parameters using the current image and using user parameters */
+    opj_setup_encoder(cinfo, &parameters, image);
+
+    /* open a byte stream for writing */
+    /* allocate memory for all tiles */
+    cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
+
+    /* encode the image */
+    bSuccess = opj_encode(cinfo, cio, image, parameters.index);
+    if (!bSuccess) {
+      opj_cio_close(cio);
+      fprintf(stderr, "failed to encode image\n");
+      return 1;
+    }
+    codestream_length = cio_tell(cio);
+
+    /* write the buffer to disk */
+    f = fopen(parameters.outfile, "wb");
+    if (!f) {
+      fprintf(stderr, "failed to open %s for writing\n", parameters.outfile);
+      return 1;
+    }
+    fwrite(cio->buffer, 1, codestream_length, f);
+    fclose(f);
+
+    /* close and free the byte stream */
+    opj_cio_close(cio);
+
+    /* free remaining compression structures */
+    opj_destroy_compress(cinfo);
+
+  }
+
+  /* free user parameters structure */
+  if(delete_comment) {
+    if(parameters.cp_comment) free(parameters.cp_comment);
+  }
+  if(parameters.cp_matrice) free(parameters.cp_matrice);
+
+  /* free image data */
+  opj_image_destroy(image);
+
+  return 0;
+}
+
index a1654bf9cdc156b710c869a07afed42e6e5f3737..56d89ef789f0c550b67e4a3b4b2c66930e49c487 100644 (file)
-/*\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
+/*
+ * 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 <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "openjpeg.h"
+#include "compat/getopt.h"
+#include "convert.h"
+
+#ifndef WIN32
+#define stricmp strcasecmp
+#define strnicmp strncasecmp
+#endif
+
+/* ----------------------------------------------------------------------- */
+
+#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
+
+/* ----------------------------------------------------------------------- */
+
+void decode_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 JPEG 2000 encoder:\n");
+  fprintf(stdout,"\n");
+  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,"\n");
+}
+
+/* -------------------------------------------------------------------------- */
+
+int get_file_format(char *filename) {
+  unsigned int i;
+  static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp", "j2k", "jp2", "jpt" };
+  static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT };
+  char * ext = strrchr(filename, '.') + 1;
+  if(ext) {
+    for(i = 0; i < sizeof(format); i++) {
+      if(strnicmp(ext, extension[i], 3) == 0) {
+        return format[i];
+      }
+    }
+  }
+
+  return -1;
+}
+
+/* -------------------------------------------------------------------------- */
+
+int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters) {
+  /* parse the command line */
+
+  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':      /* input file */
+      {
+        char *infile = optarg;
+        parameters->decod_format = get_file_format(infile);
+        switch(parameters->decod_format) {
+          case J2K_CFMT:
+          case JP2_CFMT:
+          case JPT_CFMT:
+            break;
+          default:
+            fprintf(stderr, 
+              "!! Unrecognized format for infile : %s [accept only *.j2k, *.jp2, *.jpc or *.jpt] !!\n\n", 
+              infile);
+            return 1;
+            break;
+        }
+        strncpy(parameters->infile, infile, MAX_PATH);
+      }
+      break;
+        
+        /* ----------------------------------------------------- */
+
+      case 'o':      /* output file */
+      {
+        char *outfile = optarg;
+        parameters->cod_format = get_file_format(outfile);
+        switch(parameters->cod_format) {
+          case PGX_DFMT:
+          case PXM_DFMT:
+          case BMP_DFMT:
+            break;
+          default:
+            fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx or *.bmp]!! \n", outfile);
+            return 1;
+            break;
+        }
+        strncpy(parameters->outfile, outfile, MAX_PATH);
+      }
+      break;
+      
+        /* ----------------------------------------------------- */
+      
+    
+      case 'r':    /* reduce option */
+      {
+        sscanf(optarg, "%d", &parameters->cp_reduce);
+      }
+      break;
+      
+        /* ----------------------------------------------------- */
+      
+
+      case 'l':    /* layering option */
+      {
+        sscanf(optarg, "%d", &parameters->cp_layer);
+      }
+      break;
+      
+        /* ----------------------------------------------------- */
+      
+      case 'h':       /* display an help description */
+      {
+        decode_help_display();
+        return 1;
+      }
+      break;
+            
+        /* ----------------------------------------------------- */
+      
+      default:
+        fprintf(stderr,"WARNING -> this option is not valid \"-%c %s\"\n",c, optarg);
+        break;
+    }
+  }
+
+  /* check for possible errors */
+
+  if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {
+    fprintf(stderr,"ERROR -> At least one required argument is missing\nCheck j2k_to_image -h for usage information\n");
+    return 1;
+  }
+
+  return 0;
+}
+
+/* -------------------------------------------------------------------------- */
+
+/**
+sample error callback expecting a FILE* client object
+*/
+void error_callback(const char *msg, void *client_data) {
+  FILE *stream = (FILE*)client_data;
+  fprintf(stream, "[ERROR] %s", msg);
+}
+/**
+sample warning callback expecting a FILE* client object
+*/
+void warning_callback(const char *msg, void *client_data) {
+  FILE *stream = (FILE*)client_data;
+  fprintf(stream, "[WARNING] %s", msg);
+}
+/**
+sample debug callback expecting no client object
+*/
+void info_callback(const char *msg, void *client_data) {
+  (void)client_data;
+  fprintf(stdout, "[INFO] %s", msg);
+}
+
+/* -------------------------------------------------------------------------- */
+
+int main(int argc, char **argv) {
+  opj_dparameters_t parameters;  /* decompression parameters */
+  opj_event_mgr_t event_mgr;    /* event manager */
+  opj_image_t *image = NULL;
+  FILE *fsrc = NULL;
+  unsigned char *src = NULL; 
+  int file_length;
+
+  opj_dinfo_t* dinfo = NULL;  /* handle to a decompressor */
+  opj_cio_t *cio = NULL;
+
+  /* configure the event callbacks (not required) */
+  memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
+  event_mgr.error_handler = error_callback;
+  event_mgr.warning_handler = warning_callback;
+  event_mgr.info_handler = info_callback;
+
+  /* set decoding parameters to default values */
+  opj_set_default_decoder_parameters(&parameters);
+
+  /* parse input and get user decoding parameters */
+  if(parse_cmdline_decoder(argc, argv, &parameters) == 1) {
+    return 0;
+  }
+  
+  /* read the input file and put it in memory */
+  /* ---------------------------------------- */
+  fsrc = fopen(parameters.infile, "rb");
+  if (!fsrc) {
+    fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile);
+    return 1;
+  }  
+  fseek(fsrc, 0, SEEK_END);
+  file_length = ftell(fsrc);
+  fseek(fsrc, 0, SEEK_SET);
+  src = (unsigned char *) malloc(file_length);
+  fread(src, 1, file_length, fsrc);
+  fclose(fsrc);
+  
+  /* decode the code-stream */
+  /* ---------------------- */
+
+    switch(parameters.decod_format) {
+    case J2K_CFMT:
+    {
+      /* JPEG-2000 codestream */
+
+      /* get a decoder handle */
+      dinfo = opj_create_decompress(CODEC_J2K);
+      
+      /* catch events using our callbacks and give a local context */
+      opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);      
+
+      /* setup the decoder decoding parameters using user parameters */
+      opj_setup_decoder(dinfo, &parameters);
+
+      /* open a byte stream */
+      cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
+
+      /* decode the stream and fill the image structure */
+      image = opj_decode(dinfo, cio);
+      if(!image) {
+        fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
+        opj_destroy_decompress(dinfo);
+        opj_cio_close(cio);
+        return 1;
+      }
+      
+      /* close the byte stream */
+      opj_cio_close(cio);
+    }
+    break;
+
+    case JP2_CFMT:
+    {
+      /* JPEG 2000 compressed image data */
+
+      /* get a decoder handle */
+      dinfo = opj_create_decompress(CODEC_JP2);
+      
+      /* catch events using our callbacks and give a local context */
+      opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);      
+
+      /* setup the decoder decoding parameters using the current image and using user parameters */
+      opj_setup_decoder(dinfo, &parameters);
+
+      /* open a byte stream */
+      cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
+
+      /* decode the stream and fill the image structure */
+      image = opj_decode(dinfo, cio);
+      if(!image) {
+        fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
+        opj_destroy_decompress(dinfo);
+        opj_cio_close(cio);
+        return 1;
+      }
+
+      /* close the byte stream */
+      opj_cio_close(cio);
+
+    }
+    break;
+
+    case JPT_CFMT:
+    {
+      /* JPEG 2000, JPIP */
+
+      /* get a decoder handle */
+      dinfo = opj_create_decompress(CODEC_JPT);
+      
+      /* catch events using our callbacks and give a local context */
+      opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);      
+
+      /* setup the decoder decoding parameters using user parameters */
+      opj_setup_decoder(dinfo, &parameters);
+
+      /* open a byte stream */
+      cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
+
+      /* decode the stream and fill the image structure */
+      image = opj_decode(dinfo, cio);
+      if(!image) {
+        fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");        
+        opj_destroy_decompress(dinfo);
+        opj_cio_close(cio);
+        return 1;
+      }  
+
+      /* close the byte stream */
+      opj_cio_close(cio);
+    }
+    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);
+  src = NULL;
+
+  /* create output image */
+  /* ------------------- */
+
+  switch (parameters.cod_format) {
+    case PXM_DFMT:      /* PNM PGM PPM */
+      imagetopnm(image, parameters.outfile);
+      break;
+            
+    case PGX_DFMT:      /* PGX */
+      imagetopgx(image, parameters.outfile);
+      break;
+    
+    case BMP_DFMT:      /* BMP */
+      imagetobmp(image, parameters.outfile);
+      break;
+  }
+
+  /* free remaining structures */
+  if(dinfo) {
+    opj_destroy_decompress(dinfo);
+  }
+
+  /* free image data structure */
+  opj_image_destroy(image);
+   
+  return 0;
+}
+
index 5bcfda372cc3b007462228437940b8f22a3a3340..3dfd7cf7ac58969c379c5283cd386960db99bc7d 100644 (file)
-/*\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
+/*
+ * 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 BIO BIO - Individual bit input-output stream */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Write a bit
+@param bio BIO handle
+@param b Bit to write (0 or 1)
+*/
+static void bio_putbit(opj_bio_t *bio, int b);
+/**
+Read a bit
+@param bio BIO handle
+@return Returns the read bit
+*/
+static int bio_getbit(opj_bio_t *bio);
+/**
+Write a byte
+@param bio BIO handle
+@return Returns 0 if successful, returns 1 otherwise
+*/
+static int bio_byteout(opj_bio_t *bio);
+/**
+Read a byte
+@param bio BIO handle
+@return Returns 0 if successful, returns 1 otherwise
+*/
+static int bio_bytein(opj_bio_t *bio);
+
+/*@}*/
+
+/*@}*/
+
+/* 
+==========================================================
+   local functions
+==========================================================
+*/
+
+static int bio_byteout(opj_bio_t *bio) {
+  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;
+}
+
+static int bio_bytein(opj_bio_t *bio) {
+  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;
+}
+
+static void bio_putbit(opj_bio_t *bio, int b) {
+  if (bio->ct == 0) {
+    bio_byteout(bio);
+  }
+  bio->ct--;
+  bio->buf |= b << bio->ct;
+}
+
+static int bio_getbit(opj_bio_t *bio) {
+  if (bio->ct == 0) {
+    bio_bytein(bio);
+  }
+  bio->ct--;
+  return (bio->buf >> bio->ct) & 1;
+}
+
+/* 
+==========================================================
+   Bit Input/Output interface
+==========================================================
+*/
+
+opj_bio_t* bio_create() {
+  opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
+  return bio;
+}
+
+void bio_destroy(opj_bio_t *bio) {
+  if(bio) {
+    opj_free(bio);
+  }
+}
+
+int bio_numbytes(opj_bio_t *bio) {
+  return (bio->bp - bio->start);
+}
+
+void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len) {
+  bio->start = bp;
+  bio->end = bp + len;
+  bio->bp = bp;
+  bio->buf = 0;
+  bio->ct = 8;
+}
+
+void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len) {
+  bio->start = bp;
+  bio->end = bp + len;
+  bio->bp = bp;
+  bio->buf = 0;
+  bio->ct = 0;
+}
+
+void bio_write(opj_bio_t *bio, int v, int n) {
+  int i;
+  for (i = n - 1; i >= 0; i--) {
+    bio_putbit(bio, (v >> i) & 1);
+  }
+}
+
+int bio_read(opj_bio_t *bio, int n) {
+  int i, v;
+  v = 0;
+  for (i = n - 1; i >= 0; i--) {
+    v += bio_getbit(bio) << i;
+  }
+  return v;
+}
+
+int bio_flush(opj_bio_t *bio) {
+  bio->ct = 0;
+  if (bio_byteout(bio)) {
+    return 1;
+  }
+  if (bio->ct == 7) {
+    bio->ct = 0;
+    if (bio_byteout(bio)) {
+      return 1;
+    }
+  }
+  return 0;
+}
+
+int bio_inalign(opj_bio_t *bio) {
+  bio->ct = 0;
+  if ((bio->buf & 0xff) == 0xff) {
+    if (bio_bytein(bio)) {
+      return 1;
+    }
+    bio->ct = 0;
+  }
+  return 0;
+}
index ecffff28d2c9ecf24858a8d1f28b47b7e1ec87b8..e64bf06234cfc6ad8e3218390813eff9d5ec6586 100644 (file)
-/*\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
+/*
+ * 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.
+ */
+
+#ifndef __BIO_H
+#define __BIO_H
+/** 
+@file bio.h
+@brief Implementation of an individual bit input-output (BIO)
+
+The functions in BIO.C have for goal to realize an individual bit input - output.
+*/
+
+/** @defgroup BIO BIO - Individual bit input-output stream */
+/*@{*/
+
+/**
+Individual bit input-output stream (BIO)
+*/
+typedef struct opj_bio {
+  /** pointer to the start of the buffer */
+  unsigned char *start;
+  /** pointer to the end of the buffer */
+  unsigned char *end;
+  /** pointer to the present position in the buffer */
+  unsigned char *bp;
+  /** temporary place where each byte is read or written */
+  unsigned int buf;
+  /** coder : number of bits free to write. decoder : number of bits read */
+  int ct;
+} opj_bio_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a new BIO handle 
+@return Returns a new BIO handle if successful, returns NULL otherwise
+*/
+opj_bio_t* bio_create();
+/**
+Destroy a previously created BIO handle
+@param bio BIO handle to destroy
+*/
+void bio_destroy(opj_bio_t *bio);
+/**
+Number of bytes written.
+@param bio BIO handle
+@return Returns the number of bytes written
+*/
+int bio_numbytes(opj_bio_t *bio);
+/**
+Init encoder
+@param bio BIO handle
+@param bp Output buffer
+@param len Output buffer length 
+*/
+void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len);
+/**
+Init decoder
+@param bio BIO handle
+@param bp Input buffer
+@param len Input buffer length 
+*/
+void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len);
+/**
+Write bits
+@param bio BIO handle
+@param v Value of bits
+@param n Number of bits to write
+*/
+void bio_write(opj_bio_t *bio, int v, int n);
+/**
+Read bits
+@param bio BIO handle
+@param n Number of bits to read 
+@return Returns the corresponding read number
+*/
+int bio_read(opj_bio_t *bio, int n);
+/**
+Flush bits
+@param bio BIO handle
+@return Returns 1 if successful, returns 0 otherwise
+*/
+int bio_flush(opj_bio_t *bio);
+/**
+Passes the ending bits (coming from flushing)
+@param bio BIO handle
+@return Returns 1 if successful, returns 0 otherwise
+*/
+int bio_inalign(opj_bio_t *bio);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __BIO_H */
+
index 0b05b3d12fb65dc01eedf3ad77a8b3a6e4c5f7b9..0f4048b74c090bbced8ab819237d1157dbd38356 100644 (file)
@@ -1,85 +1,85 @@
-/*\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
+/*
+ * 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.
+ */
+
+#ifndef __CIO_H
+#define __CIO_H
+/**
+@file cio.h
+@brief Implementation of a byte input-output process (CIO)
+
+The functions in CIO.C have for goal to realize a byte input / output process.
+*/
+
+/** @defgroup CIO CIO - byte input-output stream */
+/*@{*/
+
+/** @name Exported functions (see also openjpeg.h) */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Number of bytes left before the end of the stream
+@param cio CIO handle
+@return Returns the number of bytes before the end of the stream
+*/
+int cio_numbytesleft(opj_cio_t *cio);
+/**
+Get pointer to the current position in the stream
+@param cio CIO handle
+@return Returns a pointer to the current position
+*/
+unsigned char *cio_getbp(opj_cio_t *cio);
+/**
+Write some bytes
+@param cio CIO handle
+@param v Value to write
+@param n Number of bytes to write
+@return Returns the number of bytes written or 0 if an error occured
+*/
+unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n);
+/**
+Read some bytes
+@param cio CIO handle
+@param n Number of bytes to read
+@return Returns the value of the n bytes read
+*/
+unsigned int cio_read(opj_cio_t *cio, int n);
+/**
+Skip some bytes
+@param cio CIO handle
+@param n Number of bytes to skip
+*/
+void cio_skip(opj_cio_t *cio, int n);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __CIO_H */
+
index d9a1dd635811a0e3fa3c9b4ea87e8be0bca3e070..53c4a5e3f04f21c972a2ab3d6f480b2543d5f8d2 100644 (file)
-/*\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
+/*
+ * 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.
+ */
+
+/*
+ *  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 "opj_includes.h"
+
+/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Forward lazy transform (horizontal)
+*/
+static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas);
+/**
+Forward lazy transform (vertical)
+*/
+static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas);
+/**
+Inverse lazy transform (horizontal)
+*/
+static void dwt_interleave_h(int *a, int *b, int dn, int sn, int cas);
+/**
+Inverse lazy transform (vertical)
+*/
+static void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas);
+/**
+Forward 5-3 wavelet tranform in 1-D
+*/
+static void dwt_encode_1(int *a, int dn, int sn, int cas);
+/**
+Inverse 5-3 wavelet tranform in 1-D
+*/
+static void dwt_decode_1(int *a, int dn, int sn, int cas);
+/**
+Forward 9-7 wavelet transform in 1-D
+*/
+static void dwt_encode_1_real(int *a, int dn, int sn, int cas);
+/**
+Inverse 9-7 wavelet transform in 1-D
+*/
+static void dwt_decode_1_real(int *a, int dn, int sn, int cas);
+/**
+FIXME : comment ???
+*/
+static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize);
+
+/*@}*/
+
+/*@}*/
+
+#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>                                                             */
+static const double dwt_norms[4][10] = {
+  {1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},
+  {1.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>                                                             */
+static const double dwt_norms_real[4][10] = {
+  {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},
+  {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}
+};
+
+/* 
+==========================================================
+   local functions
+==========================================================
+*/
+
+/* <summary>                       */
+/* Forward lazy transform (horizontal).  */
+/* </summary>                            */ 
+static 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>                            */ 
+static 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>                            */
+static void dwt_interleave_h(int *a, int *b, int dn, int sn, int cas) {
+    int i;
+    int *ai = NULL;
+    int *bi = NULL;
+    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>                            */ 
+static void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas) {
+    int i;
+    int *ai = NULL;
+    int *bi = NULL;
+    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>                           */
+static 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>                           */ 
+static 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 9-7 wavelet transform in 1-D. */
+/* </summary>                            */
+static void dwt_encode_1_real(int *a, int dn, int sn, int cas) {
+  int i;
+  if (!cas) {
+    if ((dn > 0) || (sn > 1)) {  /* NEW :  CASE ONE ELEMENT */
+      for (i = 0; i < dn; i++)
+        D(i) -= fix_mul(S_(i) + S_(i + 1), 12993);
+      for (i = 0; i < sn; i++)
+        S(i) -= fix_mul(D_(i - 1) + D_(i), 434);
+      for (i = 0; i < dn; i++)
+        D(i) += fix_mul(S_(i) + S_(i + 1), 7233);
+      for (i = 0; i < sn; i++)
+        S(i) += fix_mul(D_(i - 1) + D_(i), 3633);
+      for (i = 0; i < dn; i++)
+        D(i) = fix_mul(D(i), 5038);  /*5038 */
+      for (i = 0; i < sn; i++)
+        S(i) = fix_mul(S(i), 6659);  /*6660 */
+    }
+  } else {
+    if ((sn > 0) || (dn > 1)) {  /* NEW :  CASE ONE ELEMENT */
+      for (i = 0; i < dn; i++)
+        S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993);
+      for (i = 0; i < sn; i++)
+        D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434);
+      for (i = 0; i < dn; i++)
+        S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233);
+      for (i = 0; i < sn; i++)
+        D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633);
+      for (i = 0; i < dn; i++)
+        S(i) = fix_mul(S(i), 5038);  /*5038 */
+      for (i = 0; i < sn; i++)
+        D(i) = fix_mul(D(i), 6659);  /*6660 */
+    }
+  }
+}
+
+/* <summary>                             */
+/* Inverse 9-7 wavelet transform in 1-D. */
+/* </summary>                            */
+static void dwt_decode_1_real(int *a, int dn, int sn, int cas) {
+  int i;
+  if (!cas) {
+    if ((dn > 0) || (sn > 1)) {  /* NEW :  CASE ONE ELEMENT */
+      for (i = 0; i < sn; i++)
+        S(i) = fix_mul(S(i), 10078);  /* 10076 */
+      for (i = 0; i < dn; i++)
+        D(i) = fix_mul(D(i), 13318);  /* 13320 */
+      for (i = 0; i < sn; i++)
+        S(i) -= fix_mul(D_(i - 1) + D_(i), 3633);
+      for (i = 0; i < dn; i++)
+        D(i) -= fix_mul(S_(i) + S_(i + 1), 7233);
+      for (i = 0; i < sn; i++)
+        S(i) += fix_mul(D_(i - 1) + D_(i), 434);
+      for (i = 0; i < dn; i++)
+        D(i) += fix_mul(S_(i) + S_(i + 1), 12994);  /* 12993 */
+    }
+  } else {
+    if ((sn > 0) || (dn > 1)) {  /* NEW :  CASE ONE ELEMENT */
+      for (i = 0; i < sn; i++)
+        D(i) = fix_mul(D(i), 10078);  /* 10076 */
+      for (i = 0; i < dn; i++)
+        S(i) = fix_mul(S(i), 13318);  /* 13320 */
+      for (i = 0; i < sn; i++)
+        D(i) -= fix_mul(SS_(i) + SS_(i + 1), 3633);
+      for (i = 0; i < dn; i++)
+        S(i) -= fix_mul(DD_(i) + DD_(i - 1), 7233);
+      for (i = 0; i < sn; i++)
+        D(i) += fix_mul(SS_(i) + SS_(i + 1), 434);
+      for (i = 0; i < dn; i++)
+        S(i) += fix_mul(DD_(i) + DD_(i - 1), 12994);  /* 12993 */
+    }
+  }
+}
+
+static void dwt_encode_stepsize(int stepsize, int numbps, opj_stepsize_t *bandno_stepsize) {
+  int p, n;
+  p = int_floorlog2(stepsize) - 13;
+  n = 11 - int_floorlog2(stepsize);
+  bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;
+  bandno_stepsize->expn = numbps - p;
+}
+
+/* 
+==========================================================
+   DWT interface
+==========================================================
+*/
+
+/* <summary>                            */
+/* Forward 5-3 wavelet tranform in 2-D. */
+/* </summary>                           */
+void dwt_encode(opj_tcd_tilecomp_t * tilec) {
+  int i, j, k;
+  int *a = NULL;
+  int *aj = NULL;
+  int *bj = NULL;
+  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*)opj_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);
+    }
+    opj_free(bj);
+    
+    sn = rw1;
+    dn = rw - rw1;
+    bj = (int*)opj_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);
+    }
+    opj_free(bj);
+  }
+}
+
+
+/* <summary>                            */
+/* Inverse 5-3 wavelet tranform in 2-D. */
+/* </summary>                           */
+void dwt_decode(opj_tcd_tilecomp_t * tilec, int stop) {
+  int i, j, k;
+  int *a = NULL;
+  int *aj = NULL;
+  int *bj = NULL;
+  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*)opj_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];
+    }
+    opj_free(bj);
+    
+    sn = rh1;
+    dn = rh - rh1;
+    bj = (int*)opj_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];
+    }
+    opj_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 2-D. */
+/* </summary>                            */
+
+void dwt_encode_real(opj_tcd_tilecomp_t * tilec) {
+  int i, j, k;
+  int *a = NULL;
+  int *aj = NULL;
+  int *bj = NULL;
+  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*)opj_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);
+    }
+    opj_free(bj);
+    
+    sn = rw1;
+    dn = rw - rw1;
+    bj = (int*)opj_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);
+    }
+    opj_free(bj);
+  }
+}
+
+
+/* <summary>                             */
+/* Inverse 9-7 wavelet transform in 2-D. */
+/* </summary>                            */
+void dwt_decode_real(opj_tcd_tilecomp_t * tilec, int stop) {
+  int i, j, k;
+  int *a = NULL;
+  int *aj = NULL;
+  int *bj = NULL;
+  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*)opj_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];
+    }
+    opj_free(bj);
+    
+    sn = rh1;
+    dn = rh-rh1;
+    bj = (int*)opj_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];
+    }
+    opj_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];
+}
+
+void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec) {
+  int numbands, bandno;
+  numbands = 3 * tccp->numresolutions - 2;
+  for (bandno = 0; bandno < numbands; bandno++) {
+    double stepsize;
+    int resno, level, orient, gain;
+
+    resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1);
+    orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1);
+    level = tccp->numresolutions - 1 - resno;
+    gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) || (orient == 2)) ? 1 : 2));
+    if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
+      stepsize = 1.0;
+    } else {
+      double norm = dwt_norms_real[orient][level];
+      stepsize = (1 << (gain + 1)) / norm;
+    }
+    dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain, &tccp->stepsizes[bandno]);
+  }
+}
index 96ada27eaacaa389572ecc5bbf46c1add5cadb59..3ee99a37aa72a43f203e7f9bdd3e4d0791e5f0e7 100644 (file)
-/*\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
+/*
+ * 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.
+ */
+
+#ifndef __DWT_H
+#define __DWT_H
+/**
+@file dwt.h
+@brief Implementation of a discrete wavelet transform (DWT)
+
+The functions in DWT.C have for goal to realize forward and inverse discret wavelet
+transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in
+DWT.C are used by some function in TCD.C.
+*/
+
+/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
+/*@{*/
+
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Forward 5-3 wavelet tranform in 2-D. 
+Apply a reversible DWT transform to a component of an image.
+@param tilec Tile component information (current tile)
+*/
+void dwt_encode(opj_tcd_tilecomp_t * tilec);
+/**
+Inverse 5-3 wavelet tranform in 2-D.
+Apply a reversible inverse DWT transform to a component of an image.
+@param tilec Tile component information (current tile)
+@param stop FIXME Number of decoded resolution levels ?
+*/
+void dwt_decode(opj_tcd_tilecomp_t * tilec, int stop);
+/**
+Get the gain of a subband for the reversible 5-3 DWT.
+@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
+@return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise
+*/
+int dwt_getgain(int orient);
+/**
+Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT.
+@param level Level of the wavelet function
+@param orient Band of the wavelet function
+@return Returns the norm of the wavelet function
+*/
+double dwt_getnorm(int level, int orient);
+/**
+Forward 9-7 wavelet transform in 2-D. 
+Apply an irreversible DWT transform to a component of an image.
+@param tilec Tile component information (current tile)
+*/
+void dwt_encode_real(opj_tcd_tilecomp_t * tilec);
+/**
+Inverse 9-7 wavelet transform in 2-D. 
+Apply an irreversible inverse DWT transform to a component of an image.
+@param tilec Tile component information (current tile)
+@param stop FIXME Number of decoded resolution levels ?
+*/
+void dwt_decode_real(opj_tcd_tilecomp_t * tilec, int stop);
+/**
+Get the gain of a subband for the irreversible 9-7 DWT.
+@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
+@return Returns the gain of the 9-7 wavelet transform
+*/
+int dwt_getgain_real(int orient);
+/**
+Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT
+@param level Level of the wavelet function
+@param orient Band of the wavelet function
+@return Returns the norm of the 9-7 wavelet
+*/
+double dwt_getnorm_real(int level, int orient);
+/**
+FIXME : comment ???
+@param tccp
+@param prec
+*/
+void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __DWT_H */
index 5dd162d1cad0d6cff60322455d456739f0862dd5..bd0c06e2152cf562a78ebda9a1a645b8f9af39ed 100644 (file)
-/*\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
+/*
+ * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+/* ==========================================================
+     Utility functions
+   ==========================================================*/
+
+#ifndef WIN32
+static char*
+i2a(unsigned i, char *a, unsigned r) {
+  if (i/r > 0) a = i2a(i/r,a,r);
+  *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i%r];
+  return a+1;
+}
+
+/** 
+ Transforms integer i into an ascii string and stores the result in a; 
+ string is encoded in the base indicated by r.
+ @param i Number to be converted
+ @param a String result
+ @param r Base of value; must be in the range 2 - 36
+ @return Returns a
+*/
+static char *
+_itoa(int i, char *a, int r) {
+  r = ((r < 2) || (r > 36)) ? 10 : r;
+  if(i < 0) {
+    *a = '-';
+    *i2a(-i, a+1, r) = 0;
+  }
+  else *i2a(i, a, r) = 0;
+  return a;
+}
+
+#endif /* !WIN32 */
+
+/* ----------------------------------------------------------------------- */
+
+opj_event_mgr_t* opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context) {
+  if(cinfo) {
+    opj_event_mgr_t *previous = cinfo->event_mgr;
+    cinfo->event_mgr = event_mgr;
+    cinfo->client_data = context;
+    return previous;
+  }
+
+  return NULL;
+}
+
+bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) {
+#define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */
+  opj_msg_callback msg_handler = NULL;
+
+  opj_event_mgr_t *event_mgr = cinfo->event_mgr;
+  if(event_mgr != NULL) {
+    switch(event_type) {
+      case EVT_ERROR:
+        msg_handler = event_mgr->error_handler;
+        break;
+      case EVT_WARNING:
+        msg_handler = event_mgr->warning_handler;
+        break;
+      case EVT_INFO:
+        msg_handler = event_mgr->info_handler;
+        break;
+      default:
+        break;
+    }
+    if(msg_handler == NULL) {
+      return false;
+    }
+  } else {
+    return false;
+  }
+
+  if ((fmt != NULL) && (event_mgr != NULL)) {
+    va_list arg;
+    int str_length, i, j;
+    char message[MSG_SIZE];
+    memset(message, 0, MSG_SIZE);
+    /* initialize the optional parameter list */
+    va_start(arg, fmt);
+    /* check the length of the format string */
+    str_length = (strlen(fmt) > MSG_SIZE) ? MSG_SIZE : strlen(fmt);
+    /* parse the format string and put the result in 'message' */
+    for (i = 0, j = 0; i < str_length; ++i) {
+      if (fmt[i] == '%') {
+        if (i + 1 < str_length) {
+          switch(tolower(fmt[i + 1])) {
+            case '%' :
+              message[j++] = '%';
+              break;
+            case 'o' : /* octal numbers */
+            {
+              char tmp[16];
+              _itoa(va_arg(arg, int), tmp, 8);
+              strcat(message, tmp);
+              j += strlen(tmp);
+              ++i;
+              break;
+            }
+            case 'i' : /* decimal numbers */
+            case 'd' :
+            {
+              char tmp[16];
+              _itoa(va_arg(arg, int), tmp, 10);
+              strcat(message, tmp);
+              j += strlen(tmp);
+              ++i;
+              break;
+            }
+            case 'x' : /* hexadecimal numbers */
+            {
+              char tmp[16];
+              _itoa(va_arg(arg, int), tmp, 16);
+              strcat(message, tmp);
+              j += strlen(tmp);
+              ++i;
+              break;
+            }
+            case 's' : /* strings */
+            {
+              char *tmp = va_arg(arg, char*);
+              strcat(message, tmp);
+              j += strlen(tmp);
+              ++i;
+              break;
+            }
+            case 'f' :  /* floats */
+            {
+              char tmp[16];
+              double value = va_arg(arg, double);
+              sprintf(tmp, "%f", value);
+              strcat(message, tmp);
+              j += strlen(tmp);
+              ++i;
+              break;
+            }
+          };
+        } else {
+          message[j++] = fmt[i];
+        }
+      } else {
+        message[j++] = fmt[i];
+      };
+    }
+    /* deinitialize the optional parameter list */
+    va_end(arg);
+
+    /* output the message to the user program */
+    msg_handler(message, cinfo->client_data);
+  }
+
+  return true;
+}
+
index 5a8666c050f0eeb90d57990ddedca376dd650bb5..75c504d86b00379f4a63213ed6f42de221c66ad3 100644 (file)
@@ -1,58 +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
+/*
+ * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __EVENT_H
+#define __EVENT_H
+/**
+@file event.h
+@brief Implementation of a event callback system
+
+The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user.
+*/
+
+#define EVT_ERROR  1  /**< Error event type */
+#define EVT_WARNING  2  /**< Warning event type */
+#define EVT_INFO  4  /**< Debug event type */
+
+/** @defgroup EVENT EVENT - Implementation of a event callback system */
+/*@{*/
+
+/** @name Exported functions (see also openjpeg.h) */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Write formatted data to a string and send the string to a user callback. 
+@param cinfo Codec context info
+@param event_type Event type or callback to use to send the message
+@param fmt Format-control string (plus optionnal arguments)
+@return Returns true if successful, returns false otherwise
+*/
+bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __EVENT_H */
index 69081a3d0f6e168b848ac3b6d601c5a857d4d572..21d440088384981de44afacef4f4d8b862b8df81 100644 (file)
@@ -1,45 +1,45 @@
-/*\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
+/*
+ * 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 "fix.h"
+
+#ifdef WIN32
+#define int64 __int64
+#else
+#define int64 long long
+#endif
+
+int fix_mul(int a, int b) {
+    int64 temp = (int64) a * (int64) b >> 12;
+    return (int) ((temp >> 1) + (temp & 1)) ;
+}
+
+
+
index b52753e1afc543c924144aca16ef57d2a958769a..b5b62e67bef224f3084f277b50a91c57a341f3c9 100644 (file)
@@ -1,52 +1,52 @@
-/*\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
+/*
+ * 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.
+ */
+#ifndef __FIX_H
+#define __FIX_H
+/**
+@file fix.h
+@brief Implementation of operations of specific multiplication (FIX)
+
+The functions in FIX.C have for goal to realize specific multiplication.
+*/
+
+/** @defgroup FIX FIX - Implementation of operations of specific multiplication */
+/*@{*/
+
+/**
+Multiply two fixed-precision rational numbers.
+@param a
+@param b
+@return Returns a * b
+*/
+int fix_mul(int a, int b);
+
+/*@}*/
+
+#endif /* __FIX_H */
index bc39016b09376ad8a8f587280c83e0b71584f691..576701b25dc9612b2aa61f41d8ccdcb9f32e37ee 100644 (file)
@@ -1,87 +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
+/*
+ * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+opj_image_t* opj_image_create0() {
+  opj_image_t *image = (opj_image_t*)opj_malloc(sizeof(opj_image_t));
+  return image;
+}
+
+opj_image_t *opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {
+  int compno;
+  opj_image_t *image = NULL;
+
+  image = (opj_image_t*)opj_malloc(sizeof(opj_image_t));
+  if(image) {
+    image->color_space = clrspc;
+    image->numcomps = numcmpts;
+    /* allocate memory for the per-component information */
+    image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(opj_image_comp_t));
+    if(!image->comps) {
+      opj_image_destroy(image);
+      return NULL;
+    }
+    /* create the individual image components */
+    for(compno = 0; compno < numcmpts; compno++) {
+      opj_image_comp_t *comp = &image->comps[compno];
+      comp->dx = cmptparms[compno].dx;
+      comp->dy = cmptparms[compno].dy;
+      comp->w = cmptparms[compno].w;
+      comp->h = cmptparms[compno].h;
+      comp->x0 = cmptparms[compno].x0;
+      comp->y0 = cmptparms[compno].y0;
+      comp->prec = cmptparms[compno].prec;
+      comp->bpp = cmptparms[compno].bpp;
+      comp->sgnd = cmptparms[compno].sgnd;
+      comp->data = (int*)opj_malloc(comp->w * comp->h * sizeof(int));
+      if(!comp->data) {
+        opj_image_destroy(image);
+        return NULL;
+      }
+    }
+  }
+
+  return image;
+}
+
+void opj_image_destroy(opj_image_t *image) {
+  int i;
+  if(image) {
+    if(image->comps) {
+      /* image components */
+      for(i = 0; i < image->numcomps; i++) {
+        opj_image_comp_t *image_comp = &image->comps[i];
+        if(image_comp->data) {
+          opj_free(image_comp->data);
+        }
+      }
+      opj_free(image->comps);
+    }
+    opj_free(image);
+  }
+}
+
index 8aa8d844b20100fa12ff673580d14af7e69eea06..b56de4acb30fcfcd140f0e2093265a097c7ba243 100644 (file)
@@ -1,48 +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
+/*
+ * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef __IMAGE_H
+#define __IMAGE_H
+/**
+@file image.h
+@brief Implementation of operations on images (IMAGE)
+
+The functions in IMAGE.C have for goal to realize operations on images.
+*/
+
+/** @defgroup IMAGE IMAGE - Implementation of operations on images */
+/*@{*/
+
+/**
+Create an empty image
+@todo this function should be removed
+@return returns an empty image if successful, returns NULL otherwise
+*/
+opj_image_t* opj_image_create0();
+
+/*@}*/
+
+#endif /* __IMAGE_H */
+
index a969bea697942154e26da9ed1922d2fc9bc422fb..f27726f99181f1e73c3692b866e367152f47007e 100644 (file)
@@ -1,72 +1,72 @@
-/*\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
+/*
+ * 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"
+
+int int_min(int a, int b) {
+  return a < b ? a : b;
+}
+
+int int_max(int a, int b) {
+  return (a > b) ? a : b;
+}
+
+int int_clamp(int a, int min, int max) {
+  if (a < min)
+    return min;
+  if (a > max)
+    return max;
+  return a;
+}
+
+int int_abs(int a) {
+  return a < 0 ? -a : a;
+}
+
+int int_ceildiv(int a, int b) {
+  return (a + b - 1) / b;
+}
+
+int int_ceildivpow2(int a, int b) {
+  return (a + (1 << b) - 1) >> b;
+}
+
+int int_floordivpow2(int a, int b) {
+  return a >> b;
+}
+
+int int_floorlog2(int a) {
+  int l;
+  for (l = 0; a > 1; l++) {
+    a >>= 1;
+  }
+  return l;
+}
+
index accfd64e4830507c8ac2fc12d506043189bebd55..aff0905fb0bd4694e1aaff9440e9dadd1ac6a225 100644 (file)
@@ -1,95 +1,95 @@
-/*\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
+/*
+ * 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.
+ */
+#ifndef __INT_H
+#define __INT_H
+/**
+@file int.h
+@brief Implementation of operations on integers (INT)
+
+The functions in INT.C have for goal to realize operations on integers.
+*/
+
+/** @defgroup INT INT - Implementation of operations on integers */
+/*@{*/
+
+/** @name Exported functions (see also openjpeg.h) */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Get the minimum of two integers
+@return Returns a if a < b else b
+*/
+int int_min(int a, int b);
+/**
+Get the maximum of two integers
+@return Returns a if a > b else b
+*/
+int int_max(int a, int b);
+/**
+Clamp an integer inside an interval
+@return
+<ul>
+<li>Returns a if (min < a < max)
+<li>Returns max if (a > max)
+<li>Returns min if (a < min) 
+</ul>
+*/
+int int_clamp(int a, int min, int max);
+/**
+@return Get absolute value of integer
+*/
+int int_abs(int a);
+/**
+Divide an integer and round upwards
+@return Returns a divided by b
+*/
+int int_ceildiv(int a, int b);
+/**
+Divide an integer by a power of 2 and round upwards
+@return Returns a divided by 2^b
+*/
+int int_ceildivpow2(int a, int b);
+/**
+Divide an integer by a power of 2 and round downwards
+@return Returns a divided by 2^b
+*/
+int int_floordivpow2(int a, int b);
+/**
+Get logarithm of an integer and round downwards
+@return Returns log2(a)
+*/
+int int_floorlog2(int a);
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif
index e80b68bfcadbe61501b32ca03507b25c3c198d96..225c3cd3cae6ecee52060efa7a7783e911b0a1ba 100644 (file)
-/*\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
+/*
+ * 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.
+ */
+#ifndef __J2K_H
+#define __J2K_H
+/**
+@file j2k.h
+@brief The JPEG-2000 Codestream Reader/Writer (J2K)
+
+The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data.
+*/
+
+/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
+/*@{*/
+
+#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
+
+/* ----------------------------------------------------------------------- */
+
+#define J2K_MS_SOC 0xff4f  /**< SOC marker value */
+#define J2K_MS_SOT 0xff90  /**< SOT marker value */
+#define J2K_MS_SOD 0xff93  /**< SOD marker value */
+#define J2K_MS_EOC 0xffd9  /**< EOC marker value */
+#define J2K_MS_SIZ 0xff51  /**< SIZ marker value */
+#define J2K_MS_COD 0xff52  /**< COD marker value */
+#define J2K_MS_COC 0xff53  /**< COC marker value */
+#define J2K_MS_RGN 0xff5e  /**< RGN marker value */
+#define J2K_MS_QCD 0xff5c  /**< QCD marker value */
+#define J2K_MS_QCC 0xff5d  /**< QCC marker value */
+#define J2K_MS_POC 0xff5f  /**< POC marker value */
+#define J2K_MS_TLM 0xff55  /**< TLM marker value */
+#define J2K_MS_PLM 0xff57  /**< PLM marker value */
+#define J2K_MS_PLT 0xff58  /**< PLT marker value */
+#define J2K_MS_PPM 0xff60  /**< PPM marker value */
+#define J2K_MS_PPT 0xff61  /**< PPT marker value */
+#define J2K_MS_SOP 0xff91  /**< SOP marker value */
+#define J2K_MS_EPH 0xff92  /**< EPH marker value */
+#define J2K_MS_CRG 0xff63  /**< CRG marker value */
+#define J2K_MS_COM 0xff64  /**< COM marker value */
+
+/* ----------------------------------------------------------------------- */
+
+/**
+Values that specify the status of the decoding process when decoding the main header. 
+These values may be combined with a | operator. 
+*/
+typedef enum J2K_STATUS {
+  J2K_STATE_MHSOC  = 0x0001, /**< a SOC marker is expected */
+  J2K_STATE_MHSIZ  = 0x0002, /**< a SIZ marker is expected */
+  J2K_STATE_MH     = 0x0004, /**< the decoding process is in the main header */
+  J2K_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */
+  J2K_STATE_TPH    = 0x0010, /**< the decoding process is in a tile part header */
+  J2K_STATE_MT     = 0x0020, /**< the EOC marker has just been read */
+  J2K_STATE_NEOC   = 0x0040  /**< the decoding process must not expect a EOC marker because the codestream is truncated */
+} J2K_STATUS;
+
+/* ----------------------------------------------------------------------- */
+
+/**
+Quantization stepsize
+*/
+typedef struct opj_stepsize {
+  /** exponent */
+  int expn;
+  /** mantissa */
+  int mant;
+} opj_stepsize_t;
+
+/**
+Tile-component coding parameters
+*/
+typedef struct opj_tccp {
+  /** coding style */
+  int csty;
+  /** number of resolutions */
+  int numresolutions;
+  /** code-blocks width */
+  int cblkw;
+  /** code-blocks height */
+  int cblkh;
+  /** code-block coding style */
+  int cblksty;
+  /** discrete wavelet transform identifier */
+  int qmfbid;
+  /** quantisation style */
+  int qntsty;
+  /** stepsizes used for quantization */
+  opj_stepsize_t stepsizes[J2K_MAXBANDS];
+  /** number of guard bits */
+  int numgbits;
+  /** Region Of Interest shift */
+  int roishift;
+  /** precinct width */
+  int prcw[J2K_MAXRLVLS];
+  /** precinct height */
+  int prch[J2K_MAXRLVLS];  
+} opj_tccp_t;
+
+/**
+Tile coding parameters : 
+this structure is used to store coding/decoding parameters common to all
+tiles (information like COD, COC in main header)
+*/
+typedef struct opj_tcp {
+  /** 1 : first part-tile of a tile */
+  int first;
+  /** coding style */
+  int csty;
+  /** progression order */
+  OPJ_PROG_ORDER prg;
+  /** number of layers */
+  int numlayers;
+  /** multi-component transform identifier */
+  int mct;
+  /** rates of layers */
+  int rates[100];
+  /** number of progression order changes */
+  int numpocs;
+  /** indicates if a POC marker has been used O:NO, 1:YES */
+  int POC;
+  /** progression order changes */
+  opj_poc_t pocs[32];
+  /** packet header store there for futur use in t2_decode_packet */
+  unsigned char *ppt_data;
+  /** pointer remaining on the first byte of the first header if ppt is used */
+  unsigned char *ppt_data_first;
+  /** If ppt == 1 --> there was a PPT marker for the present tile */
+  int ppt;
+  /** used in case of multiple marker PPT (number of info already stored) */
+  int ppt_store;
+  /** ppmbug1 */
+  int ppt_len;
+  /** add fixed_quality */
+  float distoratio[100];
+  /** tile-component coding parameters */
+  opj_tccp_t *tccps;
+} opj_tcp_t;
+
+/**
+Coding parameters
+*/
+typedef struct opj_cp {
+  /** allocation by rate/distortion */
+  int disto_alloc;
+  /** allocation by fixed layer */
+  int fixed_alloc;
+  /** add fixed_quality */
+  int fixed_quality;
+  /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
+  int reduce;
+  /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
+  int layer;
+  /** 0 = no index || 1 = index */
+  int index_on;
+  /** XTOsiz */
+  int tx0;
+  /** YTOsiz */
+  int ty0;
+  /** XTsiz */
+  int tdx;
+  /** YTsiz */
+  int tdy;
+  /** comment for coding */
+  char *comment;
+  /** number of tiles in width */
+  int tw;
+  /** number of tiles in heigth */
+  int th;
+  /** ID number of the tiles present in the codestream */
+  int *tileno;
+  /** size of the vector tileno */
+  int tileno_size;
+  /** packet header store there for futur use in t2_decode_packet */
+  unsigned char *ppm_data;
+  /** pointer remaining on the first byte of the first header if ppm is used */
+  unsigned char *ppm_data_first;
+  /** if ppm == 1 --> there was a PPM marker for the present tile */
+  int ppm;
+  /** use in case of multiple marker PPM (number of info already store) */
+  int ppm_store;
+  /** use in case of multiple marker PPM (case on non-finished previous info) */
+  int ppm_previous;
+  /** ppmbug1 */
+  int ppm_len;
+  /** tile coding parameters */
+  opj_tcp_t *tcps;
+  /** fixed layer */
+  int *matrice;
+} opj_cp_t;
+
+/**
+Information concerning a packet inside tile
+*/
+typedef struct opj_packet_info {
+  /** start position */
+  int start_pos;
+  /** end position */
+  int end_pos;
+  /** ADD for Marcela */
+  double disto;
+} opj_packet_info_t;
+
+/**
+Index structure : information regarding tiles inside image
+*/
+typedef struct opj_tile_info {
+  /** value of thresh for each layer by tile cfr. Marcela   */
+  double *thresh;
+  /** number of tile */
+  int num_tile;
+  /** start position */
+  int start_pos;
+  /** end position of the header */
+  int end_header;
+  /** end position */
+  int end_pos;
+  /** precinct number for each resolution level (width) */
+  int pw[33];
+  /** precinct number for each resolution level (height) */
+  int ph[33];
+  /** precinct size (in power of 2), in X for each resolution level */
+  int pdx[33];
+  /** precinct size (in power of 2), in Y for each resolution level */
+  int pdy[33];
+  /** information concerning packets inside tile */
+  opj_packet_info_t *packet;
+  /** add fixed_quality */
+  int nbpix;
+  /** add fixed_quality */
+  double distotile;
+} opj_tile_info_t;
+
+/**
+Index structure
+*/
+typedef struct opj_image_info {
+  /** 0 = no index || 1 = index */
+  int index_on;
+  /** maximum distortion reduction on the whole image (add for Marcela) */
+  double D_max;
+  /** packet number */
+  int num;
+  /** writing the packet in the index with t2_encode_packets */
+  int index_write;
+  /** image width */
+  int image_w;
+  /** image height */
+  int image_h;
+  /** progression order */
+  OPJ_PROG_ORDER prog;
+  /** tile size in x */
+  int tile_x;
+  /** tile size in y */
+  int tile_y;
+  /** */
+  int tile_Ox;
+  /** */
+  int tile_Oy;
+  /** number of tiles in X */
+  int tw;
+  /** number of tiles in Y */
+  int th;
+  /** component numbers */
+  int comp;
+  /** number of layer */
+  int layer;
+  /** number of decomposition */
+  int decomposition;
+  /** main header position */
+  int main_head_end;
+  /** codestream's size */
+  int codestream_size;
+  /** information regarding tiles inside image */
+  opj_tile_info_t *tile;
+} opj_image_info_t;
+
+/**
+JPEG-2000 codestream reader/writer
+*/
+typedef struct opj_j2k {
+  /** codec context */
+  opj_common_ptr cinfo;
+
+  /** locate in which part of the codestream the decoder is (main header, tile header, end) */
+  int state;
+  /** number of the tile curently concern by coding/decoding */
+  int curtileno;
+  /** 
+  locate the position of the end of the tile in the codestream, 
+  used to detect a truncated codestream (in j2k_read_sod)
+  */
+  unsigned char *eot;
+  /**
+  locate the start position of the SOT marker of the current coded tile:  
+  after encoding the tile, a jump (in j2k_write_sod) is done to the SOT marker to store the value of its length. 
+  */
+  int sot_start;
+  int sod_start;
+  /**
+  as the J2K-file is written in several parts during encoding, 
+  it enables to make the right correction in position return by cio_tell
+  */
+  int pos_correction;
+  /** array used to store the data of each tile */
+  unsigned char **tile_data;
+  /** array used to store the length of each tile */
+  int *tile_len;
+  /** 
+  decompression only : 
+  store decoding parameters common to all tiles (information like COD, COC in main header)
+  */
+  opj_tcp_t *default_tcp;
+  /** pointer to the encoded / decoded image */
+  opj_image_t *image;
+  /** pointer to the coding parameters */
+  opj_cp_t *cp;
+  /** helper used to write the index file */
+  opj_image_info_t *image_info;
+  /** pointer to the byte i/o stream */
+  opj_cio_t *cio;
+} opj_j2k_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Creates a J2K decompression structure
+@param cinfo Codec context info
+@return Returns a handle to a J2K decompressor if successful, returns NULL otherwise
+*/
+opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo);
+/**
+Destroy a J2K decompressor handle
+@param j2k J2K decompressor handle to destroy
+*/
+void j2k_destroy_decompress(opj_j2k_t *j2k);
+/**
+Setup the decoder decoding parameters using user parameters.
+Decoding parameters are returned in j2k->cp. 
+@param j2k J2K decompressor handle
+@param parameters decompression parameters
+*/
+void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);
+/**
+Decode an image from a JPEG-2000 codestream
+@param j2k J2K decompressor handle
+@param cio Input buffer stream
+@return Returns a decoded image if successful, returns NULL otherwise
+*/
+opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio);
+/**
+Decode an image form a JPT-stream (JPEG 2000, JPIP)
+@param j2k J2K decompressor handle
+@param cio Input buffer stream
+@return Returns a decoded image if successful, returns NULL otherwise
+*/
+opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio);
+/**
+Creates a J2K compression structure
+@param cinfo Codec context info
+@return Returns a handle to a J2K compressor if successful, returns NULL otherwise
+*/
+opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo);
+/**
+Destroy a J2K compressor handle
+@param j2k J2K compressor handle to destroy
+*/
+void j2k_destroy_compress(opj_j2k_t *j2k);
+/**
+Setup the encoder parameters using the current image and using user parameters. 
+Coding parameters are returned in j2k->cp. 
+@param j2k J2K compressor handle
+@param parameters compression parameters
+@param image input filled image
+*/
+void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_t *image);
+/**
+Encode an image into a JPEG-2000 codestream
+@param j2k J2K compressor handle
+@param cio Output buffer stream
+@param image Image to encode
+@param index Name of the index file if required, NULL otherwise
+@return Returns true if successful, returns false otherwise
+*/
+bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, char *index);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __J2K_H */
index 1d47fa6e29d662ec3dcb1e9e52cab8748edbcbec..133caee475cffee4ff2148cfbab3637b6c30a01b 100644 (file)
-/*\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
+/*
+ * 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.
+ */
+#ifndef __JP2_H
+#define __JP2_H
+/**
+@file jp2.h
+@brief The JPEG-2000 file format Reader/Writer (JP2)
+
+*/
+
+/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
+/*@{*/
+
+#define JPIP_JPIP 0x6a706970
+
+#define JP2_JP   0x6a502020    /**< JPEG 2000 signature box */
+#define JP2_FTYP 0x66747970    /**< File type box */
+#define JP2_JP2H 0x6a703268    /**< JP2 header box */
+#define JP2_IHDR 0x69686472    /**< Image header box */
+#define JP2_COLR 0x636f6c72    /**< Colour specification box */
+#define JP2_JP2C 0x6a703263    /**< Contiguous codestream box */
+#define JP2_URL  0x75726c20    /**< URL box */
+#define JP2_DBTL 0x6474626c    /**< ??? */
+#define JP2_BPCC 0x62706363    /**< Bits per component box */
+#define JP2_JP2  0x6a703220    /**< File type fields */
+
+/* ----------------------------------------------------------------------- */
+
+/** 
+JP2 component
+*/
+typedef struct opj_jp2_comps {
+  int depth;      
+  int sgnd;       
+  int bpcc;
+} opj_jp2_comps_t;
+
+/**
+JPEG-2000 file format reader/writer
+*/
+typedef struct opj_jp2 {
+  /** codec context */
+  opj_common_ptr cinfo;
+  /** handle to the J2K codec  */
+  opj_j2k_t *j2k;
+  unsigned int w;
+  unsigned int 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;
+  opj_jp2_comps_t *comps;
+  opj_image_t *image;
+  unsigned int j2k_codestream_offset;
+  unsigned int j2k_codestream_length;
+} opj_jp2_t;
+
+/**
+JP2 Box
+*/
+typedef struct opj_jp2_box {
+  int length;
+  int type;
+  int init_pos;
+} opj_jp2_box_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Creates a JP2 decompression structure
+@param cinfo Codec context info
+@return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise
+*/
+opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo);
+/**
+Destroy a JP2 decompressor handle
+@param jp2 JP2 decompressor handle to destroy
+*/
+void jp2_destroy_decompress(opj_jp2_t *jp2);
+/**
+Setup the decoder decoding parameters using user parameters.
+Decoding parameters are returned in jp2->j2k->cp. 
+@param jp2 JP2 decompressor handle
+@param parameters decompression parameters
+*/
+void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);
+/**
+Decode an image from a JPEG-2000 file stream
+@param jp2 JP2 decompressor handle
+@param cio Input buffer stream
+@return Returns a decoded image if successful, returns NULL otherwise
+*/
+opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio);
+/**
+Creates a JP2 compression structure
+@param cinfo Codec context info
+@return Returns a handle to a JP2 compressor if successful, returns NULL otherwise
+*/
+opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo);
+/**
+Destroy a JP2 compressor handle
+@param jp2 JP2 compressor handle to destroy
+*/
+void jp2_destroy_compress(opj_jp2_t *jp2);
+/**
+Setup the encoder parameters using the current image and using user parameters. 
+Coding parameters are returned in jp2->j2k->cp. 
+@param jp2 JP2 compressor handle
+@param parameters compression parameters
+@param image input filled image
+*/
+void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_t *image);
+/**
+Encode an image into a JPEG-2000 file stream
+@param jp2 JP2 compressor handle
+@param cio Output buffer stream
+@param image Image to encode
+@param index Name of the index file if required, NULL otherwise
+@return Returns true if successful, returns false otherwise
+*/
+bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, char *index);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __JP2_H */
+
index 032d3bcf2d8a8c0aa26778476a4a9670b8f16d03..9b75994b069e0c0b23e633b0611281e132314c16 100644 (file)
-/*\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
+/*
+ * 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"
+
+/*
+ * Read the information contains in VBAS [JPP/JPT stream message header]
+ * Store information (7 bits) in value
+ *
+ */
+unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value) {
+  unsigned char elmt;
+
+  elmt = cio_read(cio, 1);
+  while ((elmt >> 7) == 1) {
+    value = (value << 7);
+    value |= (elmt & 0x7f);
+    elmt = cio_read(cio, 1);
+  }
+  value = (value << 7);
+  value |= (elmt & 0x7f);
+
+  return value;
+}
+
+/*
+ * Initialize the value of the message header structure 
+ *
+ */
+void jpt_init_msg_header(opj_jpt_msg_header_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(opj_jpt_msg_header_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(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header) {
+  unsigned char elmt, Class = 0, CSn = 0;
+  jpt_reinit_msg_header(header);
+
+  /* ------------- */
+  /* VBAS : Bin-ID */
+  /* ------------- */
+  elmt = cio_read(cio, 1);
+
+  /* See for Class and CSn */
+  switch ((elmt >> 5) & 0x03) {
+    case 0:
+      opj_event_msg(cinfo, EVT_ERROR, "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(cio, header->Id);
+
+  /* ------------ */
+  /* VBAS : Class */
+  /* ------------ */
+  if (Class == 1) {
+    header->Class_Id = 0;
+    header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id);
+  }
+
+  /* ---------- */
+  /* VBAS : CSn */
+  /* ---------- */
+  if (CSn == 1) {
+    header->CSn_Id = 0;
+    header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id);
+  }
+
+  /* ----------------- */
+  /* VBAS : Msg_offset */
+  /* ----------------- */
+  header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset);
+
+  /* ----------------- */
+  /* VBAS : Msg_length */
+  /* ----------------- */
+  header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length);
+
+  /* ---------- */
+  /* VBAS : Aux */
+  /* ---------- */
+  if ((header->Class_Id & 0x01) == 1) {
+    header->Layer_nb = 0;
+    header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb);
+  }
+}
index 71b32842b269c2932c50caa1e7e2d4f3f3a4bed1..f6250f54a179a5aa2d715c6c6055cd2fc4a71043 100644 (file)
@@ -1,74 +1,74 @@
-/*\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
+/*
+ * 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.
+ */
+
+#ifndef __JPT_H
+#define __JPT_H
+/**
+@file jpt.h
+@brief JPT-stream reader (JPEG 2000, JPIP)
+
+JPT-stream functions are implemented in J2K.C. 
+*/
+
+/**
+Message Header JPT stream structure
+*/
+typedef struct opj_jpt_msg_header {
+  /** In-class Identifier */
+  unsigned int Id;
+  /** Last byte information */
+  unsigned int last_byte;  
+  /** Class Identifier */
+  unsigned int Class_Id;  
+  /** CSn : index identifier */
+  unsigned int CSn_Id;
+  /** Message offset */
+  unsigned int Msg_offset;
+  /** Message length */
+  unsigned int Msg_length;
+  /** Auxiliary for JPP case */
+  unsigned int Layer_nb;
+} opj_jpt_msg_header_t;
+
+/* ----------------------------------------------------------------------- */
+
+/**
+Initialize the value of the message header structure 
+@param header Message header structure
+*/
+void jpt_init_msg_header(opj_jpt_msg_header_t * header);
+
+/**
+Read the message header for a JPP/JPT - stream
+@param cinfo Codec context info
+@param cio CIO handle
+@param header Message header structure
+*/
+void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio, opj_jpt_msg_header_t *header);
+
+#endif
index 4dee4b3a8e8fe29e5f247010c62175411f164853..b6e3c96eb2f4ee80e6e07aabaf4403d87368bb0c 100644 (file)
-/*\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
+/*
+ * 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"
+
+/* <summary> */
+/* This table contains the norms of the basis function of the reversible MCT. */
+/* </summary> */
+static const double mct_norms[3] = { 1.732, .8292, .8292 };
+
+/* <summary> */
+/* This table contains the norms of the basis function of the irreversible MCT. */
+/* </summary> */
+static const 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];
+}
index aad10ec29a2ddac3ec7aaa4c764b69b20eed0f4f..906d0db89e4568cafd1a48dade0805ca923e7305 100644 (file)
@@ -1,97 +1,97 @@
-/*\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
+/*
+ * 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.
+ */
+
+#ifndef __MCT_H
+#define __MCT_H
+/**
+@file mct.h
+@brief Implementation of a multi-component transforms (MCT)
+
+The functions in MCT.C have for goal to realize reversible and irreversible multicomponent
+transform. The functions in MCT.C are used by some function in TCD.C.
+*/
+
+/** @defgroup MCT MCT - Implementation of a multi-component transform */
+/*@{*/
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Apply a reversible multi-component transform to an image
+@param c0 Samples for red component
+@param c1 Samples for green component
+@param c2 Samples blue component
+@param n Number of samples for each component
+*/
+void mct_encode(int *c0, int *c1, int *c2, int n);
+/**
+Apply a reversible multi-component inverse transform to an image
+@param c0 Samples for luminance component
+@param c1 Samples for red chrominance component
+@param c2 Samples for blue chrominance component
+@param n Number of samples for each component
+*/
+void mct_decode(int *c0, int *c1, int *c2, int n);
+/**
+Get norm of the basis function used for the reversible multi-component transform
+@param compno Number of the component (0->Y, 1->U, 2->V)
+@return 
+*/
+double mct_getnorm(int compno);
+
+/**
+Apply an irreversible multi-component transform to an image
+@param c0 Samples for red component
+@param c1 Samples for green component
+@param c2 Samples blue component
+@param 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
+@param c0 Samples for luminance component
+@param c1 Samples for red chrominance component
+@param c2 Samples for blue chrominance component
+@param n Number of samples for each component
+*/
+void mct_decode_real(int *c0, int *c1, int *c2, int n);
+/**
+Get norm of the basis function used for the irreversible multi-component transform
+@param compno Number of the component (0->Y, 1->U, 2->V)
+@return 
+*/
+double mct_getnorm_real(int compno);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __MCT_H */
index e37e132e4acbb7662fae78b70caeaa999511aa7d..f06751af081188f4420d6604fb1386a142bc2264 100644 (file)
-/*\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
+/*
+ * 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 MQC MQC - Implementation of an MQ-Coder */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Output a byte, doing bit-stuffing if necessary.
+After a 0xff byte, the next byte must be smaller than 0x90.
+@param mqc MQC handle
+*/
+static void mqc_byteout(opj_mqc_t *mqc);
+/**
+Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000
+@param mqc MQC handle
+*/
+static void mqc_renorme(opj_mqc_t *mqc);
+/**
+Encode the most probable symbol
+@param mqc MQC handle
+*/
+static void mqc_codemps(opj_mqc_t *mqc);
+/**
+Encode the most least symbol
+@param mqc MQC handle
+*/
+static void mqc_codelps(opj_mqc_t *mqc);
+/**
+Fill mqc->c with 1's for flushing
+@param mqc MQC handle
+*/
+static void mqc_setbits(opj_mqc_t *mqc);
+/**
+FIXME: documentation ???
+@param mqc MQC handle
+@return 
+*/
+static int mqc_mpsexchange(opj_mqc_t *mqc);
+/**
+FIXME: documentation ???
+@param mqc MQC handle
+@return 
+*/
+static int mqc_lpsexchange(opj_mqc_t *mqc);
+/**
+Input a byte
+@param mqc MQC handle
+*/
+static void mqc_bytein(opj_mqc_t *mqc);
+/**
+Renormalize mqc->a and mqc->c while decoding
+@param mqc MQC handle
+*/
+static void mqc_renormd(opj_mqc_t *mqc);
+
+/*@}*/
+
+/*@}*/
+
+/* <summary> */
+/* This array defines all the possible states for a context. */
+/* </summary> */
+static opj_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]},
+};
+
+/* 
+==========================================================
+   local functions
+==========================================================
+*/
+
+static void mqc_byteout(opj_mqc_t *mqc) {
+  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;
+      }
+    }
+  }
+}
+
+static void mqc_renorme(opj_mqc_t *mqc) {
+  do {
+    mqc->a <<= 1;
+    mqc->c <<= 1;
+    mqc->ct--;
+    if (mqc->ct == 0) {
+      mqc_byteout(mqc);
+    }
+  } while ((mqc->a & 0x8000) == 0);
+}
+
+static void mqc_codemps(opj_mqc_t *mqc) {
+  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(mqc);
+  } else {
+    mqc->c += (*mqc->curctx)->qeval;
+  }
+}
+
+static void mqc_codelps(opj_mqc_t *mqc) {
+  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(mqc);
+}
+
+static void mqc_setbits(opj_mqc_t *mqc) {
+  unsigned int tempc = mqc->c + mqc->a;
+  mqc->c |= 0xffff;
+  if (mqc->c >= tempc) {
+    mqc->c -= 0x8000;
+  }
+}
+
+static int mqc_mpsexchange(opj_mqc_t *mqc) {
+  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;
+}
+
+static int mqc_lpsexchange(opj_mqc_t *mqc) {
+  int d;
+  if (mqc->a < (*mqc->curctx)->qeval) {
+    mqc->a = (*mqc->curctx)->qeval;
+    d = (*mqc->curctx)->mps;
+    *mqc->curctx = (*mqc->curctx)->nmps;
+  } else {
+    mqc->a = (*mqc->curctx)->qeval;
+    d = 1 - (*mqc->curctx)->mps;
+    *mqc->curctx = (*mqc->curctx)->nlps;
+  }
+  
+  return d;
+}
+
+static void mqc_bytein(opj_mqc_t *mqc) {
+  if (mqc->bp != mqc->end) {
+    unsigned int c;
+    if (mqc->bp + 1 != mqc->end) {
+      c = *(mqc->bp + 1);
+    } else {
+      c = 0xff;
+    }
+    if (*mqc->bp == 0xff) {
+      if (c > 0x8f) {
+        mqc->c += 0xff00;
+        mqc->ct = 8;
+      } else {
+        mqc->bp++;
+        mqc->c += c << 9;
+        mqc->ct = 7;
+      }
+    } else {
+      mqc->bp++;
+      mqc->c += c << 8;
+      mqc->ct = 8;
+    }
+  } else {
+    mqc->c += 0xff00;
+    mqc->ct = 8;
+  }
+}
+
+static void mqc_renormd(opj_mqc_t *mqc) {
+  do {
+    if (mqc->ct == 0) {
+      mqc_bytein(mqc);
+    }
+    mqc->a <<= 1;
+    mqc->c <<= 1;
+    mqc->ct--;
+  } while (mqc->a < 0x8000);
+}
+
+/* 
+==========================================================
+   MQ-Coder interface
+==========================================================
+*/
+
+opj_mqc_t* mqc_create() {
+  opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
+  return mqc;
+}
+
+void mqc_destroy(opj_mqc_t *mqc) {
+  if(mqc) {
+    opj_free(mqc);
+  }
+}
+
+int mqc_numbytes(opj_mqc_t *mqc) {
+  return mqc->bp - mqc->start;
+}
+
+void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp) {
+  mqc_setcurctx(mqc, 0);
+  mqc->a = 0x8000;
+  mqc->c = 0;
+  mqc->bp = bp - 1;
+  mqc->ct = 12;
+  if (*mqc->bp == 0xff) {
+    mqc->ct = 13;
+  }
+  mqc->start = bp;
+}
+
+void mqc_setcurctx(opj_mqc_t *mqc, int ctxno) {
+  mqc->curctx = &mqc->ctxs[ctxno];
+}
+
+void mqc_encode(opj_mqc_t *mqc, int d) {
+  if ((*mqc->curctx)->mps == d) {
+    mqc_codemps(mqc);
+  } else {
+    mqc_codelps(mqc);
+  }
+}
+
+void mqc_flush(opj_mqc_t *mqc) {
+  mqc_setbits(mqc);
+  mqc->c <<= mqc->ct;
+  mqc_byteout(mqc);
+  mqc->c <<= mqc->ct;
+  mqc_byteout(mqc);
+  
+  if (*mqc->bp != 0xff) {
+    mqc->bp++;
+  }
+}
+
+void mqc_bypass_init_enc(opj_mqc_t *mqc) {
+  mqc->c = 0;
+  mqc->ct = 8;
+  /*if (*mqc->bp == 0xff) {
+  mqc->ct = 7;
+     } */
+}
+
+void mqc_bypass_enc(opj_mqc_t *mqc, int d) {
+  mqc->ct--;
+  mqc->c = mqc->c + (d << mqc->ct);
+  if (mqc->ct == 0) {
+    mqc->bp++;
+    *mqc->bp = mqc->c;
+    mqc->ct = 8;
+    if (*mqc->bp == 0xff) {
+      mqc->ct = 7;
+    }
+    mqc->c = 0;
+  }
+}
+
+int mqc_bypass_flush_enc(opj_mqc_t *mqc) {
+  unsigned char bit_padding;
+  
+  bit_padding = 0;
+  
+  if (mqc->ct != 0) {
+    while (mqc->ct > 0) {
+      mqc->ct--;
+      mqc->c += bit_padding << mqc->ct;
+      bit_padding = (bit_padding + 1) & 0x01;
+    }
+    mqc->bp++;
+    *mqc->bp = mqc->c;
+    mqc->ct = 8;
+    mqc->c = 0;
+  }
+  
+  return 1;
+}
+
+void mqc_reset_enc(opj_mqc_t *mqc) {
+  mqc_resetstates(mqc);
+  mqc_setstate(mqc, 18, 0, 46);
+  mqc_setstate(mqc, 0, 0, 3);
+  mqc_setstate(mqc, 1, 0, 4);
+}
+
+int mqc_restart_enc(opj_mqc_t *mqc) {
+  int correction = 1;
+  
+  /* <flush part> */
+  int n = 27 - 15 - mqc->ct;
+  mqc->c <<= mqc->ct;
+  while (n > 0) {
+    mqc_byteout(mqc);
+    n -= mqc->ct;
+    mqc->c <<= mqc->ct;
+  }
+  mqc_byteout(mqc);
+  
+  return correction;
+}
+
+void mqc_restart_init_enc(opj_mqc_t *mqc) {
+  /* <Re-init part> */
+  mqc_setcurctx(mqc, 0);
+  mqc->a = 0x8000;
+  mqc->c = 0;
+  mqc->ct = 12;
+  mqc->bp--;
+  if (*mqc->bp == 0xff) {
+    mqc->ct = 13;
+  }
+}
+
+void mqc_erterm_enc(opj_mqc_t *mqc) {
+  int k = 11 - mqc->ct + 1;
+  
+  while (k > 0) {
+    mqc->c <<= mqc->ct;
+    mqc->ct = 0;
+    mqc_byteout(mqc);
+    k -= mqc->ct;
+  }
+  
+  if (*mqc->bp != 0xff) {
+    mqc_byteout(mqc);
+  }
+}
+
+void mqc_segmark_enc(opj_mqc_t *mqc) {
+  int i;
+  mqc_setcurctx(mqc, 18);
+  
+  for (i = 1; i < 5; i++) {
+    mqc_encode(mqc, i % 2);
+  }
+}
+
+void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) {
+  mqc_setcurctx(mqc, 0);
+  mqc->start = bp;
+  mqc->end = bp + len;
+  mqc->bp = bp;
+  if (len==0) mqc->c = 0xff << 16;
+  else mqc->c = *mqc->bp << 16;
+  mqc_bytein(mqc);
+  mqc->c <<= 7;
+  mqc->ct -= 7;
+  mqc->a = 0x8000;
+}
+
+int mqc_decode(opj_mqc_t *mqc) {
+  int d;
+  mqc->a -= (*mqc->curctx)->qeval;
+  if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
+    d = mqc_lpsexchange(mqc);
+    mqc_renormd(mqc);
+  } else {
+    mqc->c -= (*mqc->curctx)->qeval << 16;
+    if ((mqc->a & 0x8000) == 0) {
+      d = mqc_mpsexchange(mqc);
+      mqc_renormd(mqc);
+    } else {
+      d = (*mqc->curctx)->mps;
+    }
+  }
+
+  return d;
+}
+
+void mqc_resetstates(opj_mqc_t *mqc) {
+  int i;
+  for (i = 0; i < MQC_NUMCTXS; i++) {
+    mqc->ctxs[i] = mqc_states;
+  }
+}
+
+void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob) {
+  mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)];
+}
+
+
index 6b38bd36e4504edc682d42a1cad1827b53b3d7f8..0104048d0f10f856ec7ce4906f92d6007aa5c106 100644 (file)
-/*\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
+/*
+ * 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.
+ */
+
+#ifndef __MQC_H
+#define __MQC_H
+/**
+@file mqc.h
+@brief Implementation of an MQ-Coder (MQC)
+
+The functions in MQC.C have for goal to realize the MQ-coder operations. The functions
+in MQC.C are used by some function in T1.C.
+*/
+
+/** @defgroup MQC MQC - Implementation of an MQ-Coder */
+/*@{*/
+
+/**
+This struct defines the state of a context.
+*/
+typedef struct opj_mqc_state {
+  /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
+  unsigned int qeval;
+  /** the Most Probable Symbol (0 or 1) */
+  int mps;
+  /** next state if the next encoded symbol is the MPS */
+  struct opj_mqc_state *nmps;
+  /** next state if the next encoded symbol is the LPS */
+  struct opj_mqc_state *nlps;
+} opj_mqc_state_t;
+
+#define MQC_NUMCTXS 32
+
+/**
+MQ coder
+*/
+typedef struct opj_mqc {
+  unsigned int c;
+  unsigned int a;
+  unsigned int ct;
+  unsigned char *bp;
+  unsigned char *start;
+  unsigned char *end;
+  opj_mqc_state_t *ctxs[MQC_NUMCTXS];
+  opj_mqc_state_t **curctx;
+} opj_mqc_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a new MQC handle 
+@return Returns a new MQC handle if successful, returns NULL otherwise
+*/
+opj_mqc_t* mqc_create();
+/**
+Destroy a previously created MQC handle
+@param mqc MQC handle to destroy
+*/
+void mqc_destroy(opj_mqc_t *mqc);
+/**
+Return the number of bytes written/read since initialisation
+@param mqc MQC handle
+@return Returns the number of bytes already encoded
+*/
+int mqc_numbytes(opj_mqc_t *mqc);
+/**
+Reset the states of all the context of the coder/decoder 
+(each context is set to a state where 0 and 1 are more or less equiprobable)
+@param mqc MQC handle
+*/
+void mqc_resetstates(opj_mqc_t *mqc);
+/**
+Set the state of a particular context
+@param mqc MQC handle
+@param ctxno Number that identifies the context
+@param msb The MSB of the new state of the context
+@param prob Number that identifies the probability of the symbols for the new state of the context
+*/
+void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob);
+/**
+Initialize the encoder
+@param mqc MQC handle
+@param bp Pointer to the start of the buffer where the bytes will be written
+*/
+void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp);
+/**
+Set the current context used for coding/decoding
+@param mqc MQC handle
+@param ctxno Number that identifies the context
+*/
+void mqc_setcurctx(opj_mqc_t *mqc, int ctxno);
+/**
+Encode a symbol using the MQ-coder
+@param mqc MQC handle
+@param d The symbol to be encoded (0 or 1)
+*/
+void mqc_encode(opj_mqc_t *mqc, int d);
+/**
+Flush the encoder, so that all remaining data is written
+@param mqc MQC handle
+*/
+void mqc_flush(opj_mqc_t *mqc);
+/**
+BYPASS mode switch, initialization operation. 
+JPEG 2000 p 505. 
+<h2>Not fully implemented and tested !!</h2>
+@param mqc MQC handle
+*/
+void mqc_bypass_init_enc(opj_mqc_t *mqc);
+/**
+BYPASS mode switch, coding operation. 
+JPEG 2000 p 505. 
+<h2>Not fully implemented and tested !!</h2>
+@param mqc MQC handle
+@param d The symbol to be encoded (0 or 1)
+*/
+void mqc_bypass_enc(opj_mqc_t *mqc, int d);
+/**
+BYPASS mode switch, flush operation
+<h2>Not fully implemented and tested !!</h2>
+@param mqc MQC handle
+@return Returns 1 (always)
+*/
+int mqc_bypass_flush_enc(opj_mqc_t *mqc);
+/**
+RESET mode switch
+@param mqc MQC handle
+*/
+void mqc_reset_enc(opj_mqc_t *mqc);
+/**
+RESTART mode switch (TERMALL)
+@param mqc MQC handle
+@return Returns 1 (always)
+*/
+int mqc_restart_enc(opj_mqc_t *mqc);
+/**
+RESTART mode switch (TERMALL) reinitialisation
+@param mqc MQC handle
+*/
+void mqc_restart_init_enc(opj_mqc_t *mqc);
+/**
+ERTERM mode switch (PTERM)
+@param mqc MQC handle
+*/
+void mqc_erterm_enc(opj_mqc_t *mqc);
+/**
+SEGMARK mode switch (SEGSYM)
+@param mqc MQC handle
+*/
+void mqc_segmark_enc(opj_mqc_t *mqc);
+/**
+Initialize the decoder
+@param mqc MQC handle
+@param bp Pointer to the start of the buffer from which the bytes will be read
+@param len Length of the input buffer
+*/
+void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len);
+/**
+Decode a symbol
+@param mqc MQC handle
+@return Returns the decoded symbol (0 or 1)
+*/
+int mqc_decode(opj_mqc_t *mqc);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __MQC_H */
index 0028b4fd7d1e607081b60a0c917e66035c6bf2a8..9f872e4752ca3d040635c7b785b17143e0eb2984 100644 (file)
-/*\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
+/*
+ * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "opj_includes.h"
+
+const char * opj_version() {
+    return OPENJPEG_VERSION;
+}
+
+opj_dinfo_t* opj_create_decompress(OPJ_CODEC_FORMAT format) {
+  opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_malloc(sizeof(opj_dinfo_t));
+  if(!dinfo) return NULL;
+  dinfo->is_decompressor = true;
+  switch(format) {
+    case CODEC_J2K:
+    case CODEC_JPT:
+      /* get a J2K decoder handle */
+      dinfo->j2k_handle = (void*)j2k_create_decompress((opj_common_ptr)dinfo);
+      if(!dinfo->j2k_handle) {
+        opj_free(dinfo);
+        return NULL;
+      }
+      break;
+    case CODEC_JP2:
+      /* get a JP2 decoder handle */
+      dinfo->jp2_handle = (void*)jp2_create_decompress((opj_common_ptr)dinfo);
+      if(!dinfo->jp2_handle) {
+        opj_free(dinfo);
+        return NULL;
+      }
+      break;
+    default:
+      opj_free(dinfo);
+      return NULL;
+  }
+
+  dinfo->codec_format = format;
+
+  return dinfo;
+}
+
+void opj_destroy_decompress(opj_dinfo_t *dinfo) {
+  if(dinfo) {
+    /* destroy the codec */
+    switch(dinfo->codec_format) {
+      case CODEC_J2K:
+      case CODEC_JPT:
+        j2k_destroy_decompress((opj_j2k_t*)dinfo->j2k_handle);
+        break;
+      case CODEC_JP2:
+        jp2_destroy_decompress((opj_jp2_t*)dinfo->jp2_handle);
+        break;
+    }
+    /* destroy the decompressor */
+    opj_free(dinfo);
+  }
+}
+
+void opj_set_default_decoder_parameters(opj_dparameters_t *parameters) {
+  if(parameters) {
+    memset(parameters, 0, sizeof(opj_dparameters_t));
+    /* default decoding parameters */
+    parameters->cp_layer = 0;
+    parameters->cp_reduce = 0;
+
+    parameters->decod_format = -1;
+    parameters->cod_format = -1;
+  }
+}
+
+void opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters) {
+  if(dinfo && parameters) {
+    switch(dinfo->codec_format) {
+      case CODEC_J2K:
+      case CODEC_JPT:
+        j2k_setup_decoder((opj_j2k_t*)dinfo->j2k_handle, parameters);
+        break;
+      case CODEC_JP2:
+        jp2_setup_decoder((opj_jp2_t*)dinfo->jp2_handle, parameters);
+        break;
+    }
+  }
+}
+
+opj_image_t* opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio) {
+  if(dinfo && cio) {
+    switch(dinfo->codec_format) {
+      case CODEC_J2K:
+        return j2k_decode((opj_j2k_t*)dinfo->j2k_handle, cio);
+      case CODEC_JPT:
+        return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio);
+      case CODEC_JP2:
+        return jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio);
+    }
+  }
+
+  return NULL;
+}
+
+opj_cinfo_t* opj_create_compress(OPJ_CODEC_FORMAT format) {
+  opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_malloc(sizeof(opj_cinfo_t));
+  if(!cinfo) return NULL;
+  cinfo->is_decompressor = false;
+  switch(format) {
+    case CODEC_J2K:
+      /* get a J2K coder handle */
+      cinfo->j2k_handle = (void*)j2k_create_compress((opj_common_ptr)cinfo);
+      if(!cinfo->j2k_handle) {
+        opj_free(cinfo);
+        return NULL;
+      }
+      break;
+    case CODEC_JP2:
+      /* get a JP2 coder handle */
+      cinfo->jp2_handle = (void*)jp2_create_compress((opj_common_ptr)cinfo);
+      if(!cinfo->jp2_handle) {
+        opj_free(cinfo);
+        return NULL;
+      }
+      break;
+    default:
+      opj_free(cinfo);
+      return NULL;
+  }
+
+  cinfo->codec_format = format;
+
+  return cinfo;
+}
+
+void opj_destroy_compress(opj_cinfo_t *cinfo) {
+  if(cinfo) {
+    /* destroy the codec */
+    switch(cinfo->codec_format) {
+      case CODEC_J2K:
+        j2k_destroy_decompress((opj_j2k_t*)cinfo->j2k_handle);
+        break;
+      case CODEC_JP2:
+        jp2_destroy_decompress((opj_jp2_t*)cinfo->jp2_handle);
+        break;
+    }
+    /* destroy the decompressor */
+    opj_free(cinfo);
+  }
+}
+
+void opj_set_default_encoder_parameters(opj_cparameters_t *parameters) {
+  if(parameters) {
+    memset(parameters, 0, sizeof(opj_cparameters_t));
+    /* default coding parameters */
+    parameters->numresolution = 6;
+    parameters->cblockw_init = 64;
+    parameters->cblockh_init = 64;
+    parameters->prog_order = LRCP;
+    parameters->roi_compno = -1;    /* no ROI */
+    parameters->subsampling_dx = 1;
+    parameters->subsampling_dy = 1;
+
+    parameters->decod_format = -1;
+    parameters->cod_format = -1;
+  }
+}
+
+void opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image) {
+  if(cinfo && parameters && image) {
+    switch(cinfo->codec_format) {
+      case CODEC_J2K:
+        j2k_setup_encoder((opj_j2k_t*)cinfo->j2k_handle, parameters, image);
+        break;
+      case CODEC_JP2:
+        jp2_setup_encoder((opj_jp2_t*)cinfo->jp2_handle, parameters, image);
+        break;
+    }
+  }
+}
+
+bool opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index) {
+  if(cinfo && cio && image) {
+    switch(cinfo->codec_format) {
+      case CODEC_J2K:
+        return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, index);
+      case CODEC_JP2:
+        return jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, index);
+    }
+  }
+
+  return false;
+}
+
+
index 23f7d04b01e1f0e7f14436b09298bfe0518d2ca1..058198d07fc47621da422e11badd36989591ffcc 100644 (file)
-/*\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
+/*
+ * 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.
+ */
+#ifndef OPENJPEG_H
+#define OPENJPEG_H
+
+#define OPENJPEG_VERSION "1.0.0"
+
+/* 
+==========================================================
+   Compiler directives
+==========================================================
+*/
+#ifndef __cplusplus
+#if defined(HAVE_STDBOOL_H)
+/*
+The C language implementation does correctly provide the standard header
+file "stdbool.h".
+ */
+#include <stdbool.h>
+#else
+/*
+The C language implementation does not provide the standard header file
+"stdbool.h" as required by ISO/IEC 9899:1999.  Try to compensate for this
+braindamage below.
+*/
+#if !defined(bool)
+#define  bool  int
+#endif
+#if !defined(true)
+#define true  1
+#endif
+#if !defined(false)
+#define  false  0
+#endif
+#endif
+#endif /* __cplusplus */
+
+/* 
+==========================================================
+   Useful constant definitions
+==========================================================
+*/
+
+#ifndef MAX_PATH
+#define MAX_PATH 260  /**< Maximum allowed size for filenames */
+#endif /* MAX_PATH */
+
+#define J2K_MAXRLVLS 33          /**< Number of maximum resolution level authorized */
+#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2)  /**< Number of maximum sub-band linked to number of resolution level */
+
+/* 
+==========================================================
+   enum definitions
+==========================================================
+*/
+
+/** Progression order */
+typedef enum PROG_ORDER {
+  PROG_UNKNOWN = -1,  /**< place-holder */
+  LRCP = 0,    /**< layer-resolution-component-precinct order */
+  RLCP = 1,    /**< resolution-layer-component-precinct order */
+  RPCL = 2,    /**< resolution-precinct-component-layer order */
+  PCRL = 3,    /**< precinct-component-resolution-layer order */
+  CPRL = 4    /**< component-precinct-resolution-layer order */
+} OPJ_PROG_ORDER;
+
+/**
+Supported image color spaces
+*/
+typedef enum COLOR_SPACE {
+  CLRSPC_UNKNOWN = -1,  /**< place-holder */
+  CLRSPC_SRGB = 1,    /**< sRGB */
+  CLRSPC_GRAY = 2,    /**< grayscale */
+  CLRSPC_SYCC = 3      /**< YUV */
+} OPJ_COLOR_SPACE;
+
+/**
+Supported codec
+*/
+typedef enum CODEC_FORMAT {
+  CODEC_UNKNOWN = -1,  /**< place-holder */
+  CODEC_J2K = 0,    /**< JPEG-2000 codestream : read/write */
+  CODEC_JPT = 1,    /**< JPT-stream (JPEG 2000, JPIP) : read only */
+  CODEC_JP2 = 2    /**< JPEG-2000 file format : read/write */
+} OPJ_CODEC_FORMAT;
+
+/* 
+==========================================================
+   event manager typedef definitions
+==========================================================
+*/
+
+/**
+Callback function prototype for events
+@param msg Event message
+@param client_data 
+*/
+typedef void (*opj_msg_callback) (const char *msg, void *client_data);
+
+/**
+Message handler object
+used for 
+<ul>
+<li>Error messages
+<li>Warning messages
+<li>Debugging messages
+</ul>
+*/
+typedef struct opj_event_mgr {
+  /** Error message callback if available, NULL otherwise */
+  opj_msg_callback error_handler;
+  /** Warning message callback if available, NULL otherwise */
+  opj_msg_callback warning_handler;
+  /** Debug message callback if available, NULL otherwise */
+  opj_msg_callback info_handler;
+} opj_event_mgr_t;
+
+
+/* 
+==========================================================
+   codec typedef definitions
+==========================================================
+*/
+
+/**
+Progression order changes
+*/
+typedef struct opj_poc {
+  int resno0, compno0;
+  int layno1, resno1, compno1;
+  OPJ_PROG_ORDER prg;
+  int tile;
+  char progorder[4];
+} opj_poc_t;
+
+/**
+Compression parameters
+*/
+typedef struct opj_cparameters {
+  /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
+  bool tile_size_on;
+  /** XTOsiz */
+  int cp_tx0;
+  /** YTOsiz */
+  int cp_ty0;
+  /** XTsiz */
+  int cp_tdx;
+  /** YTsiz */
+  int cp_tdy;
+  /** allocation by rate/distortion */
+  int cp_disto_alloc;
+  /** allocation by fixed layer */
+  int cp_fixed_alloc;
+  /** add fixed_quality */
+  int cp_fixed_quality;
+  /** fixed layer */
+  int *cp_matrice;
+  /** comment for coding */
+  char *cp_comment;
+  /** csty : coding style */
+  int csty;
+  /** progression order (default LRCP) */
+  OPJ_PROG_ORDER prog_order;
+  /** progression order changes */
+  opj_poc_t POC[32];
+  /** number of progression order changes (POC), default to 0 */
+  int numpocs;
+  /** number of layers */
+  int tcp_numlayers;
+  /** rates of layers */
+  int tcp_rates[100];
+  /** different psnr for successive layers */
+  float tcp_distoratio[100];
+  /** number of resolutions */
+  int numresolution;
+  /** initial code block width, default to 64 */
+   int cblockw_init;
+  /** initial code block height, default to 64 */
+  int cblockh_init;
+  /** mode switch (cblk_style) */
+  int mode;
+  /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */
+  int irreversible;
+  /** region of interest: affected component in [0..3], -1 means no ROI */
+  int roi_compno;
+  /** region of interest: upshift value */
+  int roi_shift;
+  /* number of precinct size specifications */
+  int res_spec;
+  /** initial precinct width */
+  int prcw_init[J2K_MAXRLVLS];
+  /** initial precinct height */
+  int prch_init[J2K_MAXRLVLS];
+
+  /**@name command line encoder parameters (not used inside the library) */
+  /*@{*/
+  /** input file name */
+  char infile[MAX_PATH];
+  /** output file name */
+  char outfile[MAX_PATH];
+  /** creation of an index file, default to 0 (false) */
+  int index_on;
+  /** index file name */
+  char index[MAX_PATH];
+  /** subimage encoding: origin image offset in x direction */
+  int image_offset_x0;
+  /** subimage encoding: origin image offset in y direction */
+  int image_offset_y0;
+  /** subsampling value for dx */
+  int subsampling_dx;
+  /** subsampling value for dy */
+  int subsampling_dy;
+  /** input file format 0: PGX, 1: PxM, 2: BMP */
+  int decod_format;
+  /** output file format 0: J2K, 1: JP2, 2: JPT */
+  int cod_format;
+  /*@}*/
+} opj_cparameters_t;
+
+/**
+Decompression parameters
+*/
+typedef struct opj_dparameters {
+  /** 
+  Set the number of highest resolution levels to be discarded. 
+  The image resolution is effectively divided by 2 to the power of the number of discarded levels. 
+  The reduce factor is limited by the smallest total number of decomposition levels among tiles.
+  if != 0, then original dimension divided by 2^(reduce); 
+  if == 0 or not used, image is decoded to the full resolution 
+  */
+  int cp_reduce;
+  /** 
+  Set the maximum number of quality layers to decode. 
+  If there are less quality layers than the specified number, all the quality layers are decoded.
+  if != 0, then only the first "layer" layers are decoded; 
+  if == 0 or not used, all the quality layers are decoded 
+  */
+  int cp_layer;
+
+  /**@name command line encoder parameters (not used inside the library) */
+  /*@{*/
+  /** input file name */
+  char infile[MAX_PATH];
+  /** output file name */
+  char outfile[MAX_PATH];
+  /** input file format 0: J2K, 1: JP2, 2: JPT */
+  int decod_format;
+  /** output file format 0: PGX, 1: PxM, 2: BMP */
+  int cod_format;
+  /*@}*/
+} opj_dparameters_t;
+
+/** Common fields between JPEG-2000 compression and decompression master structs. */
+
+#define opj_common_fields \
+  opj_event_mgr_t *event_mgr;  /**< pointer to the event manager */\
+  void * client_data;      /**< Available for use by application */\
+  bool is_decompressor;    /**< So common code can tell which is which */\
+  OPJ_CODEC_FORMAT codec_format;  /**< selected codec */\
+  void *j2k_handle;      /**< pointer to the J2K codec */\
+  void *jp2_handle      /**< pointer to the JP2 codec */
+  
+/* Routines that are to be used by both halves of the library are declared
+ * to receive a pointer to this structure.  There are no actual instances of
+ * opj_common_struct_t, only of opj_cinfo_t and opj_dinfo_t.
+ */
+typedef struct opj_common_struct {
+  opj_common_fields;    /* Fields common to both master struct types */
+  /* Additional fields follow in an actual opj_cinfo_t or
+   * opj_dinfo_t.  All three structs must agree on these
+   * initial fields!  (This would be a lot cleaner in C++.)
+   */
+} opj_common_struct_t;
+
+typedef opj_common_struct_t * opj_common_ptr;
+
+/**
+Compression context info
+*/
+typedef struct opj_cinfo {
+  /** Fields shared with opj_dinfo_t */
+  opj_common_fields;  
+  /* other specific fields go here */
+} opj_cinfo_t;
+
+/**
+Decompression context info
+*/
+typedef struct opj_dinfo {
+  /** Fields shared with opj_cinfo_t */
+  opj_common_fields;  
+  /* other specific fields go here */
+} opj_dinfo_t;
+
+/* 
+==========================================================
+   I/O stream typedef definitions
+==========================================================
+*/
+
+/*
+ * Stream open flags.
+ */
+/** The stream was opened for reading. */
+#define OPJ_STREAM_READ  0x0001
+/** The stream was opened for writing. */
+#define OPJ_STREAM_WRITE 0x0002
+
+/**
+Byte input-output stream (CIO)
+*/
+typedef struct opj_cio {
+  /** codec context */
+  opj_common_ptr cinfo;
+
+  /** open mode (read/write) either OPJ_STREAM_READ or OPJ_STREAM_WRITE */
+  int openmode;
+  /** pointer to the start of the buffer */
+  unsigned char *buffer;
+  /** buffer size in bytes */
+  int length;
+
+  /** pointer to the start of the stream */
+  unsigned char *start;
+  /** pointer to the end of the stream */
+  unsigned char *end;
+  /** pointer to the current position */
+  unsigned char *bp;
+} opj_cio_t;
+
+/* 
+==========================================================
+   image typedef definitions
+==========================================================
+*/
+
+/**
+Defines a single image component
+*/
+typedef struct opj_image_comp {
+  /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
+  int dx;
+  /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
+  int dy;
+  /** data width */
+  int w;
+  /** data height */
+  int h;
+  /** x component offset compared to the whole image */
+  int x0;
+  /** y component offset compared to the whole image */
+  int y0;
+  /** precision */
+  int prec;
+  /** image depth in bits */
+  int bpp;
+  /** signed (1) / unsigned (0) */
+  int sgnd;
+  /** number of decoded resolution */
+  int resno_decoded;
+  /** number of division by 2 of the out image compared to the original size of image */
+  int factor;
+  /** image component data */
+  int *data;
+} opj_image_comp_t;
+
+/** 
+Defines image data and characteristics
+*/
+typedef struct opj_image {
+  /** XOsiz: horizontal offset from the origin of the reference grid to the left side of the image area */
+  int x0;
+  /** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */
+  int y0;
+  /** Xsiz: width of the reference grid */
+  int x1;
+  /** Ysiz: height of the reference grid */
+  int y1;
+  /** number of components in the image */
+  int numcomps;
+  /** color space: sRGB, Greyscale or YUV */
+  OPJ_COLOR_SPACE color_space;
+  /** image components */
+  opj_image_comp_t *comps;
+} opj_image_t;
+
+/**
+Component parameters structure used by the opj_image_create function
+*/
+typedef struct opj_image_comptparm {
+  /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
+  int dx;
+  /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
+  int dy;
+  /** data width */
+  int w;
+  /** data height */
+  int h;
+  /** x component offset compared to the whole image */
+  int x0;
+  /** y component offset compared to the whole image */
+  int y0;
+  /** precision */
+  int prec;
+  /** image depth in bits */
+  int bpp;
+  /** signed (1) / unsigned (0) */
+  int sgnd;
+} opj_image_cmptparm_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* 
+==========================================================
+   openjpeg version
+==========================================================
+*/
+
+const char * opj_version();
+
+/* 
+==========================================================
+   image functions definitions
+==========================================================
+*/
+
+/**
+Create an image
+@param numcmpts number of components
+@param cmptparms components parameters
+@param clrspc image color space
+@return returns a new image structure if successful, returns NULL otherwise
+*/
+opj_image_t *opj_image_create(int numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
+
+/**
+Deallocate any resources associated with an image
+@param image image to be destroyed
+*/
+void opj_image_destroy(opj_image_t *image);
+
+/* 
+==========================================================
+   stream functions definitions
+==========================================================
+*/
+
+/**
+Open and allocate a memory stream for read / write. 
+On reading, the user must provide a buffer containing encoded data. The buffer will be 
+wrapped by the returned CIO handle. 
+On writing, buffer parameters must be set to 0: a buffer will be allocated by the library 
+to contain encoded data. 
+@param cinfo Codec context info
+@param buffer Reading: buffer address. Writing: NULL
+@param length Reading: buffer length. Writing: 0
+@return Returns a CIO handle if successful, returns NULL otherwise
+*/
+opj_cio_t* opj_cio_open(opj_common_ptr cinfo, unsigned char *buffer, int length);
+
+/**
+Close and free a CIO handle
+@param cio CIO handle to free
+*/
+void opj_cio_close(opj_cio_t *cio);
+
+/**
+Get position in byte stream
+@param cio CIO handle
+@return Returns the position in bytes
+*/
+int cio_tell(opj_cio_t *cio);
+/**
+Set position in byte stream
+@param cio CIO handle
+@param pos Position, in number of bytes, from the beginning of the stream
+*/
+void cio_seek(opj_cio_t *cio, int pos);
+
+/* 
+==========================================================
+   event manager functions definitions
+==========================================================
+*/
+
+opj_event_mgr_t* opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context);
+
+/* 
+==========================================================
+   codec functions definitions
+==========================================================
+*/
+/**
+Creates a J2K/JPT/JP2 decompression structure
+@param format Decoder to select
+@return Returns a handle to a decompressor if successful, returns NULL otherwise
+*/
+opj_dinfo_t* opj_create_decompress(OPJ_CODEC_FORMAT format);
+/**
+Destroy a decompressor handle
+@param dinfo decompressor handle to destroy
+*/
+void opj_destroy_decompress(opj_dinfo_t *dinfo);
+/**
+Set decoding parameters to default values
+@param parameters Decompression parameters
+*/
+void opj_set_default_decoder_parameters(opj_dparameters_t *parameters);
+/**
+Setup the decoder decoding parameters using user parameters.
+Decoding parameters are returned in j2k->cp. 
+@param dinfo decompressor handle
+@param parameters decompression parameters
+*/
+void opj_setup_decoder(opj_dinfo_t *dinfo, opj_dparameters_t *parameters);
+/**
+Decode an image from a JPEG-2000 codestream
+@param dinfo decompressor handle
+@param cio Input buffer stream
+@return Returns a decoded image if successful, returns NULL otherwise
+*/
+opj_image_t* opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio);
+/**
+Creates a J2K/JP2 compression structure
+@param format Coder to select
+@return Returns a handle to a compressor if successful, returns NULL otherwise
+*/
+opj_cinfo_t* opj_create_compress(OPJ_CODEC_FORMAT format);
+/**
+Destroy a compressor handle
+@param cinfo compressor handle to destroy
+*/
+void opj_destroy_compress(opj_cinfo_t *cinfo);
+/**
+Set encoding parameters to default values, that means : 
+<ul>
+<li>Lossless
+<li>1 tile
+<li>Size of precinct : 2^15 x 2^15 (means 1 precinct)
+<li>Size of code-block : 64 x 64
+<li>Number of resolutions: 6
+<li>No SOP marker in the codestream
+<li>No EPH marker in the codestream
+<li>No sub-sampling in x or y direction
+<li>No mode switch activated
+<li>Progression order: LRCP
+<li>No index file
+<li>No ROI upshifted
+<li>No offset of the origin of the image
+<li>No offset of the origin of the tiles
+<li>Reversible DWT 5-3
+</ul>
+@param parameters Compression parameters
+*/
+void opj_set_default_encoder_parameters(opj_cparameters_t *parameters);
+/**
+Setup the encoder parameters using the current image and using user parameters. 
+@param cinfo compressor handle
+@param parameters compression parameters
+@param image input filled image
+*/
+void opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image);
+/**
+Encode an image into a JPEG-2000 codestream
+@param cinfo compressor handle
+@param cio Output buffer stream
+@param image Image to encode
+@param index Name of the index file if required, NULL otherwise
+@return Returns true if successful, returns false otherwise
+*/
+bool opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OPENJPEG_H */
index 6acb2f803d3d62ae02c92498171cc2ff9bf1b84d..565131eebaa48476a29ad1c9940940d7010b31b0 100644 (file)
@@ -1,80 +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
+/*
+ * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef OPJ_INCLUDES_H
+#define OPJ_INCLUDES_H
+
+/*
+ ==========================================================
+   Standard includes used by the library
+ ==========================================================
+*/
+#include <memory.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <float.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+/*
+ ==========================================================
+   OpenJPEG interface
+ ==========================================================
+ */
+#include "openjpeg.h"
+
+/*
+ ==========================================================
+   OpenJPEG modules
+ ==========================================================
+*/
+
+#include "j2k_lib.h"
+#include "event.h"
+#include "cio.h"
+
+#include "image.h"
+#include "j2k.h"
+#include "jp2.h"
+#include "jpt.h"
+
+#include "mqc.h"
+#include "raw.h"
+#include "bio.h"
+#include "tgt.h"
+#include "tcd.h"
+#include "t1.h"
+#include "dwt.h"
+#include "pi.h"
+#include "t2.h"
+#include "mct.h"
+#include "int.h"
+#include "fix.h"
+
+
+#endif /* OPJ_INCLUDES_H */
index 521e966ed2ff8ff51fb60c642b1e8c5e12b3d3ac..f5d170a0ce0f213ed43054529e7d679f9c57001d 100644 (file)
-/*\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
+/*
+ * 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 PI PI - Implementation of a packet iterator */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+/**
+Get next packet in layer-resolution-component-precinct order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true 
+*/
+static bool pi_next_lrcp(opj_pi_iterator_t * pi);
+/**
+Get next packet in resolution-layer-component-precinct order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true 
+*/
+static bool pi_next_rlcp(opj_pi_iterator_t * pi);
+/**
+Get next packet in resolution-precinct-component-layer order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true 
+*/
+static bool pi_next_rpcl(opj_pi_iterator_t * pi);
+/**
+Get next packet in precinct-component-resolution-layer order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true 
+*/
+static bool pi_next_pcrl(opj_pi_iterator_t * pi);
+/**
+Get next packet in component-precinct-resolution-layer order.
+@param pi packet iterator to modify
+@return returns false if pi pointed to the last packet or else returns true 
+*/
+static bool pi_next_cprl(opj_pi_iterator_t * pi);
+
+/*@}*/
+
+/*@}*/
+
+/* 
+==========================================================
+   local functions
+==========================================================
+*/
+
+static bool pi_next_lrcp(opj_pi_iterator_t * pi) {
+  opj_pi_comp_t *comp = NULL;
+  opj_pi_resolution_t *res = NULL;
+  long index = 0;
+  
+  if (!pi->first) {
+    comp = &pi->comps[pi->compno];
+    res = &comp->resolutions[pi->resno];
+    goto LABEL_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++) {
+          index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+          if (!pi->include[index]) {
+            pi->include[index] = 1;
+            return true;
+          }
+LABEL_SKIP:;
+        }
+      }
+    }
+  }
+  
+  return false;
+}
+
+static bool pi_next_rlcp(opj_pi_iterator_t * pi) {
+  opj_pi_comp_t *comp = NULL;
+  opj_pi_resolution_t *res = NULL;
+  long index = 0;
+
+  if (!pi->first) {
+    comp = &pi->comps[pi->compno];
+    res = &comp->resolutions[pi->resno];
+    goto LABEL_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++) {
+          index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+          if (!pi->include[index]) {
+            pi->include[index] = 1;
+            return true;
+          }
+LABEL_SKIP:;
+        }
+      }
+    }
+  }
+  
+  return false;
+}
+
+static bool pi_next_rpcl(opj_pi_iterator_t * pi) {
+  opj_pi_comp_t *comp = NULL;
+  opj_pi_resolution_t *res = NULL;
+  long index = 0;
+
+  if (!pi->first) {
+    goto LABEL_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;
+          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);
+          try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
+          rpx = res->pdx + levelno;
+          rpy = res->pdy + levelno;
+          if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
+            continue;
+          }
+          if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
+            continue;
+          }
+          
+          if ((res->pw==0)||(res->pw==0)) continue;
+          
+          if ((trx0==trx1)||(try0==try1)) continue;
+          
+          prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) 
+             - int_floordivpow2(trx0, res->pdx);
+          prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) 
+             - int_floordivpow2(try0, res->pdy);
+          pi->precno = prci + prcj * res->pw;
+          for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
+            index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+            if (!pi->include[index]) {
+              pi->include[index] = 1;
+              return true;
+            }
+LABEL_SKIP:;
+          }
+        }
+      }
+    }
+  }
+  
+  return false;
+}
+
+static bool pi_next_pcrl(opj_pi_iterator_t * pi) {
+  opj_pi_comp_t *comp = NULL;
+  opj_pi_resolution_t *res = NULL;
+  long index = 0;
+
+  if (!pi->first) {
+    comp = &pi->comps[pi->compno];
+    goto LABEL_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;
+          int rpx, rpy;
+          int prci, prcj;
+          res = &comp->resolutions[pi->resno];
+          levelno = comp->numresolutions - 1 - pi->resno;
+          trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
+          try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
+          trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
+          try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
+          rpx = res->pdx + levelno;
+          rpy = res->pdy + levelno;
+          if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
+            continue;
+          }
+          if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
+            continue;
+          }
+          
+          if ((res->pw==0)||(res->pw==0)) continue;
+          
+          if ((trx0==trx1)||(try0==try1)) continue;
+          
+          prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) 
+             - int_floordivpow2(trx0, res->pdx);
+          prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) 
+             - int_floordivpow2(try0, res->pdy);
+          pi->precno = prci + prcj * res->pw;
+          for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
+            index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+            if (!pi->include[index]) {
+              pi->include[index] = 1;
+              return true;
+            }  
+LABEL_SKIP:;
+          }
+        }
+      }
+    }
+  }
+  
+  return false;
+}
+
+static bool pi_next_cprl(opj_pi_iterator_t * pi) {
+  opj_pi_comp_t *comp = NULL;
+  opj_pi_resolution_t *res = NULL;
+  long index = 0;
+
+  if (!pi->first) {
+    comp = &pi->comps[pi->compno];
+    goto LABEL_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;
+          int rpx, rpy;
+          int prci, prcj;
+          res = &comp->resolutions[pi->resno];
+          levelno = comp->numresolutions - 1 - pi->resno;
+          trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
+          try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
+          trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
+          try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
+          rpx = res->pdx + levelno;
+          rpy = res->pdy + levelno;
+          if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
+            continue;
+          }
+          if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
+            continue;
+          }
+          
+          if ((res->pw==0)||(res->pw==0)) continue;
+          
+          if ((trx0==trx1)||(try0==try1)) continue;
+          
+          prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx) 
+             - int_floordivpow2(trx0, res->pdx);
+          prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy) 
+             - int_floordivpow2(try0, res->pdy);
+          pi->precno = prci + prcj * res->pw;
+          for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
+            index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
+            if (!pi->include[index]) {
+              pi->include[index] = 1;
+              return true;
+            }
+LABEL_SKIP:;
+          }
+        }
+      }
+    }
+  }
+  
+  return false;
+}
+
+/* 
+==========================================================
+   Packet iterator interface
+==========================================================
+*/
+
+opj_pi_iterator_t *pi_create(opj_image_t *image, opj_cp_t *cp, int tileno) {
+  int p, q;
+  int compno, resno, pino;
+  int maxres = 0;
+  opj_pi_iterator_t *pi = NULL;
+  opj_tcp_t *tcp = NULL;
+  opj_tccp_t *tccp = NULL;
+  size_t array_size;
+  
+  tcp = &cp->tcps[tileno];
+
+  array_size = (tcp->numpocs + 1) * sizeof(opj_pi_iterator_t);
+  pi = (opj_pi_iterator_t *) opj_malloc(array_size);
+  if(!pi) {
+    /* TODO: throw an error */
+    return NULL;
+  }
+  
+  for (pino = 0; pino < tcp->numpocs + 1; pino++) {  /* change */
+    p = tileno % cp->tw;
+    q = tileno / cp->tw;
+
+    pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
+    pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
+    pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
+    pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
+    pi[pino].numcomps = image->numcomps;
+
+    array_size = image->numcomps * sizeof(opj_pi_comp_t);
+    pi[pino].comps = (opj_pi_comp_t *) opj_malloc(array_size);
+    if(!pi[pino].comps) {
+      /* TODO: throw an error */
+      pi_destroy(pi, cp, tileno);
+      return NULL;
+    }
+    memset(pi[pino].comps, 0, array_size);
+    
+    for (compno = 0; compno < pi->numcomps; compno++) {
+      int tcx0, tcy0, tcx1, tcy1;
+      opj_pi_comp_t *comp = &pi[pino].comps[compno];
+      tccp = &tcp->tccps[compno];
+      comp->dx = image->comps[compno].dx;
+      comp->dy = image->comps[compno].dy;
+      comp->numresolutions = tccp->numresolutions;
+
+      array_size = comp->numresolutions * sizeof(opj_pi_resolution_t);
+      comp->resolutions =  (opj_pi_resolution_t *) opj_malloc(array_size);
+      if(!comp->resolutions) {
+        /* TODO: throw an error */
+        pi_destroy(pi, cp, tileno);
+        return NULL;
+      }
+
+      tcx0 = int_ceildiv(pi->tx0, comp->dx);
+      tcy0 = int_ceildiv(pi->ty0, comp->dy);
+      tcx1 = int_ceildiv(pi->tx1, comp->dx);
+      tcy1 = int_ceildiv(pi->ty1, comp->dy);
+      if (comp->numresolutions > maxres) {
+        maxres = comp->numresolutions;
+      }
+
+      for (resno = 0; resno < comp->numresolutions; resno++) {
+        int levelno;
+        int rx0, ry0, rx1, ry1;
+        int px0, py0, px1, py1;
+        opj_pi_resolution_t *res = &comp->resolutions[resno];
+        if (tccp->csty & J2K_CCP_CSTY_PRT) {
+          res->pdx = tccp->prcw[resno];
+          res->pdy = tccp->prch[resno];
+        } else {
+          res->pdx = 15;
+          res->pdy = 15;
+        }
+        levelno = comp->numresolutions - 1 - resno;
+        rx0 = int_ceildivpow2(tcx0, levelno);
+        ry0 = int_ceildivpow2(tcy0, levelno);
+        rx1 = int_ceildivpow2(tcx1, levelno);
+        ry1 = int_ceildivpow2(tcy1, levelno);
+        px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
+        py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
+        px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
+        py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
+        res->pw = (rx0==rx1)?0:((px1 - px0) >> res->pdx);
+        res->ph = (ry0==ry1)?0:((py1 - py0) >> res->pdy);
+      }
+    }
+    
+    tccp = &tcp->tccps[0];
+    pi[pino].step_p = 1;
+    pi[pino].step_c = 100 * pi[pino].step_p;
+    pi[pino].step_r = image->numcomps * pi[pino].step_c;
+    pi[pino].step_l = maxres * pi[pino].step_r;
+    
+    if (pino == 0) {
+      array_size = image->numcomps * maxres * tcp->numlayers * 100 * sizeof(short int);
+      pi[pino].include = (short int *) opj_malloc(array_size);
+      if(!pi[pino].include) {
+        /* TODO: throw an error */
+        pi_destroy(pi, cp, tileno);
+        return NULL;
+      }
+    }
+    else {
+      pi[pino].include = pi[pino - 1].include;
+    }
+    
+    if (tcp->POC == 0) {
+      pi[pino].first = 1;
+      pi[pino].poc.resno0 = 0;
+      pi[pino].poc.compno0 = 0;
+      pi[pino].poc.layno1 = tcp->numlayers;
+      pi[pino].poc.resno1 = maxres;
+      pi[pino].poc.compno1 = image->numcomps;
+      pi[pino].poc.prg = tcp->prg;
+    } else {
+      pi[pino].first = 1;
+      pi[pino].poc.resno0 = tcp->pocs[pino].resno0;
+      pi[pino].poc.compno0 = tcp->pocs[pino].compno0;
+      pi[pino].poc.layno1 = tcp->pocs[pino].layno1;
+      pi[pino].poc.resno1 = tcp->pocs[pino].resno1;
+      pi[pino].poc.compno1 = tcp->pocs[pino].compno1;
+      pi[pino].poc.prg = tcp->pocs[pino].prg;
+    }
+  }
+  
+  return pi;
+}
+
+void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) {
+  int compno, pino;
+  opj_tcp_t *tcp = &cp->tcps[tileno];
+  if(pi) {
+    for (pino = 0; pino < tcp->numpocs + 1; pino++) {  
+      if(pi[pino].comps) {
+        for (compno = 0; compno < pi->numcomps; compno++) {
+          opj_pi_comp_t *comp = &pi[pino].comps[compno];
+          if(comp->resolutions) {
+            opj_free(comp->resolutions);
+          }
+        }
+        opj_free(pi[pino].comps);
+      }
+    }
+    if(pi->include) {
+      opj_free(pi->include);
+    }
+    opj_free(pi);
+  }
+}
+
+bool pi_next(opj_pi_iterator_t * pi) {
+  switch (pi->poc.prg) {
+    case LRCP:
+      return pi_next_lrcp(pi);
+    case RLCP:
+      return pi_next_rlcp(pi);
+    case RPCL:
+      return pi_next_rpcl(pi);
+    case PCRL:
+      return pi_next_pcrl(pi);
+    case CPRL:
+      return pi_next_cprl(pi);
+  }
+  
+  return false;
+}
+
index 814926c389c87801c00e144e3fb75a9eebe48979..509fdd6b1ca66a001cf1d49ac92771b9569c6db4 100644 (file)
-/*\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
+/*
+ * 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.
+ */
+
+#ifndef __PI_H
+#define __PI_H
+/**
+@file pi.h
+@brief Implementation of a packet iterator (PI)
+
+The functions in PI.C have for goal to realize a packet iterator that permits to get the next
+packet following the progression order and change of it. The functions in PI.C are used
+by some function in T2.C.
+*/
+
+/** @defgroup PI PI - Implementation of a packet iterator */
+/*@{*/
+
+/**
+FIXME: documentation
+*/
+typedef struct opj_pi_resolution {
+  int pdx, pdy;
+  int pw, ph;
+} opj_pi_resolution_t;
+
+/**
+FIXME: documentation
+*/
+typedef struct opj_pi_comp {
+  int dx, dy;
+  /** number of resolution levels */
+  int numresolutions;
+  opj_pi_resolution_t *resolutions;
+} opj_pi_comp_t;
+
+/** 
+Packet iterator 
+*/
+typedef struct opj_pi_iterator {
+  /** precise if the packet has been already used (usefull for progression order change) */
+  short int *include;
+  /** layer step used to localize the packet in the include vector */
+  int step_l;
+  /** resolution step used to localize the packet in the include vector */
+  int step_r;  
+  /** component step used to localize the packet in the include vector */
+  int step_c;  
+  /** precinct step used to localize the packet in the include vector */
+  int step_p;  
+  /** component that identify the packet */
+  int compno;
+  /** resolution that identify the packet */
+  int resno;
+  /** precinct that identify the packet */
+  int precno;
+  /** layer that identify the packet */
+  int layno;   
+  /** 0 if the first packet */
+  int first;
+  /** progression order change information */
+  opj_poc_t poc;
+  /** */
+  int numcomps;
+  /** */
+  opj_pi_comp_t *comps;
+  int tx0, ty0, tx1, ty1;
+  int x, y, dx, dy;
+} opj_pi_iterator_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a packet iterator
+@param image Raw image for which the packets will be listed
+@param cp Coding parameters
+@param tileno Number that identifies the tile for which to list the packets
+@return Returns a packet iterator that points to the first packet of the tile
+@see pi_destroy
+*/
+opj_pi_iterator_t *pi_create(opj_image_t * image, opj_cp_t * cp, int tileno);
+
+/**
+Destroy a packet iterator
+@param pi Previously created packet iterator
+@param cp Coding parameters
+@param tileno Number that identifies the tile for which the packets were listed
+@see pi_create
+*/
+void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno);
+
+/**
+Modify the packet iterator to point to the next packet
+@param pi Packet iterator to modify
+@return Returns false if pi pointed to the last packet or else returns true 
+*/
+bool pi_next(opj_pi_iterator_t * pi);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __PI_H */
index d752b8cd2f904af83a7a9008780946d07e145731..49c38fd22e69b6ce2b160fec113a850629ee1652 100644 (file)
@@ -1,86 +1,86 @@
-/*\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
+/*
+ * 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"
+
+/* 
+==========================================================
+   local functions
+==========================================================
+*/
+
+
+/* 
+==========================================================
+   RAW encoding interface
+==========================================================
+*/
+
+opj_raw_t* raw_create() {
+  opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t));
+  return raw;
+}
+
+void raw_destroy(opj_raw_t *raw) {
+  if(raw) {
+    opj_free(raw);
+  }
+}
+
+int raw_numbytes(opj_raw_t *raw) {
+  return raw->bp - raw->start;
+}
+
+void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len) {
+  raw->start = bp;
+  raw->lenmax = len;
+  raw->len = 0;
+  raw->c = 0;
+  raw->ct = 0;
+}
+
+int raw_decode(opj_raw_t *raw) {
+  int d;
+  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;
+}
+
index 03d8f3e74778263b85510ba36940888baa25b818..51586105030e2e80359d9becfeaa24dda1bf741c 100644 (file)
@@ -1,99 +1,99 @@
-/*\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
+/*
+ * 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.
+ */
+
+#ifndef __RAW_H
+#define __RAW_H
+/**
+@file raw.h
+@brief Implementation of operations for raw encoding (RAW)
+
+The functions in RAW.C have for goal to realize the operation of raw encoding linked
+with the corresponding mode switch.
+*/
+
+/** @defgroup RAW RAW - Implementation of operations for raw encoding */
+/*@{*/
+
+/**
+RAW encoding operations
+*/
+typedef struct opj_raw {
+  /** temporary buffer where bits are coded or decoded */
+  unsigned char c;
+  /** number of bits already read or free to write */
+  unsigned int ct;
+  /** maximum length to decode */
+  unsigned int lenmax;
+  /** length decoded */
+  unsigned int len;
+  /** pointer to the current position in the buffer */
+  unsigned char *bp;
+  /** pointer to the start of the buffer */
+  unsigned char *start;
+  /** pointer to the end of the buffer */
+  unsigned char *end;
+} opj_raw_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a new RAW handle 
+@return Returns a new RAW handle if successful, returns NULL otherwise
+*/
+opj_raw_t* raw_create();
+/**
+Destroy a previously created RAW handle
+@param raw RAW handle to destroy
+*/
+void raw_destroy(opj_raw_t *raw);
+/**
+Return the number of bytes written/read since initialisation
+@param raw RAW handle to destroy
+@return Returns the number of bytes already encoded
+*/
+int raw_numbytes(opj_raw_t *raw);
+/**
+Initialize the decoder
+@param raw RAW handle
+@param bp Pointer to the start of the buffer from which the bytes will be read
+@param len Length of the input buffer
+*/
+void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len);
+/**
+Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN
+@param raw RAW handle
+@return Returns the decoded symbol (0 or 1)
+*/
+int raw_decode(opj_raw_t *raw);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __RAW_H */
index b764358f51116513e8f4e7b63bbf0d70420bb7ee..1f153a18ff3a8c0e449cefd846f4665d9c4ec05c 100644 (file)
-/*\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
+/*
+ * 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 T1 T1 - Implementation of the tier-1 coding */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+static int t1_getctxno_zc(opj_t1_t *t1, int f, int orient);
+static int t1_getctxno_sc(opj_t1_t *t1, int f);
+static int t1_getctxno_mag(opj_t1_t *t1, int f);
+static int t1_getspb(opj_t1_t *t1, int f);
+static int t1_getnmsedec_sig(opj_t1_t *t1, int x, int bitpos);
+static int t1_getnmsedec_ref(opj_t1_t *t1, int x, int bitpos);
+static void t1_updateflags(int *fp, int s);
+/**
+Encode significant pass
+*/
+static void t1_enc_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int bpno, int one, int *nmsedec, char type, int vsc);
+/**
+Decode significant pass
+*/
+static void t1_dec_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int oneplushalf, char type, int vsc);
+/**
+Encode significant pass
+*/
+static void t1_enc_sigpass(opj_t1_t *t1, int w, int h, int bpno, int orient, int *nmsedec, char type, int cblksty);
+/**
+Decode significant pass
+*/
+static void t1_dec_sigpass(opj_t1_t *t1, int w, int h, int bpno, int orient, char type, int cblksty);
+/**
+Encode refinement pass
+*/
+static void t1_enc_refpass_step(opj_t1_t *t1, int *fp, int *dp, int bpno, int one, int *nmsedec, char type, int vsc);
+/**
+Decode refinement pass
+*/
+static void t1_dec_refpass_step(opj_t1_t *t1, int *fp, int *dp, int poshalf, int neghalf, char type, int vsc);
+/**
+Encode refinement pass
+*/
+static void t1_enc_refpass(opj_t1_t *t1, int w, int h, int bpno, int *nmsedec, char type, int cblksty);
+/**
+Decode refinement pass
+*/
+static void t1_dec_refpass(opj_t1_t *t1, int w, int h, int bpno, char type, int cblksty);
+/**
+Encode clean-up pass
+*/
+static void t1_enc_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int bpno, int one, int *nmsedec, int partial, int vsc);
+/**
+Decode clean-up pass
+*/
+static void t1_dec_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int oneplushalf, int partial, int vsc);
+/**
+Encode clean-up pass
+*/
+static void t1_enc_clnpass(opj_t1_t *t1, int w, int h, int bpno, int orient, int *nmsedec, int cblksty);
+/**
+Decode clean-up pass
+*/
+static void t1_dec_clnpass(opj_t1_t *t1, int w, int h, int bpno, int orient, int cblksty);
+static double t1_getwmsedec(int nmsedec, int compno, int level, int orient, int bpno, int qmfbid, double stepsize, int numcomps);
+/**
+Encode 1 code-block
+@param t1 T1 handle
+@param cblk Code-block coding parameters
+@param orient
+@param compno Component number
+@param level
+@param qmfbid
+@param stepsize
+@param cblksty Code-block style
+@param numcomps
+@param tile
+*/
+static void t1_encode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient, int compno, int level, int qmfbid, double stepsize, int cblksty, int numcomps, opj_tcd_tile_t * tile);
+/**
+Decode 1 code-block
+@param t1 T1 handle
+@param cblk Code-block coding parameters
+@param orient
+@param roishift Region of interest shifting value
+@param cblksty Code-block style
+*/
+static void t1_decode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient, int roishift, int cblksty);
+static int t1_init_ctxno_zc(int f, int orient);
+static int t1_init_ctxno_sc(int f);
+static int t1_init_ctxno_mag(int f);
+static int t1_init_spb(int f);
+/**
+Initialize the look-up tables of the Tier-1 coder/decoder
+@param t1 T1 handle
+*/
+static void t1_init_luts(opj_t1_t *t1);
+
+/*@}*/
+
+/*@}*/
+
+/* ----------------------------------------------------------------------- */
+
+static int t1_getctxno_zc(opj_t1_t *t1, int f, int orient) {
+  return t1->lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
+}
+
+static int t1_getctxno_sc(opj_t1_t *t1, int f) {
+  return t1->lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
+}
+
+static int t1_getctxno_mag(opj_t1_t *t1, int f) {
+  return t1->lut_ctxno_mag[(f & T1_SIG_OTH) | (((f & T1_REFINE) != 0) << 11)];
+}
+
+static int t1_getspb(opj_t1_t *t1, int f) {
+  return t1->lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
+}
+
+static int t1_getnmsedec_sig(opj_t1_t *t1, int x, int bitpos) {
+  if (bitpos > T1_NMSEDEC_FRACBITS) {
+    return t1->lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
+  }
+  
+  return t1->lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
+}
+
+static int t1_getnmsedec_ref(opj_t1_t *t1, int x, int bitpos) {
+  if (bitpos > T1_NMSEDEC_FRACBITS) {
+    return t1->lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((1 << T1_NMSEDEC_BITS) - 1)];
+  }
+
+    return t1->lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
+}
+
+static 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;
+  }
+}
+
+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) {
+  int v, flag;
+  
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */
+  
+  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(mqc, t1_getctxno_zc(t1, flag, orient));  /* ESSAI */
+      mqc_bypass_enc(mqc, v);
+    } else {
+      mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient));
+      mqc_encode(mqc, v);
+    }
+    if (v) {
+      v = *dp < 0 ? 1 : 0;
+      *nmsedec +=  t1_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
+      if (type == T1_TYPE_RAW) {  /* BYPASS/LAZY MODE */
+        mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));  /* ESSAI */
+        mqc_bypass_enc(mqc, v);
+      } else {
+        mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));
+        mqc_encode(mqc, v ^ t1_getspb(t1, flag));
+      }
+      t1_updateflags(fp, v);
+      *fp |= T1_SIG;
+    }
+    *fp |= T1_VISIT;
+  }
+}
+
+static void t1_dec_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int oneplushalf, char type, int vsc) {
+  int v, flag;
+  
+  opj_raw_t *raw = t1->raw;  /* RAW component */
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */
+  
+  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(raw)) {
+        v = raw_decode(raw);  /* ESSAI */
+        *dp = v ? -oneplushalf : oneplushalf;
+        t1_updateflags(fp, v);
+        *fp |= T1_SIG;
+      }
+    } else {
+      mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient));
+      if (mqc_decode(mqc)) {
+        mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));
+        v = mqc_decode(mqc) ^ t1_getspb(t1, flag);
+        *dp = v ? -oneplushalf : oneplushalf;
+        t1_updateflags(fp, v);
+        *fp |= T1_SIG;
+      }
+    }
+    *fp |= T1_VISIT;
+  }
+}        /* VSC and  BYPASS by Antonin */
+
+static void t1_enc_sigpass(opj_t1_t *t1, 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, &t1->flags[1 + j][1 + i], &t1->data[j][i], orient, bpno, one, nmsedec, type, vsc);
+      }
+    }
+  }
+}
+
+static void t1_dec_sigpass(opj_t1_t *t1, 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, &t1->flags[1 + j][1 + i], &t1->data[j][i], orient, oneplushalf, type, vsc);
+      }
+    }
+  }
+}        /* VSC and  BYPASS by Antonin */
+
+static void t1_enc_refpass_step(opj_t1_t *t1, int *fp, int *dp, int bpno, int one, int *nmsedec, char type, int vsc) {
+  int v, flag;
+  
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */
+  
+  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(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
+    v = int_abs(*dp) & one ? 1 : 0;
+    if (type == T1_TYPE_RAW) {  /* BYPASS/LAZY MODE */
+      mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag));  /* ESSAI */
+      mqc_bypass_enc(mqc, v);
+    } else {
+      mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag));
+      mqc_encode(mqc, v);
+    }
+    *fp |= T1_REFINE;
+  }
+}
+
+static void t1_dec_refpass_step(opj_t1_t *t1, int *fp, int *dp, int poshalf, int neghalf, char type, int vsc) {
+  int v, t, flag;
+  
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */
+  opj_raw_t *raw = t1->raw;  /* RAW component */
+  
+  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(mqc, t1_getctxno_mag(t1, flag));  /* ESSAI */
+      v = raw_decode(raw);
+    } else {
+      mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag));
+      v = mqc_decode(mqc);
+    }
+    t = v ? poshalf : neghalf;
+    *dp += *dp < 0 ? -t : t;
+    *fp |= T1_REFINE;
+  }
+}        /* VSC and  BYPASS by Antonin  */
+
+static void t1_enc_refpass(opj_t1_t *t1, 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, &t1->flags[1 + j][1 + i], &t1->data[j][i], bpno, one, nmsedec, type, vsc);
+      }
+    }
+  }
+}
+
+static void t1_dec_refpass(opj_t1_t *t1, 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, &t1->flags[1 + j][1 + i], &t1->data[j][i], poshalf, neghalf, type, vsc);
+      }
+    }
+  }
+}        /* VSC and  BYPASS by Antonin */
+
+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) {
+  int v, flag;
+  
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */
+  
+  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(mqc, t1_getctxno_zc(t1, flag, orient));
+    v = int_abs(*dp) & one ? 1 : 0;
+    mqc_encode(mqc, v);
+    if (v) {
+LABEL_PARTIAL:
+      *nmsedec += t1_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
+      mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));
+      v = *dp < 0 ? 1 : 0;
+      mqc_encode(mqc, v ^ t1_getspb(t1, flag));
+      t1_updateflags(fp, v);
+      *fp |= T1_SIG;
+    }
+  }
+  *fp &= ~T1_VISIT;
+}
+
+static void t1_dec_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient, int oneplushalf, int partial, int vsc) {
+  int v, flag;
+  
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */
+  
+  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(mqc, t1_getctxno_zc(t1, flag, orient));
+    if (mqc_decode(mqc)) {
+LABEL_PARTIAL:
+      mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));
+      v = mqc_decode(mqc) ^ t1_getspb(t1, flag);
+      *dp = v ? -oneplushalf : oneplushalf;
+      t1_updateflags(fp, v);
+      *fp |= T1_SIG;
+    }
+  }
+  *fp &= ~T1_VISIT;
+}        /* VSC and  BYPASS by Antonin */
+
+static void t1_enc_clnpass(opj_t1_t *t1, int w, int h, int bpno, int orient, int *nmsedec, int cblksty) {
+  int i, j, k, one, agg, runlen, vsc;
+  
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */
+  
+  *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(mqc, T1_CTXNO_AGG);
+        mqc_encode(mqc, runlen != 4);
+        if (runlen == 4) {
+          continue;
+        }
+        mqc_setcurctx(mqc, T1_CTXNO_UNI);
+        mqc_encode(mqc, runlen >> 1);
+        mqc_encode(mqc, 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, &t1->flags[1 + j][1 + i], &t1->data[j][i], orient, bpno, one, nmsedec, agg && (j == k + runlen), vsc);
+      }
+    }
+  }
+}
+
+static void t1_dec_clnpass(opj_t1_t *t1, 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;
+  
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */
+  
+  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(mqc, T1_CTXNO_AGG);
+        if (!mqc_decode(mqc)) {
+          continue;
+        }
+        mqc_setcurctx(mqc, T1_CTXNO_UNI);
+        runlen = mqc_decode(mqc);
+        runlen = (runlen << 1) | mqc_decode(mqc);
+      } 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, &t1->flags[1 + j][1 + i], &t1->data[j][i], orient, oneplushalf, agg && (j == k + runlen), vsc);
+      }
+    }
+  }
+  if (segsym) {
+    int v = 0;
+    mqc_setcurctx(mqc, T1_CTXNO_UNI);
+    v = mqc_decode(mqc);
+    v = (v << 1) | mqc_decode(mqc);
+    v = (v << 1) | mqc_decode(mqc);
+    v = (v << 1) | mqc_decode(mqc);
+    /*
+    if (v!=0xa) {
+      opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
+    } 
+    */
+  }
+}        /* VSC and  BYPASS by Antonin */
+
+
+/** mod fixed_quality */
+static double t1_getwmsedec(int nmsedec, int compno, int level, int orient, int bpno, int qmfbid, double stepsize, int numcomps)  {
+  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 * (1 << bpno);
+  wmsedec *= wmsedec * nmsedec / 8192.0;
+  
+  return wmsedec;
+}
+
+/** mod fixed_quality */
+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) {
+  int i, j;
+  int w, h;
+  int passno;
+  int bpno, passtype;
+  int max;
+  int nmsedec;
+  double cumwmsedec = 0;
+  char type = T1_TYPE_MQ;
+  
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */
+  
+  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);
+  mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+  mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+  mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+  mqc_init_enc(mqc, cblk->data);
+  
+  for (passno = 0; bpno >= 0; passno++) {
+    opj_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(t1, w, h, bpno, orient, &nmsedec, type, cblksty);
+        break;
+      case 1:
+        t1_enc_refpass(t1, w, h, bpno, &nmsedec, type, cblksty);
+        break;
+      case 2:
+        t1_enc_clnpass(t1, w, h, bpno, orient, &nmsedec, cblksty);
+        /* code switch SEGMARK (i.e. SEGSYM) */
+        if (cblksty & J2K_CCP_CBLKSTY_SEGSYM)
+          mqc_segmark_enc(mqc);
+        break;
+    }
+    
+    /* fixed_quality */
+    cumwmsedec += t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps);
+    tile->distotile += t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps);
+    
+    /* Code switch "RESTART" (i.e. TERMALL) */
+    if ((cblksty & J2K_CCP_CBLKSTY_TERMALL)  && !((passtype == 2) && (bpno - 1 < 0))) {
+      if (type == T1_TYPE_RAW) {
+        mqc_flush(mqc);
+        correction = 1;
+        /* correction = mqc_bypass_flush_enc(); */
+      } else {      /* correction = mqc_restart_enc(); */
+        mqc_flush(mqc);
+        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(mqc);
+          correction = 1;
+          /* correction = mqc_bypass_flush_enc(); */
+        } else {    /* correction = mqc_restart_enc(); */
+          mqc_flush(mqc);
+          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(mqc);
+      else
+        mqc_restart_init_enc(mqc);
+    }
+    
+    pass->distortiondec = cumwmsedec;
+    pass->rate = mqc_numbytes(mqc) + 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(mqc);
+  }
+  
+  /* Code switch "ERTERM" (i.e. PTERM) */
+  if (cblksty & J2K_CCP_CBLKSTY_PTERM)
+    mqc_erterm_enc(mqc);
+  else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY))
+    mqc_flush(mqc);
+  
+  cblk->totalpasses = passno;
+}
+
+static void t1_decode_cblk(opj_t1_t *t1, opj_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 */
+  
+  opj_raw_t *raw = t1->raw;  /* RAW component */
+  opj_mqc_t *mqc = t1->mqc;  /* MQC component */
+  
+  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);
+  mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+  mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+  mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+  
+  for (segno = 0; segno < cblk->numsegs; segno++) {
+    opj_tcd_seg_t *seg = &cblk->segs[segno];
+    
+    /* 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(raw, seg->data, seg->len);
+    } else {
+      mqc_init_dec(mqc, seg->data, seg->len);
+    }
+    
+    for (passno = 0; passno < seg->numpasses; passno++) {
+      switch (passtype) {
+        case 0:
+          t1_dec_sigpass(t1, w, h, bpno+1, orient, type, cblksty);
+          break;
+        case 1:
+          t1_dec_refpass(t1, w, h, bpno+1, type, cblksty);
+          break;
+        case 2:
+          t1_dec_clnpass(t1, w, h, bpno+1, orient, cblksty);
+          break;
+      }
+      
+      if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
+        mqc_resetstates(mqc);
+        mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);        
+        mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+        mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+      }
+      if (++passtype == 3) {
+        passtype = 0;
+        bpno--;
+      }
+    }
+  }
+}
+
+static 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);
+}
+
+static 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);
+}
+
+static 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);
+}
+
+static 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;
+}
+
+static void t1_init_luts(opj_t1_t *t1) {
+  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));
+  }
+}
+
+/* ----------------------------------------------------------------------- */
+
+opj_t1_t* t1_create(opj_common_ptr cinfo) {
+  opj_t1_t *t1 = (opj_t1_t*)opj_malloc(sizeof(opj_t1_t));
+  if(t1) {
+    t1->cinfo = cinfo;
+    /* create MQC and RAW handles */
+    t1->mqc = mqc_create();
+    t1->raw = raw_create();
+    /* initialize the look-up tables of the Tier-1 coder/decoder */
+    t1_init_luts(t1);
+  }
+  return t1;
+}
+
+void t1_destroy(opj_t1_t *t1) {
+  if(t1) {
+    /* destroy MQC and RAW handles */
+    mqc_destroy(t1->mqc);
+    raw_destroy(t1->raw);
+    opj_free(t1);
+  }
+}
+
+void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp) {
+  int compno, resno, bandno, precno, cblkno;
+  int x, y, i, j, orient;
+  
+  tile->distotile = 0;    /* fixed_quality */
+
+  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->pw * res->ph; precno++) {
+          opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+          for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+            opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
+
+            if (band->bandno == 0) {
+              x = cblk->x0 - band->x0;
+              y = cblk->y0 - band->y0;
+            } else if (band->bandno == 1) {
+              opj_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) {
+              opj_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) */
+              opj_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(t1, cblk, orient, compno, tilec->numresolutions - 1 - resno, tcp->tccps[compno].qmfbid, band->stepsize, tcp->tccps[compno].cblksty, tile->numcomps, tile);
+
+          } /* cblkno */
+        } /* precno */
+      } /* bandno */
+    } /* resno  */
+  } /* compno  */
+}
+
+void t1_decode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp) {
+  int compno, resno, bandno, precno, cblkno;
+  
+  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->pw * res->ph; precno++) {
+          opj_tcd_precinct_t *prc = &band->precincts[precno];
+
+          for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+            int x, y, i, j, orient;
+            opj_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(t1, 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) {
+              opj_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) {
+              opj_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) */
+              opj_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 = (double)(t1->data[j][i] * band->stepsize * 4096.0);
+                  if (t1->data[j][i] >> 1 == 0) {
+                    tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0)] = 0;
+                  } else {
+                    int 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);
+                  }
+                }
+              }
+            }
+          } /* cblkno */
+        } /* precno */
+      } /* bandno */
+    } /* resno */
+  } /* compno */
+}
+
index 9cf8f04e67c94f11112e7d97a5cb27554b9bf81b..98ea2c018732bf140ab11eeaf47a1f959241704a 100644 (file)
-/*\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
+/*
+ * 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.
+ */
+#ifndef __T1_H
+#define __T1_H
+/**
+@file t1.h
+@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1)
+
+The functions in T1.C have for goal to realize the tier-1 coding operation. The functions
+in T1.C are used by some function in TCD.C.
+*/
+
+/** @defgroup T1 T1 - Implementation of the tier-1 coding */
+/*@{*/
+
+/* ----------------------------------------------------------------------- */
+#define T1_NMSEDEC_BITS 7
+
+#define T1_MAXCBLKW 1024  /**< Maximum size of code-block (width) */
+#define T1_MAXCBLKH 1024  /**< Maximum size of code-block (heigth) */
+
+#define T1_SIG_NE 0x0001  /**< Context orientation : North-East direction */
+#define T1_SIG_SE 0x0002  /**< Context orientation : South-East direction */
+#define T1_SIG_SW 0x0004  /**< Context orientation : South-West direction */
+#define T1_SIG_NW 0x0008  /**< Context orientation : North-West direction */
+#define T1_SIG_N 0x0010    /**< Context orientation : North direction */
+#define T1_SIG_E 0x0020    /**< Context orientation : East direction */
+#define T1_SIG_S 0x0040    /**< Context orientation : South direction */
+#define T1_SIG_W 0x0080    /**< Context orientation : West direction */
+#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)
+#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)
+
+#define T1_SGN_N 0x0100
+#define T1_SGN_E 0x0200
+#define T1_SGN_S 0x0400
+#define T1_SGN_W 0x0800
+#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)
+
+#define T1_SIG 0x1000
+#define T1_REFINE 0x2000
+#define T1_VISIT 0x4000
+
+#define T1_NUMCTXS_AGG 1
+#define T1_NUMCTXS_ZC 9
+#define T1_NUMCTXS_MAG 3
+#define T1_NUMCTXS_SC 5
+#define T1_NUMCTXS_UNI 1
+
+#define T1_CTXNO_AGG 0
+#define T1_CTXNO_ZC (T1_CTXNO_AGG+T1_NUMCTXS_AGG)
+#define T1_CTXNO_MAG (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
+#define T1_CTXNO_SC (T1_CTXNO_MAG+T1_NUMCTXS_MAG)
+#define T1_CTXNO_UNI (T1_CTXNO_SC+T1_NUMCTXS_SC)
+#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)
+
+#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)
+
+#define T1_TYPE_MQ 0  /**< Normal coding using entropy coder */
+#define T1_TYPE_RAW 1  /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/
+
+/* ----------------------------------------------------------------------- */
+
+/**
+Tier-1 coding (coding of code-block coefficients)
+*/
+typedef struct opj_t1 {
+  /** codec context */
+  opj_common_ptr cinfo;
+
+  /** MQC component */
+  opj_mqc_t *mqc;
+  /** RAW component */
+  opj_raw_t *raw;
+
+  int lut_ctxno_zc[1024];
+  int lut_ctxno_sc[256];
+  int lut_ctxno_mag[4096];
+  int lut_spb[256];
+  int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS];
+  int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS];
+  int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS];
+  int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS];
+
+  int data[T1_MAXCBLKH][T1_MAXCBLKW];
+  int flags[T1_MAXCBLKH + 2][T1_MAXCBLKH + 2];
+
+} opj_t1_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a new T1 handle 
+and initialize the look-up tables of the Tier-1 coder/decoder
+@return Returns a new T1 handle if successful, returns NULL otherwise
+@see t1_init_luts
+*/
+opj_t1_t* t1_create(opj_common_ptr cinfo);
+/**
+Destroy a previously created T1 handle
+@param t1 T1 handle to destroy
+*/
+void t1_destroy(opj_t1_t *t1);
+/**
+Encode the code-blocks of a tile
+@param t1 T1 handle
+@param tile The tile to encode
+@param tcp Tile coding parameters
+*/
+void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);
+/**
+Decode the code-blocks of a tile
+@param t1 T1 handle
+@param tile The tile to decode
+@param tcp Tile coding parameters
+*/
+void t1_decode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __T1_H */
index 368acda2e603297ee534103eb5c4685eb583147e..5d61ed31d51411cf0bd301494a0b297ee4ba1a62 100644 (file)
-/*\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
+/*
+ * 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 T2 T2 - Implementation of a tier-2 coding */
+/*@{*/
+
+/** @name Local static functions */
+/*@{*/
+
+static void t2_putcommacode(opj_bio_t *bio, int n);
+static int t2_getcommacode(opj_bio_t *bio);
+/**
+Variable length code for signalling delta Zil (truncation point)
+@param bio Bit Input/Output component
+@param n delta Zil
+*/
+static void t2_putnumpasses(opj_bio_t *bio, int n);
+static int t2_getnumpasses(opj_bio_t *bio);
+/**
+Encode a packet of a tile to a destination buffer
+@param tile Tile for which to write the packets
+@param tcp Tile coding parameters
+@param pi Packet identity
+@param dest Destination buffer
+@param len Length of the destination buffer
+@param image_info Structure to create an index file
+@param tileno Number of the tile encoded
+@return 
+*/
+static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi, unsigned char *dest, int len, opj_image_info_t *image_info, int tileno);
+/**
+@param seg
+@param cblksty
+@param first
+*/
+static void t2_init_seg(opj_tcd_seg_t *seg, int cblksty, int first);
+/**
+Decode a packet of a tile from a source buffer
+@param t2 T2 handle
+@param src Source buffer
+@param len Length of the source buffer
+@param tile Tile for which to write the packets
+@param tcp Tile coding parameters
+@param pi Packet identity
+@return 
+*/
+int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi);
+
+/*@}*/
+
+/*@}*/
+
+/* ----------------------------------------------------------------------- */
+
+/* #define RESTART 0x04 */
+
+static void t2_putcommacode(opj_bio_t *bio, int n) {
+  while (--n >= 0) {
+    bio_write(bio, 1, 1);
+  }
+  bio_write(bio, 0, 1);
+}
+
+static int t2_getcommacode(opj_bio_t *bio) {
+  int n;
+  for (n = 0; bio_read(bio, 1); n++) {
+    ;
+  }
+  return n;
+}
+
+static void t2_putnumpasses(opj_bio_t *bio, int n) {
+  if (n == 1) {
+    bio_write(bio, 0, 1);
+  } else if (n == 2) {
+    bio_write(bio, 2, 2);
+  } else if (n <= 5) {
+    bio_write(bio, 0xc | (n - 3), 4);
+  } else if (n <= 36) {
+    bio_write(bio, 0x1e0 | (n - 6), 9);
+  } else if (n <= 164) {
+    bio_write(bio, 0xff80 | (n - 37), 16);
+  }
+}
+
+static int t2_getnumpasses(opj_bio_t *bio) {
+  int n;
+  if (!bio_read(bio, 1))
+    return 1;
+  if (!bio_read(bio, 1))
+    return 2;
+  if ((n = bio_read(bio, 2)) != 3)
+    return (3 + n);
+  if ((n = bio_read(bio, 5)) != 31)
+    return (6 + n);
+  return (37 + bio_read(bio, 7));
+}
+
+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) {
+  int bandno, cblkno;
+  unsigned char *sop = 0, *eph = 0;
+  unsigned char *c = dest;
+
+  int compno = pi->compno;  /* component value */
+  int resno  = pi->resno;    /* resolution level value */
+  int precno = pi->precno;  /* precinct value */
+  int layno  = pi->layno;    /* quality layer value */
+
+  opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+  opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+  
+  opj_bio_t *bio = NULL;  /* BIO component */
+  
+  /* <SOP 0xff91> */
+  if (tcp->csty & J2K_CP_CSTY_SOP) {
+    sop = (unsigned char *) opj_malloc(6 * sizeof(unsigned char));
+    sop[0] = 255;
+    sop[1] = 145;
+    sop[2] = 0;
+    sop[3] = 4;
+    sop[4] = (image_info->num % 65536) / 256;
+    sop[5] = (image_info->num % 65536) % 256;
+    memcpy(c, sop, 6);
+    opj_free(sop);
+    c += 6;
+  }
+  /* </SOP> */
+  
+  if (!layno) {
+    for (bandno = 0; bandno < res->numbands; bandno++) {
+      opj_tcd_band_t *band = &res->bands[bandno];
+      opj_tcd_precinct_t *prc = &band->precincts[precno];
+      tgt_reset(prc->incltree);
+      tgt_reset(prc->imsbtree);
+      for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+        opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
+        cblk->numpasses = 0;
+        tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps);
+      }
+    }
+  }
+  
+  bio = bio_create();
+  bio_init_enc(bio, c, len);
+  bio_write(bio, 1, 1);    /* Empty header bit */
+  
+  /* Writing Packet header */
+  for (bandno = 0; bandno < res->numbands; bandno++) {
+    opj_tcd_band_t *band = &res->bands[bandno];
+    opj_tcd_precinct_t *prc = &band->precincts[precno];
+    for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+      opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
+      opj_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++) {
+      opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
+      opj_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(bio, prc->incltree, cblkno, layno + 1);
+      } else {
+        bio_write(bio, 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(bio, prc->imsbtree, cblkno, 999);
+      }
+      /* number of coding passes included */
+      t2_putnumpasses(bio, 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++) {
+        opj_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(bio, 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++) {
+        opj_tcd_pass_t *pass = &cblk->passes[passno];
+        nump++;
+        len += pass->len;
+        if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
+          bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump));
+          len = 0;
+          nump = 0;
+        }
+      }
+    }
+  }
+  
+  if (bio_flush(bio)) {
+    return -999;    /* modified to eliminate longjmp !! */
+  }
+  
+  c += bio_numbytes(bio);
+
+  bio_destroy(bio);
+  
+  /* <EPH 0xff92> */
+  if (tcp->csty & J2K_CP_CSTY_EPH) {
+    eph = (unsigned char *) opj_malloc(2 * sizeof(unsigned char));
+    eph[0] = 255;
+    eph[1] = 146;
+    memcpy(c, eph, 2);
+    opj_free(eph);
+    c += 2;
+  }
+  /* </EPH> */
+  
+  /* Writing the packet body */
+  
+  for (bandno = 0; bandno < res->numbands; bandno++) {
+    opj_tcd_band_t *band = &res->bands[bandno];
+    opj_tcd_precinct_t *prc = &band->precincts[precno];
+    for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+      opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
+      opj_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(image_info && image_info->index_write && image_info->index_on) {
+        opj_tile_info_t *info_TL = &image_info->tile[tileno];
+        opj_packet_info_t *info_PK = &info_TL->packet[image_info->num];
+        info_PK->disto += layer->disto;
+        if (image_info->D_max < info_PK->disto) {
+          image_info->D_max = info_PK->disto;
+        }
+      }
+      /* </ADD> */
+    }
+  }
+  
+  return (c - dest);
+}
+
+static void t2_init_seg(opj_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;
+  }
+}
+
+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) {
+  int bandno, cblkno;
+  unsigned char *c = src;
+
+  opj_cp_t *cp = t2->cp;
+
+  int compno = pi->compno;  /* component value */
+  int resno  = pi->resno;    /* resolution level value */
+  int precno = pi->precno;  /* precinct value */
+  int layno  = pi->layno;    /* quality layer value */
+
+  opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+  opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+  
+  unsigned char *hd = NULL;
+  int present;
+  
+  opj_bio_t *bio = NULL;  /* BIO component */
+  
+  if (layno == 0) {
+    for (bandno = 0; bandno < res->numbands; bandno++) {
+      opj_tcd_band_t *band = &res->bands[bandno];
+      opj_tcd_precinct_t *prc = &band->precincts[precno];
+      
+      if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;
+      
+      tgt_reset(prc->incltree);
+      tgt_reset(prc->imsbtree);
+      for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+        opj_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)) {
+      opj_event_msg(t2->cinfo, EVT_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 
+  */
+
+  bio = bio_create();
+  
+  if (cp->ppm == 1) {    /* PPM */
+    hd = cp->ppm_data;
+    bio_init_dec(bio, hd, cp->ppm_len);
+  } else if (tcp->ppt == 1) {  /* PPT */
+    hd = tcp->ppt_data;
+    bio_init_dec(bio, hd, tcp->ppt_len);
+  } else {      /* Normal Case */
+    hd = c;
+    bio_init_dec(bio, hd, src+len-hd);
+  }
+  
+  present = bio_read(bio, 1);
+  
+  if (!present) {
+    bio_inalign(bio);
+    hd += bio_numbytes(bio);
+    bio_destroy(bio);
+    
+    /* 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++) {
+    opj_tcd_band_t *band = &res->bands[bandno];
+    opj_tcd_precinct_t *prc = &band->precincts[precno];
+    
+    if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;
+    
+    for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+      int included, increment, n;
+      opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
+      opj_tcd_seg_t *seg = NULL;
+      /* if cblk not yet included before --> inclusion tagtree */
+      if (!cblk->numsegs) {
+        included = tgt_decode(bio, prc->incltree, cblkno, layno + 1);
+        /* else one bit */
+      } else {
+        included = bio_read(bio, 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(bio, prc->imsbtree, cblkno, i); i++) {
+          ;
+        }
+        numimsbs = i - 1;
+        cblk->numbps = band->numbps - numimsbs;
+        cblk->numlenbits = 3;
+      }
+      /* number of coding passes */
+      cblk->numnewpasses = t2_getnumpasses(bio);
+      increment = t2_getcommacode(bio);
+      /* 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(bio, 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(bio)) {
+    bio_destroy(bio);
+    return -999;
+  }
+  
+  hd += bio_numbytes(bio);
+  bio_destroy(bio);
+  
+  /* EPH markers */
+  if (tcp->csty & J2K_CP_CSTY_EPH) {
+    if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {
+      opj_event_msg(t2->cinfo, EVT_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++) {
+    opj_tcd_band_t *band = &res->bands[bandno];
+    opj_tcd_precinct_t *prc = &band->precincts[precno];
+    
+    if ((band->x1-band->x0 == 0)||(band->y1-band->y0 == 0)) continue;
+    
+    for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+      opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
+      opj_tcd_seg_t *seg = NULL;
+      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);
+}
+
+/* ----------------------------------------------------------------------- */
+
+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) {
+  unsigned char *c = dest;
+  int e = 0;
+  opj_pi_iterator_t *pi = NULL;
+  int pino;
+
+  opj_image_t *image = t2->image;
+  opj_cp_t *cp = t2->cp;
+  
+  /* create a packet iterator */
+  pi = pi_create(image, cp, tileno);
+  if(!pi) {
+    /* TODO: throw an error */
+    return -999;
+  }
+  
+  if(image_info) {
+    image_info->num = 0;
+  }
+  
+  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], c, dest + len - c, image_info, tileno);
+        if (e == -999) {
+          break;
+        } else {
+          c += e;
+        }
+        
+        /* INDEX >> */
+        if(image_info && image_info->index_on) {
+          if(image_info->index_write) {
+            opj_tile_info_t *info_TL = &image_info->tile[tileno];
+            opj_packet_info_t *info_PK = &info_TL->packet[image_info->num];
+            if (!image_info->num) {
+              info_PK->start_pos = info_TL->end_header + 1;
+            } else {
+              info_PK->start_pos = info_TL->packet[image_info->num - 1].end_pos + 1;
+            }
+            info_PK->end_pos = info_PK->start_pos + e - 1;
+          }
+
+          image_info->num++;
+        }
+        /* << INDEX */
+      }
+    }
+  }
+
+  /* don't forget to release pi */
+  pi_destroy(pi, cp, tileno);
+  
+  if (e == -999) {
+    return e;
+  }
+
+    return (c - dest);
+}
+
+int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile) {
+  unsigned char *c = src;
+  opj_pi_iterator_t *pi;
+  int pino, e = 0;
+  int n = 0;
+
+  opj_image_t *image = t2->image;
+  opj_cp_t *cp = t2->cp;
+  
+  /* create a packet iterator */
+  pi = pi_create(image, cp, tileno);
+  if(!pi) {
+    /* TODO: throw an error */
+    return -999;
+  }
+  
+  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(t2, c, src + len - c, tile, &cp->tcps[tileno], &pi[pino]);
+      } else {
+        e = 0;
+      }
+      
+      /* progression in resolution */
+      image->comps[pi[pino].compno].resno_decoded =  
+        (e > 0) ? 
+        int_max(pi[pino].resno, image->comps[pi[pino].compno].resno_decoded) 
+        : image->comps[pi[pino].compno].resno_decoded;
+      n++;
+      
+      if (e == -999) {    /* ADD */
+        break;
+      } else {
+        c += e;
+      }
+    }
+  }
+
+  /* don't forget to release pi */
+  pi_destroy(pi, cp, tileno);
+  
+  if (e == -999) {
+    return e;
+  }
+  
+    return (c - src);
+}
+
+/* ----------------------------------------------------------------------- */
+
+opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp) {
+  /* create the tcd structure */
+  opj_t2_t *t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t));
+  if(!t2) return NULL;
+  t2->cinfo = cinfo;
+  t2->image = image;
+  t2->cp = cp;
+
+  return t2;
+}
+
+void t2_destroy(opj_t2_t *t2) {
+  if(t2) {
+    opj_free(t2);
+  }
+}
+
index 39d7abfa6262179e49a2dbef6e1a781564d4c277..d1d4d908087ff0d14290eb662bb95ed44fc41d6e 100644 (file)
@@ -1,99 +1,99 @@
-/*\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
+/*
+ * 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.
+ */
+#ifndef __T2_H
+#define __T2_H
+/**
+@file t2.h
+@brief Implementation of a tier-2 coding (packetization of code-block data) (T2)
+
+*/
+
+/** @defgroup T2 T2 - Implementation of a tier-2 coding */
+/*@{*/
+
+/**
+Tier-2 coding
+*/
+typedef struct opj_t2 {
+  /** codec context */
+  opj_common_ptr cinfo;
+
+  /** Encoding: pointer to the src image. Decoding: pointer to the dst image. */
+  opj_image_t *image;
+  /** pointer to the image coding parameters */
+  opj_cp_t *cp;
+} opj_t2_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Encode the packets of a tile to a destination buffer
+@param t2 T2 handle
+@param tileno number of the tile encoded
+@param tile the tile for which to write the packets
+@param maxlayers maximum number of layers
+@param dest the destination buffer
+@param len the length of the destination buffer
+@param image_info structure to create an index file
+*/
+int t2_encode_packets(opj_t2_t* t2, int tileno, opj_tcd_tile_t *tile, int maxlayers, unsigned char *dest, int len, opj_image_info_t *image_info);
+
+/**
+Decode the packets of a tile from a source buffer
+@param t2 T2 handle
+@param src the source buffer
+@param len length of the source buffer
+@param tileno number that identifies the tile for which to decode the packets
+@param tile tile for which to decode the packets
+ */
+int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile);
+
+/**
+Create a T2 handle
+@param cinfo Codec context info
+@param image Source or destination image
+@param cp Image coding parameters
+@return Returns a new T2 handle if successful, returns NULL otherwise
+*/
+opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp);
+/**
+Destroy a T2 handle
+@param t2 T2 handle to destroy
+*/
+void t2_destroy(opj_t2_t *t2);
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __T2_H */
index 6f94de616d76c526c9d5a81b4618c56c38b9eb5f..dfa7b15a79f29f3087018ecc73de73c115bdf93c 100644 (file)
-/*\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
+/*
+ * 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.
+ */
+#ifndef __TCD_H
+#define __TCD_H
+/**
+@file tcd.h
+@brief Implementation of a tile coder/decoder (TCD)
+
+The functions in TCD.C have for goal to encode or decode each tile independently from
+each other. The functions in TCD.C are used by some function in J2K.C.
+*/
+
+/** @defgroup TCD TCD - Implementation of a tile coder/decoder */
+/*@{*/
+
+/**
+FIXME: documentation
+*/
+typedef struct opj_tcd_seg {
+  int numpasses;
+  int len;
+  unsigned char *data;
+  int maxpasses;
+  int numnewpasses;
+  int newlen;
+} opj_tcd_seg_t;
+
+/**
+FIXME: documentation
+*/
+typedef struct opj_tcd_pass {
+  int rate;
+  double distortiondec;
+  int term, len;
+} opj_tcd_pass_t;
+
+/**
+FIXME: documentation
+*/
+typedef struct opj_tcd_layer {
+  int numpasses;    /* Number of passes in the layer */
+  int len;      /* len of information */
+  double disto;      /* add for index (Cfr. Marcela) */
+  unsigned char *data;    /* data */
+} opj_tcd_layer_t;
+
+/**
+FIXME: documentation
+*/
+typedef struct opj_tcd_cblk {
+  int x0, y0, x1, y1;    /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
+  int numbps;
+  int 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 */
+  opj_tcd_seg_t segs[100];    /* segments informations */
+  unsigned char data[8192];  /* Data */
+  int numpassesinlayers;  /* number of passes in the layer */
+  opj_tcd_layer_t layers[100];  /* layer information */
+  int totalpasses;    /* total number of passes */
+  opj_tcd_pass_t passes[100];  /* information about the passes */
+} opj_tcd_cblk_t;
+
+/**
+FIXME: documentation
+*/
+typedef struct opj_tcd_precinct {
+  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 */
+  opj_tcd_cblk_t *cblks;    /* code-blocks informations */
+  opj_tgt_tree_t *incltree;    /* inclusion tree */
+  opj_tgt_tree_t *imsbtree;    /* IMSB tree */
+} opj_tcd_precinct_t;
+
+/**
+FIXME: documentation
+*/
+typedef struct opj_tcd_band {
+  int x0, y0, x1, y1;    /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
+  int bandno;
+  opj_tcd_precinct_t *precincts;  /* precinct information */
+  int numbps;
+  float stepsize;
+} opj_tcd_band_t;
+
+/**
+FIXME: documentation
+*/
+typedef struct opj_tcd_resolution {
+  int x0, y0, x1, y1;    /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
+  int pw, ph;
+  int numbands;      /* number sub-band for the resolution level */
+  opj_tcd_band_t bands[3];    /* subband information */
+} opj_tcd_resolution_t;
+
+/**
+FIXME: documentation
+*/
+typedef struct opj_tcd_tilecomp {
+  int x0, y0, x1, y1;    /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
+  int numresolutions;    /* number of resolutions level */
+  opj_tcd_resolution_t *resolutions;  /* resolutions information */
+  int *data;      /* data of the component */
+  int nbpix;      /* add fixed_quality */
+} opj_tcd_tilecomp_t;
+
+/**
+FIXME: documentation
+*/
+typedef struct opj_tcd_tile {
+  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 */
+  opj_tcd_tilecomp_t *comps;  /* Components information */
+  int nbpix;      /* add fixed_quality */
+  double distotile;    /* add fixed_quality */
+  double distolayer[100];  /* add fixed_quality */
+} opj_tcd_tile_t;
+
+/**
+FIXME: documentation
+*/
+typedef struct opj_tcd_image {
+  int tw, th;      /* number of tiles in width and heigth */
+  opj_tcd_tile_t *tiles;    /* Tiles information */
+} opj_tcd_image_t;
+
+/**
+Tile coder/decoder
+*/
+typedef struct opj_tcd {
+  /** codec context */
+  opj_common_ptr cinfo;
+
+  /** info on each image tile */
+  opj_tcd_image_t *tcd_image;
+  /** image */
+  opj_image_t *image;
+  /** coding parameters */
+  opj_cp_t *cp;
+  /** pointer to the current encoded/decoded tile */
+  opj_tcd_tile_t *tcd_tile;
+  /** coding/decoding parameters common to all tiles */
+  opj_tcp_t *tcp;
+  /** current encoded/decoded tile */
+  int tcd_tileno;
+  /**@name working variables */
+  /*@{*/
+  opj_tcd_tile_t *tile;
+  opj_tcd_tilecomp_t *tilec;
+  opj_tcd_resolution_t *res;
+  opj_tcd_band_t *band;
+  opj_tcd_precinct_t *prc;
+  opj_tcd_cblk_t *cblk;
+  /*@}*/
+} opj_tcd_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+
+/**
+Dump the content of a tcd structure
+*/
+void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);
+/**
+Create a new TCD handle
+@param cinfo Codec context info
+@return Returns a new TCD handle if successful returns NULL otherwise
+*/
+opj_tcd_t* tcd_create(opj_common_ptr cinfo);
+/**
+Destroy a previously created TCD handle
+@param tcd TCD handle to destroy
+*/
+void tcd_destroy(opj_tcd_t *tcd);
+/**
+Initialize the tile coder (allocate the memory)
+@param tcd TCD handle
+@param image Raw image
+@param cp Coding parameters
+@param curtileno Number that identifies the tile that will be encoded
+*/
+void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno);
+/**
+Free the memory allocated for encoding
+@param tcd TCD handle
+*/
+void tcd_free_encode(opj_tcd_t *tcd);
+/**
+Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode)
+@param tcd TCD handle
+@param image Raw image
+@param cp Coding parameters
+@param curtileno Number that identifies the tile that will be encoded
+*/
+void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int curtileno);
+/**
+Initialize the tile decoder
+@param tcd TCD handle
+@param image Raw image
+@param cp Coding parameters
+*/
+void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp);
+void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final);
+void tcd_rateallocate_fixed(opj_tcd_t *tcd);
+void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final);
+bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_image_info_t * image_info);
+/**
+Encode a tile from the raw image into a buffer
+@param tcd TCD handle
+@param tileno Number that identifies one of the tiles to be encoded
+@param dest Destination buffer
+@param len Length of destination buffer
+@param image_info Creation of index file
+@return 
+*/
+int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_image_info_t * image_info);
+/**
+Decode a tile from a buffer into a raw image
+@param tcd TCD handle
+@param src Source buffer
+@param len Length of source buffer
+@param tileno Number that identifies one of the tiles to be decoded
+*/
+bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno);
+/**
+Free the memory allocated for decoding
+@param tcd TCD handle
+*/
+void tcd_free_decode(opj_tcd_t *tcd);
+
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __TCD_H */
index f63f9f962b9ead8ded648ea43b6182117c57b918..aaaa09b9628f6768bf60232820044d0c42038a1e 100644 (file)
-/*\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
+/*
+ * 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"
+
+/* 
+==========================================================
+   Tag-tree coder interface
+==========================================================
+*/
+
+opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) {
+  int nplh[32];
+  int nplv[32];
+  opj_tgt_node_t *node = NULL;
+  opj_tgt_node_t *parentnode = NULL;
+  opj_tgt_node_t *parentnode0 = NULL;
+  opj_tgt_tree_t *tree = NULL;
+  int i, j, k;
+  int numlvls;
+  int n;
+
+  tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t));
+  if(!tree) return NULL;
+  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) {
+    opj_free(tree);
+    return NULL;
+  }
+
+  tree->nodes = (opj_tgt_node_t *) opj_malloc(tree->numnodes * sizeof(opj_tgt_node_t));
+  if(!tree->nodes) {
+    opj_free(tree);
+    return NULL;
+  }
+
+  node = tree->nodes;
+  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;
+}
+
+void tgt_destroy(opj_tgt_tree_t *tree) {
+  opj_free(tree->nodes);
+  opj_free(tree);
+}
+
+void tgt_reset(opj_tgt_tree_t *tree) {
+  int i;
+
+  if (NULL == tree)
+    return;
+  
+  for (i = 0; i < tree->numnodes; i++) {
+    tree->nodes[i].value = 999;
+    tree->nodes[i].low = 0;
+    tree->nodes[i].known = 0;
+  }
+}
+
+void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) {
+  opj_tgt_node_t *node;
+  node = &tree->nodes[leafno];
+  while (node && node->value > value) {
+    node->value = value;
+    node = node->parent;
+  }
+}
+
+void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) {
+  opj_tgt_node_t *stk[31];
+  opj_tgt_node_t **stkptr;
+  opj_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(bio, 1, 1);
+          node->known = 1;
+        }
+        break;
+      }
+      bio_write(bio, 0, 1);
+      ++low;
+    }
+    
+    node->low = low;
+    if (stkptr == stk)
+      break;
+    node = *--stkptr;
+  }
+}
+
+int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) {
+  opj_tgt_node_t *stk[31];
+  opj_tgt_node_t **stkptr;
+  opj_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(bio, 1)) {
+        node->value = low;
+      } else {
+        ++low;
+      }
+    }
+    node->low = low;
+    if (stkptr == stk) {
+      break;
+    }
+    node = *--stkptr;
+  }
+  
+  return (node->value < threshold) ? 1 : 0;
+}
index c77e027a133a11e749fdc3072f67968c84b556f2..481f678adb608883b30ce5084461554378833540 100644 (file)
-/*\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
+/*
+ * 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.
+ */
+
+#ifndef __TGT_H
+#define __TGT_H
+/**
+@file tgt.h
+@brief Implementation of a tag-tree coder (TGT)
+
+The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C
+are used by some function in T2.C.
+*/
+
+/** @defgroup TGT TGT - Implementation of a tag-tree coder */
+/*@{*/
+
+/**
+Tag node
+*/
+typedef struct opj_tgt_node {
+  struct opj_tgt_node *parent;
+  int value;
+  int low;
+  int known;
+} opj_tgt_node_t;
+
+/**
+Tag tree
+*/
+typedef struct opj_tgt_tree {
+  int numleafsh;
+  int numleafsv;
+  int numnodes;
+  opj_tgt_node_t *nodes;
+} opj_tgt_tree_t;
+
+/** @name Exported functions */
+/*@{*/
+/* ----------------------------------------------------------------------- */
+/**
+Create a tag-tree
+@param numleafsh Width of the array of leafs of the tree
+@param numleafsv Height of the array of leafs of the tree
+@return Returns a new tag-tree if successful, returns NULL otherwise
+*/
+opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv);
+/**
+Destroy a tag-tree, liberating memory
+@param tree Tag-tree to destroy
+*/
+void tgt_destroy(opj_tgt_tree_t *tree);
+/**
+Reset a tag-tree (set all leaves to 0)
+@param tree Tag-tree to reset
+*/
+void tgt_reset(opj_tgt_tree_t *tree);
+/**
+Set the value of a leaf of a tag-tree
+@param tree Tag-tree to modify
+@param leafno Number that identifies the leaf to modify
+@param value New value of the leaf
+*/
+void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value);
+/**
+Encode the value of a leaf of the tag-tree up to a given threshold
+@param bio Pointer to a BIO handle
+@param tree Tag-tree to modify
+@param leafno Number that identifies the leaf to encode
+@param threshold Threshold to use when encoding value of the leaf
+*/
+void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold);
+/**
+Decode the value of a leaf of the tag-tree up to a given threshold
+@param bio Pointer to a BIO handle
+@param tree Tag-tree to decode
+@param leafno Number that identifies the leaf to decode
+@param threshold Threshold to use when decoding value of the leaf
+@return Returns 1 if the node's value < threshold, returns 0 otherwise
+*/
+int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold);
+/* ----------------------------------------------------------------------- */
+/*@}*/
+
+/*@}*/
+
+#endif /* __TGT_H */