moved "openjpeg3d" directory from the trunk to the branches directory.
[openjpeg.git] / jpwl / jpwl.h
index b2a4c34caf853775045c2911095131ed66812286..d1d066cda2132d8a9098a51cc6a0cc05d75432b2 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
- * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy\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 __JPWL_H\r
-#define __JPWL_H\r
-\r
-#ifdef USE_JPWL\r
-\r
-#include "crc.h"\r
-#include "rs.h"\r
-\r
-/**\r
-@file jpwl.h\r
-@brief The JPEG-2000 Part11 (JPWL) marker segments manager\r
-\r
-The functions in JPWL.C have for goal to read/write the markers added by JPWL.\r
-*/\r
-\r
-/** @defgroup JPWL JPWL - JPEG-2000 Part11 (JPWL) codestream manager */\r
-/*@{*/\r
-\r
-/**\r
-Assume a basic codestream structure, so you can resort better from uncorrected errors\r
-*/\r
-#define JPWL_ASSUME true\r
-\r
-/**\r
-EPB (Error Protection Block) Marker segment\r
-*/\r
-typedef struct jpwl_epb_ms {\r
-       /**@name Private fields set by epb_create */\r
-       /*@{*/\r
-       /** is the latest in header? */\r
-       bool latest;\r
-       /** is it in packed mode? */\r
-       bool packed;\r
-       /** TH where this marker has been placed (-1 means MH) */\r
-       int tileno;\r
-       /** index in current header (0-63) */\r
-       unsigned char index;\r
-       /** error protection method     [-1=absent 0=none 1=predefined 16=CRC-16 32=CRC-32 37-128=RS] */\r
-       int hprot;\r
-       /** message word length of pre-data */\r
-       int k_pre;\r
-       /** code word length of pre-data */\r
-       int n_pre;\r
-       /** length of pre-data */\r
-       int pre_len;\r
-       /** message word length of post-data */\r
-       int k_post;\r
-       /** code word length of post-data */\r
-       int n_post;\r
-       /** length of post-data */\r
-       int post_len;\r
-       /*@}*/\r
-       /**@name Marker segment fields */\r
-       /*@{*/\r
-       /** two bytes for the length of EPB MS, exluding the marker itself (11 to 65535 bytes) */\r
-       unsigned short int Lepb;\r
-       /** single byte for the style */\r
-       unsigned char Depb; \r
-       /** four bytes, from 0 to 2^31-1 */\r
-       unsigned long int LDPepb;\r
-       /** four bytes, next error management method */\r
-       unsigned long int Pepb;\r
-       /** EPB data, variable size */\r
-       unsigned char *data;   \r
-       /*@}*/\r
-}      jpwl_epb_ms_t;\r
-\r
-/**\r
-EPC (Error Protection Capability) Marker segment\r
-*/\r
-typedef struct jpwl_epc_ms {\r
-       /** is ESD active? */\r
-       bool esd_on;\r
-       /** is RED active? */\r
-       bool red_on;\r
-       /** is EPB active? */\r
-       bool epb_on;\r
-       /** are informative techniques active? */\r
-       bool info_on;\r
-       /**@name Marker segment fields */\r
-       /*@{*/\r
-       /** two bytes for the length of EPC MS, exluding the marker itself (9 to 65535 bytes) */\r
-       unsigned short int Lepc;   \r
-       /** two bytes, CRC for the EPC, excluding Pcrc itself */\r
-       unsigned short int Pcrc;   \r
-       /** four bytes, the codestream length from SOC to EOC */\r
-       unsigned long int DL;     \r
-       /** one byte, signals JPWL techniques adoption */\r
-       unsigned char Pepc;     \r
-       /** EPC data, variable length */\r
-       unsigned char *data;    \r
-       /*@}*/\r
-}      jpwl_epc_ms_t;\r
-\r
-/**\r
-ESD (Error Sensitivity Descriptor) Marker segment\r
-*/\r
-typedef struct jpwl_esd_ms {\r
-       /** codestream addressing mode [0=packet, 1=byte range, 2=packet range, 3=reserved] */\r
-       unsigned char addrm;\r
-       /** size of codestream addresses [2/4 bytes] */\r
-       unsigned char ad_size;\r
-       /** type of sensitivity\r
-       [0=relative error, 1=MSE, 2=MSE reduction, 3=PSNR, 4=PSNR increment,\r
-       5=MAXERR (absolute peak error), 6=TSE (total squared error), 7=reserved */\r
-       unsigned char senst;\r
-       /** size of sensitivity data (1/2 bytes) */\r
-       unsigned char se_size;\r
-       /**@name Marker segment fields */\r
-       /*@{*/\r
-       /** two bytes for the length of ESD MS, exluding the marker itself (4 to 65535 bytes) */\r
-       unsigned short int Lesd;   \r
-       /** two bytes, component of error sensitivity */\r
-       unsigned short int Cesd;\r
-       /** one byte, signals JPWL techniques adoption */\r
-       unsigned char Pesd;     \r
-       /** ESD data, variable length */\r
-       unsigned char *data;    \r
-       /*@}*/\r
-       /**@name Fields set by esd_create (only internal use) */\r
-       /*@{*/\r
-       /** number of components in the image */\r
-       int numcomps;\r
-       /** tile where this marker has been placed (-1 means MH) */\r
-       int tileno;\r
-       /** number of sensitivity values */\r
-       unsigned long int svalnum;\r
-       /** size of a single sensitivity pair (address+value) */\r
-       size_t sensval_size;\r
-       /*@}*/\r
-}      jpwl_esd_ms_t;\r
-\r
-/**\r
-RED (Residual Error Descriptor) Marker segment\r
-*/\r
-typedef struct jpwl_red_ms {\r
-       /** two bytes for the length of RED MS, exluding the marker itself (3 to 65535 bytes) */\r
-       unsigned short int Lred;\r
-       /** one byte, signals JPWL techniques adoption */\r
-       unsigned char Pred;     \r
-       /** RED data, variable length */\r
-       unsigned char *data;    \r
-}      jpwl_red_ms_t;\r
-\r
-/**\r
-Structure used to store JPWL markers temporary position and readyness\r
-*/\r
-typedef struct jpwl_marker {\r
-       /** marker value (J2K_MS_EPC, etc.) */\r
-       int id;\r
-       /** union keeping the pointer to the real marker struct */\r
-       union {\r
-               /** pointer to EPB marker */\r
-               jpwl_epb_ms_t *epbmark;\r
-               /** pointer to EPC marker */\r
-               jpwl_epc_ms_t *epcmark;\r
-               /** pointer to ESD marker */\r
-               jpwl_esd_ms_t *esdmark;\r
-               /** pointer to RED marker */\r
-               jpwl_red_ms_t *redmark;\r
-       };\r
-       /** position where the marker should go, in the pre-JPWL codestream */ \r
-       unsigned long int pos;\r
-       /** same as before, only written as a double, so we can sort it better */\r
-       double dpos;\r
-       /** length of the marker segment (marker excluded) */\r
-       unsigned short int len;\r
-       /** the marker length is ready or not? */\r
-       bool len_ready;\r
-       /** the marker position is ready or not? */\r
-       bool pos_ready;\r
-       /** the marker parameters are ready or not? */\r
-       bool parms_ready;\r
-       /** are the written data ready or not */\r
-       bool data_ready;\r
-}      jpwl_marker_t;\r
-\r
-/**\r
-Prepare the list of JPWL markers, after the Part 1 codestream\r
-has been finalized (index struct is full)\r
-@param j2k J2K handle\r
-@param cio codestream handle\r
-@param image image handle\r
-*/\r
-void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image);\r
-\r
-/**\r
-Dump the list of JPWL markers, after it has been prepared\r
-@param j2k J2K handle\r
-@param cio codestream handle\r
-@param image image handle\r
-*/\r
-void jpwl_dump_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image);\r
-\r
-/**\r
-Read the EPC marker (Error Protection Capability)\r
-@param j2k J2K handle\r
-*/\r
-void j2k_read_epc(opj_j2k_t *j2k);\r
-/**\r
-Write the EPC marker (Error Protection Capability), BUT the DL field is always set to 0\r
-(this simplifies the management of EPBs and it is openly stated in the standard\r
-as a possible value, mening that the information is not available) and the informative techniques\r
-are not yet implemented\r
-@param j2k J2K handle\r
-*/\r
-void j2k_write_epc(opj_j2k_t *j2k);\r
-/**\r
-Read the EPB marker (Error Protection Block)\r
-@param j2k J2K handle\r
-*/\r
-void j2k_read_epb(opj_j2k_t *j2k);\r
-/**\r
-Write the EPB marker (Error Protection Block)\r
-@param j2k J2K handle\r
-*/\r
-void j2k_write_epb(opj_j2k_t *j2k);\r
-/**\r
-Read the ESD marker (Error Sensitivity Descriptor)\r
-@param j2k J2K handle\r
-*/\r
-void j2k_read_esd(opj_j2k_t *j2k);\r
-/**\r
-Read the RED marker (Residual Error Descriptor)\r
-@param j2k J2K handle\r
-*/\r
-void j2k_read_red(opj_j2k_t *j2k);\r
-\r
-/** create an EPB marker segment\r
-@param j2k J2K compressor handle\r
-@param latest it is the latest EPB in the header\r
-@param packed EPB is in packed style\r
-@param tileno tile number where the marker has been placed (-1 means MH)\r
-@param idx current EPB running index\r
-@param hprot applied protection type (-1/0,1,16,32,37-128)\r
-@param pre_len length of pre-protected data\r
-@param post_len length of post-protected data\r
-@return returns the freshly created EPB\r
-*/\r
-jpwl_epb_ms_t *jpwl_epb_create(opj_j2k_t *j2k, bool latest, bool packed, int tileno, int idx, int hprot,\r
-                                                          unsigned long int pre_len, unsigned long int post_len);\r
-\r
-/** add a number of EPB marker segments\r
-@param j2k J2K compressor handle\r
-@param jwmarker pointer to the JPWL markers list\r
-@param jwmarker_num pointer to the number of JPWL markers (gets updated)\r
-@param latest it is the latest group of EPBs in the header\r
-@param packed EPBs are in packed style\r
-@param insideMH it is in the MH\r
-@param idx pointer to the starting EPB running index (gets updated)\r
-@param hprot applied protection type (-1/0,1,16,32,37-128)\r
-@param place_pos place in original codestream where EPBs should go\r
-@param tileno tile number of these EPBs\r
-@param pre_len length of pre-protected data\r
-@param post_len length of post-protected data\r
-@return returns the length of all added markers\r
-*/\r
-int jpwl_epbs_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num,\r
-                                 bool latest, bool packed, bool insideMH, int *idx, int hprot,\r
-                                 double place_pos, int tileno,\r
-                                 unsigned long int pre_len, unsigned long int post_len);\r
-\r
-/** add a number of ESD marker segments\r
-@param j2k J2K compressor handle\r
-@param jwmarker pointer to the JPWL markers list\r
-@param jwmarker_num pointer to the number of JPWL markers (gets updated)\r
-@param comps considered component (-1=average, 0/1/2/...=component no.)\r
-@param addrm addressing mode (0=packet, 1=byte range, 2=packet range, 3=reserved)\r
-@param ad_size size of addresses (2/4 bytes)\r
-@param senst sensitivity type\r
-@param se_size sensitivity values size (1/2 bytes)\r
-@param place_pos place in original codestream where EPBs should go\r
-@param tileno tile number of these EPBs\r
-@return returns the length of all added markers\r
-*/\r
-int jpwl_esds_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num,\r
-                                 int comps, unsigned char addrm, unsigned char ad_size,\r
-                                 unsigned char senst, unsigned char se_size,\r
-                                 double place_pos, int tileno);\r
-       \r
-/** updates the information structure by modifying the positions and lengths\r
-@param j2k J2K compressor handle\r
-@param jwmarker pointer to JPWL markers list\r
-@param jwmarker_num number of JPWL markers\r
-@return returns true in case of success\r
-*/                       \r
-bool jpwl_update_info(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int jwmarker_num);\r
-\r
-\r
-bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esdmark, unsigned char *buf);\r
-\r
-bool jpwl_epb_fill(opj_j2k_t *j2k, jpwl_epb_ms_t *epbmark, unsigned char *buf, unsigned char *post_buf);\r
-\r
-/** corrects the data in the JPWL codestream\r
-@param j2k J2K compressor handle\r
-@return true if correction is performed correctly\r
-*/\r
-bool jpwl_correct(opj_j2k_t *j2k);\r
-\r
-/** corrects the data protected by an EPB\r
-@param j2k J2K compressor handle\r
-@param buffer pointer to the EPB position\r
-@param type type of EPB: 0=MH, 1=TPH, 2=other, 3=auto\r
-@param pre_len length of pre-data\r
-@param post_len length of post_data\r
-@param conn is a pointer to the length of all connected (packed) EPBs\r
-@param L4_bufp is a pointer to the buffer pointer of redundancy data\r
-@return returns true if correction could be succesfully performed\r
-*/\r
-bool jpwl_epb_correct(opj_j2k_t *j2k, unsigned char *buffer, int type, int pre_len, int post_len, int *conn,\r
-                                         unsigned char **L4_bufp);\r
-\r
-/** check that a tile and its children have valid data\r
-@param j2k J2K decompressor handle\r
-@param tcd Tile decompressor handle\r
-@param tileno number of the tile to check\r
-*/\r
-bool jpwl_check_tile(opj_j2k_t *j2k, opj_tcd_t *tcd, int tileno);\r
-\r
-/** Macro functions for CRC computation */\r
-\r
-/**\r
-Computes the CRC-16, as stated in JPWL specs\r
-@param CRC two bytes containing the CRC value (must be initialized with 0x0000)\r
-@param DATA byte for which the CRC is computed; call this on every byte of the sequence\r
-and get the CRC at the end\r
-*/\r
-#define jpwl_updateCRC16(CRC, DATA) updateCRC16(CRC, DATA)\r
-\r
-/**\r
-Computes the CRC-32, as stated in JPWL specs\r
-@param CRC four bytes containing the CRC value (must be initialized with 0x00000000)\r
-@param DATA byte for which the CRC is computed; call this on every byte of the sequence\r
-and get the CRC at the end\r
-*/\r
-#define jpwl_updateCRC32(CRC, DATA) updateCRC32(CRC, DATA)\r
-\r
-/*@}*/\r
-\r
-#endif /* USE_JPWL */\r
-\r
-#endif /* __JPWL_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, Herve Drolon, FreeImage Team
+ * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * Copyright (c) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy
+ * 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 __JPWL_H
+#define __JPWL_H
+
+#ifdef USE_JPWL
+
+#include "crc.h"
+#include "rs.h"
+
+/**
+@file jpwl.h
+@brief The JPEG-2000 Part11 (JPWL) marker segments manager
+
+The functions in JPWL.C have for goal to read/write the markers added by JPWL.
+*/
+
+/** @defgroup JPWL JPWL - JPEG-2000 Part11 (JPWL) codestream manager */
+/*@{*/
+
+/**
+Assume a basic codestream structure, so you can resort better from uncorrected errors
+*/
+#define JPWL_ASSUME true
+
+/**
+EPB (Error Protection Block) Marker segment
+*/
+typedef struct jpwl_epb_ms {
+       /**@name Private fields set by epb_create */
+       /*@{*/
+       /** is the latest in header? */
+       bool latest;
+       /** is it in packed mode? */
+       bool packed;
+       /** TH where this marker has been placed (-1 means MH) */
+       int tileno;
+       /** index in current header (0-63) */
+       unsigned char index;
+       /** error protection method     [-1=absent 0=none 1=predefined 16=CRC-16 32=CRC-32 37-128=RS] */
+       int hprot;
+       /** message word length of pre-data */
+       int k_pre;
+       /** code word length of pre-data */
+       int n_pre;
+       /** length of pre-data */
+       int pre_len;
+       /** message word length of post-data */
+       int k_post;
+       /** code word length of post-data */
+       int n_post;
+       /** length of post-data */
+       int post_len;
+       /*@}*/
+       /**@name Marker segment fields */
+       /*@{*/
+       /** two bytes for the length of EPB MS, exluding the marker itself (11 to 65535 bytes) */
+       unsigned short int Lepb;
+       /** single byte for the style */
+       unsigned char Depb; 
+       /** four bytes, from 0 to 2^31-1 */
+       unsigned long int LDPepb;
+       /** four bytes, next error management method */
+       unsigned long int Pepb;
+       /** EPB data, variable size */
+       unsigned char *data;   
+       /*@}*/
+}      jpwl_epb_ms_t;
+
+/**
+EPC (Error Protection Capability) Marker segment
+*/
+typedef struct jpwl_epc_ms {
+       /** is ESD active? */
+       bool esd_on;
+       /** is RED active? */
+       bool red_on;
+       /** is EPB active? */
+       bool epb_on;
+       /** are informative techniques active? */
+       bool info_on;
+       /**@name Marker segment fields */
+       /*@{*/
+       /** two bytes for the length of EPC MS, exluding the marker itself (9 to 65535 bytes) */
+       unsigned short int Lepc;   
+       /** two bytes, CRC for the EPC, excluding Pcrc itself */
+       unsigned short int Pcrc;   
+       /** four bytes, the codestream length from SOC to EOC */
+       unsigned long int DL;     
+       /** one byte, signals JPWL techniques adoption */
+       unsigned char Pepc;     
+       /** EPC data, variable length */
+       unsigned char *data;    
+       /*@}*/
+}      jpwl_epc_ms_t;
+
+/**
+ESD (Error Sensitivity Descriptor) Marker segment
+*/
+typedef struct jpwl_esd_ms {
+       /** codestream addressing mode [0=packet, 1=byte range, 2=packet range, 3=reserved] */
+       unsigned char addrm;
+       /** size of codestream addresses [2/4 bytes] */
+       unsigned char ad_size;
+       /** type of sensitivity
+       [0=relative error, 1=MSE, 2=MSE reduction, 3=PSNR, 4=PSNR increment,
+       5=MAXERR (absolute peak error), 6=TSE (total squared error), 7=reserved */
+       unsigned char senst;
+       /** size of sensitivity data (1/2 bytes) */
+       unsigned char se_size;
+       /**@name Marker segment fields */
+       /*@{*/
+       /** two bytes for the length of ESD MS, exluding the marker itself (4 to 65535 bytes) */
+       unsigned short int Lesd;   
+       /** two bytes, component of error sensitivity */
+       unsigned short int Cesd;
+       /** one byte, signals JPWL techniques adoption */
+       unsigned char Pesd;     
+       /** ESD data, variable length */
+       unsigned char *data;    
+       /*@}*/
+       /**@name Fields set by esd_create (only internal use) */
+       /*@{*/
+       /** number of components in the image */
+       int numcomps;
+       /** tile where this marker has been placed (-1 means MH) */
+       int tileno;
+       /** number of sensitivity values */
+       unsigned long int svalnum;
+       /** size of a single sensitivity pair (address+value) */
+       size_t sensval_size;
+       /*@}*/
+}      jpwl_esd_ms_t;
+
+/**
+RED (Residual Error Descriptor) Marker segment
+*/
+typedef struct jpwl_red_ms {
+       /** two bytes for the length of RED MS, exluding the marker itself (3 to 65535 bytes) */
+       unsigned short int Lred;
+       /** one byte, signals JPWL techniques adoption */
+       unsigned char Pred;     
+       /** RED data, variable length */
+       unsigned char *data;    
+}      jpwl_red_ms_t;
+
+/**
+Structure used to store JPWL markers temporary position and readyness
+*/
+typedef struct jpwl_marker {
+       /** marker value (J2K_MS_EPC, etc.) */
+       int id;
+       /** union keeping the pointer to the real marker struct */
+       union jpwl_marks {
+               /** pointer to EPB marker */
+               jpwl_epb_ms_t *epbmark;
+               /** pointer to EPC marker */
+               jpwl_epc_ms_t *epcmark;
+               /** pointer to ESD marker */
+               jpwl_esd_ms_t *esdmark;
+               /** pointer to RED marker */
+               jpwl_red_ms_t *redmark;
+       } m;
+       /** position where the marker should go, in the pre-JPWL codestream */ 
+       unsigned long int pos;
+       /** same as before, only written as a double, so we can sort it better */
+       double dpos;
+       /** length of the marker segment (marker excluded) */
+       unsigned short int len;
+       /** the marker length is ready or not? */
+       bool len_ready;
+       /** the marker position is ready or not? */
+       bool pos_ready;
+       /** the marker parameters are ready or not? */
+       bool parms_ready;
+       /** are the written data ready or not */
+       bool data_ready;
+}      jpwl_marker_t;
+
+/**
+Encode according to JPWL specs
+@param j2k J2K handle
+@param cio codestream handle
+@param image image handle
+*/
+void jpwl_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image);
+
+/**
+Prepare the list of JPWL markers, after the Part 1 codestream
+has been finalized (index struct is full)
+@param j2k J2K handle
+@param cio codestream handle
+@param image image handle
+*/
+void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image);
+
+/**
+Dump the list of JPWL markers, after it has been prepared
+@param j2k J2K handle
+@param cio codestream handle
+@param image image handle
+*/
+void jpwl_dump_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image);
+
+/**
+Read the EPC marker (Error Protection Capability)
+@param j2k J2K handle
+*/
+void j2k_read_epc(opj_j2k_t *j2k);
+
+/**
+Write the EPC marker (Error Protection Capability), BUT the DL field is always set to 0
+(this simplifies the management of EPBs and it is openly stated in the standard
+as a possible value, mening that the information is not available) and the informative techniques
+are not yet implemented
+@param j2k J2K handle
+*/
+void j2k_write_epc(opj_j2k_t *j2k);
+
+/**
+Read the EPB marker (Error Protection Block)
+@param j2k J2K handle
+*/
+void j2k_read_epb(opj_j2k_t *j2k);
+
+/**
+Write the EPB marker (Error Protection Block)
+@param j2k J2K handle
+*/
+void j2k_write_epb(opj_j2k_t *j2k);
+
+/**
+Read the ESD marker (Error Sensitivity Descriptor)
+@param j2k J2K handle
+*/
+void j2k_read_esd(opj_j2k_t *j2k);
+
+/**
+Read the RED marker (Residual Error Descriptor)
+@param j2k J2K handle
+*/
+void j2k_read_red(opj_j2k_t *j2k);
+
+/** create an EPB marker segment
+@param j2k J2K compressor handle
+@param latest it is the latest EPB in the header
+@param packed EPB is in packed style
+@param tileno tile number where the marker has been placed (-1 means MH)
+@param idx current EPB running index
+@param hprot applied protection type (-1/0,1,16,32,37-128)
+@param pre_len length of pre-protected data
+@param post_len length of post-protected data
+@return returns the freshly created EPB
+*/
+jpwl_epb_ms_t *jpwl_epb_create(opj_j2k_t *j2k, bool latest, bool packed, int tileno, int idx, int hprot,
+                                                          unsigned long int pre_len, unsigned long int post_len);
+
+/** add a number of EPB marker segments
+@param j2k J2K compressor handle
+@param jwmarker pointer to the JPWL markers list
+@param jwmarker_num pointer to the number of JPWL markers (gets updated)
+@param latest it is the latest group of EPBs in the header
+@param packed EPBs are in packed style
+@param insideMH it is in the MH
+@param idx pointer to the starting EPB running index (gets updated)
+@param hprot applied protection type (-1/0,1,16,32,37-128)
+@param place_pos place in original codestream where EPBs should go
+@param tileno tile number of these EPBs
+@param pre_len length of pre-protected data
+@param post_len length of post-protected data
+@return returns the length of all added markers
+*/
+int jpwl_epbs_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num,
+                                 bool latest, bool packed, bool insideMH, int *idx, int hprot,
+                                 double place_pos, int tileno,
+                                 unsigned long int pre_len, unsigned long int post_len);
+
+/** add a number of ESD marker segments
+@param j2k J2K compressor handle
+@param jwmarker pointer to the JPWL markers list
+@param jwmarker_num pointer to the number of JPWL markers (gets updated)
+@param comps considered component (-1=average, 0/1/2/...=component no.)
+@param addrm addressing mode (0=packet, 1=byte range, 2=packet range, 3=reserved)
+@param ad_size size of addresses (2/4 bytes)
+@param senst sensitivity type
+@param se_size sensitivity values size (1/2 bytes)
+@param place_pos place in original codestream where EPBs should go
+@param tileno tile number of these EPBs
+@return returns the length of all added markers
+*/
+int jpwl_esds_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num,
+                                 int comps, unsigned char addrm, unsigned char ad_size,
+                                 unsigned char senst, unsigned char se_size,
+                                 double place_pos, int tileno);
+       
+/** updates the information structure by modifying the positions and lengths
+@param j2k J2K compressor handle
+@param jwmarker pointer to JPWL markers list
+@param jwmarker_num number of JPWL markers
+@return returns true in case of success
+*/                       
+bool jpwl_update_info(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int jwmarker_num);
+
+
+bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esdmark, unsigned char *buf);
+
+bool jpwl_epb_fill(opj_j2k_t *j2k, jpwl_epb_ms_t *epbmark, unsigned char *buf, unsigned char *post_buf);
+
+void j2k_add_marker(opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len);
+
+/** corrects the data in the JPWL codestream
+@param j2k J2K compressor handle
+@return true if correction is performed correctly
+*/
+bool jpwl_correct(opj_j2k_t *j2k);
+
+/** corrects the data protected by an EPB
+@param j2k J2K compressor handle
+@param buffer pointer to the EPB position
+@param type type of EPB: 0=MH, 1=TPH, 2=other, 3=auto
+@param pre_len length of pre-data
+@param post_len length of post_data
+@param conn is a pointer to the length of all connected (packed) EPBs
+@param L4_bufp is a pointer to the buffer pointer of redundancy data
+@return returns true if correction could be succesfully performed
+*/
+bool jpwl_epb_correct(opj_j2k_t *j2k, unsigned char *buffer, int type, int pre_len, int post_len, int *conn,
+                                         unsigned char **L4_bufp);
+
+/** check that a tile and its children have valid data
+@param j2k J2K decompressor handle
+@param tcd Tile decompressor handle
+@param tileno number of the tile to check
+*/
+bool jpwl_check_tile(opj_j2k_t *j2k, opj_tcd_t *tcd, int tileno);
+
+/** Macro functions for CRC computation */
+
+/**
+Computes the CRC-16, as stated in JPWL specs
+@param CRC two bytes containing the CRC value (must be initialized with 0x0000)
+@param DATA byte for which the CRC is computed; call this on every byte of the sequence
+and get the CRC at the end
+*/
+#define jpwl_updateCRC16(CRC, DATA) updateCRC16(CRC, DATA)
+
+/**
+Computes the CRC-32, as stated in JPWL specs
+@param CRC four bytes containing the CRC value (must be initialized with 0x00000000)
+@param DATA byte for which the CRC is computed; call this on every byte of the sequence
+and get the CRC at the end
+*/
+#define jpwl_updateCRC32(CRC, DATA) updateCRC32(CRC, DATA)
+
+/**
+Computes the minimum between two integers
+@param a first integer to compare
+@param b second integer to compare
+@return returns the minimum integer between a and b
+*/
+#ifndef min
+#define min(a,b)    (((a) < (b)) ? (a) : (b))
+#endif /* min */
+
+/*@}*/
+
+#endif /* USE_JPWL */
+
+#ifdef USE_JPSEC
+
+/** @defgroup JPSEC JPSEC - JPEG-2000 Part 8 (JPSEC) codestream manager */
+/*@{*/
+
+/**
+Read the SEC marker (SEcured Codestream)
+@param j2k J2K handle
+*/
+void j2k_read_sec(opj_j2k_t *j2k);
+
+/**
+Write the SEC marker (SEcured Codestream)
+@param j2k J2K handle
+*/
+void j2k_write_sec(opj_j2k_t *j2k);
+
+/**
+Read the INSEC marker (SEcured Codestream)
+@param j2k J2K handle
+*/
+void j2k_read_insec(opj_j2k_t *j2k);
+
+/*@}*/
+
+#endif /* USE_JPSEC */
+
+#endif /* __JPWL_H */
+