diff --git a/third_party/BUILD.gn b/third_party/BUILD.gn
index 8aca5bb..cea96d0 100644
--- a/third_party/BUILD.gn
+++ b/third_party/BUILD.gn
@@ -386,11 +386,11 @@
     "libopenjpeg20/openjpeg.c",
     "libopenjpeg20/opj_clock.c",
     "libopenjpeg20/pi.c",
-    "libopenjpeg20/raw.c",
     "libopenjpeg20/t1.c",
     "libopenjpeg20/t2.c",
     "libopenjpeg20/tcd.c",
     "libopenjpeg20/tgt.c",
+    "libopenjpeg20/thread.c",
   ]
 }
 
diff --git a/third_party/libopenjpeg20/0000-use-colorspace.patch b/third_party/libopenjpeg20/0000-use-colorspace.patch
index b40692c..4d89eff 100644
--- a/third_party/libopenjpeg20/0000-use-colorspace.patch
+++ b/third_party/libopenjpeg20/0000-use-colorspace.patch
@@ -1,27 +1,28 @@
 diff --git a/third_party/libopenjpeg20/jp2.c b/third_party/libopenjpeg20/jp2.c
-index 8bf60f6..47f83a1 100644
+index f3ccb9974..882f1b649 100644
 --- a/third_party/libopenjpeg20/jp2.c
 +++ b/third_party/libopenjpeg20/jp2.c
-@@ -1508,7 +1508,7 @@ OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,
- 			/* Part 1, I.5.3.4: Either both or none : */
- 			if( !jp2->color.jp2_pclr->cmap)
- 				opj_jp2_free_pclr(&(jp2->color));
--			else
-+			else if (p_image->pdfium_use_colorspace)
- 				opj_jp2_apply_pclr(p_image, &(jp2->color));
- 		}
- 
+@@ -1624,7 +1624,7 @@ OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,
+             /* Part 1, I.5.3.4: Either both or none : */
+             if (!jp2->color.jp2_pclr->cmap) {
+                 opj_jp2_free_pclr(&(jp2->color));
+-            } else {
++            } else if (p_image->pdfium_use_colorspace) {
+                 if (!opj_jp2_apply_pclr(p_image, &(jp2->color), p_manager)) {
+                     return OPJ_FALSE;
+                 }
 diff --git a/third_party/libopenjpeg20/openjpeg.h b/third_party/libopenjpeg20/openjpeg.h
-index c07e9c8..e571672 100644
+index d571c516e..e8dbe4ff7 100644
 --- a/third_party/libopenjpeg20/openjpeg.h
 +++ b/third_party/libopenjpeg20/openjpeg.h
-@@ -677,6 +677,9 @@ typedef struct opj_image {
- 	OPJ_BYTE *icc_profile_buf;
- 	/** size of ICC profile */
- 	OPJ_UINT32 icc_profile_len;
+@@ -682,6 +682,10 @@ typedef struct opj_image {
+     OPJ_BYTE *icc_profile_buf;
+     /** size of ICC profile */
+     OPJ_UINT32 icc_profile_len;
 +
-+	/** Whether to apply PCLR or not */
-+	OPJ_BOOL pdfium_use_colorspace;
++
++    /** Whether to apply PCLR or not */
++    OPJ_BOOL pdfium_use_colorspace;
  } opj_image_t;
  
  
diff --git a/third_party/libopenjpeg20/0001-image-data.patch b/third_party/libopenjpeg20/0001-image-data.patch
deleted file mode 100644
index 5ae0149..0000000
--- a/third_party/libopenjpeg20/0001-image-data.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c
-index e612d06..d515798 100644
---- a/third_party/libopenjpeg20/j2k.c
-+++ b/third_party/libopenjpeg20/j2k.c
-@@ -8148,11 +8148,16 @@ static OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data,
- 
-                 /* Allocate output component buffer if necessary */
-                 if (!l_img_comp_dest->data) {
--
--                        l_img_comp_dest->data = (OPJ_INT32*) opj_calloc((OPJ_SIZE_T)l_img_comp_dest->w * (OPJ_SIZE_T)l_img_comp_dest->h, sizeof(OPJ_INT32));
--                        if (! l_img_comp_dest->data) {
--                                return OPJ_FALSE;
--                        }
-+                    OPJ_UINT32 width = l_img_comp_dest->w;
-+                    OPJ_UINT32 height = l_img_comp_dest->h;
-+                    const OPJ_UINT32 MAX_SIZE = UINT32_MAX / sizeof(OPJ_INT32);
-+                    if (height == 0 || width > MAX_SIZE / height) {
-+                        return OPJ_FALSE;
-+                    }
-+                    l_img_comp_dest->data = (OPJ_INT32*)opj_calloc(width * height, sizeof(OPJ_INT32));
-+                    if (!l_img_comp_dest->data) {
-+                        return OPJ_FALSE;
-+                    }
-                 }
- 
-                 /* Copy info from decoded comp image to output image */
diff --git a/third_party/libopenjpeg20/0002-packet-iterator.patch b/third_party/libopenjpeg20/0002-packet-iterator.patch
deleted file mode 100644
index ac755ed..0000000
--- a/third_party/libopenjpeg20/0002-packet-iterator.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-diff --git a/third_party/libopenjpeg20/pi.c b/third_party/libopenjpeg20/pi.c
-index 1697bcb..06f1e41 100644
---- a/third_party/libopenjpeg20/pi.c
-+++ b/third_party/libopenjpeg20/pi.c
-@@ -36,6 +36,7 @@
-  * POSSIBILITY OF SUCH DAMAGE.
-  */
- 
-+#include <limits.h>
- #include "opj_includes.h"
- 
- /** @defgroup PI PI - Implementation of a packet iterator */
-@@ -1236,7 +1237,13 @@ opj_pi_iterator_t *opj_pi_create_decode(opj_image_t *p_image,
- 	l_current_pi = l_pi;
- 
- 	/* memory allocation for include */
--	l_current_pi->include = (OPJ_INT16*) opj_calloc((l_tcp->numlayers +1) * l_step_l, sizeof(OPJ_INT16));
-+	l_current_pi->include = 00;
-+	if
-+		(l_step_l && l_tcp->numlayers < UINT_MAX / l_step_l - 1)
-+	{
-+		l_current_pi->include = (OPJ_INT16*)opj_calloc((l_tcp->numlayers + 1) * l_step_l, sizeof(OPJ_INT16));
-+	}
-+
- 	if
- 		(!l_current_pi->include)
- 	{
diff --git a/third_party/libopenjpeg20/0003-dwt-decode.patch b/third_party/libopenjpeg20/0003-dwt-decode.patch
index c500f0c..48e1b89 100644
--- a/third_party/libopenjpeg20/0003-dwt-decode.patch
+++ b/third_party/libopenjpeg20/0003-dwt-decode.patch
@@ -1,58 +1,60 @@
 diff --git a/third_party/libopenjpeg20/dwt.c b/third_party/libopenjpeg20/dwt.c
-index 4ad99ed..975a97e 100644
+index f3994ca7b..8bf23b6d6 100644
 --- a/third_party/libopenjpeg20/dwt.c
 +++ b/third_party/libopenjpeg20/dwt.c
-@@ -46,14 +46,12 @@
+@@ -63,9 +63,6 @@
  /** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
  /*@{*/
  
 -#define OPJ_WS(i) v->mem[(i)*2]
 -#define OPJ_WD(i) v->mem[(1+(i)*2)]
 -
- /** @name Local data structures */
- /*@{*/
+ #ifdef __AVX2__
+ /** Number of int32 values in a AVX2 register */
+ #define VREG_INT_COUNT       8
+@@ -82,6 +79,7 @@
  
  typedef struct dwt_local {
- 	OPJ_INT32* mem;
-+	OPJ_SIZE_T mem_count;
- 	OPJ_INT32 dn;
- 	OPJ_INT32 sn;
- 	OPJ_INT32 cas;
-@@ -107,16 +105,16 @@ static void opj_dwt_interleave_v(opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x);
+     OPJ_INT32* mem;
++    OPJ_SIZE_T mem_count;
+     OPJ_INT32 dn;
+     OPJ_INT32 sn;
+     OPJ_INT32 cas;
+@@ -129,13 +127,15 @@ static void opj_dwt_deinterleave_v(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn,
  /**
  Forward 5-3 wavelet transform in 1-D
  */
--static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
-+static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
- /**
- Inverse 5-3 wavelet transform in 1-D
- */
- static void opj_dwt_decode_1(opj_dwt_t *v);
--static void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
-+static void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+-static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn,
+-                             OPJ_INT32 cas);
++static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn,
++    OPJ_INT32 sn, OPJ_INT32 cas);
++
  /**
  Forward 9-7 wavelet transform in 1-D
  */
--static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
-+static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+-static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn,
+-                                  OPJ_INT32 cas);
++static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_SIZE_T a_count,
++    OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
++
  /**
- Explicit calculation of the Quantization Stepsizes 
+ Explicit calculation of the Quantization Stepsizes
  */
-@@ -124,10 +122,10 @@ static void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps, opj_st
- /**
+@@ -145,10 +145,10 @@ static void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps,
  Inverse wavelet transform in 2-D.
  */
--static OPJ_BOOL opj_dwt_decode_tile(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 i, DWT1DFN fn);
-+static OPJ_BOOL opj_dwt_decode_tile(const opj_tcd_tilecomp_t* tilec, OPJ_UINT32 i, DWT1DFN fn);
+ static OPJ_BOOL opj_dwt_decode_tile(opj_thread_pool_t* tp,
+-                                    opj_tcd_tilecomp_t* tilec, OPJ_UINT32 i);
++                                    const opj_tcd_tilecomp_t* tilec, OPJ_UINT32 i);
  
--static OPJ_BOOL opj_dwt_encode_procedure(	opj_tcd_tilecomp_t * tilec,
--										    void (*p_function)(OPJ_INT32 *, OPJ_INT32,OPJ_INT32,OPJ_INT32) );
+-static OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,
+-        void (*p_function)(OPJ_INT32 *, OPJ_INT32, OPJ_INT32, OPJ_INT32));
 +static OPJ_BOOL opj_dwt_encode_procedure(const opj_tcd_tilecomp_t * tilec,
-+										    void(*p_function)(OPJ_INT32 *, OPJ_SIZE_T, OPJ_INT32, OPJ_INT32, OPJ_INT32));
++        void(*p_function)(OPJ_INT32 *, OPJ_SIZE_T, OPJ_INT32, OPJ_INT32, OPJ_INT32));
  
- static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_UINT32 i);
- 
-@@ -156,13 +154,20 @@ static void opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_IN
+ static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* OPJ_RESTRICT r,
+         OPJ_UINT32 i);
+@@ -184,13 +184,20 @@ static void opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k,
  
  /*@}*/
  
@@ -60,9 +62,6 @@
 -#define OPJ_D(i) a[(1+(i)*2)]
 -#define OPJ_S_(i) ((i)<0?OPJ_S(0):((i)>=sn?OPJ_S(sn-1):OPJ_S(i)))
 -#define OPJ_D_(i) ((i)<0?OPJ_D(0):((i)>=dn?OPJ_D(dn-1):OPJ_D(i)))
--/* new */
--#define OPJ_SS_(i) ((i)<0?OPJ_S(0):((i)>=dn?OPJ_S(dn-1):OPJ_S(i)))
--#define OPJ_DD_(i) ((i)<0?OPJ_D(0):((i)>=sn?OPJ_D(sn-1):OPJ_D(i)))
 +#define IDX_S(i) (i)*2
 +#define IDX_D(i) 1 + (i)* 2
 +#define UNDERFLOW_SN(i) ((i) >= sn&&sn>0)
@@ -74,118 +73,143 @@
 +#define OPJ_D(i) a[IDX_D(i)]
 +#define OPJ_S_(i) ((i)<0 ? OPJ_S(0) : (UNDERFLOW_SN(i) ? OPJ_S(sn - 1) : OVERFLOW_S(i) ? OPJ_S(i - 1) : OPJ_S(i)))
 +#define OPJ_D_(i) ((i)<0 ? OPJ_D(0) : (UNDERFLOW_DN(i) ? OPJ_D(dn - 1) : OVERFLOW_D(i) ? OPJ_D(i - 1) : OPJ_D(i)))
-+/* new */
+ /* new */
+-#define OPJ_SS_(i) ((i)<0?OPJ_S(0):((i)>=dn?OPJ_S(dn-1):OPJ_S(i)))
+-#define OPJ_DD_(i) ((i)<0?OPJ_D(0):((i)>=sn?OPJ_D(sn-1):OPJ_D(i)))
 +#define OPJ_SS_(i) ((i)<0 ? OPJ_S(0) : (UNDERFLOW_DN(i) ? OPJ_S(dn - 1) : OVERFLOW_S(i) ? OPJ_S(i - 1) : OPJ_S(i)))
 +#define OPJ_DD_(i) ((i)<0 ? OPJ_D(0) : (UNDERFLOW_SN(i) ? OPJ_D(sn - 1) : OVERFLOW_D(i) ? OPJ_D(i - 1) : OPJ_D(i)))
  
  /* <summary>                                                              */
  /* This table contains the norms of the 5-3 wavelets for different bands. */
-@@ -283,7 +288,7 @@ static void opj_dwt_interleave_v(opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x) {
+@@ -319,8 +326,8 @@ static void opj_dwt_interleave_v(const opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x)
  /* <summary>                            */
  /* Forward 5-3 wavelet transform in 1-D. */
  /* </summary>                           */
--static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
-+static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
- 	OPJ_INT32 i;
- 	
- 	if (!cas) {
-@@ -304,7 +309,7 @@ static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32
+-static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn,
+-                             OPJ_INT32 cas)
++static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn,
++                             OPJ_INT32 sn, OPJ_INT32 cas)
+ {
+     OPJ_INT32 i;
+ 
+@@ -351,8 +358,8 @@ static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn,
  /* <summary>                            */
  /* Inverse 5-3 wavelet transform in 1-D. */
- /* </summary>                           */ 
--static void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
-+static void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
- 	OPJ_INT32 i;
- 	
- 	if (!cas) {
-@@ -326,13 +331,13 @@ static void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT3
- /* Inverse 5-3 wavelet transform in 1-D. */
- /* </summary>                           */ 
- static void opj_dwt_decode_1(opj_dwt_t *v) {
--	opj_dwt_decode_1_(v->mem, v->dn, v->sn, v->cas);
-+	opj_dwt_decode_1_(v->mem, v->mem_count, v->dn, v->sn, v->cas);
+ /* </summary>                           */
+-static void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn,
+-                              OPJ_INT32 cas)
++static void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn,
++                              OPJ_INT32 sn, OPJ_INT32 cas)
+ {
+     OPJ_INT32 i;
+ 
+@@ -381,7 +388,7 @@ static void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn,
+ 
+ static void opj_dwt_decode_1(const opj_dwt_t *v)
+ {
+-    opj_dwt_decode_1_(v->mem, v->dn, v->sn, v->cas);
++    opj_dwt_decode_1_(v->mem, v->mem_count, v->dn, v->sn, v->cas);
  }
  
+ #endif /* STANDARD_SLOW_VERSION */
+@@ -1010,8 +1017,8 @@ static void opj_idwt53_v(const opj_dwt_t *dwt,
  /* <summary>                             */
  /* Forward 9-7 wavelet transform in 1-D. */
  /* </summary>                            */
--static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
-+static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
- 	OPJ_INT32 i;
- 	if (!cas) {
- 		if ((dn > 0) || (sn > 1)) {	/* NEW :  CASE ONE ELEMENT */
-@@ -385,7 +390,7 @@ static void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps, opj_st
+-static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_INT32 dn, OPJ_INT32 sn,
+-                                  OPJ_INT32 cas)
++static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_SIZE_T a_count,
++                                  OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas)
+ {
+     OPJ_INT32 i;
+     if (!cas) {
+@@ -1079,8 +1086,8 @@ static void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps,
  /* <summary>                            */
  /* Forward 5-3 wavelet transform in 2-D. */
  /* </summary>                           */
--static INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,void (*p_function)(OPJ_INT32 *, OPJ_INT32,OPJ_INT32,OPJ_INT32) )
-+static INLINE OPJ_BOOL opj_dwt_encode_procedure(const opj_tcd_tilecomp_t * tilec, void(*p_function)(OPJ_INT32 *, OPJ_SIZE_T, OPJ_INT32, OPJ_INT32, OPJ_INT32))
+-static INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,
+-        void (*p_function)(OPJ_INT32 *, OPJ_INT32, OPJ_INT32, OPJ_INT32))
++static INLINE OPJ_BOOL opj_dwt_encode_procedure(const opj_tcd_tilecomp_t * tilec,
++        void(*p_function)(OPJ_INT32 *, OPJ_SIZE_T, OPJ_INT32, OPJ_INT32, OPJ_INT32))
  {
- 	OPJ_INT32 i, j, k;
- 	OPJ_INT32 *a = 00;
-@@ -395,7 +400,8 @@ static INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,void
+     OPJ_INT32 i, j, k;
+     OPJ_INT32 *a = 00;
+@@ -1090,6 +1097,7 @@ static INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,
  
- 	OPJ_INT32 rw;			/* width of the resolution level computed   */
- 	OPJ_INT32 rh;			/* height of the resolution level computed  */
--	OPJ_UINT32 l_data_size;
-+	OPJ_SIZE_T l_data_count;
-+	OPJ_SIZE_T l_data_size;
+     OPJ_INT32 rw;           /* width of the resolution level computed   */
+     OPJ_INT32 rh;           /* height of the resolution level computed  */
++    size_t l_data_count;
+     size_t l_data_size;
  
- 	opj_tcd_resolution_t * l_cur_res = 0;
- 	opj_tcd_resolution_t * l_last_res = 0;
-@@ -407,8 +413,9 @@ static INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,void
- 	l_cur_res = tilec->resolutions + l;
- 	l_last_res = l_cur_res - 1;
+     opj_tcd_resolution_t * l_cur_res = 0;
+@@ -1102,13 +1110,13 @@ static INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,
+     l_cur_res = tilec->resolutions + l;
+     l_last_res = l_cur_res - 1;
  
--	l_data_size = opj_dwt_max_resolution( tilec->resolutions,tilec->numresolutions) * (OPJ_UINT32)sizeof(OPJ_INT32);
--	bj = (OPJ_INT32*)opj_malloc((size_t)l_data_size);
-+	l_data_count = opj_dwt_max_resolution(tilec->resolutions, tilec->numresolutions) * (OPJ_UINT32)sizeof(OPJ_INT32);
-+	l_data_size = l_data_count * (OPJ_UINT32)sizeof(OPJ_INT32);
-+	bj = (OPJ_INT32*)opj_malloc(l_data_size);
- 	if (! bj) {
- 		return OPJ_FALSE;
- 	}
-@@ -437,7 +444,7 @@ static INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,void
- 				bj[k] = aj[k*w];
- 			}
+-    l_data_size = opj_dwt_max_resolution(tilec->resolutions, tilec->numresolutions);
++    l_data_count = opj_dwt_max_resolution(tilec->resolutions, tilec->numresolutions);
+     /* overflow check */
+-    if (l_data_size > (SIZE_MAX / sizeof(OPJ_INT32))) {
++    if (l_data_count > (SIZE_MAX / sizeof(OPJ_INT32))) {
+         /* FIXME event manager error callback */
+         return OPJ_FALSE;
+     }
+-    l_data_size *= sizeof(OPJ_INT32);
++    l_data_size = l_data_count * sizeof(OPJ_INT32);
+     bj = (OPJ_INT32*)opj_malloc(l_data_size);
+     /* l_data_size is equal to 0 when numresolutions == 1 but bj is not used */
+     /* in that case, so do not error out */
+@@ -1140,7 +1148,7 @@ static INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,
+                 bj[k] = aj[k * w];
+             }
  
--			(*p_function) (bj, dn, sn, cas_col);
-+			(*p_function) (bj, l_data_count, dn, sn, cas_col);
+-            (*p_function)(bj, dn, sn, cas_col);
++            (*p_function) (bj, l_data_count, dn, sn, cas_col);
  
- 			opj_dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
- 		}
-@@ -448,7 +455,7 @@ static INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,void
- 		for (j = 0; j < rh; j++) {
- 			aj = a + j * w;
- 			for (k = 0; k < rw; k++)  bj[k] = aj[k];
--			(*p_function) (bj, dn, sn, cas_row);
-+			(*p_function) (bj, l_data_count, dn, sn, cas_row);
- 			opj_dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
- 		}
+             opj_dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
+         }
+@@ -1153,7 +1161,7 @@ static INLINE OPJ_BOOL opj_dwt_encode_procedure(opj_tcd_tilecomp_t * tilec,
+             for (k = 0; k < rw; k++) {
+                 bj[k] = aj[k];
+             }
+-            (*p_function)(bj, dn, sn, cas_row);
++            (*p_function) (bj, l_data_count, dn, sn, cas_row);
+             opj_dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
+         }
  
-@@ -557,7 +564,7 @@ static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_U
- /* <summary>                            */
- /* Inverse wavelet transform in 2-D.     */
+@@ -1332,7 +1340,7 @@ static void opj_dwt_decode_v_func(void* user_data, opj_tls_t* tls)
+ /* Inverse wavelet transform in 2-D.    */
  /* </summary>                           */
--static OPJ_BOOL opj_dwt_decode_tile(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres, DWT1DFN dwt_1D) {
-+static OPJ_BOOL opj_dwt_decode_tile(const opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres, DWT1DFN dwt_1D) {
- 	opj_dwt_t h;
- 	opj_dwt_t v;
+ static OPJ_BOOL opj_dwt_decode_tile(opj_thread_pool_t* tp,
+-                                    opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres)
++        const opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres)
+ {
+     opj_dwt_t h;
+     opj_dwt_t v;
+@@ -1352,22 +1360,23 @@ static OPJ_BOOL opj_dwt_decode_tile(opj_thread_pool_t* tp,
+         return OPJ_TRUE;
+     }
+     num_threads = opj_thread_pool_get_thread_count(tp);
+-    h_mem_size = opj_dwt_max_resolution(tr, numres);
++    h.mem_count = opj_dwt_max_resolution(tr, numres);
+     /* overflow check */
+-    if (h_mem_size > (SIZE_MAX / PARALLEL_COLS_53 / sizeof(OPJ_INT32))) {
++    if (h.mem_count > (SIZE_MAX / PARALLEL_COLS_53 / sizeof(OPJ_INT32))) {
+         /* FIXME event manager error callback */
+         return OPJ_FALSE;
+     }
+     /* We need PARALLEL_COLS_53 times the height of the array, */
+     /* since for the vertical pass */
+     /* we process PARALLEL_COLS_53 columns at a time */
+-    h_mem_size *= PARALLEL_COLS_53 * sizeof(OPJ_INT32);
++    h_mem_size = h.mem_count * PARALLEL_COLS_53 * sizeof(OPJ_INT32);
+     h.mem = (OPJ_INT32*)opj_aligned_32_malloc(h_mem_size);
+     if (! h.mem) {
+         /* FIXME event manager error callback */
+         return OPJ_FALSE;
+     }
  
-@@ -568,13 +575,14 @@ static OPJ_BOOL opj_dwt_decode_tile(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres
++    v.mem_count = h.mem_count;
+     v.mem = h.mem;
  
- 	OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
- 
--	h.mem = (OPJ_INT32*)
--	opj_aligned_malloc(opj_dwt_max_resolution(tr, numres) * sizeof(OPJ_INT32));
-+	h.mem_count = opj_dwt_max_resolution(tr, numres);
-+	h.mem = (OPJ_INT32*)opj_aligned_malloc(h.mem_count * sizeof(OPJ_INT32));
- 	if (! h.mem){
- 		/* FIXME event manager error callback */
- 		return OPJ_FALSE;
- 	}
- 
-+	v.mem_count = h.mem_count;
- 	v.mem = h.mem;
- 
- 	while( --numres) {
+     while (--numres) {
diff --git a/third_party/libopenjpeg20/0004-j2k_read_mcc.patch b/third_party/libopenjpeg20/0004-j2k_read_mcc.patch
deleted file mode 100644
index 39c847d..0000000
--- a/third_party/libopenjpeg20/0004-j2k_read_mcc.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c
-index 849d0b4..b20f219 100644
---- a/third_party/libopenjpeg20/j2k.c
-+++ b/third_party/libopenjpeg20/j2k.c
-@@ -5341,6 +5341,7 @@ static OPJ_BOOL opj_j2k_read_mcc (     opj_j2k_t *p_j2k,
-         OPJ_UINT32 l_nb_collections;
-         OPJ_UINT32 l_nb_comps;
-         OPJ_UINT32 l_nb_bytes_by_comp;
-+        OPJ_BOOL new_mcc = OPJ_FALSE;
- 
-         /* preconditions */
-         assert(p_header_data != 00);
-@@ -5402,6 +5403,7 @@ static OPJ_BOOL opj_j2k_read_mcc (     opj_j2k_t *p_j2k,
-                         memset(l_mcc_record,0,(l_tcp->m_nb_max_mcc_records-l_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));
-                 }
-                 l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
-+                new_mcc = OPJ_TRUE;
-         }
-         l_mcc_record->m_index = l_indix;
- 
-@@ -5537,7 +5539,9 @@ static OPJ_BOOL opj_j2k_read_mcc (     opj_j2k_t *p_j2k,
-                 return OPJ_FALSE;
-         }
- 
--        ++l_tcp->m_nb_mcc_records;
-+        if (new_mcc) {
-+                ++l_tcp->m_nb_mcc_records;
-+        }
- 
-         return OPJ_TRUE;
- }
diff --git a/third_party/libopenjpeg20/0005-jp2_apply_pclr.patch b/third_party/libopenjpeg20/0005-jp2_apply_pclr.patch
index fd3ca63..c852bd0 100644
--- a/third_party/libopenjpeg20/0005-jp2_apply_pclr.patch
+++ b/third_party/libopenjpeg20/0005-jp2_apply_pclr.patch
@@ -1,49 +1,48 @@
 diff --git a/third_party/libopenjpeg20/jp2.c b/third_party/libopenjpeg20/jp2.c
-index 47f83a1..6e910a9 100644
+index 882f1b649..3ace09654 100644
 --- a/third_party/libopenjpeg20/jp2.c
 +++ b/third_party/libopenjpeg20/jp2.c
-@@ -902,7 +902,7 @@ static OPJ_BOOL opj_jp2_check_color(opj_image_t *image, opj_jp2_color_t *color,
- 				opj_event_msg(p_manager, EVT_ERROR, "Invalid component/palette index for direct mapping %d.\n", pcol);
- 				is_sane = OPJ_FALSE;
- 			}
--			else if (pcol_usage[pcol] && cmap[i].mtyp == 1) {
-+			else if (pcol_usage[pcol] && cmap[i].mtyp != 0) {
- 				opj_event_msg(p_manager, EVT_ERROR, "Component %d is mapped twice.\n", pcol);
- 				is_sane = OPJ_FALSE;
- 			}
-@@ -982,8 +982,8 @@ static void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color)
-       assert( pcol == 0 );
-       new_comps[i] = old_comps[cmp];
-     } else {
--      assert( i == pcol );
--      new_comps[pcol] = old_comps[cmp];
-+      assert( i == pcol ); // probably wrong?
-+      new_comps[i] = old_comps[cmp];
-     }
+@@ -969,7 +969,7 @@ static OPJ_BOOL opj_jp2_check_color(opj_image_t *image, opj_jp2_color_t *color,
+                 opj_event_msg(p_manager, EVT_ERROR,
+                               "Invalid component/palette index for direct mapping %d.\n", pcol);
+                 is_sane = OPJ_FALSE;
+-            } else if (pcol_usage[pcol] && cmap[i].mtyp == 1) {
++            } else if (pcol_usage[pcol] && cmap[i].mtyp != 0) {
+                 opj_event_msg(p_manager, EVT_ERROR, "Component %d is mapped twice.\n", pcol);
+                 is_sane = OPJ_FALSE;
+             } else if (cmap[i].mtyp == 0 && cmap[i].pcol != 0) {
+@@ -1064,8 +1064,8 @@ static OPJ_BOOL opj_jp2_apply_pclr(opj_image_t *image,
+             assert(pcol == 0);
+             new_comps[i] = old_comps[cmp];
+         } else {
+-            assert(i == pcol);
+-            new_comps[pcol] = old_comps[cmp];
++            assert( i == pcol ); // probably wrong?
++            new_comps[i] = old_comps[cmp];
+         }
  
- 		/* Palette mapping: */
-@@ -1007,11 +1007,11 @@ static void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color)
- 		cmp = cmap[i].cmp; pcol = cmap[i].pcol;
- 		src = old_comps[cmp].data;
-     assert( src );
--		max = new_comps[pcol].w * new_comps[pcol].h;
-+		max = new_comps[i].w * new_comps[i].h;
+         /* Palette mapping: */
+@@ -1093,19 +1093,19 @@ static OPJ_BOOL opj_jp2_apply_pclr(opj_image_t *image,
+         pcol = cmap[i].pcol;
+         src = old_comps[cmp].data;
+         assert(src); /* verified above */
+-        max = new_comps[pcol].w * new_comps[pcol].h;
++        max = new_comps[i].w * new_comps[i].h;
  
- 		/* Direct use: */
-     if(cmap[i].mtyp == 0) {
--      assert( cmp == 0 );
-+      assert( cmp == 0 ); // probably wrong.
-       dst = new_comps[i].data;
-       assert( dst );
-       for(j = 0; j < max; ++j) {
-@@ -1019,8 +1019,8 @@ static void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color)
-       }
-     }
-     else {
--      assert( i == pcol );
--      dst = new_comps[pcol].data;
-+      assert( i == pcol ); // probably wrong?
-+      dst = new_comps[i].data;
-       assert( dst );
-       for(j = 0; j < max; ++j) {
-         /* The index */
+         /* Direct use: */
+         if (cmap[i].mtyp == 0) {
+-            assert(cmp == 0);
++            assert( cmp == 0 ); // probably wrong.
+             dst = new_comps[i].data;
+             assert(dst);
+             for (j = 0; j < max; ++j) {
+                 dst[j] = src[j];
+             }
+         } else {
+-            assert(i == pcol);
+-            dst = new_comps[pcol].data;
++            assert( i == pcol ); // probably wrong?
++            dst = new_comps[i].data;
+             assert(dst);
+             for (j = 0; j < max; ++j) {
+                 /* The index */
diff --git a/third_party/libopenjpeg20/0006-tcd_init_tile.patch b/third_party/libopenjpeg20/0006-tcd_init_tile.patch
index 6c00f40..967e2e4 100644
--- a/third_party/libopenjpeg20/0006-tcd_init_tile.patch
+++ b/third_party/libopenjpeg20/0006-tcd_init_tile.patch
@@ -1,16 +1,16 @@
 diff --git a/third_party/libopenjpeg20/tcd.c b/third_party/libopenjpeg20/tcd.c
-index 2fccff1..aebe9be 100644
+index dd9faced5..f0710cd14 100644
 --- a/third_party/libopenjpeg20/tcd.c
 +++ b/third_party/libopenjpeg20/tcd.c
-@@ -727,7 +727,10 @@ static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
- 		l_tilec->x1 = opj_int_ceildiv(l_tile->x1, (OPJ_INT32)l_image_comp->dx);
- 		l_tilec->y1 = opj_int_ceildiv(l_tile->y1, (OPJ_INT32)l_image_comp->dy);
- 		/*fprintf(stderr, "\tTile compo border = %d,%d,%d,%d\n", l_tilec->x0, l_tilec->y0,l_tilec->x1,l_tilec->y1);*/
--		
-+		if (l_tilec->x0 >= l_tilec->x1 || l_tilec->y0 >= l_tilec->y1) {
-+			opj_event_msg(manager, EVT_ERROR, "Invalid tile data\n");
-+			return OPJ_FALSE;
-+		}
- 		/* compute l_data_size with overflow check */
- 		l_data_size = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
- 		if ((((OPJ_UINT32)-1) / l_data_size) < (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0)) {
+@@ -788,7 +788,10 @@ static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
+         l_tilec->x1 = opj_int_ceildiv(l_tile->x1, (OPJ_INT32)l_image_comp->dx);
+         l_tilec->y1 = opj_int_ceildiv(l_tile->y1, (OPJ_INT32)l_image_comp->dy);
+         /*fprintf(stderr, "\tTile compo border = %d,%d,%d,%d\n", l_tilec->x0, l_tilec->y0,l_tilec->x1,l_tilec->y1);*/
+-
++        if (l_tilec->x0 >= l_tilec->x1 || l_tilec->y0 >= l_tilec->y1) {
++            opj_event_msg(manager, EVT_ERROR, "Invalid tile data\n");
++            return OPJ_FALSE;
++        }
+         /* compute l_data_size with overflow check */
+         l_data_size = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
+         /* issue 733, l_data_size == 0U, probably something wrong should be checked before getting here */
diff --git a/third_party/libopenjpeg20/0007-jp2_read_cmap.patch b/third_party/libopenjpeg20/0007-jp2_read_cmap.patch
index 30f9e4b..4cc4340 100644
--- a/third_party/libopenjpeg20/0007-jp2_read_cmap.patch
+++ b/third_party/libopenjpeg20/0007-jp2_read_cmap.patch
@@ -1,13 +1,13 @@
 diff --git a/third_party/libopenjpeg20/jp2.c b/third_party/libopenjpeg20/jp2.c
-index 6e910a9..f3baca5 100644
+index 3ace09654..7ef7c9139 100644
 --- a/third_party/libopenjpeg20/jp2.c
 +++ b/third_party/libopenjpeg20/jp2.c
-@@ -1194,7 +1194,7 @@ static OPJ_BOOL opj_jp2_read_cmap(	opj_jp2_t * jp2,
+@@ -1296,7 +1296,7 @@ static OPJ_BOOL opj_jp2_read_cmap(opj_jp2_t * jp2,
  
  
- 	for(i = 0; i < nr_channels; ++i) {
--		opj_read_bytes(p_cmap_header_data, &l_value, 2);			/* CMP^i */
-+		opj_read_bytes_BE(p_cmap_header_data, &l_value, 2);			/* CMP^i */
- 		p_cmap_header_data +=2;
- 		cmap[i].cmp = (OPJ_UINT16) l_value;
+     for (i = 0; i < nr_channels; ++i) {
+-        opj_read_bytes(p_cmap_header_data, &l_value, 2);            /* CMP^i */
++        opj_read_bytes_BE(p_cmap_header_data, &l_value, 2);     /* CMP^i */
+         p_cmap_header_data += 2;
+         cmap[i].cmp = (OPJ_UINT16) l_value;
  
diff --git a/third_party/libopenjpeg20/0008-jp2_check_color.patch b/third_party/libopenjpeg20/0008-jp2_check_color.patch
deleted file mode 100644
index 3810c86..0000000
--- a/third_party/libopenjpeg20/0008-jp2_check_color.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-diff --git a/third_party/libopenjpeg20/jp2.c b/third_party/libopenjpeg20/jp2.c
-index f3baca5..3bcb42e 100644
---- a/third_party/libopenjpeg20/jp2.c
-+++ b/third_party/libopenjpeg20/jp2.c
-@@ -896,8 +896,12 @@ static OPJ_BOOL opj_jp2_check_color(opj_image_t *image, opj_jp2_color_t *color,
- 		}
- 		/* verify that no component is targeted more than once */
- 		for (i = 0; i < nr_channels; i++) {
--      OPJ_UINT16 pcol = cmap[i].pcol;
--      assert(cmap[i].mtyp == 0 || cmap[i].mtyp == 1);
-+			if (cmap[i].mtyp != 0 && cmap[i].mtyp != 1) {
-+				opj_event_msg(p_manager, EVT_ERROR, "Unexpected MTYP value.\n");
-+				opj_free(pcol_usage);
-+				return OPJ_FALSE;
-+			}
-+			OPJ_UINT16 pcol = cmap[i].pcol;
- 			if (pcol >= nr_channels) {
- 				opj_event_msg(p_manager, EVT_ERROR, "Invalid component/palette index for direct mapping %d.\n", pcol);
- 				is_sane = OPJ_FALSE;
diff --git a/third_party/libopenjpeg20/0009-opj_pi_next.patch b/third_party/libopenjpeg20/0009-opj_pi_next.patch
index a7701f0..99f17d3 100644
--- a/third_party/libopenjpeg20/0009-opj_pi_next.patch
+++ b/third_party/libopenjpeg20/0009-opj_pi_next.patch
@@ -1,34 +1,34 @@
 diff --git a/third_party/libopenjpeg20/pi.c b/third_party/libopenjpeg20/pi.c
-index 06f1e41..462e07c 100644
+index 91642ee4e..256fe37a1 100644
 --- a/third_party/libopenjpeg20/pi.c
 +++ b/third_party/libopenjpeg20/pi.c
-@@ -377,6 +377,9 @@ if (!pi->tp_on){
- 					prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
- 						 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
- 					pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
-+					if (pi->precno >= res->pw * res->ph) {
-+						return OPJ_FALSE;
-+					}
- 					for (pi->layno = pi->poc.layno0; 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]) {
-@@ -458,6 +461,9 @@ static OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi) {
- 					prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
- 						 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
- 					pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
-+					if (pi->precno >= res->pw * res->ph) {
-+						return OPJ_FALSE;
-+					}
- 					for (pi->layno = pi->poc.layno0; 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]) {
-@@ -537,6 +543,9 @@ static OPJ_BOOL opj_pi_next_cprl(opj_pi_iterator_t * pi) {
- 					prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
- 						 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
- 					pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
-+					if (pi->precno >= res->pw * res->ph) {
-+						return OPJ_FALSE;
-+					}
- 					for (pi->layno = pi->poc.layno0; 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]) {
+@@ -445,6 +445,9 @@ static OPJ_BOOL opj_pi_next_rpcl(opj_pi_iterator_t * pi)
+                                                 (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
+                            - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
+                     pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
++                    if (pi->precno >= res->pw * res->ph) {
++                      return OPJ_FALSE;
++                    }
+                     for (pi->layno = pi->poc.layno0; 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;
+@@ -576,6 +579,9 @@ static OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi)
+                                                 (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
+                            - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
+                     pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
++                    if (pi->precno >= res->pw * res->ph) {
++                      return OPJ_FALSE;
++                    }
+                     for (pi->layno = pi->poc.layno0; 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;
+@@ -704,6 +710,9 @@ static OPJ_BOOL opj_pi_next_cprl(opj_pi_iterator_t * pi)
+                                                 (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
+                            - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
+                     pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
++                    if (pi->precno >= res->pw * res->ph) {
++                      return OPJ_FALSE;
++                    }
+                     for (pi->layno = pi->poc.layno0; 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;
diff --git a/third_party/libopenjpeg20/0010-pi_update_decode_poc.patch b/third_party/libopenjpeg20/0010-pi_update_decode_poc.patch
deleted file mode 100644
index d596b76..0000000
--- a/third_party/libopenjpeg20/0010-pi_update_decode_poc.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/third_party/libopenjpeg20/pi.c b/third_party/libopenjpeg20/pi.c
-index 462e07c..9097e31 100644
---- a/third_party/libopenjpeg20/pi.c
-+++ b/third_party/libopenjpeg20/pi.c
-@@ -1028,7 +1028,7 @@ static void opj_pi_update_decode_poc (opj_pi_iterator_t * p_pi,
- 		l_current_pi->poc.precno0 = 0;
- 		l_current_pi->poc.resno1 = l_current_poc->resno1; /* Resolution Level Index #0 (End) */
- 		l_current_pi->poc.compno1 = l_current_poc->compno1; /* Component Index #0 (End) */
--		l_current_pi->poc.layno1 = l_current_poc->layno1; /* Layer Index #0 (End) */
-+		l_current_pi->poc.layno1 = opj_uint_min(l_current_poc->layno1, p_tcp->numlayers); /* Layer Index #0 (End) */
- 		l_current_pi->poc.precno1 = p_max_precision;
- 		++l_current_pi;
- 		++l_current_poc;
diff --git a/third_party/libopenjpeg20/0011-j2k_update_image_data.patch b/third_party/libopenjpeg20/0011-j2k_update_image_data.patch
index 697c48f..7990fc7 100644
--- a/third_party/libopenjpeg20/0011-j2k_update_image_data.patch
+++ b/third_party/libopenjpeg20/0011-j2k_update_image_data.patch
@@ -1,17 +1,17 @@
 diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c
-index b20f219..9056feb 100644
+index 44de79a75..8e35b33ee 100644
 --- a/third_party/libopenjpeg20/j2k.c
 +++ b/third_party/libopenjpeg20/j2k.c
-@@ -8211,6 +8211,12 @@ static OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data,
-                  * */
-                 assert( l_res->x0 >= 0);
-                 assert( l_res->x1 >= 0);
+@@ -8914,6 +8914,12 @@ static OPJ_BOOL opj_j2k_update_image_data(opj_tcd_t * p_tcd, OPJ_BYTE * p_data,
+          * */
+         assert(l_res->x0 >= 0);
+         assert(l_res->x1 >= 0);
 +
-+                /* Prevent bad casting to unsigned values in the subsequent lines. */
-+                if ( l_res->x0 < 0 || l_res->x1 < 0 || l_res->y0 < 0 || l_res->y1 < 0 ) {
-+                        return OPJ_FALSE;
-+                }
++        /* Prevent bad casting to unsigned values in the subsequent lines. */
++        if ( l_res->x0 < 0 || l_res->x1 < 0 || l_res->y0 < 0 || l_res->y1 < 0 ) {
++            return OPJ_FALSE;
++        }
 +
-                 if ( l_x0_dest < (OPJ_UINT32)l_res->x0 ) {
-                         l_start_x_dest = (OPJ_UINT32)l_res->x0 - l_x0_dest;
-                         l_offset_x0_src = 0;
+         if (l_x0_dest < (OPJ_UINT32)l_res->x0) {
+             l_start_x_dest = (OPJ_UINT32)l_res->x0 - l_x0_dest;
+             l_offset_x0_src = 0;
diff --git a/third_party/libopenjpeg20/0012-mct_sse.patch b/third_party/libopenjpeg20/0012-mct_sse.patch
index bf08276..168b912 100644
--- a/third_party/libopenjpeg20/0012-mct_sse.patch
+++ b/third_party/libopenjpeg20/0012-mct_sse.patch
@@ -1,5 +1,5 @@
 diff --git a/third_party/libopenjpeg20/mct.c b/third_party/libopenjpeg20/mct.c
-index 8b0276f..7731c15 100644
+index 8c82ee20a..20b9e121b 100644
 --- a/third_party/libopenjpeg20/mct.c
 +++ b/third_party/libopenjpeg20/mct.c
 @@ -37,13 +37,16 @@
@@ -22,39 +22,39 @@
  #include <smmintrin.h>
  #endif
  
-@@ -72,7 +75,7 @@ const OPJ_FLOAT64 * opj_mct_get_mct_norms_real ()
+@@ -72,7 +75,7 @@ const OPJ_FLOAT64 * opj_mct_get_mct_norms_real()
  /* <summary> */
  /* Forward reversible MCT. */
  /* </summary> */
 -#ifdef __SSE2__
 +#ifdef USE_SSE2
  void opj_mct_encode(
- 		OPJ_INT32* restrict c0,
- 		OPJ_INT32* restrict c1,
-@@ -137,7 +140,7 @@ void opj_mct_encode(
+     OPJ_INT32* OPJ_RESTRICT c0,
+     OPJ_INT32* OPJ_RESTRICT c1,
+@@ -141,7 +144,7 @@ void opj_mct_encode(
  /* <summary> */
  /* Inverse reversible MCT. */
  /* </summary> */
 -#ifdef __SSE2__
 +#ifdef USE_SSE2
  void opj_mct_decode(
- 		OPJ_INT32* restrict c0,
- 		OPJ_INT32* restrict c1,
-@@ -204,7 +207,7 @@ OPJ_FLOAT64 opj_mct_getnorm(OPJ_UINT32 compno) {
+     OPJ_INT32* OPJ_RESTRICT c0,
+     OPJ_INT32* OPJ_RESTRICT c1,
+@@ -209,7 +212,7 @@ OPJ_FLOAT64 opj_mct_getnorm(OPJ_UINT32 compno)
  /* <summary> */
  /* Forward irreversible MCT. */
  /* </summary> */
 -#ifdef __SSE4_1__
 +#ifdef USE_SSE4
  void opj_mct_encode_real(
- 												 OPJ_INT32* restrict c0,
- 												 OPJ_INT32* restrict c1,
-@@ -377,7 +380,7 @@ void opj_mct_decode_real(
- 		OPJ_UINT32 n)
+     OPJ_INT32* OPJ_RESTRICT c0,
+     OPJ_INT32* OPJ_RESTRICT c1,
+@@ -389,7 +392,7 @@ void opj_mct_decode_real(
+     OPJ_UINT32 n)
  {
- 	OPJ_UINT32 i;
+     OPJ_UINT32 i;
 -#ifdef __SSE__
 +#ifdef USE_SSE
- 	__m128 vrv, vgu, vgv, vbu;
- 	vrv = _mm_set1_ps(1.402f);
- 	vgu = _mm_set1_ps(0.34413f);
+     __m128 vrv, vgu, vgv, vbu;
+     vrv = _mm_set1_ps(1.402f);
+     vgu = _mm_set1_ps(0.34413f);
diff --git a/third_party/libopenjpeg20/0013-attrib_fix.patch b/third_party/libopenjpeg20/0013-attrib_fix.patch
deleted file mode 100644
index 4c13304..0000000
--- a/third_party/libopenjpeg20/0013-attrib_fix.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-diff --git a/third_party/libopenjpeg20/opj_includes.h b/third_party/libopenjpeg20/opj_includes.h
-index f855b7c..5add091 100644
---- a/third_party/libopenjpeg20/opj_includes.h
-+++ b/third_party/libopenjpeg20/opj_includes.h
-@@ -102,12 +102,6 @@
-  ==========================================================
- */
-
--/* Ignore GCC attributes if this is not GCC */
--#ifndef __GNUC__
--       #define __attribute__(x) /* __attribute__(x) */
--#endif
--
--
- /* Are restricted pointers available? (C99) */
- #if (__STDC_VERSION__ != 199901L)
-        /* Not a C99 compiler */
-
diff --git a/third_party/libopenjpeg20/0014-opj_jp2_read_ihdr_leak.patch b/third_party/libopenjpeg20/0014-opj_jp2_read_ihdr_leak.patch
index f564533..0ae0cfc 100644
--- a/third_party/libopenjpeg20/0014-opj_jp2_read_ihdr_leak.patch
+++ b/third_party/libopenjpeg20/0014-opj_jp2_read_ihdr_leak.patch
@@ -1,28 +1,20 @@
 diff --git a/third_party/libopenjpeg20/jp2.c b/third_party/libopenjpeg20/jp2.c
-index 3bcb42e..a6648f6 100644
+index 7ef7c9139..1fa607d66 100644
 --- a/third_party/libopenjpeg20/jp2.c
 +++ b/third_party/libopenjpeg20/jp2.c
-@@ -561,6 +561,7 @@ static OPJ_BOOL opj_jp2_read_ihdr( opj_jp2_t *jp2,
- 	p_image_header_data += 2;
+@@ -593,6 +593,7 @@ static OPJ_BOOL opj_jp2_read_ihdr(opj_jp2_t *jp2,
+     }
  
- 	/* allocate memory for components */
-+	opj_free(jp2->comps);
- 	jp2->comps = (opj_jp2_comps_t*) opj_calloc(jp2->numcomps, sizeof(opj_jp2_comps_t));
- 	if (jp2->comps == 0) {
- 		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle image header (ihdr)\n");
-@@ -1758,6 +1759,7 @@ void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters)
+     /* allocate memory for components */
++    opj_free(jp2->comps);
+     jp2->comps = (opj_jp2_comps_t*) opj_calloc(jp2->numcomps,
+                  sizeof(opj_jp2_comps_t));
+     if (jp2->comps == 0) {
+@@ -1882,6 +1883,7 @@ void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters)
  
- 	/* further JP2 initializations go here */
- 	jp2->color.jp2_has_colr = 0;
-+	jp2->comps = NULL;
-     jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
+     /* further JP2 initializations go here */
+     jp2->color.jp2_has_colr = 0;
++    jp2->comps = NULL;
+     jp2->ignore_pclr_cmap_cdef = parameters->flags &
+                                  OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
  }
- 
-@@ -1815,7 +1817,6 @@ OPJ_BOOL opj_jp2_setup_encoder(	opj_jp2_t *jp2,
- 	jp2->numcomps = image->numcomps;	/* NC */
- 	jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
- 	if (!jp2->comps) {
--		jp2->comps = NULL;
- 		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
- 		/* Memory of jp2->cl will be freed by opj_jp2_destroy */
- 		return OPJ_FALSE;
diff --git a/third_party/libopenjpeg20/0015-read_SPCod_SPCoc_overflow.patch b/third_party/libopenjpeg20/0015-read_SPCod_SPCoc_overflow.patch
index 56f0cf0..760ed74 100644
--- a/third_party/libopenjpeg20/0015-read_SPCod_SPCoc_overflow.patch
+++ b/third_party/libopenjpeg20/0015-read_SPCod_SPCoc_overflow.patch
@@ -1,15 +1,15 @@
 diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c
-index 9056feb..c7aa8db 100644
+index 8e35b33ee..d95963a5c 100644
 --- a/third_party/libopenjpeg20/j2k.c
 +++ b/third_party/libopenjpeg20/j2k.c
-@@ -8744,7 +8744,9 @@ static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(  opj_j2k_t *p_j2k,
-                                 p_j2k->m_specific_param.m_decoder.m_default_tcp;
+@@ -9527,6 +9527,10 @@ static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(opj_j2k_t *p_j2k,
+             p_j2k->m_specific_param.m_decoder.m_default_tcp;
  
-         /* precondition again */
--        assert(compno < p_j2k->m_private_image->numcomps);
-+        if (compno >= p_j2k->m_private_image->numcomps) {
-+                return OPJ_FALSE;
-+        }
+     /* precondition again */
++    if (compno >= p_j2k->m_private_image->numcomps) {
++        return OPJ_FALSE;
++    }
++
+     assert(compno < p_j2k->m_private_image->numcomps);
  
-         l_tccp = &l_tcp->tccps[compno];
-         l_current_ptr = p_header_data;
+     l_tccp = &l_tcp->tccps[compno];
diff --git a/third_party/libopenjpeg20/0016-read_SQcd_SQcc_overflow.patch b/third_party/libopenjpeg20/0016-read_SQcd_SQcc_overflow.patch
index 7b8bfca..d7e06ea 100644
--- a/third_party/libopenjpeg20/0016-read_SQcd_SQcc_overflow.patch
+++ b/third_party/libopenjpeg20/0016-read_SQcd_SQcc_overflow.patch
@@ -1,15 +1,15 @@
 diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c
-index c7aa8db..b5f6fe9 100644
+index d95963a5c..ed449684f 100644
 --- a/third_party/libopenjpeg20/j2k.c
 +++ b/third_party/libopenjpeg20/j2k.c
-@@ -9010,7 +9010,9 @@ static OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
-                                 p_j2k->m_specific_param.m_decoder.m_default_tcp;
+@@ -9864,7 +9864,9 @@ static OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
+             p_j2k->m_specific_param.m_decoder.m_default_tcp;
  
-         /* precondition again*/
--        assert(p_comp_no <  p_j2k->m_private_image->numcomps);
-+        if (p_comp_no >=  p_j2k->m_private_image->numcomps) {
-+            return OPJ_FALSE;
-+        }
+     /* precondition again*/
+-    assert(p_comp_no <  p_j2k->m_private_image->numcomps);
++    if (p_comp_no >=  p_j2k->m_private_image->numcomps) {
++        return OPJ_FALSE;
++    }
  
-         l_tccp = &l_tcp->tccps[p_comp_no];
-         l_current_ptr = p_header_data;
+     l_tccp = &l_tcp->tccps[p_comp_no];
+     l_current_ptr = p_header_data;
diff --git a/third_party/libopenjpeg20/0017-tcd_init_tile.patch b/third_party/libopenjpeg20/0017-tcd_init_tile.patch
deleted file mode 100644
index a04ac9f..0000000
--- a/third_party/libopenjpeg20/0017-tcd_init_tile.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-diff --git a/third_party/libopenjpeg20/0017-tcd_init_tile.patch b/third_party/libopenjpeg20/0017-tcd_init_tile.patch
-new file mode 100644
-index 0000000..e69de29
-diff --git a/third_party/libopenjpeg20/README.pdfium b/third_party/libopenjpeg20/README.pdfium
-index 4852a42..97e6e8c 100644
---- a/third_party/libopenjpeg20/README.pdfium
-+++ b/third_party/libopenjpeg20/README.pdfium
-@@ -26,4 +26,5 @@ Local Modifications:
- 0014-opj_jp2_read_ihdr_leak.patch: Memory leak in opj_jp2_read_ihdr().
- 0015-read_SPCod_SPCoc_overflow.patch: Prevent a buffer overflow in opj_j2k_read_SPCod_SPCoc.
- 0016-read_SQcd_SQcc_overflow.patch: Prevent a buffer overflow in opj_j2k_read_SQcd_SQcc.
-+0017-tcd_init_tile.patch: Prevent integer overflows during calculation of |l_nb_precinct_size|.
- TODO(thestig): List all the other patches.
-diff --git a/third_party/libopenjpeg20/tcd.c b/third_party/libopenjpeg20/tcd.c
-index aebe9be..673633c 100644
---- a/third_party/libopenjpeg20/tcd.c
-+++ b/third_party/libopenjpeg20/tcd.c
-@@ -822,7 +822,14 @@ static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
- 			l_res->ph = (l_res->y0 == l_res->y1) ? 0 : (OPJ_UINT32)((l_br_prc_y_end - l_tl_prc_y_start) >> l_pdy);
- 			/*fprintf(stderr, "\t\t\tres_pw=%d, res_ph=%d\n", l_res->pw, l_res->ph );*/
- 			
-+			if (l_res->pw && ((OPJ_UINT32)-1) / l_res->pw < l_res->ph) {
-+				return OPJ_FALSE;
-+			}
- 			l_nb_precincts = l_res->pw * l_res->ph;
-+
-+			if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(opj_tcd_precinct_t) < l_nb_precincts) {
-+				return OPJ_FALSE;
-+			}
- 			l_nb_precinct_size = l_nb_precincts * (OPJ_UINT32)sizeof(opj_tcd_precinct_t);
- 			if (resno == 0) {
- 				tlcbgxstart = l_tl_prc_x_start;
diff --git a/third_party/libopenjpeg20/0018-tcd_get_decoded_tile_size.patch b/third_party/libopenjpeg20/0018-tcd_get_decoded_tile_size.patch
deleted file mode 100644
index b1af687..0000000
--- a/third_party/libopenjpeg20/0018-tcd_get_decoded_tile_size.patch
+++ /dev/null
@@ -1,69 +0,0 @@
-diff --git a/third_party/libopenjpeg20/0018-tcd_get_decoded_tile_size.patch b/third_party/libopenjpeg20/0018-tcd_get_decoded_tile_size.patch
-new file mode 100644
-index 0000000..e69de29
-diff --git a/third_party/libopenjpeg20/README.pdfium b/third_party/libopenjpeg20/README.pdfium
-index 97e6e8c..a9e289d 100644
---- a/third_party/libopenjpeg20/README.pdfium
-+++ b/third_party/libopenjpeg20/README.pdfium
-@@ -27,4 +27,5 @@ Local Modifications:
- 0015-read_SPCod_SPCoc_overflow.patch: Prevent a buffer overflow in opj_j2k_read_SPCod_SPCoc.
- 0016-read_SQcd_SQcc_overflow.patch: Prevent a buffer overflow in opj_j2k_read_SQcd_SQcc.
- 0017-tcd_init_tile.patch: Prevent integer overflows during calculation of |l_nb_precinct_size|.
-+0018-tcd_get_decoded_tile_size.patch: Fix an integer overflow in opj_tcd_get_decoded_tile_size.
- TODO(thestig): List all the other patches.
-diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c
-index b5f6fe9..6346c21 100644
---- a/third_party/libopenjpeg20/j2k.c
-+++ b/third_party/libopenjpeg20/j2k.c
-@@ -8028,6 +8028,10 @@ OPJ_BOOL opj_j2k_read_tile_header(      opj_j2k_t * p_j2k,
-         *p_tile_index = p_j2k->m_current_tile_number;
-         *p_go_on = OPJ_TRUE;
-         *p_data_size = opj_tcd_get_decoded_tile_size(p_j2k->m_tcd);
-+        if (*p_data_size == (OPJ_UINT32)-1) {
-+                return OPJ_FALSE;
-+        }
-+
-         *p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0;
-         *p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0;
-         *p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
-diff --git a/third_party/libopenjpeg20/tcd.c b/third_party/libopenjpeg20/tcd.c
-index 673633c..cd1c439 100644
---- a/third_party/libopenjpeg20/tcd.c
-+++ b/third_party/libopenjpeg20/tcd.c
-@@ -1150,6 +1150,7 @@ OPJ_UINT32 opj_tcd_get_decoded_tile_size ( opj_tcd_t *p_tcd )
-         opj_tcd_tilecomp_t * l_tile_comp = 00;
-         opj_tcd_resolution_t * l_res = 00;
-         OPJ_UINT32 l_size_comp, l_remaining;
-+        OPJ_UINT32 l_temp;
- 
-         l_tile_comp = p_tcd->tcd_image->tiles->comps;
-         l_img_comp = p_tcd->image->comps;
-@@ -1167,7 +1168,18 @@ OPJ_UINT32 opj_tcd_get_decoded_tile_size ( opj_tcd_t *p_tcd )
-                 }
- 
-                 l_res = l_tile_comp->resolutions + l_tile_comp->minimum_num_resolutions - 1;
--                l_data_size += l_size_comp * (OPJ_UINT32)((l_res->x1 - l_res->x0) * (l_res->y1 - l_res->y0));
-+                l_temp = (OPJ_UINT32)((l_res->x1 - l_res->x0) * (l_res->y1 - l_res->y0)); /* x1*y1 can't overflow */
-+
-+                if (l_size_comp && ((OPJ_UINT32)-1) / l_size_comp < l_temp) {
-+                        return (OPJ_UINT32)-1;
-+                }
-+                l_temp *= l_size_comp;
-+
-+                if (l_temp > ((OPJ_UINT32)-1) - l_data_size) {
-+                        return (OPJ_UINT32)-1;
-+                }
-+                l_data_size += l_temp;
-+
-                 ++l_img_comp;
-                 ++l_tile_comp;
-         }
-@@ -1362,7 +1374,7 @@ OPJ_BOOL opj_tcd_update_tile_data ( opj_tcd_t *p_tcd,
-         OPJ_UINT32 l_stride, l_width,l_height;
- 
-         l_data_size = opj_tcd_get_decoded_tile_size(p_tcd);
--        if (l_data_size > p_dest_length) {
-+        if (l_data_size == (OPJ_UINT32)-1 || l_data_size > p_dest_length) {
-                 return OPJ_FALSE;
-         }
- 
diff --git a/third_party/libopenjpeg20/0019-tcd_init_tile.patch b/third_party/libopenjpeg20/0019-tcd_init_tile.patch
index d8e18fa..fc5a3aa 100644
--- a/third_party/libopenjpeg20/0019-tcd_init_tile.patch
+++ b/third_party/libopenjpeg20/0019-tcd_init_tile.patch
@@ -1,30 +1,21 @@
-diff --git a/third_party/libopenjpeg20/README.pdfium b/third_party/libopenjpeg20/README.pdfium
-index a9e289d..b1012af 100644
---- a/third_party/libopenjpeg20/README.pdfium
-+++ b/third_party/libopenjpeg20/README.pdfium
-@@ -28,4 +28,5 @@ Local Modifications:
- 0016-read_SQcd_SQcc_overflow.patch: Prevent a buffer overflow in opj_j2k_read_SQcd_SQcc.
- 0017-tcd_init_tile.patch: Prevent integer overflows during calculation of |l_nb_precinct_size|.
- 0018-tcd_get_decoded_tile_size.patch: Fix an integer overflow in opj_tcd_get_decoded_tile_size.
-+0019-tcd_init_tile.patch: Prevent integer overflows during calculation of |l_nb_code_blocks_size|.
- TODO(thestig): List all the other patches.
 diff --git a/third_party/libopenjpeg20/tcd.c b/third_party/libopenjpeg20/tcd.c
-index cd1c439..9270efe 100644
+index f0710cd14..35d15e3d1 100644
 --- a/third_party/libopenjpeg20/tcd.c
 +++ b/third_party/libopenjpeg20/tcd.c
-@@ -939,8 +939,15 @@ static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
- 					l_current_precinct->cw = (OPJ_UINT32)((brcblkxend - tlcblkxstart) >> cblkwidthexpn);
- 					l_current_precinct->ch = (OPJ_UINT32)((brcblkyend - tlcblkystart) >> cblkheightexpn);
- 					
-+					if (l_current_precinct->cw && ((OPJ_UINT32)-1) / l_current_precinct->cw < l_current_precinct->ch) {
-+						return OPJ_FALSE;
-+					}
- 					l_nb_code_blocks = l_current_precinct->cw * l_current_precinct->ch;
- 					/*fprintf(stderr, "\t\t\t\t precinct_cw = %d x recinct_ch = %d\n",l_current_precinct->cw, l_current_precinct->ch);      */
-+					
-+					if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof_block < l_nb_code_blocks) {
-+						return OPJ_FALSE;
-+					}
- 					l_nb_code_blocks_size = l_nb_code_blocks * (OPJ_UINT32)sizeof_block;
- 					
- 					if (! l_current_precinct->cblks.blocks) {
+@@ -1040,9 +1040,15 @@ static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
+                                                           cblkwidthexpn);
+                     l_current_precinct->ch = (OPJ_UINT32)((brcblkyend - tlcblkystart) >>
+                                                           cblkheightexpn);
+-
++                    if (l_current_precinct->cw && ((OPJ_UINT32)-1) / l_current_precinct->cw < l_current_precinct->ch) {
++                        return OPJ_FALSE;
++                    }
+                     l_nb_code_blocks = l_current_precinct->cw * l_current_precinct->ch;
+                     /*fprintf(stderr, "\t\t\t\t precinct_cw = %d x recinct_ch = %d\n",l_current_precinct->cw, l_current_precinct->ch);      */
++
++                    if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof_block < l_nb_code_blocks) {
++                        return OPJ_FALSE;
++                    }
+                     l_nb_code_blocks_size = l_nb_code_blocks * (OPJ_UINT32)sizeof_block;
+ 
+                     if (!l_current_precinct->cblks.blocks && (l_nb_code_blocks > 0U)) {
diff --git a/third_party/libopenjpeg20/0020-opj_aligned_malloc.patch b/third_party/libopenjpeg20/0020-opj_aligned_malloc.patch
deleted file mode 100644
index 7de6e96..0000000
--- a/third_party/libopenjpeg20/0020-opj_aligned_malloc.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-diff --git a/third_party/libopenjpeg20/README.pdfium b/third_party/libopenjpeg20/README.pdfium
-index b1012af..a40ed7b 100644
---- a/third_party/libopenjpeg20/README.pdfium
-+++ b/third_party/libopenjpeg20/README.pdfium
-@@ -29,4 +29,5 @@ Local Modifications:
- 0017-tcd_init_tile.patch: Prevent integer overflows during calculation of |l_nb_precinct_size|.
- 0018-tcd_get_decoded_tile_size.patch: Fix an integer overflow in opj_tcd_get_decoded_tile_size.
- 0019-tcd_init_tile.patch: Prevent integer overflows during calculation of |l_nb_code_blocks_size|.
-+0020-opj_aligned_malloc.patch: Prevent overflows when using opj_aligned_malloc().
- TODO(thestig): List all the other patches.
-diff --git a/third_party/libopenjpeg20/dwt.c b/third_party/libopenjpeg20/dwt.c
-index 3b92bdf..a666d1c 100644
---- a/third_party/libopenjpeg20/dwt.c
-+++ b/third_party/libopenjpeg20/dwt.c
-@@ -576,6 +576,9 @@ static OPJ_BOOL opj_dwt_decode_tile(const opj_tcd_tilecomp_t* tilec, OPJ_UINT32
- 	OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
- 
- 	h.mem_count = opj_dwt_max_resolution(tr, numres);
-+	if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(OPJ_INT32) < (OPJ_UINT32)h.mem_count) {
-+		return OPJ_FALSE;
-+	}
- 	h.mem = (OPJ_INT32*)opj_aligned_malloc(h.mem_count * sizeof(OPJ_INT32));
- 	if (! h.mem){
- 		/* FIXME event manager error callback */
-@@ -850,7 +853,17 @@ OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, OPJ_UINT32 numr
- 
- 	OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
- 
--	h.wavelet = (opj_v4_t*) opj_aligned_malloc((opj_dwt_max_resolution(res, numres)+5) * sizeof(opj_v4_t));
-+	OPJ_UINT32 mr = opj_dwt_max_resolution(res, numres);
-+
-+	if (mr >= ((OPJ_UINT32)-5)) {
-+		return OPJ_FALSE;
-+	}
-+	mr += 5;
-+
-+	if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(opj_v4_t) < mr) {
-+		return OPJ_FALSE;
-+	}
-+	h.wavelet = (opj_v4_t*) opj_aligned_malloc(mr * sizeof(opj_v4_t));
- 	if (!h.wavelet) {
- 		/* FIXME event manager error callback */
- 		return OPJ_FALSE;
-diff --git a/third_party/libopenjpeg20/t1.c b/third_party/libopenjpeg20/t1.c
-index 108ce78..a119db1 100644
---- a/third_party/libopenjpeg20/t1.c
-+++ b/third_party/libopenjpeg20/t1.c
-@@ -1173,6 +1173,9 @@ static OPJ_BOOL opj_t1_allocate_buffers(
- 	if (!t1->encoder) {
- 		if(datasize > t1->datasize){
- 			opj_aligned_free(t1->data);
-+			if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(OPJ_INT32) < datasize) {
-+				return OPJ_FALSE;
-+			}
- 			t1->data = (OPJ_INT32*) opj_aligned_malloc(datasize * sizeof(OPJ_INT32));
- 			if(!t1->data){
- 				/* FIXME event manager error callback */
-@@ -1187,6 +1190,9 @@ static OPJ_BOOL opj_t1_allocate_buffers(
- 
- 	if(flagssize > t1->flagssize){
- 		opj_aligned_free(t1->flags);
-+		if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(opj_flag_t) < flagssize) {
-+			return OPJ_FALSE;
-+		}
- 		t1->flags = (opj_flag_t*) opj_aligned_malloc(flagssize * sizeof(opj_flag_t));
- 		if(!t1->flags){
- 			/* FIXME event manager error callback */
diff --git a/third_party/libopenjpeg20/0021-tcd_init_tile_negative.patch b/third_party/libopenjpeg20/0021-tcd_init_tile_negative.patch
deleted file mode 100644
index 33694f8..0000000
--- a/third_party/libopenjpeg20/0021-tcd_init_tile_negative.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-diff --git a/third_party/libopenjpeg20/tcd.c b/third_party/libopenjpeg20/tcd.c
-index 9270efe..06eee4e 100644
---- a/third_party/libopenjpeg20/tcd.c
-+++ b/third_party/libopenjpeg20/tcd.c
-@@ -706,9 +706,16 @@ static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
- 	l_tx0 = l_cp->tx0 + p * l_cp->tdx; /* can't be greater than l_image->x1 so won't overflow */
- 	l_tile->x0 = (OPJ_INT32)opj_uint_max(l_tx0, l_image->x0);
- 	l_tile->x1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_tx0, l_cp->tdx), l_image->x1);
-+	if (l_tile->x0 < 0 || l_tile->x1 < 0) {
-+		return OPJ_FALSE;
-+	}
-+
- 	l_ty0 = l_cp->ty0 + q * l_cp->tdy; /* can't be greater than l_image->y1 so won't overflow */
- 	l_tile->y0 = (OPJ_INT32)opj_uint_max(l_ty0, l_image->y0);
- 	l_tile->y1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_ty0, l_cp->tdy), l_image->y1);
-+	if (l_tile->y0 < 0 || l_tile->y1 < 0) {
-+		return OPJ_FALSE;
-+	}
- 
- 	/* testcase 1888.pdf.asan.35.988 */
- 	if (l_tccp->numresolutions == 0) {
diff --git a/third_party/libopenjpeg20/0022-jp2_apply_pclr_overflow.patch b/third_party/libopenjpeg20/0022-jp2_apply_pclr_overflow.patch
index 72105fe..f4f2ef5 100644
--- a/third_party/libopenjpeg20/0022-jp2_apply_pclr_overflow.patch
+++ b/third_party/libopenjpeg20/0022-jp2_apply_pclr_overflow.patch
@@ -1,53 +1,52 @@
 diff --git a/third_party/libopenjpeg20/jp2.c b/third_party/libopenjpeg20/jp2.c
-index a6648f6..8128d98 100644
+index 1fa607d66..78a2d22ff 100644
 --- a/third_party/libopenjpeg20/jp2.c
 +++ b/third_party/libopenjpeg20/jp2.c
-@@ -972,6 +972,14 @@ static void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color)
- 	nr_channels = color->jp2_pclr->nr_channels;
- 
- 	old_comps = image->comps;
-+	/* Overflow check: prevent integer overflow */
-+	for (i = 0; i < nr_channels; ++i) {
-+		cmp = cmap[i].cmp;
-+		if (old_comps[cmp].h == 0 || old_comps[cmp].w > ((OPJ_UINT32)-1) / sizeof(OPJ_INT32) / old_comps[cmp].h) {
-+			return;
-+		}
-+	}
-+
- 	new_comps = (opj_image_comp_t*)
- 			opj_malloc(nr_channels * sizeof(opj_image_comp_t));
- 	if (!new_comps) {
-@@ -1011,22 +1019,28 @@ static void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color)
- 		/* Palette mapping: */
- 		cmp = cmap[i].cmp; pcol = cmap[i].pcol;
- 		src = old_comps[cmp].data;
--    assert( src );
-+		dst = new_comps[i].data;
- 		max = new_comps[i].w * new_comps[i].h;
- 
-+		/* Prevent null pointer access */
-+		if (!src || !dst) {
-+			for (j = 0; j < nr_channels; ++j) {
-+				opj_free(new_comps[j].data);
-+			}
-+			opj_free(new_comps);
-+			new_comps = NULL;
-+			return;
-+		}
-+
- 		/* Direct use: */
-     if(cmap[i].mtyp == 0) {
-       assert( cmp == 0 ); // probably wrong.
--      dst = new_comps[i].data;
--      assert( dst );
-       for(j = 0; j < max; ++j) {
-         dst[j] = src[j];
-       }
+@@ -1049,6 +1049,14 @@ static OPJ_BOOL opj_jp2_apply_pclr(opj_image_t *image,
      }
-     else {
-       assert( i == pcol ); // probably wrong?
--      dst = new_comps[i].data;
--      assert( dst );
-       for(j = 0; j < max; ++j) {
-         /* The index */
-         if((k = src[j]) < 0) k = 0; else if(k > top_k) k = top_k;
+ 
+     old_comps = image->comps;
++    /* Overflow check: prevent integer overflow */
++    for (i = 0; i < nr_channels; ++i) {
++      cmp = cmap[i].cmp;
++      if (old_comps[cmp].h == 0 || old_comps[cmp].w > ((OPJ_UINT32)-1) / sizeof(OPJ_INT32) / old_comps[cmp].h) {
++        return OPJ_FALSE;
++      }
++    }
++
+     new_comps = (opj_image_comp_t*)
+                 opj_malloc(nr_channels * sizeof(opj_image_comp_t));
+     if (!new_comps) {
+@@ -1093,21 +1101,27 @@ static OPJ_BOOL opj_jp2_apply_pclr(opj_image_t *image,
+         cmp = cmap[i].cmp;
+         pcol = cmap[i].pcol;
+         src = old_comps[cmp].data;
+-        assert(src); /* verified above */
++        dst = new_comps[i].data;
+         max = new_comps[i].w * new_comps[i].h;
+ 
++        /* Prevent null pointer access */
++        if (!src || !dst) {
++          for (j = 0; j < nr_channels; ++j) {
++            opj_free(new_comps[j].data);
++          }
++          opj_free(new_comps);
++          new_comps = NULL;
++          return OPJ_FALSE;
++        }
++
+         /* Direct use: */
+         if (cmap[i].mtyp == 0) {
+             assert( cmp == 0 ); // probably wrong.
+-            dst = new_comps[i].data;
+-            assert(dst);
+             for (j = 0; j < max; ++j) {
+                 dst[j] = src[j];
+             }
+         } else {
+             assert( i == pcol ); // probably wrong?
+-            dst = new_comps[i].data;
+-            assert(dst);
+             for (j = 0; j < max; ++j) {
+                 /* The index */
+                 if ((k = src[j]) < 0) {
diff --git a/third_party/libopenjpeg20/0023-opj_j2k_read_mct_records.patch b/third_party/libopenjpeg20/0023-opj_j2k_read_mct_records.patch
index 6775f4f..c8415ae 100644
--- a/third_party/libopenjpeg20/0023-opj_j2k_read_mct_records.patch
+++ b/third_party/libopenjpeg20/0023-opj_j2k_read_mct_records.patch
@@ -1,30 +1,31 @@
 diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c
-index 6346c2190..45187e8e6 100644
+index ed449684f..c5f9dd53e 100644
 --- a/third_party/libopenjpeg20/j2k.c
 +++ b/third_party/libopenjpeg20/j2k.c
-@@ -5129,6 +5129,7 @@ static OPJ_BOOL opj_j2k_read_mct (      opj_j2k_t *p_j2k,
-         OPJ_UINT32 l_tmp;
-         OPJ_UINT32 l_indix;
-         opj_mct_data_t * l_mct_data;
-+        OPJ_BOOL new_mct = OPJ_FALSE;
+@@ -5553,6 +5553,7 @@ static OPJ_BOOL opj_j2k_read_mct(opj_j2k_t *p_j2k,
+     OPJ_UINT32 l_tmp;
+     OPJ_UINT32 l_indix;
+     opj_mct_data_t * l_mct_data;
++    OPJ_BOOL new_mct = OPJ_FALSE;
  
-         /* preconditions */
-         assert(p_header_data != 00);
-@@ -5191,7 +5192,7 @@ static OPJ_BOOL opj_j2k_read_mct (      opj_j2k_t *p_j2k,
-                 }
- 
-                 l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
--                ++l_tcp->m_nb_mct_records;
-+                new_mct = OPJ_TRUE;
+     /* preconditions */
+     assert(p_header_data != 00);
+@@ -5640,7 +5641,7 @@ static OPJ_BOOL opj_j2k_read_mct(opj_j2k_t *p_j2k,
          }
  
-         if (l_mct_data->m_data) {
-@@ -5221,6 +5222,9 @@ static OPJ_BOOL opj_j2k_read_mct (      opj_j2k_t *p_j2k,
+         l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
+-        ++l_tcp->m_nb_mct_records;
++        new_mct = OPJ_TRUE;
+     }
  
-         l_mct_data->m_data_size = p_header_size;
+     if (l_mct_data->m_data) {
+@@ -5672,6 +5673,9 @@ static OPJ_BOOL opj_j2k_read_mct(opj_j2k_t *p_j2k,
  
-+        if (new_mct) {
-+                ++l_tcp->m_nb_mct_records;
-+        }
-         return OPJ_TRUE;
+     l_mct_data->m_data_size = p_header_size;
+ 
++    if (new_mct) {
++            ++l_tcp->m_nb_mct_records;
++    }
+     return OPJ_TRUE;
  }
+ 
diff --git a/third_party/libopenjpeg20/0024-l_marker_size_check.patch b/third_party/libopenjpeg20/0024-l_marker_size_check.patch
deleted file mode 100644
index cb020c9..0000000
--- a/third_party/libopenjpeg20/0024-l_marker_size_check.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c
-index 45187e8e6..5de89cf0e 100644
---- a/third_party/libopenjpeg20/j2k.c
-+++ b/third_party/libopenjpeg20/j2k.c
-@@ -7195,6 +7195,10 @@ static OPJ_BOOL opj_j2k_read_header_procedure( opj_j2k_t *p_j2k,
- 
-                 /* read 2 bytes as the marker size */
-                 opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2);
-+                if (l_marker_size < 2) {
-+                        opj_event_msg(p_manager, EVT_ERROR, "Invalid marker size\n");
-+                        return OPJ_FALSE;
-+                }
-                 l_marker_size -= 2; /* Subtract the size of the marker ID already read */
- 
-                 /* Check if the marker size is compatible with the header data size */
diff --git a/third_party/libopenjpeg20/0025-opj_j2k_add_mct_null_data.patch b/third_party/libopenjpeg20/0025-opj_j2k_add_mct_null_data.patch
index 4a371e5..b2e7cdc 100644
--- a/third_party/libopenjpeg20/0025-opj_j2k_add_mct_null_data.patch
+++ b/third_party/libopenjpeg20/0025-opj_j2k_add_mct_null_data.patch
@@ -1,22 +1,22 @@
 diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c
-index 5de89cf0e..400ca8098 100644
+index c5f9dd53e..d31eb29a7 100644
 --- a/third_party/libopenjpeg20/j2k.c
 +++ b/third_party/libopenjpeg20/j2k.c
-@@ -5715,7 +5715,7 @@ static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UI
+@@ -6201,7 +6201,7 @@ static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image,
+     if (l_deco_array) {
+         l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps
+                       * p_image->numcomps;
+-        if (l_deco_array->m_data_size != l_data_size) {
++        if (l_deco_array->m_data_size != l_data_size || ! l_deco_array->m_data) {
+             return OPJ_FALSE;
+         }
  
-         if (l_deco_array) {
-                 l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps * p_image->numcomps;
--                if (l_deco_array->m_data_size != l_data_size) {
-+                if (l_deco_array->m_data_size != l_data_size || ! l_deco_array->m_data) {
-                         return OPJ_FALSE;
-                 }
- 
-@@ -5734,7 +5734,7 @@ static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UI
- 
-         if (l_offset_array) {
-                 l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] * p_image->numcomps;
--                if (l_offset_array->m_data_size != l_data_size) {
-+                if (l_offset_array->m_data_size != l_data_size || ! l_offset_array->m_data) {
-                         return OPJ_FALSE;
-                 }
+@@ -6222,7 +6222,7 @@ static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image,
+     if (l_offset_array) {
+         l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] *
+                       p_image->numcomps;
+-        if (l_offset_array->m_data_size != l_data_size) {
++        if (l_offset_array->m_data_size != l_data_size || ! l_offset_array->m_data) {
+             return OPJ_FALSE;
+         }
  
diff --git a/third_party/libopenjpeg20/0026-use_opj_uint_ceildiv.patch b/third_party/libopenjpeg20/0026-use_opj_uint_ceildiv.patch
index a196a44..038fb90 100644
--- a/third_party/libopenjpeg20/0026-use_opj_uint_ceildiv.patch
+++ b/third_party/libopenjpeg20/0026-use_opj_uint_ceildiv.patch
@@ -1,70 +1,86 @@
 diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c
-index 400ca8098..e77edd22b 100644
+index c5f9dd53e..1869833f7 100644
 --- a/third_party/libopenjpeg20/j2k.c
 +++ b/third_party/libopenjpeg20/j2k.c
-@@ -2155,8 +2155,8 @@ static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
-         }
+@@ -2311,10 +2311,8 @@ static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
+     }
  
-         /* Compute the number of tiles */
--        l_cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->x1 - l_cp->tx0), (OPJ_INT32)l_cp->tdx);
--        l_cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->y1 - l_cp->ty0), (OPJ_INT32)l_cp->tdy);
-+        l_cp->tw = opj_uint_ceildiv(l_image->x1 - l_cp->tx0, l_cp->tdx);
-+        l_cp->th = opj_uint_ceildiv(l_image->y1 - l_cp->ty0, l_cp->tdy);
+     /* Compute the number of tiles */
+-    l_cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->x1 - l_cp->tx0),
+-                                           (OPJ_INT32)l_cp->tdx);
+-    l_cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(l_image->y1 - l_cp->ty0),
+-                                           (OPJ_INT32)l_cp->tdy);
++    l_cp->tw = opj_uint_ceildiv(l_image->x1 - l_cp->tx0, l_cp->tdx);
++    l_cp->th = opj_uint_ceildiv(l_image->y1 - l_cp->ty0, l_cp->tdy);
  
-         /* Check that the number of tiles is valid */
-         if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) {
-@@ -2171,8 +2171,8 @@ static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
-         if (p_j2k->m_specific_param.m_decoder.m_discard_tiles) {
-                 p_j2k->m_specific_param.m_decoder.m_start_tile_x = (p_j2k->m_specific_param.m_decoder.m_start_tile_x - l_cp->tx0) / l_cp->tdx;
-                 p_j2k->m_specific_param.m_decoder.m_start_tile_y = (p_j2k->m_specific_param.m_decoder.m_start_tile_y - l_cp->ty0) / l_cp->tdy;
--                p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0), (OPJ_INT32)l_cp->tdx);
--                p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0), (OPJ_INT32)l_cp->tdy);
-+                p_j2k->m_specific_param.m_decoder.m_end_tile_x = opj_uint_ceildiv(p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0, l_cp->tdx);
-+                p_j2k->m_specific_param.m_decoder.m_end_tile_y = opj_uint_ceildiv(p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0, l_cp->tdy);
-         }
-         else {
-                 p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
-@@ -6354,8 +6354,8 @@ OPJ_BOOL opj_j2k_setup_encoder(     opj_j2k_t *p_j2k,
-         */
+     /* Check that the number of tiles is valid */
+     if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) {
+@@ -2331,12 +2329,10 @@ static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
+             (p_j2k->m_specific_param.m_decoder.m_start_tile_x - l_cp->tx0) / l_cp->tdx;
+         p_j2k->m_specific_param.m_decoder.m_start_tile_y =
+             (p_j2k->m_specific_param.m_decoder.m_start_tile_y - l_cp->ty0) / l_cp->tdy;
+-        p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv((
+-                    OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0),
+-                (OPJ_INT32)l_cp->tdx);
+-        p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv((
+-                    OPJ_INT32)(p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0),
+-                (OPJ_INT32)l_cp->tdy);
++        p_j2k->m_specific_param.m_decoder.m_end_tile_x = opj_uint_ceildiv(
++            p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0, l_cp->tdx);
++        p_j2k->m_specific_param.m_decoder.m_end_tile_y = opj_uint_ceildiv(
++            p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0, l_cp->tdy);
+     } else {
+         p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
+         p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
+@@ -6922,10 +6918,8 @@ OPJ_BOOL opj_j2k_setup_encoder(opj_j2k_t *p_j2k,
+     */
  
-         if (parameters->tile_size_on) {
--                cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->x1 - cp->tx0), (OPJ_INT32)cp->tdx);
--                cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->y1 - cp->ty0), (OPJ_INT32)cp->tdy);
-+                cp->tw = opj_uint_ceildiv(image->x1 - cp->tx0, cp->tdx);
-+                cp->th = opj_uint_ceildiv(image->y1 - cp->ty0, cp->tdy);
-         } else {
-                 cp->tdx = image->x1 - cp->tx0;
-                 cp->tdy = image->y1 - cp->ty0;
-@@ -8529,8 +8529,8 @@ OPJ_BOOL opj_j2k_set_decode_area(       opj_j2k_t *p_j2k,
-         {
-                 OPJ_INT32 l_h,l_w;
+     if (parameters->tile_size_on) {
+-        cp->tw = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->x1 - cp->tx0),
+-                                             (OPJ_INT32)cp->tdx);
+-        cp->th = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)(image->y1 - cp->ty0),
+-                                             (OPJ_INT32)cp->tdy);
++        cp->tw = opj_uint_ceildiv(image->x1 - cp->tx0, cp->tdx);
++        cp->th = opj_uint_ceildiv(image->y1 - cp->ty0, cp->tdy);
+     } else {
+         cp->tdx = image->x1 - cp->tx0;
+         cp->tdy = image->y1 - cp->ty0;
+@@ -9237,10 +9231,8 @@ OPJ_BOOL opj_j2k_set_decode_area(opj_j2k_t *p_j2k,
+     for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
+         OPJ_INT32 l_h, l_w;
  
--                l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0, (OPJ_INT32)l_img_comp->dx);
--                l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0, (OPJ_INT32)l_img_comp->dy);
-+                l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
-+                l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
-                 l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
-                 l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
+-        l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0,
+-                         (OPJ_INT32)l_img_comp->dx);
+-        l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0,
+-                         (OPJ_INT32)l_img_comp->dy);
++        l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
++        l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
+         l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
+         l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
  
-@@ -9887,8 +9887,8 @@ OPJ_BOOL opj_j2k_get_tile(      opj_j2k_t *p_j2k,
+@@ -10848,10 +10840,8 @@ OPJ_BOOL opj_j2k_get_tile(opj_j2k_t *p_j2k,
  
-                 l_img_comp->factor = p_j2k->m_private_image->comps[compno].factor;
+         l_img_comp->factor = p_j2k->m_private_image->comps[compno].factor;
  
--                l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0, (OPJ_INT32)l_img_comp->dx);
--                l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0, (OPJ_INT32)l_img_comp->dy);
-+                l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
-+                l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
-                 l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
-                 l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
+-        l_img_comp->x0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->x0,
+-                         (OPJ_INT32)l_img_comp->dx);
+-        l_img_comp->y0 = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)p_image->y0,
+-                         (OPJ_INT32)l_img_comp->dy);
++        l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
++        l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
+         l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
+         l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
  
-@@ -10169,8 +10169,8 @@ static void opj_get_tile_dimensions(opj_image_t * l_image,
+@@ -11161,10 +11151,8 @@ static void opj_get_tile_dimensions(opj_image_t * l_image,
  
-        *l_width  = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
-        *l_height = (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);
--       *l_offset_x = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);
--       *l_offset_y = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->y0, (OPJ_INT32)l_img_comp->dy);
-+       *l_offset_x = opj_uint_ceildiv(l_image->x0, l_img_comp->dx);
-+       *l_offset_y = opj_uint_ceildiv(l_image->y0, l_img_comp->dy);
-        *l_image_width = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x1 - (OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);
-        *l_stride = *l_image_width - *l_width;
-        *l_tile_offset = ((OPJ_UINT32)l_tilec->x0 - *l_offset_x) + ((OPJ_UINT32)l_tilec->y0 - *l_offset_y) * *l_image_width;
+     *l_width  = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
+     *l_height = (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);
+-    *l_offset_x = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x0,
+-                  (OPJ_INT32)l_img_comp->dx);
+-    *l_offset_y = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->y0,
+-                  (OPJ_INT32)l_img_comp->dy);
++    *l_offset_x = opj_uint_ceildiv(l_image->x0, l_img_comp->dx);
++    *l_offset_y = opj_uint_ceildiv(l_image->y0, l_img_comp->dy);
+     *l_image_width = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x1 -
+                      (OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);
+     *l_stride = *l_image_width - *l_width;
diff --git a/third_party/libopenjpeg20/0027-undefined-shift-opj_t1_decode_cblk.patch b/third_party/libopenjpeg20/0027-undefined-shift-opj_t1_decode_cblk.patch
deleted file mode 100644
index 7ba877a..0000000
--- a/third_party/libopenjpeg20/0027-undefined-shift-opj_t1_decode_cblk.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/third_party/libopenjpeg20/t1.c b/third_party/libopenjpeg20/t1.c
-index a119db1f7..1ad850c77 100644
---- a/third_party/libopenjpeg20/t1.c
-+++ b/third_party/libopenjpeg20/t1.c
-@@ -1411,7 +1411,7 @@ static OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
-             }
-                }
- 
--               for (passno = 0; passno < seg->real_num_passes; ++passno) {
-+               for (passno = 0; (passno < seg->real_num_passes) && (bpno_plus_one >= 1); ++passno) {
-             switch (passtype) {
-                 case 0:
-                     if (type == T1_TYPE_RAW) {
diff --git a/third_party/libopenjpeg20/0028-upstream-check-size-in-opj_j2k_read_siz.patch b/third_party/libopenjpeg20/0028-upstream-check-size-in-opj_j2k_read_siz.patch
deleted file mode 100644
index 22d5562..0000000
--- a/third_party/libopenjpeg20/0028-upstream-check-size-in-opj_j2k_read_siz.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c
-index e77edd22b..cb5a28373 100644
---- a/third_party/libopenjpeg20/j2k.c
-+++ b/third_party/libopenjpeg20/j2k.c
-@@ -2117,10 +2117,16 @@ static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
-                 if( l_img_comp->dx < 1 || l_img_comp->dx > 255 ||
-                     l_img_comp->dy < 1 || l_img_comp->dy > 255 ) {
-                     opj_event_msg(p_manager, EVT_ERROR,
--                                  "Invalid values for comp = %d : dx=%u dy=%u\n (should be between 1 and 255 according the JPEG2000 norm)",
-+                                  "Invalid values for comp = %d : dx=%u dy=%u (should be between 1 and 255 according to the JPEG2000 norm)\n",
-                                   i, l_img_comp->dx, l_img_comp->dy);
-                     return OPJ_FALSE;
-                 }
-+                if( l_img_comp->prec > 38) { /* TODO openjpeg won't handle more than ? */
-+                    opj_event_msg(p_manager, EVT_ERROR,
-+                                  "Invalid values for comp = %d : prec=%u (should be between 1 and 38 according to the JPEG2000 norm)\n",
-+                                  i, l_img_comp->prec);
-+                    return OPJ_FALSE;
-+                }
- 
- #ifdef USE_JPWL
-                 if (l_cp->correct) {
diff --git a/third_party/libopenjpeg20/0029-avoid-division-by-0.patch b/third_party/libopenjpeg20/0029-avoid-division-by-0.patch
deleted file mode 100644
index 4ea2b7c..0000000
--- a/third_party/libopenjpeg20/0029-avoid-division-by-0.patch
+++ /dev/null
@@ -1,119 +0,0 @@
-diff --git a/third_party/libopenjpeg20/pi.c b/third_party/libopenjpeg20/pi.c
-index 9097e31a0..083674222 100644
---- a/third_party/libopenjpeg20/pi.c
-+++ b/third_party/libopenjpeg20/pi.c
-@@ -355,12 +355,20 @@ if (!pi->tp_on){
-                                        }
-                                        res = &comp->resolutions[pi->resno];
-                                        levelno = comp->numresolutions - 1 - pi->resno;
--                                       trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
--                                       try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
--                                       trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
--                                       try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
-+                                       OPJ_INT32 x_divisor = comp->dx << levelno;
-+                                       OPJ_INT32 y_divisor = comp->dy << levelno;
-+                                       if (x_divisor == 0 || y_divisor == 0) {
-+                                               continue;
-+                                       }
-+                                       trx0 = opj_int_ceildiv(pi->tx0, x_divisor);
-+                                       try0 = opj_int_ceildiv(pi->ty0, y_divisor);
-+                                       trx1 = opj_int_ceildiv(pi->tx1, x_divisor);
-+                                       try1 = opj_int_ceildiv(pi->ty1, y_divisor);
-                                        rpx = res->pdx + levelno;
-                                        rpy = res->pdy + levelno;
-+                                       if (comp->dy << rpy == 0 || 1 << rpy == 0 || comp->dx << rpx == 0 || 1 << rpx == 0) {
-+                                               continue;
-+                                       }
-                                        if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
-                                                continue;       
-                                        }
-@@ -372,9 +380,9 @@ if (!pi->tp_on){
-                                        
-                                        if ((trx0==trx1)||(try0==try1)) continue;
-                                        
--                                       prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
-+                                       prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, x_divisor), (OPJ_INT32)res->pdx)
-                                                 - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
--                                       prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
-+                                       prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, y_divisor), (OPJ_INT32)res->pdy)
-                                                 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
-                                        pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
-                                        if (pi->precno >= res->pw * res->ph) {
-@@ -439,12 +447,20 @@ static OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi) {
-                                        OPJ_INT32 prci, prcj;
-                                        res = &comp->resolutions[pi->resno];
-                                        levelno = comp->numresolutions - 1 - pi->resno;
--                                       trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
--                                       try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
--                                       trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
--                                       try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
-+                                       OPJ_INT32 x_divisor = comp->dx << levelno;
-+                                       OPJ_INT32 y_divisor = comp->dy << levelno;
-+                                       if (x_divisor == 0 || y_divisor == 0) {
-+                                               continue;
-+                                       }
-+                                       trx0 = opj_int_ceildiv(pi->tx0, x_divisor);
-+                                       try0 = opj_int_ceildiv(pi->ty0, y_divisor);
-+                                       trx1 = opj_int_ceildiv(pi->tx1, x_divisor);
-+                                       try1 = opj_int_ceildiv(pi->ty1, y_divisor);
-                                        rpx = res->pdx + levelno;
-                                        rpy = res->pdy + levelno;
-+                                       if (comp->dy << rpy == 0 || 1 << rpy == 0 || comp->dx << rpx == 0 || 1 << rpx == 0) {
-+                                               continue;
-+                                       }
-                                        if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
-                                                continue;       
-                                        }
-@@ -456,9 +472,9 @@ static OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi) {
-                                        
-                                        if ((trx0==trx1)||(try0==try1)) continue;
-                                        
--                                       prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
-+                                       prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, x_divisor), (OPJ_INT32)res->pdx)
-                                                 - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
--                                       prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
-+                                       prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, y_divisor), (OPJ_INT32)res->pdy)
-                                                 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
-                                        pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
-                                        if (pi->precno >= res->pw * res->ph) {
-@@ -521,26 +537,33 @@ static OPJ_BOOL opj_pi_next_cprl(opj_pi_iterator_t * pi) {
-                                        OPJ_INT32 prci, prcj;
-                                        res = &comp->resolutions[pi->resno];
-                                        levelno = comp->numresolutions - 1 - pi->resno;
--                                       trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
--                                       try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
--                                       trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
--                                       try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
-+                                       OPJ_INT32 x_divisor = comp->dx << levelno;
-+                                       OPJ_INT32 y_divisor = comp->dy << levelno;
-+                                       if (x_divisor == 0 || y_divisor == 0) {
-+                                               continue;
-+                                       }
-+                                       trx0 = opj_int_ceildiv(pi->tx0, x_divisor);
-+                                       try0 = opj_int_ceildiv(pi->ty0, y_divisor);
-+                                       trx1 = opj_int_ceildiv(pi->tx1, x_divisor);
-+                                       try1 = opj_int_ceildiv(pi->ty1, y_divisor);
-                                        rpx = res->pdx + levelno;
-                                        rpy = res->pdy + levelno;
-+                                       if (comp->dy << rpy == 0 || 1 << rpy == 0 || comp->dx << rpx == 0 || 1 << rpx == 0) {
-+                                               continue;
-+                                       }
-                                        if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
-                                                continue;       
-                                        }
-                                        if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
-                                                continue;
-                                        }
--                                       
-                                        if ((res->pw==0)||(res->ph==0)) continue;
-                                        
-                                        if ((trx0==trx1)||(try0==try1)) continue;
-                                        
--                                       prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
-+                                       prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, x_divisor), (OPJ_INT32)res->pdx)
-                                                 - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
--                                       prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
-+                                       prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, y_divisor), (OPJ_INT32)res->pdy)
-                                                 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
-                                        pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
-                                        if (pi->precno >= res->pw * res->ph) {
diff --git a/third_party/libopenjpeg20/0030-undefined-shift-opj_get_all_encoding_parameters.patch b/third_party/libopenjpeg20/0030-undefined-shift-opj_get_all_encoding_parameters.patch
deleted file mode 100644
index 3ba3a2f..0000000
--- a/third_party/libopenjpeg20/0030-undefined-shift-opj_get_all_encoding_parameters.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-diff --git a/third_party/libopenjpeg20/pi.c b/third_party/libopenjpeg20/pi.c
-index 083674222..6af38d0ca 100644
---- a/third_party/libopenjpeg20/pi.c
-+++ b/third_party/libopenjpeg20/pi.c
-@@ -782,18 +782,18 @@ static void opj_get_all_encoding_parameters(   const opj_image_t *p_image,
-                /* use custom size for precincts*/
-                l_level_no = l_tccp->numresolutions - 1;
-                for (resno = 0; resno < l_tccp->numresolutions; ++resno) {
--                       OPJ_UINT32 l_dx, l_dy;
--
-                        /* precinct width and height*/
-                        l_pdx = l_tccp->prcw[resno];
-                        l_pdy = l_tccp->prch[resno];
-                        *lResolutionPtr++ = l_pdx;
-                        *lResolutionPtr++ = l_pdy;
--                       l_dx = l_img_comp->dx * (1u << (l_pdx + l_level_no));
--                       l_dy = l_img_comp->dy * (1u << (l_pdy + l_level_no));
-                        /* take the minimum size for l_dx for each comp and resolution*/
--                       *p_dx_min = (OPJ_UINT32)opj_int_min((OPJ_INT32)*p_dx_min, (OPJ_INT32)l_dx);
--                       *p_dy_min = (OPJ_UINT32)opj_int_min((OPJ_INT32)*p_dy_min, (OPJ_INT32)l_dy);
-+                       if (l_pdx + l_level_no < 32) {
-+                               *p_dx_min = opj_uint_min(*p_dx_min, l_img_comp->dx * (1u << (l_pdx + l_level_no)));
-+                       }
-+                       if (l_pdy + l_level_no < 32) {
-+                               *p_dy_min = opj_uint_min(*p_dy_min, l_img_comp->dy * (1u << (l_pdy + l_level_no)));
-+                       }
- 
-                        /* various calculations of extents*/
-                        l_rx0 = opj_int_ceildivpow2(l_tcx0, (OPJ_INT32)l_level_no);
diff --git a/third_party/libopenjpeg20/0031-undefined-shift-opj_bio_read.patch b/third_party/libopenjpeg20/0031-undefined-shift-opj_bio_read.patch
deleted file mode 100644
index 22188be..0000000
--- a/third_party/libopenjpeg20/0031-undefined-shift-opj_bio_read.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/third_party/libopenjpeg20/bio.c b/third_party/libopenjpeg20/bio.c
-index e4edb3724..e51d0e2b4 100644
---- a/third_party/libopenjpeg20/bio.c
-+++ b/third_party/libopenjpeg20/bio.c
-@@ -162,6 +162,8 @@ OPJ_UINT32 opj_bio_read(opj_bio_t *bio, OPJ_UINT32 n) {
-        OPJ_UINT32 i;
-     OPJ_UINT32 v;
-        v = 0;
-+       if (n > 32)
-+               n = 32;
-        for (i = n - 1; i < n; i--) {
-                v += opj_bio_getbit(bio) << i;
-        }
diff --git a/third_party/libopenjpeg20/0032-undefined-shift-opj_j2k_read_siz.patch b/third_party/libopenjpeg20/0032-undefined-shift-opj_j2k_read_siz.patch
deleted file mode 100644
index f89025f..0000000
--- a/third_party/libopenjpeg20/0032-undefined-shift-opj_j2k_read_siz.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c
-index cb5a28373..9e35de186 100644
---- a/third_party/libopenjpeg20/j2k.c
-+++ b/third_party/libopenjpeg20/j2k.c
-@@ -2121,9 +2121,9 @@ static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k,
-                                   i, l_img_comp->dx, l_img_comp->dy);
-                     return OPJ_FALSE;
-                 }
--                if( l_img_comp->prec > 38) { /* TODO openjpeg won't handle more than ? */
-+                if( l_img_comp->prec > 31) { /* TODO openjpeg won't handle more than ? */
-                     opj_event_msg(p_manager, EVT_ERROR,
--                                  "Invalid values for comp = %d : prec=%u (should be between 1 and 38 according to the JPEG2000 norm)\n",
-+                                  "Invalid values for comp = %d : prec=%u (should be between 1 and 31 according to the JPEG2000 norm)\n",
-                                   i, l_img_comp->prec);
-                     return OPJ_FALSE;
-                 }
diff --git a/third_party/libopenjpeg20/0034-opj_malloc.patch b/third_party/libopenjpeg20/0034-opj_malloc.patch
new file mode 100644
index 0000000..b2bc99c
--- /dev/null
+++ b/third_party/libopenjpeg20/0034-opj_malloc.patch
@@ -0,0 +1,170 @@
+diff --git a/third_party/libopenjpeg20/opj_malloc.h b/third_party/libopenjpeg20/opj_malloc.h
+index cbc4106c7..79b3a6410 100644
+--- a/third_party/libopenjpeg20/opj_malloc.h
++++ b/third_party/libopenjpeg20/opj_malloc.h
+@@ -31,8 +31,6 @@
+  */
+ #ifndef OPJ_MALLOC_H
+ #define OPJ_MALLOC_H
+-
+-#include <stddef.h>
+ /**
+ @file opj_malloc.h
+ @brief Internal functions
+@@ -52,7 +50,16 @@ Allocate an uninitialized memory block
+ @param size Bytes to allocate
+ @return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
+ */
+-void * opj_malloc(size_t size);
++#ifdef ALLOC_PERF_OPT
++void * OPJ_CALLCONV opj_malloc(size_t size);
++#else
++/* prevent assertion on overflow for MSVC */
++#ifdef _MSC_VER
++#define opj_malloc(size) ((size_t)(size) >= (size_t)-0x100 ? NULL : malloc(size))
++#else
++#define opj_malloc(size) malloc(size)
++#endif
++#endif
+ 
+ /**
+ Allocate a memory block with elements initialized to 0
+@@ -60,24 +67,98 @@ Allocate a memory block with elements initialized to 0
+ @param sizeOfElements Bytes per block to allocate
+ @return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
+ */
+-void * opj_calloc(size_t numOfElements, size_t sizeOfElements);
++#ifdef ALLOC_PERF_OPT
++void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements);
++#else
++/* prevent assertion on overflow for MSVC */
++#ifdef _MSC_VER
++#define opj_calloc(num, size) ((size_t)(num) != 0 && (size_t)(num) >= (size_t)-0x100 / (size_t)(size) ? NULL : calloc(num, size))
++#else
++#define opj_calloc(num, size) calloc(num, size)
++#endif
++#endif
+ 
+ /**
+ Allocate memory aligned to a 16 byte boundary
+ @param size Bytes to allocate
+ @return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
+ */
+-void * opj_aligned_malloc(size_t size);
+-void * opj_aligned_realloc(void *ptr, size_t size);
+-void opj_aligned_free(void* ptr);
++/* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */
++#ifdef _WIN32
++  /* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */
++  #ifdef __GNUC__
++    #include <mm_malloc.h>
++    #define HAVE_MM_MALLOC
++  #else /* MSVC, Intel C++ */
++    #include <malloc.h>
++    #ifdef _mm_malloc
++      #define HAVE_MM_MALLOC
++    #endif
++  #endif
++#else /* Not _WIN32 */
++  #if defined(__sun)
++    #define HAVE_MEMALIGN
++  #elif defined(__FreeBSD__)
++    #define HAVE_POSIX_MEMALIGN
++  /* Linux x86_64 and OSX always align allocations to 16 bytes */
++  #elif !defined(__amd64__) && !defined(__APPLE__) && !defined(_AIX)
++    #define HAVE_MEMALIGN
++    #include <malloc.h>
++  #endif
++#endif
+ 
+-/**
+-Allocate memory aligned to a 32 byte boundary
+-@param size Bytes to allocate
+-@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
+-*/
+-void * opj_aligned_32_malloc(size_t size);
+-void * opj_aligned_32_realloc(void *ptr, size_t size);
++#define opj_aligned_malloc(size) malloc(size)
++#define opj_aligned_32_malloc(size) malloc(size)
++#define opj_aligned_free(m) free(m)
++
++#ifdef HAVE_MM_MALLOC
++  #undef opj_aligned_malloc
++  #define opj_aligned_malloc(size) _mm_malloc((size), 16)
++  #undef opj_aligned_32_malloc
++  #define opj_aligned_32_malloc(size) _mm_malloc((size), 32)
++  #undef opj_aligned_free
++  #define opj_aligned_free(m) _mm_free(m)
++#endif
++
++#ifdef HAVE_MEMALIGN
++  extern void* memalign(size_t, size_t);
++  #undef opj_aligned_malloc
++  #define opj_aligned_malloc(size) memalign(16, (size))
++  #undef opj_aligned_32_malloc
++  #define opj_aligned_32_malloc(size) memalign(32, (size))
++  #undef opj_aligned_free
++  #define opj_aligned_free(m) free(m)
++#endif
++
++#ifdef HAVE_POSIX_MEMALIGN
++  #undef opj_aligned_malloc
++  extern int posix_memalign(void**, size_t, size_t);
++
++  static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){
++    void* mem = NULL;
++    posix_memalign(&mem, 16, size);
++    return mem;
++  }
++
++  #undef opj_aligned_32_malloc
++  static INLINE void* __attribute__ ((malloc)) opj_aligned_32_malloc(size_t size){
++    void* mem = NULL;
++    posix_memalign(&mem, 32, size);
++    return mem;
++  }
++
++  #undef opj_aligned_free
++  #define opj_aligned_free(m) free(m)
++#endif
++
++#ifdef ALLOC_PERF_OPT
++  #undef opj_aligned_malloc
++  #define opj_aligned_malloc(size) opj_malloc(size)
++  #undef opj_aligned_32_malloc
++  #define opj_aligned_32_malloc(size) opj_malloc(size)
++  #undef opj_aligned_free
++  #define opj_aligned_free(m) opj_free(m)
++#endif
+ 
+ /**
+ Reallocate memory blocks.
+@@ -85,13 +166,26 @@ Reallocate memory blocks.
+ @param s New size in bytes
+ @return Returns a void pointer to the reallocated (and possibly moved) memory block
+ */
+-void * opj_realloc(void * m, size_t s);
++#ifdef ALLOC_PERF_OPT
++void * OPJ_CALLCONV opj_realloc(void * m, size_t s);
++#else
++/* prevent assertion on overflow for MSVC */
++#ifdef _MSC_VER
++#define opj_realloc(m, s) ((size_t)(s) >= (size_t)-0x100 ? NULL : realloc(m, s))
++#else
++#define opj_realloc(m, s) realloc(m, s)
++#endif
++#endif
+ 
+ /**
+ Deallocates or frees a memory block.
+ @param m Previously allocated memory block to be freed
+ */
+-void opj_free(void * m);
++#ifdef ALLOC_PERF_OPT
++void OPJ_CALLCONV opj_free(void * m);
++#else
++#define opj_free(m) free(m)
++#endif
+ 
+ #if defined(__GNUC__) && !defined(OPJ_SKIP_POISON)
+ #pragma GCC poison malloc calloc realloc free
diff --git a/third_party/libopenjpeg20/README.pdfium b/third_party/libopenjpeg20/README.pdfium
index a90f28b..143ca0f 100644
--- a/third_party/libopenjpeg20/README.pdfium
+++ b/third_party/libopenjpeg20/README.pdfium
@@ -1,6 +1,6 @@
 Name: OpenJPEG
 URL: http://www.openjpeg.org/
-Version: 0fa5a17c98c4b8f9ee2286f4f0a50cf52a5fccb0
+Version: 2.2.0 (also update in opj_config*)
 Security Critical: yes
 License: 2-clause BSD
 
@@ -10,37 +10,20 @@
 Local Modifications:
 
 0000-use-colorspace.patch: Makes it possible to not call opj_jp2_apply_pclr().
-0001-image-data.patch: Fix a crasher in opj_j2k_update_image_data().
-0002-packet-iterator.patch: Fix integer overflow in opj_pi_create_decode().
 0003-dwt-decode.patch: Check array bounds for opj_dwt_decode_1() and friends.
-0004-j2k_read_mcc.patch: Move incrementing of l_tcp->m_nb_mcc_records to the right place.
 0005-jp2_apply_pclr.patch: Fix out of bounds access.
 0006-tcd_init_tile.patch: Fix a divide by zero bug in opj_tcd_init_tile().
 0007-jp2_read_cmap.patch: Fix wrong rendering on greyscale images with index colorspace.
-0008-jp2_check_color.patch: Replace an assertion with returning false.
 0009-opj_pi_next.patch: Fix potential bad precno value in opj_pi_next* functions.
-0010-pi_update_decode_poc.patch: Set proper upper bound for an array in opj_pi_update_decode_poc().
 0011-j2k_update_image_data.patch: Prevent bad signed -> unsigned casting.
 0012-mct_sse.patch: Don't use SSE intrinsics in 32-bit builds.
-0013-attrib_fix.patch: Don't needlessly redefine __attribute__, https://github.com/uclouvain/openjpeg/issues/727
 0014-opj_jp2_read_ihdr_leak.patch: Memory leak in opj_jp2_read_ihdr().
 0015-read_SPCod_SPCoc_overflow.patch: Prevent a buffer overflow in opj_j2k_read_SPCod_SPCoc.
 0016-read_SQcd_SQcc_overflow.patch: Prevent a buffer overflow in opj_j2k_read_SQcd_SQcc.
-0017-tcd_init_tile.patch: Prevent integer overflows during calculation of |l_nb_precinct_size|.
-0018-tcd_get_decoded_tile_size.patch: Fix an integer overflow in opj_tcd_get_decoded_tile_size.
 0019-tcd_init_tile.patch: Prevent integer overflows during calculation of |l_nb_code_blocks_size|.
-0020-opj_aligned_malloc.patch: Prevent overflows when using opj_aligned_malloc().
-0021-tcd_init_tile_negative.patch: Prevent negative x, y values in opj_tcd_init_tile.
 0022-jp2_apply_pclr_overflow.patch: Prevent integer overflow in opj_jp2_apply_pclr.
 0023-opj_j2k_read_mct_records.patch: Fix opj_j2k_read to prevent heap-use-after-free.
-0024-l_marker_size_check.patch: Return error before overflow in opj_j2k_read_header_procedure.
 0025-opj_j2k_add_mct_null_data.patch: Check m_data != null before trying to read from it.
 0026-use_opj_uint_ceildiv.patch: Remove (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)a, (OPJ_INT32) b).
-0027-undefined-shift-opj_t1_decode_cblk.patch: upstream fix for a ubsan bug.
-0028-upstream-check-size-in-opj_j2k_read_siz.patch: upstream patch in j2k.c.
-0029-avoid-division-by-0: fix some /0 and %0 in pi.c (caused by bad shifts).
-0030-undefined-shift-opj_get_all_encoding_parameters.patch: fix undefined shift in pi.c method.
-0031-undefined-shift-opj_bio_read.patch: fix undefined shift in bio.c method.
-0032-undefined-shift-opj_j2k_read_siz.patch: fix undefined shift in j2k.c method.
 0033-undefined-shift-opj_t1_dec_clnpass.patch: fix undefined shifts originated from opj_t1_decode_cblk.
-TODO(thestig): List all the other patches.
+0034-opj_malloc.patch: PDFium changes in opj_malloc.
diff --git a/third_party/libopenjpeg20/bio.c b/third_party/libopenjpeg20/bio.c
index e51d0e2..09dcd7f 100644
--- a/third_party/libopenjpeg20/bio.c
+++ b/third_party/libopenjpeg20/bio.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,7 +8,7 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
@@ -72,122 +72,146 @@
 
 /*@}*/
 
-/* 
+/*
 ==========================================================
    local functions
 ==========================================================
 */
 
-static OPJ_BOOL opj_bio_byteout(opj_bio_t *bio) {
-	bio->buf = (bio->buf << 8) & 0xffff;
-	bio->ct = bio->buf == 0xff00 ? 7 : 8;
-	if ((OPJ_SIZE_T)bio->bp >= (OPJ_SIZE_T)bio->end) {
-		return OPJ_FALSE;
-	}
-	*bio->bp++ = (OPJ_BYTE)(bio->buf >> 8);
-	return OPJ_TRUE;
+static OPJ_BOOL opj_bio_byteout(opj_bio_t *bio)
+{
+    bio->buf = (bio->buf << 8) & 0xffff;
+    bio->ct = bio->buf == 0xff00 ? 7 : 8;
+    if ((OPJ_SIZE_T)bio->bp >= (OPJ_SIZE_T)bio->end) {
+        return OPJ_FALSE;
+    }
+    *bio->bp++ = (OPJ_BYTE)(bio->buf >> 8);
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_bio_bytein(opj_bio_t *bio) {
-	bio->buf = (bio->buf << 8) & 0xffff;
-	bio->ct = bio->buf == 0xff00 ? 7 : 8;
-	if ((OPJ_SIZE_T)bio->bp >= (OPJ_SIZE_T)bio->end) {
-		return OPJ_FALSE;
-	}
-	bio->buf |= *bio->bp++;
-	return OPJ_TRUE;
+static OPJ_BOOL opj_bio_bytein(opj_bio_t *bio)
+{
+    bio->buf = (bio->buf << 8) & 0xffff;
+    bio->ct = bio->buf == 0xff00 ? 7 : 8;
+    if ((OPJ_SIZE_T)bio->bp >= (OPJ_SIZE_T)bio->end) {
+        return OPJ_FALSE;
+    }
+    bio->buf |= *bio->bp++;
+    return OPJ_TRUE;
 }
 
-static void opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b) {
-	if (bio->ct == 0) {
-		opj_bio_byteout(bio); /* MSD: why not check the return value of this function ? */
-	}
-	bio->ct--;
-	bio->buf |= b << bio->ct;
+static void opj_bio_putbit(opj_bio_t *bio, OPJ_UINT32 b)
+{
+    if (bio->ct == 0) {
+        opj_bio_byteout(
+            bio); /* MSD: why not check the return value of this function ? */
+    }
+    bio->ct--;
+    bio->buf |= b << bio->ct;
 }
 
-static OPJ_UINT32 opj_bio_getbit(opj_bio_t *bio) {
-	if (bio->ct == 0) {
-		opj_bio_bytein(bio); /* MSD: why not check the return value of this function ? */
-	}
-	bio->ct--;
-	return (bio->buf >> bio->ct) & 1;
+static OPJ_UINT32 opj_bio_getbit(opj_bio_t *bio)
+{
+    if (bio->ct == 0) {
+        opj_bio_bytein(
+            bio); /* MSD: why not check the return value of this function ? */
+    }
+    bio->ct--;
+    return (bio->buf >> bio->ct) & 1;
 }
 
-/* 
+/*
 ==========================================================
    Bit Input/Output interface
 ==========================================================
 */
 
-opj_bio_t* opj_bio_create(void) {
-	opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
-	return bio;
+opj_bio_t* opj_bio_create(void)
+{
+    opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
+    return bio;
 }
 
-void opj_bio_destroy(opj_bio_t *bio) {
-	if(bio) {
-		opj_free(bio);
-	}
+void opj_bio_destroy(opj_bio_t *bio)
+{
+    if (bio) {
+        opj_free(bio);
+    }
 }
 
-ptrdiff_t opj_bio_numbytes(opj_bio_t *bio) {
-	return (bio->bp - bio->start);
+ptrdiff_t opj_bio_numbytes(opj_bio_t *bio)
+{
+    return (bio->bp - bio->start);
 }
 
-void opj_bio_init_enc(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) {
-	bio->start = bp;
-	bio->end = bp + len;
-	bio->bp = bp;
-	bio->buf = 0;
-	bio->ct = 8;
+void opj_bio_init_enc(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len)
+{
+    bio->start = bp;
+    bio->end = bp + len;
+    bio->bp = bp;
+    bio->buf = 0;
+    bio->ct = 8;
 }
 
-void opj_bio_init_dec(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len) {
-	bio->start = bp;
-	bio->end = bp + len;
-	bio->bp = bp;
-	bio->buf = 0;
-	bio->ct = 0;
+void opj_bio_init_dec(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len)
+{
+    bio->start = bp;
+    bio->end = bp + len;
+    bio->bp = bp;
+    bio->buf = 0;
+    bio->ct = 0;
 }
 
-void opj_bio_write(opj_bio_t *bio, OPJ_UINT32 v, OPJ_UINT32 n) {
-	OPJ_UINT32 i;
-	for (i = n - 1; i < n; i--) {
-		opj_bio_putbit(bio, (v >> i) & 1);
-	}
+void opj_bio_write(opj_bio_t *bio, OPJ_UINT32 v, OPJ_UINT32 n)
+{
+    OPJ_INT32 i;
+
+    assert((n > 0U) && (n <= 32U));
+    for (i = (OPJ_INT32)n - 1; i >= 0; i--) {
+        opj_bio_putbit(bio, (v >> i) & 1);
+    }
 }
 
-OPJ_UINT32 opj_bio_read(opj_bio_t *bio, OPJ_UINT32 n) {
-	OPJ_UINT32 i;
+OPJ_UINT32 opj_bio_read(opj_bio_t *bio, OPJ_UINT32 n)
+{
+    OPJ_INT32 i;
     OPJ_UINT32 v;
-	v = 0;
-	if (n > 32)
-		n = 32;
-	for (i = n - 1; i < n; i--) {
-		v += opj_bio_getbit(bio) << i;
-	}
-	return v;
+
+    assert((n > 0U) /* && (n <= 32U)*/);
+#ifdef OPJ_UBSAN_BUILD
+    /* This assert fails for some corrupted images which are gracefully rejected */
+    /* Add this assert only for ubsan build. */
+    /* This is the condition for overflow not to occur below which is needed because of OPJ_NOSANITIZE */
+    assert(n <= 32U);
+#endif
+    v = 0U;
+    for (i = (OPJ_INT32)n - 1; i >= 0; i--) {
+        v |= opj_bio_getbit(bio) <<
+             i; /* can't overflow, opj_bio_getbit returns 0 or 1 */
+    }
+    return v;
 }
 
-OPJ_BOOL opj_bio_flush(opj_bio_t *bio) {
-	if (! opj_bio_byteout(bio)) {
-		return OPJ_FALSE;
-	}
-	if (bio->ct == 7) {
-		if (! opj_bio_byteout(bio)) {
-			return OPJ_FALSE;
-		}
-	}
-	return OPJ_TRUE;
+OPJ_BOOL opj_bio_flush(opj_bio_t *bio)
+{
+    if (! opj_bio_byteout(bio)) {
+        return OPJ_FALSE;
+    }
+    if (bio->ct == 7) {
+        if (! opj_bio_byteout(bio)) {
+            return OPJ_FALSE;
+        }
+    }
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_bio_inalign(opj_bio_t *bio) {
-	if ((bio->buf & 0xff) == 0xff) {
-		if (! opj_bio_bytein(bio)) {
-			return OPJ_FALSE;
-		}
-	}
-	bio->ct = 0;
-	return OPJ_TRUE;
+OPJ_BOOL opj_bio_inalign(opj_bio_t *bio)
+{
+    if ((bio->buf & 0xff) == 0xff) {
+        if (! opj_bio_bytein(bio)) {
+            return OPJ_FALSE;
+        }
+    }
+    bio->ct = 0;
+    return OPJ_TRUE;
 }
diff --git a/third_party/libopenjpeg20/bio.h b/third_party/libopenjpeg20/bio.h
index fba2428..448fdda 100644
--- a/third_party/libopenjpeg20/bio.h
+++ b/third_party/libopenjpeg20/bio.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,7 +8,7 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
@@ -35,12 +35,12 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef __BIO_H
-#define __BIO_H
+#ifndef OPJ_BIO_H
+#define OPJ_BIO_H
 
 #include <stddef.h> /* ptrdiff_t */
 
-/** 
+/**
 @file bio.h
 @brief Implementation of an individual bit input-output (BIO)
 
@@ -54,23 +54,23 @@
 Individual bit input-output stream (BIO)
 */
 typedef struct opj_bio {
-	/** pointer to the start of the buffer */
-	OPJ_BYTE *start;
-	/** pointer to the end of the buffer */
-	OPJ_BYTE *end;
-	/** pointer to the present position in the buffer */
-	OPJ_BYTE *bp;
-	/** temporary place where each byte is read or written */
-	OPJ_UINT32 buf;
-	/** coder : number of bits free to write. decoder : number of bits read */
-	OPJ_UINT32 ct;
+    /** pointer to the start of the buffer */
+    OPJ_BYTE *start;
+    /** pointer to the end of the buffer */
+    OPJ_BYTE *end;
+    /** pointer to the present position in the buffer */
+    OPJ_BYTE *bp;
+    /** temporary place where each byte is read or written */
+    OPJ_UINT32 buf;
+    /** coder : number of bits free to write. decoder : number of bits read */
+    OPJ_UINT32 ct;
 } opj_bio_t;
 
 /** @name Exported functions */
 /*@{*/
 /* ----------------------------------------------------------------------- */
 /**
-Create a new BIO handle 
+Create a new BIO handle
 @return Returns a new BIO handle if successful, returns NULL otherwise
 */
 opj_bio_t* opj_bio_create(void);
@@ -89,14 +89,14 @@
 Init encoder
 @param bio BIO handle
 @param bp Output buffer
-@param len Output buffer length 
+@param len Output buffer length
 */
 void opj_bio_init_enc(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len);
 /**
 Init decoder
 @param bio BIO handle
 @param bp Input buffer
-@param len Input buffer length 
+@param len Input buffer length
 */
 void opj_bio_init_dec(opj_bio_t *bio, OPJ_BYTE *bp, OPJ_UINT32 len);
 /**
@@ -109,7 +109,7 @@
 /**
 Read bits
 @param bio BIO handle
-@param n Number of bits to read 
+@param n Number of bits to read
 @return Returns the corresponding read number
 */
 OPJ_UINT32 opj_bio_read(opj_bio_t *bio, OPJ_UINT32 n);
@@ -130,5 +130,5 @@
 
 /*@}*/
 
-#endif /* __BIO_H */
+#endif /* OPJ_BIO_H */
 
diff --git a/third_party/libopenjpeg20/cio.c b/third_party/libopenjpeg20/cio.c
index b2f6405..4fde9fe 100644
--- a/third_party/libopenjpeg20/cio.c
+++ b/third_party/libopenjpeg20/cio.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,10 +8,10 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -44,601 +44,640 @@
 
 /* ----------------------------------------------------------------------- */
 
-void opj_write_bytes_BE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes)
+void opj_write_bytes_BE(OPJ_BYTE * p_buffer, OPJ_UINT32 p_value,
+                        OPJ_UINT32 p_nb_bytes)
 {
-	const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value)+sizeof(OPJ_UINT32)-p_nb_bytes;
+    const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + sizeof(
+                                      OPJ_UINT32) - p_nb_bytes;
 
-	assert(p_nb_bytes > 0 && p_nb_bytes <=  sizeof(OPJ_UINT32));
+    assert(p_nb_bytes > 0 && p_nb_bytes <=  sizeof(OPJ_UINT32));
 
-	memcpy(p_buffer,l_data_ptr,p_nb_bytes);
+    memcpy(p_buffer, l_data_ptr, p_nb_bytes);
 }
 
-void opj_write_bytes_LE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes)
+void opj_write_bytes_LE(OPJ_BYTE * p_buffer, OPJ_UINT32 p_value,
+                        OPJ_UINT32 p_nb_bytes)
 {
-	const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + p_nb_bytes - 1;
-	OPJ_UINT32 i;
+    const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + p_nb_bytes - 1;
+    OPJ_UINT32 i;
 
-	assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
+    assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
 
-	for	(i=0;i<p_nb_bytes;++i) {
-		*(p_buffer++) = *(l_data_ptr--);
-	}
+    for (i = 0; i < p_nb_bytes; ++i) {
+        *(p_buffer++) = *(l_data_ptr--);
+    }
 }
 
-void opj_read_bytes_BE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes)
+void opj_read_bytes_BE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value,
+                       OPJ_UINT32 p_nb_bytes)
 {
-	OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
+    OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
 
-	assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
+    assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
 
-	*p_value = 0;
-	memcpy(l_data_ptr+sizeof(OPJ_UINT32)-p_nb_bytes,p_buffer,p_nb_bytes);
+    *p_value = 0;
+    memcpy(l_data_ptr + sizeof(OPJ_UINT32) - p_nb_bytes, p_buffer, p_nb_bytes);
 }
 
-void opj_read_bytes_LE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes)
+void opj_read_bytes_LE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value,
+                       OPJ_UINT32 p_nb_bytes)
 {
-	OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + p_nb_bytes-1;
-	OPJ_UINT32 i;
+    OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + p_nb_bytes - 1;
+    OPJ_UINT32 i;
 
-	assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
+    assert(p_nb_bytes > 0 && p_nb_bytes <= sizeof(OPJ_UINT32));
 
-	*p_value = 0;
-	for (i=0;i<p_nb_bytes;++i) {
-		*(l_data_ptr--) = *(p_buffer++);
-	}
+    *p_value = 0;
+    for (i = 0; i < p_nb_bytes; ++i) {
+        *(l_data_ptr--) = *(p_buffer++);
+    }
 }
 
 void opj_write_double_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value)
 {
-	const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value);
-	memcpy(p_buffer,l_data_ptr,sizeof(OPJ_FLOAT64));
+    const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value);
+    memcpy(p_buffer, l_data_ptr, sizeof(OPJ_FLOAT64));
 }
 
 void opj_write_double_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value)
 {
-	const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + sizeof(OPJ_FLOAT64) - 1;
-	OPJ_UINT32 i;
-	for	(i=0;i<sizeof(OPJ_FLOAT64);++i) {
-		*(p_buffer++) = *(l_data_ptr--);
-	}
+    const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + sizeof(
+                                      OPJ_FLOAT64) - 1;
+    OPJ_UINT32 i;
+    for (i = 0; i < sizeof(OPJ_FLOAT64); ++i) {
+        *(p_buffer++) = *(l_data_ptr--);
+    }
 }
 
 void opj_read_double_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value)
 {
-	OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
-	memcpy(l_data_ptr,p_buffer,sizeof(OPJ_FLOAT64));
+    OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
+    memcpy(l_data_ptr, p_buffer, sizeof(OPJ_FLOAT64));
 }
 
 void opj_read_double_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value)
 {
-	OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + sizeof(OPJ_FLOAT64)-1;
-	OPJ_UINT32 i;
-	for (i=0;i<sizeof(OPJ_FLOAT64);++i) {
-		*(l_data_ptr--) = *(p_buffer++);
-	}
+    OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + sizeof(OPJ_FLOAT64) - 1;
+    OPJ_UINT32 i;
+    for (i = 0; i < sizeof(OPJ_FLOAT64); ++i) {
+        *(l_data_ptr--) = *(p_buffer++);
+    }
 }
 
 void opj_write_float_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value)
 {
-	const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value);
-	memcpy(p_buffer,l_data_ptr,sizeof(OPJ_FLOAT32));
+    const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value);
+    memcpy(p_buffer, l_data_ptr, sizeof(OPJ_FLOAT32));
 }
 
 void opj_write_float_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value)
 {
-	const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + sizeof(OPJ_FLOAT32) - 1;
-	OPJ_UINT32 i;
-	for	(i=0;i<sizeof(OPJ_FLOAT32);++i) {
-		*(p_buffer++) = *(l_data_ptr--);
-	}
+    const OPJ_BYTE * l_data_ptr = ((const OPJ_BYTE *) &p_value) + sizeof(
+                                      OPJ_FLOAT32) - 1;
+    OPJ_UINT32 i;
+    for (i = 0; i < sizeof(OPJ_FLOAT32); ++i) {
+        *(p_buffer++) = *(l_data_ptr--);
+    }
 }
 
 void opj_read_float_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value)
 {
-	OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
-	memcpy(l_data_ptr,p_buffer,sizeof(OPJ_FLOAT32));
+    OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value);
+    memcpy(l_data_ptr, p_buffer, sizeof(OPJ_FLOAT32));
 }
 
 void opj_read_float_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value)
 {
-	OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + sizeof(OPJ_FLOAT32)-1;
-	OPJ_UINT32 i;
-	for	(i=0;i<sizeof(OPJ_FLOAT32);++i) {
-		*(l_data_ptr--) = *(p_buffer++);
-	}
+    OPJ_BYTE * l_data_ptr = ((OPJ_BYTE *) p_value) + sizeof(OPJ_FLOAT32) - 1;
+    OPJ_UINT32 i;
+    for (i = 0; i < sizeof(OPJ_FLOAT32); ++i) {
+        *(l_data_ptr--) = *(p_buffer++);
+    }
 }
 
-opj_stream_t* OPJ_CALLCONV opj_stream_create(OPJ_SIZE_T p_buffer_size,OPJ_BOOL l_is_input)
+opj_stream_t* OPJ_CALLCONV opj_stream_create(OPJ_SIZE_T p_buffer_size,
+        OPJ_BOOL l_is_input)
 {
-	opj_stream_private_t * l_stream = 00;
-	l_stream = (opj_stream_private_t*) opj_calloc(1,sizeof(opj_stream_private_t));
-	if (! l_stream) {
-		return 00;
-	}
+    opj_stream_private_t * l_stream = 00;
+    l_stream = (opj_stream_private_t*) opj_calloc(1, sizeof(opj_stream_private_t));
+    if (! l_stream) {
+        return 00;
+    }
 
-	l_stream->m_buffer_size = p_buffer_size;
-	l_stream->m_stored_data = (OPJ_BYTE *) opj_malloc(p_buffer_size);
-	if (! l_stream->m_stored_data) {
-		opj_free(l_stream);
-		return 00;
-	}
+    l_stream->m_buffer_size = p_buffer_size;
+    l_stream->m_stored_data = (OPJ_BYTE *) opj_malloc(p_buffer_size);
+    if (! l_stream->m_stored_data) {
+        opj_free(l_stream);
+        return 00;
+    }
 
-	l_stream->m_current_data = l_stream->m_stored_data;
+    l_stream->m_current_data = l_stream->m_stored_data;
 
-	if (l_is_input) {
-		l_stream->m_status |= opj_stream_e_input;
-		l_stream->m_opj_skip = opj_stream_read_skip;
-		l_stream->m_opj_seek = opj_stream_read_seek;
-	}
-	else {
-		l_stream->m_status |= opj_stream_e_output;
-		l_stream->m_opj_skip = opj_stream_write_skip;
-		l_stream->m_opj_seek = opj_stream_write_seek;
-	}
+    if (l_is_input) {
+        l_stream->m_status |= OPJ_STREAM_STATUS_INPUT;
+        l_stream->m_opj_skip = opj_stream_read_skip;
+        l_stream->m_opj_seek = opj_stream_read_seek;
+    } else {
+        l_stream->m_status |= OPJ_STREAM_STATUS_OUTPUT;
+        l_stream->m_opj_skip = opj_stream_write_skip;
+        l_stream->m_opj_seek = opj_stream_write_seek;
+    }
 
-	l_stream->m_read_fn = opj_stream_default_read;
-	l_stream->m_write_fn = opj_stream_default_write;
-	l_stream->m_skip_fn = opj_stream_default_skip;
-	l_stream->m_seek_fn = opj_stream_default_seek;
+    l_stream->m_read_fn = opj_stream_default_read;
+    l_stream->m_write_fn = opj_stream_default_write;
+    l_stream->m_skip_fn = opj_stream_default_skip;
+    l_stream->m_seek_fn = opj_stream_default_seek;
 
-	return (opj_stream_t *) l_stream;
+    return (opj_stream_t *) l_stream;
 }
 
 opj_stream_t* OPJ_CALLCONV opj_stream_default_create(OPJ_BOOL l_is_input)
 {
-	return opj_stream_create(OPJ_J2K_STREAM_CHUNK_SIZE,l_is_input);
+    return opj_stream_create(OPJ_J2K_STREAM_CHUNK_SIZE, l_is_input);
 }
 
 void OPJ_CALLCONV opj_stream_destroy(opj_stream_t* p_stream)
 {
-	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
-	
-	if (l_stream) {
-		if (l_stream->m_free_user_data_fn) {
-			l_stream->m_free_user_data_fn(l_stream->m_user_data);
-		}
-		opj_free(l_stream->m_stored_data);
-		l_stream->m_stored_data = 00;
-		opj_free(l_stream);
-	}
+    opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+
+    if (l_stream) {
+        if (l_stream->m_free_user_data_fn) {
+            l_stream->m_free_user_data_fn(l_stream->m_user_data);
+        }
+        opj_free(l_stream->m_stored_data);
+        l_stream->m_stored_data = 00;
+        opj_free(l_stream);
+    }
 }
 
-void OPJ_CALLCONV opj_stream_set_read_function(opj_stream_t* p_stream, opj_stream_read_fn p_function)
+void OPJ_CALLCONV opj_stream_set_read_function(opj_stream_t* p_stream,
+        opj_stream_read_fn p_function)
 {
-	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+    opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
 
-	if ((!l_stream) || (! (l_stream->m_status & opj_stream_e_input))) {
-		return;
-	}
+    if ((!l_stream) || (!(l_stream->m_status & OPJ_STREAM_STATUS_INPUT))) {
+        return;
+    }
 
-	l_stream->m_read_fn = p_function;
+    l_stream->m_read_fn = p_function;
 }
 
-void OPJ_CALLCONV opj_stream_set_seek_function(opj_stream_t* p_stream, opj_stream_seek_fn p_function)
+void OPJ_CALLCONV opj_stream_set_seek_function(opj_stream_t* p_stream,
+        opj_stream_seek_fn p_function)
 {
-	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
-	
-	if (!l_stream) {
-		return;
-	}
-	l_stream->m_seek_fn = p_function;
+    opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+
+    if (!l_stream) {
+        return;
+    }
+    l_stream->m_seek_fn = p_function;
 }
 
-void OPJ_CALLCONV opj_stream_set_write_function(opj_stream_t* p_stream, opj_stream_write_fn p_function)
+void OPJ_CALLCONV opj_stream_set_write_function(opj_stream_t* p_stream,
+        opj_stream_write_fn p_function)
 {
-	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
-	
-	if ((!l_stream )|| (! (l_stream->m_status & opj_stream_e_output))) {
-		return;
-	}
+    opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
 
-	l_stream->m_write_fn = p_function;
+    if ((!l_stream) || (!(l_stream->m_status & OPJ_STREAM_STATUS_OUTPUT))) {
+        return;
+    }
+
+    l_stream->m_write_fn = p_function;
 }
 
-void OPJ_CALLCONV opj_stream_set_skip_function(opj_stream_t* p_stream, opj_stream_skip_fn p_function)
+void OPJ_CALLCONV opj_stream_set_skip_function(opj_stream_t* p_stream,
+        opj_stream_skip_fn p_function)
 {
-	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
-	
-	if (! l_stream) {
-		return;
-	}
+    opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
 
-	l_stream->m_skip_fn = p_function;
+    if (! l_stream) {
+        return;
+    }
+
+    l_stream->m_skip_fn = p_function;
 }
 
-void OPJ_CALLCONV opj_stream_set_user_data(opj_stream_t* p_stream, void * p_data, opj_stream_free_user_data_fn p_function)
+void OPJ_CALLCONV opj_stream_set_user_data(opj_stream_t* p_stream,
+        void * p_data, opj_stream_free_user_data_fn p_function)
 {
-	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
-	if (!l_stream)
-		return;
-	l_stream->m_user_data = p_data;
-  l_stream->m_free_user_data_fn = p_function;
+    opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+    if (!l_stream) {
+        return;
+    }
+    l_stream->m_user_data = p_data;
+    l_stream->m_free_user_data_fn = p_function;
 }
 
-void OPJ_CALLCONV opj_stream_set_user_data_length(opj_stream_t* p_stream, OPJ_UINT64 data_length)
+void OPJ_CALLCONV opj_stream_set_user_data_length(opj_stream_t* p_stream,
+        OPJ_UINT64 data_length)
 {
-	opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
-	if (!l_stream)
-		return;
-	l_stream->m_user_data_length = data_length;
+    opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+    if (!l_stream) {
+        return;
+    }
+    l_stream->m_user_data_length = data_length;
 }
 
-OPJ_SIZE_T opj_stream_read_data (opj_stream_private_t * p_stream,OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, opj_event_mgr_t * p_event_mgr)
+OPJ_SIZE_T opj_stream_read_data(opj_stream_private_t * p_stream,
+                                OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, opj_event_mgr_t * p_event_mgr)
 {
-	OPJ_SIZE_T l_read_nb_bytes = 0;
-	if (p_stream->m_bytes_in_buffer >= p_size) {
-		memcpy(p_buffer,p_stream->m_current_data,p_size);
-		p_stream->m_current_data += p_size;
-		p_stream->m_bytes_in_buffer -= p_size;
-		l_read_nb_bytes += p_size;
-		p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
-		return l_read_nb_bytes;
-	}
+    OPJ_SIZE_T l_read_nb_bytes = 0;
+    if (p_stream->m_bytes_in_buffer >= p_size) {
+        memcpy(p_buffer, p_stream->m_current_data, p_size);
+        p_stream->m_current_data += p_size;
+        p_stream->m_bytes_in_buffer -= p_size;
+        l_read_nb_bytes += p_size;
+        p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
+        return l_read_nb_bytes;
+    }
 
-	/* we are now in the case when the remaining data if not sufficient */
-	if (p_stream->m_status & opj_stream_e_end) {
-		l_read_nb_bytes += p_stream->m_bytes_in_buffer;
-		memcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);
-		p_stream->m_current_data += p_stream->m_bytes_in_buffer;
-		p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
-		p_stream->m_bytes_in_buffer = 0;
-		return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;
-	}
+    /* we are now in the case when the remaining data if not sufficient */
+    if (p_stream->m_status & OPJ_STREAM_STATUS_END) {
+        l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+        memcpy(p_buffer, p_stream->m_current_data, p_stream->m_bytes_in_buffer);
+        p_stream->m_current_data += p_stream->m_bytes_in_buffer;
+        p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+        p_stream->m_bytes_in_buffer = 0;
+        return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T) - 1;
+    }
 
-	/* the flag is not set, we copy data and then do an actual read on the stream */
-	if (p_stream->m_bytes_in_buffer) {
-		l_read_nb_bytes += p_stream->m_bytes_in_buffer;
-		memcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);
-		p_stream->m_current_data = p_stream->m_stored_data;
-		p_buffer += p_stream->m_bytes_in_buffer;
-		p_size -= p_stream->m_bytes_in_buffer;
-		p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
-		p_stream->m_bytes_in_buffer = 0;
-	}
-	else {
-    /* case where we are already at the end of the buffer
-       so reset the m_current_data to point to the start of the
-       stored buffer to get ready to read from disk*/
-		p_stream->m_current_data = p_stream->m_stored_data;
-	}
+    /* the flag is not set, we copy data and then do an actual read on the stream */
+    if (p_stream->m_bytes_in_buffer) {
+        l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+        memcpy(p_buffer, p_stream->m_current_data, p_stream->m_bytes_in_buffer);
+        p_stream->m_current_data = p_stream->m_stored_data;
+        p_buffer += p_stream->m_bytes_in_buffer;
+        p_size -= p_stream->m_bytes_in_buffer;
+        p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+        p_stream->m_bytes_in_buffer = 0;
+    } else {
+        /* case where we are already at the end of the buffer
+           so reset the m_current_data to point to the start of the
+           stored buffer to get ready to read from disk*/
+        p_stream->m_current_data = p_stream->m_stored_data;
+    }
 
-	for (;;) {
-		/* we should read less than a chunk -> read a chunk */
-		if (p_size < p_stream->m_buffer_size) {
-			/* we should do an actual read on the media */
-			p_stream->m_bytes_in_buffer = p_stream->m_read_fn(p_stream->m_stored_data,p_stream->m_buffer_size,p_stream->m_user_data);
+    for (;;) {
+        /* we should read less than a chunk -> read a chunk */
+        if (p_size < p_stream->m_buffer_size) {
+            /* we should do an actual read on the media */
+            p_stream->m_bytes_in_buffer = p_stream->m_read_fn(p_stream->m_stored_data,
+                                          p_stream->m_buffer_size, p_stream->m_user_data);
 
-			if (p_stream->m_bytes_in_buffer == (OPJ_SIZE_T)-1) {
-				/* end of stream */
-				opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
+            if (p_stream->m_bytes_in_buffer == (OPJ_SIZE_T) - 1) {
+                /* end of stream */
+                opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
 
-				p_stream->m_bytes_in_buffer = 0;
-				p_stream->m_status |= opj_stream_e_end;
-				/* end of stream */
-				return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;
-			}
-			else if	(p_stream->m_bytes_in_buffer < p_size) {
-				/* not enough data */
-				l_read_nb_bytes += p_stream->m_bytes_in_buffer;
-				memcpy(p_buffer,p_stream->m_current_data,p_stream->m_bytes_in_buffer);
-				p_stream->m_current_data = p_stream->m_stored_data;
-				p_buffer += p_stream->m_bytes_in_buffer;
-				p_size -= p_stream->m_bytes_in_buffer;
-				p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
-				p_stream->m_bytes_in_buffer = 0;
-			}
-			else {
-				l_read_nb_bytes += p_size;
-				memcpy(p_buffer,p_stream->m_current_data,p_size);
-				p_stream->m_current_data += p_size;
-				p_stream->m_bytes_in_buffer -= p_size;
-				p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
-				return l_read_nb_bytes;
-			}
-		}
-		else {
-			/* direct read on the dest buffer */
-			p_stream->m_bytes_in_buffer = p_stream->m_read_fn(p_buffer,p_size,p_stream->m_user_data);
+                p_stream->m_bytes_in_buffer = 0;
+                p_stream->m_status |= OPJ_STREAM_STATUS_END;
+                /* end of stream */
+                return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T) - 1;
+            } else if (p_stream->m_bytes_in_buffer < p_size) {
+                /* not enough data */
+                l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+                memcpy(p_buffer, p_stream->m_current_data, p_stream->m_bytes_in_buffer);
+                p_stream->m_current_data = p_stream->m_stored_data;
+                p_buffer += p_stream->m_bytes_in_buffer;
+                p_size -= p_stream->m_bytes_in_buffer;
+                p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+                p_stream->m_bytes_in_buffer = 0;
+            } else {
+                l_read_nb_bytes += p_size;
+                memcpy(p_buffer, p_stream->m_current_data, p_size);
+                p_stream->m_current_data += p_size;
+                p_stream->m_bytes_in_buffer -= p_size;
+                p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
+                return l_read_nb_bytes;
+            }
+        } else {
+            /* direct read on the dest buffer */
+            p_stream->m_bytes_in_buffer = p_stream->m_read_fn(p_buffer, p_size,
+                                          p_stream->m_user_data);
 
-			if (p_stream->m_bytes_in_buffer == (OPJ_SIZE_T)-1) {
-				/*  end of stream */
-				opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
+            if (p_stream->m_bytes_in_buffer == (OPJ_SIZE_T) - 1) {
+                /*  end of stream */
+                opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
 
-				p_stream->m_bytes_in_buffer = 0;
-				p_stream->m_status |= opj_stream_e_end;
-				/* end of stream */
-				return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T)-1;
-			}
-			else if (p_stream->m_bytes_in_buffer < p_size) {
-				/* not enough data */
-				l_read_nb_bytes += p_stream->m_bytes_in_buffer;
-				p_stream->m_current_data = p_stream->m_stored_data;
-				p_buffer += p_stream->m_bytes_in_buffer;
-				p_size -= p_stream->m_bytes_in_buffer;
-				p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
-				p_stream->m_bytes_in_buffer = 0;
-			}
-			else {
-				/* we have read the exact size */
-				l_read_nb_bytes += p_stream->m_bytes_in_buffer;
-				p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
-				p_stream->m_current_data = p_stream->m_stored_data;
-				p_stream->m_bytes_in_buffer = 0;
-				return l_read_nb_bytes;
-			}
-		}
-	}
+                p_stream->m_bytes_in_buffer = 0;
+                p_stream->m_status |= OPJ_STREAM_STATUS_END;
+                /* end of stream */
+                return l_read_nb_bytes ? l_read_nb_bytes : (OPJ_SIZE_T) - 1;
+            } else if (p_stream->m_bytes_in_buffer < p_size) {
+                /* not enough data */
+                l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+                p_stream->m_current_data = p_stream->m_stored_data;
+                p_buffer += p_stream->m_bytes_in_buffer;
+                p_size -= p_stream->m_bytes_in_buffer;
+                p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+                p_stream->m_bytes_in_buffer = 0;
+            } else {
+                /* we have read the exact size */
+                l_read_nb_bytes += p_stream->m_bytes_in_buffer;
+                p_stream->m_byte_offset += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+                p_stream->m_current_data = p_stream->m_stored_data;
+                p_stream->m_bytes_in_buffer = 0;
+                return l_read_nb_bytes;
+            }
+        }
+    }
 }
 
-OPJ_SIZE_T opj_stream_write_data (opj_stream_private_t * p_stream,
-								  const OPJ_BYTE * p_buffer,
-								  OPJ_SIZE_T p_size, 
-								  opj_event_mgr_t * p_event_mgr)
+OPJ_SIZE_T opj_stream_write_data(opj_stream_private_t * p_stream,
+                                 const OPJ_BYTE * p_buffer,
+                                 OPJ_SIZE_T p_size,
+                                 opj_event_mgr_t * p_event_mgr)
 {
-	OPJ_SIZE_T l_remaining_bytes = 0;
-	OPJ_SIZE_T l_write_nb_bytes = 0;
+    OPJ_SIZE_T l_remaining_bytes = 0;
+    OPJ_SIZE_T l_write_nb_bytes = 0;
 
-	if (p_stream->m_status & opj_stream_e_error) {
-		return (OPJ_SIZE_T)-1;
-	}
+    if (p_stream->m_status & OPJ_STREAM_STATUS_ERROR) {
+        return (OPJ_SIZE_T) - 1;
+    }
 
-	for (;;) {
-		l_remaining_bytes = p_stream->m_buffer_size - p_stream->m_bytes_in_buffer;
-		
-		/* we have more memory than required */
-		if (l_remaining_bytes >= p_size) {
-			memcpy(p_stream->m_current_data, p_buffer, p_size);
-			
-			p_stream->m_current_data += p_size;
-			p_stream->m_bytes_in_buffer += p_size;
-			l_write_nb_bytes += p_size;
-			p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
-			
-			return l_write_nb_bytes;
-		}
+    for (;;) {
+        l_remaining_bytes = p_stream->m_buffer_size - p_stream->m_bytes_in_buffer;
 
-		/* we copy data and then do an actual read on the stream */
-		if (l_remaining_bytes) {
-			l_write_nb_bytes += l_remaining_bytes;
-			
-			memcpy(p_stream->m_current_data,p_buffer,l_remaining_bytes);
-			
-			p_stream->m_current_data = p_stream->m_stored_data;
-			
-			p_buffer += l_remaining_bytes;
-			p_size -= l_remaining_bytes;
-			p_stream->m_bytes_in_buffer += l_remaining_bytes;
-			p_stream->m_byte_offset += (OPJ_OFF_T)l_remaining_bytes;
-		}
+        /* we have more memory than required */
+        if (l_remaining_bytes >= p_size) {
+            memcpy(p_stream->m_current_data, p_buffer, p_size);
 
-		if (! opj_stream_flush(p_stream, p_event_mgr)) {
-			return (OPJ_SIZE_T)-1;
-		}
-	}
+            p_stream->m_current_data += p_size;
+            p_stream->m_bytes_in_buffer += p_size;
+            l_write_nb_bytes += p_size;
+            p_stream->m_byte_offset += (OPJ_OFF_T)p_size;
+
+            return l_write_nb_bytes;
+        }
+
+        /* we copy data and then do an actual read on the stream */
+        if (l_remaining_bytes) {
+            l_write_nb_bytes += l_remaining_bytes;
+
+            memcpy(p_stream->m_current_data, p_buffer, l_remaining_bytes);
+
+            p_stream->m_current_data = p_stream->m_stored_data;
+
+            p_buffer += l_remaining_bytes;
+            p_size -= l_remaining_bytes;
+            p_stream->m_bytes_in_buffer += l_remaining_bytes;
+            p_stream->m_byte_offset += (OPJ_OFF_T)l_remaining_bytes;
+        }
+
+        if (! opj_stream_flush(p_stream, p_event_mgr)) {
+            return (OPJ_SIZE_T) - 1;
+        }
+    }
 
 }
 
-OPJ_BOOL opj_stream_flush (opj_stream_private_t * p_stream, opj_event_mgr_t * p_event_mgr)
+OPJ_BOOL opj_stream_flush(opj_stream_private_t * p_stream,
+                          opj_event_mgr_t * p_event_mgr)
 {
-	/* the number of bytes written on the media. */
-	OPJ_SIZE_T l_current_write_nb_bytes = 0;
+    /* the number of bytes written on the media. */
+    OPJ_SIZE_T l_current_write_nb_bytes = 0;
 
-	p_stream->m_current_data = p_stream->m_stored_data;
+    p_stream->m_current_data = p_stream->m_stored_data;
 
-	while (p_stream->m_bytes_in_buffer) {
-		/* we should do an actual write on the media */
-		l_current_write_nb_bytes = p_stream->m_write_fn(p_stream->m_current_data,
-														p_stream->m_bytes_in_buffer,
-														p_stream->m_user_data);
-		
-		if (l_current_write_nb_bytes == (OPJ_SIZE_T)-1) {
-			p_stream->m_status |= opj_stream_e_error;
-			opj_event_msg(p_event_mgr, EVT_INFO, "Error on writing stream!\n");
+    while (p_stream->m_bytes_in_buffer) {
+        /* we should do an actual write on the media */
+        l_current_write_nb_bytes = p_stream->m_write_fn(p_stream->m_current_data,
+                                   p_stream->m_bytes_in_buffer,
+                                   p_stream->m_user_data);
 
-			return OPJ_FALSE;
-		}
+        if (l_current_write_nb_bytes == (OPJ_SIZE_T) - 1) {
+            p_stream->m_status |= OPJ_STREAM_STATUS_ERROR;
+            opj_event_msg(p_event_mgr, EVT_INFO, "Error on writing stream!\n");
 
-		p_stream->m_current_data += l_current_write_nb_bytes;
-		p_stream->m_bytes_in_buffer -= l_current_write_nb_bytes;
-	}
+            return OPJ_FALSE;
+        }
 
-	p_stream->m_current_data = p_stream->m_stored_data;
-	
-	return OPJ_TRUE;
+        p_stream->m_current_data += l_current_write_nb_bytes;
+        p_stream->m_bytes_in_buffer -= l_current_write_nb_bytes;
+    }
+
+    p_stream->m_current_data = p_stream->m_stored_data;
+
+    return OPJ_TRUE;
 }
 
-OPJ_OFF_T opj_stream_read_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+OPJ_OFF_T opj_stream_read_skip(opj_stream_private_t * p_stream,
+                               OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
 {
-	OPJ_OFF_T l_skip_nb_bytes = 0;
-	OPJ_OFF_T l_current_skip_nb_bytes = 0;
-	
-	assert( p_size >= 0 );
-	
-	if (p_stream->m_bytes_in_buffer >= (OPJ_SIZE_T)p_size) {
-		p_stream->m_current_data += p_size;
-		/* it is safe to cast p_size to OPJ_SIZE_T since it is <= m_bytes_in_buffer
-		which is of type OPJ_SIZE_T */
-		p_stream->m_bytes_in_buffer -= (OPJ_SIZE_T)p_size;
-		l_skip_nb_bytes += p_size;
-		p_stream->m_byte_offset += l_skip_nb_bytes;
-		return l_skip_nb_bytes;
-	}
+    OPJ_OFF_T l_skip_nb_bytes = 0;
+    OPJ_OFF_T l_current_skip_nb_bytes = 0;
 
-	/* we are now in the case when the remaining data if not sufficient */
-	if (p_stream->m_status & opj_stream_e_end) {
-		l_skip_nb_bytes += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
-		p_stream->m_current_data += p_stream->m_bytes_in_buffer;
-		p_stream->m_bytes_in_buffer = 0;
-		p_stream->m_byte_offset += l_skip_nb_bytes;
-		return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) -1;
-	}
+    assert(p_size >= 0);
 
-	/* the flag is not set, we copy data and then do an actual skip on the stream */
-	if (p_stream->m_bytes_in_buffer) {
-		l_skip_nb_bytes += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
-		p_stream->m_current_data = p_stream->m_stored_data;
-		p_size -= (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
-		p_stream->m_bytes_in_buffer = 0;
-	}
+    if (p_stream->m_bytes_in_buffer >= (OPJ_SIZE_T)p_size) {
+        p_stream->m_current_data += p_size;
+        /* it is safe to cast p_size to OPJ_SIZE_T since it is <= m_bytes_in_buffer
+        which is of type OPJ_SIZE_T */
+        p_stream->m_bytes_in_buffer -= (OPJ_SIZE_T)p_size;
+        l_skip_nb_bytes += p_size;
+        p_stream->m_byte_offset += l_skip_nb_bytes;
+        return l_skip_nb_bytes;
+    }
 
-	while (p_size > 0) {
-		/* we should do an actual skip on the media */
-		l_current_skip_nb_bytes = p_stream->m_skip_fn(p_size, p_stream->m_user_data);
-		if (l_current_skip_nb_bytes == (OPJ_OFF_T) -1) {
-			opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
+    /* we are now in the case when the remaining data if not sufficient */
+    if (p_stream->m_status & OPJ_STREAM_STATUS_END) {
+        l_skip_nb_bytes += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+        p_stream->m_current_data += p_stream->m_bytes_in_buffer;
+        p_stream->m_bytes_in_buffer = 0;
+        p_stream->m_byte_offset += l_skip_nb_bytes;
+        return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) - 1;
+    }
 
-			p_stream->m_status |= opj_stream_e_end;
-			p_stream->m_byte_offset += l_skip_nb_bytes;
-			/* end if stream */
-			return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) -1;
-		}
-		p_size -= l_current_skip_nb_bytes;
-		l_skip_nb_bytes += l_current_skip_nb_bytes;
-	}
+    /* the flag is not set, we copy data and then do an actual skip on the stream */
+    if (p_stream->m_bytes_in_buffer) {
+        l_skip_nb_bytes += (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+        p_stream->m_current_data = p_stream->m_stored_data;
+        p_size -= (OPJ_OFF_T)p_stream->m_bytes_in_buffer;
+        p_stream->m_bytes_in_buffer = 0;
+    }
 
-	p_stream->m_byte_offset += l_skip_nb_bytes;
-	
-	return l_skip_nb_bytes;
+    while (p_size > 0) {
+        /* Check if we are going beyond the end of file. Most skip_fn do not */
+        /* check that, but we must be careful not to advance m_byte_offset */
+        /* beyond m_user_data_length, otherwise */
+        /* opj_stream_get_number_byte_left() will assert. */
+        if ((OPJ_UINT64)(p_stream->m_byte_offset + l_skip_nb_bytes + p_size) >
+                p_stream->m_user_data_length) {
+            opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
+
+            p_stream->m_byte_offset += l_skip_nb_bytes;
+            l_skip_nb_bytes = (OPJ_OFF_T)(p_stream->m_user_data_length -
+                                          (OPJ_UINT64)p_stream->m_byte_offset);
+
+            opj_stream_read_seek(p_stream, (OPJ_OFF_T)p_stream->m_user_data_length,
+                                 p_event_mgr);
+            p_stream->m_status |= OPJ_STREAM_STATUS_END;
+
+            /* end if stream */
+            return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) - 1;
+        }
+
+        /* we should do an actual skip on the media */
+        l_current_skip_nb_bytes = p_stream->m_skip_fn(p_size, p_stream->m_user_data);
+        if (l_current_skip_nb_bytes == (OPJ_OFF_T) - 1) {
+            opj_event_msg(p_event_mgr, EVT_INFO, "Stream reached its end !\n");
+
+            p_stream->m_status |= OPJ_STREAM_STATUS_END;
+            p_stream->m_byte_offset += l_skip_nb_bytes;
+            /* end if stream */
+            return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) - 1;
+        }
+        p_size -= l_current_skip_nb_bytes;
+        l_skip_nb_bytes += l_current_skip_nb_bytes;
+    }
+
+    p_stream->m_byte_offset += l_skip_nb_bytes;
+
+    return l_skip_nb_bytes;
 }
 
-OPJ_OFF_T opj_stream_write_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+OPJ_OFF_T opj_stream_write_skip(opj_stream_private_t * p_stream,
+                                OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
 {
-	OPJ_BOOL l_is_written = 0;
-	OPJ_OFF_T l_current_skip_nb_bytes = 0;
-	OPJ_OFF_T l_skip_nb_bytes = 0;
+    OPJ_BOOL l_is_written = 0;
+    OPJ_OFF_T l_current_skip_nb_bytes = 0;
+    OPJ_OFF_T l_skip_nb_bytes = 0;
 
-	if (p_stream->m_status & opj_stream_e_error) {
-		return (OPJ_OFF_T) -1;
-	}
+    if (p_stream->m_status & OPJ_STREAM_STATUS_ERROR) {
+        return (OPJ_OFF_T) - 1;
+    }
 
-	/* we should flush data */
-	l_is_written = opj_stream_flush (p_stream, p_event_mgr);
-	if (! l_is_written) {
-		p_stream->m_status |= opj_stream_e_error;
-		p_stream->m_bytes_in_buffer = 0;
-		return (OPJ_OFF_T) -1;
-	}
-	/* then skip */
+    /* we should flush data */
+    l_is_written = opj_stream_flush(p_stream, p_event_mgr);
+    if (! l_is_written) {
+        p_stream->m_status |= OPJ_STREAM_STATUS_ERROR;
+        p_stream->m_bytes_in_buffer = 0;
+        return (OPJ_OFF_T) - 1;
+    }
+    /* then skip */
 
-	while (p_size > 0) {
-		/* we should do an actual skip on the media */
-		l_current_skip_nb_bytes = p_stream->m_skip_fn(p_size, p_stream->m_user_data);
-		
-		if (l_current_skip_nb_bytes == (OPJ_OFF_T)-1) {
-			opj_event_msg(p_event_mgr, EVT_INFO, "Stream error!\n");
+    while (p_size > 0) {
+        /* we should do an actual skip on the media */
+        l_current_skip_nb_bytes = p_stream->m_skip_fn(p_size, p_stream->m_user_data);
 
-			p_stream->m_status |= opj_stream_e_error;
-			p_stream->m_byte_offset += l_skip_nb_bytes;
-			/* end if stream */
-			return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T)-1;
-		}
-		p_size -= l_current_skip_nb_bytes;
-		l_skip_nb_bytes += l_current_skip_nb_bytes;
-	}
+        if (l_current_skip_nb_bytes == (OPJ_OFF_T) - 1) {
+            opj_event_msg(p_event_mgr, EVT_INFO, "Stream error!\n");
 
-	p_stream->m_byte_offset += l_skip_nb_bytes;
-	
-	return l_skip_nb_bytes;
+            p_stream->m_status |= OPJ_STREAM_STATUS_ERROR;
+            p_stream->m_byte_offset += l_skip_nb_bytes;
+            /* end if stream */
+            return l_skip_nb_bytes ? l_skip_nb_bytes : (OPJ_OFF_T) - 1;
+        }
+        p_size -= l_current_skip_nb_bytes;
+        l_skip_nb_bytes += l_current_skip_nb_bytes;
+    }
+
+    p_stream->m_byte_offset += l_skip_nb_bytes;
+
+    return l_skip_nb_bytes;
 }
 
-OPJ_OFF_T opj_stream_tell (const opj_stream_private_t * p_stream)
+OPJ_OFF_T opj_stream_tell(const opj_stream_private_t * p_stream)
 {
-	return p_stream->m_byte_offset;
+    return p_stream->m_byte_offset;
 }
 
-OPJ_OFF_T opj_stream_get_number_byte_left (const opj_stream_private_t * p_stream)
+OPJ_OFF_T opj_stream_get_number_byte_left(const opj_stream_private_t * p_stream)
 {
-  assert( p_stream->m_byte_offset >= 0 );
-  assert( p_stream->m_user_data_length >= (OPJ_UINT64)p_stream->m_byte_offset);
-  return p_stream->m_user_data_length ?
-				(OPJ_OFF_T)(p_stream->m_user_data_length) - p_stream->m_byte_offset :
-				0;
+    assert(p_stream->m_byte_offset >= 0);
+    assert(p_stream->m_user_data_length >= (OPJ_UINT64)p_stream->m_byte_offset);
+    return p_stream->m_user_data_length ?
+           (OPJ_OFF_T)(p_stream->m_user_data_length) - p_stream->m_byte_offset :
+           0;
 }
 
-OPJ_OFF_T opj_stream_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+OPJ_OFF_T opj_stream_skip(opj_stream_private_t * p_stream, OPJ_OFF_T p_size,
+                          opj_event_mgr_t * p_event_mgr)
 {
-	assert(p_size >= 0);
-	return p_stream->m_opj_skip(p_stream,p_size,p_event_mgr);
+    assert(p_size >= 0);
+    return p_stream->m_opj_skip(p_stream, p_size, p_event_mgr);
 }
 
-OPJ_BOOL opj_stream_read_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+OPJ_BOOL opj_stream_read_seek(opj_stream_private_t * p_stream, OPJ_OFF_T p_size,
+                              opj_event_mgr_t * p_event_mgr)
 {
-	OPJ_ARG_NOT_USED(p_event_mgr);
-	p_stream->m_current_data = p_stream->m_stored_data;
-	p_stream->m_bytes_in_buffer = 0;
+    OPJ_ARG_NOT_USED(p_event_mgr);
+    p_stream->m_current_data = p_stream->m_stored_data;
+    p_stream->m_bytes_in_buffer = 0;
 
-	if( !(p_stream->m_seek_fn(p_size,p_stream->m_user_data)) ) {
-		p_stream->m_status |= opj_stream_e_end;
-		return OPJ_FALSE;
-	}
-	else {
-		/* reset stream status */
-		p_stream->m_status &= (~opj_stream_e_end);
-		p_stream->m_byte_offset = p_size;
+    if (!(p_stream->m_seek_fn(p_size, p_stream->m_user_data))) {
+        p_stream->m_status |= OPJ_STREAM_STATUS_END;
+        return OPJ_FALSE;
+    } else {
+        /* reset stream status */
+        p_stream->m_status &= (~OPJ_STREAM_STATUS_END);
+        p_stream->m_byte_offset = p_size;
 
-	}
+    }
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_stream_write_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
+OPJ_BOOL opj_stream_write_seek(opj_stream_private_t * p_stream,
+                               OPJ_OFF_T p_size, opj_event_mgr_t * p_event_mgr)
 {
-	if (! opj_stream_flush(p_stream,p_event_mgr)) {
-		p_stream->m_status |= opj_stream_e_error;
-		return OPJ_FALSE;
-	}
+    if (! opj_stream_flush(p_stream, p_event_mgr)) {
+        p_stream->m_status |= OPJ_STREAM_STATUS_ERROR;
+        return OPJ_FALSE;
+    }
 
-	p_stream->m_current_data = p_stream->m_stored_data;
-	p_stream->m_bytes_in_buffer = 0;
+    p_stream->m_current_data = p_stream->m_stored_data;
+    p_stream->m_bytes_in_buffer = 0;
 
-	if (! p_stream->m_seek_fn(p_size,p_stream->m_user_data)) {
-		p_stream->m_status |= opj_stream_e_error;
-		return OPJ_FALSE;
-	}
-	else {
-		p_stream->m_byte_offset = p_size;
-	}
+    if (! p_stream->m_seek_fn(p_size, p_stream->m_user_data)) {
+        p_stream->m_status |= OPJ_STREAM_STATUS_ERROR;
+        return OPJ_FALSE;
+    } else {
+        p_stream->m_byte_offset = p_size;
+    }
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_stream_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr)
+OPJ_BOOL opj_stream_seek(opj_stream_private_t * p_stream, OPJ_OFF_T p_size,
+                         struct opj_event_mgr * p_event_mgr)
 {
-	assert(p_size >= 0);
-	return p_stream->m_opj_seek(p_stream,p_size,p_event_mgr);
+    assert(p_size >= 0);
+    return p_stream->m_opj_seek(p_stream, p_size, p_event_mgr);
 }
 
-OPJ_BOOL opj_stream_has_seek (const opj_stream_private_t * p_stream)
+OPJ_BOOL opj_stream_has_seek(const opj_stream_private_t * p_stream)
 {
-	return p_stream->m_seek_fn != opj_stream_default_seek;
+    return p_stream->m_seek_fn != opj_stream_default_seek;
 }
 
-OPJ_SIZE_T opj_stream_default_read (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data)
+OPJ_SIZE_T opj_stream_default_read(void * p_buffer, OPJ_SIZE_T p_nb_bytes,
+                                   void * p_user_data)
 {
-	OPJ_ARG_NOT_USED(p_buffer);
-	OPJ_ARG_NOT_USED(p_nb_bytes);
-	OPJ_ARG_NOT_USED(p_user_data);
-	return (OPJ_SIZE_T) -1;
+    OPJ_ARG_NOT_USED(p_buffer);
+    OPJ_ARG_NOT_USED(p_nb_bytes);
+    OPJ_ARG_NOT_USED(p_user_data);
+    return (OPJ_SIZE_T) - 1;
 }
 
-OPJ_SIZE_T opj_stream_default_write (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data)
+OPJ_SIZE_T opj_stream_default_write(void * p_buffer, OPJ_SIZE_T p_nb_bytes,
+                                    void * p_user_data)
 {
-	OPJ_ARG_NOT_USED(p_buffer);
-	OPJ_ARG_NOT_USED(p_nb_bytes);
-	OPJ_ARG_NOT_USED(p_user_data);
-	return (OPJ_SIZE_T) -1;
+    OPJ_ARG_NOT_USED(p_buffer);
+    OPJ_ARG_NOT_USED(p_nb_bytes);
+    OPJ_ARG_NOT_USED(p_user_data);
+    return (OPJ_SIZE_T) - 1;
 }
 
-OPJ_OFF_T opj_stream_default_skip (OPJ_OFF_T p_nb_bytes, void * p_user_data)
+OPJ_OFF_T opj_stream_default_skip(OPJ_OFF_T p_nb_bytes, void * p_user_data)
 {
-	OPJ_ARG_NOT_USED(p_nb_bytes);
-	OPJ_ARG_NOT_USED(p_user_data);
-	return (OPJ_OFF_T) -1;
+    OPJ_ARG_NOT_USED(p_nb_bytes);
+    OPJ_ARG_NOT_USED(p_user_data);
+    return (OPJ_OFF_T) - 1;
 }
 
-OPJ_BOOL opj_stream_default_seek (OPJ_OFF_T p_nb_bytes, void * p_user_data)
+OPJ_BOOL opj_stream_default_seek(OPJ_OFF_T p_nb_bytes, void * p_user_data)
 {
-	OPJ_ARG_NOT_USED(p_nb_bytes);
-	OPJ_ARG_NOT_USED(p_user_data);
-	return OPJ_FALSE;
+    OPJ_ARG_NOT_USED(p_nb_bytes);
+    OPJ_ARG_NOT_USED(p_user_data);
+    return OPJ_FALSE;
 }
diff --git a/third_party/libopenjpeg20/cio.h b/third_party/libopenjpeg20/cio.h
index 1b684ef..6996a9a 100644
--- a/third_party/libopenjpeg20/cio.h
+++ b/third_party/libopenjpeg20/cio.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,10 +8,10 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -37,8 +37,8 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef __CIO_H
-#define __CIO_H
+#ifndef OPJ_CIO_H
+#define OPJ_CIO_H
 /**
 @file cio.h
 @brief Implementation of a byte input-output process (CIO)
@@ -54,116 +54,112 @@
 /* ----------------------------------------------------------------------- */
 
 #if defined(OPJ_BIG_ENDIAN)
-	#define opj_write_bytes		opj_write_bytes_BE
-	#define opj_read_bytes		opj_read_bytes_BE
-	#define opj_write_double	opj_write_double_BE
-	#define opj_read_double		opj_read_double_BE
-	#define opj_write_float		opj_write_float_BE
-	#define opj_read_float		opj_read_float_BE
+#define opj_write_bytes     opj_write_bytes_BE
+#define opj_read_bytes      opj_read_bytes_BE
+#define opj_write_double    opj_write_double_BE
+#define opj_read_double     opj_read_double_BE
+#define opj_write_float     opj_write_float_BE
+#define opj_read_float      opj_read_float_BE
 #else
-	#define opj_write_bytes		opj_write_bytes_LE
-	#define opj_read_bytes		opj_read_bytes_LE
-	#define opj_write_double	opj_write_double_LE
-	#define opj_read_double		opj_read_double_LE
-	#define opj_write_float		opj_write_float_LE
-	#define opj_read_float		opj_read_float_LE
+#define opj_write_bytes     opj_write_bytes_LE
+#define opj_read_bytes      opj_read_bytes_LE
+#define opj_write_double    opj_write_double_LE
+#define opj_read_double     opj_read_double_LE
+#define opj_write_float     opj_write_float_LE
+#define opj_read_float      opj_read_float_LE
 #endif
 
 
-
-typedef enum
-{
-	opj_signed_sentinel		= -1, /* do not use in code */
-	opj_stream_e_output		= 0x1,
-	opj_stream_e_input		= 0x2,
-	opj_stream_e_end		= 0x4,
-	opj_stream_e_error		= 0x8
-}
-opj_stream_flag ;
+#define OPJ_STREAM_STATUS_OUTPUT  0x1U
+#define OPJ_STREAM_STATUS_INPUT   0x2U
+#define OPJ_STREAM_STATUS_END     0x4U
+#define OPJ_STREAM_STATUS_ERROR   0x8U
 
 /**
 Byte input-output stream.
 */
-typedef struct opj_stream_private
-{
-	/**
-	 * User data, be it files, ... The actual data depends on the type of the stream.
-	 */
-	void *					m_user_data;
+typedef struct opj_stream_private {
+    /**
+     * User data, be it files, ... The actual data depends on the type of the stream.
+     */
+    void *                  m_user_data;
 
-	/**
-	 * Pointer to function to free m_user_data (NULL at initialization)
-	 * when destroying the stream. If pointer is NULL the function is not
-	 * called and the m_user_data is not freed (even if non-NULL).
-	 */
-	opj_stream_free_user_data_fn		m_free_user_data_fn;
+    /**
+     * Pointer to function to free m_user_data (NULL at initialization)
+     * when destroying the stream. If pointer is NULL the function is not
+     * called and the m_user_data is not freed (even if non-NULL).
+     */
+    opj_stream_free_user_data_fn        m_free_user_data_fn;
 
-	/**
-	 * User data length
-	 */
-	OPJ_UINT64 				m_user_data_length;
+    /**
+     * User data length
+     */
+    OPJ_UINT64              m_user_data_length;
 
-	/**
-	 * Pointer to actual read function (NULL at the initialization of the cio.
-	 */
-	opj_stream_read_fn		m_read_fn;
+    /**
+     * Pointer to actual read function (NULL at the initialization of the cio.
+     */
+    opj_stream_read_fn      m_read_fn;
 
-	/**
-	 * Pointer to actual write function (NULL at the initialization of the cio.
-	 */
-	opj_stream_write_fn		m_write_fn;
+    /**
+     * Pointer to actual write function (NULL at the initialization of the cio.
+     */
+    opj_stream_write_fn     m_write_fn;
 
-	/**
-	 * Pointer to actual skip function (NULL at the initialization of the cio.
-	 * There is no seek function to prevent from back and forth slow procedures.
-	 */
-	opj_stream_skip_fn		m_skip_fn;
+    /**
+     * Pointer to actual skip function (NULL at the initialization of the cio.
+     * There is no seek function to prevent from back and forth slow procedures.
+     */
+    opj_stream_skip_fn      m_skip_fn;
 
-	/**
-	 * Pointer to actual seek function (if available).
-	 */
-	opj_stream_seek_fn		m_seek_fn;
+    /**
+     * Pointer to actual seek function (if available).
+     */
+    opj_stream_seek_fn      m_seek_fn;
 
-	/**
-	 * Actual data stored into the stream if readed from. Data is read by chunk of fixed size.
-	 * you should never access this data directly.
-	 */
-	OPJ_BYTE *					m_stored_data;
+    /**
+     * Actual data stored into the stream if readed from. Data is read by chunk of fixed size.
+     * you should never access this data directly.
+     */
+    OPJ_BYTE *                  m_stored_data;
 
-	/**
-	 * Pointer to the current read data.
-	 */
-	OPJ_BYTE *					m_current_data;
+    /**
+     * Pointer to the current read data.
+     */
+    OPJ_BYTE *                  m_current_data;
 
     /**
     * FIXME DOC.
     */
-	OPJ_OFF_T (* m_opj_skip)(struct opj_stream_private * ,OPJ_OFF_T , struct opj_event_mgr *);
+    OPJ_OFF_T(* m_opj_skip)(struct opj_stream_private *, OPJ_OFF_T,
+                            struct opj_event_mgr *);
 
     /**
     * FIXME DOC.
     */
-	OPJ_BOOL (* m_opj_seek) (struct opj_stream_private * , OPJ_OFF_T , struct opj_event_mgr *);
+    OPJ_BOOL(* m_opj_seek)(struct opj_stream_private *, OPJ_OFF_T,
+                           struct opj_event_mgr *);
 
-	/**
-	 * number of bytes containing in the buffer.
-	 */
-	OPJ_SIZE_T			m_bytes_in_buffer;
+    /**
+     * number of bytes containing in the buffer.
+     */
+    OPJ_SIZE_T          m_bytes_in_buffer;
 
-	/**
-	 * The number of bytes read/written from the beginning of the stream
-	 */
-	OPJ_OFF_T			m_byte_offset;
+    /**
+     * The number of bytes read/written from the beginning of the stream
+     */
+    OPJ_OFF_T           m_byte_offset;
 
-	/**
-	 * The size of the buffer.
-	 */
-	OPJ_SIZE_T			m_buffer_size;
+    /**
+     * The size of the buffer.
+     */
+    OPJ_SIZE_T          m_buffer_size;
 
-	/**
-	 * Flags to tell the status of the stream.
-	 */
-	opj_stream_flag m_status;
+    /**
+     * Flags to tell the status of the stream.
+     * Used with OPJ_STREAM_STATUS_* defines.
+     */
+    OPJ_UINT32 m_status;
 
 }
 opj_stream_private_t;
@@ -173,221 +169,238 @@
 /* ----------------------------------------------------------------------- */
 /**
  * Write some bytes to the given data buffer, this function is used in Big Endian cpus.
- * @param p_buffer		pointer the data buffer to write data to.
- * @param p_value		the value to write
- * @param p_nb_bytes	the number of bytes to write
+ * @param p_buffer      pointer the data buffer to write data to.
+ * @param p_value       the value to write
+ * @param p_nb_bytes    the number of bytes to write
 */
-void opj_write_bytes_BE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes);
+void opj_write_bytes_BE(OPJ_BYTE * p_buffer, OPJ_UINT32 p_value,
+                        OPJ_UINT32 p_nb_bytes);
 
 /**
  * Reads some bytes from the given data buffer, this function is used in Big Endian cpus.
- * @param p_buffer		pointer the data buffer to read data from.
- * @param p_value		pointer to the value that will store the data.
- * @param p_nb_bytes	the nb bytes to read.
- * @return				the number of bytes read or -1 if an error occurred.
+ * @param p_buffer      pointer the data buffer to read data from.
+ * @param p_value       pointer to the value that will store the data.
+ * @param p_nb_bytes    the nb bytes to read.
+ * @return              the number of bytes read or -1 if an error occurred.
  */
-void opj_read_bytes_BE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes);
+void opj_read_bytes_BE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value,
+                       OPJ_UINT32 p_nb_bytes);
 
 /**
  * Write some bytes to the given data buffer, this function is used in Little Endian cpus.
- * @param p_buffer		pointer the data buffer to write data to.
- * @param p_value		the value to write
- * @param p_nb_bytes	the number of bytes to write
- * @return				the number of bytes written or -1 if an error occurred
+ * @param p_buffer      pointer the data buffer to write data to.
+ * @param p_value       the value to write
+ * @param p_nb_bytes    the number of bytes to write
+ * @return              the number of bytes written or -1 if an error occurred
 */
-void opj_write_bytes_LE (OPJ_BYTE * p_buffer, OPJ_UINT32 p_value, OPJ_UINT32 p_nb_bytes);
+void opj_write_bytes_LE(OPJ_BYTE * p_buffer, OPJ_UINT32 p_value,
+                        OPJ_UINT32 p_nb_bytes);
 
 /**
  * Reads some bytes from the given data buffer, this function is used in Little Endian cpus.
- * @param p_buffer		pointer the data buffer to read data from.
- * @param p_value		pointer to the value that will store the data.
- * @param p_nb_bytes	the nb bytes to read.
- * @return				the number of bytes read or -1 if an error occurred.
+ * @param p_buffer      pointer the data buffer to read data from.
+ * @param p_value       pointer to the value that will store the data.
+ * @param p_nb_bytes    the nb bytes to read.
+ * @return              the number of bytes read or -1 if an error occurred.
  */
-void opj_read_bytes_LE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value, OPJ_UINT32 p_nb_bytes);
+void opj_read_bytes_LE(const OPJ_BYTE * p_buffer, OPJ_UINT32 * p_value,
+                       OPJ_UINT32 p_nb_bytes);
 
 
 /**
  * Write some bytes to the given data buffer, this function is used in Little Endian cpus.
- * @param p_buffer		pointer the data buffer to write data to.
- * @param p_value		the value to write
+ * @param p_buffer      pointer the data buffer to write data to.
+ * @param p_value       the value to write
  */
 void opj_write_double_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value);
 
 /***
  * Write some bytes to the given data buffer, this function is used in Big Endian cpus.
- * @param p_buffer		pointer the data buffer to write data to.
- * @param p_value		the value to write
+ * @param p_buffer      pointer the data buffer to write data to.
+ * @param p_value       the value to write
  */
 void opj_write_double_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT64 p_value);
 
 /**
  * Reads some bytes from the given data buffer, this function is used in Little Endian cpus.
- * @param p_buffer		pointer the data buffer to read data from.
- * @param p_value		pointer to the value that will store the data.
+ * @param p_buffer      pointer the data buffer to read data from.
+ * @param p_value       pointer to the value that will store the data.
  */
 void opj_read_double_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value);
 
 /**
  * Reads some bytes from the given data buffer, this function is used in Big Endian cpus.
- * @param p_buffer		pointer the data buffer to read data from.
- * @param p_value		pointer to the value that will store the data.
+ * @param p_buffer      pointer the data buffer to read data from.
+ * @param p_value       pointer to the value that will store the data.
  */
 void opj_read_double_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT64 * p_value);
 
 /**
  * Reads some bytes from the given data buffer, this function is used in Little Endian cpus.
- * @param p_buffer		pointer the data buffer to read data from.
- * @param p_value		pointer to the value that will store the data.
+ * @param p_buffer      pointer the data buffer to read data from.
+ * @param p_value       pointer to the value that will store the data.
  */
 void opj_read_float_LE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value);
 
 /**
  * Reads some bytes from the given data buffer, this function is used in Big Endian cpus.
- * @param p_buffer		pointer the data buffer to read data from.
- * @param p_value		pointer to the value that will store the data.
+ * @param p_buffer      pointer the data buffer to read data from.
+ * @param p_value       pointer to the value that will store the data.
  */
 void opj_read_float_BE(const OPJ_BYTE * p_buffer, OPJ_FLOAT32 * p_value);
 
 /**
  * Write some bytes to the given data buffer, this function is used in Little Endian cpus.
- * @param p_buffer		pointer the data buffer to write data to.
- * @param p_value		the value to write
+ * @param p_buffer      pointer the data buffer to write data to.
+ * @param p_value       the value to write
  */
 void opj_write_float_LE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value);
 
 /***
  * Write some bytes to the given data buffer, this function is used in Big Endian cpus.
- * @param p_buffer		pointer the data buffer to write data to.
- * @param p_value		the value to write
+ * @param p_buffer      pointer the data buffer to write data to.
+ * @param p_value       the value to write
  */
 void opj_write_float_BE(OPJ_BYTE * p_buffer, OPJ_FLOAT32 p_value);
 
 /**
  * Reads some bytes from the stream.
- * @param		p_stream	the stream to read data from.
- * @param		p_buffer	pointer to the data buffer that will receive the data.
- * @param		p_size		number of bytes to read.
- * @param		p_event_mgr	the user event manager to be notified of special events.
- * @return		the number of bytes read, or -1 if an error occurred or if the stream is at the end.
+ * @param       p_stream    the stream to read data from.
+ * @param       p_buffer    pointer to the data buffer that will receive the data.
+ * @param       p_size      number of bytes to read.
+ * @param       p_event_mgr the user event manager to be notified of special events.
+ * @return      the number of bytes read, or -1 if an error occurred or if the stream is at the end.
  */
-OPJ_SIZE_T opj_stream_read_data (opj_stream_private_t * p_stream,OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, struct opj_event_mgr * p_event_mgr);
+OPJ_SIZE_T opj_stream_read_data(opj_stream_private_t * p_stream,
+                                OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, struct opj_event_mgr * p_event_mgr);
 
 /**
  * Writes some bytes to the stream.
- * @param		p_stream	the stream to write data to.
- * @param		p_buffer	pointer to the data buffer holds the data to be writtent.
- * @param		p_size		number of bytes to write.
- * @param		p_event_mgr	the user event manager to be notified of special events.
- * @return		the number of bytes writtent, or -1 if an error occurred.
+ * @param       p_stream    the stream to write data to.
+ * @param       p_buffer    pointer to the data buffer holds the data to be writtent.
+ * @param       p_size      number of bytes to write.
+ * @param       p_event_mgr the user event manager to be notified of special events.
+ * @return      the number of bytes writtent, or -1 if an error occurred.
  */
-OPJ_SIZE_T opj_stream_write_data (opj_stream_private_t * p_stream,const OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size, struct opj_event_mgr * p_event_mgr);
+OPJ_SIZE_T opj_stream_write_data(opj_stream_private_t * p_stream,
+                                 const OPJ_BYTE * p_buffer, OPJ_SIZE_T p_size,
+                                 struct opj_event_mgr * p_event_mgr);
 
 /**
  * Writes the content of the stream buffer to the stream.
- * @param		p_stream	the stream to write data to.
- * @param		p_event_mgr	the user event manager to be notified of special events.
- * @return		true if the data could be flushed, false else.
+ * @param       p_stream    the stream to write data to.
+ * @param       p_event_mgr the user event manager to be notified of special events.
+ * @return      true if the data could be flushed, false else.
  */
-OPJ_BOOL opj_stream_flush (opj_stream_private_t * p_stream, struct opj_event_mgr * p_event_mgr);
+OPJ_BOOL opj_stream_flush(opj_stream_private_t * p_stream,
+                          struct opj_event_mgr * p_event_mgr);
 
 /**
  * Skips a number of bytes from the stream.
- * @param		p_stream	the stream to skip data from.
- * @param		p_size		the number of bytes to skip.
- * @param		p_event_mgr	the user event manager to be notified of special events.
- * @return		the number of bytes skipped, or -1 if an error occurred.
+ * @param       p_stream    the stream to skip data from.
+ * @param       p_size      the number of bytes to skip.
+ * @param       p_event_mgr the user event manager to be notified of special events.
+ * @return      the number of bytes skipped, or -1 if an error occurred.
  */
-OPJ_OFF_T opj_stream_skip (opj_stream_private_t * p_stream,OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+OPJ_OFF_T opj_stream_skip(opj_stream_private_t * p_stream, OPJ_OFF_T p_size,
+                          struct opj_event_mgr * p_event_mgr);
 
 /**
  * Tells the byte offset on the stream (similar to ftell).
  *
- * @param		p_stream	the stream to get the information from.
+ * @param       p_stream    the stream to get the information from.
  *
- * @return		the current position o fthe stream.
+ * @return      the current position o fthe stream.
  */
-OPJ_OFF_T opj_stream_tell (const opj_stream_private_t * p_stream);
+OPJ_OFF_T opj_stream_tell(const opj_stream_private_t * p_stream);
 
 
 /**
  * Get the number of bytes left before the end of the stream (similar to cio_numbytesleft).
  *
- * @param		p_stream	the stream to get the information from.
+ * @param       p_stream    the stream to get the information from.
  *
- * @return		Number of bytes left before the end of the stream.
+ * @return      Number of bytes left before the end of the stream.
  */
-OPJ_OFF_T opj_stream_get_number_byte_left (const opj_stream_private_t * p_stream);
+OPJ_OFF_T opj_stream_get_number_byte_left(const opj_stream_private_t *
+        p_stream);
 
 /**
  * Skips a number of bytes from the stream.
- * @param		p_stream	the stream to skip data from.
- * @param		p_size		the number of bytes to skip.
- * @param		p_event_mgr	the user event manager to be notified of special events.
- * @return		the number of bytes skipped, or -1 if an error occurred.
+ * @param       p_stream    the stream to skip data from.
+ * @param       p_size      the number of bytes to skip.
+ * @param       p_event_mgr the user event manager to be notified of special events.
+ * @return      the number of bytes skipped, or -1 if an error occurred.
  */
-OPJ_OFF_T opj_stream_write_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+OPJ_OFF_T opj_stream_write_skip(opj_stream_private_t * p_stream,
+                                OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
 
 /**
  * Skips a number of bytes from the stream.
- * @param		p_stream	the stream to skip data from.
- * @param		p_size		the number of bytes to skip.
- * @param		p_event_mgr	the user event manager to be notified of special events.
- * @return		the number of bytes skipped, or -1 if an error occurred.
+ * @param       p_stream    the stream to skip data from.
+ * @param       p_size      the number of bytes to skip.
+ * @param       p_event_mgr the user event manager to be notified of special events.
+ * @return      the number of bytes skipped, or -1 if an error occurred.
  */
-OPJ_OFF_T opj_stream_read_skip (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+OPJ_OFF_T opj_stream_read_skip(opj_stream_private_t * p_stream,
+                               OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
 
 /**
  * Skips a number of bytes from the stream.
- * @param		p_stream	the stream to skip data from.
- * @param		p_size		the number of bytes to skip.
- * @param		p_event_mgr	the user event manager to be notified of special events.
- * @return		OPJ_TRUE if success, or OPJ_FALSE if an error occurred.
+ * @param       p_stream    the stream to skip data from.
+ * @param       p_size      the number of bytes to skip.
+ * @param       p_event_mgr the user event manager to be notified of special events.
+ * @return      OPJ_TRUE if success, or OPJ_FALSE if an error occurred.
  */
-OPJ_BOOL opj_stream_read_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+OPJ_BOOL opj_stream_read_seek(opj_stream_private_t * p_stream, OPJ_OFF_T p_size,
+                              struct opj_event_mgr * p_event_mgr);
 
 /**
  * Skips a number of bytes from the stream.
- * @param		p_stream	the stream to skip data from.
- * @param		p_size		the number of bytes to skip.
- * @param		p_event_mgr	the user event manager to be notified of special events.
- * @return		the number of bytes skipped, or -1 if an error occurred.
+ * @param       p_stream    the stream to skip data from.
+ * @param       p_size      the number of bytes to skip.
+ * @param       p_event_mgr the user event manager to be notified of special events.
+ * @return      the number of bytes skipped, or -1 if an error occurred.
  */
-OPJ_BOOL opj_stream_write_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+OPJ_BOOL opj_stream_write_seek(opj_stream_private_t * p_stream,
+                               OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
 
 /**
  * Seeks a number of bytes from the stream.
- * @param		p_stream	the stream to skip data from.
- * @param		p_size		the number of bytes to skip.
- * @param		p_event_mgr	the user event manager to be notified of special events.
- * @return		true if the stream is seekable.
+ * @param       p_stream    the stream to skip data from.
+ * @param       p_size      the number of bytes to skip.
+ * @param       p_event_mgr the user event manager to be notified of special events.
+ * @return      true if the stream is seekable.
  */
-OPJ_BOOL opj_stream_seek (opj_stream_private_t * p_stream, OPJ_OFF_T p_size, struct opj_event_mgr * p_event_mgr);
+OPJ_BOOL opj_stream_seek(opj_stream_private_t * p_stream, OPJ_OFF_T p_size,
+                         struct opj_event_mgr * p_event_mgr);
 
 /**
  * Tells if the given stream is seekable.
  */
-OPJ_BOOL opj_stream_has_seek (const opj_stream_private_t * p_stream);
+OPJ_BOOL opj_stream_has_seek(const opj_stream_private_t * p_stream);
 
 /**
  * FIXME DOC.
  */
-OPJ_SIZE_T opj_stream_default_read (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data);
+OPJ_SIZE_T opj_stream_default_read(void * p_buffer, OPJ_SIZE_T p_nb_bytes,
+                                   void * p_user_data);
 
 /**
  * FIXME DOC.
  */
-OPJ_SIZE_T opj_stream_default_write (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data);
+OPJ_SIZE_T opj_stream_default_write(void * p_buffer, OPJ_SIZE_T p_nb_bytes,
+                                    void * p_user_data);
 
 /**
  * FIXME DOC.
  */
-OPJ_OFF_T opj_stream_default_skip (OPJ_OFF_T p_nb_bytes, void * p_user_data);
+OPJ_OFF_T opj_stream_default_skip(OPJ_OFF_T p_nb_bytes, void * p_user_data);
 
 /**
  * FIXME DOC.
  */
-OPJ_BOOL opj_stream_default_seek (OPJ_OFF_T p_nb_bytes, void * p_user_data);
+OPJ_BOOL opj_stream_default_seek(OPJ_OFF_T p_nb_bytes, void * p_user_data);
 
 /* ----------------------------------------------------------------------- */
 /*@}*/
@@ -395,5 +408,5 @@
 /*@}*/
 
 
-#endif /* __CIO_H */
+#endif /* OPJ_CIO_H */
 
diff --git a/third_party/libopenjpeg20/dwt.c b/third_party/libopenjpeg20/dwt.c
index 1bcb108..8bf23b6 100644
--- a/third_party/libopenjpeg20/dwt.c
+++ b/third_party/libopenjpeg20/dwt.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,11 +8,12 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2007, Jonathan Ballard <dzonatas@dzonux.net>
  * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
+ * Copyright (c) 2017, IntoPIX SA <support@intopix.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -37,35 +38,62 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <assert.h>
+
+#define OPJ_SKIP_POISON
+#include "opj_includes.h"
+
 #ifdef __SSE__
 #include <xmmintrin.h>
 #endif
+#ifdef __SSE2__
+#include <emmintrin.h>
+#endif
+#ifdef __SSSE3__
+#include <tmmintrin.h>
+#endif
+#ifdef __AVX2__
+#include <immintrin.h>
+#endif
 
-#include "opj_includes.h"
+#if defined(__GNUC__)
+#pragma GCC poison malloc calloc realloc free
+#endif
 
 /** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
 /*@{*/
 
+#ifdef __AVX2__
+/** Number of int32 values in a AVX2 register */
+#define VREG_INT_COUNT       8
+#else
+/** Number of int32 values in a SSE2 register */
+#define VREG_INT_COUNT       4
+#endif
+
+/** Number of columns that we can process in parallel in the vertical pass */
+#define PARALLEL_COLS_53     (2*VREG_INT_COUNT)
+
 /** @name Local data structures */
 /*@{*/
 
 typedef struct dwt_local {
-	OPJ_INT32* mem;
-	OPJ_SIZE_T mem_count;
-	OPJ_INT32 dn;
-	OPJ_INT32 sn;
-	OPJ_INT32 cas;
+    OPJ_INT32* mem;
+    OPJ_SIZE_T mem_count;
+    OPJ_INT32 dn;
+    OPJ_INT32 sn;
+    OPJ_INT32 cas;
 } opj_dwt_t;
 
 typedef union {
-	OPJ_FLOAT32	f[4];
+    OPJ_FLOAT32 f[4];
 } opj_v4_t;
 
 typedef struct v4dwt_local {
-	opj_v4_t*	wavelet ;
-	OPJ_INT32		dn ;
-	OPJ_INT32		sn ;
-	OPJ_INT32		cas ;
+    opj_v4_t*   wavelet ;
+    OPJ_INT32       dn ;
+    OPJ_INT32       sn ;
+    OPJ_INT32       cas ;
 } opj_v4dwt_t ;
 
 static const OPJ_FLOAT32 opj_dwt_alpha =  1.586134342f; /*  12994 */
@@ -79,9 +107,9 @@
 /*@}*/
 
 /**
-Virtual function type for wavelet transform in 1-D 
+Virtual function type for wavelet transform in 1-D
 */
-typedef void (*DWT1DFN)(opj_dwt_t* v);
+typedef void (*DWT1DFN)(const opj_dwt_t* v);
 
 /** @name Local static functions */
 /*@{*/
@@ -89,64 +117,66 @@
 /**
 Forward lazy transform (horizontal)
 */
-static void opj_dwt_deinterleave_h(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+static void opj_dwt_deinterleave_h(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn,
+                                   OPJ_INT32 sn, OPJ_INT32 cas);
 /**
 Forward lazy transform (vertical)
 */
-static void opj_dwt_deinterleave_v(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 x, OPJ_INT32 cas);
-/**
-Inverse lazy transform (horizontal)
-*/
-static void opj_dwt_interleave_h(opj_dwt_t* h, OPJ_INT32 *a);
-/**
-Inverse lazy transform (vertical)
-*/
-static void opj_dwt_interleave_v(opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x);
+static void opj_dwt_deinterleave_v(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn,
+                                   OPJ_INT32 sn, OPJ_INT32 x, OPJ_INT32 cas);
 /**
 Forward 5-3 wavelet transform in 1-D
 */
-static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
-/**
-Inverse 5-3 wavelet transform in 1-D
-*/
-static void opj_dwt_decode_1(opj_dwt_t *v);
-static void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn,
+    OPJ_INT32 sn, OPJ_INT32 cas);
+
 /**
 Forward 9-7 wavelet transform in 1-D
 */
-static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_SIZE_T a_count,
+    OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas);
+
 /**
-Explicit calculation of the Quantization Stepsizes 
+Explicit calculation of the Quantization Stepsizes
 */
-static void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps, opj_stepsize_t *bandno_stepsize);
+static void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps,
+                                    opj_stepsize_t *bandno_stepsize);
 /**
 Inverse wavelet transform in 2-D.
 */
-static OPJ_BOOL opj_dwt_decode_tile(const opj_tcd_tilecomp_t* tilec, OPJ_UINT32 i, DWT1DFN fn);
+static OPJ_BOOL opj_dwt_decode_tile(opj_thread_pool_t* tp,
+                                    const opj_tcd_tilecomp_t* tilec, OPJ_UINT32 i);
 
 static OPJ_BOOL opj_dwt_encode_procedure(const opj_tcd_tilecomp_t * tilec,
-										    void(*p_function)(OPJ_INT32 *, OPJ_SIZE_T, OPJ_INT32, OPJ_INT32, OPJ_INT32));
+        void(*p_function)(OPJ_INT32 *, OPJ_SIZE_T, OPJ_INT32, OPJ_INT32, OPJ_INT32));
 
-static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_UINT32 i);
+static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* OPJ_RESTRICT r,
+        OPJ_UINT32 i);
 
 /* <summary>                             */
 /* Inverse 9-7 wavelet transform in 1-D. */
 /* </summary>                            */
-static void opj_v4dwt_decode(opj_v4dwt_t* restrict dwt);
+static void opj_v4dwt_decode(opj_v4dwt_t* OPJ_RESTRICT dwt);
 
-static void opj_v4dwt_interleave_h(opj_v4dwt_t* restrict w, OPJ_FLOAT32* restrict a, OPJ_INT32 x, OPJ_INT32 size);
+static void opj_v4dwt_interleave_h(opj_v4dwt_t* OPJ_RESTRICT w,
+                                   OPJ_FLOAT32* OPJ_RESTRICT a, OPJ_INT32 x, OPJ_INT32 size);
 
-static void opj_v4dwt_interleave_v(opj_v4dwt_t* restrict v , OPJ_FLOAT32* restrict a , OPJ_INT32 x, OPJ_INT32 nb_elts_read);
+static void opj_v4dwt_interleave_v(opj_v4dwt_t* OPJ_RESTRICT v,
+                                   OPJ_FLOAT32* OPJ_RESTRICT a, OPJ_INT32 x, OPJ_INT32 nb_elts_read);
 
 #ifdef __SSE__
-static void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c);
+static void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count,
+                                       const __m128 c);
 
-static void opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, __m128 c);
+static void opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k,
+                                       OPJ_INT32 m, __m128 c);
 
 #else
-static void opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count, const OPJ_FLOAT32 c);
+static void opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count,
+                                   const OPJ_FLOAT32 c);
 
-static void opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, OPJ_FLOAT32 c);
+static void opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k,
+                                   OPJ_INT32 m, OPJ_FLOAT32 c);
 
 #endif
 
@@ -173,214 +203,880 @@
 /* This table contains the norms of the 5-3 wavelets for different bands. */
 /* </summary>                                                             */
 static const OPJ_FLOAT64 opj_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}
+    {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 OPJ_FLOAT64 opj_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}
+    {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>			                 */
+/* <summary>                             */
 /* Forward lazy transform (horizontal).  */
-/* </summary>                            */ 
-static void opj_dwt_deinterleave_h(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
-	OPJ_INT32 i;
-	OPJ_INT32 * l_dest = b;
-	OPJ_INT32 * l_src = a+cas;
+/* </summary>                            */
+static void opj_dwt_deinterleave_h(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn,
+                                   OPJ_INT32 sn, OPJ_INT32 cas)
+{
+    OPJ_INT32 i;
+    OPJ_INT32 * l_dest = b;
+    OPJ_INT32 * l_src = a + cas;
 
-    for (i=0; i<sn; ++i) {
-		*l_dest++ = *l_src;
-		l_src += 2;
-	}
-	
+    for (i = 0; i < sn; ++i) {
+        *l_dest++ = *l_src;
+        l_src += 2;
+    }
+
     l_dest = b + sn;
-	l_src = a + 1 - cas;
+    l_src = a + 1 - cas;
 
-    for	(i=0; i<dn; ++i)  {
-		*l_dest++=*l_src;
-		l_src += 2;
-	}
-}
-
-/* <summary>                             */  
-/* Forward lazy transform (vertical).    */
-/* </summary>                            */ 
-static void opj_dwt_deinterleave_v(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 x, OPJ_INT32 cas) {
-    OPJ_INT32 i = sn;
-	OPJ_INT32 * l_dest = b;
-	OPJ_INT32 * l_src = a+cas;
-
-    while (i--) {
-		*l_dest = *l_src;
-		l_dest += x;
-		l_src += 2;
-		} /* b[i*x]=a[2*i+cas]; */
-
-	l_dest = b + sn * x;
-	l_src = a + 1 - cas;
-	
-	i = dn;
-    while (i--) {
-		*l_dest = *l_src;
-		l_dest += x;
-		l_src += 2;
-        } /*b[(sn+i)*x]=a[(2*i+1-cas)];*/
+    for (i = 0; i < dn; ++i)  {
+        *l_dest++ = *l_src;
+        l_src += 2;
+    }
 }
 
 /* <summary>                             */
+/* Forward lazy transform (vertical).    */
+/* </summary>                            */
+static void opj_dwt_deinterleave_v(OPJ_INT32 *a, OPJ_INT32 *b, OPJ_INT32 dn,
+                                   OPJ_INT32 sn, OPJ_INT32 x, OPJ_INT32 cas)
+{
+    OPJ_INT32 i = sn;
+    OPJ_INT32 * l_dest = b;
+    OPJ_INT32 * l_src = a + cas;
+
+    while (i--) {
+        *l_dest = *l_src;
+        l_dest += x;
+        l_src += 2;
+    } /* b[i*x]=a[2*i+cas]; */
+
+    l_dest = b + sn * x;
+    l_src = a + 1 - cas;
+
+    i = dn;
+    while (i--) {
+        *l_dest = *l_src;
+        l_dest += x;
+        l_src += 2;
+    } /*b[(sn+i)*x]=a[(2*i+1-cas)];*/
+}
+
+#ifdef STANDARD_SLOW_VERSION
+/* <summary>                             */
 /* Inverse lazy transform (horizontal).  */
 /* </summary>                            */
-static void opj_dwt_interleave_h(opj_dwt_t* h, OPJ_INT32 *a) {
+static void opj_dwt_interleave_h(const opj_dwt_t* h, OPJ_INT32 *a)
+{
     OPJ_INT32 *ai = a;
     OPJ_INT32 *bi = h->mem + h->cas;
-    OPJ_INT32  i	= h->sn;
-    while( i-- ) {
-      *bi = *(ai++);
-	  bi += 2;
+    OPJ_INT32  i    = h->sn;
+    while (i--) {
+        *bi = *(ai++);
+        bi += 2;
     }
-    ai	= a + h->sn;
-    bi	= h->mem + 1 - h->cas;
-    i	= h->dn ;
-    while( i-- ) {
-      *bi = *(ai++);
-	  bi += 2;
+    ai  = a + h->sn;
+    bi  = h->mem + 1 - h->cas;
+    i   = h->dn ;
+    while (i--) {
+        *bi = *(ai++);
+        bi += 2;
     }
 }
 
-/* <summary>                             */  
+/* <summary>                             */
 /* Inverse lazy transform (vertical).    */
-/* </summary>                            */ 
-static void opj_dwt_interleave_v(opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x) {
+/* </summary>                            */
+static void opj_dwt_interleave_v(const opj_dwt_t* v, OPJ_INT32 *a, OPJ_INT32 x)
+{
     OPJ_INT32 *ai = a;
     OPJ_INT32 *bi = v->mem + v->cas;
     OPJ_INT32  i = v->sn;
-    while( i-- ) {
-      *bi = *ai;
-	  bi += 2;
-	  ai += x;
+    while (i--) {
+        *bi = *ai;
+        bi += 2;
+        ai += x;
     }
     ai = a + (v->sn * x);
     bi = v->mem + 1 - v->cas;
     i = v->dn ;
-    while( i-- ) {
-      *bi = *ai;
-	  bi += 2;  
-	  ai += x;
+    while (i--) {
+        *bi = *ai;
+        bi += 2;
+        ai += x;
     }
 }
 
+#endif /* STANDARD_SLOW_VERSION */
 
 /* <summary>                            */
 /* Forward 5-3 wavelet transform in 1-D. */
 /* </summary>                           */
-static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
-	OPJ_INT32 i;
-	
-	if (!cas) {
-		if ((dn > 0) || (sn > 1)) {	/* NEW :  CASE ONE ELEMENT */
-			for (i = 0; i < dn; i++) OPJ_D(i) -= (OPJ_S_(i) + OPJ_S_(i + 1)) >> 1;
-			for (i = 0; i < sn; i++) OPJ_S(i) += (OPJ_D_(i - 1) + OPJ_D_(i) + 2) >> 2;
-		}
-	} else {
-		if (!sn && dn == 1)		    /* NEW :  CASE ONE ELEMENT */
-			OPJ_S(0) *= 2;
-		else {
-			for (i = 0; i < dn; i++) OPJ_S(i) -= (OPJ_DD_(i) + OPJ_DD_(i - 1)) >> 1;
-			for (i = 0; i < sn; i++) OPJ_D(i) += (OPJ_SS_(i) + OPJ_SS_(i + 1) + 2) >> 2;
-		}
-	}
+static void opj_dwt_encode_1(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn,
+                             OPJ_INT32 sn, OPJ_INT32 cas)
+{
+    OPJ_INT32 i;
+
+    if (!cas) {
+        if ((dn > 0) || (sn > 1)) { /* NEW :  CASE ONE ELEMENT */
+            for (i = 0; i < dn; i++) {
+                OPJ_D(i) -= (OPJ_S_(i) + OPJ_S_(i + 1)) >> 1;
+            }
+            for (i = 0; i < sn; i++) {
+                OPJ_S(i) += (OPJ_D_(i - 1) + OPJ_D_(i) + 2) >> 2;
+            }
+        }
+    } else {
+        if (!sn && dn == 1) {       /* NEW :  CASE ONE ELEMENT */
+            OPJ_S(0) *= 2;
+        } else {
+            for (i = 0; i < dn; i++) {
+                OPJ_S(i) -= (OPJ_DD_(i) + OPJ_DD_(i - 1)) >> 1;
+            }
+            for (i = 0; i < sn; i++) {
+                OPJ_D(i) += (OPJ_SS_(i) + OPJ_SS_(i + 1) + 2) >> 2;
+            }
+        }
+    }
 }
 
+#ifdef STANDARD_SLOW_VERSION
 /* <summary>                            */
 /* Inverse 5-3 wavelet transform in 1-D. */
-/* </summary>                           */ 
-static void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
-	OPJ_INT32 i;
-	
-	if (!cas) {
-		if ((dn > 0) || (sn > 1)) { /* NEW :  CASE ONE ELEMENT */
-			for (i = 0; i < sn; i++) OPJ_S(i) -= (OPJ_D_(i - 1) + OPJ_D_(i) + 2) >> 2;
-			for (i = 0; i < dn; i++) OPJ_D(i) += (OPJ_S_(i) + OPJ_S_(i + 1)) >> 1;
-		}
-	} else {
-		if (!sn  && dn == 1)          /* NEW :  CASE ONE ELEMENT */
-			OPJ_S(0) /= 2;
-		else {
-			for (i = 0; i < sn; i++) OPJ_D(i) -= (OPJ_SS_(i) + OPJ_SS_(i + 1) + 2) >> 2;
-			for (i = 0; i < dn; i++) OPJ_S(i) += (OPJ_DD_(i) + OPJ_DD_(i - 1)) >> 1;
-		}
-	}
+/* </summary>                           */
+static void opj_dwt_decode_1_(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn,
+                              OPJ_INT32 sn, OPJ_INT32 cas)
+{
+    OPJ_INT32 i;
+
+    if (!cas) {
+        if ((dn > 0) || (sn > 1)) { /* NEW :  CASE ONE ELEMENT */
+            for (i = 0; i < sn; i++) {
+                OPJ_S(i) -= (OPJ_D_(i - 1) + OPJ_D_(i) + 2) >> 2;
+            }
+            for (i = 0; i < dn; i++) {
+                OPJ_D(i) += (OPJ_S_(i) + OPJ_S_(i + 1)) >> 1;
+            }
+        }
+    } else {
+        if (!sn  && dn == 1) {        /* NEW :  CASE ONE ELEMENT */
+            OPJ_S(0) /= 2;
+        } else {
+            for (i = 0; i < sn; i++) {
+                OPJ_D(i) -= (OPJ_SS_(i) + OPJ_SS_(i + 1) + 2) >> 2;
+            }
+            for (i = 0; i < dn; i++) {
+                OPJ_S(i) += (OPJ_DD_(i) + OPJ_DD_(i - 1)) >> 1;
+            }
+        }
+    }
 }
 
-/* <summary>                            */
-/* Inverse 5-3 wavelet transform in 1-D. */
-/* </summary>                           */ 
-static void opj_dwt_decode_1(opj_dwt_t *v) {
-	opj_dwt_decode_1_(v->mem, v->mem_count, v->dn, v->sn, v->cas);
+static void opj_dwt_decode_1(const opj_dwt_t *v)
+{
+    opj_dwt_decode_1_(v->mem, v->mem_count, v->dn, v->sn, v->cas);
 }
 
+#endif /* STANDARD_SLOW_VERSION */
+
+#if !defined(STANDARD_SLOW_VERSION)
+static void  opj_idwt53_h_cas0(OPJ_INT32* tmp,
+                               const OPJ_INT32 sn,
+                               const OPJ_INT32 len,
+                               OPJ_INT32* tiledp)
+{
+    OPJ_INT32 i, j;
+    const OPJ_INT32* in_even = &tiledp[0];
+    const OPJ_INT32* in_odd = &tiledp[sn];
+
+#ifdef TWO_PASS_VERSION
+    /* For documentation purpose: performs lifting in two iterations, */
+    /* but without explicit interleaving */
+
+    assert(len > 1);
+
+    /* Even */
+    tmp[0] = in_even[0] - ((in_odd[0] + 1) >> 1);
+    for (i = 2, j = 0; i <= len - 2; i += 2, j++) {
+        tmp[i] = in_even[j + 1] - ((in_odd[j] + in_odd[j + 1] + 2) >> 2);
+    }
+    if (len & 1) { /* if len is odd */
+        tmp[len - 1] = in_even[(len - 1) / 2] - ((in_odd[(len - 2) / 2] + 1) >> 1);
+    }
+
+    /* Odd */
+    for (i = 1, j = 0; i < len - 1; i += 2, j++) {
+        tmp[i] = in_odd[j] + ((tmp[i - 1] + tmp[i + 1]) >> 1);
+    }
+    if (!(len & 1)) { /* if len is even */
+        tmp[len - 1] = in_odd[(len - 1) / 2] + tmp[len - 2];
+    }
+#else
+    OPJ_INT32 d1c, d1n, s1n, s0c, s0n;
+
+    assert(len > 1);
+
+    /* Improved version of the TWO_PASS_VERSION: */
+    /* Performs lifting in one single iteration. Saves memory */
+    /* accesses and explicit interleaving. */
+    s1n = in_even[0];
+    d1n = in_odd[0];
+    s0n = s1n - ((d1n + 1) >> 1);
+
+    for (i = 0, j = 1; i < (len - 3); i += 2, j++) {
+        d1c = d1n;
+        s0c = s0n;
+
+        s1n = in_even[j];
+        d1n = in_odd[j];
+
+        s0n = s1n - ((d1c + d1n + 2) >> 2);
+
+        tmp[i  ] = s0c;
+        tmp[i + 1] = d1c + ((s0c + s0n) >> 1);
+    }
+
+    tmp[i] = s0n;
+
+    if (len & 1) {
+        tmp[len - 1] = in_even[(len - 1) / 2] - ((d1n + 1) >> 1);
+        tmp[len - 2] = d1n + ((s0n + tmp[len - 1]) >> 1);
+    } else {
+        tmp[len - 1] = d1n + s0n;
+    }
+#endif
+    memcpy(tiledp, tmp, (OPJ_UINT32)len * sizeof(OPJ_INT32));
+}
+
+static void  opj_idwt53_h_cas1(OPJ_INT32* tmp,
+                               const OPJ_INT32 sn,
+                               const OPJ_INT32 len,
+                               OPJ_INT32* tiledp)
+{
+    OPJ_INT32 i, j;
+    const OPJ_INT32* in_even = &tiledp[sn];
+    const OPJ_INT32* in_odd = &tiledp[0];
+
+#ifdef TWO_PASS_VERSION
+    /* For documentation purpose: performs lifting in two iterations, */
+    /* but without explicit interleaving */
+
+    assert(len > 2);
+
+    /* Odd */
+    for (i = 1, j = 0; i < len - 1; i += 2, j++) {
+        tmp[i] = in_odd[j] - ((in_even[j] + in_even[j + 1] + 2) >> 2);
+    }
+    if (!(len & 1)) {
+        tmp[len - 1] = in_odd[len / 2 - 1] - ((in_even[len / 2 - 1] + 1) >> 1);
+    }
+
+    /* Even */
+    tmp[0] = in_even[0] + tmp[1];
+    for (i = 2, j = 1; i < len - 1; i += 2, j++) {
+        tmp[i] = in_even[j] + ((tmp[i + 1] + tmp[i - 1]) >> 1);
+    }
+    if (len & 1) {
+        tmp[len - 1] = in_even[len / 2] + tmp[len - 2];
+    }
+#else
+    OPJ_INT32 s1, s2, dc, dn;
+
+    assert(len > 2);
+
+    /* Improved version of the TWO_PASS_VERSION: */
+    /* Performs lifting in one single iteration. Saves memory */
+    /* accesses and explicit interleaving. */
+
+    s1 = in_even[1];
+    dc = in_odd[0] - ((in_even[0] + s1 + 2) >> 2);
+    tmp[0] = in_even[0] + dc;
+
+    for (i = 1, j = 1; i < (len - 2 - !(len & 1)); i += 2, j++) {
+
+        s2 = in_even[j + 1];
+
+        dn = in_odd[j] - ((s1 + s2 + 2) >> 2);
+        tmp[i  ] = dc;
+        tmp[i + 1] = s1 + ((dn + dc) >> 1);
+
+        dc = dn;
+        s1 = s2;
+    }
+
+    tmp[i] = dc;
+
+    if (!(len & 1)) {
+        dn = in_odd[len / 2 - 1] - ((s1 + 1) >> 1);
+        tmp[len - 2] = s1 + ((dn + dc) >> 1);
+        tmp[len - 1] = dn;
+    } else {
+        tmp[len - 1] = s1 + dc;
+    }
+#endif
+    memcpy(tiledp, tmp, (OPJ_UINT32)len * sizeof(OPJ_INT32));
+}
+
+
+#endif /* !defined(STANDARD_SLOW_VERSION) */
+
+/* <summary>                            */
+/* Inverse 5-3 wavelet transform in 1-D for one row. */
+/* </summary>                           */
+/* Performs interleave, inverse wavelet transform and copy back to buffer */
+static void opj_idwt53_h(const opj_dwt_t *dwt,
+                         OPJ_INT32* tiledp)
+{
+#ifdef STANDARD_SLOW_VERSION
+    /* For documentation purpose */
+    opj_dwt_interleave_h(dwt, tiledp);
+    opj_dwt_decode_1(dwt);
+    memcpy(tiledp, dwt->mem, (OPJ_UINT32)(dwt->sn + dwt->dn) * sizeof(OPJ_INT32));
+#else
+    const OPJ_INT32 sn = dwt->sn;
+    const OPJ_INT32 len = sn + dwt->dn;
+    if (dwt->cas == 0) { /* Left-most sample is on even coordinate */
+        if (len > 1) {
+            opj_idwt53_h_cas0(dwt->mem, sn, len, tiledp);
+        } else {
+            /* Unmodified value */
+        }
+    } else { /* Left-most sample is on odd coordinate */
+        if (len == 1) {
+            tiledp[0] /= 2;
+        } else if (len == 2) {
+            OPJ_INT32* out = dwt->mem;
+            const OPJ_INT32* in_even = &tiledp[sn];
+            const OPJ_INT32* in_odd = &tiledp[0];
+            out[1] = in_odd[0] - ((in_even[0] + 1) >> 1);
+            out[0] = in_even[0] + out[1];
+            memcpy(tiledp, dwt->mem, (OPJ_UINT32)len * sizeof(OPJ_INT32));
+        } else if (len > 2) {
+            opj_idwt53_h_cas1(dwt->mem, sn, len, tiledp);
+        }
+    }
+#endif
+}
+
+#if (defined(__SSE2__) || defined(__AVX2__)) && !defined(STANDARD_SLOW_VERSION)
+
+/* Conveniency macros to improve the readabilty of the formulas */
+#if __AVX2__
+#define VREG        __m256i
+#define LOAD_CST(x) _mm256_set1_epi32(x)
+#define LOAD(x)     _mm256_load_si256((const VREG*)(x))
+#define LOADU(x)    _mm256_loadu_si256((const VREG*)(x))
+#define STORE(x,y)  _mm256_store_si256((VREG*)(x),(y))
+#define STOREU(x,y) _mm256_storeu_si256((VREG*)(x),(y))
+#define ADD(x,y)    _mm256_add_epi32((x),(y))
+#define SUB(x,y)    _mm256_sub_epi32((x),(y))
+#define SAR(x,y)    _mm256_srai_epi32((x),(y))
+#else
+#define VREG        __m128i
+#define LOAD_CST(x) _mm_set1_epi32(x)
+#define LOAD(x)     _mm_load_si128((const VREG*)(x))
+#define LOADU(x)    _mm_loadu_si128((const VREG*)(x))
+#define STORE(x,y)  _mm_store_si128((VREG*)(x),(y))
+#define STOREU(x,y) _mm_storeu_si128((VREG*)(x),(y))
+#define ADD(x,y)    _mm_add_epi32((x),(y))
+#define SUB(x,y)    _mm_sub_epi32((x),(y))
+#define SAR(x,y)    _mm_srai_epi32((x),(y))
+#endif
+#define ADD3(x,y,z) ADD(ADD(x,y),z)
+
+static
+void opj_idwt53_v_final_memcpy(OPJ_INT32* tiledp_col,
+                               const OPJ_INT32* tmp,
+                               OPJ_INT32 len,
+                               OPJ_INT32 stride)
+{
+    OPJ_INT32 i;
+    for (i = 0; i < len; ++i) {
+        /* A memcpy(&tiledp_col[i * stride + 0],
+                    &tmp[PARALLEL_COLS_53 * i + 0],
+                    PARALLEL_COLS_53 * sizeof(OPJ_INT32))
+           would do but would be a tiny bit slower.
+           We can take here advantage of our knowledge of alignment */
+        STOREU(&tiledp_col[i * stride + 0],
+               LOAD(&tmp[PARALLEL_COLS_53 * i + 0]));
+        STOREU(&tiledp_col[i * stride + VREG_INT_COUNT],
+               LOAD(&tmp[PARALLEL_COLS_53 * i + VREG_INT_COUNT]));
+    }
+}
+
+/** Vertical inverse 5x3 wavelet transform for 8 columns in SSE2, or
+ * 16 in AVX2, when top-most pixel is on even coordinate */
+static void opj_idwt53_v_cas0_mcols_SSE2_OR_AVX2(
+    OPJ_INT32* tmp,
+    const OPJ_INT32 sn,
+    const OPJ_INT32 len,
+    OPJ_INT32* tiledp_col,
+    const OPJ_INT32 stride)
+{
+    const OPJ_INT32* in_even = &tiledp_col[0];
+    const OPJ_INT32* in_odd = &tiledp_col[sn * stride];
+
+    OPJ_INT32 i, j;
+    VREG d1c_0, d1n_0, s1n_0, s0c_0, s0n_0;
+    VREG d1c_1, d1n_1, s1n_1, s0c_1, s0n_1;
+    const VREG two = LOAD_CST(2);
+
+    assert(len > 1);
+#if __AVX2__
+    assert(PARALLEL_COLS_53 == 16);
+    assert(VREG_INT_COUNT == 8);
+#else
+    assert(PARALLEL_COLS_53 == 8);
+    assert(VREG_INT_COUNT == 4);
+#endif
+
+    /* Note: loads of input even/odd values must be done in a unaligned */
+    /* fashion. But stores in tmp can be done with aligned store, since */
+    /* the temporary buffer is properly aligned */
+    assert((size_t)tmp % (sizeof(OPJ_INT32) * VREG_INT_COUNT) == 0);
+
+    s1n_0 = LOADU(in_even + 0);
+    s1n_1 = LOADU(in_even + VREG_INT_COUNT);
+    d1n_0 = LOADU(in_odd);
+    d1n_1 = LOADU(in_odd + VREG_INT_COUNT);
+
+    /* s0n = s1n - ((d1n + 1) >> 1); <==> */
+    /* s0n = s1n - ((d1n + d1n + 2) >> 2); */
+    s0n_0 = SUB(s1n_0, SAR(ADD3(d1n_0, d1n_0, two), 2));
+    s0n_1 = SUB(s1n_1, SAR(ADD3(d1n_1, d1n_1, two), 2));
+
+    for (i = 0, j = 1; i < (len - 3); i += 2, j++) {
+        d1c_0 = d1n_0;
+        s0c_0 = s0n_0;
+        d1c_1 = d1n_1;
+        s0c_1 = s0n_1;
+
+        s1n_0 = LOADU(in_even + j * stride);
+        s1n_1 = LOADU(in_even + j * stride + VREG_INT_COUNT);
+        d1n_0 = LOADU(in_odd + j * stride);
+        d1n_1 = LOADU(in_odd + j * stride + VREG_INT_COUNT);
+
+        /*s0n = s1n - ((d1c + d1n + 2) >> 2);*/
+        s0n_0 = SUB(s1n_0, SAR(ADD3(d1c_0, d1n_0, two), 2));
+        s0n_1 = SUB(s1n_1, SAR(ADD3(d1c_1, d1n_1, two), 2));
+
+        STORE(tmp + PARALLEL_COLS_53 * (i + 0), s0c_0);
+        STORE(tmp + PARALLEL_COLS_53 * (i + 0) + VREG_INT_COUNT, s0c_1);
+
+        /* d1c + ((s0c + s0n) >> 1) */
+        STORE(tmp + PARALLEL_COLS_53 * (i + 1) + 0,
+              ADD(d1c_0, SAR(ADD(s0c_0, s0n_0), 1)));
+        STORE(tmp + PARALLEL_COLS_53 * (i + 1) + VREG_INT_COUNT,
+              ADD(d1c_1, SAR(ADD(s0c_1, s0n_1), 1)));
+    }
+
+    STORE(tmp + PARALLEL_COLS_53 * (i + 0) + 0, s0n_0);
+    STORE(tmp + PARALLEL_COLS_53 * (i + 0) + VREG_INT_COUNT, s0n_1);
+
+    if (len & 1) {
+        VREG tmp_len_minus_1;
+        s1n_0 = LOADU(in_even + ((len - 1) / 2) * stride);
+        /* tmp_len_minus_1 = s1n - ((d1n + 1) >> 1); */
+        tmp_len_minus_1 = SUB(s1n_0, SAR(ADD3(d1n_0, d1n_0, two), 2));
+        STORE(tmp + PARALLEL_COLS_53 * (len - 1), tmp_len_minus_1);
+        /* d1n + ((s0n + tmp_len_minus_1) >> 1) */
+        STORE(tmp + PARALLEL_COLS_53 * (len - 2),
+              ADD(d1n_0, SAR(ADD(s0n_0, tmp_len_minus_1), 1)));
+
+        s1n_1 = LOADU(in_even + ((len - 1) / 2) * stride + VREG_INT_COUNT);
+        /* tmp_len_minus_1 = s1n - ((d1n + 1) >> 1); */
+        tmp_len_minus_1 = SUB(s1n_1, SAR(ADD3(d1n_1, d1n_1, two), 2));
+        STORE(tmp + PARALLEL_COLS_53 * (len - 1) + VREG_INT_COUNT,
+              tmp_len_minus_1);
+        /* d1n + ((s0n + tmp_len_minus_1) >> 1) */
+        STORE(tmp + PARALLEL_COLS_53 * (len - 2) + VREG_INT_COUNT,
+              ADD(d1n_1, SAR(ADD(s0n_1, tmp_len_minus_1), 1)));
+
+
+    } else {
+        STORE(tmp + PARALLEL_COLS_53 * (len - 1) + 0,
+              ADD(d1n_0, s0n_0));
+        STORE(tmp + PARALLEL_COLS_53 * (len - 1) + VREG_INT_COUNT,
+              ADD(d1n_1, s0n_1));
+    }
+
+    opj_idwt53_v_final_memcpy(tiledp_col, tmp, len, stride);
+}
+
+
+/** Vertical inverse 5x3 wavelet transform for 8 columns in SSE2, or
+ * 16 in AVX2, when top-most pixel is on odd coordinate */
+static void opj_idwt53_v_cas1_mcols_SSE2_OR_AVX2(
+    OPJ_INT32* tmp,
+    const OPJ_INT32 sn,
+    const OPJ_INT32 len,
+    OPJ_INT32* tiledp_col,
+    const OPJ_INT32 stride)
+{
+    OPJ_INT32 i, j;
+
+    VREG s1_0, s2_0, dc_0, dn_0;
+    VREG s1_1, s2_1, dc_1, dn_1;
+    const VREG two = LOAD_CST(2);
+
+    const OPJ_INT32* in_even = &tiledp_col[sn * stride];
+    const OPJ_INT32* in_odd = &tiledp_col[0];
+
+    assert(len > 2);
+#if __AVX2__
+    assert(PARALLEL_COLS_53 == 16);
+    assert(VREG_INT_COUNT == 8);
+#else
+    assert(PARALLEL_COLS_53 == 8);
+    assert(VREG_INT_COUNT == 4);
+#endif
+
+    /* Note: loads of input even/odd values must be done in a unaligned */
+    /* fashion. But stores in tmp can be done with aligned store, since */
+    /* the temporary buffer is properly aligned */
+    assert((size_t)tmp % (sizeof(OPJ_INT32) * VREG_INT_COUNT) == 0);
+
+    s1_0 = LOADU(in_even + stride);
+    /* in_odd[0] - ((in_even[0] + s1 + 2) >> 2); */
+    dc_0 = SUB(LOADU(in_odd + 0),
+               SAR(ADD3(LOADU(in_even + 0), s1_0, two), 2));
+    STORE(tmp + PARALLEL_COLS_53 * 0, ADD(LOADU(in_even + 0), dc_0));
+
+    s1_1 = LOADU(in_even + stride + VREG_INT_COUNT);
+    /* in_odd[0] - ((in_even[0] + s1 + 2) >> 2); */
+    dc_1 = SUB(LOADU(in_odd + VREG_INT_COUNT),
+               SAR(ADD3(LOADU(in_even + VREG_INT_COUNT), s1_1, two), 2));
+    STORE(tmp + PARALLEL_COLS_53 * 0 + VREG_INT_COUNT,
+          ADD(LOADU(in_even + VREG_INT_COUNT), dc_1));
+
+    for (i = 1, j = 1; i < (len - 2 - !(len & 1)); i += 2, j++) {
+
+        s2_0 = LOADU(in_even + (j + 1) * stride);
+        s2_1 = LOADU(in_even + (j + 1) * stride + VREG_INT_COUNT);
+
+        /* dn = in_odd[j * stride] - ((s1 + s2 + 2) >> 2); */
+        dn_0 = SUB(LOADU(in_odd + j * stride),
+                   SAR(ADD3(s1_0, s2_0, two), 2));
+        dn_1 = SUB(LOADU(in_odd + j * stride + VREG_INT_COUNT),
+                   SAR(ADD3(s1_1, s2_1, two), 2));
+
+        STORE(tmp + PARALLEL_COLS_53 * i, dc_0);
+        STORE(tmp + PARALLEL_COLS_53 * i + VREG_INT_COUNT, dc_1);
+
+        /* tmp[i + 1] = s1 + ((dn + dc) >> 1); */
+        STORE(tmp + PARALLEL_COLS_53 * (i + 1) + 0,
+              ADD(s1_0, SAR(ADD(dn_0, dc_0), 1)));
+        STORE(tmp + PARALLEL_COLS_53 * (i + 1) + VREG_INT_COUNT,
+              ADD(s1_1, SAR(ADD(dn_1, dc_1), 1)));
+
+        dc_0 = dn_0;
+        s1_0 = s2_0;
+        dc_1 = dn_1;
+        s1_1 = s2_1;
+    }
+    STORE(tmp + PARALLEL_COLS_53 * i, dc_0);
+    STORE(tmp + PARALLEL_COLS_53 * i + VREG_INT_COUNT, dc_1);
+
+    if (!(len & 1)) {
+        /*dn = in_odd[(len / 2 - 1) * stride] - ((s1 + 1) >> 1); */
+        dn_0 = SUB(LOADU(in_odd + (len / 2 - 1) * stride),
+                   SAR(ADD3(s1_0, s1_0, two), 2));
+        dn_1 = SUB(LOADU(in_odd + (len / 2 - 1) * stride + VREG_INT_COUNT),
+                   SAR(ADD3(s1_1, s1_1, two), 2));
+
+        /* tmp[len - 2] = s1 + ((dn + dc) >> 1); */
+        STORE(tmp + PARALLEL_COLS_53 * (len - 2) + 0,
+              ADD(s1_0, SAR(ADD(dn_0, dc_0), 1)));
+        STORE(tmp + PARALLEL_COLS_53 * (len - 2) + VREG_INT_COUNT,
+              ADD(s1_1, SAR(ADD(dn_1, dc_1), 1)));
+
+        STORE(tmp + PARALLEL_COLS_53 * (len - 1) + 0, dn_0);
+        STORE(tmp + PARALLEL_COLS_53 * (len - 1) + VREG_INT_COUNT, dn_1);
+    } else {
+        STORE(tmp + PARALLEL_COLS_53 * (len - 1) + 0, ADD(s1_0, dc_0));
+        STORE(tmp + PARALLEL_COLS_53 * (len - 1) + VREG_INT_COUNT,
+              ADD(s1_1, dc_1));
+    }
+
+    opj_idwt53_v_final_memcpy(tiledp_col, tmp, len, stride);
+}
+
+#undef VREG
+#undef LOAD_CST
+#undef LOADU
+#undef LOAD
+#undef STORE
+#undef STOREU
+#undef ADD
+#undef ADD3
+#undef SUB
+#undef SAR
+
+#endif /* (defined(__SSE2__) || defined(__AVX2__)) && !defined(STANDARD_SLOW_VERSION) */
+
+#if !defined(STANDARD_SLOW_VERSION)
+/** Vertical inverse 5x3 wavelet transform for one column, when top-most
+ * pixel is on even coordinate */
+static void opj_idwt3_v_cas0(OPJ_INT32* tmp,
+                             const OPJ_INT32 sn,
+                             const OPJ_INT32 len,
+                             OPJ_INT32* tiledp_col,
+                             const OPJ_INT32 stride)
+{
+    OPJ_INT32 i, j;
+    OPJ_INT32 d1c, d1n, s1n, s0c, s0n;
+
+    assert(len > 1);
+
+    /* Performs lifting in one single iteration. Saves memory */
+    /* accesses and explicit interleaving. */
+
+    s1n = tiledp_col[0];
+    d1n = tiledp_col[sn * stride];
+    s0n = s1n - ((d1n + 1) >> 1);
+
+    for (i = 0, j = 0; i < (len - 3); i += 2, j++) {
+        d1c = d1n;
+        s0c = s0n;
+
+        s1n = tiledp_col[(j + 1) * stride];
+        d1n = tiledp_col[(sn + j + 1) * stride];
+
+        s0n = s1n - ((d1c + d1n + 2) >> 2);
+
+        tmp[i  ] = s0c;
+        tmp[i + 1] = d1c + ((s0c + s0n) >> 1);
+    }
+
+    tmp[i] = s0n;
+
+    if (len & 1) {
+        tmp[len - 1] =
+            tiledp_col[((len - 1) / 2) * stride] -
+            ((d1n + 1) >> 1);
+        tmp[len - 2] = d1n + ((s0n + tmp[len - 1]) >> 1);
+    } else {
+        tmp[len - 1] = d1n + s0n;
+    }
+
+    for (i = 0; i < len; ++i) {
+        tiledp_col[i * stride] = tmp[i];
+    }
+}
+
+
+/** Vertical inverse 5x3 wavelet transform for one column, when top-most
+ * pixel is on odd coordinate */
+static void opj_idwt3_v_cas1(OPJ_INT32* tmp,
+                             const OPJ_INT32 sn,
+                             const OPJ_INT32 len,
+                             OPJ_INT32* tiledp_col,
+                             const OPJ_INT32 stride)
+{
+    OPJ_INT32 i, j;
+    OPJ_INT32 s1, s2, dc, dn;
+    const OPJ_INT32* in_even = &tiledp_col[sn * stride];
+    const OPJ_INT32* in_odd = &tiledp_col[0];
+
+    assert(len > 2);
+
+    /* Performs lifting in one single iteration. Saves memory */
+    /* accesses and explicit interleaving. */
+
+    s1 = in_even[stride];
+    dc = in_odd[0] - ((in_even[0] + s1 + 2) >> 2);
+    tmp[0] = in_even[0] + dc;
+    for (i = 1, j = 1; i < (len - 2 - !(len & 1)); i += 2, j++) {
+
+        s2 = in_even[(j + 1) * stride];
+
+        dn = in_odd[j * stride] - ((s1 + s2 + 2) >> 2);
+        tmp[i  ] = dc;
+        tmp[i + 1] = s1 + ((dn + dc) >> 1);
+
+        dc = dn;
+        s1 = s2;
+    }
+    tmp[i] = dc;
+    if (!(len & 1)) {
+        dn = in_odd[(len / 2 - 1) * stride] - ((s1 + 1) >> 1);
+        tmp[len - 2] = s1 + ((dn + dc) >> 1);
+        tmp[len - 1] = dn;
+    } else {
+        tmp[len - 1] = s1 + dc;
+    }
+
+    for (i = 0; i < len; ++i) {
+        tiledp_col[i * stride] = tmp[i];
+    }
+}
+#endif /* !defined(STANDARD_SLOW_VERSION) */
+
+/* <summary>                            */
+/* Inverse vertical 5-3 wavelet transform in 1-D for several columns. */
+/* </summary>                           */
+/* Performs interleave, inverse wavelet transform and copy back to buffer */
+static void opj_idwt53_v(const opj_dwt_t *dwt,
+                         OPJ_INT32* tiledp_col,
+                         OPJ_INT32 stride,
+                         OPJ_INT32 nb_cols)
+{
+#ifdef STANDARD_SLOW_VERSION
+    /* For documentation purpose */
+    OPJ_INT32 k, c;
+    for (c = 0; c < nb_cols; c ++) {
+        opj_dwt_interleave_v(dwt, tiledp_col + c, stride);
+        opj_dwt_decode_1(dwt);
+        for (k = 0; k < dwt->sn + dwt->dn; ++k) {
+            tiledp_col[c + k * stride] = dwt->mem[k];
+        }
+    }
+#else
+    const OPJ_INT32 sn = dwt->sn;
+    const OPJ_INT32 len = sn + dwt->dn;
+    if (dwt->cas == 0) {
+        /* If len == 1, unmodified value */
+
+#if (defined(__SSE2__) || defined(__AVX2__))
+        if (len > 1 && nb_cols == PARALLEL_COLS_53) {
+            /* Same as below general case, except that thanks to SSE2/AVX2 */
+            /* we can efficently process 8/16 columns in parallel */
+            opj_idwt53_v_cas0_mcols_SSE2_OR_AVX2(dwt->mem, sn, len, tiledp_col, stride);
+            return;
+        }
+#endif
+        if (len > 1) {
+            OPJ_INT32 c;
+            for (c = 0; c < nb_cols; c++, tiledp_col++) {
+                opj_idwt3_v_cas0(dwt->mem, sn, len, tiledp_col, stride);
+            }
+            return;
+        }
+    } else {
+        if (len == 1) {
+            OPJ_INT32 c;
+            for (c = 0; c < nb_cols; c++, tiledp_col++) {
+                tiledp_col[0] /= 2;
+            }
+            return;
+        }
+
+        if (len == 2) {
+            OPJ_INT32 c;
+            OPJ_INT32* out = dwt->mem;
+            for (c = 0; c < nb_cols; c++, tiledp_col++) {
+                OPJ_INT32 i;
+                const OPJ_INT32* in_even = &tiledp_col[sn * stride];
+                const OPJ_INT32* in_odd = &tiledp_col[0];
+
+                out[1] = in_odd[0] - ((in_even[0] + 1) >> 1);
+                out[0] = in_even[0] + out[1];
+
+                for (i = 0; i < len; ++i) {
+                    tiledp_col[i * stride] = out[i];
+                }
+            }
+
+            return;
+        }
+
+#if (defined(__SSE2__) || defined(__AVX2__))
+        if (len > 2 && nb_cols == PARALLEL_COLS_53) {
+            /* Same as below general case, except that thanks to SSE2/AVX2 */
+            /* we can efficently process 8/16 columns in parallel */
+            opj_idwt53_v_cas1_mcols_SSE2_OR_AVX2(dwt->mem, sn, len, tiledp_col, stride);
+            return;
+        }
+#endif
+        if (len > 2) {
+            OPJ_INT32 c;
+            for (c = 0; c < nb_cols; c++, tiledp_col++) {
+                opj_idwt3_v_cas1(dwt->mem, sn, len, tiledp_col, stride);
+            }
+            return;
+        }
+    }
+#endif
+}
+
+
 /* <summary>                             */
 /* Forward 9-7 wavelet transform in 1-D. */
 /* </summary>                            */
-static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_SIZE_T a_count, OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas) {
-	OPJ_INT32 i;
-	if (!cas) {
-		if ((dn > 0) || (sn > 1)) {	/* NEW :  CASE ONE ELEMENT */
-			for (i = 0; i < dn; i++)
-				OPJ_D(i) -= opj_int_fix_mul(OPJ_S_(i) + OPJ_S_(i + 1), 12993);
-			for (i = 0; i < sn; i++)
-				OPJ_S(i) -= opj_int_fix_mul(OPJ_D_(i - 1) + OPJ_D_(i), 434);
-			for (i = 0; i < dn; i++)
-				OPJ_D(i) += opj_int_fix_mul(OPJ_S_(i) + OPJ_S_(i + 1), 7233);
-			for (i = 0; i < sn; i++)
-				OPJ_S(i) += opj_int_fix_mul(OPJ_D_(i - 1) + OPJ_D_(i), 3633);
-			for (i = 0; i < dn; i++)
-				OPJ_D(i) = opj_int_fix_mul(OPJ_D(i), 5038);	/*5038 */
-			for (i = 0; i < sn; i++)
-				OPJ_S(i) = opj_int_fix_mul(OPJ_S(i), 6659);	/*6660 */
-		}
-	} else {
-		if ((sn > 0) || (dn > 1)) {	/* NEW :  CASE ONE ELEMENT */
-			for (i = 0; i < dn; i++)
-				OPJ_S(i) -= opj_int_fix_mul(OPJ_DD_(i) + OPJ_DD_(i - 1), 12993);
-			for (i = 0; i < sn; i++)
-				OPJ_D(i) -= opj_int_fix_mul(OPJ_SS_(i) + OPJ_SS_(i + 1), 434);
-			for (i = 0; i < dn; i++)
-				OPJ_S(i) += opj_int_fix_mul(OPJ_DD_(i) + OPJ_DD_(i - 1), 7233);
-			for (i = 0; i < sn; i++)
-				OPJ_D(i) += opj_int_fix_mul(OPJ_SS_(i) + OPJ_SS_(i + 1), 3633);
-			for (i = 0; i < dn; i++)
-				OPJ_S(i) = opj_int_fix_mul(OPJ_S(i), 5038);	/*5038 */
-			for (i = 0; i < sn; i++)
-				OPJ_D(i) = opj_int_fix_mul(OPJ_D(i), 6659);	/*6660 */
-		}
-	}
+static void opj_dwt_encode_1_real(OPJ_INT32 *a, OPJ_SIZE_T a_count,
+                                  OPJ_INT32 dn, OPJ_INT32 sn, OPJ_INT32 cas)
+{
+    OPJ_INT32 i;
+    if (!cas) {
+        if ((dn > 0) || (sn > 1)) { /* NEW :  CASE ONE ELEMENT */
+            for (i = 0; i < dn; i++) {
+                OPJ_D(i) -= opj_int_fix_mul(OPJ_S_(i) + OPJ_S_(i + 1), 12993);
+            }
+            for (i = 0; i < sn; i++) {
+                OPJ_S(i) -= opj_int_fix_mul(OPJ_D_(i - 1) + OPJ_D_(i), 434);
+            }
+            for (i = 0; i < dn; i++) {
+                OPJ_D(i) += opj_int_fix_mul(OPJ_S_(i) + OPJ_S_(i + 1), 7233);
+            }
+            for (i = 0; i < sn; i++) {
+                OPJ_S(i) += opj_int_fix_mul(OPJ_D_(i - 1) + OPJ_D_(i), 3633);
+            }
+            for (i = 0; i < dn; i++) {
+                OPJ_D(i) = opj_int_fix_mul(OPJ_D(i), 5038);    /*5038 */
+            }
+            for (i = 0; i < sn; i++) {
+                OPJ_S(i) = opj_int_fix_mul(OPJ_S(i), 6659);    /*6660 */
+            }
+        }
+    } else {
+        if ((sn > 0) || (dn > 1)) { /* NEW :  CASE ONE ELEMENT */
+            for (i = 0; i < dn; i++) {
+                OPJ_S(i) -= opj_int_fix_mul(OPJ_DD_(i) + OPJ_DD_(i - 1), 12993);
+            }
+            for (i = 0; i < sn; i++) {
+                OPJ_D(i) -= opj_int_fix_mul(OPJ_SS_(i) + OPJ_SS_(i + 1), 434);
+            }
+            for (i = 0; i < dn; i++) {
+                OPJ_S(i) += opj_int_fix_mul(OPJ_DD_(i) + OPJ_DD_(i - 1), 7233);
+            }
+            for (i = 0; i < sn; i++) {
+                OPJ_D(i) += opj_int_fix_mul(OPJ_SS_(i) + OPJ_SS_(i + 1), 3633);
+            }
+            for (i = 0; i < dn; i++) {
+                OPJ_S(i) = opj_int_fix_mul(OPJ_S(i), 5038);    /*5038 */
+            }
+            for (i = 0; i < sn; i++) {
+                OPJ_D(i) = opj_int_fix_mul(OPJ_D(i), 6659);    /*6660 */
+            }
+        }
+    }
 }
 
-static void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps, opj_stepsize_t *bandno_stepsize) {
-	OPJ_INT32 p, n;
-	p = opj_int_floorlog2(stepsize) - 13;
-	n = 11 - opj_int_floorlog2(stepsize);
-	bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;
-	bandno_stepsize->expn = numbps - p;
+static void opj_dwt_encode_stepsize(OPJ_INT32 stepsize, OPJ_INT32 numbps,
+                                    opj_stepsize_t *bandno_stepsize)
+{
+    OPJ_INT32 p, n;
+    p = opj_int_floorlog2(stepsize) - 13;
+    n = 11 - opj_int_floorlog2(stepsize);
+    bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;
+    bandno_stepsize->expn = numbps - p;
 }
 
-/* 
+/*
 ==========================================================
    DWT interface
 ==========================================================
@@ -390,115 +1086,131 @@
 /* <summary>                            */
 /* Forward 5-3 wavelet transform in 2-D. */
 /* </summary>                           */
-static INLINE OPJ_BOOL opj_dwt_encode_procedure(const opj_tcd_tilecomp_t * tilec, void(*p_function)(OPJ_INT32 *, OPJ_SIZE_T, OPJ_INT32, OPJ_INT32, OPJ_INT32))
+static INLINE OPJ_BOOL opj_dwt_encode_procedure(const opj_tcd_tilecomp_t * tilec,
+        void(*p_function)(OPJ_INT32 *, OPJ_SIZE_T, OPJ_INT32, OPJ_INT32, OPJ_INT32))
 {
-	OPJ_INT32 i, j, k;
-	OPJ_INT32 *a = 00;
-	OPJ_INT32 *aj = 00;
-	OPJ_INT32 *bj = 00;
-	OPJ_INT32 w, l;
+    OPJ_INT32 i, j, k;
+    OPJ_INT32 *a = 00;
+    OPJ_INT32 *aj = 00;
+    OPJ_INT32 *bj = 00;
+    OPJ_INT32 w, l;
 
-	OPJ_INT32 rw;			/* width of the resolution level computed   */
-	OPJ_INT32 rh;			/* height of the resolution level computed  */
-	OPJ_SIZE_T l_data_count;
-	OPJ_SIZE_T l_data_size;
+    OPJ_INT32 rw;           /* width of the resolution level computed   */
+    OPJ_INT32 rh;           /* height of the resolution level computed  */
+    size_t l_data_count;
+    size_t l_data_size;
 
-	opj_tcd_resolution_t * l_cur_res = 0;
-	opj_tcd_resolution_t * l_last_res = 0;
+    opj_tcd_resolution_t * l_cur_res = 0;
+    opj_tcd_resolution_t * l_last_res = 0;
 
-	w = tilec->x1-tilec->x0;
-	l = (OPJ_INT32)tilec->numresolutions-1;
-	a = tilec->data;
+    w = tilec->x1 - tilec->x0;
+    l = (OPJ_INT32)tilec->numresolutions - 1;
+    a = tilec->data;
 
-	l_cur_res = tilec->resolutions + l;
-	l_last_res = l_cur_res - 1;
+    l_cur_res = tilec->resolutions + l;
+    l_last_res = l_cur_res - 1;
 
-	l_data_count = opj_dwt_max_resolution(tilec->resolutions, tilec->numresolutions) * (OPJ_UINT32)sizeof(OPJ_INT32);
-	l_data_size = l_data_count * (OPJ_UINT32)sizeof(OPJ_INT32);
-	bj = (OPJ_INT32*)opj_malloc(l_data_size);
-	if (! bj) {
-		return OPJ_FALSE;
-	}
-	i = l;
+    l_data_count = opj_dwt_max_resolution(tilec->resolutions, tilec->numresolutions);
+    /* overflow check */
+    if (l_data_count > (SIZE_MAX / sizeof(OPJ_INT32))) {
+        /* FIXME event manager error callback */
+        return OPJ_FALSE;
+    }
+    l_data_size = l_data_count * sizeof(OPJ_INT32);
+    bj = (OPJ_INT32*)opj_malloc(l_data_size);
+    /* l_data_size is equal to 0 when numresolutions == 1 but bj is not used */
+    /* in that case, so do not error out */
+    if (l_data_size != 0 && ! bj) {
+        return OPJ_FALSE;
+    }
+    i = l;
 
-	while (i--) {
-		OPJ_INT32 rw1;		/* width of the resolution level once lower than computed one                                       */
-		OPJ_INT32 rh1;		/* height of the resolution level once lower than computed one                                      */
-		OPJ_INT32 cas_col;	/* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
-		OPJ_INT32 cas_row;	/* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */
-		OPJ_INT32 dn, sn;
+    while (i--) {
+        OPJ_INT32 rw1;      /* width of the resolution level once lower than computed one                                       */
+        OPJ_INT32 rh1;      /* height of the resolution level once lower than computed one                                      */
+        OPJ_INT32 cas_col;  /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
+        OPJ_INT32 cas_row;  /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering   */
+        OPJ_INT32 dn, sn;
 
-		rw  = l_cur_res->x1 - l_cur_res->x0;
-		rh  = l_cur_res->y1 - l_cur_res->y0;
-		rw1 = l_last_res->x1 - l_last_res->x0;
-		rh1 = l_last_res->y1 - l_last_res->y0;
+        rw  = l_cur_res->x1 - l_cur_res->x0;
+        rh  = l_cur_res->y1 - l_cur_res->y0;
+        rw1 = l_last_res->x1 - l_last_res->x0;
+        rh1 = l_last_res->y1 - l_last_res->y0;
 
-		cas_row = l_cur_res->x0 & 1;
-		cas_col = l_cur_res->y0 & 1;
+        cas_row = l_cur_res->x0 & 1;
+        cas_col = l_cur_res->y0 & 1;
 
-		sn = rh1;
-		dn = rh - rh1;
-		for (j = 0; j < rw; ++j) {
-			aj = a + j;
-			for (k = 0; k < rh; ++k) {
-				bj[k] = aj[k*w];
-			}
+        sn = rh1;
+        dn = rh - rh1;
+        for (j = 0; j < rw; ++j) {
+            aj = a + j;
+            for (k = 0; k < rh; ++k) {
+                bj[k] = aj[k * w];
+            }
 
-			(*p_function) (bj, l_data_count, dn, sn, cas_col);
+            (*p_function) (bj, l_data_count, dn, sn, cas_col);
 
-			opj_dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
-		}
+            opj_dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
+        }
 
-		sn = rw1;
-		dn = rw - rw1;
+        sn = rw1;
+        dn = rw - rw1;
 
-		for (j = 0; j < rh; j++) {
-			aj = a + j * w;
-			for (k = 0; k < rw; k++)  bj[k] = aj[k];
-			(*p_function) (bj, l_data_count, dn, sn, cas_row);
-			opj_dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
-		}
+        for (j = 0; j < rh; j++) {
+            aj = a + j * w;
+            for (k = 0; k < rw; k++) {
+                bj[k] = aj[k];
+            }
+            (*p_function) (bj, l_data_count, dn, sn, cas_row);
+            opj_dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
+        }
 
-		l_cur_res = l_last_res;
+        l_cur_res = l_last_res;
 
-		--l_last_res;
-	}
+        --l_last_res;
+    }
 
-	opj_free(bj);
-	return OPJ_TRUE;
+    opj_free(bj);
+    return OPJ_TRUE;
 }
 
 /* Forward 5-3 wavelet transform in 2-D. */
 /* </summary>                           */
 OPJ_BOOL opj_dwt_encode(opj_tcd_tilecomp_t * tilec)
 {
-	return opj_dwt_encode_procedure(tilec,opj_dwt_encode_1);
+    return opj_dwt_encode_procedure(tilec, opj_dwt_encode_1);
 }
 
 /* <summary>                            */
 /* Inverse 5-3 wavelet transform in 2-D. */
 /* </summary>                           */
-OPJ_BOOL opj_dwt_decode(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres) {
-	return opj_dwt_decode_tile(tilec, numres, &opj_dwt_decode_1);
+OPJ_BOOL opj_dwt_decode(opj_thread_pool_t* tp, opj_tcd_tilecomp_t* tilec,
+                        OPJ_UINT32 numres)
+{
+    return opj_dwt_decode_tile(tp, tilec, numres);
 }
 
 
 /* <summary>                          */
 /* Get gain of 5-3 wavelet transform. */
 /* </summary>                         */
-OPJ_UINT32 opj_dwt_getgain(OPJ_UINT32 orient) {
-	if (orient == 0)
-		return 0;
-	if (orient == 1 || orient == 2)
-		return 1;
-	return 2;
+OPJ_UINT32 opj_dwt_getgain(OPJ_UINT32 orient)
+{
+    if (orient == 0) {
+        return 0;
+    }
+    if (orient == 1 || orient == 2) {
+        return 1;
+    }
+    return 2;
 }
 
 /* <summary>                */
 /* Get norm of 5-3 wavelet. */
 /* </summary>               */
-OPJ_FLOAT64 opj_dwt_getnorm(OPJ_UINT32 level, OPJ_UINT32 orient) {
-	return opj_dwt_norms[orient][level];
+OPJ_FLOAT64 opj_dwt_getnorm(OPJ_UINT32 level, OPJ_UINT32 orient)
+{
+    return opj_dwt_norms[orient][level];
 }
 
 /* <summary>                             */
@@ -506,297 +1218,477 @@
 /* </summary>                            */
 OPJ_BOOL opj_dwt_encode_real(opj_tcd_tilecomp_t * tilec)
 {
-	return opj_dwt_encode_procedure(tilec,opj_dwt_encode_1_real);
+    return opj_dwt_encode_procedure(tilec, opj_dwt_encode_1_real);
 }
 
 /* <summary>                          */
 /* Get gain of 9-7 wavelet transform. */
 /* </summary>                         */
-OPJ_UINT32 opj_dwt_getgain_real(OPJ_UINT32 orient) {
-	(void)orient;
-	return 0;
+OPJ_UINT32 opj_dwt_getgain_real(OPJ_UINT32 orient)
+{
+    (void)orient;
+    return 0;
 }
 
 /* <summary>                */
 /* Get norm of 9-7 wavelet. */
 /* </summary>               */
-OPJ_FLOAT64 opj_dwt_getnorm_real(OPJ_UINT32 level, OPJ_UINT32 orient) {
-	return opj_dwt_norms_real[orient][level];
+OPJ_FLOAT64 opj_dwt_getnorm_real(OPJ_UINT32 level, OPJ_UINT32 orient)
+{
+    return opj_dwt_norms_real[orient][level];
 }
 
-void opj_dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, OPJ_UINT32 prec) {
-	OPJ_UINT32 numbands, bandno;
-	numbands = 3 * tccp->numresolutions - 2;
-	for (bandno = 0; bandno < numbands; bandno++) {
-		OPJ_FLOAT64 stepsize;
-		OPJ_UINT32 resno, level, orient, gain;
+void opj_dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, OPJ_UINT32 prec)
+{
+    OPJ_UINT32 numbands, bandno;
+    numbands = 3 * tccp->numresolutions - 2;
+    for (bandno = 0; bandno < numbands; bandno++) {
+        OPJ_FLOAT64 stepsize;
+        OPJ_UINT32 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 {
-			OPJ_FLOAT64 norm = opj_dwt_norms_real[orient][level];
-			stepsize = (1 << (gain)) / norm;
-		}
-		opj_dwt_encode_stepsize((OPJ_INT32) floor(stepsize * 8192.0), (OPJ_INT32)(prec + gain), &tccp->stepsizes[bandno]);
-	}
+        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 {
+            OPJ_FLOAT64 norm = opj_dwt_norms_real[orient][level];
+            stepsize = (1 << (gain)) / norm;
+        }
+        opj_dwt_encode_stepsize((OPJ_INT32) floor(stepsize * 8192.0),
+                                (OPJ_INT32)(prec + gain), &tccp->stepsizes[bandno]);
+    }
 }
 
 /* <summary>                             */
 /* Determine maximum computed resolution level for inverse wavelet transform */
 /* </summary>                            */
-static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* restrict r, OPJ_UINT32 i) {
-	OPJ_UINT32 mr	= 0;
-	OPJ_UINT32 w;
-	while( --i ) {
-		++r;
-		if( mr < ( w = (OPJ_UINT32)(r->x1 - r->x0) ) )
-			mr = w ;
-		if( mr < ( w = (OPJ_UINT32)(r->y1 - r->y0) ) )
-			mr = w ;
-	}
-	return mr ;
+static OPJ_UINT32 opj_dwt_max_resolution(opj_tcd_resolution_t* OPJ_RESTRICT r,
+        OPJ_UINT32 i)
+{
+    OPJ_UINT32 mr   = 0;
+    OPJ_UINT32 w;
+    while (--i) {
+        ++r;
+        if (mr < (w = (OPJ_UINT32)(r->x1 - r->x0))) {
+            mr = w ;
+        }
+        if (mr < (w = (OPJ_UINT32)(r->y1 - r->y0))) {
+            mr = w ;
+        }
+    }
+    return mr ;
 }
 
+typedef struct {
+    opj_dwt_t h;
+    OPJ_UINT32 rw;
+    OPJ_UINT32 w;
+    OPJ_INT32 * OPJ_RESTRICT tiledp;
+    OPJ_UINT32 min_j;
+    OPJ_UINT32 max_j;
+} opj_dwd_decode_h_job_t;
+
+static void opj_dwt_decode_h_func(void* user_data, opj_tls_t* tls)
+{
+    OPJ_UINT32 j;
+    opj_dwd_decode_h_job_t* job;
+    (void)tls;
+
+    job = (opj_dwd_decode_h_job_t*)user_data;
+    for (j = job->min_j; j < job->max_j; j++) {
+        opj_idwt53_h(&job->h, &job->tiledp[j * job->w]);
+    }
+
+    opj_aligned_free(job->h.mem);
+    opj_free(job);
+}
+
+typedef struct {
+    opj_dwt_t v;
+    OPJ_UINT32 rh;
+    OPJ_UINT32 w;
+    OPJ_INT32 * OPJ_RESTRICT tiledp;
+    OPJ_UINT32 min_j;
+    OPJ_UINT32 max_j;
+} opj_dwd_decode_v_job_t;
+
+static void opj_dwt_decode_v_func(void* user_data, opj_tls_t* tls)
+{
+    OPJ_UINT32 j;
+    opj_dwd_decode_v_job_t* job;
+    (void)tls;
+
+    job = (opj_dwd_decode_v_job_t*)user_data;
+    for (j = job->min_j; j + PARALLEL_COLS_53 <= job->max_j;
+            j += PARALLEL_COLS_53) {
+        opj_idwt53_v(&job->v, &job->tiledp[j], (OPJ_INT32)job->w,
+                     PARALLEL_COLS_53);
+    }
+    if (j < job->max_j)
+        opj_idwt53_v(&job->v, &job->tiledp[j], (OPJ_INT32)job->w,
+                     (OPJ_INT32)(job->max_j - j));
+
+    opj_aligned_free(job->v.mem);
+    opj_free(job);
+}
+
+
 /* <summary>                            */
-/* Inverse wavelet transform in 2-D.     */
+/* Inverse wavelet transform in 2-D.    */
 /* </summary>                           */
-static OPJ_BOOL opj_dwt_decode_tile(const opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres, DWT1DFN dwt_1D) {
-	opj_dwt_t h;
-	opj_dwt_t v;
+static OPJ_BOOL opj_dwt_decode_tile(opj_thread_pool_t* tp,
+        const opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres)
+{
+    opj_dwt_t h;
+    opj_dwt_t v;
 
-	opj_tcd_resolution_t* tr = tilec->resolutions;
+    opj_tcd_resolution_t* tr = tilec->resolutions;
 
-	OPJ_UINT32 rw = (OPJ_UINT32)(tr->x1 - tr->x0);	/* width of the resolution level computed */
-	OPJ_UINT32 rh = (OPJ_UINT32)(tr->y1 - tr->y0);	/* height of the resolution level computed */
+    OPJ_UINT32 rw = (OPJ_UINT32)(tr->x1 -
+                                 tr->x0);  /* width of the resolution level computed */
+    OPJ_UINT32 rh = (OPJ_UINT32)(tr->y1 -
+                                 tr->y0);  /* height of the resolution level computed */
 
-	OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
+    OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
+    size_t h_mem_size;
+    int num_threads;
 
-	h.mem_count = opj_dwt_max_resolution(tr, numres);
-	if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(OPJ_INT32) < (OPJ_UINT32)h.mem_count) {
-		return OPJ_FALSE;
-	}
-	h.mem = (OPJ_INT32*)opj_aligned_malloc(h.mem_count * sizeof(OPJ_INT32));
-	if (! h.mem){
-		/* FIXME event manager error callback */
-		return OPJ_FALSE;
-	}
+    if (numres == 1U) {
+        return OPJ_TRUE;
+    }
+    num_threads = opj_thread_pool_get_thread_count(tp);
+    h.mem_count = opj_dwt_max_resolution(tr, numres);
+    /* overflow check */
+    if (h.mem_count > (SIZE_MAX / PARALLEL_COLS_53 / sizeof(OPJ_INT32))) {
+        /* FIXME event manager error callback */
+        return OPJ_FALSE;
+    }
+    /* We need PARALLEL_COLS_53 times the height of the array, */
+    /* since for the vertical pass */
+    /* we process PARALLEL_COLS_53 columns at a time */
+    h_mem_size = h.mem_count * PARALLEL_COLS_53 * sizeof(OPJ_INT32);
+    h.mem = (OPJ_INT32*)opj_aligned_32_malloc(h_mem_size);
+    if (! h.mem) {
+        /* FIXME event manager error callback */
+        return OPJ_FALSE;
+    }
 
-	v.mem_count = h.mem_count;
-	v.mem = h.mem;
+    v.mem_count = h.mem_count;
+    v.mem = h.mem;
 
-	while( --numres) {
-		OPJ_INT32 * restrict tiledp = tilec->data;
-		OPJ_UINT32 j;
+    while (--numres) {
+        OPJ_INT32 * OPJ_RESTRICT tiledp = tilec->data;
+        OPJ_UINT32 j;
 
-		++tr;
-		h.sn = (OPJ_INT32)rw;
-		v.sn = (OPJ_INT32)rh;
+        ++tr;
+        h.sn = (OPJ_INT32)rw;
+        v.sn = (OPJ_INT32)rh;
 
-		rw = (OPJ_UINT32)(tr->x1 - tr->x0);
-		rh = (OPJ_UINT32)(tr->y1 - tr->y0);
+        rw = (OPJ_UINT32)(tr->x1 - tr->x0);
+        rh = (OPJ_UINT32)(tr->y1 - tr->y0);
 
-		h.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn);
-		h.cas = tr->x0 % 2;
+        h.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn);
+        h.cas = tr->x0 % 2;
 
-		for(j = 0; j < rh; ++j) {
-			opj_dwt_interleave_h(&h, &tiledp[j*w]);
-			(dwt_1D)(&h);
-			memcpy(&tiledp[j*w], h.mem, rw * sizeof(OPJ_INT32));
-		}
+        if (num_threads <= 1 || rh <= 1) {
+            for (j = 0; j < rh; ++j) {
+                opj_idwt53_h(&h, &tiledp[j * w]);
+            }
+        } else {
+            OPJ_UINT32 num_jobs = (OPJ_UINT32)num_threads;
+            OPJ_UINT32 step_j;
 
-		v.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn);
-		v.cas = tr->y0 % 2;
+            if (rh < num_jobs) {
+                num_jobs = rh;
+            }
+            step_j = (rh / num_jobs);
 
-		for(j = 0; j < rw; ++j){
-			OPJ_UINT32 k;
-			opj_dwt_interleave_v(&v, &tiledp[j], (OPJ_INT32)w);
-			(dwt_1D)(&v);
-			for(k = 0; k < rh; ++k) {
-				tiledp[k * w + j] = v.mem[k];
-			}
-		}
-	}
-	opj_aligned_free(h.mem);
-	return OPJ_TRUE;
+            for (j = 0; j < num_jobs; j++) {
+                opj_dwd_decode_h_job_t* job;
+
+                job = (opj_dwd_decode_h_job_t*) opj_malloc(sizeof(opj_dwd_decode_h_job_t));
+                if (!job) {
+                    /* It would be nice to fallback to single thread case, but */
+                    /* unfortunately some jobs may be launched and have modified */
+                    /* tiledp, so it is not practical to recover from that error */
+                    /* FIXME event manager error callback */
+                    opj_thread_pool_wait_completion(tp, 0);
+                    opj_aligned_free(h.mem);
+                    return OPJ_FALSE;
+                }
+                job->h = h;
+                job->rw = rw;
+                job->w = w;
+                job->tiledp = tiledp;
+                job->min_j = j * step_j;
+                job->max_j = (j + 1U) * step_j; /* this can overflow */
+                if (j == (num_jobs - 1U)) {  /* this will take care of the overflow */
+                    job->max_j = rh;
+                }
+                job->h.mem = (OPJ_INT32*)opj_aligned_32_malloc(h_mem_size);
+                if (!job->h.mem) {
+                    /* FIXME event manager error callback */
+                    opj_thread_pool_wait_completion(tp, 0);
+                    opj_free(job);
+                    opj_aligned_free(h.mem);
+                    return OPJ_FALSE;
+                }
+                opj_thread_pool_submit_job(tp, opj_dwt_decode_h_func, job);
+            }
+            opj_thread_pool_wait_completion(tp, 0);
+        }
+
+        v.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn);
+        v.cas = tr->y0 % 2;
+
+        if (num_threads <= 1 || rw <= 1) {
+            for (j = 0; j + PARALLEL_COLS_53 <= rw;
+                    j += PARALLEL_COLS_53) {
+                opj_idwt53_v(&v, &tiledp[j], (OPJ_INT32)w, PARALLEL_COLS_53);
+            }
+            if (j < rw) {
+                opj_idwt53_v(&v, &tiledp[j], (OPJ_INT32)w, (OPJ_INT32)(rw - j));
+            }
+        } else {
+            OPJ_UINT32 num_jobs = (OPJ_UINT32)num_threads;
+            OPJ_UINT32 step_j;
+
+            if (rw < num_jobs) {
+                num_jobs = rw;
+            }
+            step_j = (rw / num_jobs);
+
+            for (j = 0; j < num_jobs; j++) {
+                opj_dwd_decode_v_job_t* job;
+
+                job = (opj_dwd_decode_v_job_t*) opj_malloc(sizeof(opj_dwd_decode_v_job_t));
+                if (!job) {
+                    /* It would be nice to fallback to single thread case, but */
+                    /* unfortunately some jobs may be launched and have modified */
+                    /* tiledp, so it is not practical to recover from that error */
+                    /* FIXME event manager error callback */
+                    opj_thread_pool_wait_completion(tp, 0);
+                    opj_aligned_free(v.mem);
+                    return OPJ_FALSE;
+                }
+                job->v = v;
+                job->rh = rh;
+                job->w = w;
+                job->tiledp = tiledp;
+                job->min_j = j * step_j;
+                job->max_j = (j + 1U) * step_j; /* this can overflow */
+                if (j == (num_jobs - 1U)) {  /* this will take care of the overflow */
+                    job->max_j = rw;
+                }
+                job->v.mem = (OPJ_INT32*)opj_aligned_32_malloc(h_mem_size);
+                if (!job->v.mem) {
+                    /* FIXME event manager error callback */
+                    opj_thread_pool_wait_completion(tp, 0);
+                    opj_free(job);
+                    opj_aligned_free(v.mem);
+                    return OPJ_FALSE;
+                }
+                opj_thread_pool_submit_job(tp, opj_dwt_decode_v_func, job);
+            }
+            opj_thread_pool_wait_completion(tp, 0);
+        }
+    }
+    opj_aligned_free(h.mem);
+    return OPJ_TRUE;
 }
 
-static void opj_v4dwt_interleave_h(opj_v4dwt_t* restrict w, OPJ_FLOAT32* restrict a, OPJ_INT32 x, OPJ_INT32 size){
-	OPJ_FLOAT32* restrict bi = (OPJ_FLOAT32*) (w->wavelet + w->cas);
-	OPJ_INT32 count = w->sn;
-	OPJ_INT32 i, k;
+static void opj_v4dwt_interleave_h(opj_v4dwt_t* OPJ_RESTRICT w,
+                                   OPJ_FLOAT32* OPJ_RESTRICT a, OPJ_INT32 x, OPJ_INT32 size)
+{
+    OPJ_FLOAT32* OPJ_RESTRICT bi = (OPJ_FLOAT32*)(w->wavelet + w->cas);
+    OPJ_INT32 count = w->sn;
+    OPJ_INT32 i, k;
 
-	for(k = 0; k < 2; ++k){
-		if ( count + 3 * x < size && ((size_t) a & 0x0f) == 0 && ((size_t) bi & 0x0f) == 0 && (x & 0x0f) == 0 ) {
-			/* Fast code path */
-			for(i = 0; i < count; ++i){
-				OPJ_INT32 j = i;
-				bi[i*8    ] = a[j];
-				j += x;
-				bi[i*8 + 1] = a[j];
-				j += x;
-				bi[i*8 + 2] = a[j];
-				j += x;
-				bi[i*8 + 3] = a[j];
-			}
-		}
-		else {
-			/* Slow code path */
-			for(i = 0; i < count; ++i){
-				OPJ_INT32 j = i;
-				bi[i*8    ] = a[j];
-				j += x;
-				if(j >= size) continue;
-				bi[i*8 + 1] = a[j];
-				j += x;
-				if(j >= size) continue;
-				bi[i*8 + 2] = a[j];
-				j += x;
-				if(j >= size) continue;
-				bi[i*8 + 3] = a[j]; /* This one*/
-			}
-		}
+    for (k = 0; k < 2; ++k) {
+        if (count + 3 * x < size && ((size_t) a & 0x0f) == 0 &&
+                ((size_t) bi & 0x0f) == 0 && (x & 0x0f) == 0) {
+            /* Fast code path */
+            for (i = 0; i < count; ++i) {
+                OPJ_INT32 j = i;
+                bi[i * 8    ] = a[j];
+                j += x;
+                bi[i * 8 + 1] = a[j];
+                j += x;
+                bi[i * 8 + 2] = a[j];
+                j += x;
+                bi[i * 8 + 3] = a[j];
+            }
+        } else {
+            /* Slow code path */
+            for (i = 0; i < count; ++i) {
+                OPJ_INT32 j = i;
+                bi[i * 8    ] = a[j];
+                j += x;
+                if (j >= size) {
+                    continue;
+                }
+                bi[i * 8 + 1] = a[j];
+                j += x;
+                if (j >= size) {
+                    continue;
+                }
+                bi[i * 8 + 2] = a[j];
+                j += x;
+                if (j >= size) {
+                    continue;
+                }
+                bi[i * 8 + 3] = a[j]; /* This one*/
+            }
+        }
 
-		bi = (OPJ_FLOAT32*) (w->wavelet + 1 - w->cas);
-		a += w->sn;
-		size -= w->sn;
-		count = w->dn;
-	}
+        bi = (OPJ_FLOAT32*)(w->wavelet + 1 - w->cas);
+        a += w->sn;
+        size -= w->sn;
+        count = w->dn;
+    }
 }
 
-static void opj_v4dwt_interleave_v(opj_v4dwt_t* restrict v , OPJ_FLOAT32* restrict a , OPJ_INT32 x, OPJ_INT32 nb_elts_read){
-	opj_v4_t* restrict bi = v->wavelet + v->cas;
-	OPJ_INT32 i;
+static void opj_v4dwt_interleave_v(opj_v4dwt_t* OPJ_RESTRICT v,
+                                   OPJ_FLOAT32* OPJ_RESTRICT a, OPJ_INT32 x, OPJ_INT32 nb_elts_read)
+{
+    opj_v4_t* OPJ_RESTRICT bi = v->wavelet + v->cas;
+    OPJ_INT32 i;
 
-	for(i = 0; i < v->sn; ++i){
-		memcpy(&bi[i*2], &a[i*x], (size_t)nb_elts_read * sizeof(OPJ_FLOAT32));
-	}
+    for (i = 0; i < v->sn; ++i) {
+        memcpy(&bi[i * 2], &a[i * x], (size_t)nb_elts_read * sizeof(OPJ_FLOAT32));
+    }
 
-	a += v->sn * x;
-	bi = v->wavelet + 1 - v->cas;
+    a += v->sn * x;
+    bi = v->wavelet + 1 - v->cas;
 
-	for(i = 0; i < v->dn; ++i){
-		memcpy(&bi[i*2], &a[i*x], (size_t)nb_elts_read * sizeof(OPJ_FLOAT32));
-	}
+    for (i = 0; i < v->dn; ++i) {
+        memcpy(&bi[i * 2], &a[i * x], (size_t)nb_elts_read * sizeof(OPJ_FLOAT32));
+    }
 }
 
 #ifdef __SSE__
 
-static void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count, const __m128 c){
-	__m128* restrict vw = (__m128*) w;
-	OPJ_INT32 i;
-	/* 4x unrolled loop */
-	for(i = 0; i < count >> 2; ++i){
-		*vw = _mm_mul_ps(*vw, c);
-		vw += 2;
-		*vw = _mm_mul_ps(*vw, c);
-		vw += 2;
-		*vw = _mm_mul_ps(*vw, c);
-		vw += 2;
-		*vw = _mm_mul_ps(*vw, c);
-		vw += 2;
-	}
-	count &= 3;
-	for(i = 0; i < count; ++i){
-		*vw = _mm_mul_ps(*vw, c);
-		vw += 2;
-	}
+static void opj_v4dwt_decode_step1_sse(opj_v4_t* w, OPJ_INT32 count,
+                                       const __m128 c)
+{
+    __m128* OPJ_RESTRICT vw = (__m128*) w;
+    OPJ_INT32 i;
+    /* 4x unrolled loop */
+    for (i = 0; i < count >> 2; ++i) {
+        *vw = _mm_mul_ps(*vw, c);
+        vw += 2;
+        *vw = _mm_mul_ps(*vw, c);
+        vw += 2;
+        *vw = _mm_mul_ps(*vw, c);
+        vw += 2;
+        *vw = _mm_mul_ps(*vw, c);
+        vw += 2;
+    }
+    count &= 3;
+    for (i = 0; i < count; ++i) {
+        *vw = _mm_mul_ps(*vw, c);
+        vw += 2;
+    }
 }
 
-void opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, __m128 c){
-	__m128* restrict vl = (__m128*) l;
-	__m128* restrict vw = (__m128*) w;
-	OPJ_INT32 i;
-	__m128 tmp1, tmp2, tmp3;
-	tmp1 = vl[0];
-	for(i = 0; i < m; ++i){
-		tmp2 = vw[-1];
-		tmp3 = vw[ 0];
-		vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c));
-		tmp1 = tmp3;
-		vw += 2;
-	}
-	vl = vw - 2;
-	if(m >= k){
-		return;
-	}
-	c = _mm_add_ps(c, c);
-	c = _mm_mul_ps(c, vl[0]);
-	for(; m < k; ++m){
-		__m128 tmp = vw[-1];
-		vw[-1] = _mm_add_ps(tmp, c);
-		vw += 2;
-	}
+void opj_v4dwt_decode_step2_sse(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k,
+                                OPJ_INT32 m, __m128 c)
+{
+    __m128* OPJ_RESTRICT vl = (__m128*) l;
+    __m128* OPJ_RESTRICT vw = (__m128*) w;
+    OPJ_INT32 i;
+    __m128 tmp1, tmp2, tmp3;
+    tmp1 = vl[0];
+    for (i = 0; i < m; ++i) {
+        tmp2 = vw[-1];
+        tmp3 = vw[ 0];
+        vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c));
+        tmp1 = tmp3;
+        vw += 2;
+    }
+    vl = vw - 2;
+    if (m >= k) {
+        return;
+    }
+    c = _mm_add_ps(c, c);
+    c = _mm_mul_ps(c, vl[0]);
+    for (; m < k; ++m) {
+        __m128 tmp = vw[-1];
+        vw[-1] = _mm_add_ps(tmp, c);
+        vw += 2;
+    }
 }
 
 #else
 
-static void opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count, const OPJ_FLOAT32 c)
+static void opj_v4dwt_decode_step1(opj_v4_t* w, OPJ_INT32 count,
+                                   const OPJ_FLOAT32 c)
 {
-	OPJ_FLOAT32* restrict fw = (OPJ_FLOAT32*) w;
-	OPJ_INT32 i;
-	for(i = 0; i < count; ++i){
-		OPJ_FLOAT32 tmp1 = fw[i*8    ];
-		OPJ_FLOAT32 tmp2 = fw[i*8 + 1];
-		OPJ_FLOAT32 tmp3 = fw[i*8 + 2];
-		OPJ_FLOAT32 tmp4 = fw[i*8 + 3];
-		fw[i*8    ] = tmp1 * c;
-		fw[i*8 + 1] = tmp2 * c;
-		fw[i*8 + 2] = tmp3 * c;
-		fw[i*8 + 3] = tmp4 * c;
-	}
+    OPJ_FLOAT32* OPJ_RESTRICT fw = (OPJ_FLOAT32*) w;
+    OPJ_INT32 i;
+    for (i = 0; i < count; ++i) {
+        OPJ_FLOAT32 tmp1 = fw[i * 8    ];
+        OPJ_FLOAT32 tmp2 = fw[i * 8 + 1];
+        OPJ_FLOAT32 tmp3 = fw[i * 8 + 2];
+        OPJ_FLOAT32 tmp4 = fw[i * 8 + 3];
+        fw[i * 8    ] = tmp1 * c;
+        fw[i * 8 + 1] = tmp2 * c;
+        fw[i * 8 + 2] = tmp3 * c;
+        fw[i * 8 + 3] = tmp4 * c;
+    }
 }
 
-static void opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k, OPJ_INT32 m, OPJ_FLOAT32 c)
+static void opj_v4dwt_decode_step2(opj_v4_t* l, opj_v4_t* w, OPJ_INT32 k,
+                                   OPJ_INT32 m, OPJ_FLOAT32 c)
 {
-	OPJ_FLOAT32* restrict fl = (OPJ_FLOAT32*) l;
-	OPJ_FLOAT32* restrict fw = (OPJ_FLOAT32*) w;
-	OPJ_INT32 i;
-	for(i = 0; i < m; ++i){
-		OPJ_FLOAT32 tmp1_1 = fl[0];
-		OPJ_FLOAT32 tmp1_2 = fl[1];
-		OPJ_FLOAT32 tmp1_3 = fl[2];
-		OPJ_FLOAT32 tmp1_4 = fl[3];
-		OPJ_FLOAT32 tmp2_1 = fw[-4];
-		OPJ_FLOAT32 tmp2_2 = fw[-3];
-		OPJ_FLOAT32 tmp2_3 = fw[-2];
-		OPJ_FLOAT32 tmp2_4 = fw[-1];
-		OPJ_FLOAT32 tmp3_1 = fw[0];
-		OPJ_FLOAT32 tmp3_2 = fw[1];
-		OPJ_FLOAT32 tmp3_3 = fw[2];
-		OPJ_FLOAT32 tmp3_4 = fw[3];
-		fw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c);
-		fw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c);
-		fw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c);
-		fw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c);
-		fl = fw;
-		fw += 8;
-	}
-	if(m < k){
-		OPJ_FLOAT32 c1;
-		OPJ_FLOAT32 c2;
-		OPJ_FLOAT32 c3;
-		OPJ_FLOAT32 c4;
-		c += c;
-		c1 = fl[0] * c;
-		c2 = fl[1] * c;
-		c3 = fl[2] * c;
-		c4 = fl[3] * c;
-		for(; m < k; ++m){
-			OPJ_FLOAT32 tmp1 = fw[-4];
-			OPJ_FLOAT32 tmp2 = fw[-3];
-			OPJ_FLOAT32 tmp3 = fw[-2];
-			OPJ_FLOAT32 tmp4 = fw[-1];
-			fw[-4] = tmp1 + c1;
-			fw[-3] = tmp2 + c2;
-			fw[-2] = tmp3 + c3;
-			fw[-1] = tmp4 + c4;
-			fw += 8;
-		}
-	}
+    OPJ_FLOAT32* fl = (OPJ_FLOAT32*) l;
+    OPJ_FLOAT32* fw = (OPJ_FLOAT32*) w;
+    OPJ_INT32 i;
+    for (i = 0; i < m; ++i) {
+        OPJ_FLOAT32 tmp1_1 = fl[0];
+        OPJ_FLOAT32 tmp1_2 = fl[1];
+        OPJ_FLOAT32 tmp1_3 = fl[2];
+        OPJ_FLOAT32 tmp1_4 = fl[3];
+        OPJ_FLOAT32 tmp2_1 = fw[-4];
+        OPJ_FLOAT32 tmp2_2 = fw[-3];
+        OPJ_FLOAT32 tmp2_3 = fw[-2];
+        OPJ_FLOAT32 tmp2_4 = fw[-1];
+        OPJ_FLOAT32 tmp3_1 = fw[0];
+        OPJ_FLOAT32 tmp3_2 = fw[1];
+        OPJ_FLOAT32 tmp3_3 = fw[2];
+        OPJ_FLOAT32 tmp3_4 = fw[3];
+        fw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c);
+        fw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c);
+        fw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c);
+        fw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c);
+        fl = fw;
+        fw += 8;
+    }
+    if (m < k) {
+        OPJ_FLOAT32 c1;
+        OPJ_FLOAT32 c2;
+        OPJ_FLOAT32 c3;
+        OPJ_FLOAT32 c4;
+        c += c;
+        c1 = fl[0] * c;
+        c2 = fl[1] * c;
+        c3 = fl[2] * c;
+        c4 = fl[3] * c;
+        for (; m < k; ++m) {
+            OPJ_FLOAT32 tmp1 = fw[-4];
+            OPJ_FLOAT32 tmp2 = fw[-3];
+            OPJ_FLOAT32 tmp3 = fw[-2];
+            OPJ_FLOAT32 tmp4 = fw[-1];
+            fw[-4] = tmp1 + c1;
+            fw[-3] = tmp2 + c2;
+            fw[-2] = tmp3 + c3;
+            fw[-1] = tmp4 + c4;
+            fw += 8;
+        }
+    }
 }
 
 #endif
@@ -804,36 +1696,44 @@
 /* <summary>                             */
 /* Inverse 9-7 wavelet transform in 1-D. */
 /* </summary>                            */
-void opj_v4dwt_decode(opj_v4dwt_t* restrict dwt)
+static void opj_v4dwt_decode(opj_v4dwt_t* OPJ_RESTRICT dwt)
 {
-	OPJ_INT32 a, b;
-	if(dwt->cas == 0) {
-		if(!((dwt->dn > 0) || (dwt->sn > 1))){
-			return;
-		}
-		a = 0;
-		b = 1;
-	}else{
-		if(!((dwt->sn > 0) || (dwt->dn > 1))) {
-			return;
-		}
-		a = 1;
-		b = 0;
-	}
+    OPJ_INT32 a, b;
+    if (dwt->cas == 0) {
+        if (!((dwt->dn > 0) || (dwt->sn > 1))) {
+            return;
+        }
+        a = 0;
+        b = 1;
+    } else {
+        if (!((dwt->sn > 0) || (dwt->dn > 1))) {
+            return;
+        }
+        a = 1;
+        b = 0;
+    }
 #ifdef __SSE__
-	opj_v4dwt_decode_step1_sse(dwt->wavelet+a, dwt->sn, _mm_set1_ps(opj_K));
-	opj_v4dwt_decode_step1_sse(dwt->wavelet+b, dwt->dn, _mm_set1_ps(opj_c13318));
-	opj_v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(opj_dwt_delta));
-	opj_v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(opj_dwt_gamma));
-	opj_v4dwt_decode_step2_sse(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), _mm_set1_ps(opj_dwt_beta));
-	opj_v4dwt_decode_step2_sse(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), _mm_set1_ps(opj_dwt_alpha));
+    opj_v4dwt_decode_step1_sse(dwt->wavelet + a, dwt->sn, _mm_set1_ps(opj_K));
+    opj_v4dwt_decode_step1_sse(dwt->wavelet + b, dwt->dn, _mm_set1_ps(opj_c13318));
+    opj_v4dwt_decode_step2_sse(dwt->wavelet + b, dwt->wavelet + a + 1, dwt->sn,
+                               opj_int_min(dwt->sn, dwt->dn - a), _mm_set1_ps(opj_dwt_delta));
+    opj_v4dwt_decode_step2_sse(dwt->wavelet + a, dwt->wavelet + b + 1, dwt->dn,
+                               opj_int_min(dwt->dn, dwt->sn - b), _mm_set1_ps(opj_dwt_gamma));
+    opj_v4dwt_decode_step2_sse(dwt->wavelet + b, dwt->wavelet + a + 1, dwt->sn,
+                               opj_int_min(dwt->sn, dwt->dn - a), _mm_set1_ps(opj_dwt_beta));
+    opj_v4dwt_decode_step2_sse(dwt->wavelet + a, dwt->wavelet + b + 1, dwt->dn,
+                               opj_int_min(dwt->dn, dwt->sn - b), _mm_set1_ps(opj_dwt_alpha));
 #else
-	opj_v4dwt_decode_step1(dwt->wavelet+a, dwt->sn, opj_K);
-	opj_v4dwt_decode_step1(dwt->wavelet+b, dwt->dn, opj_c13318);
-	opj_v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), opj_dwt_delta);
-	opj_v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), opj_dwt_gamma);
-	opj_v4dwt_decode_step2(dwt->wavelet+b, dwt->wavelet+a+1, dwt->sn, opj_int_min(dwt->sn, dwt->dn-a), opj_dwt_beta);
-	opj_v4dwt_decode_step2(dwt->wavelet+a, dwt->wavelet+b+1, dwt->dn, opj_int_min(dwt->dn, dwt->sn-b), opj_dwt_alpha);
+    opj_v4dwt_decode_step1(dwt->wavelet + a, dwt->sn, opj_K);
+    opj_v4dwt_decode_step1(dwt->wavelet + b, dwt->dn, opj_c13318);
+    opj_v4dwt_decode_step2(dwt->wavelet + b, dwt->wavelet + a + 1, dwt->sn,
+                           opj_int_min(dwt->sn, dwt->dn - a), opj_dwt_delta);
+    opj_v4dwt_decode_step2(dwt->wavelet + a, dwt->wavelet + b + 1, dwt->dn,
+                           opj_int_min(dwt->dn, dwt->sn - b), opj_dwt_gamma);
+    opj_v4dwt_decode_step2(dwt->wavelet + b, dwt->wavelet + a + 1, dwt->sn,
+                           opj_int_min(dwt->sn, dwt->dn - a), opj_dwt_beta);
+    opj_v4dwt_decode_step2(dwt->wavelet + a, dwt->wavelet + b + 1, dwt->dn,
+                           opj_int_min(dwt->dn, dwt->sn - b), opj_dwt_alpha);
 #endif
 }
 
@@ -841,111 +1741,126 @@
 /* <summary>                             */
 /* Inverse 9-7 wavelet transform in 2-D. */
 /* </summary>                            */
-OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, OPJ_UINT32 numres)
+OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* OPJ_RESTRICT tilec,
+                             OPJ_UINT32 numres)
 {
-	opj_v4dwt_t h;
-	opj_v4dwt_t v;
+    opj_v4dwt_t h;
+    opj_v4dwt_t v;
 
-	opj_tcd_resolution_t* res = tilec->resolutions;
+    opj_tcd_resolution_t* res = tilec->resolutions;
 
-	OPJ_UINT32 rw = (OPJ_UINT32)(res->x1 - res->x0);	/* width of the resolution level computed */
-	OPJ_UINT32 rh = (OPJ_UINT32)(res->y1 - res->y0);	/* height of the resolution level computed */
+    OPJ_UINT32 rw = (OPJ_UINT32)(res->x1 -
+                                 res->x0);    /* width of the resolution level computed */
+    OPJ_UINT32 rh = (OPJ_UINT32)(res->y1 -
+                                 res->y0);    /* height of the resolution level computed */
 
-	OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
+    OPJ_UINT32 w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
 
-	OPJ_UINT32 mr = opj_dwt_max_resolution(res, numres);
+    size_t l_data_size;
 
-	if (mr >= ((OPJ_UINT32)-5)) {
-		return OPJ_FALSE;
-	}
-	mr += 5;
+    l_data_size = opj_dwt_max_resolution(res, numres);
+    /* overflow check */
+    if (l_data_size > (SIZE_MAX - 5U)) {
+        /* FIXME event manager error callback */
+        return OPJ_FALSE;
+    }
+    l_data_size += 5U;
+    /* overflow check */
+    if (l_data_size > (SIZE_MAX / sizeof(opj_v4_t))) {
+        /* FIXME event manager error callback */
+        return OPJ_FALSE;
+    }
+    h.wavelet = (opj_v4_t*) opj_aligned_malloc(l_data_size * sizeof(opj_v4_t));
+    if (!h.wavelet) {
+        /* FIXME event manager error callback */
+        return OPJ_FALSE;
+    }
+    v.wavelet = h.wavelet;
 
-	if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(opj_v4_t) < mr) {
-		return OPJ_FALSE;
-	}
-	h.wavelet = (opj_v4_t*) opj_aligned_malloc(mr * sizeof(opj_v4_t));
-	if (!h.wavelet) {
-		/* FIXME event manager error callback */
-		return OPJ_FALSE;
-	}
-	v.wavelet = h.wavelet;
+    while (--numres) {
+        OPJ_FLOAT32 * OPJ_RESTRICT aj = (OPJ_FLOAT32*) tilec->data;
+        OPJ_UINT32 bufsize = (OPJ_UINT32)((tilec->x1 - tilec->x0) *
+                                          (tilec->y1 - tilec->y0));
+        OPJ_INT32 j;
 
-	while( --numres) {
-		OPJ_FLOAT32 * restrict aj = (OPJ_FLOAT32*) tilec->data;
-		OPJ_UINT32 bufsize = (OPJ_UINT32)((tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0));
-		OPJ_INT32 j;
+        h.sn = (OPJ_INT32)rw;
+        v.sn = (OPJ_INT32)rh;
 
-		h.sn = (OPJ_INT32)rw;
-		v.sn = (OPJ_INT32)rh;
+        ++res;
 
-		++res;
+        rw = (OPJ_UINT32)(res->x1 -
+                          res->x0);   /* width of the resolution level computed */
+        rh = (OPJ_UINT32)(res->y1 -
+                          res->y0);   /* height of the resolution level computed */
 
-		rw = (OPJ_UINT32)(res->x1 - res->x0);	/* width of the resolution level computed */
-		rh = (OPJ_UINT32)(res->y1 - res->y0);	/* height of the resolution level computed */
+        h.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn);
+        h.cas = res->x0 % 2;
 
-		h.dn = (OPJ_INT32)(rw - (OPJ_UINT32)h.sn);
-		h.cas = res->x0 % 2;
+        for (j = (OPJ_INT32)rh; j > 3; j -= 4) {
+            OPJ_INT32 k;
+            opj_v4dwt_interleave_h(&h, aj, (OPJ_INT32)w, (OPJ_INT32)bufsize);
+            opj_v4dwt_decode(&h);
 
-		for(j = (OPJ_INT32)rh; j > 3; j -= 4) {
-			OPJ_INT32 k;
-			opj_v4dwt_interleave_h(&h, aj, (OPJ_INT32)w, (OPJ_INT32)bufsize);
-			opj_v4dwt_decode(&h);
+            for (k = (OPJ_INT32)rw; --k >= 0;) {
+                aj[k               ] = h.wavelet[k].f[0];
+                aj[k + (OPJ_INT32)w  ] = h.wavelet[k].f[1];
+                aj[k + (OPJ_INT32)w * 2] = h.wavelet[k].f[2];
+                aj[k + (OPJ_INT32)w * 3] = h.wavelet[k].f[3];
+            }
 
-			for(k = (OPJ_INT32)rw; --k >= 0;){
-				aj[k               ] = h.wavelet[k].f[0];
-				aj[k+(OPJ_INT32)w  ] = h.wavelet[k].f[1];
-				aj[k+(OPJ_INT32)w*2] = h.wavelet[k].f[2];
-				aj[k+(OPJ_INT32)w*3] = h.wavelet[k].f[3];
-			}
+            aj += w * 4;
+            bufsize -= w * 4;
+        }
 
-			aj += w*4;
-			bufsize -= w*4;
-		}
+        if (rh & 0x03) {
+            OPJ_INT32 k;
+            j = rh & 0x03;
+            opj_v4dwt_interleave_h(&h, aj, (OPJ_INT32)w, (OPJ_INT32)bufsize);
+            opj_v4dwt_decode(&h);
+            for (k = (OPJ_INT32)rw; --k >= 0;) {
+                switch (j) {
+                case 3:
+                    aj[k + (OPJ_INT32)w * 2] = h.wavelet[k].f[2];
+                /* FALLTHRU */
+                case 2:
+                    aj[k + (OPJ_INT32)w  ] = h.wavelet[k].f[1];
+                /* FALLTHRU */
+                case 1:
+                    aj[k               ] = h.wavelet[k].f[0];
+                }
+            }
+        }
 
-		if (rh & 0x03) {
-			OPJ_INT32 k;
-			j = rh & 0x03;
-			opj_v4dwt_interleave_h(&h, aj, (OPJ_INT32)w, (OPJ_INT32)bufsize);
-			opj_v4dwt_decode(&h);
-			for(k = (OPJ_INT32)rw; --k >= 0;){
-				switch(j) {
-					case 3: aj[k+(OPJ_INT32)w*2] = h.wavelet[k].f[2];
-					case 2: aj[k+(OPJ_INT32)w  ] = h.wavelet[k].f[1];
-					case 1: aj[k               ] = h.wavelet[k].f[0];
-				}
-			}
-		}
+        v.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn);
+        v.cas = res->y0 % 2;
 
-		v.dn = (OPJ_INT32)(rh - (OPJ_UINT32)v.sn);
-		v.cas = res->y0 % 2;
+        aj = (OPJ_FLOAT32*) tilec->data;
+        for (j = (OPJ_INT32)rw; j > 3; j -= 4) {
+            OPJ_UINT32 k;
 
-		aj = (OPJ_FLOAT32*) tilec->data;
-		for(j = (OPJ_INT32)rw; j > 3; j -= 4){
-			OPJ_UINT32 k;
+            opj_v4dwt_interleave_v(&v, aj, (OPJ_INT32)w, 4);
+            opj_v4dwt_decode(&v);
 
-			opj_v4dwt_interleave_v(&v, aj, (OPJ_INT32)w, 4);
-			opj_v4dwt_decode(&v);
+            for (k = 0; k < rh; ++k) {
+                memcpy(&aj[k * w], &v.wavelet[k], 4 * sizeof(OPJ_FLOAT32));
+            }
+            aj += 4;
+        }
 
-			for(k = 0; k < rh; ++k){
-				memcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(OPJ_FLOAT32));
-			}
-			aj += 4;
-		}
+        if (rw & 0x03) {
+            OPJ_UINT32 k;
 
-		if (rw & 0x03){
-			OPJ_UINT32 k;
+            j = rw & 0x03;
 
-			j = rw & 0x03;
+            opj_v4dwt_interleave_v(&v, aj, (OPJ_INT32)w, j);
+            opj_v4dwt_decode(&v);
 
-			opj_v4dwt_interleave_v(&v, aj, (OPJ_INT32)w, j);
-			opj_v4dwt_decode(&v);
+            for (k = 0; k < rh; ++k) {
+                memcpy(&aj[k * w], &v.wavelet[k], (size_t)j * sizeof(OPJ_FLOAT32));
+            }
+        }
+    }
 
-			for(k = 0; k < rh; ++k){
-				memcpy(&aj[k*w], &v.wavelet[k], (size_t)j * sizeof(OPJ_FLOAT32));
-			}
-		}
-	}
-
-	opj_aligned_free(h.wavelet);
-	return OPJ_TRUE;
+    opj_aligned_free(h.wavelet);
+    return OPJ_TRUE;
 }
diff --git a/third_party/libopenjpeg20/dwt.h b/third_party/libopenjpeg20/dwt.h
index 21fe942..3c997ef 100644
--- a/third_party/libopenjpeg20/dwt.h
+++ b/third_party/libopenjpeg20/dwt.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,7 +8,7 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
@@ -35,8 +35,8 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef __DWT_H
-#define __DWT_H
+#ifndef OPJ_DWT_H
+#define OPJ_DWT_H
 /**
 @file dwt.h
 @brief Implementation of a discrete wavelet transform (DWT)
@@ -63,10 +63,12 @@
 /**
 Inverse 5-3 wavelet transform in 2-D.
 Apply a reversible inverse DWT transform to a component of an image.
+@param tp Thread pool
 @param tilec Tile component information (current tile)
 @param numres Number of resolution levels to decode
 */
-OPJ_BOOL opj_dwt_decode(opj_tcd_tilecomp_t* tilec, OPJ_UINT32 numres);
+OPJ_BOOL opj_dwt_decode(opj_thread_pool_t* tp, opj_tcd_tilecomp_t* tilec,
+                        OPJ_UINT32 numres);
 
 /**
 Get the gain of a subband for the reversible 5-3 DWT.
@@ -82,18 +84,19 @@
 */
 OPJ_FLOAT64 opj_dwt_getnorm(OPJ_UINT32 level, OPJ_UINT32 orient);
 /**
-Forward 9-7 wavelet transform in 2-D. 
+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)
 */
 OPJ_BOOL opj_dwt_encode_real(opj_tcd_tilecomp_t * tilec);
 /**
-Inverse 9-7 wavelet transform in 2-D. 
+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 numres Number of resolution levels to decode
 */
-OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, OPJ_UINT32 numres);
+OPJ_BOOL opj_dwt_decode_real(opj_tcd_tilecomp_t* OPJ_RESTRICT tilec,
+                             OPJ_UINT32 numres);
 
 /**
 Get the gain of a subband for the irreversible 9-7 DWT.
@@ -109,7 +112,7 @@
 */
 OPJ_FLOAT64 opj_dwt_getnorm_real(OPJ_UINT32 level, OPJ_UINT32 orient);
 /**
-Explicit calculation of the Quantization Stepsizes 
+Explicit calculation of the Quantization Stepsizes
 @param tccp Tile-component coding parameters
 @param prec Precint analyzed
 */
@@ -119,4 +122,4 @@
 
 /*@}*/
 
-#endif /* __DWT_H */
+#endif /* OPJ_DWT_H */
diff --git a/third_party/libopenjpeg20/event.c b/third_party/libopenjpeg20/event.c
index b6034b4..aad9d76 100644
--- a/third_party/libopenjpeg20/event.c
+++ b/third_party/libopenjpeg20/event.c
@@ -1,11 +1,11 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -40,14 +40,17 @@
 #ifdef OPJ_CODE_NOT_USED
 #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;
+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; 
+/**
+ 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
@@ -55,14 +58,16 @@
  @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;
+_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 */
@@ -73,7 +78,7 @@
  * Default callback function.
  * Do nothing.
  */
-static void opj_default_callback (const char *msg, void *client_data)
+static void opj_default_callback(const char *msg, void *client_data)
 {
     OPJ_ARG_NOT_USED(msg);
     OPJ_ARG_NOT_USED(client_data);
@@ -83,64 +88,64 @@
 
 
 /* ----------------------------------------------------------------------- */
-OPJ_BOOL opj_event_msg(opj_event_mgr_t* p_event_mgr, OPJ_INT32 event_type, const char *fmt, ...) {
+OPJ_BOOL opj_event_msg(opj_event_mgr_t* p_event_mgr, OPJ_INT32 event_type,
+                       const char *fmt, ...)
+{
 #define OPJ_MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */
-	opj_msg_callback msg_handler = 00;
-	void * l_data = 00;
+    opj_msg_callback msg_handler = 00;
+    void * l_data = 00;
 
-	if(p_event_mgr != 00) {
-		switch(event_type) {
-			case EVT_ERROR:
-				msg_handler = p_event_mgr->error_handler;
-				l_data = p_event_mgr->m_error_data;
-				break;
-			case EVT_WARNING:
-				msg_handler = p_event_mgr->warning_handler;
-				l_data = p_event_mgr->m_warning_data;
-				break;
-			case EVT_INFO:
-				msg_handler = p_event_mgr->info_handler;
-				l_data = p_event_mgr->m_info_data;
-				break;
-			default:
-				break;
-		}
-		if(msg_handler == 00) {
-			return OPJ_FALSE;
-		}
-	} else {
-		return OPJ_FALSE;
-	}
+    if (p_event_mgr != 00) {
+        switch (event_type) {
+        case EVT_ERROR:
+            msg_handler = p_event_mgr->error_handler;
+            l_data = p_event_mgr->m_error_data;
+            break;
+        case EVT_WARNING:
+            msg_handler = p_event_mgr->warning_handler;
+            l_data = p_event_mgr->m_warning_data;
+            break;
+        case EVT_INFO:
+            msg_handler = p_event_mgr->info_handler;
+            l_data = p_event_mgr->m_info_data;
+            break;
+        default:
+            break;
+        }
+        if (msg_handler == 00) {
+            return OPJ_FALSE;
+        }
+    } else {
+        return OPJ_FALSE;
+    }
 
-	if ((fmt != 00) && (p_event_mgr != 00)) {
-		va_list arg;
-		size_t str_length/*, i, j*/; /* UniPG */
-		char message[OPJ_MSG_SIZE];
-		memset(message, 0, OPJ_MSG_SIZE);
-		/* initialize the optional parameter list */
-		va_start(arg, fmt);
-		/* check the length of the format string */
-		str_length = (strlen(fmt) > OPJ_MSG_SIZE) ? OPJ_MSG_SIZE : strlen(fmt);
-        (void)str_length;
-		/* parse the format string and put the result in 'message' */
-		vsnprintf(message, OPJ_MSG_SIZE, fmt, arg); /* UniPG */
-		/* deinitialize the optional parameter list */
-		va_end(arg);
+    if ((fmt != 00) && (p_event_mgr != 00)) {
+        va_list arg;
+        char message[OPJ_MSG_SIZE];
+        memset(message, 0, OPJ_MSG_SIZE);
+        /* initialize the optional parameter list */
+        va_start(arg, fmt);
+        /* parse the format string and put the result in 'message' */
+        vsnprintf(message, OPJ_MSG_SIZE, fmt, arg);
+        /* force zero termination for Windows _vsnprintf() of old MSVC */
+        message[OPJ_MSG_SIZE - 1] = '\0';
+        /* deinitialize the optional parameter list */
+        va_end(arg);
 
-		/* output the message to the user program */
-		msg_handler(message, l_data);
-	}
+        /* output the message to the user program */
+        msg_handler(message, l_data);
+    }
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 void opj_set_default_event_handler(opj_event_mgr_t * p_manager)
 {
-	p_manager->m_error_data = 00;
-	p_manager->m_warning_data = 00;
-	p_manager->m_info_data = 00;
-	p_manager->error_handler = opj_default_callback;
-	p_manager->info_handler = opj_default_callback;
-	p_manager->warning_handler = opj_default_callback;
+    p_manager->m_error_data = 00;
+    p_manager->m_warning_data = 00;
+    p_manager->m_info_data = 00;
+    p_manager->error_handler = opj_default_callback;
+    p_manager->info_handler = opj_default_callback;
+    p_manager->warning_handler = opj_default_callback;
 }
 
diff --git a/third_party/libopenjpeg20/event.h b/third_party/libopenjpeg20/event.h
index fa8604e..d880388 100644
--- a/third_party/libopenjpeg20/event.h
+++ b/third_party/libopenjpeg20/event.h
@@ -1,11 +1,11 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -30,8 +30,8 @@
  * 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
+#ifndef OPJ_EVENT_H
+#define OPJ_EVENT_H
 /**
 @file event.h
 @brief Implementation of a event callback system
@@ -40,33 +40,32 @@
 */
 /**
 Message handler object
-used for 
+used for
 <ul>
 <li>Error messages
 <li>Warning messages
 <li>Debugging messages
 </ul>
 */
-typedef struct opj_event_mgr 
-{
-	/** Data to call the event manager upon */
-	void *			m_error_data;
-	/** Data to call the event manager upon */
-	void *			m_warning_data;
-	/** Data to call the event manager upon */
-	void *			m_info_data;
-	/** 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;
+typedef struct opj_event_mgr {
+    /** Data to call the event manager upon */
+    void *          m_error_data;
+    /** Data to call the event manager upon */
+    void *          m_warning_data;
+    /** Data to call the event manager upon */
+    void *          m_info_data;
+    /** 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;
 
 
-#define EVT_ERROR	1	/**< Error event type */
-#define EVT_WARNING	2	/**< Warning event type */
-#define EVT_INFO	4	/**< Debug event type */
+#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 */
 /*@{*/
@@ -81,13 +80,14 @@
 /**
  * Write formatted data to a string and send the string to a user callback.
  *
- * @param event_mgr			Event handler
- * @param event_type 		Event type or callback to use to send the message
- * @param fmt 				Format-control string (plus optional arguments)
+ * @param event_mgr         Event handler
+ * @param event_type        Event type or callback to use to send the message
+ * @param fmt               Format-control string (plus optional arguments)
  *
  * @return Returns true if successful, returns false otherwise
  */
-OPJ_BOOL opj_event_msg(opj_event_mgr_t* event_mgr, OPJ_INT32 event_type, const char *fmt, ...);
+OPJ_BOOL opj_event_msg(opj_event_mgr_t* event_mgr, OPJ_INT32 event_type,
+                       const char *fmt, ...);
 /* ----------------------------------------------------------------------- */
 
 /**
@@ -105,4 +105,4 @@
 
 /*@}*/
 
-#endif /* __EVENT_H */
+#endif /* OPJ_EVENT_H */
diff --git a/third_party/libopenjpeg20/function_list.c b/third_party/libopenjpeg20/function_list.c
index a7ea11d..e1c1af3 100644
--- a/third_party/libopenjpeg20/function_list.c
+++ b/third_party/libopenjpeg20/function_list.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -38,80 +38,80 @@
 
 opj_procedure_list_t *  opj_procedure_list_create()
 {
-        /* memory allocation */
-        opj_procedure_list_t * l_validation = (opj_procedure_list_t *) opj_calloc(1,sizeof(opj_procedure_list_t));
-        if (! l_validation)
-        {
-                return 00;
-        }
-        /* initialization */
-        l_validation->m_nb_max_procedures = OPJ_VALIDATION_SIZE;
-        l_validation->m_procedures = (opj_procedure*)opj_calloc(OPJ_VALIDATION_SIZE, sizeof(opj_procedure));
-        if (! l_validation->m_procedures)
-        {
-                opj_free(l_validation);
-                return 00;
-        }
-        return l_validation;
+    /* memory allocation */
+    opj_procedure_list_t * l_validation = (opj_procedure_list_t *) opj_calloc(1,
+                                          sizeof(opj_procedure_list_t));
+    if (! l_validation) {
+        return 00;
+    }
+    /* initialization */
+    l_validation->m_nb_max_procedures = OPJ_VALIDATION_SIZE;
+    l_validation->m_procedures = (opj_procedure*)opj_calloc(OPJ_VALIDATION_SIZE,
+                                 sizeof(opj_procedure));
+    if (! l_validation->m_procedures) {
+        opj_free(l_validation);
+        return 00;
+    }
+    return l_validation;
 }
 
 void  opj_procedure_list_destroy(opj_procedure_list_t * p_list)
 {
-        if (! p_list)
-        {
-                return;
+    if (! p_list) {
+        return;
+    }
+    /* initialization */
+    if (p_list->m_procedures) {
+        opj_free(p_list->m_procedures);
+    }
+    opj_free(p_list);
+}
+
+OPJ_BOOL opj_procedure_list_add_procedure(opj_procedure_list_t *
+        p_validation_list, opj_procedure p_procedure, opj_event_mgr_t* p_manager)
+{
+
+    assert(p_manager != NULL);
+
+    if (p_validation_list->m_nb_max_procedures ==
+            p_validation_list->m_nb_procedures) {
+        opj_procedure * new_procedures;
+
+        p_validation_list->m_nb_max_procedures += OPJ_VALIDATION_SIZE;
+        new_procedures = (opj_procedure*)opj_realloc(
+                             p_validation_list->m_procedures,
+                             p_validation_list->m_nb_max_procedures * sizeof(opj_procedure));
+        if (! new_procedures) {
+            opj_free(p_validation_list->m_procedures);
+            p_validation_list->m_nb_max_procedures = 0;
+            p_validation_list->m_nb_procedures = 0;
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Not enough memory to add a new validation procedure\n");
+            return OPJ_FALSE;
+        } else {
+            p_validation_list->m_procedures = new_procedures;
         }
-        /* initialization */
-        if (p_list->m_procedures)
-        {
-                opj_free(p_list->m_procedures);
-        }
-        opj_free(p_list);
+    }
+    p_validation_list->m_procedures[p_validation_list->m_nb_procedures] =
+        p_procedure;
+    ++p_validation_list->m_nb_procedures;
+
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_procedure_list_add_procedure (opj_procedure_list_t * p_validation_list, opj_procedure p_procedure, opj_event_mgr_t* p_manager )
+OPJ_UINT32 opj_procedure_list_get_nb_procedures(opj_procedure_list_t *
+        p_validation_list)
 {
-	
-        assert(p_manager != NULL);
-	
-        if (p_validation_list->m_nb_max_procedures == p_validation_list->m_nb_procedures)
-        {
-                opj_procedure * new_procedures;
-
-                p_validation_list->m_nb_max_procedures += OPJ_VALIDATION_SIZE;
-                new_procedures = (opj_procedure*)opj_realloc(
-                        p_validation_list->m_procedures,
-                        p_validation_list->m_nb_max_procedures * sizeof(opj_procedure));
-                if (! new_procedures)
-                {
-                        opj_free(p_validation_list->m_procedures);
-                        p_validation_list->m_nb_max_procedures = 0;
-                        p_validation_list->m_nb_procedures = 0;
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add a new validation procedure\n");
-                        return OPJ_FALSE;
-                }
-                else
-                {
-                        p_validation_list->m_procedures = new_procedures;
-                }
-        }
-        p_validation_list->m_procedures[p_validation_list->m_nb_procedures] = p_procedure;
-        ++p_validation_list->m_nb_procedures;
-
-        return OPJ_TRUE;
+    return p_validation_list->m_nb_procedures;
 }
 
-OPJ_UINT32 opj_procedure_list_get_nb_procedures (opj_procedure_list_t * p_validation_list)
+opj_procedure* opj_procedure_list_get_first_procedure(opj_procedure_list_t *
+        p_validation_list)
 {
-        return p_validation_list->m_nb_procedures;
+    return p_validation_list->m_procedures;
 }
 
-opj_procedure* opj_procedure_list_get_first_procedure (opj_procedure_list_t * p_validation_list)
+void opj_procedure_list_clear(opj_procedure_list_t * p_validation_list)
 {
-        return p_validation_list->m_procedures;
-}
-
-void opj_procedure_list_clear (opj_procedure_list_t * p_validation_list)
-{
-        p_validation_list->m_nb_procedures = 0;
+    p_validation_list->m_nb_procedures = 0;
 }
diff --git a/third_party/libopenjpeg20/function_list.h b/third_party/libopenjpeg20/function_list.h
index ab091b7..81a3954 100644
--- a/third_party/libopenjpeg20/function_list.h
+++ b/third_party/libopenjpeg20/function_list.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -29,10 +29,10 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef __FUNCTION_LIST_H
-#define __FUNCTION_LIST_H
+#ifndef OPJ_FUNCTION_LIST_H
+#define OPJ_FUNCTION_LIST_H
 
-/** 
+/**
  * @file function_list.h
  * @brief Implementation of a list of procedures.
 
@@ -54,20 +54,19 @@
 /**
  * A list of procedures.
 */
-typedef struct opj_procedure_list 
-{
-	/**
-	 * The number of validation procedures.
-	 */
-	OPJ_UINT32 m_nb_procedures;
-	/**
-	 * The number of the array of validation procedures.
-	 */
-	OPJ_UINT32 m_nb_max_procedures;
-	/**
-	 * The array of procedures.
-	 */
-	opj_procedure * m_procedures;
+typedef struct opj_procedure_list {
+    /**
+     * The number of validation procedures.
+     */
+    OPJ_UINT32 m_nb_procedures;
+    /**
+     * The number of the array of validation procedures.
+     */
+    OPJ_UINT32 m_nb_max_procedures;
+    /**
+     * The array of procedures.
+     */
+    opj_procedure * m_procedures;
 
 } opj_procedure_list_t;
 
@@ -76,7 +75,7 @@
 /**
  * Creates a validation list.
  *
- * @return	the newly created validation list.
+ * @return  the newly created validation list.
  */
 opj_procedure_list_t *  opj_procedure_list_create(void);
 
@@ -90,42 +89,46 @@
 /**
  * Adds a new validation procedure.
  *
- * @param	p_validation_list the list of procedure to modify.
- * @param	p_procedure		the procedure to add.
+ * @param   p_validation_list the list of procedure to modify.
+ * @param   p_procedure     the procedure to add.
+ * @param   p_manager the user event manager.
  *
- * @return	OPJ_TRUE if the procedure could be added.
+ * @return  OPJ_TRUE if the procedure could be added.
  */
-OPJ_BOOL opj_procedure_list_add_procedure (opj_procedure_list_t * p_validation_list, opj_procedure p_procedure, opj_event_mgr_t* p_manager);
+OPJ_BOOL opj_procedure_list_add_procedure(opj_procedure_list_t *
+        p_validation_list, opj_procedure p_procedure, opj_event_mgr_t* p_manager);
 
 /**
  * Gets the number of validation procedures.
  *
- * @param	p_validation_list the list of procedure to modify.
+ * @param   p_validation_list the list of procedure to modify.
  *
  * @return the number of validation procedures.
  */
-OPJ_UINT32 opj_procedure_list_get_nb_procedures (opj_procedure_list_t * p_validation_list);
+OPJ_UINT32 opj_procedure_list_get_nb_procedures(opj_procedure_list_t *
+        p_validation_list);
 
 /**
  * Gets the pointer on the first validation procedure. This function is similar to the C++
  * iterator class to iterate through all the procedures inside the validation list.
  * the caller does not take ownership of the pointer.
  *
- * @param	p_validation_list the list of procedure to get the first procedure from.
+ * @param   p_validation_list the list of procedure to get the first procedure from.
  *
- * @return	a pointer to the first procedure.
+ * @return  a pointer to the first procedure.
  */
-opj_procedure* opj_procedure_list_get_first_procedure (opj_procedure_list_t * p_validation_list);
+opj_procedure* opj_procedure_list_get_first_procedure(opj_procedure_list_t *
+        p_validation_list);
 
 
 /**
  * Clears the list of validation procedures.
  *
- * @param	p_validation_list the list of procedure to clear.
+ * @param   p_validation_list the list of procedure to clear.
  *
  */
-void opj_procedure_list_clear (opj_procedure_list_t * p_validation_list);
+void opj_procedure_list_clear(opj_procedure_list_t * p_validation_list);
 /*@}*/
 
-#endif /* __FUNCTION_LIST_H */
+#endif /* OPJ_FUNCTION_LIST_H */
 
diff --git a/third_party/libopenjpeg20/image.c b/third_party/libopenjpeg20/image.c
index 23462f0..e29172b 100644
--- a/third_party/libopenjpeg20/image.c
+++ b/third_party/libopenjpeg20/image.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -31,109 +31,126 @@
 
 #include "opj_includes.h"
 
-opj_image_t* opj_image_create0(void) {
-	opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t));
-	return image;
+opj_image_t* opj_image_create0(void)
+{
+    opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t));
+    return image;
 }
 
-opj_image_t* OPJ_CALLCONV opj_image_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {
-	OPJ_UINT32 compno;
-	opj_image_t *image = NULL;
+opj_image_t* OPJ_CALLCONV opj_image_create(OPJ_UINT32 numcmpts,
+        opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc)
+{
+    OPJ_UINT32 compno;
+    opj_image_t *image = NULL;
 
-	image = (opj_image_t*) opj_calloc(1, 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_calloc(1,image->numcomps * sizeof(opj_image_comp_t));
-		if(!image->comps) {
-			/* TODO replace with event manager, breaks API */
-			/* fprintf(stderr,"Unable to allocate memory for image.\n"); */
-			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 = (OPJ_INT32*) opj_calloc(comp->w * comp->h, sizeof(OPJ_INT32));
-			if(!comp->data) {
-				/* TODO replace with event manager, breaks API */
-				/* fprintf(stderr,"Unable to allocate memory for image.\n"); */
-				opj_image_destroy(image);
-				return NULL;
-			}
-		}
-	}
+    image = (opj_image_t*) opj_calloc(1, 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_calloc(1,
+                       image->numcomps * sizeof(opj_image_comp_t));
+        if (!image->comps) {
+            /* TODO replace with event manager, breaks API */
+            /* fprintf(stderr,"Unable to allocate memory for image.\n"); */
+            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;
+            if (comp->h != 0 &&
+                    (OPJ_SIZE_T)comp->w > SIZE_MAX / comp->h / sizeof(OPJ_INT32)) {
+                // TODO event manager
+                opj_image_destroy(image);
+                return NULL;
+            }
+            comp->data = (OPJ_INT32*) opj_image_data_alloc(
+                             (size_t)comp->w * comp->h * sizeof(OPJ_INT32));
+            if (!comp->data) {
+                /* TODO replace with event manager, breaks API */
+                /* fprintf(stderr,"Unable to allocate memory for image.\n"); */
+                opj_image_destroy(image);
+                return NULL;
+            }
+            memset(comp->data, 0, (size_t)comp->w * comp->h * sizeof(OPJ_INT32));
+        }
+    }
 
-	return image;
+    return image;
 }
 
-void OPJ_CALLCONV opj_image_destroy(opj_image_t *image) {
-	if(image) {
-		if(image->comps) {
-			OPJ_UINT32 compno;
+void OPJ_CALLCONV opj_image_destroy(opj_image_t *image)
+{
+    if (image) {
+        if (image->comps) {
+            OPJ_UINT32 compno;
 
-			/* image components */
-			for(compno = 0; compno < image->numcomps; compno++) {
-				opj_image_comp_t *image_comp = &(image->comps[compno]);
-				if(image_comp->data) {
-					opj_free(image_comp->data);
-				}
-			}
-			opj_free(image->comps);
-		}
+            /* image components */
+            for (compno = 0; compno < image->numcomps; compno++) {
+                opj_image_comp_t *image_comp = &(image->comps[compno]);
+                if (image_comp->data) {
+                    opj_image_data_free(image_comp->data);
+                }
+            }
+            opj_free(image->comps);
+        }
 
-		if(image->icc_profile_buf) {
-			opj_free(image->icc_profile_buf);
-		}
+        if (image->icc_profile_buf) {
+            opj_free(image->icc_profile_buf);
+        }
 
-		opj_free(image);
-	}
+        opj_free(image);
+    }
 }
 
 /**
  * Updates the components characteristics of the image from the coding parameters.
  *
- * @param p_image_header	the image header to update.
- * @param p_cp				the coding parameters from which to update the image.
+ * @param p_image_header    the image header to update.
+ * @param p_cp              the coding parameters from which to update the image.
  */
-void opj_image_comp_header_update(opj_image_t * p_image_header, const struct opj_cp * p_cp)
+void opj_image_comp_header_update(opj_image_t * p_image_header,
+                                  const struct opj_cp * p_cp)
 {
-	OPJ_UINT32 i, l_width, l_height;
-	OPJ_UINT32 l_x0, l_y0, l_x1, l_y1;
-	OPJ_UINT32 l_comp_x0, l_comp_y0, l_comp_x1, l_comp_y1;
-	opj_image_comp_t* l_img_comp = NULL;
+    OPJ_UINT32 i, l_width, l_height;
+    OPJ_UINT32 l_x0, l_y0, l_x1, l_y1;
+    OPJ_UINT32 l_comp_x0, l_comp_y0, l_comp_x1, l_comp_y1;
+    opj_image_comp_t* l_img_comp = NULL;
 
-	l_x0 = opj_uint_max(p_cp->tx0 , p_image_header->x0);
-	l_y0 = opj_uint_max(p_cp->ty0 , p_image_header->y0);
-	l_x1 = p_cp->tx0 + (p_cp->tw - 1U) * p_cp->tdx; /* validity of p_cp members used here checked in opj_j2k_read_siz. Can't overflow. */
-	l_y1 = p_cp->ty0 + (p_cp->th - 1U) * p_cp->tdy; /* can't overflow */
-	l_x1 = opj_uint_min(opj_uint_adds(l_x1, p_cp->tdx), p_image_header->x1); /* use add saturated to prevent overflow */
-	l_y1 = opj_uint_min(opj_uint_adds(l_y1, p_cp->tdy), p_image_header->y1); /* use add saturated to prevent overflow */
+    l_x0 = opj_uint_max(p_cp->tx0, p_image_header->x0);
+    l_y0 = opj_uint_max(p_cp->ty0, p_image_header->y0);
+    l_x1 = p_cp->tx0 + (p_cp->tw - 1U) *
+           p_cp->tdx; /* validity of p_cp members used here checked in opj_j2k_read_siz. Can't overflow. */
+    l_y1 = p_cp->ty0 + (p_cp->th - 1U) * p_cp->tdy; /* can't overflow */
+    l_x1 = opj_uint_min(opj_uint_adds(l_x1, p_cp->tdx),
+                        p_image_header->x1); /* use add saturated to prevent overflow */
+    l_y1 = opj_uint_min(opj_uint_adds(l_y1, p_cp->tdy),
+                        p_image_header->y1); /* use add saturated to prevent overflow */
 
-	l_img_comp = p_image_header->comps;
-	for	(i = 0; i < p_image_header->numcomps; ++i) {
-		l_comp_x0 = opj_uint_ceildiv(l_x0, l_img_comp->dx);
-		l_comp_y0 = opj_uint_ceildiv(l_y0, l_img_comp->dy);
-		l_comp_x1 = opj_uint_ceildiv(l_x1, l_img_comp->dx);
-		l_comp_y1 = opj_uint_ceildiv(l_y1, l_img_comp->dy);
-		l_width   = opj_uint_ceildivpow2(l_comp_x1 - l_comp_x0, l_img_comp->factor);
-		l_height  = opj_uint_ceildivpow2(l_comp_y1 - l_comp_y0, l_img_comp->factor);
-		l_img_comp->w = l_width;
-		l_img_comp->h = l_height;
-		l_img_comp->x0 = l_comp_x0;
-		l_img_comp->y0 = l_comp_y0;
-		++l_img_comp;
-	}
+    l_img_comp = p_image_header->comps;
+    for (i = 0; i < p_image_header->numcomps; ++i) {
+        l_comp_x0 = opj_uint_ceildiv(l_x0, l_img_comp->dx);
+        l_comp_y0 = opj_uint_ceildiv(l_y0, l_img_comp->dy);
+        l_comp_x1 = opj_uint_ceildiv(l_x1, l_img_comp->dx);
+        l_comp_y1 = opj_uint_ceildiv(l_y1, l_img_comp->dy);
+        l_width   = opj_uint_ceildivpow2(l_comp_x1 - l_comp_x0, l_img_comp->factor);
+        l_height  = opj_uint_ceildivpow2(l_comp_y1 - l_comp_y0, l_img_comp->factor);
+        l_img_comp->w = l_width;
+        l_img_comp->h = l_height;
+        l_img_comp->x0 = l_comp_x0;
+        l_img_comp->y0 = l_comp_y0;
+        ++l_img_comp;
+    }
 }
 
 
@@ -141,102 +158,107 @@
  * Copy only header of image and its component header (no data are copied)
  * if dest image have data, they will be freed
  *
- * @param	p_image_src		the src image
- * @param	p_image_dest	the dest image
+ * @param   p_image_src     the src image
+ * @param   p_image_dest    the dest image
  *
  */
-void opj_copy_image_header(const opj_image_t* p_image_src, opj_image_t* p_image_dest)
+void opj_copy_image_header(const opj_image_t* p_image_src,
+                           opj_image_t* p_image_dest)
 {
-	OPJ_UINT32 compno;
+    OPJ_UINT32 compno;
 
-	/* preconditions */
-	assert(p_image_src != 00);
-	assert(p_image_dest != 00);
+    /* preconditions */
+    assert(p_image_src != 00);
+    assert(p_image_dest != 00);
 
-	p_image_dest->x0 = p_image_src->x0;
-	p_image_dest->y0 = p_image_src->y0;
-	p_image_dest->x1 = p_image_src->x1;
-	p_image_dest->y1 = p_image_src->y1;
+    p_image_dest->x0 = p_image_src->x0;
+    p_image_dest->y0 = p_image_src->y0;
+    p_image_dest->x1 = p_image_src->x1;
+    p_image_dest->y1 = p_image_src->y1;
 
-	if (p_image_dest->comps){
-		for(compno = 0; compno < p_image_dest->numcomps; compno++) {
-			opj_image_comp_t *image_comp = &(p_image_dest->comps[compno]);
-			if(image_comp->data) {
-				opj_free(image_comp->data);
-			}
-		}
-		opj_free(p_image_dest->comps);
-		p_image_dest->comps = NULL;
-	}
+    if (p_image_dest->comps) {
+        for (compno = 0; compno < p_image_dest->numcomps; compno++) {
+            opj_image_comp_t *image_comp = &(p_image_dest->comps[compno]);
+            if (image_comp->data) {
+                opj_free(image_comp->data);
+            }
+        }
+        opj_free(p_image_dest->comps);
+        p_image_dest->comps = NULL;
+    }
 
-	p_image_dest->numcomps = p_image_src->numcomps;
+    p_image_dest->numcomps = p_image_src->numcomps;
 
-	p_image_dest->comps = (opj_image_comp_t*) opj_malloc(p_image_dest->numcomps * sizeof(opj_image_comp_t));
-	if (!p_image_dest->comps){
-		p_image_dest->comps = NULL;
-		p_image_dest->numcomps = 0;
-		return;
-	}
+    p_image_dest->comps = (opj_image_comp_t*) opj_malloc(p_image_dest->numcomps *
+                          sizeof(opj_image_comp_t));
+    if (!p_image_dest->comps) {
+        p_image_dest->comps = NULL;
+        p_image_dest->numcomps = 0;
+        return;
+    }
 
-	for (compno=0; compno < p_image_dest->numcomps; compno++){
-		memcpy( &(p_image_dest->comps[compno]),
-				&(p_image_src->comps[compno]),
-				sizeof(opj_image_comp_t));
-		p_image_dest->comps[compno].data = NULL;
-	}
+    for (compno = 0; compno < p_image_dest->numcomps; compno++) {
+        memcpy(&(p_image_dest->comps[compno]),
+               &(p_image_src->comps[compno]),
+               sizeof(opj_image_comp_t));
+        p_image_dest->comps[compno].data = NULL;
+    }
 
-	p_image_dest->color_space = p_image_src->color_space;
-	p_image_dest->icc_profile_len = p_image_src->icc_profile_len;
+    p_image_dest->color_space = p_image_src->color_space;
+    p_image_dest->icc_profile_len = p_image_src->icc_profile_len;
 
-	if (p_image_dest->icc_profile_len) {
-		p_image_dest->icc_profile_buf = (OPJ_BYTE*)opj_malloc(p_image_dest->icc_profile_len);
-		if (!p_image_dest->icc_profile_buf){
-			p_image_dest->icc_profile_buf = NULL;
-			p_image_dest->icc_profile_len = 0;
-			return;
-		}
-		memcpy( p_image_dest->icc_profile_buf,
-				p_image_src->icc_profile_buf,
-				p_image_src->icc_profile_len);
-		}
-		else
-			p_image_dest->icc_profile_buf = NULL;
+    if (p_image_dest->icc_profile_len) {
+        p_image_dest->icc_profile_buf = (OPJ_BYTE*)opj_malloc(
+                                            p_image_dest->icc_profile_len);
+        if (!p_image_dest->icc_profile_buf) {
+            p_image_dest->icc_profile_buf = NULL;
+            p_image_dest->icc_profile_len = 0;
+            return;
+        }
+        memcpy(p_image_dest->icc_profile_buf,
+               p_image_src->icc_profile_buf,
+               p_image_src->icc_profile_len);
+    } else {
+        p_image_dest->icc_profile_buf = NULL;
+    }
 
-	return;
+    return;
 }
 
-opj_image_t* OPJ_CALLCONV opj_image_tile_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc) {
-	OPJ_UINT32 compno;
-	opj_image_t *image = 00;
+opj_image_t* OPJ_CALLCONV opj_image_tile_create(OPJ_UINT32 numcmpts,
+        opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc)
+{
+    OPJ_UINT32 compno;
+    opj_image_t *image = 00;
 
-	image = (opj_image_t*) opj_calloc(1,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_calloc(image->numcomps, sizeof(opj_image_comp_t));
-		if (!image->comps) {
-			opj_image_destroy(image);
-			return 00;
-		}
-		
-		/* 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->sgnd = cmptparms[compno].sgnd;
-			comp->data = 0;
-		}
-	}
+    image = (opj_image_t*) opj_calloc(1, sizeof(opj_image_t));
+    if (image) {
 
-	return image;
+        image->color_space = clrspc;
+        image->numcomps = numcmpts;
+
+        /* allocate memory for the per-component information */
+        image->comps = (opj_image_comp_t*)opj_calloc(image->numcomps,
+                       sizeof(opj_image_comp_t));
+        if (!image->comps) {
+            opj_image_destroy(image);
+            return 00;
+        }
+
+        /* 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->sgnd = cmptparms[compno].sgnd;
+            comp->data = 0;
+        }
+    }
+
+    return image;
 }
diff --git a/third_party/libopenjpeg20/image.h b/third_party/libopenjpeg20/image.h
index e0e2772..bad83c6 100644
--- a/third_party/libopenjpeg20/image.h
+++ b/third_party/libopenjpeg20/image.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -28,8 +28,8 @@
  * 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
+#ifndef OPJ_IMAGE_H
+#define OPJ_IMAGE_H
 /**
 @file image.h
 @brief Implementation of operations on images (IMAGE)
@@ -55,14 +55,16 @@
 /**
  * Updates the components characteristics of the image from the coding parameters.
  *
- * @param p_image_header		the image header to update.
- * @param p_cp					the coding parameters from which to update the image.
+ * @param p_image_header        the image header to update.
+ * @param p_cp                  the coding parameters from which to update the image.
  */
-void opj_image_comp_header_update(opj_image_t * p_image, const struct opj_cp* p_cp);
+void opj_image_comp_header_update(opj_image_t * p_image,
+                                  const struct opj_cp* p_cp);
 
-void opj_copy_image_header(const opj_image_t* p_image_src, opj_image_t* p_image_dest);
+void opj_copy_image_header(const opj_image_t* p_image_src,
+                           opj_image_t* p_image_dest);
 
 /*@}*/
 
-#endif /* __IMAGE_H */
+#endif /* OPJ_IMAGE_H */
 
diff --git a/third_party/libopenjpeg20/indexbox_manager.h b/third_party/libopenjpeg20/indexbox_manager.h
index ebcde8f..238114b 100644
--- a/third_party/libopenjpeg20/indexbox_manager.h
+++ b/third_party/libopenjpeg20/indexbox_manager.h
@@ -56,7 +56,7 @@
 #define JPIP_PHLD 0x70686c64   /* Place holder                    */
 
 
-/* 
+/*
  * Write tile-part Index table box (superbox)
  *
  * @param[in] coff      offset of j2k codestream
@@ -65,11 +65,12 @@
  * @param[in] cio       file output handle
  * @return              length of tpix box
  */
-int opj_write_tpix( int coff, opj_codestream_info_t cstr_info, int j2klen, opj_stream_private_t *cio,
-              opj_event_mgr_t * p_manager );
+int opj_write_tpix(int coff, opj_codestream_info_t cstr_info, int j2klen,
+                   opj_stream_private_t *cio,
+                   opj_event_mgr_t * p_manager);
 
 
-/* 
+/*
  * Write tile header index table box (superbox)
  *
  * @param[in] coff      offset of j2k codestream
@@ -77,10 +78,11 @@
  * @param[in] cio       file output handle
  * @return              length of thix box
  */
-int opj_write_thix( int coff, opj_codestream_info_t cstr_info, opj_stream_private_t *cio, opj_event_mgr_t * p_manager );
+int opj_write_thix(int coff, opj_codestream_info_t cstr_info,
+                   opj_stream_private_t *cio, opj_event_mgr_t * p_manager);
 
 
-/* 
+/*
  * Write precinct packet index table box (superbox)
  *
  * @param[in] coff      offset of j2k codestream
@@ -90,11 +92,12 @@
  * @param[in] cio       file output handle
  * @return              length of ppix box
  */
-int opj_write_ppix( int coff, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
-              opj_event_mgr_t * p_manager );
+int opj_write_ppix(int coff, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused,
+                   int j2klen, opj_stream_private_t *cio,
+                   opj_event_mgr_t * p_manager);
 
 
-/* 
+/*
  * Write packet header index table box (superbox)
  *
  * @param[in] coff      offset of j2k codestream
@@ -104,10 +107,11 @@
  * @param[in] cio       file output handle
  * @return              length of ppix box
  */
-int opj_write_phix( int coff, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
-              opj_event_mgr_t * p_manager );
+int opj_write_phix(int coff, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused,
+                   int j2klen, opj_stream_private_t *cio,
+                   opj_event_mgr_t * p_manager);
 
-/* 
+/*
  * Write manifest box (box)
  *
  * @param[in] second number to be visited
@@ -116,13 +120,13 @@
  * @param[in] cio    file output handle
  */
 
-void opj_write_manf(int second, 
-                    int v, 
-                    opj_jp2_box_t *box, 
+void opj_write_manf(int second,
+                    int v,
+                    opj_jp2_box_t *box,
                     opj_stream_private_t *cio,
-                    opj_event_mgr_t * p_manager );
+                    opj_event_mgr_t * p_manager);
 
-/* 
+/*
  * Write main header index table (box)
  *
  * @param[in] coff offset of j2k codestream
@@ -130,19 +134,24 @@
  * @param[in] cio  file output handle
  * @return         length of mainmhix box
  */
-int opj_write_mainmhix( int coff, opj_codestream_info_t cstr_info, opj_stream_private_t *cio,
-              opj_event_mgr_t * p_manager );
+int opj_write_mainmhix(int coff, opj_codestream_info_t cstr_info,
+                       opj_stream_private_t *cio,
+                       opj_event_mgr_t * p_manager);
 
-int opj_write_phixfaix( int coff, int compno, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
-              opj_event_mgr_t * p_manager );
+int opj_write_phixfaix(int coff, int compno, opj_codestream_info_t cstr_info,
+                       OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
+                       opj_event_mgr_t * p_manager);
 
-int opj_write_ppixfaix( int coff, int compno, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
-              opj_event_mgr_t * p_manager );
+int opj_write_ppixfaix(int coff, int compno, opj_codestream_info_t cstr_info,
+                       OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio,
+                       opj_event_mgr_t * p_manager);
 
-int opj_write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_stream_private_t *cio,
-              opj_event_mgr_t * p_manager );
+int opj_write_tilemhix(int coff, opj_codestream_info_t cstr_info, int tileno,
+                       opj_stream_private_t *cio,
+                       opj_event_mgr_t * p_manager);
 
-int opj_write_tpixfaix( int coff, int compno, opj_codestream_info_t cstr_info, int j2klen, opj_stream_private_t *cio,
-              opj_event_mgr_t * p_manager );
+int opj_write_tpixfaix(int coff, int compno, opj_codestream_info_t cstr_info,
+                       int j2klen, opj_stream_private_t *cio,
+                       opj_event_mgr_t * p_manager);
 
 #endif      /* !INDEXBOX_MANAGER_H_ */
diff --git a/third_party/libopenjpeg20/invert.c b/third_party/libopenjpeg20/invert.c
index 7efaf6e..89f6071 100644
--- a/third_party/libopenjpeg20/invert.c
+++ b/third_party/libopenjpeg20/invert.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -31,33 +31,33 @@
 
 #include "opj_includes.h"
 
-/** 
+/**
  * LUP decomposition
  */
 static OPJ_BOOL opj_lupDecompose(OPJ_FLOAT32 * matrix,
-                                 OPJ_UINT32 * permutations, 
+                                 OPJ_UINT32 * permutations,
                                  OPJ_FLOAT32 * p_swap_area,
                                  OPJ_UINT32 nb_compo);
-/** 
+/**
  * LUP solving
  */
-static void opj_lupSolve(OPJ_FLOAT32 * pResult, 
-                         OPJ_FLOAT32* pMatrix, 
-                         OPJ_FLOAT32* pVector, 
-                         OPJ_UINT32* pPermutations, 
+static void opj_lupSolve(OPJ_FLOAT32 * pResult,
+                         OPJ_FLOAT32* pMatrix,
+                         OPJ_FLOAT32* pVector,
+                         OPJ_UINT32* pPermutations,
                          OPJ_UINT32 nb_compo,
                          OPJ_FLOAT32 * p_intermediate_data);
 
-/** 
+/**
  *LUP inversion (call with the result of lupDecompose)
  */
-static void opj_lupInvert ( OPJ_FLOAT32 * pSrcMatrix,
-                            OPJ_FLOAT32 * pDestMatrix,
-                            OPJ_UINT32 nb_compo,
-                            OPJ_UINT32 * pPermutations,
-                            OPJ_FLOAT32 * p_src_temp,
-                            OPJ_FLOAT32 * p_dest_temp,
-                            OPJ_FLOAT32 * p_swap_area);
+static void opj_lupInvert(OPJ_FLOAT32 * pSrcMatrix,
+                          OPJ_FLOAT32 * pDestMatrix,
+                          OPJ_UINT32 nb_compo,
+                          OPJ_UINT32 * pPermutations,
+                          OPJ_FLOAT32 * p_src_temp,
+                          OPJ_FLOAT32 * p_dest_temp,
+                          OPJ_FLOAT32 * p_swap_area);
 
 /*
 ==========================================================
@@ -68,32 +68,33 @@
  * Matrix inversion.
  */
 OPJ_BOOL opj_matrix_inversion_f(OPJ_FLOAT32 * pSrcMatrix,
-                                OPJ_FLOAT32 * pDestMatrix, 
+                                OPJ_FLOAT32 * pDestMatrix,
                                 OPJ_UINT32 nb_compo)
 {
-	OPJ_BYTE * l_data = 00;
-	OPJ_UINT32 l_permutation_size = nb_compo * (OPJ_UINT32)sizeof(OPJ_UINT32);
-	OPJ_UINT32 l_swap_size = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
-	OPJ_UINT32 l_total_size = l_permutation_size + 3 * l_swap_size;
-	OPJ_UINT32 * lPermutations = 00;
-	OPJ_FLOAT32 * l_double_data = 00;
+    OPJ_BYTE * l_data = 00;
+    OPJ_UINT32 l_permutation_size = nb_compo * (OPJ_UINT32)sizeof(OPJ_UINT32);
+    OPJ_UINT32 l_swap_size = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+    OPJ_UINT32 l_total_size = l_permutation_size + 3 * l_swap_size;
+    OPJ_UINT32 * lPermutations = 00;
+    OPJ_FLOAT32 * l_double_data = 00;
 
-	l_data = (OPJ_BYTE *) opj_malloc(l_total_size);
-	if (l_data == 0) {
-		return OPJ_FALSE;
-	}
-	lPermutations = (OPJ_UINT32 *) l_data;
-	l_double_data = (OPJ_FLOAT32 *) (l_data + l_permutation_size);
-	memset(lPermutations,0,l_permutation_size);
+    l_data = (OPJ_BYTE *) opj_malloc(l_total_size);
+    if (l_data == 0) {
+        return OPJ_FALSE;
+    }
+    lPermutations = (OPJ_UINT32 *) l_data;
+    l_double_data = (OPJ_FLOAT32 *)(l_data + l_permutation_size);
+    memset(lPermutations, 0, l_permutation_size);
 
-	if(! opj_lupDecompose(pSrcMatrix,lPermutations,l_double_data,nb_compo)) {
-		opj_free(l_data);
-		return OPJ_FALSE;
-	}
-	
-    opj_lupInvert(pSrcMatrix,pDestMatrix,nb_compo,lPermutations,l_double_data,l_double_data + nb_compo,l_double_data + 2*nb_compo);
-	opj_free(l_data);
-	
+    if (! opj_lupDecompose(pSrcMatrix, lPermutations, l_double_data, nb_compo)) {
+        opj_free(l_data);
+        return OPJ_FALSE;
+    }
+
+    opj_lupInvert(pSrcMatrix, pDestMatrix, nb_compo, lPermutations, l_double_data,
+                  l_double_data + nb_compo, l_double_data + 2 * nb_compo);
+    opj_free(l_data);
+
     return OPJ_TRUE;
 }
 
@@ -103,192 +104,192 @@
    Local functions
 ==========================================================
 */
-static OPJ_BOOL opj_lupDecompose(OPJ_FLOAT32 * matrix,OPJ_UINT32 * permutations,
-                          OPJ_FLOAT32 * p_swap_area,
-                          OPJ_UINT32 nb_compo) 
+static OPJ_BOOL opj_lupDecompose(OPJ_FLOAT32 * matrix,
+                                 OPJ_UINT32 * permutations,
+                                 OPJ_FLOAT32 * p_swap_area,
+                                 OPJ_UINT32 nb_compo)
 {
-	OPJ_UINT32 * tmpPermutations = permutations;
-	OPJ_UINT32 * dstPermutations;
-	OPJ_UINT32 k2=0,t;
-	OPJ_FLOAT32 temp;
-	OPJ_UINT32 i,j,k;
-	OPJ_FLOAT32 p;
-	OPJ_UINT32 lLastColum = nb_compo - 1;
-	OPJ_UINT32 lSwapSize = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
-	OPJ_FLOAT32 * lTmpMatrix = matrix;
-	OPJ_FLOAT32 * lColumnMatrix,* lDestMatrix;
-	OPJ_UINT32 offset = 1;
-	OPJ_UINT32 lStride = nb_compo-1;
+    OPJ_UINT32 * tmpPermutations = permutations;
+    OPJ_UINT32 * dstPermutations;
+    OPJ_UINT32 k2 = 0, t;
+    OPJ_FLOAT32 temp;
+    OPJ_UINT32 i, j, k;
+    OPJ_FLOAT32 p;
+    OPJ_UINT32 lLastColum = nb_compo - 1;
+    OPJ_UINT32 lSwapSize = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+    OPJ_FLOAT32 * lTmpMatrix = matrix;
+    OPJ_FLOAT32 * lColumnMatrix, * lDestMatrix;
+    OPJ_UINT32 offset = 1;
+    OPJ_UINT32 lStride = nb_compo - 1;
 
-	/*initialize permutations */
-	for (i = 0; i < nb_compo; ++i) 
-	{
-    	*tmpPermutations++ = i;
-	}
-	/* now make a pivot with column switch */
-	tmpPermutations = permutations;
-	for (k = 0; k < lLastColum; ++k) {
-		p = 0.0;
+    /*initialize permutations */
+    for (i = 0; i < nb_compo; ++i) {
+        *tmpPermutations++ = i;
+    }
+    /* now make a pivot with column switch */
+    tmpPermutations = permutations;
+    for (k = 0; k < lLastColum; ++k) {
+        p = 0.0;
 
-		/* take the middle element */
-		lColumnMatrix = lTmpMatrix + k;
-		
-		/* make permutation with the biggest value in the column */
+        /* take the middle element */
+        lColumnMatrix = lTmpMatrix + k;
+
+        /* make permutation with the biggest value in the column */
         for (i = k; i < nb_compo; ++i) {
-			temp = ((*lColumnMatrix > 0) ? *lColumnMatrix : -(*lColumnMatrix));
-     		if (temp > p) {
-     			p = temp;
-     			k2 = i;
-     		}
-			/* next line */
-			lColumnMatrix += nb_compo;
-     	}
+            temp = ((*lColumnMatrix > 0) ? *lColumnMatrix : -(*lColumnMatrix));
+            if (temp > p) {
+                p = temp;
+                k2 = i;
+            }
+            /* next line */
+            lColumnMatrix += nb_compo;
+        }
 
-     	/* a whole rest of 0 -> non singular */
-     	if (p == 0.0) {
-    		return OPJ_FALSE;
-		}
+        /* a whole rest of 0 -> non singular */
+        if (p == 0.0) {
+            return OPJ_FALSE;
+        }
 
-		/* should we permute ? */
-		if (k2 != k) {
-			/*exchange of line */
-     		/* k2 > k */
-			dstPermutations = tmpPermutations + k2 - k;
-			/* swap indices */
-			t = *tmpPermutations;
-     		*tmpPermutations = *dstPermutations;
-     		*dstPermutations = t;
+        /* should we permute ? */
+        if (k2 != k) {
+            /*exchange of line */
+            /* k2 > k */
+            dstPermutations = tmpPermutations + k2 - k;
+            /* swap indices */
+            t = *tmpPermutations;
+            *tmpPermutations = *dstPermutations;
+            *dstPermutations = t;
 
-			/* and swap entire line. */
-			lColumnMatrix = lTmpMatrix + (k2 - k) * nb_compo;
-			memcpy(p_swap_area,lColumnMatrix,lSwapSize);
-			memcpy(lColumnMatrix,lTmpMatrix,lSwapSize);
-			memcpy(lTmpMatrix,p_swap_area,lSwapSize);
-		}
+            /* and swap entire line. */
+            lColumnMatrix = lTmpMatrix + (k2 - k) * nb_compo;
+            memcpy(p_swap_area, lColumnMatrix, lSwapSize);
+            memcpy(lColumnMatrix, lTmpMatrix, lSwapSize);
+            memcpy(lTmpMatrix, p_swap_area, lSwapSize);
+        }
 
-		/* now update data in the rest of the line and line after */
-		lDestMatrix = lTmpMatrix + k;
-		lColumnMatrix = lDestMatrix + nb_compo;
-		/* take the middle element */
-		temp = *(lDestMatrix++);
+        /* now update data in the rest of the line and line after */
+        lDestMatrix = lTmpMatrix + k;
+        lColumnMatrix = lDestMatrix + nb_compo;
+        /* take the middle element */
+        temp = *(lDestMatrix++);
 
-		/* now compute up data (i.e. coeff up of the diagonal). */
-     	for (i = offset; i < nb_compo; ++i)  {
-			/*lColumnMatrix; */
-			/* divide the lower column elements by the diagonal value */
+        /* now compute up data (i.e. coeff up of the diagonal). */
+        for (i = offset; i < nb_compo; ++i)  {
+            /*lColumnMatrix; */
+            /* divide the lower column elements by the diagonal value */
 
-			/* matrix[i][k] /= matrix[k][k]; */
-     		/* p = matrix[i][k] */
-			p = *lColumnMatrix / temp;
-			*(lColumnMatrix++) = p;
-     		
+            /* matrix[i][k] /= matrix[k][k]; */
+            /* p = matrix[i][k] */
+            p = *lColumnMatrix / temp;
+            *(lColumnMatrix++) = p;
+
             for (j = /* k + 1 */ offset; j < nb_compo; ++j) {
-				/* matrix[i][j] -= matrix[i][k] * matrix[k][j]; */
-     			*(lColumnMatrix++) -= p * (*(lDestMatrix++));
-			}
-			/* come back to the k+1th element */
-			lDestMatrix -= lStride;
-			/* go to kth element of the next line */
-			lColumnMatrix += k;
-     	}
+                /* matrix[i][j] -= matrix[i][k] * matrix[k][j]; */
+                *(lColumnMatrix++) -= p * (*(lDestMatrix++));
+            }
+            /* come back to the k+1th element */
+            lDestMatrix -= lStride;
+            /* go to kth element of the next line */
+            lColumnMatrix += k;
+        }
 
-		/* offset is now k+2 */
-		++offset;
-		/* 1 element less for stride */
-		--lStride;
-		/* next line */
-		lTmpMatrix+=nb_compo;
-		/* next permutation element */
-		++tmpPermutations;
-	}
+        /* offset is now k+2 */
+        ++offset;
+        /* 1 element less for stride */
+        --lStride;
+        /* next line */
+        lTmpMatrix += nb_compo;
+        /* next permutation element */
+        ++tmpPermutations;
+    }
     return OPJ_TRUE;
 }
-   		
-static void opj_lupSolve (OPJ_FLOAT32 * pResult,
-                   OPJ_FLOAT32 * pMatrix, 
-                   OPJ_FLOAT32 * pVector, 
-                   OPJ_UINT32* pPermutations, 
-                   OPJ_UINT32 nb_compo,OPJ_FLOAT32 * p_intermediate_data) 
+
+static void opj_lupSolve(OPJ_FLOAT32 * pResult,
+                         OPJ_FLOAT32 * pMatrix,
+                         OPJ_FLOAT32 * pVector,
+                         OPJ_UINT32* pPermutations,
+                         OPJ_UINT32 nb_compo, OPJ_FLOAT32 * p_intermediate_data)
 {
-	OPJ_INT32 k;
-    OPJ_UINT32 i,j;
-	OPJ_FLOAT32 sum;
-	OPJ_FLOAT32 u;
-    OPJ_UINT32 lStride = nb_compo+1;
-	OPJ_FLOAT32 * lCurrentPtr;
-	OPJ_FLOAT32 * lIntermediatePtr;
-	OPJ_FLOAT32 * lDestPtr;
-	OPJ_FLOAT32 * lTmpMatrix;
-	OPJ_FLOAT32 * lLineMatrix = pMatrix;
-	OPJ_FLOAT32 * lBeginPtr = pResult + nb_compo - 1;
-	OPJ_FLOAT32 * lGeneratedData;
-	OPJ_UINT32 * lCurrentPermutationPtr = pPermutations;
+    OPJ_INT32 k;
+    OPJ_UINT32 i, j;
+    OPJ_FLOAT32 sum;
+    OPJ_FLOAT32 u;
+    OPJ_UINT32 lStride = nb_compo + 1;
+    OPJ_FLOAT32 * lCurrentPtr;
+    OPJ_FLOAT32 * lIntermediatePtr;
+    OPJ_FLOAT32 * lDestPtr;
+    OPJ_FLOAT32 * lTmpMatrix;
+    OPJ_FLOAT32 * lLineMatrix = pMatrix;
+    OPJ_FLOAT32 * lBeginPtr = pResult + nb_compo - 1;
+    OPJ_FLOAT32 * lGeneratedData;
+    OPJ_UINT32 * lCurrentPermutationPtr = pPermutations;
 
-	
-	lIntermediatePtr = p_intermediate_data;
-	lGeneratedData = p_intermediate_data + nb_compo - 1;
-	
+
+    lIntermediatePtr = p_intermediate_data;
+    lGeneratedData = p_intermediate_data + nb_compo - 1;
+
     for (i = 0; i < nb_compo; ++i) {
-       	sum = 0.0;
-		lCurrentPtr = p_intermediate_data;
-		lTmpMatrix = lLineMatrix;
-        for (j = 1; j <= i; ++j) 
-		{
-			/* sum += matrix[i][j-1] * y[j-1]; */
-        	sum += (*(lTmpMatrix++)) * (*(lCurrentPtr++));
+        sum = 0.0;
+        lCurrentPtr = p_intermediate_data;
+        lTmpMatrix = lLineMatrix;
+        for (j = 1; j <= i; ++j) {
+            /* sum += matrix[i][j-1] * y[j-1]; */
+            sum += (*(lTmpMatrix++)) * (*(lCurrentPtr++));
         }
-		/*y[i] = pVector[pPermutations[i]] - sum; */
+        /*y[i] = pVector[pPermutations[i]] - sum; */
         *(lIntermediatePtr++) = pVector[*(lCurrentPermutationPtr++)] - sum;
-		lLineMatrix += nb_compo;
-	}
+        lLineMatrix += nb_compo;
+    }
 
-	/* we take the last point of the matrix */
-	lLineMatrix = pMatrix + nb_compo*nb_compo - 1;
+    /* we take the last point of the matrix */
+    lLineMatrix = pMatrix + nb_compo * nb_compo - 1;
 
-	/* and we take after the last point of the destination vector */
-	lDestPtr = pResult + nb_compo;
+    /* and we take after the last point of the destination vector */
+    lDestPtr = pResult + nb_compo;
 
 
     assert(nb_compo != 0);
-	for (k = (OPJ_INT32)nb_compo - 1; k != -1 ; --k) {
-		sum = 0.0;
-		lTmpMatrix = lLineMatrix;
+    for (k = (OPJ_INT32)nb_compo - 1; k != -1 ; --k) {
+        sum = 0.0;
+        lTmpMatrix = lLineMatrix;
         u = *(lTmpMatrix++);
-		lCurrentPtr = lDestPtr--;
+        lCurrentPtr = lDestPtr--;
         for (j = (OPJ_UINT32)(k + 1); j < nb_compo; ++j) {
-			/* sum += matrix[k][j] * x[j] */
-        	sum += (*(lTmpMatrix++)) * (*(lCurrentPtr++));
-		}
-		/*x[k] = (y[k] - sum) / u; */
+            /* sum += matrix[k][j] * x[j] */
+            sum += (*(lTmpMatrix++)) * (*(lCurrentPtr++));
+        }
+        /*x[k] = (y[k] - sum) / u; */
         *(lBeginPtr--) = (*(lGeneratedData--) - sum) / u;
-		lLineMatrix -= lStride;
-	}
+        lLineMatrix -= lStride;
+    }
 }
-    
 
-static void opj_lupInvert (OPJ_FLOAT32 * pSrcMatrix,
-                    OPJ_FLOAT32 * pDestMatrix,
-                    OPJ_UINT32 nb_compo,
-                    OPJ_UINT32 * pPermutations,
-                    OPJ_FLOAT32 * p_src_temp,
-                    OPJ_FLOAT32 * p_dest_temp,
-                    OPJ_FLOAT32 * p_swap_area )
+
+static void opj_lupInvert(OPJ_FLOAT32 * pSrcMatrix,
+                          OPJ_FLOAT32 * pDestMatrix,
+                          OPJ_UINT32 nb_compo,
+                          OPJ_UINT32 * pPermutations,
+                          OPJ_FLOAT32 * p_src_temp,
+                          OPJ_FLOAT32 * p_dest_temp,
+                          OPJ_FLOAT32 * p_swap_area)
 {
-	OPJ_UINT32 j,i;
-	OPJ_FLOAT32 * lCurrentPtr;
-	OPJ_FLOAT32 * lLineMatrix = pDestMatrix;
-	OPJ_UINT32 lSwapSize = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+    OPJ_UINT32 j, i;
+    OPJ_FLOAT32 * lCurrentPtr;
+    OPJ_FLOAT32 * lLineMatrix = pDestMatrix;
+    OPJ_UINT32 lSwapSize = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
 
-	for (j = 0; j < nb_compo; ++j) {
-		lCurrentPtr = lLineMatrix++;
-        memset(p_src_temp,0,lSwapSize);
-    	p_src_temp[j] = 1.0;
-		opj_lupSolve(p_dest_temp,pSrcMatrix,p_src_temp, pPermutations, nb_compo , p_swap_area);
+    for (j = 0; j < nb_compo; ++j) {
+        lCurrentPtr = lLineMatrix++;
+        memset(p_src_temp, 0, lSwapSize);
+        p_src_temp[j] = 1.0;
+        opj_lupSolve(p_dest_temp, pSrcMatrix, p_src_temp, pPermutations, nb_compo,
+                     p_swap_area);
 
-		for (i = 0; i < nb_compo; ++i) {
-    		*(lCurrentPtr) = p_dest_temp[i];
-			lCurrentPtr+=nb_compo;
-    	}
+        for (i = 0; i < nb_compo; ++i) {
+            *(lCurrentPtr) = p_dest_temp[i];
+            lCurrentPtr += nb_compo;
+        }
     }
 }
 
diff --git a/third_party/libopenjpeg20/invert.h b/third_party/libopenjpeg20/invert.h
index 2fae8e5..7040213 100644
--- a/third_party/libopenjpeg20/invert.h
+++ b/third_party/libopenjpeg20/invert.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -29,8 +29,8 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef __INVERT_H
-#define __INVERT_H
+#ifndef OPJ_INVERT_H
+#define OPJ_INVERT_H
 /**
 @file invert.h
 @brief Implementation of the matrix inversion
@@ -48,17 +48,17 @@
  * Calculates a n x n double matrix inversion with a LUP method. Data is aligned, rows after rows (or columns after columns).
  * The function does not take ownership of any memory block, data must be fred by the user.
  *
- * @param pSrcMatrix	the matrix to invert.
- * @param pDestMatrix	data to store the inverted matrix. 
- * @param n size of the matrix
+ * @param pSrcMatrix    the matrix to invert.
+ * @param pDestMatrix   data to store the inverted matrix.
+ * @param nb_compo      size of the matrix
  * @return OPJ_TRUE if the inversion is successful, OPJ_FALSE if the matrix is singular.
  */
 OPJ_BOOL opj_matrix_inversion_f(OPJ_FLOAT32 * pSrcMatrix,
-                                OPJ_FLOAT32 * pDestMatrix, 
+                                OPJ_FLOAT32 * pDestMatrix,
                                 OPJ_UINT32 nb_compo);
 /* ----------------------------------------------------------------------- */
 /*@}*/
 
 /*@}*/
 
-#endif /* __INVERT_H */ 
+#endif /* OPJ_INVERT_H */
diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c
index 9e35de1..1869833 100644
--- a/third_party/libopenjpeg20/j2k.c
+++ b/third_party/libopenjpeg20/j2k.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,13 +8,13 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
  * Copyright (c) 2006-2007, Parvatha Elangovan
  * Copyright (c) 2010-2011, Kaori Hagihara
- * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France 
+ * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -48,17 +48,20 @@
 /** @name Local static functions */
 /*@{*/
 
+#define OPJ_UNUSED(x) (void)x
+
 /**
  * Sets up the procedures to do on reading header. Developpers wanting to extend the library can add their own reading procedures.
  */
-static OPJ_BOOL opj_j2k_setup_header_reading (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_setup_header_reading(opj_j2k_t *p_j2k,
+        opj_event_mgr_t * p_manager);
 
 /**
  * The read header procedure.
  */
-static OPJ_BOOL opj_j2k_read_header_procedure(  opj_j2k_t *p_j2k,
-                                                opj_stream_private_t *p_stream,
-                                                opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_read_header_procedure(opj_j2k_t *p_j2k,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager);
 
 /**
  * The default encoding validation procedure without any extension.
@@ -69,9 +72,9 @@
  *
  * @return true if the parameters are correct.
  */
-static OPJ_BOOL opj_j2k_encoding_validation (   opj_j2k_t * p_j2k,
-                                                opj_stream_private_t *p_stream,
-                                                opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_encoding_validation(opj_j2k_t * p_j2k,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager);
 
 /**
  * The default decoding validation procedure without any extension.
@@ -82,27 +85,30 @@
  *
  * @return true if the parameters are correct.
  */
-static OPJ_BOOL opj_j2k_decoding_validation (   opj_j2k_t * p_j2k,
-                                                opj_stream_private_t *p_stream,
-                                                opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_decoding_validation(opj_j2k_t * p_j2k,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
  * are valid. Developpers wanting to extend the library can add their own validation procedures.
  */
-static OPJ_BOOL opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_setup_encoding_validation(opj_j2k_t *p_j2k,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
  * are valid. Developpers wanting to extend the library can add their own validation procedures.
  */
-static OPJ_BOOL opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_setup_decoding_validation(opj_j2k_t *p_j2k,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
  * are valid. Developpers wanting to extend the library can add their own validation procedures.
  */
-static OPJ_BOOL opj_j2k_setup_end_compress (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_setup_end_compress(opj_j2k_t *p_j2k,
+        opj_event_mgr_t * p_manager);
 
 /**
  * The mct encoding validation procedure.
@@ -113,22 +119,22 @@
  *
  * @return true if the parameters are correct.
  */
-static OPJ_BOOL opj_j2k_mct_validation (opj_j2k_t * p_j2k,
-                                        opj_stream_private_t *p_stream,
-                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_mct_validation(opj_j2k_t * p_j2k,
+                                       opj_stream_private_t *p_stream,
+                                       opj_event_mgr_t * p_manager);
 
 /**
  * Builds the tcd decoder to use to decode tile.
  */
-static OPJ_BOOL opj_j2k_build_decoder ( opj_j2k_t * p_j2k,
-                                        opj_stream_private_t *p_stream,
-                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_build_decoder(opj_j2k_t * p_j2k,
+                                      opj_stream_private_t *p_stream,
+                                      opj_event_mgr_t * p_manager);
 /**
  * Builds the tcd encoder to use to encode tile.
  */
-static OPJ_BOOL opj_j2k_build_encoder ( opj_j2k_t * p_j2k,
-                                        opj_stream_private_t *p_stream,
-                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_build_encoder(opj_j2k_t * p_j2k,
+                                      opj_stream_private_t *p_stream,
+                                      opj_event_mgr_t * p_manager);
 
 /**
  * Creates a tile-coder decoder.
@@ -137,9 +143,9 @@
  * @param       p_j2k                           J2K codec.
  * @param       p_manager                   the user event manager.
 */
-static OPJ_BOOL opj_j2k_create_tcd(     opj_j2k_t *p_j2k,
-                                                                    opj_stream_private_t *p_stream,
-                                                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_create_tcd(opj_j2k_t *p_j2k,
+                                   opj_stream_private_t *p_stream,
+                                   opj_event_mgr_t * p_manager);
 
 /**
  * Excutes the given procedures on the given codec.
@@ -151,10 +157,10 @@
  *
  * @return      true                            if all the procedures were successfully executed.
  */
-static OPJ_BOOL opj_j2k_exec (  opj_j2k_t * p_j2k,
-                            opj_procedure_list_t * p_procedure_list,
-                            opj_stream_private_t *p_stream,
-                            opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_exec(opj_j2k_t * p_j2k,
+                             opj_procedure_list_t * p_procedure_list,
+                             opj_stream_private_t *p_stream,
+                             opj_event_mgr_t * p_manager);
 
 /**
  * Updates the rates of the tcp.
@@ -163,24 +169,24 @@
  * @param       p_j2k                           J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_update_rates(   opj_j2k_t *p_j2k,
-                                                                            opj_stream_private_t *p_stream,
-                                                                            opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_update_rates(opj_j2k_t *p_j2k,
+                                     opj_stream_private_t *p_stream,
+                                     opj_event_mgr_t * p_manager);
 
 /**
  * Copies the decoding tile parameters onto all the tile parameters.
  * Creates also the tile decoder.
  */
-static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd (       opj_j2k_t * p_j2k,
-                                                            opj_stream_private_t *p_stream,
-                                                            opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd(opj_j2k_t * p_j2k,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Destroys the memory associated with the decoding of headers.
  */
-static OPJ_BOOL opj_j2k_destroy_header_memory ( opj_j2k_t * p_j2k,
-                                                opj_stream_private_t *p_stream,
-                                                opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_destroy_header_memory(opj_j2k_t * p_j2k,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Reads the lookup table containing all the marker, status and action, and returns the handler associated
@@ -189,28 +195,42 @@
  *
  * @return      the handler associated with the id.
 */
-static const struct opj_dec_memory_marker_handler * opj_j2k_get_marker_handler (OPJ_UINT32 p_id);
+static const struct opj_dec_memory_marker_handler * opj_j2k_get_marker_handler(
+    OPJ_UINT32 p_id);
 
 /**
  * Destroys a tile coding parameter structure.
  *
  * @param       p_tcp           the tile coding parameter to destroy.
  */
-static void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp);
+static void opj_j2k_tcp_destroy(opj_tcp_t *p_tcp);
 
 /**
  * Destroys the data inside a tile coding parameter structure.
  *
  * @param       p_tcp           the tile coding parameter which contain data to destroy.
  */
-static void opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp);
+static void opj_j2k_tcp_data_destroy(opj_tcp_t *p_tcp);
 
 /**
  * Destroys a coding parameter structure.
  *
  * @param       p_cp            the coding parameter to destroy.
  */
-static void opj_j2k_cp_destroy (opj_cp_t *p_cp);
+static void opj_j2k_cp_destroy(opj_cp_t *p_cp);
+
+/**
+ * Compare 2 a SPCod/ SPCoc elements, i.e. the coding style of a given component of a tile.
+ *
+ * @param       p_j2k            J2K codec.
+ * @param       p_tile_no        Tile number
+ * @param       p_first_comp_no  The 1st component number to compare.
+ * @param       p_second_comp_no The 1st component number to compare.
+ *
+ * @return OPJ_TRUE if SPCdod are equals.
+ */
+static OPJ_BOOL opj_j2k_compare_SPCod_SPCoc(opj_j2k_t *p_j2k,
+        OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no);
 
 /**
  * Writes a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
@@ -224,12 +244,12 @@
  *
  * @return FIXME DOC
 */
-static OPJ_BOOL opj_j2k_write_SPCod_SPCoc(      opj_j2k_t *p_j2k,
-                                                                                    OPJ_UINT32 p_tile_no,
-                                                                                    OPJ_UINT32 p_comp_no,
-                                                                                    OPJ_BYTE * p_data,
-                                                                                    OPJ_UINT32 * p_header_size,
-                                                                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_SPCod_SPCoc(opj_j2k_t *p_j2k,
+        OPJ_UINT32 p_tile_no,
+        OPJ_UINT32 p_comp_no,
+        OPJ_BYTE * p_data,
+        OPJ_UINT32 * p_header_size,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Gets the size taken by writing a SPCod or SPCoc for the given tile and component.
@@ -240,9 +260,9 @@
  *
  * @return      the number of bytes taken by the SPCod element.
  */
-static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size (opj_j2k_t *p_j2k,
-                                                                                            OPJ_UINT32 p_tile_no,
-                                                                                            OPJ_UINT32 p_comp_no );
+static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size(opj_j2k_t *p_j2k,
+        OPJ_UINT32 p_tile_no,
+        OPJ_UINT32 p_comp_no);
 
 /**
  * Reads a SPCod or SPCoc element, i.e. the coding style of a given component of a tile.
@@ -252,11 +272,11 @@
  * @param       p_header_size   the size of the data contained in the COM marker.
  * @param       p_manager       the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(   opj_j2k_t *p_j2k,
-                                            OPJ_UINT32 compno,
-                                            OPJ_BYTE * p_header_data,
-                                            OPJ_UINT32 * p_header_size,
-                                            opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(opj_j2k_t *p_j2k,
+        OPJ_UINT32 compno,
+        OPJ_BYTE * p_header_data,
+        OPJ_UINT32 * p_header_size,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Gets the size taken by writing SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
@@ -267,9 +287,23 @@
  *
  * @return      the number of bytes taken by the SPCod element.
  */
-static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size (  opj_j2k_t *p_j2k,
-                                                                                    OPJ_UINT32 p_tile_no,
-                                                                                    OPJ_UINT32 p_comp_no );
+static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size(opj_j2k_t *p_j2k,
+        OPJ_UINT32 p_tile_no,
+        OPJ_UINT32 p_comp_no);
+
+/**
+ * Compares 2 SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
+ *
+ * @param       p_j2k                   J2K codec.
+ * @param       p_tile_no               the tile to output.
+ * @param       p_first_comp_no         the first component number to compare.
+ * @param       p_second_comp_no        the second component number to compare.
+ *
+ * @return OPJ_TRUE if equals.
+ */
+static OPJ_BOOL opj_j2k_compare_SQcd_SQcc(opj_j2k_t *p_j2k,
+        OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no);
+
 
 /**
  * Writes a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
@@ -283,16 +317,16 @@
  *
 */
 static OPJ_BOOL opj_j2k_write_SQcd_SQcc(opj_j2k_t *p_j2k,
-                                                                            OPJ_UINT32 p_tile_no,
-                                                                            OPJ_UINT32 p_comp_no,
-                                                                            OPJ_BYTE * p_data,
-                                                                            OPJ_UINT32 * p_header_size,
-                                                                            opj_event_mgr_t * p_manager);
+                                        OPJ_UINT32 p_tile_no,
+                                        OPJ_UINT32 p_comp_no,
+                                        OPJ_BYTE * p_data,
+                                        OPJ_UINT32 * p_header_size,
+                                        opj_event_mgr_t * p_manager);
 
 /**
  * Updates the Tile Length Marker.
  */
-static void opj_j2k_update_tlm ( opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size);
+static void opj_j2k_update_tlm(opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size);
 
 /**
  * Reads a SQcd or SQcc element, i.e. the quantization values of a band in the QCD or QCC.
@@ -304,77 +338,79 @@
  * @param       p_manager       the user event manager.
  *
 */
-static OPJ_BOOL opj_j2k_read_SQcd_SQcc( opj_j2k_t *p_j2k,
-                                        OPJ_UINT32 compno,
-                                        OPJ_BYTE * p_header_data,
-                                        OPJ_UINT32 * p_header_size,
-                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
+                                       OPJ_UINT32 compno,
+                                       OPJ_BYTE * p_header_data,
+                                       OPJ_UINT32 * p_header_size,
+                                       opj_event_mgr_t * p_manager);
 
 /**
  * Copies the tile component parameters of all the component from the first tile component.
  *
  * @param               p_j2k           the J2k codec.
  */
-static void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k );
+static void opj_j2k_copy_tile_component_parameters(opj_j2k_t *p_j2k);
 
 /**
  * Copies the tile quantization parameters of all the component from the first tile component.
  *
  * @param               p_j2k           the J2k codec.
  */
-static void opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k );
+static void opj_j2k_copy_tile_quantization_parameters(opj_j2k_t *p_j2k);
 
 /**
  * Reads the tiles.
  */
-static OPJ_BOOL opj_j2k_decode_tiles (  opj_j2k_t *p_j2k,
-                                        opj_stream_private_t *p_stream,
-                                        opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_decode_tiles(opj_j2k_t *p_j2k,
+                                     opj_stream_private_t *p_stream,
+                                     opj_event_mgr_t * p_manager);
 
-static OPJ_BOOL opj_j2k_pre_write_tile ( opj_j2k_t * p_j2k,
-                                                                             OPJ_UINT32 p_tile_index,
-                                                                             opj_stream_private_t *p_stream,
-                                                                             opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_pre_write_tile(opj_j2k_t * p_j2k,
+                                       OPJ_UINT32 p_tile_index,
+                                       opj_stream_private_t *p_stream,
+                                       opj_event_mgr_t * p_manager);
 
-static OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image);
+static OPJ_BOOL opj_j2k_update_image_data(opj_tcd_t * p_tcd, OPJ_BYTE * p_data,
+        opj_image_t* p_output_image);
 
 static void opj_get_tile_dimensions(opj_image_t * l_image,
-																		opj_tcd_tilecomp_t * l_tilec,
-																		opj_image_comp_t * l_img_comp,
-																		OPJ_UINT32* l_size_comp,
-																		OPJ_UINT32* l_width,
-																		OPJ_UINT32* l_height,
-																		OPJ_UINT32* l_offset_x,
-																		OPJ_UINT32* l_offset_y,
-																		OPJ_UINT32* l_image_width,
-																		OPJ_UINT32* l_stride,
-																		OPJ_UINT32* l_tile_offset);
+                                    opj_tcd_tilecomp_t * l_tilec,
+                                    opj_image_comp_t * l_img_comp,
+                                    OPJ_UINT32* l_size_comp,
+                                    OPJ_UINT32* l_width,
+                                    OPJ_UINT32* l_height,
+                                    OPJ_UINT32* l_offset_x,
+                                    OPJ_UINT32* l_offset_y,
+                                    OPJ_UINT32* l_image_width,
+                                    OPJ_UINT32* l_stride,
+                                    OPJ_UINT32* l_tile_offset);
 
-static void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data);
+static void opj_j2k_get_tile_data(opj_tcd_t * p_tcd, OPJ_BYTE * p_data);
 
-static OPJ_BOOL opj_j2k_post_write_tile (opj_j2k_t * p_j2k,
-                                                                             opj_stream_private_t *p_stream,
-                                                                             opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_post_write_tile(opj_j2k_t * p_j2k,
+                                        opj_stream_private_t *p_stream,
+                                        opj_event_mgr_t * p_manager);
 
 /**
  * Sets up the procedures to do on writing header.
  * Developers wanting to extend the library can add their own writing procedures.
  */
-static OPJ_BOOL opj_j2k_setup_header_writing (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_setup_header_writing(opj_j2k_t *p_j2k,
+        opj_event_mgr_t * p_manager);
 
-static OPJ_BOOL opj_j2k_write_first_tile_part(  opj_j2k_t *p_j2k,
-                                                                                            OPJ_BYTE * p_data,
-                                                                                            OPJ_UINT32 * p_data_written,
-                                                                                            OPJ_UINT32 p_total_data_size,
-                                                                                            opj_stream_private_t *p_stream,
-                                                                                            struct opj_event_mgr * p_manager );
+static OPJ_BOOL opj_j2k_write_first_tile_part(opj_j2k_t *p_j2k,
+        OPJ_BYTE * p_data,
+        OPJ_UINT32 * p_data_written,
+        OPJ_UINT32 p_total_data_size,
+        opj_stream_private_t *p_stream,
+        struct opj_event_mgr * p_manager);
 
-static OPJ_BOOL opj_j2k_write_all_tile_parts(   opj_j2k_t *p_j2k,
-                                                                                            OPJ_BYTE * p_data,
-                                                                                            OPJ_UINT32 * p_data_written,
-                                                                                            OPJ_UINT32 p_total_data_size,
-                                                                                            opj_stream_private_t *p_stream,
-                                                                                            struct opj_event_mgr * p_manager );
+static OPJ_BOOL opj_j2k_write_all_tile_parts(opj_j2k_t *p_j2k,
+        OPJ_BYTE * p_data,
+        OPJ_UINT32 * p_data_written,
+        OPJ_UINT32 p_total_data_size,
+        opj_stream_private_t *p_stream,
+        struct opj_event_mgr * p_manager);
 
 /**
  * Gets the offset of the header.
@@ -383,9 +419,9 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_get_end_header( opj_j2k_t *p_j2k,
-                                        opj_stream_private_t *p_stream,
-                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k,
+                                       opj_stream_private_t *p_stream,
+                                       opj_event_mgr_t * p_manager);
 
 static OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k);
 
@@ -402,9 +438,9 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager       the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_soc(      opj_j2k_t *p_j2k,
-                                                        opj_stream_private_t *p_stream,
-                                                            opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_soc(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Reads a SOC marker (Start of Codestream)
@@ -412,9 +448,9 @@
  * @param       p_stream        XXX needs data
  * @param       p_manager       the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_soc(   opj_j2k_t *p_j2k,
-                                    opj_stream_private_t *p_stream,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_soc(opj_j2k_t *p_j2k,
+                                 opj_stream_private_t *p_stream,
+                                 opj_event_mgr_t * p_manager);
 
 /**
  * Writes the SIZ marker (image and tile size)
@@ -423,9 +459,9 @@
  * @param       p_stream        the stream to write data to.
  * @param       p_manager       the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_siz(      opj_j2k_t *p_j2k,
-                                                                opj_stream_private_t *p_stream,
-                                                                opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_siz(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Reads a SIZ marker (image and tile size)
@@ -446,9 +482,9 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager       the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_com(      opj_j2k_t *p_j2k,
-                                                                        opj_stream_private_t *p_stream,
-                                                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_com(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Reads a COM marker (comments)
@@ -457,10 +493,10 @@
  * @param       p_header_size   the size of the data contained in the COM marker.
  * @param       p_manager       the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_com (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_com(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 /**
  * Writes the COD marker (Coding style default)
  *
@@ -468,9 +504,9 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager       the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_cod(      opj_j2k_t *p_j2k,
-                                                                        opj_stream_private_t *p_stream,
-                                                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_cod(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Reads a COD marker (Coding Styke defaults)
@@ -479,12 +515,23 @@
  * @param       p_header_size   the size of the data contained in the COD marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_cod (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_read_cod(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 
-#if 0
+/**
+ * Compares 2 COC markers (Coding style component)
+ *
+ * @param       p_j2k            J2K codec.
+ * @param       p_first_comp_no  the index of the first component to compare.
+ * @param       p_second_comp_no the index of the second component to compare.
+ *
+ * @return      OPJ_TRUE if equals
+ */
+static OPJ_BOOL opj_j2k_compare_coc(opj_j2k_t *p_j2k,
+                                    OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no);
+
 /**
  * Writes the COC marker (Coding style component)
  *
@@ -493,13 +540,11 @@
  * @param       p_stream    the stream to write data to.
  * @param       p_manager   the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_coc(  opj_j2k_t *p_j2k,
-                                                                OPJ_UINT32 p_comp_no,
-                                                                opj_stream_private_t *p_stream,
-                                                                opj_event_mgr_t * p_manager );
-#endif
+static OPJ_BOOL opj_j2k_write_coc(opj_j2k_t *p_j2k,
+                                  OPJ_UINT32 p_comp_no,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
-#if 0
 /**
  * Writes the COC marker (Coding style component)
  *
@@ -510,11 +555,10 @@
  * @param       p_manager               the user event manager.
 */
 static void opj_j2k_write_coc_in_memory(opj_j2k_t *p_j2k,
-                                                                            OPJ_UINT32 p_comp_no,
-                                                                            OPJ_BYTE * p_data,
-                                                                            OPJ_UINT32 * p_data_written,
-                                                                            opj_event_mgr_t * p_manager );
-#endif
+                                        OPJ_UINT32 p_comp_no,
+                                        OPJ_BYTE * p_data,
+                                        OPJ_UINT32 * p_data_written,
+                                        opj_event_mgr_t * p_manager);
 
 /**
  * Gets the maximum size taken by a coc.
@@ -530,10 +574,10 @@
  * @param       p_header_size   the size of the data contained in the COC marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_coc (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_coc(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 
 /**
  * Writes the QCD marker (quantization default)
@@ -542,9 +586,9 @@
  * @param       p_stream                the stream to write data to.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_qcd(      opj_j2k_t *p_j2k,
-                                                                        opj_stream_private_t *p_stream,
-                                                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_qcd(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Reads a QCD marker (Quantization defaults)
@@ -553,11 +597,23 @@
  * @param       p_header_size   the size of the data contained in the QCD marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_qcd (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager );
-#if 0
+static OPJ_BOOL opj_j2k_read_qcd(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
+
+/**
+ * Compare QCC markers (quantization component)
+ *
+ * @param       p_j2k                 J2K codec.
+ * @param       p_first_comp_no       the index of the first component to compare.
+ * @param       p_second_comp_no      the index of the second component to compare.
+ *
+ * @return OPJ_TRUE if equals.
+ */
+static OPJ_BOOL opj_j2k_compare_qcc(opj_j2k_t *p_j2k,
+                                    OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no);
+
 /**
  * Writes the QCC marker (quantization component)
  *
@@ -566,13 +622,11 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_qcc(      opj_j2k_t *p_j2k,
-                                                                        OPJ_UINT32 p_comp_no,
-                                                                        opj_stream_private_t *p_stream,
-                                                                        opj_event_mgr_t * p_manager );
-#endif
+static OPJ_BOOL opj_j2k_write_qcc(opj_j2k_t *p_j2k,
+                                  OPJ_UINT32 p_comp_no,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
-#if 0
 /**
  * Writes the QCC marker (quantization component)
  *
@@ -583,16 +637,15 @@
  * @param       p_manager       the user event manager.
 */
 static void opj_j2k_write_qcc_in_memory(opj_j2k_t *p_j2k,
-                                                                            OPJ_UINT32 p_comp_no,
-                                                                            OPJ_BYTE * p_data,
-                                                                            OPJ_UINT32 * p_data_written,
-                                                                            opj_event_mgr_t * p_manager );
-#endif
+                                        OPJ_UINT32 p_comp_no,
+                                        OPJ_BYTE * p_data,
+                                        OPJ_UINT32 * p_data_written,
+                                        opj_event_mgr_t * p_manager);
 
 /**
  * Gets the maximum size taken by a qcc.
  */
-static OPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k);
+static OPJ_UINT32 opj_j2k_get_max_qcc_size(opj_j2k_t *p_j2k);
 
 /**
  * Reads a QCC marker (Quantization component)
@@ -601,10 +654,10 @@
  * @param       p_header_size   the size of the data contained in the QCC marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_qcc(   opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_read_qcc(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 /**
  * Writes the POC marker (Progression Order Change)
  *
@@ -612,9 +665,9 @@
  * @param       p_j2k                           J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_poc(      opj_j2k_t *p_j2k,
-                                                                        opj_stream_private_t *p_stream,
-                                                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_poc(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 /**
  * Writes the POC marker (Progression Order Change)
  *
@@ -624,9 +677,9 @@
  * @param       p_manager      the user event manager.
  */
 static void opj_j2k_write_poc_in_memory(opj_j2k_t *p_j2k,
-                                                                            OPJ_BYTE * p_data,
-                                                                            OPJ_UINT32 * p_data_written,
-                                                                            opj_event_mgr_t * p_manager );
+                                        OPJ_BYTE * p_data,
+                                        OPJ_UINT32 * p_data_written,
+                                        opj_event_mgr_t * p_manager);
 /**
  * Gets the maximum size taken by the writing of a POC.
  */
@@ -640,15 +693,15 @@
  * @param       p_header_size   the size of the data contained in the POC marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_poc (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_poc(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 
 /**
  * Gets the maximum size taken by the toc headers of all the tile parts of any given tile.
  */
-static OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k);
+static OPJ_UINT32 opj_j2k_get_max_toc_size(opj_j2k_t *p_j2k);
 
 /**
  * Gets the maximum size taken by the headers of the SOT.
@@ -665,10 +718,10 @@
  * @param       p_header_size   the size of the data contained in the TLM marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_crg (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_crg(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 /**
  * Reads a TLM marker (Tile Length Marker)
  *
@@ -677,10 +730,10 @@
  * @param       p_header_size   the size of the data contained in the TLM marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_tlm (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_read_tlm(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 
 /**
  * Writes the updated tlm.
@@ -689,9 +742,9 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_updated_tlm(      opj_j2k_t *p_j2k,
-                                            opj_stream_private_t *p_stream,
-                                            opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_updated_tlm(opj_j2k_t *p_j2k,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Reads a PLM marker (Packet length, main header marker)
@@ -701,10 +754,10 @@
  * @param       p_header_size   the size of the data contained in the TLM marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_plm (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_read_plm(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 /**
  * Reads a PLT marker (Packet length, tile-part header)
  *
@@ -713,10 +766,10 @@
  * @param       p_header_size   the size of the data contained in the PLT marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_plt (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_plt(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 
 /**
  * Reads a PPM marker (Packed headers, main header)
@@ -727,11 +780,11 @@
  * @param       p_manager               the user event manager.
  */
 
-static OPJ_BOOL opj_j2k_read_ppm (
-																		 opj_j2k_t *p_j2k,
-																		 OPJ_BYTE * p_header_data,
-																		 OPJ_UINT32 p_header_size,
-																		 opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_ppm(
+    opj_j2k_t *p_j2k,
+    OPJ_BYTE * p_header_data,
+    OPJ_UINT32 p_header_size,
+    opj_event_mgr_t * p_manager);
 
 /**
  * Merges all PPM markers read (Packed headers, main header)
@@ -739,7 +792,7 @@
  * @param       p_cp      main coding parameters.
  * @param       p_manager the user event manager.
  */
-static OPJ_BOOL opj_j2k_merge_ppm ( opj_cp_t *p_cp, opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_merge_ppm(opj_cp_t *p_cp, opj_event_mgr_t * p_manager);
 
 /**
  * Reads a PPT marker (Packed packet headers, tile-part header)
@@ -749,10 +802,10 @@
  * @param       p_header_size   the size of the data contained in the PPT marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_ppt (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_ppt(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 
 /**
  * Merges all PPT markers read (Packed headers, tile-part header)
@@ -760,8 +813,8 @@
  * @param       p_tcp   the tile.
  * @param       p_manager               the user event manager.
  */
-static OPJ_BOOL opj_j2k_merge_ppt (  opj_tcp_t *p_tcp,
-																	   opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_merge_ppt(opj_tcp_t *p_tcp,
+                                  opj_event_mgr_t * p_manager);
 
 
 /**
@@ -771,9 +824,9 @@
  * @param       p_j2k                           J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_tlm(      opj_j2k_t *p_j2k,
-                                                                        opj_stream_private_t *p_stream,
-                                                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_tlm(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Writes the SOT marker (Start of tile-part)
@@ -784,11 +837,11 @@
  * @param       p_stream         the stream to write data to.
  * @param       p_manager        the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_sot(      opj_j2k_t *p_j2k,
-                                                                        OPJ_BYTE * p_data,
-                                                                        OPJ_UINT32 * p_data_written,
-                                                                        const opj_stream_private_t *p_stream,
-                                                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_sot(opj_j2k_t *p_j2k,
+                                  OPJ_BYTE * p_data,
+                                  OPJ_UINT32 * p_data_written,
+                                  const opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Reads values from a SOT marker (Start of tile-part)
@@ -804,12 +857,12 @@
  * @param       p_manager       the user event manager.
  */
 static OPJ_BOOL opj_j2k_get_sot_values(OPJ_BYTE *  p_header_data,
-																			 OPJ_UINT32  p_header_size,
-																			 OPJ_UINT32* p_tile_no,
-																			 OPJ_UINT32* p_tot_len,
-																			 OPJ_UINT32* p_current_part,
-																			 OPJ_UINT32* p_num_parts,
-																			 opj_event_mgr_t * p_manager );
+                                       OPJ_UINT32  p_header_size,
+                                       OPJ_UINT32* p_tile_no,
+                                       OPJ_UINT32* p_tot_len,
+                                       OPJ_UINT32* p_current_part,
+                                       OPJ_UINT32* p_num_parts,
+                                       opj_event_mgr_t * p_manager);
 /**
  * Reads a SOT marker (Start of tile-part)
  *
@@ -818,10 +871,10 @@
  * @param       p_header_size   the size of the data contained in the PPT marker.
  * @param       p_manager       the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_sot (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_sot(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 /**
  * Writes the SOD marker (Start of data)
  *
@@ -833,13 +886,13 @@
  * @param       p_stream            the stream to write data to.
  * @param       p_manager           the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_sod(      opj_j2k_t *p_j2k,
-                                                                        opj_tcd_t * p_tile_coder,
-                                                                        OPJ_BYTE * p_data,
-                                                                        OPJ_UINT32 * p_data_written,
-                                                                        OPJ_UINT32 p_total_data_size,
-                                                                        const opj_stream_private_t *p_stream,
-                                                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_sod(opj_j2k_t *p_j2k,
+                                  opj_tcd_t * p_tile_coder,
+                                  OPJ_BYTE * p_data,
+                                  OPJ_UINT32 * p_data_written,
+                                  OPJ_UINT32 p_total_data_size,
+                                  const opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Reads a SOD marker (Start Of Data)
@@ -848,17 +901,19 @@
  * @param       p_stream                FIXME DOC
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_sod(   opj_j2k_t *p_j2k,
-                                    opj_stream_private_t *p_stream,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_sod(opj_j2k_t *p_j2k,
+                                 opj_stream_private_t *p_stream,
+                                 opj_event_mgr_t * p_manager);
 
-static void opj_j2k_update_tlm (opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size )
+static void opj_j2k_update_tlm(opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size)
 {
-        opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_j2k->m_current_tile_number,1);            /* PSOT */
-        ++p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current;
+    opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,
+                    p_j2k->m_current_tile_number, 1);           /* PSOT */
+    ++p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current;
 
-        opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_tile_part_size,4);                                        /* PSOT */
-        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 4;
+    opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,
+                    p_tile_part_size, 4);                                       /* PSOT */
+    p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current += 4;
 }
 
 /**
@@ -871,12 +926,12 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_rgn(  opj_j2k_t *p_j2k,
-                                    OPJ_UINT32 p_tile_no,
-                                    OPJ_UINT32 p_comp_no,
-                                    OPJ_UINT32 nb_comps,
-                                    opj_stream_private_t *p_stream,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k,
+                                  OPJ_UINT32 p_tile_no,
+                                  OPJ_UINT32 p_comp_no,
+                                  OPJ_UINT32 nb_comps,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Reads a RGN marker (Region Of Interest)
@@ -886,10 +941,10 @@
  * @param       p_header_size   the size of the data contained in the POC marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_rgn (opj_j2k_t *p_j2k,
-                                  OPJ_BYTE * p_header_data,
-                                  OPJ_UINT32 p_header_size,
-                                  opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_rgn(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 
 /**
  * Writes the EOC marker (End of Codestream)
@@ -898,9 +953,9 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_eoc(      opj_j2k_t *p_j2k,
-                                    opj_stream_private_t *p_stream,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_eoc(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 #if 0
 /**
@@ -910,9 +965,9 @@
  * @param       p_stream                FIXME DOC
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_eoc (      opj_j2k_t *p_j2k,
-                                                                opj_stream_private_t *p_stream,
-                                                                opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_eoc(opj_j2k_t *p_j2k,
+                                 opj_stream_private_t *p_stream,
+                                 opj_event_mgr_t * p_manager);
 #endif
 
 /**
@@ -922,9 +977,9 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager       the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_mct_data_group(   opj_j2k_t *p_j2k,
-                                                opj_stream_private_t *p_stream,
-                                                opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_mct_data_group(opj_j2k_t *p_j2k,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Inits the Info
@@ -933,9 +988,9 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_init_info(      opj_j2k_t *p_j2k,
-                                    opj_stream_private_t *p_stream,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_init_info(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
 Add main header marker information
@@ -944,7 +999,8 @@
 @param pos          byte offset of marker segment
 @param len          length of marker segment
  */
-static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len) ;
+static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index,
+                                     OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len) ;
 /**
 Add tile header marker information
 @param tileno       tile index number
@@ -953,7 +1009,9 @@
 @param pos          byte offset of marker segment
 @param len          length of marker segment
  */
-static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno, opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len);
+static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno,
+                                     opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos,
+                                     OPJ_UINT32 len);
 
 /**
  * Reads an unknown marker
@@ -965,10 +1023,10 @@
  *
  * @return      true                    if the marker could be deduced.
 */
-static OPJ_BOOL opj_j2k_read_unk( opj_j2k_t *p_j2k,
-                                  opj_stream_private_t *p_stream,
-                                  OPJ_UINT32 *output_marker,
-                                  opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_unk(opj_j2k_t *p_j2k,
+                                 opj_stream_private_t *p_stream,
+                                 OPJ_UINT32 *output_marker,
+                                 opj_event_mgr_t * p_manager);
 
 /**
  * Writes the MCT marker (Multiple Component Transform)
@@ -978,10 +1036,10 @@
  * @param       p_stream        the stream to write data to.
  * @param       p_manager       the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_mct_record(       opj_j2k_t *p_j2k,
-                                                                                    opj_mct_data_t * p_mct_record,
-                                            opj_stream_private_t *p_stream,
-                                            opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_mct_record(opj_j2k_t *p_j2k,
+        opj_mct_data_t * p_mct_record,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Reads a MCT marker (Multiple Component Transform)
@@ -991,10 +1049,10 @@
  * @param       p_header_size   the size of the data contained in the MCT marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_mct (      opj_j2k_t *p_j2k,
-                                                                    OPJ_BYTE * p_header_data,
-                                                                    OPJ_UINT32 p_header_size,
-                                                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_mct(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 
 /**
  * Writes the MCC marker (Multiple Component Collection)
@@ -1004,10 +1062,10 @@
  * @param       p_stream                the stream to write data to.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_mcc_record(   opj_j2k_t *p_j2k,
-                                            opj_simple_mcc_decorrelation_data_t * p_mcc_record,
-                                            opj_stream_private_t *p_stream,
-                                            opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_mcc_record(opj_j2k_t *p_j2k,
+        opj_simple_mcc_decorrelation_data_t * p_mcc_record,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Reads a MCC marker (Multiple Component Collection)
@@ -1017,10 +1075,10 @@
  * @param       p_header_size   the size of the data contained in the MCC marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_mcc (      opj_j2k_t *p_j2k,
-                                                                    OPJ_BYTE * p_header_data,
-                                                                    OPJ_UINT32 p_header_size,
-                                                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_mcc(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 
 /**
  * Writes the MCO marker (Multiple component transformation ordering)
@@ -1029,9 +1087,9 @@
  * @param       p_j2k                           J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_mco(      opj_j2k_t *p_j2k,
-                                    opj_stream_private_t *p_stream,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_mco(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Reads a MCO marker (Multiple Component Transform Ordering)
@@ -1041,27 +1099,40 @@
  * @param       p_header_size   the size of the data contained in the MCO marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_mco (      opj_j2k_t *p_j2k,
-                                                                    OPJ_BYTE * p_header_data,
-                                                                    OPJ_UINT32 p_header_size,
-                                                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_read_mco(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 
-static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index);
+static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image,
+                                OPJ_UINT32 p_index);
 
-static void  opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
-static void  opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
-static void  opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
-static void  opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_int16_to_float(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_int32_to_float(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_float32_to_float(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_float64_to_float(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem);
 
-static void  opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
-static void  opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
-static void  opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
-static void  opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_int16_to_int32(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_int32_to_int32(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_float32_to_int32(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_read_float64_to_int32(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem);
 
-static void  opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
-static void  opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
-static void  opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
-static void  opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_write_float_to_int16(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_write_float_to_int32(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_write_float_to_float(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem);
+static void  opj_j2k_write_float_to_float64(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem);
 
 /**
  * Ends the encoding, i.e. frees memory.
@@ -1070,9 +1141,9 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_end_encoding(   opj_j2k_t *p_j2k,
-                                                                            opj_stream_private_t *p_stream,
-                                                                            opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_end_encoding(opj_j2k_t *p_j2k,
+                                     opj_stream_private_t *p_stream,
+                                     opj_event_mgr_t * p_manager);
 
 /**
  * Writes the CBD marker (Component bit depth definition)
@@ -1081,9 +1152,9 @@
  * @param       p_j2k                           J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_cbd(      opj_j2k_t *p_j2k,
-                                                                    opj_stream_private_t *p_stream,
-                                                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_cbd(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Reads a CBD marker (Component bit depth definition)
@@ -1092,12 +1163,12 @@
  * @param       p_header_size   the size of the data contained in the CBD marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_cbd (      opj_j2k_t *p_j2k,
-                                                                OPJ_BYTE * p_header_data,
-                                                                OPJ_UINT32 p_header_size,
-                                                                opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_read_cbd(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager);
 
-#if 0
+
 /**
  * Writes COC marker for each component.
  *
@@ -1105,12 +1176,10 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_all_coc( opj_j2k_t *p_j2k,
-                                                                        opj_stream_private_t *p_stream,
-                                                                        opj_event_mgr_t * p_manager );
-#endif
+static OPJ_BOOL opj_j2k_write_all_coc(opj_j2k_t *p_j2k,
+                                      opj_stream_private_t *p_stream,
+                                      opj_event_mgr_t * p_manager);
 
-#if 0
 /**
  * Writes QCC marker for each component.
  *
@@ -1118,10 +1187,9 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_all_qcc( opj_j2k_t *p_j2k,
-                                                                        opj_stream_private_t *p_stream,
-                                                                        opj_event_mgr_t * p_manager );
-#endif
+static OPJ_BOOL opj_j2k_write_all_qcc(opj_j2k_t *p_j2k,
+                                      opj_stream_private_t *p_stream,
+                                      opj_event_mgr_t * p_manager);
 
 /**
  * Writes regions of interests.
@@ -1130,9 +1198,9 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_regions(  opj_j2k_t *p_j2k,
-                                                                        opj_stream_private_t *p_stream,
-                                                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_regions(opj_j2k_t *p_j2k,
+                                      opj_stream_private_t *p_stream,
+                                      opj_event_mgr_t * p_manager);
 
 /**
  * Writes EPC ????
@@ -1141,9 +1209,9 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_write_epc(      opj_j2k_t *p_j2k,
-                                                                    opj_stream_private_t *p_stream,
-                                                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_write_epc(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Checks the progression order changes values. Tells of the poc given as input are valid.
@@ -1158,12 +1226,12 @@
  *
  * @return      true if the pocs are valid.
  */
-static OPJ_BOOL opj_j2k_check_poc_val(  const opj_poc_t *p_pocs,
-                                                                            OPJ_UINT32 p_nb_pocs,
-                                                                            OPJ_UINT32 p_nb_resolutions,
-                                                                            OPJ_UINT32 numcomps,
-                                                                            OPJ_UINT32 numlayers,
-                                                                            opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_check_poc_val(const opj_poc_t *p_pocs,
+                                      OPJ_UINT32 p_nb_pocs,
+                                      OPJ_UINT32 p_nb_resolutions,
+                                      OPJ_UINT32 numcomps,
+                                      OPJ_UINT32 numlayers,
+                                      opj_event_mgr_t * p_manager);
 
 /**
  * Gets the number of tile parts used for the given change of progression (if any) and the given tile.
@@ -1174,7 +1242,8 @@
  *
  * @return              the number of tile parts.
  */
-static OPJ_UINT32 opj_j2k_get_num_tp( opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno);
+static OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino,
+                                     OPJ_UINT32 tileno);
 
 /**
  * Calculates the total number of tile parts needed by the encoder to
@@ -1188,11 +1257,11 @@
  *
  * @return true if the function was successful, false else.
  */
-static OPJ_BOOL opj_j2k_calculate_tp(   opj_j2k_t *p_j2k,
-                                                                            opj_cp_t *cp,
-                                                                            OPJ_UINT32 * p_nb_tiles,
-                                                                            opj_image_t *image,
-                                                                            opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_j2k_calculate_tp(opj_j2k_t *p_j2k,
+                                     opj_cp_t *cp,
+                                     OPJ_UINT32 * p_nb_tiles,
+                                     opj_image_t *image,
+                                     opj_event_mgr_t * p_manager);
 
 static void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream);
 
@@ -1200,15 +1269,17 @@
 
 static opj_codestream_index_t* opj_j2k_create_cstr_index(void);
 
-static OPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp);
+static OPJ_FLOAT32 opj_j2k_get_tp_stride(opj_tcp_t * p_tcp);
 
-static OPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp);
+static OPJ_FLOAT32 opj_j2k_get_default_stride(opj_tcp_t * p_tcp);
 
 static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres);
 
-static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager);
+static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters,
+        opj_image_t *image, opj_event_mgr_t *p_manager);
 
-static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz, opj_event_mgr_t *p_manager);
+static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz,
+        opj_event_mgr_t *p_manager);
 
 /**
  * Checks for invalid number of tile-parts in SOT marker (TPsot==TNsot). See issue 254.
@@ -1220,589 +1291,603 @@
  *
  * @return true if the function was successful, false else.
  */
-static OPJ_BOOL opj_j2k_need_nb_tile_parts_correction(opj_stream_private_t *p_stream, OPJ_UINT32 tile_no, OPJ_BOOL* p_correction_needed, opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_j2k_need_nb_tile_parts_correction(opj_stream_private_t
+        *p_stream, OPJ_UINT32 tile_no, OPJ_BOOL* p_correction_needed,
+        opj_event_mgr_t * p_manager);
 
 /*@}*/
 
 /*@}*/
 
 /* ----------------------------------------------------------------------- */
-typedef struct j2k_prog_order{
-        OPJ_PROG_ORDER enum_prog;
-        char str_prog[5];
-}j2k_prog_order_t;
+typedef struct j2k_prog_order {
+    OPJ_PROG_ORDER enum_prog;
+    char str_prog[5];
+} j2k_prog_order_t;
 
 static j2k_prog_order_t j2k_prog_order_list[] = {
-        {OPJ_CPRL, "CPRL"},
-        {OPJ_LRCP, "LRCP"},
-        {OPJ_PCRL, "PCRL"},
-        {OPJ_RLCP, "RLCP"},
-        {OPJ_RPCL, "RPCL"},
-        {(OPJ_PROG_ORDER)-1, ""}
+    {OPJ_CPRL, "CPRL"},
+    {OPJ_LRCP, "LRCP"},
+    {OPJ_PCRL, "PCRL"},
+    {OPJ_RLCP, "RLCP"},
+    {OPJ_RPCL, "RPCL"},
+    {(OPJ_PROG_ORDER) - 1, ""}
 };
 
 /**
  * FIXME DOC
  */
-static const OPJ_UINT32 MCT_ELEMENT_SIZE [] =
-{
-        2,
-        4,
-        4,
-        8
+static const OPJ_UINT32 MCT_ELEMENT_SIZE [] = {
+    2,
+    4,
+    4,
+    8
 };
 
-typedef void (* opj_j2k_mct_function) (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem);
+typedef void (* opj_j2k_mct_function)(const void * p_src_data,
+                                      void * p_dest_data, OPJ_UINT32 p_nb_elem);
 
-static const opj_j2k_mct_function j2k_mct_read_functions_to_float [] =
-{
-        opj_j2k_read_int16_to_float,
-        opj_j2k_read_int32_to_float,
-        opj_j2k_read_float32_to_float,
-        opj_j2k_read_float64_to_float
+static const opj_j2k_mct_function j2k_mct_read_functions_to_float [] = {
+    opj_j2k_read_int16_to_float,
+    opj_j2k_read_int32_to_float,
+    opj_j2k_read_float32_to_float,
+    opj_j2k_read_float64_to_float
 };
 
-static const opj_j2k_mct_function j2k_mct_read_functions_to_int32 [] =
-{
-        opj_j2k_read_int16_to_int32,
-        opj_j2k_read_int32_to_int32,
-        opj_j2k_read_float32_to_int32,
-        opj_j2k_read_float64_to_int32
+static const opj_j2k_mct_function j2k_mct_read_functions_to_int32 [] = {
+    opj_j2k_read_int16_to_int32,
+    opj_j2k_read_int32_to_int32,
+    opj_j2k_read_float32_to_int32,
+    opj_j2k_read_float64_to_int32
 };
 
-static const opj_j2k_mct_function j2k_mct_write_functions_from_float [] =
-{
-        opj_j2k_write_float_to_int16,
-        opj_j2k_write_float_to_int32,
-        opj_j2k_write_float_to_float,
-        opj_j2k_write_float_to_float64
+static const opj_j2k_mct_function j2k_mct_write_functions_from_float [] = {
+    opj_j2k_write_float_to_int16,
+    opj_j2k_write_float_to_int32,
+    opj_j2k_write_float_to_float,
+    opj_j2k_write_float_to_float64
 };
 
-typedef struct opj_dec_memory_marker_handler
-{
-        /** marker value */
-        OPJ_UINT32 id;
-        /** value of the state when the marker can appear */
-        OPJ_UINT32 states;
-        /** action linked to the marker */
-        OPJ_BOOL (*handler) (   opj_j2k_t *p_j2k,
-                            OPJ_BYTE * p_header_data,
-                            OPJ_UINT32 p_header_size,
-                            opj_event_mgr_t * p_manager );
+typedef struct opj_dec_memory_marker_handler {
+    /** marker value */
+    OPJ_UINT32 id;
+    /** value of the state when the marker can appear */
+    OPJ_UINT32 states;
+    /** action linked to the marker */
+    OPJ_BOOL(*handler)(opj_j2k_t *p_j2k,
+                       OPJ_BYTE * p_header_data,
+                       OPJ_UINT32 p_header_size,
+                       opj_event_mgr_t * p_manager);
 }
 opj_dec_memory_marker_handler_t;
 
 static const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] =
 {
-  {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, opj_j2k_read_sot},
-  {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_cod},
-  {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_coc},
-  {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_rgn},
-  {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcd},
-  {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcc},
-  {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_poc},
-  {J2K_MS_SIZ, J2K_STATE_MHSIZ, opj_j2k_read_siz},
-  {J2K_MS_TLM, J2K_STATE_MH, opj_j2k_read_tlm},
-  {J2K_MS_PLM, J2K_STATE_MH, opj_j2k_read_plm},
-  {J2K_MS_PLT, J2K_STATE_TPH, opj_j2k_read_plt},
-  {J2K_MS_PPM, J2K_STATE_MH, opj_j2k_read_ppm},
-  {J2K_MS_PPT, J2K_STATE_TPH, opj_j2k_read_ppt},
-  {J2K_MS_SOP, 0, 0},
-  {J2K_MS_CRG, J2K_STATE_MH, opj_j2k_read_crg},
-  {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_com},
-  {J2K_MS_MCT, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mct},
-  {J2K_MS_CBD, J2K_STATE_MH , opj_j2k_read_cbd},
-  {J2K_MS_MCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mcc},
-  {J2K_MS_MCO, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mco},
+    {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, opj_j2k_read_sot},
+    {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_cod},
+    {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_coc},
+    {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_rgn},
+    {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcd},
+    {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_qcc},
+    {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_poc},
+    {J2K_MS_SIZ, J2K_STATE_MHSIZ, opj_j2k_read_siz},
+    {J2K_MS_TLM, J2K_STATE_MH, opj_j2k_read_tlm},
+    {J2K_MS_PLM, J2K_STATE_MH, opj_j2k_read_plm},
+    {J2K_MS_PLT, J2K_STATE_TPH, opj_j2k_read_plt},
+    {J2K_MS_PPM, J2K_STATE_MH, opj_j2k_read_ppm},
+    {J2K_MS_PPT, J2K_STATE_TPH, opj_j2k_read_ppt},
+    {J2K_MS_SOP, 0, 0},
+    {J2K_MS_CRG, J2K_STATE_MH, opj_j2k_read_crg},
+    {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_com},
+    {J2K_MS_MCT, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mct},
+    {J2K_MS_CBD, J2K_STATE_MH, opj_j2k_read_cbd},
+    {J2K_MS_MCC, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mcc},
+    {J2K_MS_MCO, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_mco},
 #ifdef USE_JPWL
 #ifdef TODO_MS /* remove these functions which are not commpatible with the v2 API */
-  {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc},
-  {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb},
-  {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd},
-  {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red},
+    {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc},
+    {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb},
+    {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd},
+    {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red},
 #endif
 #endif /* USE_JPWL */
 #ifdef USE_JPSEC
-  {J2K_MS_SEC, J2K_DEC_STATE_MH, j2k_read_sec},
-  {J2K_MS_INSEC, 0, j2k_read_insec}
+    {J2K_MS_SEC, J2K_DEC_STATE_MH, j2k_read_sec},
+    {J2K_MS_INSEC, 0, j2k_read_insec}
 #endif /* USE_JPSEC */
-  {J2K_MS_UNK, J2K_STATE_MH | J2K_STATE_TPH, 0}/*opj_j2k_read_unk is directly used*/
+    {J2K_MS_UNK, J2K_STATE_MH | J2K_STATE_TPH, 0}/*opj_j2k_read_unk is directly used*/
 };
 
-static void  opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+static void  opj_j2k_read_int16_to_float(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem)
 {
-        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
-        OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
-        OPJ_UINT32 i;
-        OPJ_UINT32 l_temp;
+    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+    OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_temp;
 
-        for (i=0;i<p_nb_elem;++i) {
-                opj_read_bytes(l_src_data,&l_temp,2);
+    for (i = 0; i < p_nb_elem; ++i) {
+        opj_read_bytes(l_src_data, &l_temp, 2);
 
-                l_src_data+=sizeof(OPJ_INT16);
+        l_src_data += sizeof(OPJ_INT16);
 
-                *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
-        }
+        *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
+    }
 }
 
-static void  opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+static void  opj_j2k_read_int32_to_float(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem)
 {
-        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
-        OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
-        OPJ_UINT32 i;
-        OPJ_UINT32 l_temp;
+    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+    OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_temp;
 
-        for (i=0;i<p_nb_elem;++i) {
-                opj_read_bytes(l_src_data,&l_temp,4);
+    for (i = 0; i < p_nb_elem; ++i) {
+        opj_read_bytes(l_src_data, &l_temp, 4);
 
-                l_src_data+=sizeof(OPJ_INT32);
+        l_src_data += sizeof(OPJ_INT32);
 
-                *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
-        }
+        *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
+    }
 }
 
-static void  opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+static void  opj_j2k_read_float32_to_float(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem)
 {
-        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
-        OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
-        OPJ_UINT32 i;
-        OPJ_FLOAT32 l_temp;
+    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+    OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
+    OPJ_UINT32 i;
+    OPJ_FLOAT32 l_temp;
 
-        for (i=0;i<p_nb_elem;++i) {
-                opj_read_float(l_src_data,&l_temp);
+    for (i = 0; i < p_nb_elem; ++i) {
+        opj_read_float(l_src_data, &l_temp);
 
-                l_src_data+=sizeof(OPJ_FLOAT32);
+        l_src_data += sizeof(OPJ_FLOAT32);
 
-                *(l_dest_data++) = l_temp;
-        }
+        *(l_dest_data++) = l_temp;
+    }
 }
 
-static void  opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+static void  opj_j2k_read_float64_to_float(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem)
 {
-        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
-        OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
-        OPJ_UINT32 i;
-        OPJ_FLOAT64 l_temp;
+    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+    OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data;
+    OPJ_UINT32 i;
+    OPJ_FLOAT64 l_temp;
 
-        for (i=0;i<p_nb_elem;++i) {
-                opj_read_double(l_src_data,&l_temp);
+    for (i = 0; i < p_nb_elem; ++i) {
+        opj_read_double(l_src_data, &l_temp);
 
-                l_src_data+=sizeof(OPJ_FLOAT64);
+        l_src_data += sizeof(OPJ_FLOAT64);
 
-                *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
-        }
+        *(l_dest_data++) = (OPJ_FLOAT32) l_temp;
+    }
 }
 
-static void  opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+static void  opj_j2k_read_int16_to_int32(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem)
 {
-        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
-        OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
-        OPJ_UINT32 i;
-        OPJ_UINT32 l_temp;
+    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+    OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_temp;
 
-        for (i=0;i<p_nb_elem;++i) {
-                opj_read_bytes(l_src_data,&l_temp,2);
+    for (i = 0; i < p_nb_elem; ++i) {
+        opj_read_bytes(l_src_data, &l_temp, 2);
 
-                l_src_data+=sizeof(OPJ_INT16);
+        l_src_data += sizeof(OPJ_INT16);
 
-                *(l_dest_data++) = (OPJ_INT32) l_temp;
-        }
+        *(l_dest_data++) = (OPJ_INT32) l_temp;
+    }
 }
 
-static void  opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+static void  opj_j2k_read_int32_to_int32(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem)
 {
-        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
-        OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
-        OPJ_UINT32 i;
-        OPJ_UINT32 l_temp;
+    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+    OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_temp;
 
-        for (i=0;i<p_nb_elem;++i) {
-                opj_read_bytes(l_src_data,&l_temp,4);
+    for (i = 0; i < p_nb_elem; ++i) {
+        opj_read_bytes(l_src_data, &l_temp, 4);
 
-                l_src_data+=sizeof(OPJ_INT32);
+        l_src_data += sizeof(OPJ_INT32);
 
-                *(l_dest_data++) = (OPJ_INT32) l_temp;
-        }
+        *(l_dest_data++) = (OPJ_INT32) l_temp;
+    }
 }
 
-static void  opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+static void  opj_j2k_read_float32_to_int32(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem)
 {
-        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
-        OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
-        OPJ_UINT32 i;
-        OPJ_FLOAT32 l_temp;
+    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+    OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
+    OPJ_UINT32 i;
+    OPJ_FLOAT32 l_temp;
 
-        for (i=0;i<p_nb_elem;++i) {
-                opj_read_float(l_src_data,&l_temp);
+    for (i = 0; i < p_nb_elem; ++i) {
+        opj_read_float(l_src_data, &l_temp);
 
-                l_src_data+=sizeof(OPJ_FLOAT32);
+        l_src_data += sizeof(OPJ_FLOAT32);
 
-                *(l_dest_data++) = (OPJ_INT32) l_temp;
-        }
+        *(l_dest_data++) = (OPJ_INT32) l_temp;
+    }
 }
 
-static void  opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+static void  opj_j2k_read_float64_to_int32(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem)
 {
-        OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
-        OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
-        OPJ_UINT32 i;
-        OPJ_FLOAT64 l_temp;
+    OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data;
+    OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data;
+    OPJ_UINT32 i;
+    OPJ_FLOAT64 l_temp;
 
-        for (i=0;i<p_nb_elem;++i) {
-                opj_read_double(l_src_data,&l_temp);
+    for (i = 0; i < p_nb_elem; ++i) {
+        opj_read_double(l_src_data, &l_temp);
 
-                l_src_data+=sizeof(OPJ_FLOAT64);
+        l_src_data += sizeof(OPJ_FLOAT64);
 
-                *(l_dest_data++) = (OPJ_INT32) l_temp;
-        }
+        *(l_dest_data++) = (OPJ_INT32) l_temp;
+    }
 }
 
-static void  opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+static void  opj_j2k_write_float_to_int16(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem)
 {
-        OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
-        OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
-        OPJ_UINT32 i;
-        OPJ_UINT32 l_temp;
+    OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
+    OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_temp;
 
-        for (i=0;i<p_nb_elem;++i) {
-                l_temp = (OPJ_UINT32) *(l_src_data++);
+    for (i = 0; i < p_nb_elem; ++i) {
+        l_temp = (OPJ_UINT32) * (l_src_data++);
 
-                opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT16));
+        opj_write_bytes(l_dest_data, l_temp, sizeof(OPJ_INT16));
 
-                l_dest_data+=sizeof(OPJ_INT16);
-        }
+        l_dest_data += sizeof(OPJ_INT16);
+    }
 }
 
-static void opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+static void opj_j2k_write_float_to_int32(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem)
 {
-        OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
-        OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
-        OPJ_UINT32 i;
-        OPJ_UINT32 l_temp;
+    OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
+    OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_temp;
 
-        for (i=0;i<p_nb_elem;++i) {
-                l_temp = (OPJ_UINT32) *(l_src_data++);
+    for (i = 0; i < p_nb_elem; ++i) {
+        l_temp = (OPJ_UINT32) * (l_src_data++);
 
-                opj_write_bytes(l_dest_data,l_temp,sizeof(OPJ_INT32));
+        opj_write_bytes(l_dest_data, l_temp, sizeof(OPJ_INT32));
 
-                l_dest_data+=sizeof(OPJ_INT32);
-        }
+        l_dest_data += sizeof(OPJ_INT32);
+    }
 }
 
-static void  opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+static void  opj_j2k_write_float_to_float(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem)
 {
-        OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
-        OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
-        OPJ_UINT32 i;
-        OPJ_FLOAT32 l_temp;
+    OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
+    OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
+    OPJ_UINT32 i;
+    OPJ_FLOAT32 l_temp;
 
-        for (i=0;i<p_nb_elem;++i) {
-                l_temp = (OPJ_FLOAT32) *(l_src_data++);
+    for (i = 0; i < p_nb_elem; ++i) {
+        l_temp = (OPJ_FLOAT32) * (l_src_data++);
 
-                opj_write_float(l_dest_data,l_temp);
+        opj_write_float(l_dest_data, l_temp);
 
-                l_dest_data+=sizeof(OPJ_FLOAT32);
-        }
+        l_dest_data += sizeof(OPJ_FLOAT32);
+    }
 }
 
-static void  opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem)
+static void  opj_j2k_write_float_to_float64(const void * p_src_data,
+        void * p_dest_data, OPJ_UINT32 p_nb_elem)
 {
-        OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
-        OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
-        OPJ_UINT32 i;
-        OPJ_FLOAT64 l_temp;
+    OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data;
+    OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data;
+    OPJ_UINT32 i;
+    OPJ_FLOAT64 l_temp;
 
-        for (i=0;i<p_nb_elem;++i) {
-                l_temp = (OPJ_FLOAT64) *(l_src_data++);
+    for (i = 0; i < p_nb_elem; ++i) {
+        l_temp = (OPJ_FLOAT64) * (l_src_data++);
 
-                opj_write_double(l_dest_data,l_temp);
+        opj_write_double(l_dest_data, l_temp);
 
-                l_dest_data+=sizeof(OPJ_FLOAT64);
-        }
+        l_dest_data += sizeof(OPJ_FLOAT64);
+    }
 }
 
-char *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){
-        j2k_prog_order_t *po;
-        for(po = j2k_prog_order_list; po->enum_prog != -1; po++ ){
-                if(po->enum_prog == prg_order){
-                        return po->str_prog;
-                }
+char *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order)
+{
+    j2k_prog_order_t *po;
+    for (po = j2k_prog_order_list; po->enum_prog != -1; po++) {
+        if (po->enum_prog == prg_order) {
+            return po->str_prog;
         }
-        return po->str_prog;
+    }
+    return po->str_prog;
 }
 
-static OPJ_BOOL opj_j2k_check_poc_val( const opj_poc_t *p_pocs,
-                                                        OPJ_UINT32 p_nb_pocs,
-                                                        OPJ_UINT32 p_nb_resolutions,
-                                                        OPJ_UINT32 p_num_comps,
-                                                        OPJ_UINT32 p_num_layers,
-                                                        opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_j2k_check_poc_val(const opj_poc_t *p_pocs,
+                                      OPJ_UINT32 p_nb_pocs,
+                                      OPJ_UINT32 p_nb_resolutions,
+                                      OPJ_UINT32 p_num_comps,
+                                      OPJ_UINT32 p_num_layers,
+                                      opj_event_mgr_t * p_manager)
 {
-        OPJ_UINT32* packet_array;
-        OPJ_UINT32 index , resno, compno, layno;
-        OPJ_UINT32 i;
-        OPJ_UINT32 step_c = 1;
-        OPJ_UINT32 step_r = p_num_comps * step_c;
-        OPJ_UINT32 step_l = p_nb_resolutions * step_r;
-        OPJ_BOOL loss = OPJ_FALSE;
-        OPJ_UINT32 layno0 = 0;
+    OPJ_UINT32* packet_array;
+    OPJ_UINT32 index, resno, compno, layno;
+    OPJ_UINT32 i;
+    OPJ_UINT32 step_c = 1;
+    OPJ_UINT32 step_r = p_num_comps * step_c;
+    OPJ_UINT32 step_l = p_nb_resolutions * step_r;
+    OPJ_BOOL loss = OPJ_FALSE;
+    OPJ_UINT32 layno0 = 0;
 
-        packet_array = (OPJ_UINT32*) opj_calloc(step_l * p_num_layers, sizeof(OPJ_UINT32));
-        if (packet_array == 00) {
-                opj_event_msg(p_manager , EVT_ERROR, "Not enough memory for checking the poc values.\n");
-                return OPJ_FALSE;
-        }
+    packet_array = (OPJ_UINT32*) opj_calloc(step_l * p_num_layers,
+                                            sizeof(OPJ_UINT32));
+    if (packet_array == 00) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Not enough memory for checking the poc values.\n");
+        return OPJ_FALSE;
+    }
 
-        if (p_nb_pocs == 0) {
+    if (p_nb_pocs == 0) {
         opj_free(packet_array);
-                return OPJ_TRUE;
+        return OPJ_TRUE;
+    }
+
+    index = step_r * p_pocs->resno0;
+    /* take each resolution for each poc */
+    for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno) {
+        OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;
+
+        /* take each comp of each resolution for each poc */
+        for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) {
+            OPJ_UINT32 comp_index = res_index + layno0 * step_l;
+
+            /* and finally take each layer of each res of ... */
+            for (layno = layno0; layno < p_pocs->layno1 ; ++layno) {
+                /*index = step_r * resno + step_c * compno + step_l * layno;*/
+                packet_array[comp_index] = 1;
+                comp_index += step_l;
+            }
+
+            res_index += step_c;
         }
 
+        index += step_r;
+    }
+    ++p_pocs;
+
+    /* iterate through all the pocs */
+    for (i = 1; i < p_nb_pocs ; ++i) {
+        OPJ_UINT32 l_last_layno1 = (p_pocs - 1)->layno1 ;
+
+        layno0 = (p_pocs->layno1 > l_last_layno1) ? l_last_layno1 : 0;
         index = step_r * p_pocs->resno0;
+
         /* take each resolution for each poc */
-        for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno)
-        {
-                OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;
+        for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno) {
+            OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;
 
-                /* take each comp of each resolution for each poc */
-                for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) {
-                        OPJ_UINT32 comp_index = res_index + layno0 * step_l;
+            /* take each comp of each resolution for each poc */
+            for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) {
+                OPJ_UINT32 comp_index = res_index + layno0 * step_l;
 
-                        /* and finally take each layer of each res of ... */
-                        for (layno = layno0; layno < p_pocs->layno1 ; ++layno) {
-                                /*index = step_r * resno + step_c * compno + step_l * layno;*/
-                                packet_array[comp_index] = 1;
-                                comp_index += step_l;
-                        }
-
-                        res_index += step_c;
+                /* and finally take each layer of each res of ... */
+                for (layno = layno0; layno < p_pocs->layno1 ; ++layno) {
+                    /*index = step_r * resno + step_c * compno + step_l * layno;*/
+                    packet_array[comp_index] = 1;
+                    comp_index += step_l;
                 }
 
-                index += step_r;
+                res_index += step_c;
+            }
+
+            index += step_r;
         }
+
         ++p_pocs;
+    }
 
-        /* iterate through all the pocs */
-        for (i = 1; i < p_nb_pocs ; ++i) {
-                OPJ_UINT32 l_last_layno1 = (p_pocs-1)->layno1 ;
-
-                layno0 = (p_pocs->layno1 > l_last_layno1)? l_last_layno1 : 0;
-                index = step_r * p_pocs->resno0;
-
-                /* take each resolution for each poc */
-                for (resno = p_pocs->resno0 ; resno < p_pocs->resno1 ; ++resno) {
-                        OPJ_UINT32 res_index = index + p_pocs->compno0 * step_c;
-
-                        /* take each comp of each resolution for each poc */
-                        for (compno = p_pocs->compno0 ; compno < p_pocs->compno1 ; ++compno) {
-                                OPJ_UINT32 comp_index = res_index + layno0 * step_l;
-
-                                /* and finally take each layer of each res of ... */
-                                for (layno = layno0; layno < p_pocs->layno1 ; ++layno) {
-                                        /*index = step_r * resno + step_c * compno + step_l * layno;*/
-                                        packet_array[comp_index] = 1;
-                                        comp_index += step_l;
-                                }
-
-                                res_index += step_c;
-                        }
-
-                        index += step_r;
-                }
-
-                ++p_pocs;
+    index = 0;
+    for (layno = 0; layno < p_num_layers ; ++layno) {
+        for (resno = 0; resno < p_nb_resolutions; ++resno) {
+            for (compno = 0; compno < p_num_comps; ++compno) {
+                loss |= (packet_array[index] != 1);
+                /*index = step_r * resno + step_c * compno + step_l * layno;*/
+                index += step_c;
+            }
         }
+    }
 
-        index = 0;
-        for (layno = 0; layno < p_num_layers ; ++layno) {
-                for (resno = 0; resno < p_nb_resolutions; ++resno) {
-                        for (compno = 0; compno < p_num_comps; ++compno) {
-                                loss |= (packet_array[index]!=1);
-                                /*index = step_r * resno + step_c * compno + step_l * layno;*/
-                                index += step_c;
-                        }
-                }
-        }
+    if (loss) {
+        opj_event_msg(p_manager, EVT_ERROR, "Missing packets possible loss of data\n");
+    }
 
-        if (loss) {
-                opj_event_msg(p_manager , EVT_ERROR, "Missing packets possible loss of data\n");
-        }
+    opj_free(packet_array);
 
-        opj_free(packet_array);
-
-        return !loss;
+    return !loss;
 }
 
 /* ----------------------------------------------------------------------- */
 
-static OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno)
+static OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino,
+                                     OPJ_UINT32 tileno)
 {
-        const OPJ_CHAR *prog = 00;
-        OPJ_INT32 i;
-        OPJ_UINT32 tpnum = 1;
-        opj_tcp_t *tcp = 00;
-        opj_poc_t * l_current_poc = 00;
+    const OPJ_CHAR *prog = 00;
+    OPJ_INT32 i;
+    OPJ_UINT32 tpnum = 1;
+    opj_tcp_t *tcp = 00;
+    opj_poc_t * l_current_poc = 00;
 
-        /*  preconditions */
-        assert(tileno < (cp->tw * cp->th));
-        assert(pino < (cp->tcps[tileno].numpocs + 1));
+    /*  preconditions */
+    assert(tileno < (cp->tw * cp->th));
+    assert(pino < (cp->tcps[tileno].numpocs + 1));
 
-        /* get the given tile coding parameter */
-        tcp = &cp->tcps[tileno];
-        assert(tcp != 00);
+    /* get the given tile coding parameter */
+    tcp = &cp->tcps[tileno];
+    assert(tcp != 00);
 
-        l_current_poc = &(tcp->pocs[pino]);
-        assert(l_current_poc != 0);
+    l_current_poc = &(tcp->pocs[pino]);
+    assert(l_current_poc != 0);
 
-        /* get the progression order as a character string */
-        prog = opj_j2k_convert_progression_order(tcp->prg);
-        assert(strlen(prog) > 0);
+    /* get the progression order as a character string */
+    prog = opj_j2k_convert_progression_order(tcp->prg);
+    assert(strlen(prog) > 0);
 
-        if (cp->m_specific_param.m_enc.m_tp_on == 1) {
-                for (i=0;i<4;++i) {
-                        switch (prog[i])
-                        {
-                                /* component wise */
-                                case 'C':
-                                        tpnum *= l_current_poc->compE;
-                                        break;
-                                /* resolution wise */
-                                case 'R':
-                                        tpnum *= l_current_poc->resE;
-                                        break;
-                                /* precinct wise */
-                                case 'P':
-                                        tpnum *= l_current_poc->prcE;
-                                        break;
-                                /* layer wise */
-                                case 'L':
-                                        tpnum *= l_current_poc->layE;
-                                        break;
-                        }
-                        /* whould we split here ? */
-                        if ( cp->m_specific_param.m_enc.m_tp_flag == prog[i] ) {
-                                cp->m_specific_param.m_enc.m_tp_pos=i;
-                                break;
-                        }
-                }
+    if (cp->m_specific_param.m_enc.m_tp_on == 1) {
+        for (i = 0; i < 4; ++i) {
+            switch (prog[i]) {
+            /* component wise */
+            case 'C':
+                tpnum *= l_current_poc->compE;
+                break;
+            /* resolution wise */
+            case 'R':
+                tpnum *= l_current_poc->resE;
+                break;
+            /* precinct wise */
+            case 'P':
+                tpnum *= l_current_poc->prcE;
+                break;
+            /* layer wise */
+            case 'L':
+                tpnum *= l_current_poc->layE;
+                break;
+            }
+            /* whould we split here ? */
+            if (cp->m_specific_param.m_enc.m_tp_flag == prog[i]) {
+                cp->m_specific_param.m_enc.m_tp_pos = i;
+                break;
+            }
         }
-        else {
-                tpnum=1;
-        }
+    } else {
+        tpnum = 1;
+    }
 
-        return tpnum;
+    return tpnum;
 }
 
-static OPJ_BOOL opj_j2k_calculate_tp(  opj_j2k_t *p_j2k,
-                                                        opj_cp_t *cp,
-                                                        OPJ_UINT32 * p_nb_tiles,
-                                                        opj_image_t *image,
-                                                        opj_event_mgr_t * p_manager
-                                )
+static OPJ_BOOL opj_j2k_calculate_tp(opj_j2k_t *p_j2k,
+                                     opj_cp_t *cp,
+                                     OPJ_UINT32 * p_nb_tiles,
+                                     opj_image_t *image,
+                                     opj_event_mgr_t * p_manager
+                                    )
 {
-        OPJ_UINT32 pino,tileno;
-        OPJ_UINT32 l_nb_tiles;
-        opj_tcp_t *tcp;
+    OPJ_UINT32 pino, tileno;
+    OPJ_UINT32 l_nb_tiles;
+    opj_tcp_t *tcp;
 
-        /* preconditions */
-        assert(p_nb_tiles != 00);
-        assert(cp != 00);
-        assert(image != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_nb_tiles != 00);
+    assert(cp != 00);
+    assert(image != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_nb_tiles = cp->tw * cp->th;
-        * p_nb_tiles = 0;
-        tcp = cp->tcps;
+    OPJ_UNUSED(p_j2k);
+    OPJ_UNUSED(p_manager);
 
-        /* INDEX >> */
-        /* TODO mergeV2: check this part which use cstr_info */
-        /*if (p_j2k->cstr_info) {
-                opj_tile_info_t * l_info_tile_ptr = p_j2k->cstr_info->tile;
+    l_nb_tiles = cp->tw * cp->th;
+    * p_nb_tiles = 0;
+    tcp = cp->tcps;
 
-                for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
-                        OPJ_UINT32 cur_totnum_tp = 0;
+    /* INDEX >> */
+    /* TODO mergeV2: check this part which use cstr_info */
+    /*if (p_j2k->cstr_info) {
+            opj_tile_info_t * l_info_tile_ptr = p_j2k->cstr_info->tile;
 
-                        opj_pi_update_encoding_parameters(image,cp,tileno);
+            for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
+                    OPJ_UINT32 cur_totnum_tp = 0;
 
-                        for (pino = 0; pino <= tcp->numpocs; ++pino)
-                        {
-                                OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);
+                    opj_pi_update_encoding_parameters(image,cp,tileno);
 
-                                *p_nb_tiles = *p_nb_tiles + tp_num;
+                    for (pino = 0; pino <= tcp->numpocs; ++pino)
+                    {
+                            OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);
 
-                                cur_totnum_tp += tp_num;
-                        }
+                            *p_nb_tiles = *p_nb_tiles + tp_num;
 
-                        tcp->m_nb_tile_parts = cur_totnum_tp;
+                            cur_totnum_tp += tp_num;
+                    }
 
-                        l_info_tile_ptr->tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t));
-                        if (l_info_tile_ptr->tp == 00) {
-                                return OPJ_FALSE;
-                        }
+                    tcp->m_nb_tile_parts = cur_totnum_tp;
 
-                        memset(l_info_tile_ptr->tp,0,cur_totnum_tp * sizeof(opj_tp_info_t));
+                    l_info_tile_ptr->tp = (opj_tp_info_t *) opj_malloc(cur_totnum_tp * sizeof(opj_tp_info_t));
+                    if (l_info_tile_ptr->tp == 00) {
+                            return OPJ_FALSE;
+                    }
 
-                        l_info_tile_ptr->num_tps = cur_totnum_tp;
+                    memset(l_info_tile_ptr->tp,0,cur_totnum_tp * sizeof(opj_tp_info_t));
 
-                        ++l_info_tile_ptr;
-                        ++tcp;
-                }
+                    l_info_tile_ptr->num_tps = cur_totnum_tp;
+
+                    ++l_info_tile_ptr;
+                    ++tcp;
+            }
+    }
+    else */{
+        for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
+            OPJ_UINT32 cur_totnum_tp = 0;
+
+            opj_pi_update_encoding_parameters(image, cp, tileno);
+
+            for (pino = 0; pino <= tcp->numpocs; ++pino) {
+                OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp, pino, tileno);
+
+                *p_nb_tiles = *p_nb_tiles + tp_num;
+
+                cur_totnum_tp += tp_num;
+            }
+            tcp->m_nb_tile_parts = cur_totnum_tp;
+
+            ++tcp;
         }
-        else */{
-                for (tileno = 0; tileno < l_nb_tiles; ++tileno) {
-                        OPJ_UINT32 cur_totnum_tp = 0;
+    }
 
-                        opj_pi_update_encoding_parameters(image,cp,tileno);
-
-                        for (pino = 0; pino <= tcp->numpocs; ++pino) {
-                                OPJ_UINT32 tp_num = opj_j2k_get_num_tp(cp,pino,tileno);
-
-                                *p_nb_tiles = *p_nb_tiles + tp_num;
-
-                                cur_totnum_tp += tp_num;
-                        }
-                        tcp->m_nb_tile_parts = cur_totnum_tp;
-
-                        ++tcp;
-                }
-        }
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_soc(     opj_j2k_t *p_j2k,
-                                                opj_stream_private_t *p_stream,
-                                                    opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_write_soc(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager)
 {
-        /* 2 bytes will be written */
-        OPJ_BYTE * l_start_stream = 00;
+    /* 2 bytes will be written */
+    OPJ_BYTE * l_start_stream = 00;
 
-        /* preconditions */
-        assert(p_stream != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_stream != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_start_stream = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+    l_start_stream = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
 
-        /* write SOC identifier */
-        opj_write_bytes(l_start_stream,J2K_MS_SOC,2);
+    /* write SOC identifier */
+    opj_write_bytes(l_start_stream, J2K_MS_SOC, 2);
 
-        if (opj_stream_write_data(p_stream,l_start_stream,2,p_manager) != 2) {
-                return OPJ_FALSE;
-        }
+    if (opj_stream_write_data(p_stream, l_start_stream, 2, p_manager) != 2) {
+        return OPJ_FALSE;
+    }
 
-/* UniPG>> */
+    /* UniPG>> */
 #ifdef USE_JPWL
-        /* update markers struct */
-/*
-        OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOC, p_stream_tell(p_stream) - 2, 2);
-*/
-  assert( 0 && "TODO" );
+    /* update markers struct */
+    /*
+            OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOC, p_stream_tell(p_stream) - 2, 2);
+    */
+    assert(0 && "TODO");
 #endif /* USE_JPWL */
-/* <<UniPG */
+    /* <<UniPG */
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /**
@@ -1811,137 +1896,143 @@
  * @param       p_stream        FIXME DOC
  * @param       p_manager       the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_soc(   opj_j2k_t *p_j2k,
-                                    opj_stream_private_t *p_stream,
-                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_soc(opj_j2k_t *p_j2k,
+                                 opj_stream_private_t *p_stream,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        OPJ_BYTE l_data [2];
-        OPJ_UINT32 l_marker;
+    OPJ_BYTE l_data [2];
+    OPJ_UINT32 l_marker;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        if (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2) {
-                return OPJ_FALSE;
-        }
+    if (opj_stream_read_data(p_stream, l_data, 2, p_manager) != 2) {
+        return OPJ_FALSE;
+    }
 
-        opj_read_bytes(l_data,&l_marker,2);
-        if (l_marker != J2K_MS_SOC) {
-                return OPJ_FALSE;
-        }
+    opj_read_bytes(l_data, &l_marker, 2);
+    if (l_marker != J2K_MS_SOC) {
+        return OPJ_FALSE;
+    }
 
-        /* Next marker should be a SIZ marker in the main header */
-        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSIZ;
+    /* Next marker should be a SIZ marker in the main header */
+    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSIZ;
 
-        /* FIXME move it in a index structure included in p_j2k*/
-        p_j2k->cstr_index->main_head_start = opj_stream_tell(p_stream) - 2;
+    /* FIXME move it in a index structure included in p_j2k*/
+    p_j2k->cstr_index->main_head_start = opj_stream_tell(p_stream) - 2;
 
-        opj_event_msg(p_manager, EVT_INFO, "Start to read j2k main header (%d).\n", p_j2k->cstr_index->main_head_start);
+    opj_event_msg(p_manager, EVT_INFO, "Start to read j2k main header (%d).\n",
+                  p_j2k->cstr_index->main_head_start);
 
-        /* Add the marker to the codestream index*/
-        if (OPJ_FALSE == opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_SOC, p_j2k->cstr_index->main_head_start, 2)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
-                return OPJ_FALSE;
-        }
-        return OPJ_TRUE;
+    /* Add the marker to the codestream index*/
+    if (OPJ_FALSE == opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_SOC,
+                                          p_j2k->cstr_index->main_head_start, 2)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
+        return OPJ_FALSE;
+    }
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_siz(     opj_j2k_t *p_j2k,
-                                                        opj_stream_private_t *p_stream,
-                                                        opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_write_siz(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager)
 {
-        OPJ_UINT32 i;
-        OPJ_UINT32 l_size_len;
-        OPJ_BYTE * l_current_ptr;
-        opj_image_t * l_image = 00;
-        opj_cp_t *cp = 00;
-        opj_image_comp_t * l_img_comp = 00;
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_size_len;
+    OPJ_BYTE * l_current_ptr;
+    opj_image_t * l_image = 00;
+    opj_cp_t *cp = 00;
+    opj_image_comp_t * l_img_comp = 00;
 
-        /* preconditions */
-        assert(p_stream != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_stream != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_image = p_j2k->m_private_image;
-        cp = &(p_j2k->m_cp);
-        l_size_len = 40 + 3 * l_image->numcomps;
-        l_img_comp = l_image->comps;
+    l_image = p_j2k->m_private_image;
+    cp = &(p_j2k->m_cp);
+    l_size_len = 40 + 3 * l_image->numcomps;
+    l_img_comp = l_image->comps;
 
-        if (l_size_len > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+    if (l_size_len > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
 
-                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len);
-                if (! new_header_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory for the SIZ marker\n");
-                        return OPJ_FALSE;
-                }
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_size_len;
+        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
+                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len);
+        if (! new_header_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory for the SIZ marker\n");
+            return OPJ_FALSE;
         }
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_size_len;
+    }
 
-        l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+    l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
 
-        /* write SOC identifier */
-        opj_write_bytes(l_current_ptr,J2K_MS_SIZ,2);    /* SIZ */
-        l_current_ptr+=2;
+    /* write SOC identifier */
+    opj_write_bytes(l_current_ptr, J2K_MS_SIZ, 2);  /* SIZ */
+    l_current_ptr += 2;
 
-        opj_write_bytes(l_current_ptr,l_size_len-2,2); /* L_SIZ */
-        l_current_ptr+=2;
+    opj_write_bytes(l_current_ptr, l_size_len - 2, 2); /* L_SIZ */
+    l_current_ptr += 2;
 
-        opj_write_bytes(l_current_ptr, cp->rsiz, 2);    /* Rsiz (capabilities) */
-        l_current_ptr+=2;
+    opj_write_bytes(l_current_ptr, cp->rsiz, 2);    /* Rsiz (capabilities) */
+    l_current_ptr += 2;
 
-        opj_write_bytes(l_current_ptr, l_image->x1, 4); /* Xsiz */
-        l_current_ptr+=4;
+    opj_write_bytes(l_current_ptr, l_image->x1, 4); /* Xsiz */
+    l_current_ptr += 4;
 
-        opj_write_bytes(l_current_ptr, l_image->y1, 4); /* Ysiz */
-        l_current_ptr+=4;
+    opj_write_bytes(l_current_ptr, l_image->y1, 4); /* Ysiz */
+    l_current_ptr += 4;
 
-        opj_write_bytes(l_current_ptr, l_image->x0, 4); /* X0siz */
-        l_current_ptr+=4;
+    opj_write_bytes(l_current_ptr, l_image->x0, 4); /* X0siz */
+    l_current_ptr += 4;
 
-        opj_write_bytes(l_current_ptr, l_image->y0, 4); /* Y0siz */
-        l_current_ptr+=4;
+    opj_write_bytes(l_current_ptr, l_image->y0, 4); /* Y0siz */
+    l_current_ptr += 4;
 
-        opj_write_bytes(l_current_ptr, cp->tdx, 4);             /* XTsiz */
-        l_current_ptr+=4;
+    opj_write_bytes(l_current_ptr, cp->tdx, 4);             /* XTsiz */
+    l_current_ptr += 4;
 
-        opj_write_bytes(l_current_ptr, cp->tdy, 4);             /* YTsiz */
-        l_current_ptr+=4;
+    opj_write_bytes(l_current_ptr, cp->tdy, 4);             /* YTsiz */
+    l_current_ptr += 4;
 
-        opj_write_bytes(l_current_ptr, cp->tx0, 4);             /* XT0siz */
-        l_current_ptr+=4;
+    opj_write_bytes(l_current_ptr, cp->tx0, 4);             /* XT0siz */
+    l_current_ptr += 4;
 
-        opj_write_bytes(l_current_ptr, cp->ty0, 4);             /* YT0siz */
-        l_current_ptr+=4;
+    opj_write_bytes(l_current_ptr, cp->ty0, 4);             /* YT0siz */
+    l_current_ptr += 4;
 
-        opj_write_bytes(l_current_ptr, l_image->numcomps, 2);   /* Csiz */
-        l_current_ptr+=2;
+    opj_write_bytes(l_current_ptr, l_image->numcomps, 2);   /* Csiz */
+    l_current_ptr += 2;
 
-        for (i = 0; i < l_image->numcomps; ++i) {
-                /* TODO here with MCT ? */
-                opj_write_bytes(l_current_ptr, l_img_comp->prec - 1 + (l_img_comp->sgnd << 7), 1);      /* Ssiz_i */
-                ++l_current_ptr;
+    for (i = 0; i < l_image->numcomps; ++i) {
+        /* TODO here with MCT ? */
+        opj_write_bytes(l_current_ptr, l_img_comp->prec - 1 + (l_img_comp->sgnd << 7),
+                        1);      /* Ssiz_i */
+        ++l_current_ptr;
 
-                opj_write_bytes(l_current_ptr, l_img_comp->dx, 1);      /* XRsiz_i */
-                ++l_current_ptr;
+        opj_write_bytes(l_current_ptr, l_img_comp->dx, 1);      /* XRsiz_i */
+        ++l_current_ptr;
 
-                opj_write_bytes(l_current_ptr, l_img_comp->dy, 1);      /* YRsiz_i */
-                ++l_current_ptr;
+        opj_write_bytes(l_current_ptr, l_img_comp->dy, 1);      /* YRsiz_i */
+        ++l_current_ptr;
 
-                ++l_img_comp;
-        }
+        ++l_img_comp;
+    }
 
-        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_size_len,p_manager) != l_size_len) {
-                return OPJ_FALSE;
-        }
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_size_len,
+                              p_manager) != l_size_len) {
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /**
@@ -1955,113 +2046,144 @@
                                  OPJ_BYTE * p_header_data,
                                  OPJ_UINT32 p_header_size,
                                  opj_event_mgr_t * p_manager
-                                 )
+                                )
 {
-        OPJ_UINT32 i;
-        OPJ_UINT32 l_nb_comp;
-        OPJ_UINT32 l_nb_comp_remain;
-        OPJ_UINT32 l_remaining_size;
-        OPJ_UINT32 l_nb_tiles;
-        OPJ_UINT32 l_tmp, l_tx1, l_ty1;
-        opj_image_t *l_image = 00;
-        opj_cp_t *l_cp = 00;
-        opj_image_comp_t * l_img_comp = 00;
-        opj_tcp_t * l_current_tile_param = 00;
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_nb_comp;
+    OPJ_UINT32 l_nb_comp_remain;
+    OPJ_UINT32 l_remaining_size;
+    OPJ_UINT32 l_nb_tiles;
+    OPJ_UINT32 l_tmp, l_tx1, l_ty1;
+    OPJ_UINT32 l_prec0, l_sgnd0;
+    opj_image_t *l_image = 00;
+    opj_cp_t *l_cp = 00;
+    opj_image_comp_t * l_img_comp = 00;
+    opj_tcp_t * l_current_tile_param = 00;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_header_data != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_header_data != 00);
 
-        l_image = p_j2k->m_private_image;
-        l_cp = &(p_j2k->m_cp);
+    l_image = p_j2k->m_private_image;
+    l_cp = &(p_j2k->m_cp);
 
-        /* minimum size == 39 - 3 (= minimum component parameter) */
-        if (p_header_size < 36) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
-                return OPJ_FALSE;
+    /* minimum size == 39 - 3 (= minimum component parameter) */
+    if (p_header_size < 36) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
+        return OPJ_FALSE;
+    }
+
+    l_remaining_size = p_header_size - 36;
+    l_nb_comp = l_remaining_size / 3;
+    l_nb_comp_remain = l_remaining_size % 3;
+    if (l_nb_comp_remain != 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
+        return OPJ_FALSE;
+    }
+
+    opj_read_bytes(p_header_data, &l_tmp,
+                   2);                                                /* Rsiz (capabilities) */
+    p_header_data += 2;
+    l_cp->rsiz = (OPJ_UINT16) l_tmp;
+    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x1, 4);   /* Xsiz */
+    p_header_data += 4;
+    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y1, 4);   /* Ysiz */
+    p_header_data += 4;
+    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x0, 4);   /* X0siz */
+    p_header_data += 4;
+    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y0, 4);   /* Y0siz */
+    p_header_data += 4;
+    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdx,
+                   4);             /* XTsiz */
+    p_header_data += 4;
+    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdy,
+                   4);             /* YTsiz */
+    p_header_data += 4;
+    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tx0,
+                   4);             /* XT0siz */
+    p_header_data += 4;
+    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->ty0,
+                   4);             /* YT0siz */
+    p_header_data += 4;
+    opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_tmp,
+                   2);                 /* Csiz */
+    p_header_data += 2;
+    if (l_tmp < 16385) {
+        l_image->numcomps = (OPJ_UINT16) l_tmp;
+    } else {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Error with SIZ marker: number of component is illegal -> %d\n", l_tmp);
+        return OPJ_FALSE;
+    }
+
+    if (l_image->numcomps != l_nb_comp) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Error with SIZ marker: number of component is not compatible with the remaining number of parameters ( %d vs %d)\n",
+                      l_image->numcomps, l_nb_comp);
+        return OPJ_FALSE;
+    }
+
+    /* testcase 4035.pdf.SIGSEGV.d8b.3375 */
+    /* testcase issue427-null-image-size.jp2 */
+    if ((l_image->x0 >= l_image->x1) || (l_image->y0 >= l_image->y1)) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Error with SIZ marker: negative or zero image size (%" PRId64 " x %" PRId64
+                      ")\n", (OPJ_INT64)l_image->x1 - l_image->x0,
+                      (OPJ_INT64)l_image->y1 - l_image->y0);
+        return OPJ_FALSE;
+    }
+    /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */
+    if ((l_cp->tdx == 0U) || (l_cp->tdy == 0U)) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Error with SIZ marker: invalid tile size (tdx: %d, tdy: %d)\n", l_cp->tdx,
+                      l_cp->tdy);
+        return OPJ_FALSE;
+    }
+
+    /* testcase 1610.pdf.SIGSEGV.59c.681 */
+    if ((0xFFFFFFFFU / l_image->x1) < l_image->y1) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Prevent buffer overflow (x1: %d, y1: %d)\n", l_image->x1, l_image->y1);
+        return OPJ_FALSE;
+    }
+
+    /* testcase issue427-illegal-tile-offset.jp2 */
+    l_tx1 = opj_uint_adds(l_cp->tx0, l_cp->tdx); /* manage overflow */
+    l_ty1 = opj_uint_adds(l_cp->ty0, l_cp->tdy); /* manage overflow */
+    if ((l_cp->tx0 > l_image->x0) || (l_cp->ty0 > l_image->y0) ||
+            (l_tx1 <= l_image->x0) || (l_ty1 <= l_image->y0)) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Error with SIZ marker: illegal tile offset\n");
+        return OPJ_FALSE;
+    }
+    if (!p_j2k->dump_state) {
+        OPJ_UINT32 siz_w, siz_h;
+
+        siz_w = l_image->x1 - l_image->x0;
+        siz_h = l_image->y1 - l_image->y0;
+
+        if (p_j2k->ihdr_w > 0 && p_j2k->ihdr_h > 0
+                && (p_j2k->ihdr_w != siz_w || p_j2k->ihdr_h != siz_h)) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Error with SIZ marker: IHDR w(%u) h(%u) vs. SIZ w(%u) h(%u)\n", p_j2k->ihdr_w,
+                          p_j2k->ihdr_h, siz_w, siz_h);
+            return OPJ_FALSE;
         }
-
-        l_remaining_size = p_header_size - 36;
-        l_nb_comp = l_remaining_size / 3;
-        l_nb_comp_remain = l_remaining_size % 3;
-        if (l_nb_comp_remain != 0){
-                opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker size\n");
-                return OPJ_FALSE;
-        }
-
-        opj_read_bytes(p_header_data,&l_tmp ,2);                                                /* Rsiz (capabilities) */
-        p_header_data+=2;
-        l_cp->rsiz = (OPJ_UINT16) l_tmp;
-        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x1, 4);   /* Xsiz */
-        p_header_data+=4;
-        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y1, 4);   /* Ysiz */
-        p_header_data+=4;
-        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->x0, 4);   /* X0siz */
-        p_header_data+=4;
-        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_image->y0, 4);   /* Y0siz */
-        p_header_data+=4;
-        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdx, 4);             /* XTsiz */
-        p_header_data+=4;
-        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tdy, 4);             /* YTsiz */
-        p_header_data+=4;
-        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->tx0, 4);             /* XT0siz */
-        p_header_data+=4;
-        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_cp->ty0, 4);             /* YT0siz */
-        p_header_data+=4;
-        opj_read_bytes(p_header_data, (OPJ_UINT32*) &l_tmp, 2);                 /* Csiz */
-        p_header_data+=2;
-        if (l_tmp < 16385)
-                l_image->numcomps = (OPJ_UINT16) l_tmp;
-        else {
-                opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: number of component is illegal -> %d\n", l_tmp);
-                return OPJ_FALSE;
-        }
-
-        if (l_image->numcomps != l_nb_comp) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: number of component is not compatible with the remaining number of parameters ( %d vs %d)\n", l_image->numcomps, l_nb_comp);
-                return OPJ_FALSE;
-        }
-
-        /* testcase 4035.pdf.SIGSEGV.d8b.3375 */
-        /* testcase issue427-null-image-size.jp2 */
-        if ((l_image->x0 >= l_image->x1) || (l_image->y0 >= l_image->y1)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: negative or zero image size (%d x %d)\n", l_image->x1 - l_image->x0, l_image->y1 - l_image->y0);
-                return OPJ_FALSE;
-        }
-        /* testcase 2539.pdf.SIGFPE.706.1712 (also 3622.pdf.SIGFPE.706.2916 and 4008.pdf.SIGFPE.706.3345 and maybe more) */
-        if (!(l_cp->tdx * l_cp->tdy)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: invalid tile size (tdx: %d, tdy: %d)\n", l_cp->tdx, l_cp->tdy);
-                return OPJ_FALSE;
-        }
-
-        /* testcase 1610.pdf.SIGSEGV.59c.681 */
-        if (((OPJ_UINT64)l_image->x1) * ((OPJ_UINT64)l_image->y1) != (l_image->x1 * l_image->y1)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Prevent buffer overflow (x1: %d, y1: %d)\n", l_image->x1, l_image->y1);
-                return OPJ_FALSE;
-        }
-
-        /* testcase issue427-illegal-tile-offset.jp2 */
-        l_tx1 = opj_uint_adds(l_cp->tx0, l_cp->tdx); /* manage overflow */
-        l_ty1 = opj_uint_adds(l_cp->ty0, l_cp->tdy); /* manage overflow */
-        if ((l_cp->tx0 > l_image->x0) || (l_cp->ty0 > l_image->y0) || (l_tx1 <= l_image->x0) || (l_ty1 <= l_image->y0) ) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: illegal tile offset\n");
-                return OPJ_FALSE;
-        }
-
+    }
 #ifdef USE_JPWL
-        if (l_cp->correct) {
-                /* if JPWL is on, we check whether TX errors have damaged
-                  too much the SIZ parameters */
-                if (!(l_image->x1 * l_image->y1)) {
-                        opj_event_msg(p_manager, EVT_ERROR,
-                                "JPWL: bad image size (%d x %d)\n",
-                                l_image->x1, l_image->y1);
-                        if (!JPWL_ASSUME || JPWL_ASSUME) {
-                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
-                                return OPJ_FALSE;
-                        }
-                }
+    if (l_cp->correct) {
+        /* if JPWL is on, we check whether TX errors have damaged
+          too much the SIZ parameters */
+        if (!(l_image->x1 * l_image->y1)) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "JPWL: bad image size (%d x %d)\n",
+                          l_image->x1, l_image->y1);
+            if (!JPWL_ASSUME) {
+                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                return OPJ_FALSE;
+            }
+        }
 
         /* FIXME check previously in the function so why keep this piece of code ? Need by the norm ?
                 if (l_image->numcomps != ((len - 38) / 3)) {
@@ -2086,267 +2208,320 @@
                 }
         */
 
-                /* update components number in the jpwl_exp_comps filed */
-                l_cp->exp_comps = l_image->numcomps;
-        }
+        /* update components number in the jpwl_exp_comps filed */
+        l_cp->exp_comps = l_image->numcomps;
+    }
 #endif /* USE_JPWL */
 
-        /* Allocate the resulting image components */
-        l_image->comps = (opj_image_comp_t*) opj_calloc(l_image->numcomps, sizeof(opj_image_comp_t));
-        if (l_image->comps == 00){
-                l_image->numcomps = 0;
-                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
-                return OPJ_FALSE;
+    /* Allocate the resulting image components */
+    l_image->comps = (opj_image_comp_t*) opj_calloc(l_image->numcomps,
+                     sizeof(opj_image_comp_t));
+    if (l_image->comps == 00) {
+        l_image->numcomps = 0;
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Not enough memory to take in charge SIZ marker\n");
+        return OPJ_FALSE;
+    }
+
+    l_img_comp = l_image->comps;
+
+    l_prec0 = 0;
+    l_sgnd0 = 0;
+    /* Read the component information */
+    for (i = 0; i < l_image->numcomps; ++i) {
+        OPJ_UINT32 tmp;
+        opj_read_bytes(p_header_data, &tmp, 1); /* Ssiz_i */
+        ++p_header_data;
+        l_img_comp->prec = (tmp & 0x7f) + 1;
+        l_img_comp->sgnd = tmp >> 7;
+
+        if (p_j2k->dump_state == 0) {
+            if (i == 0) {
+                l_prec0 = l_img_comp->prec;
+                l_sgnd0 = l_img_comp->sgnd;
+            } else if (!l_cp->allow_different_bit_depth_sign
+                       && (l_img_comp->prec != l_prec0 || l_img_comp->sgnd != l_sgnd0)) {
+                opj_event_msg(p_manager, EVT_WARNING,
+                              "Despite JP2 BPC!=255, precision and/or sgnd values for comp[%d] is different than comp[0]:\n"
+                              "        [0] prec(%d) sgnd(%d) [%d] prec(%d) sgnd(%d)\n", i, l_prec0, l_sgnd0,
+                              i, l_img_comp->prec, l_img_comp->sgnd);
+            }
+            /* TODO: we should perhaps also check against JP2 BPCC values */
         }
-
-        l_img_comp = l_image->comps;
-
-        /* Read the component information */
-        for (i = 0; i < l_image->numcomps; ++i){
-                OPJ_UINT32 tmp;
-                opj_read_bytes(p_header_data,&tmp,1);   /* Ssiz_i */
-                ++p_header_data;
-                l_img_comp->prec = (tmp & 0x7f) + 1;
-                l_img_comp->sgnd = tmp >> 7;
-                opj_read_bytes(p_header_data,&tmp,1);   /* XRsiz_i */
-                ++p_header_data;
-                l_img_comp->dx = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
-                opj_read_bytes(p_header_data,&tmp,1);   /* YRsiz_i */
-                ++p_header_data;
-                l_img_comp->dy = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
-                if( l_img_comp->dx < 1 || l_img_comp->dx > 255 ||
-                    l_img_comp->dy < 1 || l_img_comp->dy > 255 ) {
-                    opj_event_msg(p_manager, EVT_ERROR,
-                                  "Invalid values for comp = %d : dx=%u dy=%u (should be between 1 and 255 according to the JPEG2000 norm)\n",
-                                  i, l_img_comp->dx, l_img_comp->dy);
-                    return OPJ_FALSE;
-                }
-                if( l_img_comp->prec > 31) { /* TODO openjpeg won't handle more than ? */
-                    opj_event_msg(p_manager, EVT_ERROR,
-                                  "Invalid values for comp = %d : prec=%u (should be between 1 and 31 according to the JPEG2000 norm)\n",
-                                  i, l_img_comp->prec);
-                    return OPJ_FALSE;
-                }
-
-#ifdef USE_JPWL
-                if (l_cp->correct) {
-                /* if JPWL is on, we check whether TX errors have damaged
-                        too much the SIZ parameters, again */
-                        if (!(l_image->comps[i].dx * l_image->comps[i].dy)) {
-                                opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
-                                        "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n",
-                                        i, i, l_image->comps[i].dx, l_image->comps[i].dy);
-                                if (!JPWL_ASSUME) {
-                                        opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
-                                        return OPJ_FALSE;
-                                }
-                                /* we try to correct */
-                                opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
-                                if (!l_image->comps[i].dx) {
-                                        l_image->comps[i].dx = 1;
-                                        opj_event_msg(p_manager, EVT_WARNING, "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n",
-                                                i, l_image->comps[i].dx);
-                                }
-                                if (!l_image->comps[i].dy) {
-                                        l_image->comps[i].dy = 1;
-                                        opj_event_msg(p_manager, EVT_WARNING, "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n",
-                                                i, l_image->comps[i].dy);
-                                }
-                        }
-                }
-#endif /* USE_JPWL */
-                l_img_comp->resno_decoded = 0;                                                          /* number of resolution decoded */
-                l_img_comp->factor = l_cp->m_specific_param.m_dec.m_reduce; /* reducing factor per component */
-                ++l_img_comp;
-        }
-
-        /* Compute the number of tiles */
-        l_cp->tw = opj_uint_ceildiv(l_image->x1 - l_cp->tx0, l_cp->tdx);
-        l_cp->th = opj_uint_ceildiv(l_image->y1 - l_cp->ty0, l_cp->tdy);
-
-        /* Check that the number of tiles is valid */
-        if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) {
-            opj_event_msg(  p_manager, EVT_ERROR, 
-                            "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
-                            l_cp->tw, l_cp->th);
+        opj_read_bytes(p_header_data, &tmp, 1); /* XRsiz_i */
+        ++p_header_data;
+        l_img_comp->dx = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
+        opj_read_bytes(p_header_data, &tmp, 1); /* YRsiz_i */
+        ++p_header_data;
+        l_img_comp->dy = (OPJ_UINT32)tmp; /* should be between 1 and 255 */
+        if (l_img_comp->dx < 1 || l_img_comp->dx > 255 ||
+                l_img_comp->dy < 1 || l_img_comp->dy > 255) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Invalid values for comp = %d : dx=%u dy=%u (should be between 1 and 255 according to the JPEG2000 norm)\n",
+                          i, l_img_comp->dx, l_img_comp->dy);
             return OPJ_FALSE;
         }
-        l_nb_tiles = l_cp->tw * l_cp->th;
-
-        /* Define the tiles which will be decoded */
-        if (p_j2k->m_specific_param.m_decoder.m_discard_tiles) {
-                p_j2k->m_specific_param.m_decoder.m_start_tile_x = (p_j2k->m_specific_param.m_decoder.m_start_tile_x - l_cp->tx0) / l_cp->tdx;
-                p_j2k->m_specific_param.m_decoder.m_start_tile_y = (p_j2k->m_specific_param.m_decoder.m_start_tile_y - l_cp->ty0) / l_cp->tdy;
-                p_j2k->m_specific_param.m_decoder.m_end_tile_x = opj_uint_ceildiv(p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0, l_cp->tdx);
-                p_j2k->m_specific_param.m_decoder.m_end_tile_y = opj_uint_ceildiv(p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0, l_cp->tdy);
+        /* Avoids later undefined shift in computation of */
+        /* p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1
+                    << (l_image->comps[i].prec - 1); */
+        if (l_img_comp->prec > 31) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Invalid values for comp = %d : prec=%u (should be between 1 and 38 according to the JPEG2000 norm. OpenJpeg only supports up to 31)\n",
+                          i, l_img_comp->prec);
+            return OPJ_FALSE;
         }
-        else {
-                p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
-                p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
-                p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
-                p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
-        }
-
 #ifdef USE_JPWL
         if (l_cp->correct) {
-                /* if JPWL is on, we check whether TX errors have damaged
-                  too much the SIZ parameters */
-                if ((l_cp->tw < 1) || (l_cp->th < 1) || (l_cp->tw > l_cp->max_tiles) || (l_cp->th > l_cp->max_tiles)) {
-                        opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
-                                "JPWL: bad number of tiles (%d x %d)\n",
-                                l_cp->tw, l_cp->th);
-                        if (!JPWL_ASSUME) {
-                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
-                                return OPJ_FALSE;
-                        }
-                        /* we try to correct */
-                        opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
-                        if (l_cp->tw < 1) {
-                                l_cp->tw= 1;
-                                opj_event_msg(p_manager, EVT_WARNING, "- setting %d tiles in x => HYPOTHESIS!!!\n",
-                                                l_cp->tw);
-                        }
-                        if (l_cp->tw > l_cp->max_tiles) {
-                                l_cp->tw= 1;
-                                opj_event_msg(p_manager, EVT_WARNING, "- too large x, increase expectance of %d\n"
-                                        "- setting %d tiles in x => HYPOTHESIS!!!\n",
-                                        l_cp->max_tiles, l_cp->tw);
-                        }
-                        if (l_cp->th < 1) {
-                                l_cp->th= 1;
-                                opj_event_msg(p_manager, EVT_WARNING, "- setting %d tiles in y => HYPOTHESIS!!!\n",
-                                                l_cp->th);
-                        }
-                        if (l_cp->th > l_cp->max_tiles) {
-                                l_cp->th= 1;
-                                opj_event_msg(p_manager, EVT_WARNING, "- too large y, increase expectance of %d to continue\n",
-                                        "- setting %d tiles in y => HYPOTHESIS!!!\n",
-                                        l_cp->max_tiles, l_cp->th);
-                        }
+            /* if JPWL is on, we check whether TX errors have damaged
+                    too much the SIZ parameters, again */
+            if (!(l_image->comps[i].dx * l_image->comps[i].dy)) {
+                opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+                              "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n",
+                              i, i, l_image->comps[i].dx, l_image->comps[i].dy);
+                if (!JPWL_ASSUME) {
+                    opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                    return OPJ_FALSE;
                 }
+                /* we try to correct */
+                opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
+                if (!l_image->comps[i].dx) {
+                    l_image->comps[i].dx = 1;
+                    opj_event_msg(p_manager, EVT_WARNING,
+                                  "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n",
+                                  i, l_image->comps[i].dx);
+                }
+                if (!l_image->comps[i].dy) {
+                    l_image->comps[i].dy = 1;
+                    opj_event_msg(p_manager, EVT_WARNING,
+                                  "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n",
+                                  i, l_image->comps[i].dy);
+                }
+            }
         }
 #endif /* USE_JPWL */
+        l_img_comp->resno_decoded =
+            0;                                                          /* number of resolution decoded */
+        l_img_comp->factor =
+            l_cp->m_specific_param.m_dec.m_reduce; /* reducing factor per component */
+        ++l_img_comp;
+    }
 
-        /* memory allocations */
-        l_cp->tcps = (opj_tcp_t*) opj_calloc(l_nb_tiles, sizeof(opj_tcp_t));
-        if (l_cp->tcps == 00) {
-                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
-                return OPJ_FALSE;
-        }
+    if (l_cp->tdx == 0 || l_cp->tdy == 0) {
+        return OPJ_FALSE;
+    }
+
+    /* Compute the number of tiles */
+    l_cp->tw = opj_uint_ceildiv(l_image->x1 - l_cp->tx0, l_cp->tdx);
+    l_cp->th = opj_uint_ceildiv(l_image->y1 - l_cp->ty0, l_cp->tdy);
+
+    /* Check that the number of tiles is valid */
+    if (l_cp->tw == 0 || l_cp->th == 0 || l_cp->tw > 65535 / l_cp->th) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Invalid number of tiles : %u x %u (maximum fixed by jpeg2000 norm is 65535 tiles)\n",
+                      l_cp->tw, l_cp->th);
+        return OPJ_FALSE;
+    }
+    l_nb_tiles = l_cp->tw * l_cp->th;
+
+    /* Define the tiles which will be decoded */
+    if (p_j2k->m_specific_param.m_decoder.m_discard_tiles) {
+        p_j2k->m_specific_param.m_decoder.m_start_tile_x =
+            (p_j2k->m_specific_param.m_decoder.m_start_tile_x - l_cp->tx0) / l_cp->tdx;
+        p_j2k->m_specific_param.m_decoder.m_start_tile_y =
+            (p_j2k->m_specific_param.m_decoder.m_start_tile_y - l_cp->ty0) / l_cp->tdy;
+        p_j2k->m_specific_param.m_decoder.m_end_tile_x = opj_uint_ceildiv(
+            p_j2k->m_specific_param.m_decoder.m_end_tile_x - l_cp->tx0, l_cp->tdx);
+        p_j2k->m_specific_param.m_decoder.m_end_tile_y = opj_uint_ceildiv(
+            p_j2k->m_specific_param.m_decoder.m_end_tile_y - l_cp->ty0, l_cp->tdy);
+    } else {
+        p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
+        p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
+        p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
+        p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
+    }
 
 #ifdef USE_JPWL
-        if (l_cp->correct) {
-                if (!l_cp->tcps) {
-                        opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
-                                "JPWL: could not alloc tcps field of cp\n");
-                        if (!JPWL_ASSUME || JPWL_ASSUME) {
-                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
-                                return OPJ_FALSE;
-                        }
-                }
+    if (l_cp->correct) {
+        /* if JPWL is on, we check whether TX errors have damaged
+          too much the SIZ parameters */
+        if ((l_cp->tw < 1) || (l_cp->th < 1) || (l_cp->tw > l_cp->max_tiles) ||
+                (l_cp->th > l_cp->max_tiles)) {
+            opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+                          "JPWL: bad number of tiles (%d x %d)\n",
+                          l_cp->tw, l_cp->th);
+            if (!JPWL_ASSUME) {
+                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                return OPJ_FALSE;
+            }
+            /* we try to correct */
+            opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n");
+            if (l_cp->tw < 1) {
+                l_cp->tw = 1;
+                opj_event_msg(p_manager, EVT_WARNING,
+                              "- setting %d tiles in x => HYPOTHESIS!!!\n",
+                              l_cp->tw);
+            }
+            if (l_cp->tw > l_cp->max_tiles) {
+                l_cp->tw = 1;
+                opj_event_msg(p_manager, EVT_WARNING,
+                              "- too large x, increase expectance of %d\n"
+                              "- setting %d tiles in x => HYPOTHESIS!!!\n",
+                              l_cp->max_tiles, l_cp->tw);
+            }
+            if (l_cp->th < 1) {
+                l_cp->th = 1;
+                opj_event_msg(p_manager, EVT_WARNING,
+                              "- setting %d tiles in y => HYPOTHESIS!!!\n",
+                              l_cp->th);
+            }
+            if (l_cp->th > l_cp->max_tiles) {
+                l_cp->th = 1;
+                opj_event_msg(p_manager, EVT_WARNING,
+                              "- too large y, increase expectance of %d to continue\n",
+                              "- setting %d tiles in y => HYPOTHESIS!!!\n",
+                              l_cp->max_tiles, l_cp->th);
+            }
         }
+    }
 #endif /* USE_JPWL */
 
-        p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps =
-                        (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));
-        if(p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps  == 00) {
-                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
+    /* memory allocations */
+    l_cp->tcps = (opj_tcp_t*) opj_calloc(l_nb_tiles, sizeof(opj_tcp_t));
+    if (l_cp->tcps == 00) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Not enough memory to take in charge SIZ marker\n");
+        return OPJ_FALSE;
+    }
+
+#ifdef USE_JPWL
+    if (l_cp->correct) {
+        if (!l_cp->tcps) {
+            opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+                          "JPWL: could not alloc tcps field of cp\n");
+            if (!JPWL_ASSUME) {
+                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
                 return OPJ_FALSE;
+            }
+        }
+    }
+#endif /* USE_JPWL */
+
+    p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps =
+        (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));
+    if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps  == 00) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Not enough memory to take in charge SIZ marker\n");
+        return OPJ_FALSE;
+    }
+
+    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records =
+        (opj_mct_data_t*)opj_calloc(OPJ_J2K_MCT_DEFAULT_NB_RECORDS,
+                                    sizeof(opj_mct_data_t));
+
+    if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Not enough memory to take in charge SIZ marker\n");
+        return OPJ_FALSE;
+    }
+    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mct_records =
+        OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+
+    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records =
+        (opj_simple_mcc_decorrelation_data_t*)
+        opj_calloc(OPJ_J2K_MCC_DEFAULT_NB_RECORDS,
+                   sizeof(opj_simple_mcc_decorrelation_data_t));
+
+    if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Not enough memory to take in charge SIZ marker\n");
+        return OPJ_FALSE;
+    }
+    p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mcc_records =
+        OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
+
+    /* set up default dc level shift */
+    for (i = 0; i < l_image->numcomps; ++i) {
+        if (! l_image->comps[i].sgnd) {
+            p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1
+                    << (l_image->comps[i].prec - 1);
+        }
+    }
+
+    l_current_tile_param = l_cp->tcps;
+    for (i = 0; i < l_nb_tiles; ++i) {
+        l_current_tile_param->tccps = (opj_tccp_t*) opj_calloc(l_image->numcomps,
+                                      sizeof(opj_tccp_t));
+        if (l_current_tile_param->tccps == 00) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Not enough memory to take in charge SIZ marker\n");
+            return OPJ_FALSE;
         }
 
-        p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records =
-                        (opj_mct_data_t*)opj_calloc(OPJ_J2K_MCT_DEFAULT_NB_RECORDS ,sizeof(opj_mct_data_t));
+        ++l_current_tile_param;
+    }
 
-        if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mct_records) {
-                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
-                return OPJ_FALSE;
-        }
-        p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mct_records = OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MH;
+    opj_image_comp_header_update(l_image, l_cp);
 
-        p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records =
-                        (opj_simple_mcc_decorrelation_data_t*)
-                        opj_calloc(OPJ_J2K_MCC_DEFAULT_NB_RECORDS, sizeof(opj_simple_mcc_decorrelation_data_t));
-
-        if (! p_j2k->m_specific_param.m_decoder.m_default_tcp->m_mcc_records) {
-                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
-                return OPJ_FALSE;
-        }
-        p_j2k->m_specific_param.m_decoder.m_default_tcp->m_nb_max_mcc_records = OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
-
-        /* set up default dc level shift */
-        for (i=0;i<l_image->numcomps;++i) {
-                if (! l_image->comps[i].sgnd) {
-                        p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[i].m_dc_level_shift = 1 << (l_image->comps[i].prec - 1);
-                }
-        }
-
-        l_current_tile_param = l_cp->tcps;
-        for     (i = 0; i < l_nb_tiles; ++i) {
-                l_current_tile_param->tccps = (opj_tccp_t*) opj_calloc(l_image->numcomps, sizeof(opj_tccp_t));
-                if (l_current_tile_param->tccps == 00) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to take in charge SIZ marker\n");
-                        return OPJ_FALSE;
-                }
-
-                ++l_current_tile_param;
-        }
-
-        p_j2k->m_specific_param.m_decoder.m_state =  J2K_STATE_MH; /* FIXME J2K_DEC_STATE_MH; */
-        opj_image_comp_header_update(l_image,l_cp);
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_com(     opj_j2k_t *p_j2k,
-                                                        opj_stream_private_t *p_stream,
-                                                        opj_event_mgr_t * p_manager
-                            )
+static OPJ_BOOL opj_j2k_write_com(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-        OPJ_UINT32 l_comment_size;
-        OPJ_UINT32 l_total_com_size;
-        const OPJ_CHAR *l_comment;
-        OPJ_BYTE * l_current_ptr = 00;
+    OPJ_UINT32 l_comment_size;
+    OPJ_UINT32 l_total_com_size;
+    const OPJ_CHAR *l_comment;
+    OPJ_BYTE * l_current_ptr = 00;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_stream != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_stream != 00);
+    assert(p_manager != 00);
 
-        l_comment = p_j2k->m_cp.comment;
-        l_comment_size = (OPJ_UINT32)strlen(l_comment);
-        l_total_com_size = l_comment_size + 6;
+    l_comment = p_j2k->m_cp.comment;
+    l_comment_size = (OPJ_UINT32)strlen(l_comment);
+    l_total_com_size = l_comment_size + 6;
 
-        if (l_total_com_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
-                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size);
-                if (! new_header_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write the COM marker\n");
-                        return OPJ_FALSE;
-                }
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_total_com_size;
+    if (l_total_com_size >
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
+                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size);
+        if (! new_header_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Not enough memory to write the COM marker\n");
+            return OPJ_FALSE;
         }
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_total_com_size;
+    }
 
-        l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+    l_current_ptr = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
 
-        opj_write_bytes(l_current_ptr,J2K_MS_COM , 2);  /* COM */
-        l_current_ptr+=2;
+    opj_write_bytes(l_current_ptr, J2K_MS_COM, 2);  /* COM */
+    l_current_ptr += 2;
 
-        opj_write_bytes(l_current_ptr,l_total_com_size - 2 , 2);        /* L_COM */
-        l_current_ptr+=2;
+    opj_write_bytes(l_current_ptr, l_total_com_size - 2, 2);        /* L_COM */
+    l_current_ptr += 2;
 
-        opj_write_bytes(l_current_ptr,1 , 2);   /* General use (IS 8859-15:1999 (Latin) values) */
-        l_current_ptr+=2;
+    opj_write_bytes(l_current_ptr, 1,
+                    2);   /* General use (IS 8859-15:1999 (Latin) values) */
+    l_current_ptr += 2;
 
-        memcpy( l_current_ptr,l_comment,l_comment_size);
+    memcpy(l_current_ptr, l_comment, l_comment_size);
 
-        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_total_com_size,p_manager) != l_total_com_size) {
-                return OPJ_FALSE;
-        }
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_total_com_size,
+                              p_manager) != l_total_com_size) {
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /**
@@ -2356,90 +2531,99 @@
  * @param       p_header_size   the size of the data contained in the COM marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_com (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_com(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_header_data != 00);
-  (void)p_header_size;
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_header_data != 00);
 
-        return OPJ_TRUE;
+    OPJ_UNUSED(p_j2k);
+    OPJ_UNUSED(p_header_data);
+    OPJ_UNUSED(p_header_size);
+    OPJ_UNUSED(p_manager);
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_cod(     opj_j2k_t *p_j2k,
-                                                        opj_stream_private_t *p_stream,
-                                                        opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_write_cod(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager)
 {
-        opj_cp_t *l_cp = 00;
-        opj_tcp_t *l_tcp = 00;
-        OPJ_UINT32 l_code_size,l_remaining_size;
-        OPJ_BYTE * l_current_data = 00;
+    opj_cp_t *l_cp = 00;
+    opj_tcp_t *l_tcp = 00;
+    OPJ_UINT32 l_code_size, l_remaining_size;
+    OPJ_BYTE * l_current_data = 00;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
-        l_code_size = 9 + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,0);
-        l_remaining_size = l_code_size;
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
+    l_code_size = 9 + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
+                  p_j2k->m_current_tile_number, 0);
+    l_remaining_size = l_code_size;
 
-        if (l_code_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
-                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size);
-                if (! new_header_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COD marker\n");
-                        return OPJ_FALSE;
-                }
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_code_size;
+    if (l_code_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
+                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size);
+        if (! new_header_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COD marker\n");
+            return OPJ_FALSE;
         }
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_code_size;
+    }
 
-        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
 
-        opj_write_bytes(l_current_data,J2K_MS_COD,2);           /* COD */
-        l_current_data += 2;
+    opj_write_bytes(l_current_data, J2K_MS_COD, 2);           /* COD */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,l_code_size-2,2);        /* L_COD */
-        l_current_data += 2;
+    opj_write_bytes(l_current_data, l_code_size - 2, 2);      /* L_COD */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,l_tcp->csty,1);          /* Scod */
-        ++l_current_data;
+    opj_write_bytes(l_current_data, l_tcp->csty, 1);          /* Scod */
+    ++l_current_data;
 
-        opj_write_bytes(l_current_data,l_tcp->prg,1);           /* SGcod (A) */
-        ++l_current_data;
+    opj_write_bytes(l_current_data, (OPJ_UINT32)l_tcp->prg, 1); /* SGcod (A) */
+    ++l_current_data;
 
-        opj_write_bytes(l_current_data,l_tcp->numlayers,2);     /* SGcod (B) */
-        l_current_data+=2;
+    opj_write_bytes(l_current_data, l_tcp->numlayers, 2);     /* SGcod (B) */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,l_tcp->mct,1);           /* SGcod (C) */
-        ++l_current_data;
+    opj_write_bytes(l_current_data, l_tcp->mct, 1);           /* SGcod (C) */
+    ++l_current_data;
 
-        l_remaining_size -= 9;
+    l_remaining_size -= 9;
 
-        if (! opj_j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
-                return OPJ_FALSE;
-        }
+    if (! opj_j2k_write_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number, 0,
+                                    l_current_data, &l_remaining_size, p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
+        return OPJ_FALSE;
+    }
 
-        if (l_remaining_size != 0) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
-                return OPJ_FALSE;
-        }
+    if (l_remaining_size != 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error writing COD marker\n");
+        return OPJ_FALSE;
+    }
 
-        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_code_size,p_manager) != l_code_size) {
-                return OPJ_FALSE;
-        }
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_code_size,
+                              p_manager) != l_code_size) {
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /**
@@ -2449,226 +2633,263 @@
  * @param       p_header_size   the size of the data contained in the COD marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_cod (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_cod(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        /* loop */
-        OPJ_UINT32 i;
-        OPJ_UINT32 l_tmp;
-        opj_cp_t *l_cp = 00;
-        opj_tcp_t *l_tcp = 00;
-        opj_image_t *l_image = 00;
+    /* loop */
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_tmp;
+    opj_cp_t *l_cp = 00;
+    opj_tcp_t *l_tcp = 00;
+    opj_image_t *l_image = 00;
 
-        /* preconditions */
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_image = p_j2k->m_private_image;
-        l_cp = &(p_j2k->m_cp);
+    l_image = p_j2k->m_private_image;
+    l_cp = &(p_j2k->m_cp);
 
-        /* If we are in the first tile-part header of the current tile */
-        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
-                                &l_cp->tcps[p_j2k->m_current_tile_number] :
-                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
-	
-        /* Only one COD per tile */
-        if (l_tcp->cod) {
-                opj_event_msg(p_manager, EVT_ERROR, "COD marker already read. No more than one COD marker per tile.\n");
-                return OPJ_FALSE;
-        }
-        l_tcp->cod = 1;
-	
-        /* Make sure room is sufficient */
-        if (p_header_size < 5) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
-                return OPJ_FALSE;
-        }
+    /* If we are in the first tile-part header of the current tile */
+    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
+            &l_cp->tcps[p_j2k->m_current_tile_number] :
+            p_j2k->m_specific_param.m_decoder.m_default_tcp;
 
-        opj_read_bytes(p_header_data,&l_tcp->csty,1);           /* Scod */
-        ++p_header_data;
-        /* Make sure we know how to decode this */
-        if ((l_tcp->csty & ~(OPJ_UINT32)(J2K_CP_CSTY_PRT | J2K_CP_CSTY_SOP | J2K_CP_CSTY_EPH)) != 0U) {
-                opj_event_msg(p_manager, EVT_ERROR, "Unknown Scod value in COD marker\n");
-                return OPJ_FALSE;
-        }
-        opj_read_bytes(p_header_data,&l_tmp,1);                         /* SGcod (A) */
-        ++p_header_data;
-        l_tcp->prg = (OPJ_PROG_ORDER) l_tmp;
-        /* Make sure progression order is valid */
-        if (l_tcp->prg > OPJ_CPRL ) {
-                opj_event_msg(p_manager, EVT_ERROR, "Unknown progression order in COD marker\n");
-                l_tcp->prg = OPJ_PROG_UNKNOWN;
-        }
-        opj_read_bytes(p_header_data,&l_tcp->numlayers,2);      /* SGcod (B) */
-        p_header_data+=2;
-	
-        if ((l_tcp->numlayers < 1U) || (l_tcp->numlayers > 65535U)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Invalid number of layers in COD marker : %d not in range [1-65535]\n", l_tcp->numlayers);
-                return OPJ_FALSE;
-        }
+    /* Only one COD per tile */
+    if (l_tcp->cod) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "COD marker already read. No more than one COD marker per tile.\n");
+        return OPJ_FALSE;
+    }
+    l_tcp->cod = 1;
 
-        /* If user didn't set a number layer to decode take the max specify in the codestream. */
-        if      (l_cp->m_specific_param.m_dec.m_layer) {
-                l_tcp->num_layers_to_decode = l_cp->m_specific_param.m_dec.m_layer;
-        }
-        else {
-                l_tcp->num_layers_to_decode = l_tcp->numlayers;
-        }
+    /* Make sure room is sufficient */
+    if (p_header_size < 5) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
+        return OPJ_FALSE;
+    }
 
-        opj_read_bytes(p_header_data,&l_tcp->mct,1);            /* SGcod (C) */
-        ++p_header_data;
+    opj_read_bytes(p_header_data, &l_tcp->csty, 1);         /* Scod */
+    ++p_header_data;
+    /* Make sure we know how to decode this */
+    if ((l_tcp->csty & ~(OPJ_UINT32)(J2K_CP_CSTY_PRT | J2K_CP_CSTY_SOP |
+                                     J2K_CP_CSTY_EPH)) != 0U) {
+        opj_event_msg(p_manager, EVT_ERROR, "Unknown Scod value in COD marker\n");
+        return OPJ_FALSE;
+    }
+    opj_read_bytes(p_header_data, &l_tmp, 1);                       /* SGcod (A) */
+    ++p_header_data;
+    l_tcp->prg = (OPJ_PROG_ORDER) l_tmp;
+    /* Make sure progression order is valid */
+    if (l_tcp->prg > OPJ_CPRL) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Unknown progression order in COD marker\n");
+        l_tcp->prg = OPJ_PROG_UNKNOWN;
+    }
+    opj_read_bytes(p_header_data, &l_tcp->numlayers, 2);    /* SGcod (B) */
+    p_header_data += 2;
 
-        p_header_size -= 5;
-        for     (i = 0; i < l_image->numcomps; ++i) {
-                l_tcp->tccps[i].csty = l_tcp->csty & J2K_CCP_CSTY_PRT;
-        }
+    if ((l_tcp->numlayers < 1U) || (l_tcp->numlayers > 65535U)) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Invalid number of layers in COD marker : %d not in range [1-65535]\n",
+                      l_tcp->numlayers);
+        return OPJ_FALSE;
+    }
 
-        if (! opj_j2k_read_SPCod_SPCoc(p_j2k,0,p_header_data,&p_header_size,p_manager)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
-                return OPJ_FALSE;
-        }
+    /* If user didn't set a number layer to decode take the max specify in the codestream. */
+    if (l_cp->m_specific_param.m_dec.m_layer) {
+        l_tcp->num_layers_to_decode = l_cp->m_specific_param.m_dec.m_layer;
+    } else {
+        l_tcp->num_layers_to_decode = l_tcp->numlayers;
+    }
 
-        if (p_header_size != 0) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
-                return OPJ_FALSE;
-        }
+    opj_read_bytes(p_header_data, &l_tcp->mct, 1);          /* SGcod (C) */
+    ++p_header_data;
 
-        /* Apply the coding style to other components of the current tile or the m_default_tcp*/
-        opj_j2k_copy_tile_component_parameters(p_j2k);
+    p_header_size -= 5;
+    for (i = 0; i < l_image->numcomps; ++i) {
+        l_tcp->tccps[i].csty = l_tcp->csty & J2K_CCP_CSTY_PRT;
+    }
 
-        /* Index */
+    if (! opj_j2k_read_SPCod_SPCoc(p_j2k, 0, p_header_data, &p_header_size,
+                                   p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
+        return OPJ_FALSE;
+    }
+
+    if (p_header_size != 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading COD marker\n");
+        return OPJ_FALSE;
+    }
+
+    /* Apply the coding style to other components of the current tile or the m_default_tcp*/
+    opj_j2k_copy_tile_component_parameters(p_j2k);
+
+    /* Index */
 #ifdef WIP_REMOVE_MSD
-        if (p_j2k->cstr_info) {
-                /*opj_codestream_info_t *l_cstr_info = p_j2k->cstr_info;*/
-                p_j2k->cstr_info->prog = l_tcp->prg;
-                p_j2k->cstr_info->numlayers = l_tcp->numlayers;
-                p_j2k->cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(l_image->numcomps * sizeof(OPJ_UINT32));
-                for     (i = 0; i < l_image->numcomps; ++i) {
-                        p_j2k->cstr_info->numdecompos[i] = l_tcp->tccps[i].numresolutions - 1;
-                }
+    if (p_j2k->cstr_info) {
+        /*opj_codestream_info_t *l_cstr_info = p_j2k->cstr_info;*/
+        p_j2k->cstr_info->prog = l_tcp->prg;
+        p_j2k->cstr_info->numlayers = l_tcp->numlayers;
+        p_j2k->cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(
+                                            l_image->numcomps * sizeof(OPJ_UINT32));
+        if (!p_j2k->cstr_info->numdecompos) {
+            return OPJ_FALSE;
         }
+        for (i = 0; i < l_image->numcomps; ++i) {
+            p_j2k->cstr_info->numdecompos[i] = l_tcp->tccps[i].numresolutions - 1;
+        }
+    }
 #endif
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-#if 0
-static OPJ_BOOL opj_j2k_write_coc( opj_j2k_t *p_j2k,
-                                                OPJ_UINT32 p_comp_no,
-                                                opj_stream_private_t *p_stream,
-                                                opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_write_coc(opj_j2k_t *p_j2k,
+                                  OPJ_UINT32 p_comp_no,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager)
 {
-        OPJ_UINT32 l_coc_size,l_remaining_size;
-        OPJ_UINT32 l_comp_room;
+    OPJ_UINT32 l_coc_size, l_remaining_size;
+    OPJ_UINT32 l_comp_room;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        l_comp_room = (p_j2k->m_private_image->numcomps <= 256) ? 1 : 2;
+    l_comp_room = (p_j2k->m_private_image->numcomps <= 256) ? 1 : 2;
 
-        l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
+    l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
+                 p_j2k->m_current_tile_number, p_comp_no);
 
-        if (l_coc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
-                OPJ_BYTE *new_header_tile_data;
-                /*p_j2k->m_specific_param.m_encoder.m_header_tile_data
-                        = (OPJ_BYTE*)opj_realloc(
-                                p_j2k->m_specific_param.m_encoder.m_header_tile_data,
-                                l_coc_size);*/
+    if (l_coc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+        OPJ_BYTE *new_header_tile_data;
+        /*p_j2k->m_specific_param.m_encoder.m_header_tile_data
+                = (OPJ_BYTE*)opj_realloc(
+                        p_j2k->m_specific_param.m_encoder.m_header_tile_data,
+                        l_coc_size);*/
 
-                new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size);
-                if (! new_header_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COC marker\n");
-                        return OPJ_FALSE;
-                }
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_coc_size;
+        new_header_tile_data = (OPJ_BYTE *) opj_realloc(
+                                   p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size);
+        if (! new_header_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write COC marker\n");
+            return OPJ_FALSE;
         }
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_coc_size;
+    }
 
-        opj_j2k_write_coc_in_memory(p_j2k,p_comp_no,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_remaining_size,p_manager);
+    opj_j2k_write_coc_in_memory(p_j2k, p_comp_no,
+                                p_j2k->m_specific_param.m_encoder.m_header_tile_data, &l_remaining_size,
+                                p_manager);
 
-        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_coc_size,p_manager) != l_coc_size) {
-                return OPJ_FALSE;
-        }
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_coc_size,
+                              p_manager) != l_coc_size) {
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
-#endif
 
-#if 0
-static void opj_j2k_write_coc_in_memory(   opj_j2k_t *p_j2k,
-                                                OPJ_UINT32 p_comp_no,
-                                                OPJ_BYTE * p_data,
-                                                OPJ_UINT32 * p_data_written,
-                                                opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_compare_coc(opj_j2k_t *p_j2k,
+                                    OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
 {
-        opj_cp_t *l_cp = 00;
-        opj_tcp_t *l_tcp = 00;
-        OPJ_UINT32 l_coc_size,l_remaining_size;
-        OPJ_BYTE * l_current_data = 00;
-        opj_image_t *l_image = 00;
-        OPJ_UINT32 l_comp_room;
+    opj_cp_t *l_cp = NULL;
+    opj_tcp_t *l_tcp = NULL;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
 
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
-        l_image = p_j2k->m_private_image;
-        l_comp_room = (l_image->numcomps <= 256) ? 1 : 2;
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
 
-        l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
-        l_remaining_size = l_coc_size;
+    if (l_tcp->tccps[p_first_comp_no].csty != l_tcp->tccps[p_second_comp_no].csty) {
+        return OPJ_FALSE;
+    }
 
-        l_current_data = p_data;
 
-        opj_write_bytes(l_current_data,J2K_MS_COC,2);                           /* COC */
-        l_current_data += 2;
-
-        opj_write_bytes(l_current_data,l_coc_size-2,2);                         /* L_COC */
-        l_current_data += 2;
-
-        opj_write_bytes(l_current_data,p_comp_no, l_comp_room);         /* Ccoc */
-        l_current_data+=l_comp_room;
-
-        opj_write_bytes(l_current_data, l_tcp->tccps[p_comp_no].csty, 1);               /* Scoc */
-        ++l_current_data;
-
-        l_remaining_size -= (5 + l_comp_room);
-        opj_j2k_write_SPCod_SPCoc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager);
-        * p_data_written = l_coc_size;
+    return opj_j2k_compare_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number,
+                                       p_first_comp_no, p_second_comp_no);
 }
-#endif
+
+static void opj_j2k_write_coc_in_memory(opj_j2k_t *p_j2k,
+                                        OPJ_UINT32 p_comp_no,
+                                        OPJ_BYTE * p_data,
+                                        OPJ_UINT32 * p_data_written,
+                                        opj_event_mgr_t * p_manager
+                                       )
+{
+    opj_cp_t *l_cp = 00;
+    opj_tcp_t *l_tcp = 00;
+    OPJ_UINT32 l_coc_size, l_remaining_size;
+    OPJ_BYTE * l_current_data = 00;
+    opj_image_t *l_image = 00;
+    OPJ_UINT32 l_comp_room;
+
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
+    l_image = p_j2k->m_private_image;
+    l_comp_room = (l_image->numcomps <= 256) ? 1 : 2;
+
+    l_coc_size = 5 + l_comp_room + opj_j2k_get_SPCod_SPCoc_size(p_j2k,
+                 p_j2k->m_current_tile_number, p_comp_no);
+    l_remaining_size = l_coc_size;
+
+    l_current_data = p_data;
+
+    opj_write_bytes(l_current_data, J2K_MS_COC,
+                    2);                         /* COC */
+    l_current_data += 2;
+
+    opj_write_bytes(l_current_data, l_coc_size - 2,
+                    2);                     /* L_COC */
+    l_current_data += 2;
+
+    opj_write_bytes(l_current_data, p_comp_no, l_comp_room);        /* Ccoc */
+    l_current_data += l_comp_room;
+
+    opj_write_bytes(l_current_data, l_tcp->tccps[p_comp_no].csty,
+                    1);               /* Scoc */
+    ++l_current_data;
+
+    l_remaining_size -= (5 + l_comp_room);
+    opj_j2k_write_SPCod_SPCoc(p_j2k, p_j2k->m_current_tile_number, 0,
+                              l_current_data, &l_remaining_size, p_manager);
+    * p_data_written = l_coc_size;
+}
 
 static OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k)
 {
-        OPJ_UINT32 i,j;
-        OPJ_UINT32 l_nb_comp;
-        OPJ_UINT32 l_nb_tiles;
-        OPJ_UINT32 l_max = 0;
+    OPJ_UINT32 i, j;
+    OPJ_UINT32 l_nb_comp;
+    OPJ_UINT32 l_nb_tiles;
+    OPJ_UINT32 l_max = 0;
 
-        /* preconditions */
+    /* preconditions */
 
-        l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
-        l_nb_comp = p_j2k->m_private_image->numcomps;
+    l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
+    l_nb_comp = p_j2k->m_private_image->numcomps;
 
-        for (i=0;i<l_nb_tiles;++i) {
-                for (j=0;j<l_nb_comp;++j) {
-                        l_max = opj_uint_max(l_max,opj_j2k_get_SPCod_SPCoc_size(p_j2k,i,j));
-                }
+    for (i = 0; i < l_nb_tiles; ++i) {
+        for (j = 0; j < l_nb_comp; ++j) {
+            l_max = opj_uint_max(l_max, opj_j2k_get_SPCod_SPCoc_size(p_j2k, i, j));
         }
+    }
 
-        return 6 + l_max;
+    return 6 + l_max;
 }
 
 /**
@@ -2678,114 +2899,124 @@
  * @param       p_header_size   the size of the data contained in the COC marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_coc (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_coc(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        opj_cp_t *l_cp = NULL;
-        opj_tcp_t *l_tcp = NULL;
-        opj_image_t *l_image = NULL;
-        OPJ_UINT32 l_comp_room;
-        OPJ_UINT32 l_comp_no;
+    opj_cp_t *l_cp = NULL;
+    opj_tcp_t *l_tcp = NULL;
+    opj_image_t *l_image = NULL;
+    OPJ_UINT32 l_comp_room;
+    OPJ_UINT32 l_comp_no;
 
-        /* preconditions */
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ) ? /*FIXME J2K_DEC_STATE_TPH*/
-                                &l_cp->tcps[p_j2k->m_current_tile_number] :
-                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
-        l_image = p_j2k->m_private_image;
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
+            ?
+            &l_cp->tcps[p_j2k->m_current_tile_number] :
+            p_j2k->m_specific_param.m_decoder.m_default_tcp;
+    l_image = p_j2k->m_private_image;
 
-        l_comp_room = l_image->numcomps <= 256 ? 1 : 2;
+    l_comp_room = l_image->numcomps <= 256 ? 1 : 2;
 
-        /* make sure room is sufficient*/
-        if (p_header_size < l_comp_room + 1) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
-                return OPJ_FALSE;
-        }
-        p_header_size -= l_comp_room + 1;
+    /* make sure room is sufficient*/
+    if (p_header_size < l_comp_room + 1) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
+        return OPJ_FALSE;
+    }
+    p_header_size -= l_comp_room + 1;
 
-        opj_read_bytes(p_header_data,&l_comp_no,l_comp_room);                   /* Ccoc */
-        p_header_data += l_comp_room;
-        if (l_comp_no >= l_image->numcomps) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker (bad number of components)\n");
-                return OPJ_FALSE;
-        }
+    opj_read_bytes(p_header_data, &l_comp_no,
+                   l_comp_room);                 /* Ccoc */
+    p_header_data += l_comp_room;
+    if (l_comp_no >= l_image->numcomps) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Error reading COC marker (bad number of components)\n");
+        return OPJ_FALSE;
+    }
 
-        opj_read_bytes(p_header_data,&l_tcp->tccps[l_comp_no].csty,1);                  /* Scoc */
-        ++p_header_data ;
+    opj_read_bytes(p_header_data, &l_tcp->tccps[l_comp_no].csty,
+                   1);                  /* Scoc */
+    ++p_header_data ;
 
-        if (! opj_j2k_read_SPCod_SPCoc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
-                return OPJ_FALSE;
-        }
+    if (! opj_j2k_read_SPCod_SPCoc(p_j2k, l_comp_no, p_header_data, &p_header_size,
+                                   p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
+        return OPJ_FALSE;
+    }
 
-        if (p_header_size != 0) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
-                return OPJ_FALSE;
-        }
-        return OPJ_TRUE;
+    if (p_header_size != 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading COC marker\n");
+        return OPJ_FALSE;
+    }
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_qcd(     opj_j2k_t *p_j2k,
-                                                        opj_stream_private_t *p_stream,
-                                                        opj_event_mgr_t * p_manager
-                            )
+static OPJ_BOOL opj_j2k_write_qcd(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-        OPJ_UINT32 l_qcd_size,l_remaining_size;
-        OPJ_BYTE * l_current_data = 00;
+    OPJ_UINT32 l_qcd_size, l_remaining_size;
+    OPJ_BYTE * l_current_data = 00;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        l_qcd_size = 4 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,0);
-        l_remaining_size = l_qcd_size;
+    l_qcd_size = 4 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
+                 0);
+    l_remaining_size = l_qcd_size;
 
-        if (l_qcd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
-                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size);
-                if (! new_header_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCD marker\n");
-                        return OPJ_FALSE;
-                }
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcd_size;
+    if (l_qcd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
+                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size);
+        if (! new_header_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCD marker\n");
+            return OPJ_FALSE;
         }
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcd_size;
+    }
 
-        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
 
-        opj_write_bytes(l_current_data,J2K_MS_QCD,2);           /* QCD */
-        l_current_data += 2;
+    opj_write_bytes(l_current_data, J2K_MS_QCD, 2);         /* QCD */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,l_qcd_size-2,2);         /* L_QCD */
-        l_current_data += 2;
+    opj_write_bytes(l_current_data, l_qcd_size - 2, 2);     /* L_QCD */
+    l_current_data += 2;
 
-        l_remaining_size -= 4;
+    l_remaining_size -= 4;
 
-        if (! opj_j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,0,l_current_data,&l_remaining_size,p_manager)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
-                return OPJ_FALSE;
-        }
+    if (! opj_j2k_write_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number, 0,
+                                  l_current_data, &l_remaining_size, p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
+        return OPJ_FALSE;
+    }
 
-        if (l_remaining_size != 0) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
-                return OPJ_FALSE;
-        }
+    if (l_remaining_size != 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error writing QCD marker\n");
+        return OPJ_FALSE;
+    }
 
-        if (opj_stream_write_data(p_stream, p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_qcd_size,p_manager) != l_qcd_size) {
-                return OPJ_FALSE;
-        }
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcd_size,
+                              p_manager) != l_qcd_size) {
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /**
@@ -2795,128 +3026,139 @@
  * @param       p_header_size   the size of the data contained in the QCD marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_qcd (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_qcd(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        /* preconditions */
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        if (! opj_j2k_read_SQcd_SQcc(p_j2k,0,p_header_data,&p_header_size,p_manager)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
-                return OPJ_FALSE;
-        }
+    if (! opj_j2k_read_SQcd_SQcc(p_j2k, 0, p_header_data, &p_header_size,
+                                 p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
+        return OPJ_FALSE;
+    }
 
-        if (p_header_size != 0) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
-                return OPJ_FALSE;
-        }
+    if (p_header_size != 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCD marker\n");
+        return OPJ_FALSE;
+    }
 
-        /* Apply the quantization parameters to other components of the current tile or the m_default_tcp */
-        opj_j2k_copy_tile_quantization_parameters(p_j2k);
+    /* Apply the quantization parameters to other components of the current tile or the m_default_tcp */
+    opj_j2k_copy_tile_quantization_parameters(p_j2k);
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-#if 0
-static OPJ_BOOL opj_j2k_write_qcc(     opj_j2k_t *p_j2k,
-                                                OPJ_UINT32 p_comp_no,
-                                                opj_stream_private_t *p_stream,
-                                                opj_event_mgr_t * p_manager
-                            )
+static OPJ_BOOL opj_j2k_write_qcc(opj_j2k_t *p_j2k,
+                                  OPJ_UINT32 p_comp_no,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-        OPJ_UINT32 l_qcc_size,l_remaining_size;
+    OPJ_UINT32 l_qcc_size, l_remaining_size;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        l_qcc_size = 5 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
-        l_qcc_size += p_j2k->m_private_image->numcomps <= 256 ? 0:1;
-        l_remaining_size = l_qcc_size;
+    l_qcc_size = 5 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
+                 p_comp_no);
+    l_qcc_size += p_j2k->m_private_image->numcomps <= 256 ? 0 : 1;
+    l_remaining_size = l_qcc_size;
 
-        if (l_qcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
-                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size);
-                if (! new_header_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCC marker\n");
-                        return OPJ_FALSE;
-                }
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcc_size;
+    if (l_qcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
+                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size);
+        if (! new_header_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write QCC marker\n");
+            return OPJ_FALSE;
         }
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_qcc_size;
+    }
 
-        opj_j2k_write_qcc_in_memory(p_j2k,p_comp_no,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_remaining_size,p_manager);
+    opj_j2k_write_qcc_in_memory(p_j2k, p_comp_no,
+                                p_j2k->m_specific_param.m_encoder.m_header_tile_data, &l_remaining_size,
+                                p_manager);
 
-        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_qcc_size,p_manager) != l_qcc_size) {
-                return OPJ_FALSE;
-        }
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_qcc_size,
+                              p_manager) != l_qcc_size) {
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
-#endif
 
-#if 0
-static void opj_j2k_write_qcc_in_memory(   opj_j2k_t *p_j2k,
-                                                                OPJ_UINT32 p_comp_no,
-                                                                OPJ_BYTE * p_data,
-                                                                OPJ_UINT32 * p_data_written,
-                                                                opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_compare_qcc(opj_j2k_t *p_j2k,
+                                    OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
 {
-        OPJ_UINT32 l_qcc_size,l_remaining_size;
-        OPJ_BYTE * l_current_data = 00;
+    return opj_j2k_compare_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number,
+                                     p_first_comp_no, p_second_comp_no);
+}
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+static void opj_j2k_write_qcc_in_memory(opj_j2k_t *p_j2k,
+                                        OPJ_UINT32 p_comp_no,
+                                        OPJ_BYTE * p_data,
+                                        OPJ_UINT32 * p_data_written,
+                                        opj_event_mgr_t * p_manager
+                                       )
+{
+    OPJ_UINT32 l_qcc_size, l_remaining_size;
+    OPJ_BYTE * l_current_data = 00;
 
-        l_qcc_size = 6 + opj_j2k_get_SQcd_SQcc_size(p_j2k,p_j2k->m_current_tile_number,p_comp_no);
-        l_remaining_size = l_qcc_size;
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_current_data = p_data;
+    l_qcc_size = 6 + opj_j2k_get_SQcd_SQcc_size(p_j2k, p_j2k->m_current_tile_number,
+                 p_comp_no);
+    l_remaining_size = l_qcc_size;
 
-        opj_write_bytes(l_current_data,J2K_MS_QCC,2);           /* QCC */
+    l_current_data = p_data;
+
+    opj_write_bytes(l_current_data, J2K_MS_QCC, 2);         /* QCC */
+    l_current_data += 2;
+
+    if (p_j2k->m_private_image->numcomps <= 256) {
+        --l_qcc_size;
+
+        opj_write_bytes(l_current_data, l_qcc_size - 2, 2);     /* L_QCC */
         l_current_data += 2;
 
-        if (p_j2k->m_private_image->numcomps <= 256) {
-                --l_qcc_size;
+        opj_write_bytes(l_current_data, p_comp_no, 1);  /* Cqcc */
+        ++l_current_data;
 
-                opj_write_bytes(l_current_data,l_qcc_size-2,2);         /* L_QCC */
-                l_current_data += 2;
+        /* in the case only one byte is sufficient the last byte allocated is useless -> still do -6 for available */
+        l_remaining_size -= 6;
+    } else {
+        opj_write_bytes(l_current_data, l_qcc_size - 2, 2);     /* L_QCC */
+        l_current_data += 2;
 
-                opj_write_bytes(l_current_data, p_comp_no, 1);  /* Cqcc */
-                ++l_current_data;
+        opj_write_bytes(l_current_data, p_comp_no, 2);  /* Cqcc */
+        l_current_data += 2;
 
-                /* in the case only one byte is sufficient the last byte allocated is useless -> still do -6 for available */
-                l_remaining_size -= 6;
-        }
-        else {
-                opj_write_bytes(l_current_data,l_qcc_size-2,2);         /* L_QCC */
-                l_current_data += 2;
+        l_remaining_size -= 6;
+    }
 
-                opj_write_bytes(l_current_data, p_comp_no, 2);  /* Cqcc */
-                l_current_data+=2;
+    opj_j2k_write_SQcd_SQcc(p_j2k, p_j2k->m_current_tile_number, p_comp_no,
+                            l_current_data, &l_remaining_size, p_manager);
 
-                l_remaining_size -= 6;
-        }
-
-        opj_j2k_write_SQcd_SQcc(p_j2k,p_j2k->m_current_tile_number,p_comp_no,l_current_data,&l_remaining_size,p_manager);
-
-        *p_data_written = l_qcc_size;
+    *p_data_written = l_qcc_size;
 }
-#endif
 
-static OPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k)
+static OPJ_UINT32 opj_j2k_get_max_qcc_size(opj_j2k_t *p_j2k)
 {
-        return opj_j2k_get_max_coc_size(p_j2k);
+    return opj_j2k_get_max_coc_size(p_j2k);
 }
 
 /**
@@ -2926,273 +3168,289 @@
  * @param       p_header_size   the size of the data contained in the QCC marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_qcc(   opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_qcc(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        OPJ_UINT32 l_num_comp,l_comp_no;
+    OPJ_UINT32 l_num_comp, l_comp_no;
 
-        /* preconditions */
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_num_comp = p_j2k->m_private_image->numcomps;
+    l_num_comp = p_j2k->m_private_image->numcomps;
 
-        if (l_num_comp <= 256) {
-                if (p_header_size < 1) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
-                        return OPJ_FALSE;
-                }
-                opj_read_bytes(p_header_data,&l_comp_no,1);
-                ++p_header_data;
-                --p_header_size;
+    if (l_num_comp <= 256) {
+        if (p_header_size < 1) {
+            opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
+            return OPJ_FALSE;
         }
-        else {
-                if (p_header_size < 2) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
-                        return OPJ_FALSE;
-                }
-                opj_read_bytes(p_header_data,&l_comp_no,2);
-                p_header_data+=2;
-                p_header_size-=2;
+        opj_read_bytes(p_header_data, &l_comp_no, 1);
+        ++p_header_data;
+        --p_header_size;
+    } else {
+        if (p_header_size < 2) {
+            opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
+            return OPJ_FALSE;
         }
+        opj_read_bytes(p_header_data, &l_comp_no, 2);
+        p_header_data += 2;
+        p_header_size -= 2;
+    }
 
 #ifdef USE_JPWL
-        if (p_j2k->m_cp.correct) {
+    if (p_j2k->m_cp.correct) {
 
-                static OPJ_UINT32 backup_compno = 0;
+        static OPJ_UINT32 backup_compno = 0;
 
-                /* compno is negative or larger than the number of components!!! */
-                if (/*(l_comp_no < 0) ||*/ (l_comp_no >= l_num_comp)) {
-                        opj_event_msg(p_manager, EVT_ERROR,
-                                "JPWL: bad component number in QCC (%d out of a maximum of %d)\n",
-                                l_comp_no, l_num_comp);
-                        if (!JPWL_ASSUME) {
-                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
-                                return OPJ_FALSE;
-                        }
-                        /* we try to correct */
-                        l_comp_no = backup_compno % l_num_comp;
-                        opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
-                                "- setting component number to %d\n",
-                                l_comp_no);
-                }
+        /* compno is negative or larger than the number of components!!! */
+        if (/*(l_comp_no < 0) ||*/ (l_comp_no >= l_num_comp)) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "JPWL: bad component number in QCC (%d out of a maximum of %d)\n",
+                          l_comp_no, l_num_comp);
+            if (!JPWL_ASSUME) {
+                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                return OPJ_FALSE;
+            }
+            /* we try to correct */
+            l_comp_no = backup_compno % l_num_comp;
+            opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
+                          "- setting component number to %d\n",
+                          l_comp_no);
+        }
 
-                /* keep your private count of tiles */
-                backup_compno++;
-        };
+        /* keep your private count of tiles */
+        backup_compno++;
+    };
 #endif /* USE_JPWL */
 
-        if (l_comp_no >= p_j2k->m_private_image->numcomps) {
-                opj_event_msg(p_manager, EVT_ERROR,
-                              "Invalid component number: %d, regarding the number of components %d\n",
-                              l_comp_no, p_j2k->m_private_image->numcomps);
-                return OPJ_FALSE;
-        }
+    if (l_comp_no >= p_j2k->m_private_image->numcomps) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Invalid component number: %d, regarding the number of components %d\n",
+                      l_comp_no, p_j2k->m_private_image->numcomps);
+        return OPJ_FALSE;
+    }
 
-        if (! opj_j2k_read_SQcd_SQcc(p_j2k,l_comp_no,p_header_data,&p_header_size,p_manager)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
-                return OPJ_FALSE;
-        }
+    if (! opj_j2k_read_SQcd_SQcc(p_j2k, l_comp_no, p_header_data, &p_header_size,
+                                 p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
+        return OPJ_FALSE;
+    }
 
-        if (p_header_size != 0) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
-                return OPJ_FALSE;
-        }
+    if (p_header_size != 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading QCC marker\n");
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_poc(     opj_j2k_t *p_j2k,
-                                                        opj_stream_private_t *p_stream,
-                                                        opj_event_mgr_t * p_manager
-                            )
+static OPJ_BOOL opj_j2k_write_poc(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-        OPJ_UINT32 l_nb_comp;
-        OPJ_UINT32 l_nb_poc;
-        OPJ_UINT32 l_poc_size;
-        OPJ_UINT32 l_written_size = 0;
-        opj_tcp_t *l_tcp = 00;
-        OPJ_UINT32 l_poc_room;
+    OPJ_UINT32 l_nb_comp;
+    OPJ_UINT32 l_nb_poc;
+    OPJ_UINT32 l_poc_size;
+    OPJ_UINT32 l_written_size = 0;
+    opj_tcp_t *l_tcp = 00;
+    OPJ_UINT32 l_poc_room;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
-        l_nb_comp = p_j2k->m_private_image->numcomps;
-        l_nb_poc = 1 + l_tcp->numpocs;
+    l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
+    l_nb_comp = p_j2k->m_private_image->numcomps;
+    l_nb_poc = 1 + l_tcp->numpocs;
 
-        if (l_nb_comp <= 256) {
-                l_poc_room = 1;
+    if (l_nb_comp <= 256) {
+        l_poc_room = 1;
+    } else {
+        l_poc_room = 2;
+    }
+    l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
+
+    if (l_poc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
+                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size);
+        if (! new_header_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write POC marker\n");
+            return OPJ_FALSE;
         }
-        else {
-                l_poc_room = 2;
-        }
-        l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_poc_size;
+    }
 
-        if (l_poc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
-                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size);
-                if (! new_header_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write POC marker\n");
-                        return OPJ_FALSE;
-                }
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_poc_size;
-        }
+    opj_j2k_write_poc_in_memory(p_j2k,
+                                p_j2k->m_specific_param.m_encoder.m_header_tile_data, &l_written_size,
+                                p_manager);
 
-        opj_j2k_write_poc_in_memory(p_j2k,p_j2k->m_specific_param.m_encoder.m_header_tile_data,&l_written_size,p_manager);
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_poc_size,
+                              p_manager) != l_poc_size) {
+        return OPJ_FALSE;
+    }
 
-        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_poc_size,p_manager) != l_poc_size) {
-                return OPJ_FALSE;
-        }
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static void opj_j2k_write_poc_in_memory(   opj_j2k_t *p_j2k,
-                                                                OPJ_BYTE * p_data,
-                                                                OPJ_UINT32 * p_data_written,
-                                                                opj_event_mgr_t * p_manager
-                                    )
+static void opj_j2k_write_poc_in_memory(opj_j2k_t *p_j2k,
+                                        OPJ_BYTE * p_data,
+                                        OPJ_UINT32 * p_data_written,
+                                        opj_event_mgr_t * p_manager
+                                       )
 {
-        OPJ_UINT32 i;
-        OPJ_BYTE * l_current_data = 00;
-        OPJ_UINT32 l_nb_comp;
-        OPJ_UINT32 l_nb_poc;
-        OPJ_UINT32 l_poc_size;
-        opj_image_t *l_image = 00;
-        opj_tcp_t *l_tcp = 00;
-        opj_tccp_t *l_tccp = 00;
-        opj_poc_t *l_current_poc = 00;
-        OPJ_UINT32 l_poc_room;
+    OPJ_UINT32 i;
+    OPJ_BYTE * l_current_data = 00;
+    OPJ_UINT32 l_nb_comp;
+    OPJ_UINT32 l_nb_poc;
+    OPJ_UINT32 l_poc_size;
+    opj_image_t *l_image = 00;
+    opj_tcp_t *l_tcp = 00;
+    opj_tccp_t *l_tccp = 00;
+    opj_poc_t *l_current_poc = 00;
+    OPJ_UINT32 l_poc_room;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
-        l_tccp = &l_tcp->tccps[0];
-        l_image = p_j2k->m_private_image;
-        l_nb_comp = l_image->numcomps;
-        l_nb_poc = 1 + l_tcp->numpocs;
+    OPJ_UNUSED(p_manager);
 
-        if (l_nb_comp <= 256) {
-                l_poc_room = 1;
-        }
-        else {
-                l_poc_room = 2;
-        }
+    l_tcp = &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number];
+    l_tccp = &l_tcp->tccps[0];
+    l_image = p_j2k->m_private_image;
+    l_nb_comp = l_image->numcomps;
+    l_nb_poc = 1 + l_tcp->numpocs;
 
-        l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
+    if (l_nb_comp <= 256) {
+        l_poc_room = 1;
+    } else {
+        l_poc_room = 2;
+    }
 
-        l_current_data = p_data;
+    l_poc_size = 4 + (5 + 2 * l_poc_room) * l_nb_poc;
 
-        opj_write_bytes(l_current_data,J2K_MS_POC,2);                                   /* POC  */
+    l_current_data = p_data;
+
+    opj_write_bytes(l_current_data, J2K_MS_POC,
+                    2);                                   /* POC  */
+    l_current_data += 2;
+
+    opj_write_bytes(l_current_data, l_poc_size - 2,
+                    2);                                 /* Lpoc */
+    l_current_data += 2;
+
+    l_current_poc =  l_tcp->pocs;
+    for (i = 0; i < l_nb_poc; ++i) {
+        opj_write_bytes(l_current_data, l_current_poc->resno0,
+                        1);                                /* RSpoc_i */
+        ++l_current_data;
+
+        opj_write_bytes(l_current_data, l_current_poc->compno0,
+                        l_poc_room);              /* CSpoc_i */
+        l_current_data += l_poc_room;
+
+        opj_write_bytes(l_current_data, l_current_poc->layno1,
+                        2);                                /* LYEpoc_i */
         l_current_data += 2;
 
-        opj_write_bytes(l_current_data,l_poc_size-2,2);                                 /* Lpoc */
-        l_current_data += 2;
+        opj_write_bytes(l_current_data, l_current_poc->resno1,
+                        1);                                /* REpoc_i */
+        ++l_current_data;
 
-        l_current_poc =  l_tcp->pocs;
-        for (i = 0; i < l_nb_poc; ++i) {
-                opj_write_bytes(l_current_data,l_current_poc->resno0,1);                                /* RSpoc_i */
-                ++l_current_data;
+        opj_write_bytes(l_current_data, l_current_poc->compno1,
+                        l_poc_room);              /* CEpoc_i */
+        l_current_data += l_poc_room;
 
-                opj_write_bytes(l_current_data,l_current_poc->compno0,l_poc_room);              /* CSpoc_i */
-                l_current_data+=l_poc_room;
+        opj_write_bytes(l_current_data, (OPJ_UINT32)l_current_poc->prg,
+                        1);   /* Ppoc_i */
+        ++l_current_data;
 
-                opj_write_bytes(l_current_data,l_current_poc->layno1,2);                                /* LYEpoc_i */
-                l_current_data+=2;
+        /* change the value of the max layer according to the actual number of layers in the file, components and resolutions*/
+        l_current_poc->layno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)
+                                l_current_poc->layno1, (OPJ_INT32)l_tcp->numlayers);
+        l_current_poc->resno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)
+                                l_current_poc->resno1, (OPJ_INT32)l_tccp->numresolutions);
+        l_current_poc->compno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)
+                                 l_current_poc->compno1, (OPJ_INT32)l_nb_comp);
 
-                opj_write_bytes(l_current_data,l_current_poc->resno1,1);                                /* REpoc_i */
-                ++l_current_data;
+        ++l_current_poc;
+    }
 
-                opj_write_bytes(l_current_data,l_current_poc->compno1,l_poc_room);              /* CEpoc_i */
-                l_current_data+=l_poc_room;
-
-                opj_write_bytes(l_current_data,l_current_poc->prg,1);                                   /* Ppoc_i */
-                ++l_current_data;
-
-                /* change the value of the max layer according to the actual number of layers in the file, components and resolutions*/
-                l_current_poc->layno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->layno1, (OPJ_INT32)l_tcp->numlayers);
-                l_current_poc->resno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->resno1, (OPJ_INT32)l_tccp->numresolutions);
-                l_current_poc->compno1 = (OPJ_UINT32)opj_int_min((OPJ_INT32)l_current_poc->compno1, (OPJ_INT32)l_nb_comp);
-
-                ++l_current_poc;
-        }
-
-        *p_data_written = l_poc_size;
+    *p_data_written = l_poc_size;
 }
 
 static OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k)
 {
-        opj_tcp_t * l_tcp = 00;
-        OPJ_UINT32 l_nb_tiles = 0;
-        OPJ_UINT32 l_max_poc = 0;
-        OPJ_UINT32 i;
+    opj_tcp_t * l_tcp = 00;
+    OPJ_UINT32 l_nb_tiles = 0;
+    OPJ_UINT32 l_max_poc = 0;
+    OPJ_UINT32 i;
 
-        l_tcp = p_j2k->m_cp.tcps;
-        l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+    l_tcp = p_j2k->m_cp.tcps;
+    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
 
-        for (i=0;i<l_nb_tiles;++i) {
-                l_max_poc = opj_uint_max(l_max_poc,l_tcp->numpocs);
-                ++l_tcp;
-        }
+    for (i = 0; i < l_nb_tiles; ++i) {
+        l_max_poc = opj_uint_max(l_max_poc, l_tcp->numpocs);
+        ++l_tcp;
+    }
 
-        ++l_max_poc;
+    ++l_max_poc;
 
-        return 4 + 9 * l_max_poc;
+    return 4 + 9 * l_max_poc;
 }
 
-static OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k)
+static OPJ_UINT32 opj_j2k_get_max_toc_size(opj_j2k_t *p_j2k)
 {
-        OPJ_UINT32 i;
-        OPJ_UINT32 l_nb_tiles;
-        OPJ_UINT32 l_max = 0;
-        opj_tcp_t * l_tcp = 00;
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_nb_tiles;
+    OPJ_UINT32 l_max = 0;
+    opj_tcp_t * l_tcp = 00;
 
-        l_tcp = p_j2k->m_cp.tcps;
-        l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
+    l_tcp = p_j2k->m_cp.tcps;
+    l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th ;
 
-        for (i=0;i<l_nb_tiles;++i) {
-                l_max = opj_uint_max(l_max,l_tcp->m_nb_tile_parts);
+    for (i = 0; i < l_nb_tiles; ++i) {
+        l_max = opj_uint_max(l_max, l_tcp->m_nb_tile_parts);
 
-                ++l_tcp;
-        }
+        ++l_tcp;
+    }
 
-        return 12 * l_max;
+    return 12 * l_max;
 }
 
 static OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k)
 {
-        OPJ_UINT32 l_nb_bytes = 0;
-        OPJ_UINT32 l_nb_comps;
-        OPJ_UINT32 l_coc_bytes,l_qcc_bytes;
+    OPJ_UINT32 l_nb_bytes = 0;
+    OPJ_UINT32 l_nb_comps;
+    OPJ_UINT32 l_coc_bytes, l_qcc_bytes;
 
-        l_nb_comps = p_j2k->m_private_image->numcomps - 1;
-        l_nb_bytes += opj_j2k_get_max_toc_size(p_j2k);
+    l_nb_comps = p_j2k->m_private_image->numcomps - 1;
+    l_nb_bytes += opj_j2k_get_max_toc_size(p_j2k);
 
-        if (!(OPJ_IS_CINEMA(p_j2k->m_cp.rsiz))) {
-                l_coc_bytes = opj_j2k_get_max_coc_size(p_j2k);
-                l_nb_bytes += l_nb_comps * l_coc_bytes;
+    if (!(OPJ_IS_CINEMA(p_j2k->m_cp.rsiz))) {
+        l_coc_bytes = opj_j2k_get_max_coc_size(p_j2k);
+        l_nb_bytes += l_nb_comps * l_coc_bytes;
 
-                l_qcc_bytes = opj_j2k_get_max_qcc_size(p_j2k);
-                l_nb_bytes += l_nb_comps * l_qcc_bytes;
-        }
+        l_qcc_bytes = opj_j2k_get_max_qcc_size(p_j2k);
+        l_nb_bytes += l_nb_comps * l_qcc_bytes;
+    }
 
-        l_nb_bytes += opj_j2k_get_max_poc_size(p_j2k);
+    l_nb_bytes += opj_j2k_get_max_poc_size(p_j2k);
 
-        /*** DEVELOPER CORNER, Add room for your headers ***/
+    /*** DEVELOPER CORNER, Add room for your headers ***/
 
-        return l_nb_bytes;
+    return l_nb_bytes;
 }
 
 /**
@@ -3203,84 +3461,88 @@
  * @param       p_header_size   the size of the data contained in the POC marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_poc (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_poc(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        OPJ_UINT32 i, l_nb_comp, l_tmp;
-        opj_image_t * l_image = 00;
-        OPJ_UINT32 l_old_poc_nb, l_current_poc_nb, l_current_poc_remaining;
-        OPJ_UINT32 l_chunk_size, l_comp_room;
+    OPJ_UINT32 i, l_nb_comp, l_tmp;
+    opj_image_t * l_image = 00;
+    OPJ_UINT32 l_old_poc_nb, l_current_poc_nb, l_current_poc_remaining;
+    OPJ_UINT32 l_chunk_size, l_comp_room;
 
-        opj_cp_t *l_cp = 00;
-        opj_tcp_t *l_tcp = 00;
-        opj_poc_t *l_current_poc = 00;
+    opj_cp_t *l_cp = 00;
+    opj_tcp_t *l_tcp = 00;
+    opj_poc_t *l_current_poc = 00;
 
-        /* preconditions */
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_image = p_j2k->m_private_image;
-        l_nb_comp = l_image->numcomps;
-        if (l_nb_comp <= 256) {
-                l_comp_room = 1;
-        }
-        else {
-                l_comp_room = 2;
-        }
-        l_chunk_size = 5 + 2 * l_comp_room;
-        l_current_poc_nb = p_header_size / l_chunk_size;
-        l_current_poc_remaining = p_header_size % l_chunk_size;
+    l_image = p_j2k->m_private_image;
+    l_nb_comp = l_image->numcomps;
+    if (l_nb_comp <= 256) {
+        l_comp_room = 1;
+    } else {
+        l_comp_room = 2;
+    }
+    l_chunk_size = 5 + 2 * l_comp_room;
+    l_current_poc_nb = p_header_size / l_chunk_size;
+    l_current_poc_remaining = p_header_size % l_chunk_size;
 
-        if ((l_current_poc_nb <= 0) || (l_current_poc_remaining != 0)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading POC marker\n");
-                return OPJ_FALSE;
-        }
+    if ((l_current_poc_nb <= 0) || (l_current_poc_remaining != 0)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading POC marker\n");
+        return OPJ_FALSE;
+    }
 
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
-                                &l_cp->tcps[p_j2k->m_current_tile_number] :
-                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
-        l_old_poc_nb = l_tcp->POC ? l_tcp->numpocs + 1 : 0;
-        l_current_poc_nb += l_old_poc_nb;
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
+            &l_cp->tcps[p_j2k->m_current_tile_number] :
+            p_j2k->m_specific_param.m_decoder.m_default_tcp;
+    l_old_poc_nb = l_tcp->POC ? l_tcp->numpocs + 1 : 0;
+    l_current_poc_nb += l_old_poc_nb;
 
-        if(l_current_poc_nb >= 32)
-          {
-          opj_event_msg(p_manager, EVT_ERROR, "Too many POCs %d\n", l_current_poc_nb);
-          return OPJ_FALSE;
-          }
-        assert(l_current_poc_nb < 32);
+    if (l_current_poc_nb >= 32) {
+        opj_event_msg(p_manager, EVT_ERROR, "Too many POCs %d\n", l_current_poc_nb);
+        return OPJ_FALSE;
+    }
+    assert(l_current_poc_nb < 32);
 
-        /* now poc is in use.*/
-        l_tcp->POC = 1;
+    /* now poc is in use.*/
+    l_tcp->POC = 1;
 
-        l_current_poc = &l_tcp->pocs[l_old_poc_nb];
-        for     (i = l_old_poc_nb; i < l_current_poc_nb; ++i) {
-                opj_read_bytes(p_header_data,&(l_current_poc->resno0),1);                               /* RSpoc_i */
-                ++p_header_data;
-                opj_read_bytes(p_header_data,&(l_current_poc->compno0),l_comp_room);    /* CSpoc_i */
-                p_header_data+=l_comp_room;
-                opj_read_bytes(p_header_data,&(l_current_poc->layno1),2);                               /* LYEpoc_i */
-                /* make sure layer end is in acceptable bounds */
-                l_current_poc->layno1 = opj_uint_min(l_current_poc->layno1, l_tcp->numlayers);
-                p_header_data+=2;
-                opj_read_bytes(p_header_data,&(l_current_poc->resno1),1);                               /* REpoc_i */
-                ++p_header_data;
-                opj_read_bytes(p_header_data,&(l_current_poc->compno1),l_comp_room);    /* CEpoc_i */
-                p_header_data+=l_comp_room;
-                opj_read_bytes(p_header_data,&l_tmp,1);                                                                 /* Ppoc_i */
-                ++p_header_data;
-                l_current_poc->prg = (OPJ_PROG_ORDER) l_tmp;
-                /* make sure comp is in acceptable bounds */
-                l_current_poc->compno1 = opj_uint_min(l_current_poc->compno1, l_nb_comp);
-                ++l_current_poc;
-        }
+    l_current_poc = &l_tcp->pocs[l_old_poc_nb];
+    for (i = l_old_poc_nb; i < l_current_poc_nb; ++i) {
+        opj_read_bytes(p_header_data, &(l_current_poc->resno0),
+                       1);                               /* RSpoc_i */
+        ++p_header_data;
+        opj_read_bytes(p_header_data, &(l_current_poc->compno0),
+                       l_comp_room);  /* CSpoc_i */
+        p_header_data += l_comp_room;
+        opj_read_bytes(p_header_data, &(l_current_poc->layno1),
+                       2);                               /* LYEpoc_i */
+        /* make sure layer end is in acceptable bounds */
+        l_current_poc->layno1 = opj_uint_min(l_current_poc->layno1, l_tcp->numlayers);
+        p_header_data += 2;
+        opj_read_bytes(p_header_data, &(l_current_poc->resno1),
+                       1);                               /* REpoc_i */
+        ++p_header_data;
+        opj_read_bytes(p_header_data, &(l_current_poc->compno1),
+                       l_comp_room);  /* CEpoc_i */
+        p_header_data += l_comp_room;
+        opj_read_bytes(p_header_data, &l_tmp,
+                       1);                                                                 /* Ppoc_i */
+        ++p_header_data;
+        l_current_poc->prg = (OPJ_PROG_ORDER) l_tmp;
+        /* make sure comp is in acceptable bounds */
+        l_current_poc->compno1 = opj_uint_min(l_current_poc->compno1, l_nb_comp);
+        ++l_current_poc;
+    }
 
-        l_tcp->numpocs = l_current_poc_nb - 1;
-        return OPJ_TRUE;
+    l_tcp->numpocs = l_current_poc_nb - 1;
+    return OPJ_TRUE;
 }
 
 /**
@@ -3291,36 +3553,38 @@
  * @param       p_header_size   the size of the data contained in the TLM marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_crg (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_crg(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        OPJ_UINT32 l_nb_comp;
-        /* preconditions */
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    OPJ_UINT32 l_nb_comp;
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_nb_comp = p_j2k->m_private_image->numcomps;
+    OPJ_UNUSED(p_header_data);
 
-        if (p_header_size != l_nb_comp *4) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading CRG marker\n");
-                return OPJ_FALSE;
-        }
-        /* Do not care of this at the moment since only local variables are set here */
-        /*
-        for
-                (i = 0; i < l_nb_comp; ++i)
-        {
-                opj_read_bytes(p_header_data,&l_Xcrg_i,2);                              // Xcrg_i
-                p_header_data+=2;
-                opj_read_bytes(p_header_data,&l_Ycrg_i,2);                              // Xcrg_i
-                p_header_data+=2;
-        }
-        */
-        return OPJ_TRUE;
+    l_nb_comp = p_j2k->m_private_image->numcomps;
+
+    if (p_header_size != l_nb_comp * 4) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading CRG marker\n");
+        return OPJ_FALSE;
+    }
+    /* Do not care of this at the moment since only local variables are set here */
+    /*
+    for
+            (i = 0; i < l_nb_comp; ++i)
+    {
+            opj_read_bytes(p_header_data,&l_Xcrg_i,2);                              // Xcrg_i
+            p_header_data+=2;
+            opj_read_bytes(p_header_data,&l_Ycrg_i,2);                              // Xcrg_i
+            p_header_data+=2;
+    }
+    */
+    return OPJ_TRUE;
 }
 
 /**
@@ -3331,52 +3595,57 @@
  * @param       p_header_size   the size of the data contained in the TLM marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_tlm (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_tlm(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        OPJ_UINT32 l_Ztlm, l_Stlm, l_ST, l_SP, l_tot_num_tp_remaining, l_quotient, l_Ptlm_size;
-        /* preconditions */
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    OPJ_UINT32 l_Ztlm, l_Stlm, l_ST, l_SP, l_tot_num_tp_remaining, l_quotient,
+               l_Ptlm_size;
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        if (p_header_size < 2) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
-                return OPJ_FALSE;
-        }
-        p_header_size -= 2;
+    OPJ_UNUSED(p_j2k);
 
-        opj_read_bytes(p_header_data,&l_Ztlm,1);                                /* Ztlm */
-        ++p_header_data;
-        opj_read_bytes(p_header_data,&l_Stlm,1);                                /* Stlm */
-        ++p_header_data;
+    if (p_header_size < 2) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
+        return OPJ_FALSE;
+    }
+    p_header_size -= 2;
 
-        l_ST = ((l_Stlm >> 4) & 0x3);
-        l_SP = (l_Stlm >> 6) & 0x1;
+    opj_read_bytes(p_header_data, &l_Ztlm,
+                   1);                              /* Ztlm */
+    ++p_header_data;
+    opj_read_bytes(p_header_data, &l_Stlm,
+                   1);                              /* Stlm */
+    ++p_header_data;
 
-        l_Ptlm_size = (l_SP + 1) * 2;
-        l_quotient = l_Ptlm_size + l_ST;
+    l_ST = ((l_Stlm >> 4) & 0x3);
+    l_SP = (l_Stlm >> 6) & 0x1;
 
-        l_tot_num_tp_remaining = p_header_size % l_quotient;
+    l_Ptlm_size = (l_SP + 1) * 2;
+    l_quotient = l_Ptlm_size + l_ST;
 
-        if (l_tot_num_tp_remaining != 0) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
-                return OPJ_FALSE;
-        }
-        /* FIXME Do not care of this at the moment since only local variables are set here */
-        /*
-        for
-                (i = 0; i < l_tot_num_tp; ++i)
-        {
-                opj_read_bytes(p_header_data,&l_Ttlm_i,l_ST);                           // Ttlm_i
-                p_header_data += l_ST;
-                opj_read_bytes(p_header_data,&l_Ptlm_i,l_Ptlm_size);            // Ptlm_i
-                p_header_data += l_Ptlm_size;
-        }*/
-        return OPJ_TRUE;
+    l_tot_num_tp_remaining = p_header_size % l_quotient;
+
+    if (l_tot_num_tp_remaining != 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading TLM marker\n");
+        return OPJ_FALSE;
+    }
+    /* FIXME Do not care of this at the moment since only local variables are set here */
+    /*
+    for
+            (i = 0; i < l_tot_num_tp; ++i)
+    {
+            opj_read_bytes(p_header_data,&l_Ttlm_i,l_ST);                           // Ttlm_i
+            p_header_data += l_ST;
+            opj_read_bytes(p_header_data,&l_Ptlm_i,l_Ptlm_size);            // Ptlm_i
+            p_header_data += l_Ptlm_size;
+    }*/
+    return OPJ_TRUE;
 }
 
 /**
@@ -3387,66 +3656,69 @@
  * @param       p_header_size   the size of the data contained in the TLM marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_plm (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_plm(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        /* preconditions */
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        if (p_header_size < 1) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
-                return OPJ_FALSE;
-        }
-        /* Do not care of this at the moment since only local variables are set here */
-        /*
-        opj_read_bytes(p_header_data,&l_Zplm,1);                                        // Zplm
-        ++p_header_data;
-        --p_header_size;
+    OPJ_UNUSED(p_j2k);
+    OPJ_UNUSED(p_header_data);
 
-        while
-                (p_header_size > 0)
-        {
-                opj_read_bytes(p_header_data,&l_Nplm,1);                                // Nplm
-                ++p_header_data;
-                p_header_size -= (1+l_Nplm);
-                if
-                        (p_header_size < 0)
-                {
-                        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
-                        return false;
-                }
-                for
-                        (i = 0; i < l_Nplm; ++i)
-                {
-                        opj_read_bytes(p_header_data,&l_tmp,1);                         // Iplm_ij
-                        ++p_header_data;
-                        // take only the last seven bytes
-                        l_packet_len |= (l_tmp & 0x7f);
-                        if
-                                (l_tmp & 0x80)
-                        {
-                                l_packet_len <<= 7;
-                        }
-                        else
-                        {
-                // store packet length and proceed to next packet
-                                l_packet_len = 0;
-                        }
-                }
-                if
-                        (l_packet_len != 0)
-                {
-                        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
-                        return false;
-                }
-        }
-        */
-        return OPJ_TRUE;
+    if (p_header_size < 1) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
+        return OPJ_FALSE;
+    }
+    /* Do not care of this at the moment since only local variables are set here */
+    /*
+    opj_read_bytes(p_header_data,&l_Zplm,1);                                        // Zplm
+    ++p_header_data;
+    --p_header_size;
+
+    while
+            (p_header_size > 0)
+    {
+            opj_read_bytes(p_header_data,&l_Nplm,1);                                // Nplm
+            ++p_header_data;
+            p_header_size -= (1+l_Nplm);
+            if
+                    (p_header_size < 0)
+            {
+                    opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
+                    return false;
+            }
+            for
+                    (i = 0; i < l_Nplm; ++i)
+            {
+                    opj_read_bytes(p_header_data,&l_tmp,1);                         // Iplm_ij
+                    ++p_header_data;
+                    // take only the last seven bytes
+                    l_packet_len |= (l_tmp & 0x7f);
+                    if
+                            (l_tmp & 0x80)
+                    {
+                            l_packet_len <<= 7;
+                    }
+                    else
+                    {
+            // store packet length and proceed to next packet
+                            l_packet_len = 0;
+                    }
+            }
+            if
+                    (l_packet_len != 0)
+            {
+                    opj_event_msg(p_manager, EVT_ERROR, "Error reading PLM marker\n");
+                    return false;
+            }
+    }
+    */
+    return OPJ_TRUE;
 }
 
 /**
@@ -3457,48 +3729,49 @@
  * @param       p_header_size   the size of the data contained in the PLT marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_plt (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_plt(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        OPJ_UINT32 l_Zplt, l_tmp, l_packet_len = 0, i;
+    OPJ_UINT32 l_Zplt, l_tmp, l_packet_len = 0, i;
 
-        /* preconditions */
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        if (p_header_size < 1) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
-                return OPJ_FALSE;
-        }
+    OPJ_UNUSED(p_j2k);
 
-        opj_read_bytes(p_header_data,&l_Zplt,1);                /* Zplt */
+    if (p_header_size < 1) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
+        return OPJ_FALSE;
+    }
+
+    opj_read_bytes(p_header_data, &l_Zplt, 1);              /* Zplt */
+    ++p_header_data;
+    --p_header_size;
+
+    for (i = 0; i < p_header_size; ++i) {
+        opj_read_bytes(p_header_data, &l_tmp, 1);       /* Iplt_ij */
         ++p_header_data;
-        --p_header_size;
-
-        for (i = 0; i < p_header_size; ++i) {
-                opj_read_bytes(p_header_data,&l_tmp,1);         /* Iplt_ij */
-                ++p_header_data;
-                /* take only the last seven bytes */
-                l_packet_len |= (l_tmp & 0x7f);
-                if (l_tmp & 0x80) {
-                        l_packet_len <<= 7;
-                }
-                else {
+        /* take only the last seven bytes */
+        l_packet_len |= (l_tmp & 0x7f);
+        if (l_tmp & 0x80) {
+            l_packet_len <<= 7;
+        } else {
             /* store packet length and proceed to next packet */
-                        l_packet_len = 0;
-                }
+            l_packet_len = 0;
         }
+    }
 
-        if (l_packet_len != 0) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
-                return OPJ_FALSE;
-        }
+    if (l_packet_len != 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading PLT marker\n");
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /**
@@ -3510,74 +3783,76 @@
  * @param       p_manager               the user event manager.
  */
 
-static OPJ_BOOL opj_j2k_read_ppm (
-																	opj_j2k_t *p_j2k,
-																	OPJ_BYTE * p_header_data,
-																	OPJ_UINT32 p_header_size,
-																	opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_read_ppm(
+    opj_j2k_t *p_j2k,
+    OPJ_BYTE * p_header_data,
+    OPJ_UINT32 p_header_size,
+    opj_event_mgr_t * p_manager)
 {
-	opj_cp_t *l_cp = 00;
-	OPJ_UINT32 l_Z_ppm;
-	
-	/* preconditions */
-	assert(p_header_data != 00);
-	assert(p_j2k != 00);
-	assert(p_manager != 00);
-	
-	/* We need to have the Z_ppm element + 1 byte of Nppm/Ippm at minimum */
-	if (p_header_size < 2) {
-		opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
-		return OPJ_FALSE;
-	}
-	
-	l_cp = &(p_j2k->m_cp);
-	l_cp->ppm = 1;
-	
-	opj_read_bytes(p_header_data,&l_Z_ppm,1);               /* Z_ppm */
-	++p_header_data;
-	--p_header_size;
-	
-	/* check allocation needed */
-	if (l_cp->ppm_markers == NULL) { /* first PPM marker */
-		OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
-		assert(l_cp->ppm_markers_count == 0U);
-		
-		l_cp->ppm_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
-		if (l_cp->ppm_markers == NULL) {
-			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
-			return OPJ_FALSE;
-		}
-		l_cp->ppm_markers_count = l_newCount;
-	} else if (l_cp->ppm_markers_count <= l_Z_ppm) {
-		OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
-		opj_ppx *new_ppm_markers;
-		new_ppm_markers = (opj_ppx *) opj_realloc(l_cp->ppm_markers, l_newCount * sizeof(opj_ppx));
-		if (new_ppm_markers == NULL) {
-			/* clean up to be done on l_cp destruction */
-			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
-			return OPJ_FALSE;
-		}
-		l_cp->ppm_markers = new_ppm_markers;
-		memset(l_cp->ppm_markers + l_cp->ppm_markers_count, 0, (l_newCount - l_cp->ppm_markers_count) * sizeof(opj_ppx));
-		l_cp->ppm_markers_count = l_newCount;
-	}
-	
-	if (l_cp->ppm_markers[l_Z_ppm].m_data != NULL) {
-		/* clean up to be done on l_cp destruction */
-		opj_event_msg(p_manager, EVT_ERROR, "Zppm %u already read\n", l_Z_ppm);
-		return OPJ_FALSE;
-	}
-	
-	l_cp->ppm_markers[l_Z_ppm].m_data = opj_malloc(p_header_size);
-	if (l_cp->ppm_markers[l_Z_ppm].m_data == NULL) {
-		/* clean up to be done on l_cp destruction */
-		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
-		return OPJ_FALSE;
-	}
-	l_cp->ppm_markers[l_Z_ppm].m_data_size = p_header_size;
-	memcpy(l_cp->ppm_markers[l_Z_ppm].m_data, p_header_data, p_header_size);
+    opj_cp_t *l_cp = 00;
+    OPJ_UINT32 l_Z_ppm;
 
-	return OPJ_TRUE;
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+
+    /* We need to have the Z_ppm element + 1 byte of Nppm/Ippm at minimum */
+    if (p_header_size < 2) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n");
+        return OPJ_FALSE;
+    }
+
+    l_cp = &(p_j2k->m_cp);
+    l_cp->ppm = 1;
+
+    opj_read_bytes(p_header_data, &l_Z_ppm, 1);             /* Z_ppm */
+    ++p_header_data;
+    --p_header_size;
+
+    /* check allocation needed */
+    if (l_cp->ppm_markers == NULL) { /* first PPM marker */
+        OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
+        assert(l_cp->ppm_markers_count == 0U);
+
+        l_cp->ppm_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
+        if (l_cp->ppm_markers == NULL) {
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
+            return OPJ_FALSE;
+        }
+        l_cp->ppm_markers_count = l_newCount;
+    } else if (l_cp->ppm_markers_count <= l_Z_ppm) {
+        OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */
+        opj_ppx *new_ppm_markers;
+        new_ppm_markers = (opj_ppx *) opj_realloc(l_cp->ppm_markers,
+                          l_newCount * sizeof(opj_ppx));
+        if (new_ppm_markers == NULL) {
+            /* clean up to be done on l_cp destruction */
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
+            return OPJ_FALSE;
+        }
+        l_cp->ppm_markers = new_ppm_markers;
+        memset(l_cp->ppm_markers + l_cp->ppm_markers_count, 0,
+               (l_newCount - l_cp->ppm_markers_count) * sizeof(opj_ppx));
+        l_cp->ppm_markers_count = l_newCount;
+    }
+
+    if (l_cp->ppm_markers[l_Z_ppm].m_data != NULL) {
+        /* clean up to be done on l_cp destruction */
+        opj_event_msg(p_manager, EVT_ERROR, "Zppm %u already read\n", l_Z_ppm);
+        return OPJ_FALSE;
+    }
+
+    l_cp->ppm_markers[l_Z_ppm].m_data = (OPJ_BYTE *) opj_malloc(p_header_size);
+    if (l_cp->ppm_markers[l_Z_ppm].m_data == NULL) {
+        /* clean up to be done on l_cp destruction */
+        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
+        return OPJ_FALSE;
+    }
+    l_cp->ppm_markers[l_Z_ppm].m_data_size = p_header_size;
+    memcpy(l_cp->ppm_markers[l_Z_ppm].m_data, p_header_data, p_header_size);
+
+    return OPJ_TRUE;
 }
 
 /**
@@ -3586,135 +3861,136 @@
  * @param       p_cp      main coding parameters.
  * @param       p_manager the user event manager.
  */
-static OPJ_BOOL opj_j2k_merge_ppm ( opj_cp_t *p_cp, opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_merge_ppm(opj_cp_t *p_cp, opj_event_mgr_t * p_manager)
 {
-	OPJ_UINT32 i, l_ppm_data_size, l_N_ppm_remaining;
-	
-	/* preconditions */
-	assert(p_cp != 00);
-	assert(p_manager != 00);
-	assert(p_cp->ppm_buffer == NULL);
-	
-	if (p_cp->ppm == 0U) {
-		return OPJ_TRUE;
-	}
-	
-	l_ppm_data_size = 0U;
-	l_N_ppm_remaining = 0U;
-	for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
-		if (p_cp->ppm_markers[i].m_data != NULL) { /* standard doesn't seem to require contiguous Zppm */
-			OPJ_UINT32 l_N_ppm;
-			OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
-			const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
-			
-			if (l_N_ppm_remaining >= l_data_size) {
-				l_N_ppm_remaining -= l_data_size;
-				l_data_size = 0U;
-			} else {
-				l_data += l_N_ppm_remaining;
-				l_data_size -= l_N_ppm_remaining;
-				l_N_ppm_remaining = 0U;
-			}
-			
-			if (l_data_size > 0U) {
-				do
-				{
-					/* read Nppm */
-					if (l_data_size < 4U) {
-						/* clean up to be done on l_cp destruction */
-						opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n");
-						return OPJ_FALSE;
-					}
-					opj_read_bytes(l_data, &l_N_ppm, 4);
-					l_data+=4;
-					l_data_size-=4;
-					l_ppm_data_size += l_N_ppm; /* can't overflow, max 256 markers of max 65536 bytes, that is when PPM markers are not corrupted which is checked elsewhere */
-					
-					if (l_data_size >= l_N_ppm) {
-						l_data_size -= l_N_ppm;
-						l_data += l_N_ppm;
-					} else {
-						l_N_ppm_remaining = l_N_ppm - l_data_size;
-						l_data_size = 0U;
-					}
-				} while (l_data_size > 0U);
-			}
-		}
-	}
-	
-	if (l_N_ppm_remaining != 0U) {
-		/* clean up to be done on l_cp destruction */
-		opj_event_msg(p_manager, EVT_ERROR, "Corrupted PPM markers\n");
-		return OPJ_FALSE;
-	}
-	
-	p_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_ppm_data_size);
-	if (p_cp->ppm_buffer == 00) {
-		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
-		return OPJ_FALSE;
-	}
-	p_cp->ppm_len = l_ppm_data_size;
-	l_ppm_data_size = 0U;
-	l_N_ppm_remaining = 0U;
-	for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
-		if (p_cp->ppm_markers[i].m_data != NULL) { /* standard doesn't seem to require contiguous Zppm */
-			OPJ_UINT32 l_N_ppm;
-			OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
-			const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
-			
-			if (l_N_ppm_remaining >= l_data_size) {
-				memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
-				l_ppm_data_size += l_data_size;
-				l_N_ppm_remaining -= l_data_size;
-				l_data_size = 0U;
-			} else {
-				memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm_remaining);
-				l_ppm_data_size += l_N_ppm_remaining;
-				l_data += l_N_ppm_remaining;
-				l_data_size -= l_N_ppm_remaining;
-				l_N_ppm_remaining = 0U;
-			}
+    OPJ_UINT32 i, l_ppm_data_size, l_N_ppm_remaining;
 
-			if (l_data_size > 0U) {
-				do
-				{
-					/* read Nppm */
-					if (l_data_size < 4U) {
-						/* clean up to be done on l_cp destruction */
-						opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n");
-						return OPJ_FALSE;
-					}
-					opj_read_bytes(l_data, &l_N_ppm, 4);
-					l_data+=4;
-					l_data_size-=4;
-					
-					if (l_data_size >= l_N_ppm) {
-						memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm);
-						l_ppm_data_size += l_N_ppm;
-						l_data_size -= l_N_ppm;
-						l_data += l_N_ppm;
-					} else {
-						memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
-						l_ppm_data_size += l_data_size;
-						l_N_ppm_remaining = l_N_ppm - l_data_size;
-						l_data_size = 0U;
-					}
-				} while (l_data_size > 0U);
-			}
-			opj_free(p_cp->ppm_markers[i].m_data);
-			p_cp->ppm_markers[i].m_data = NULL;
-			p_cp->ppm_markers[i].m_data_size = 0U;
-		}
-	}
-	
-	p_cp->ppm_data = p_cp->ppm_buffer;
-	p_cp->ppm_data_size = p_cp->ppm_len;
-	
-	p_cp->ppm_markers_count = 0U;
-	opj_free(p_cp->ppm_markers);
-	p_cp->ppm_markers = NULL;
-	
-	return OPJ_TRUE;
+    /* preconditions */
+    assert(p_cp != 00);
+    assert(p_manager != 00);
+    assert(p_cp->ppm_buffer == NULL);
+
+    if (p_cp->ppm == 0U) {
+        return OPJ_TRUE;
+    }
+
+    l_ppm_data_size = 0U;
+    l_N_ppm_remaining = 0U;
+    for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
+        if (p_cp->ppm_markers[i].m_data !=
+                NULL) { /* standard doesn't seem to require contiguous Zppm */
+            OPJ_UINT32 l_N_ppm;
+            OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
+            const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
+
+            if (l_N_ppm_remaining >= l_data_size) {
+                l_N_ppm_remaining -= l_data_size;
+                l_data_size = 0U;
+            } else {
+                l_data += l_N_ppm_remaining;
+                l_data_size -= l_N_ppm_remaining;
+                l_N_ppm_remaining = 0U;
+            }
+
+            if (l_data_size > 0U) {
+                do {
+                    /* read Nppm */
+                    if (l_data_size < 4U) {
+                        /* clean up to be done on l_cp destruction */
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n");
+                        return OPJ_FALSE;
+                    }
+                    opj_read_bytes(l_data, &l_N_ppm, 4);
+                    l_data += 4;
+                    l_data_size -= 4;
+                    l_ppm_data_size +=
+                        l_N_ppm; /* can't overflow, max 256 markers of max 65536 bytes, that is when PPM markers are not corrupted which is checked elsewhere */
+
+                    if (l_data_size >= l_N_ppm) {
+                        l_data_size -= l_N_ppm;
+                        l_data += l_N_ppm;
+                    } else {
+                        l_N_ppm_remaining = l_N_ppm - l_data_size;
+                        l_data_size = 0U;
+                    }
+                } while (l_data_size > 0U);
+            }
+        }
+    }
+
+    if (l_N_ppm_remaining != 0U) {
+        /* clean up to be done on l_cp destruction */
+        opj_event_msg(p_manager, EVT_ERROR, "Corrupted PPM markers\n");
+        return OPJ_FALSE;
+    }
+
+    p_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_ppm_data_size);
+    if (p_cp->ppm_buffer == 00) {
+        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n");
+        return OPJ_FALSE;
+    }
+    p_cp->ppm_len = l_ppm_data_size;
+    l_ppm_data_size = 0U;
+    l_N_ppm_remaining = 0U;
+    for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
+        if (p_cp->ppm_markers[i].m_data !=
+                NULL) { /* standard doesn't seem to require contiguous Zppm */
+            OPJ_UINT32 l_N_ppm;
+            OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size;
+            const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data;
+
+            if (l_N_ppm_remaining >= l_data_size) {
+                memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
+                l_ppm_data_size += l_data_size;
+                l_N_ppm_remaining -= l_data_size;
+                l_data_size = 0U;
+            } else {
+                memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm_remaining);
+                l_ppm_data_size += l_N_ppm_remaining;
+                l_data += l_N_ppm_remaining;
+                l_data_size -= l_N_ppm_remaining;
+                l_N_ppm_remaining = 0U;
+            }
+
+            if (l_data_size > 0U) {
+                do {
+                    /* read Nppm */
+                    if (l_data_size < 4U) {
+                        /* clean up to be done on l_cp destruction */
+                        opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n");
+                        return OPJ_FALSE;
+                    }
+                    opj_read_bytes(l_data, &l_N_ppm, 4);
+                    l_data += 4;
+                    l_data_size -= 4;
+
+                    if (l_data_size >= l_N_ppm) {
+                        memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm);
+                        l_ppm_data_size += l_N_ppm;
+                        l_data_size -= l_N_ppm;
+                        l_data += l_N_ppm;
+                    } else {
+                        memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size);
+                        l_ppm_data_size += l_data_size;
+                        l_N_ppm_remaining = l_N_ppm - l_data_size;
+                        l_data_size = 0U;
+                    }
+                } while (l_data_size > 0U);
+            }
+            opj_free(p_cp->ppm_markers[i].m_data);
+            p_cp->ppm_markers[i].m_data = NULL;
+            p_cp->ppm_markers[i].m_data_size = 0U;
+        }
+    }
+
+    p_cp->ppm_data = p_cp->ppm_buffer;
+    p_cp->ppm_data_size = p_cp->ppm_len;
+
+    p_cp->ppm_markers_count = 0U;
+    opj_free(p_cp->ppm_markers);
+    p_cp->ppm_markers = NULL;
+
+    return OPJ_TRUE;
 }
 
 /**
@@ -3725,80 +4001,83 @@
  * @param       p_header_size   the size of the data contained in the PPT marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_ppt (  opj_j2k_t *p_j2k,
-                                    OPJ_BYTE * p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_ppt(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-	opj_cp_t *l_cp = 00;
-	opj_tcp_t *l_tcp = 00;
-	OPJ_UINT32 l_Z_ppt;
+    opj_cp_t *l_cp = 00;
+    opj_tcp_t *l_tcp = 00;
+    OPJ_UINT32 l_Z_ppt;
 
-	/* preconditions */
-	assert(p_header_data != 00);
-	assert(p_j2k != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-	/* We need to have the Z_ppt element + 1 byte of Ippt at minimum */
-	if (p_header_size < 2) {
-		opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n");
-		return OPJ_FALSE;
-	}
+    /* We need to have the Z_ppt element + 1 byte of Ippt at minimum */
+    if (p_header_size < 2) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n");
+        return OPJ_FALSE;
+    }
 
-	l_cp = &(p_j2k->m_cp);
-	if (l_cp->ppm){
-		opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker: packet header have been previously found in the main header (PPM marker).\n");
-		return OPJ_FALSE;
-	}
+    l_cp = &(p_j2k->m_cp);
+    if (l_cp->ppm) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Error reading PPT marker: packet header have been previously found in the main header (PPM marker).\n");
+        return OPJ_FALSE;
+    }
 
-	l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]);
-	l_tcp->ppt = 1;
+    l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]);
+    l_tcp->ppt = 1;
 
-	opj_read_bytes(p_header_data,&l_Z_ppt,1);               /* Z_ppt */
-	++p_header_data;
-	--p_header_size;
-	
-	/* check allocation needed */
-	if (l_tcp->ppt_markers == NULL) { /* first PPT marker */
-		OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
-		assert(l_tcp->ppt_markers_count == 0U);
-		
-		l_tcp->ppt_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
-		if (l_tcp->ppt_markers == NULL) {
-			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
-			return OPJ_FALSE;
-		}
-		l_tcp->ppt_markers_count = l_newCount;
-	} else if (l_tcp->ppt_markers_count <= l_Z_ppt) {
-		OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
-		opj_ppx *new_ppt_markers;
-		new_ppt_markers = (opj_ppx *) opj_realloc(l_tcp->ppt_markers, l_newCount * sizeof(opj_ppx));
-		if (new_ppt_markers == NULL) {
-			/* clean up to be done on l_tcp destruction */
-			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
-			return OPJ_FALSE;
-		}
-		l_tcp->ppt_markers = new_ppt_markers;
-		memset(l_tcp->ppt_markers + l_tcp->ppt_markers_count, 0, (l_newCount - l_tcp->ppt_markers_count) * sizeof(opj_ppx));
-		l_tcp->ppt_markers_count = l_newCount;
-	}
-	
-	if (l_tcp->ppt_markers[l_Z_ppt].m_data != NULL) {
-		/* clean up to be done on l_tcp destruction */
-		opj_event_msg(p_manager, EVT_ERROR, "Zppt %u already read\n", l_Z_ppt);
-		return OPJ_FALSE;
-	}
-	
-	l_tcp->ppt_markers[l_Z_ppt].m_data = opj_malloc(p_header_size);
-	if (l_tcp->ppt_markers[l_Z_ppt].m_data == NULL) {
-		/* clean up to be done on l_tcp destruction */
-		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
-		return OPJ_FALSE;
-	}
-	l_tcp->ppt_markers[l_Z_ppt].m_data_size = p_header_size;
-	memcpy(l_tcp->ppt_markers[l_Z_ppt].m_data, p_header_data, p_header_size);
-	return OPJ_TRUE;
+    opj_read_bytes(p_header_data, &l_Z_ppt, 1);             /* Z_ppt */
+    ++p_header_data;
+    --p_header_size;
+
+    /* check allocation needed */
+    if (l_tcp->ppt_markers == NULL) { /* first PPT marker */
+        OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
+        assert(l_tcp->ppt_markers_count == 0U);
+
+        l_tcp->ppt_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx));
+        if (l_tcp->ppt_markers == NULL) {
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
+            return OPJ_FALSE;
+        }
+        l_tcp->ppt_markers_count = l_newCount;
+    } else if (l_tcp->ppt_markers_count <= l_Z_ppt) {
+        OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */
+        opj_ppx *new_ppt_markers;
+        new_ppt_markers = (opj_ppx *) opj_realloc(l_tcp->ppt_markers,
+                          l_newCount * sizeof(opj_ppx));
+        if (new_ppt_markers == NULL) {
+            /* clean up to be done on l_tcp destruction */
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
+            return OPJ_FALSE;
+        }
+        l_tcp->ppt_markers = new_ppt_markers;
+        memset(l_tcp->ppt_markers + l_tcp->ppt_markers_count, 0,
+               (l_newCount - l_tcp->ppt_markers_count) * sizeof(opj_ppx));
+        l_tcp->ppt_markers_count = l_newCount;
+    }
+
+    if (l_tcp->ppt_markers[l_Z_ppt].m_data != NULL) {
+        /* clean up to be done on l_tcp destruction */
+        opj_event_msg(p_manager, EVT_ERROR, "Zppt %u already read\n", l_Z_ppt);
+        return OPJ_FALSE;
+    }
+
+    l_tcp->ppt_markers[l_Z_ppt].m_data = (OPJ_BYTE *) opj_malloc(p_header_size);
+    if (l_tcp->ppt_markers[l_Z_ppt].m_data == NULL) {
+        /* clean up to be done on l_tcp destruction */
+        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
+        return OPJ_FALSE;
+    }
+    l_tcp->ppt_markers[l_Z_ppt].m_data_size = p_header_size;
+    memcpy(l_tcp->ppt_markers[l_Z_ppt].m_data, p_header_data, p_header_size);
+    return OPJ_TRUE;
 }
 
 /**
@@ -3809,713 +4088,820 @@
  */
 static OPJ_BOOL opj_j2k_merge_ppt(opj_tcp_t *p_tcp, opj_event_mgr_t * p_manager)
 {
-	OPJ_UINT32 i, l_ppt_data_size;
-	/* preconditions */
-	assert(p_tcp != 00);
-	assert(p_manager != 00);
-	assert(p_tcp->ppt_buffer == NULL);
-	
-	if (p_tcp->ppt == 0U) {
-		return OPJ_TRUE;
-	}
-	
-	l_ppt_data_size = 0U;
-	for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
-		l_ppt_data_size += p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
-	}
-	
-	p_tcp->ppt_buffer = (OPJ_BYTE *) opj_malloc(l_ppt_data_size);
-	if (p_tcp->ppt_buffer == 00) {
-		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
-		return OPJ_FALSE;
-	}
-	p_tcp->ppt_len = l_ppt_data_size;
-	l_ppt_data_size = 0U;
-	for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
-		if (p_tcp->ppt_markers[i].m_data != NULL) { /* standard doesn't seem to require contiguous Zppt */
-			memcpy(p_tcp->ppt_buffer + l_ppt_data_size, p_tcp->ppt_markers[i].m_data, p_tcp->ppt_markers[i].m_data_size);
-			l_ppt_data_size += p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
-			
-			opj_free(p_tcp->ppt_markers[i].m_data);
-			p_tcp->ppt_markers[i].m_data = NULL;
-			p_tcp->ppt_markers[i].m_data_size = 0U;
-		}
-	}
-	
-	p_tcp->ppt_markers_count = 0U;
-	opj_free(p_tcp->ppt_markers);
-	p_tcp->ppt_markers = NULL;
-	
-	p_tcp->ppt_data = p_tcp->ppt_buffer;
-	p_tcp->ppt_data_size = p_tcp->ppt_len;
-	return OPJ_TRUE;
-}
+    OPJ_UINT32 i, l_ppt_data_size;
+    /* preconditions */
+    assert(p_tcp != 00);
+    assert(p_manager != 00);
+    assert(p_tcp->ppt_buffer == NULL);
 
-static OPJ_BOOL opj_j2k_write_tlm(     opj_j2k_t *p_j2k,
-                                                        opj_stream_private_t *p_stream,
-                                                        opj_event_mgr_t * p_manager
-                            )
-{
-        OPJ_BYTE * l_current_data = 00;
-        OPJ_UINT32 l_tlm_size;
-
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
-
-        l_tlm_size = 6 + (5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
-
-        if (l_tlm_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
-                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size);
-                if (! new_header_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write TLM marker\n");
-                        return OPJ_FALSE;
-                }
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_tlm_size;
-        }
-
-        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
-
-        /* change the way data is written to avoid seeking if possible */
-        /* TODO */
-        p_j2k->m_specific_param.m_encoder.m_tlm_start = opj_stream_tell(p_stream);
-
-        opj_write_bytes(l_current_data,J2K_MS_TLM,2);                                   /* TLM */
-        l_current_data += 2;
-
-        opj_write_bytes(l_current_data,l_tlm_size-2,2);                                 /* Lpoc */
-        l_current_data += 2;
-
-        opj_write_bytes(l_current_data,0,1);                                                    /* Ztlm=0*/
-        ++l_current_data;
-
-        opj_write_bytes(l_current_data,0x50,1);                                                 /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */
-        ++l_current_data;
-
-        /* do nothing on the 5 * l_j2k->m_specific_param.m_encoder.m_total_tile_parts remaining data */
-        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_tlm_size,p_manager) != l_tlm_size) {
-                return OPJ_FALSE;
-        }
-
+    if (p_tcp->ppt == 0U) {
         return OPJ_TRUE;
+    }
+
+    l_ppt_data_size = 0U;
+    for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
+        l_ppt_data_size +=
+            p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
+    }
+
+    p_tcp->ppt_buffer = (OPJ_BYTE *) opj_malloc(l_ppt_data_size);
+    if (p_tcp->ppt_buffer == 00) {
+        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n");
+        return OPJ_FALSE;
+    }
+    p_tcp->ppt_len = l_ppt_data_size;
+    l_ppt_data_size = 0U;
+    for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
+        if (p_tcp->ppt_markers[i].m_data !=
+                NULL) { /* standard doesn't seem to require contiguous Zppt */
+            memcpy(p_tcp->ppt_buffer + l_ppt_data_size, p_tcp->ppt_markers[i].m_data,
+                   p_tcp->ppt_markers[i].m_data_size);
+            l_ppt_data_size +=
+                p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */
+
+            opj_free(p_tcp->ppt_markers[i].m_data);
+            p_tcp->ppt_markers[i].m_data = NULL;
+            p_tcp->ppt_markers[i].m_data_size = 0U;
+        }
+    }
+
+    p_tcp->ppt_markers_count = 0U;
+    opj_free(p_tcp->ppt_markers);
+    p_tcp->ppt_markers = NULL;
+
+    p_tcp->ppt_data = p_tcp->ppt_buffer;
+    p_tcp->ppt_data_size = p_tcp->ppt_len;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_sot(     opj_j2k_t *p_j2k,
-                                                        OPJ_BYTE * p_data,
-                                                        OPJ_UINT32 * p_data_written,
-                                                        const opj_stream_private_t *p_stream,
-                                                        opj_event_mgr_t * p_manager
-                            )
+static OPJ_BOOL opj_j2k_write_tlm(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    OPJ_BYTE * l_current_data = 00;
+    OPJ_UINT32 l_tlm_size;
 
-        opj_write_bytes(p_data,J2K_MS_SOT,2);                                   /* SOT */
-        p_data += 2;
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        opj_write_bytes(p_data,10,2);                                                   /* Lsot */
-        p_data += 2;
+    l_tlm_size = 6 + (5 * p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
 
-        opj_write_bytes(p_data, p_j2k->m_current_tile_number,2);                        /* Isot */
-        p_data += 2;
+    if (l_tlm_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
+                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size);
+        if (! new_header_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write TLM marker\n");
+            return OPJ_FALSE;
+        }
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_tlm_size;
+    }
 
-        /* Psot  */
-        p_data += 4;
+    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
 
-        opj_write_bytes(p_data, p_j2k->m_specific_param.m_encoder.m_current_tile_part_number,1);                        /* TPsot */
-        ++p_data;
+    /* change the way data is written to avoid seeking if possible */
+    /* TODO */
+    p_j2k->m_specific_param.m_encoder.m_tlm_start = opj_stream_tell(p_stream);
 
-        opj_write_bytes(p_data, p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts,1);                      /* TNsot */
-        ++p_data;
+    opj_write_bytes(l_current_data, J2K_MS_TLM,
+                    2);                                   /* TLM */
+    l_current_data += 2;
 
-        /* UniPG>> */
+    opj_write_bytes(l_current_data, l_tlm_size - 2,
+                    2);                                 /* Lpoc */
+    l_current_data += 2;
+
+    opj_write_bytes(l_current_data, 0,
+                    1);                                                    /* Ztlm=0*/
+    ++l_current_data;
+
+    opj_write_bytes(l_current_data, 0x50,
+                    1);                                                 /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */
+    ++l_current_data;
+
+    /* do nothing on the 5 * l_j2k->m_specific_param.m_encoder.m_total_tile_parts remaining data */
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_tlm_size,
+                              p_manager) != l_tlm_size) {
+        return OPJ_FALSE;
+    }
+
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_j2k_write_sot(opj_j2k_t *p_j2k,
+                                  OPJ_BYTE * p_data,
+                                  OPJ_UINT32 * p_data_written,
+                                  const opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager
+                                 )
+{
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
+
+    OPJ_UNUSED(p_stream);
+    OPJ_UNUSED(p_manager);
+
+    opj_write_bytes(p_data, J2K_MS_SOT,
+                    2);                                 /* SOT */
+    p_data += 2;
+
+    opj_write_bytes(p_data, 10,
+                    2);                                                   /* Lsot */
+    p_data += 2;
+
+    opj_write_bytes(p_data, p_j2k->m_current_tile_number,
+                    2);                        /* Isot */
+    p_data += 2;
+
+    /* Psot  */
+    p_data += 4;
+
+    opj_write_bytes(p_data,
+                    p_j2k->m_specific_param.m_encoder.m_current_tile_part_number,
+                    1);                        /* TPsot */
+    ++p_data;
+
+    opj_write_bytes(p_data,
+                    p_j2k->m_cp.tcps[p_j2k->m_current_tile_number].m_nb_tile_parts,
+                    1);                      /* TNsot */
+    ++p_data;
+
+    /* UniPG>> */
 #ifdef USE_JPWL
-        /* update markers struct */
-/*
-        OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOT, p_j2k->sot_start, len + 2);
-*/
-  assert( 0 && "TODO" );
+    /* update markers struct */
+    /*
+            OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOT, p_j2k->sot_start, len + 2);
+    */
+    assert(0 && "TODO");
 #endif /* USE_JPWL */
 
-        * p_data_written = 12;
+    * p_data_written = 12;
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 static OPJ_BOOL opj_j2k_get_sot_values(OPJ_BYTE *  p_header_data,
-																			 OPJ_UINT32  p_header_size,
-																			 OPJ_UINT32* p_tile_no,
-																			 OPJ_UINT32* p_tot_len,
-																			 OPJ_UINT32* p_current_part,
-																			 OPJ_UINT32* p_num_parts,
-																			 opj_event_mgr_t * p_manager )
+                                       OPJ_UINT32  p_header_size,
+                                       OPJ_UINT32* p_tile_no,
+                                       OPJ_UINT32* p_tot_len,
+                                       OPJ_UINT32* p_current_part,
+                                       OPJ_UINT32* p_num_parts,
+                                       opj_event_mgr_t * p_manager)
 {
-	/* preconditions */
-	assert(p_header_data != 00);
-	assert(p_manager != 00);
-	
-	/* Size of this marker is fixed = 12 (we have already read marker and its size)*/
-	if (p_header_size != 8) {
-		opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
-		return OPJ_FALSE;
-	}
-	
-	opj_read_bytes(p_header_data,p_tile_no,2);      /* Isot */
-	p_header_data+=2;
-	opj_read_bytes(p_header_data,p_tot_len,4);      /* Psot */
-	p_header_data+=4;
-	opj_read_bytes(p_header_data,p_current_part,1); /* TPsot */
-	++p_header_data;
-	opj_read_bytes(p_header_data,p_num_parts ,1);   /* TNsot */
-	++p_header_data;
-	return OPJ_TRUE;
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_manager != 00);
+
+    /* Size of this marker is fixed = 12 (we have already read marker and its size)*/
+    if (p_header_size != 8) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
+        return OPJ_FALSE;
+    }
+
+    opj_read_bytes(p_header_data, p_tile_no, 2);    /* Isot */
+    p_header_data += 2;
+    opj_read_bytes(p_header_data, p_tot_len, 4);    /* Psot */
+    p_header_data += 4;
+    opj_read_bytes(p_header_data, p_current_part, 1); /* TPsot */
+    ++p_header_data;
+    opj_read_bytes(p_header_data, p_num_parts, 1);  /* TNsot */
+    ++p_header_data;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k,
-                            OPJ_BYTE * p_header_data,
-                            OPJ_UINT32 p_header_size,
-                            opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_read_sot(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager)
 {
-        opj_cp_t *l_cp = 00;
-        opj_tcp_t *l_tcp = 00;
-        OPJ_UINT32 l_tot_len, l_num_parts = 0;
-        OPJ_UINT32 l_current_part;
-        OPJ_UINT32 l_tile_x,l_tile_y;
+    opj_cp_t *l_cp = 00;
+    opj_tcp_t *l_tcp = 00;
+    OPJ_UINT32 l_tot_len, l_num_parts = 0;
+    OPJ_UINT32 l_current_part;
+    OPJ_UINT32 l_tile_x, l_tile_y;
 
-        /* preconditions */
-	
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-	
-        if (! opj_j2k_get_sot_values(p_header_data, p_header_size, &(p_j2k->m_current_tile_number), &l_tot_len, &l_current_part, &l_num_parts, p_manager)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
-                return OPJ_FALSE;
-        }
+    /* preconditions */
 
-        l_cp = &(p_j2k->m_cp);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        /* testcase 2.pdf.SIGFPE.706.1112 */
-        if (p_j2k->m_current_tile_number >= l_cp->tw * l_cp->th) {
-                opj_event_msg(p_manager, EVT_ERROR, "Invalid tile number %d\n", p_j2k->m_current_tile_number);
-                return OPJ_FALSE;
-        }
+    if (! opj_j2k_get_sot_values(p_header_data, p_header_size,
+                                 &(p_j2k->m_current_tile_number), &l_tot_len, &l_current_part, &l_num_parts,
+                                 p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n");
+        return OPJ_FALSE;
+    }
 
-        l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
-        l_tile_x = p_j2k->m_current_tile_number % l_cp->tw;
-        l_tile_y = p_j2k->m_current_tile_number / l_cp->tw;
+    l_cp = &(p_j2k->m_cp);
+
+    /* testcase 2.pdf.SIGFPE.706.1112 */
+    if (p_j2k->m_current_tile_number >= l_cp->tw * l_cp->th) {
+        opj_event_msg(p_manager, EVT_ERROR, "Invalid tile number %d\n",
+                      p_j2k->m_current_tile_number);
+        return OPJ_FALSE;
+    }
+
+    l_tcp = &l_cp->tcps[p_j2k->m_current_tile_number];
+    l_tile_x = p_j2k->m_current_tile_number % l_cp->tw;
+    l_tile_y = p_j2k->m_current_tile_number / l_cp->tw;
+
+    /* Fixes issue with id_000020,sig_06,src_001958,op_flip4,pos_149 */
+    /* of https://github.com/uclouvain/openjpeg/issues/939 */
+    /* We must avoid reading twice the same tile part number for a given tile */
+    /* so as to avoid various issues, like opj_j2k_merge_ppt being called */
+    /* several times. */
+    /* ISO 15444-1 A.4.2 Start of tile-part (SOT) mandates that tile parts */
+    /* should appear in increasing order. */
+    if (l_tcp->m_current_tile_part_number + 1 != (OPJ_INT32)l_current_part) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Invalid tile part index for tile number %d. "
+                      "Got %d, expected %d\n",
+                      p_j2k->m_current_tile_number,
+                      l_current_part,
+                      l_tcp->m_current_tile_part_number + 1);
+        return OPJ_FALSE;
+    }
+    ++ l_tcp->m_current_tile_part_number;
 
 #ifdef USE_JPWL
-        if (l_cp->correct) {
+    if (l_cp->correct) {
 
-                OPJ_UINT32 tileno = p_j2k->m_current_tile_number;
-                static OPJ_UINT32 backup_tileno = 0;
+        OPJ_UINT32 tileno = p_j2k->m_current_tile_number;
+        static OPJ_UINT32 backup_tileno = 0;
 
-                /* tileno is negative or larger than the number of tiles!!! */
-                if (tileno > (l_cp->tw * l_cp->th)) {
+        /* tileno is negative or larger than the number of tiles!!! */
+        if (tileno > (l_cp->tw * l_cp->th)) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "JPWL: bad tile number (%d out of a maximum of %d)\n",
+                          tileno, (l_cp->tw * l_cp->th));
+            if (!JPWL_ASSUME) {
+                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                return OPJ_FALSE;
+            }
+            /* we try to correct */
+            tileno = backup_tileno;
+            opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
+                          "- setting tile number to %d\n",
+                          tileno);
+        }
+
+        /* keep your private count of tiles */
+        backup_tileno++;
+    };
+#endif /* USE_JPWL */
+
+    /* look for the tile in the list of already processed tile (in parts). */
+    /* Optimization possible here with a more complex data structure and with the removing of tiles */
+    /* since the time taken by this function can only grow at the time */
+
+    /* PSot should be equal to zero or >=14 or <= 2^32-1 */
+    if ((l_tot_len != 0) && (l_tot_len < 14)) {
+        if (l_tot_len ==
+                12) { /* MSD: Special case for the PHR data which are read by kakadu*/
+            opj_event_msg(p_manager, EVT_WARNING, "Empty SOT marker detected: Psot=%d.\n",
+                          l_tot_len);
+        } else {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Psot value is not correct regards to the JPEG2000 norm: %d.\n", l_tot_len);
+            return OPJ_FALSE;
+        }
+    }
+
+#ifdef USE_JPWL
+    if (l_cp->correct) {
+
+        /* totlen is negative or larger than the bytes left!!! */
+        if (/*(l_tot_len < 0) ||*/ (l_tot_len >
+                                    p_header_size)) {   /* FIXME it seems correct; for info in V1 -> (p_stream_numbytesleft(p_stream) + 8))) { */
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
+                          l_tot_len,
+                          p_header_size);  /* FIXME it seems correct; for info in V1 -> p_stream_numbytesleft(p_stream) + 8); */
+            if (!JPWL_ASSUME) {
+                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                return OPJ_FALSE;
+            }
+            /* we try to correct */
+            l_tot_len = 0;
+            opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
+                          "- setting Psot to %d => assuming it is the last tile\n",
+                          l_tot_len);
+        }
+    };
+#endif /* USE_JPWL */
+
+    /* Ref A.4.2: Psot could be equal zero if it is the last tile-part of the codestream.*/
+    if (!l_tot_len) {
+        opj_event_msg(p_manager, EVT_INFO,
+                      "Psot value of the current tile-part is equal to zero, "
+                      "we assuming it is the last tile-part of the codestream.\n");
+        p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
+    }
+
+    if (l_tcp->m_nb_tile_parts != 0 && l_current_part >= l_tcp->m_nb_tile_parts) {
+        /* Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2851 */
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "In SOT marker, TPSot (%d) is not valid regards to the previous "
+                      "number of tile-part (%d), giving up\n", l_current_part,
+                      l_tcp->m_nb_tile_parts);
+        p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
+        return OPJ_FALSE;
+    }
+
+    if (l_num_parts !=
+            0) { /* Number of tile-part header is provided by this tile-part header */
+        l_num_parts += p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction;
+        /* Useful to manage the case of textGBR.jp2 file because two values of TNSot are allowed: the correct numbers of
+         * tile-parts for that tile and zero (A.4.2 of 15444-1 : 2002). */
+        if (l_tcp->m_nb_tile_parts) {
+            if (l_current_part >= l_tcp->m_nb_tile_parts) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "In SOT marker, TPSot (%d) is not valid regards to the current "
+                              "number of tile-part (%d), giving up\n", l_current_part,
+                              l_tcp->m_nb_tile_parts);
+                p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
+                return OPJ_FALSE;
+            }
+        }
+        if (l_current_part >= l_num_parts) {
+            /* testcase 451.pdf.SIGSEGV.ce9.3723 */
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "In SOT marker, TPSot (%d) is not valid regards to the current "
+                          "number of tile-part (header) (%d), giving up\n", l_current_part, l_num_parts);
+            p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
+            return OPJ_FALSE;
+        }
+        l_tcp->m_nb_tile_parts = l_num_parts;
+    }
+
+    /* If know the number of tile part header we will check if we didn't read the last*/
+    if (l_tcp->m_nb_tile_parts) {
+        if (l_tcp->m_nb_tile_parts == (l_current_part + 1)) {
+            p_j2k->m_specific_param.m_decoder.m_can_decode =
+                1; /* Process the last tile-part header*/
+        }
+    }
+
+    if (!p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
+        /* Keep the size of data to skip after this marker */
+        p_j2k->m_specific_param.m_decoder.m_sot_length = l_tot_len -
+                12; /* SOT_marker_size = 12 */
+    } else {
+        /* FIXME: need to be computed from the number of bytes remaining in the codestream */
+        p_j2k->m_specific_param.m_decoder.m_sot_length = 0;
+    }
+
+    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPH;
+
+    /* Check if the current tile is outside the area we want decode or not corresponding to the tile index*/
+    if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec == -1) {
+        p_j2k->m_specific_param.m_decoder.m_skip_data =
+            (l_tile_x < p_j2k->m_specific_param.m_decoder.m_start_tile_x)
+            || (l_tile_x >= p_j2k->m_specific_param.m_decoder.m_end_tile_x)
+            || (l_tile_y < p_j2k->m_specific_param.m_decoder.m_start_tile_y)
+            || (l_tile_y >= p_j2k->m_specific_param.m_decoder.m_end_tile_y);
+    } else {
+        assert(p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec >= 0);
+        p_j2k->m_specific_param.m_decoder.m_skip_data =
+            (p_j2k->m_current_tile_number != (OPJ_UINT32)
+             p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec);
+    }
+
+    /* Index */
+    if (p_j2k->cstr_index) {
+        assert(p_j2k->cstr_index->tile_index != 00);
+        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tileno =
+            p_j2k->m_current_tile_number;
+        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno =
+            l_current_part;
+
+        if (l_num_parts != 0) {
+            p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps =
+                l_num_parts;
+            p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps =
+                l_num_parts;
+
+            if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
+                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
+                    (opj_tp_index_t*)opj_calloc(l_num_parts, sizeof(opj_tp_index_t));
+                if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
+                    opj_event_msg(p_manager, EVT_ERROR,
+                                  "Not enough memory to read SOT marker. Tile index allocation failed\n");
+                    return OPJ_FALSE;
+                }
+            } else {
+                opj_tp_index_t *new_tp_index = (opj_tp_index_t *) opj_realloc(
+                                                   p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
+                                                   l_num_parts * sizeof(opj_tp_index_t));
+                if (! new_tp_index) {
+                    opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
+                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
+                    opj_event_msg(p_manager, EVT_ERROR,
+                                  "Not enough memory to read SOT marker. Tile index allocation failed\n");
+                    return OPJ_FALSE;
+                }
+                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
+                    new_tp_index;
+            }
+        } else {
+            /*if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index)*/ {
+
+                if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
+                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 10;
+                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
+                        (opj_tp_index_t*)opj_calloc(
+                            p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps,
+                            sizeof(opj_tp_index_t));
+                    if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
+                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
                         opj_event_msg(p_manager, EVT_ERROR,
-                                        "JPWL: bad tile number (%d out of a maximum of %d)\n",
-                                        tileno, (l_cp->tw * l_cp->th));
-                        if (!JPWL_ASSUME) {
-                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
-                                return OPJ_FALSE;
-                        }
-                        /* we try to correct */
-                        tileno = backup_tileno;
-                        opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
-                                        "- setting tile number to %d\n",
-                                        tileno);
-                }
-
-                /* keep your private count of tiles */
-                backup_tileno++;
-        };
-#endif /* USE_JPWL */
-
-        /* look for the tile in the list of already processed tile (in parts). */
-        /* Optimization possible here with a more complex data structure and with the removing of tiles */
-        /* since the time taken by this function can only grow at the time */
-
-        /* PSot should be equal to zero or >=14 or <= 2^32-1 */
-        if ((l_tot_len !=0 ) && (l_tot_len < 14) )
-        {
-            if (l_tot_len == 12 ) /* MSD: Special case for the PHR data which are read by kakadu*/
-            {
-                opj_event_msg(p_manager, EVT_WARNING, "Empty SOT marker detected: Psot=%d.\n", l_tot_len);
-            }
-            else
-            {
-                opj_event_msg(p_manager, EVT_ERROR, "Psot value is not correct regards to the JPEG2000 norm: %d.\n", l_tot_len);
-                return OPJ_FALSE;
-            }
-        }
-
-#ifdef USE_JPWL
-        if (l_cp->correct) {
-
-                /* totlen is negative or larger than the bytes left!!! */
-                if (/*(l_tot_len < 0) ||*/ (l_tot_len > p_header_size ) ) { /* FIXME it seems correct; for info in V1 -> (p_stream_numbytesleft(p_stream) + 8))) { */
-                        opj_event_msg(p_manager, EVT_ERROR,
-                                        "JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
-                                        l_tot_len, p_header_size ); /* FIXME it seems correct; for info in V1 -> p_stream_numbytesleft(p_stream) + 8); */
-                        if (!JPWL_ASSUME) {
-                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
-                                return OPJ_FALSE;
-                        }
-                        /* we try to correct */
-                        l_tot_len = 0;
-                        opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust this\n"
-                                        "- setting Psot to %d => assuming it is the last tile\n",
-                                        l_tot_len);
-                }
-                };
-#endif /* USE_JPWL */
-
-                /* Ref A.4.2: Psot could be equal zero if it is the last tile-part of the codestream.*/
-                if (!l_tot_len) {
-                        opj_event_msg(p_manager, EVT_INFO, "Psot value of the current tile-part is equal to zero, "
-                                        "we assuming it is the last tile-part of the codestream.\n");
-                        p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
-                }
-
-                if (l_num_parts != 0) { /* Number of tile-part header is provided by this tile-part header */
-                        l_num_parts += p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction;
-                        /* Useful to manage the case of textGBR.jp2 file because two values of TNSot are allowed: the correct numbers of
-                         * tile-parts for that tile and zero (A.4.2 of 15444-1 : 2002). */
-                        if (l_tcp->m_nb_tile_parts) {
-                                if (l_current_part >= l_tcp->m_nb_tile_parts){
-                                        opj_event_msg(p_manager, EVT_ERROR, "In SOT marker, TPSot (%d) is not valid regards to the current "
-                                                        "number of tile-part (%d), giving up\n", l_current_part, l_tcp->m_nb_tile_parts );
-                                        p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
-                                        return OPJ_FALSE;
-                                }
-                        }
-                        if( l_current_part >= l_num_parts ) {
-                          /* testcase 451.pdf.SIGSEGV.ce9.3723 */
-                          opj_event_msg(p_manager, EVT_ERROR, "In SOT marker, TPSot (%d) is not valid regards to the current "
-                            "number of tile-part (header) (%d), giving up\n", l_current_part, l_num_parts );
-                          p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1;
-                          return OPJ_FALSE;
-                        }
-                        l_tcp->m_nb_tile_parts = l_num_parts;
-                }
-
-                /* If know the number of tile part header we will check if we didn't read the last*/
-                if (l_tcp->m_nb_tile_parts) {
-                        if (l_tcp->m_nb_tile_parts == (l_current_part+1)) {
-                                p_j2k->m_specific_param.m_decoder.m_can_decode = 1; /* Process the last tile-part header*/
-                        }
-                }
-
-                if (!p_j2k->m_specific_param.m_decoder.m_last_tile_part){
-                        /* Keep the size of data to skip after this marker */
-                        p_j2k->m_specific_param.m_decoder.m_sot_length = l_tot_len - 12; /* SOT_marker_size = 12 */
-                }
-                else {
-                        /* FIXME: need to be computed from the number of bytes remaining in the codestream */
-                        p_j2k->m_specific_param.m_decoder.m_sot_length = 0;
-                }
-
-                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPH;
-
-                /* Check if the current tile is outside the area we want decode or not corresponding to the tile index*/
-                if (p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec == -1) {
-                        p_j2k->m_specific_param.m_decoder.m_skip_data =
-                                (l_tile_x < p_j2k->m_specific_param.m_decoder.m_start_tile_x)
-                                ||      (l_tile_x >= p_j2k->m_specific_param.m_decoder.m_end_tile_x)
-                                ||  (l_tile_y < p_j2k->m_specific_param.m_decoder.m_start_tile_y)
-                                ||      (l_tile_y >= p_j2k->m_specific_param.m_decoder.m_end_tile_y);
-                }
-                else {
-                        assert( p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec >= 0 );
-                        p_j2k->m_specific_param.m_decoder.m_skip_data =
-                                (p_j2k->m_current_tile_number != (OPJ_UINT32)p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec);
-                }
-
-                /* Index */
-                if (p_j2k->cstr_index)
-                {
-                        assert(p_j2k->cstr_index->tile_index != 00);
-                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;
-                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno = l_current_part;
-
-                        if (l_num_parts != 0){
-                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].nb_tps = l_num_parts;
-                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = l_num_parts;
-
-                                if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
-                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
-                                                (opj_tp_index_t*)opj_calloc(l_num_parts, sizeof(opj_tp_index_t));
-                                        if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
-                                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read SOT marker. Tile index allocation failed\n");
-                                                return OPJ_FALSE;
-																				}
-                                }
-                                else {
-                                        opj_tp_index_t *new_tp_index = (opj_tp_index_t *) opj_realloc(
-                                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index, l_num_parts* sizeof(opj_tp_index_t));
-                                        if (! new_tp_index) {
-                                                opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
-                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
-                                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read SOT marker. Tile index allocation failed\n");
-                                                return OPJ_FALSE;
-                                        }
-                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = new_tp_index;
-                                }
-                        }
-                        else{
-                                /*if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index)*/ {
-
-                                        if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
-                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 10;
-                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
-                                                        (opj_tp_index_t*)opj_calloc( p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps,
-                                                                        sizeof(opj_tp_index_t));
-																								if (!p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index) {
-                                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
-                                                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read SOT marker. Tile index allocation failed\n");
-                                                        return OPJ_FALSE;
-																				        }
-                                        }
-
-                                        if ( l_current_part >= p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps ){
-                                                opj_tp_index_t *new_tp_index;
-                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = l_current_part + 1;
-                                                new_tp_index = (opj_tp_index_t *) opj_realloc(
-                                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
-                                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps * sizeof(opj_tp_index_t));
-                                                if (! new_tp_index) {
-                                                        opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
-                                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
-                                                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
-                                                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read SOT marker. Tile index allocation failed\n");
-                                                        return OPJ_FALSE;
-                                                }
-                                                p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = new_tp_index;
-                                        }
-                                }
-
-                        }
-
-                }
-
-                /* FIXME move this onto a separate method to call before reading any SOT, remove part about main_end header, use a index struct inside p_j2k */
-                /* if (p_j2k->cstr_info) {
-                   if (l_tcp->first) {
-                   if (tileno == 0) {
-                   p_j2k->cstr_info->main_head_end = p_stream_tell(p_stream) - 13;
-                   }
-
-                   p_j2k->cstr_info->tile[tileno].tileno = tileno;
-                   p_j2k->cstr_info->tile[tileno].start_pos = p_stream_tell(p_stream) - 12;
-                   p_j2k->cstr_info->tile[tileno].end_pos = p_j2k->cstr_info->tile[tileno].start_pos + totlen - 1;
-                   p_j2k->cstr_info->tile[tileno].num_tps = numparts;
-
-                   if (numparts) {
-                   p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t));
-                   }
-                   else {
-                   p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10)
-                   }
-                   }
-                   else {
-                   p_j2k->cstr_info->tile[tileno].end_pos += totlen;
-                   }
-
-                   p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = p_stream_tell(p_stream) - 12;
-                   p_j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos =
-                   p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1;
-                   }*/
-                return OPJ_TRUE;
-        }
-
-static OPJ_BOOL opj_j2k_write_sod(     opj_j2k_t *p_j2k,
-                                                        opj_tcd_t * p_tile_coder,
-                                                        OPJ_BYTE * p_data,
-                                                        OPJ_UINT32 * p_data_written,
-                                                        OPJ_UINT32 p_total_data_size,
-                                                        const opj_stream_private_t *p_stream,
-                                                        opj_event_mgr_t * p_manager
-                            )
-{
-        opj_codestream_info_t *l_cstr_info = 00;
-        OPJ_UINT32 l_remaining_data;
-
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
-
-        opj_write_bytes(p_data,J2K_MS_SOD,2);                                   /* SOD */
-        p_data += 2;
-
-        /* make room for the EOF marker */
-        l_remaining_data =  p_total_data_size - 4;
-
-        /* update tile coder */
-        p_tile_coder->tp_num = p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number ;
-        p_tile_coder->cur_tp_num = p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
-
-         /* INDEX >> */
-        /* TODO mergeV2: check this part which use cstr_info */
-        /*l_cstr_info = p_j2k->cstr_info;
-        if (l_cstr_info) {
-                if (!p_j2k->m_specific_param.m_encoder.m_current_tile_part_number ) {
-                        //TODO cstr_info->tile[p_j2k->m_current_tile_number].end_header = p_stream_tell(p_stream) + p_j2k->pos_correction - 1;
-                        l_cstr_info->tile[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;
-                }
-                else {*/
-                        /*
-                        TODO
-                        if
-                                (cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno - 1].end_pos < p_stream_tell(p_stream))
-                        {
-                                cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno].start_pos = p_stream_tell(p_stream);
-                        }*/
-                /*}*/
-                /* UniPG>> */
-#ifdef USE_JPWL
-                /* update markers struct */
-                /*OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOD, p_j2k->sod_start, 2);
-*/
-  assert( 0 && "TODO" );
-#endif /* USE_JPWL */
-                /* <<UniPG */
-        /*}*/
-        /* << INDEX */
-
-        if (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0) {
-                p_tile_coder->tcd_image->tiles->packno = 0;
-                if (l_cstr_info) {
-                        l_cstr_info->packno = 0;
-                }
-        }
-
-        *p_data_written = 0;
-
-        if (! opj_tcd_encode_tile(p_tile_coder, p_j2k->m_current_tile_number, p_data, p_data_written, l_remaining_data , l_cstr_info)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Cannot encode tile\n");
-                return OPJ_FALSE;
-        }
-
-        *p_data_written += 2;
-
-        return OPJ_TRUE;
-}
-
-static OPJ_BOOL opj_j2k_read_sod (opj_j2k_t *p_j2k,
-                           opj_stream_private_t *p_stream,
-                                                   opj_event_mgr_t * p_manager
-                           )
-{
-        OPJ_SIZE_T l_current_read_size;
-        opj_codestream_index_t * l_cstr_index = 00;
-        OPJ_BYTE ** l_current_data = 00;
-        opj_tcp_t * l_tcp = 00;
-        OPJ_UINT32 * l_tile_len = 00;
-        OPJ_BOOL l_sot_length_pb_detected = OPJ_FALSE;
-
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
-
-        l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
-
-        if (p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
-                /* opj_stream_get_number_byte_left returns OPJ_OFF_T
-                // but we are in the last tile part,
-                // so its result will fit on OPJ_UINT32 unless we find
-                // a file with a single tile part of more than 4 GB...*/
-                p_j2k->m_specific_param.m_decoder.m_sot_length = (OPJ_UINT32)(opj_stream_get_number_byte_left(p_stream) - 2);
-        }
-        else {
-            /* Check to avoid pass the limit of OPJ_UINT32 */
-            if (p_j2k->m_specific_param.m_decoder.m_sot_length >= 2 )
-                p_j2k->m_specific_param.m_decoder.m_sot_length -= 2;
-            else {
-                /* MSD: case commented to support empty SOT marker (PHR data) */
-            }
-        }
-
-        l_current_data = &(l_tcp->m_data);
-        l_tile_len = &l_tcp->m_data_size;
-
-        /* Patch to support new PHR data */
-        if (p_j2k->m_specific_param.m_decoder.m_sot_length) {
-            /* If we are here, we'll try to read the data after allocation */
-            /* Check enough bytes left in stream before allocation */
-            if ((OPJ_OFF_T)p_j2k->m_specific_param.m_decoder.m_sot_length > opj_stream_get_number_byte_left(p_stream)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Tile part length size inconsistent with stream length\n");
-                return OPJ_FALSE;
-            }
-            if (! *l_current_data) {
-                /* LH: oddly enough, in this path, l_tile_len!=0.
-                 * TODO: If this was consistent, we could simplify the code to only use realloc(), as realloc(0,...) default to malloc(0,...).
-                 */
-                *l_current_data = (OPJ_BYTE*) opj_malloc(p_j2k->m_specific_param.m_decoder.m_sot_length);
-            }
-            else {
-                OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(*l_current_data, *l_tile_len + p_j2k->m_specific_param.m_decoder.m_sot_length);
-                if (! l_new_current_data) {
-                        opj_free(*l_current_data);
-                        /*nothing more is done as l_current_data will be set to null, and just
-                          afterward we enter in the error path
-                          and the actual tile_len is updated (committed) at the end of the
-                          function. */
-                }
-                *l_current_data = l_new_current_data;
-            }
-            
-            if (*l_current_data == 00) {
-                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile\n");
-                return OPJ_FALSE;
-            }
-        }
-        else {
-            l_sot_length_pb_detected = OPJ_TRUE;
-        }
-
-        /* Index */
-        l_cstr_index = p_j2k->cstr_index;
-        if (l_cstr_index) {
-                OPJ_OFF_T l_current_pos = opj_stream_tell(p_stream) - 2;
-
-                OPJ_UINT32 l_current_tile_part = l_cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno;
-                l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_header =
-                                l_current_pos;
-                l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_pos =
-                                l_current_pos + p_j2k->m_specific_param.m_decoder.m_sot_length + 2;
-
-                if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
-                                        l_cstr_index,
-                                        J2K_MS_SOD,
-                                        l_current_pos,
-                                        p_j2k->m_specific_param.m_decoder.m_sot_length + 2)) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
+                                      "Not enough memory to read SOT marker. Tile index allocation failed\n");
                         return OPJ_FALSE;
+                    }
                 }
 
-                /*l_cstr_index->packno = 0;*/
+                if (l_current_part >=
+                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps) {
+                    opj_tp_index_t *new_tp_index;
+                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps =
+                        l_current_part + 1;
+                    new_tp_index = (opj_tp_index_t *) opj_realloc(
+                                       p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index,
+                                       p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps *
+                                       sizeof(opj_tp_index_t));
+                    if (! new_tp_index) {
+                        opj_free(p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index);
+                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index = NULL;
+                        p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].current_nb_tps = 0;
+                        opj_event_msg(p_manager, EVT_ERROR,
+                                      "Not enough memory to read SOT marker. Tile index allocation failed\n");
+                        return OPJ_FALSE;
+                    }
+                    p_j2k->cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index =
+                        new_tp_index;
+                }
+            }
+
         }
 
-        /* Patch to support new PHR data */
-        if (!l_sot_length_pb_detected) {
-            l_current_read_size = opj_stream_read_data(
-                        p_stream,
-                        *l_current_data + *l_tile_len,
-                        p_j2k->m_specific_param.m_decoder.m_sot_length,
-                        p_manager);
+    }
+
+    /* FIXME move this onto a separate method to call before reading any SOT, remove part about main_end header, use a index struct inside p_j2k */
+    /* if (p_j2k->cstr_info) {
+       if (l_tcp->first) {
+       if (tileno == 0) {
+       p_j2k->cstr_info->main_head_end = p_stream_tell(p_stream) - 13;
+       }
+
+       p_j2k->cstr_info->tile[tileno].tileno = tileno;
+       p_j2k->cstr_info->tile[tileno].start_pos = p_stream_tell(p_stream) - 12;
+       p_j2k->cstr_info->tile[tileno].end_pos = p_j2k->cstr_info->tile[tileno].start_pos + totlen - 1;
+       p_j2k->cstr_info->tile[tileno].num_tps = numparts;
+
+       if (numparts) {
+       p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t));
+       }
+       else {
+       p_j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10)
+       }
+       }
+       else {
+       p_j2k->cstr_info->tile[tileno].end_pos += totlen;
+       }
+
+       p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = p_stream_tell(p_stream) - 12;
+       p_j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos =
+       p_j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1;
+       }*/
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_j2k_write_sod(opj_j2k_t *p_j2k,
+                                  opj_tcd_t * p_tile_coder,
+                                  OPJ_BYTE * p_data,
+                                  OPJ_UINT32 * p_data_written,
+                                  OPJ_UINT32 p_total_data_size,
+                                  const opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager
+                                 )
+{
+    opj_codestream_info_t *l_cstr_info = 00;
+    OPJ_UINT32 l_remaining_data;
+
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
+
+    OPJ_UNUSED(p_stream);
+
+    opj_write_bytes(p_data, J2K_MS_SOD,
+                    2);                                 /* SOD */
+    p_data += 2;
+
+    /* make room for the EOF marker */
+    l_remaining_data =  p_total_data_size - 4;
+
+    /* update tile coder */
+    p_tile_coder->tp_num =
+        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number ;
+    p_tile_coder->cur_tp_num =
+        p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
+
+    /* INDEX >> */
+    /* TODO mergeV2: check this part which use cstr_info */
+    /*l_cstr_info = p_j2k->cstr_info;
+    if (l_cstr_info) {
+            if (!p_j2k->m_specific_param.m_encoder.m_current_tile_part_number ) {
+                    //TODO cstr_info->tile[p_j2k->m_current_tile_number].end_header = p_stream_tell(p_stream) + p_j2k->pos_correction - 1;
+                    l_cstr_info->tile[p_j2k->m_current_tile_number].tileno = p_j2k->m_current_tile_number;
+            }
+            else {*/
+    /*
+    TODO
+    if
+            (cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno - 1].end_pos < p_stream_tell(p_stream))
+    {
+            cstr_info->tile[p_j2k->m_current_tile_number].packet[cstr_info->packno].start_pos = p_stream_tell(p_stream);
+    }*/
+    /*}*/
+    /* UniPG>> */
+#ifdef USE_JPWL
+    /* update markers struct */
+    /*OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_SOD, p_j2k->sod_start, 2);
+    */
+    assert(0 && "TODO");
+#endif /* USE_JPWL */
+    /* <<UniPG */
+    /*}*/
+    /* << INDEX */
+
+    if (p_j2k->m_specific_param.m_encoder.m_current_tile_part_number == 0) {
+        p_tile_coder->tcd_image->tiles->packno = 0;
+        if (l_cstr_info) {
+            l_cstr_info->packno = 0;
         }
-        else
-        {
-            l_current_read_size = 0;
+    }
+
+    *p_data_written = 0;
+
+    if (! opj_tcd_encode_tile(p_tile_coder, p_j2k->m_current_tile_number, p_data,
+                              p_data_written, l_remaining_data, l_cstr_info)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Cannot encode tile\n");
+        return OPJ_FALSE;
+    }
+
+    *p_data_written += 2;
+
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_j2k_read_sod(opj_j2k_t *p_j2k,
+                                 opj_stream_private_t *p_stream,
+                                 opj_event_mgr_t * p_manager
+                                )
+{
+    OPJ_SIZE_T l_current_read_size;
+    opj_codestream_index_t * l_cstr_index = 00;
+    OPJ_BYTE ** l_current_data = 00;
+    opj_tcp_t * l_tcp = 00;
+    OPJ_UINT32 * l_tile_len = 00;
+    OPJ_BOOL l_sot_length_pb_detected = OPJ_FALSE;
+
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
+
+    l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
+
+    if (p_j2k->m_specific_param.m_decoder.m_last_tile_part) {
+        /* opj_stream_get_number_byte_left returns OPJ_OFF_T
+        // but we are in the last tile part,
+        // so its result will fit on OPJ_UINT32 unless we find
+        // a file with a single tile part of more than 4 GB...*/
+        p_j2k->m_specific_param.m_decoder.m_sot_length = (OPJ_UINT32)(
+                    opj_stream_get_number_byte_left(p_stream) - 2);
+    } else {
+        /* Check to avoid pass the limit of OPJ_UINT32 */
+        if (p_j2k->m_specific_param.m_decoder.m_sot_length >= 2) {
+            p_j2k->m_specific_param.m_decoder.m_sot_length -= 2;
+        } else {
+            /* MSD: case commented to support empty SOT marker (PHR data) */
+        }
+    }
+
+    l_current_data = &(l_tcp->m_data);
+    l_tile_len = &l_tcp->m_data_size;
+
+    /* Patch to support new PHR data */
+    if (p_j2k->m_specific_param.m_decoder.m_sot_length) {
+        /* If we are here, we'll try to read the data after allocation */
+        /* Check enough bytes left in stream before allocation */
+        if ((OPJ_OFF_T)p_j2k->m_specific_param.m_decoder.m_sot_length >
+                opj_stream_get_number_byte_left(p_stream)) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Tile part length size inconsistent with stream length\n");
+            return OPJ_FALSE;
+        }
+        if (p_j2k->m_specific_param.m_decoder.m_sot_length >
+                UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "p_j2k->m_specific_param.m_decoder.m_sot_length > "
+                          "UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA");
+            return OPJ_FALSE;
+        }
+        /* Add a margin of OPJ_COMMON_CBLK_DATA_EXTRA to the allocation we */
+        /* do so that opj_mqc_init_dec_common() can safely add a synthetic */
+        /* 0xFFFF marker. */
+        if (! *l_current_data) {
+            /* LH: oddly enough, in this path, l_tile_len!=0.
+             * TODO: If this was consistent, we could simplify the code to only use realloc(), as realloc(0,...) default to malloc(0,...).
+             */
+            *l_current_data = (OPJ_BYTE*) opj_malloc(
+                                  p_j2k->m_specific_param.m_decoder.m_sot_length + OPJ_COMMON_CBLK_DATA_EXTRA);
+        } else {
+            OPJ_BYTE *l_new_current_data;
+            if (*l_tile_len > UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA -
+                    p_j2k->m_specific_param.m_decoder.m_sot_length) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "*l_tile_len > UINT_MAX - OPJ_COMMON_CBLK_DATA_EXTRA - "
+                              "p_j2k->m_specific_param.m_decoder.m_sot_length");
+                return OPJ_FALSE;
+            }
+
+            l_new_current_data = (OPJ_BYTE *) opj_realloc(*l_current_data,
+                                 *l_tile_len + p_j2k->m_specific_param.m_decoder.m_sot_length +
+                                 OPJ_COMMON_CBLK_DATA_EXTRA);
+            if (! l_new_current_data) {
+                opj_free(*l_current_data);
+                /*nothing more is done as l_current_data will be set to null, and just
+                  afterward we enter in the error path
+                  and the actual tile_len is updated (committed) at the end of the
+                  function. */
+            }
+            *l_current_data = l_new_current_data;
         }
 
-        if (l_current_read_size != p_j2k->m_specific_param.m_decoder.m_sot_length) {
-                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
+        if (*l_current_data == 00) {
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile\n");
+            return OPJ_FALSE;
         }
-        else {
-                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+    } else {
+        l_sot_length_pb_detected = OPJ_TRUE;
+    }
+
+    /* Index */
+    l_cstr_index = p_j2k->cstr_index;
+    if (l_cstr_index) {
+        OPJ_OFF_T l_current_pos = opj_stream_tell(p_stream) - 2;
+
+        OPJ_UINT32 l_current_tile_part =
+            l_cstr_index->tile_index[p_j2k->m_current_tile_number].current_tpsno;
+        l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_header
+            =
+                l_current_pos;
+        l_cstr_index->tile_index[p_j2k->m_current_tile_number].tp_index[l_current_tile_part].end_pos
+            =
+                l_current_pos + p_j2k->m_specific_param.m_decoder.m_sot_length + 2;
+
+        if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
+                                              l_cstr_index,
+                                              J2K_MS_SOD,
+                                              l_current_pos,
+                                              p_j2k->m_specific_param.m_decoder.m_sot_length + 2)) {
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
+            return OPJ_FALSE;
         }
 
-        *l_tile_len += (OPJ_UINT32)l_current_read_size;
+        /*l_cstr_index->packno = 0;*/
+    }
 
-        return OPJ_TRUE;
+    /* Patch to support new PHR data */
+    if (!l_sot_length_pb_detected) {
+        l_current_read_size = opj_stream_read_data(
+                                  p_stream,
+                                  *l_current_data + *l_tile_len,
+                                  p_j2k->m_specific_param.m_decoder.m_sot_length,
+                                  p_manager);
+    } else {
+        l_current_read_size = 0;
+    }
+
+    if (l_current_read_size != p_j2k->m_specific_param.m_decoder.m_sot_length) {
+        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
+    } else {
+        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+    }
+
+    *l_tile_len += (OPJ_UINT32)l_current_read_size;
+
+    return OPJ_TRUE;
 }
 
 static OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k,
-                            OPJ_UINT32 p_tile_no,
-                            OPJ_UINT32 p_comp_no,
-                            OPJ_UINT32 nb_comps,
-                            opj_stream_private_t *p_stream,
-                            opj_event_mgr_t * p_manager
-                            )
+                                  OPJ_UINT32 p_tile_no,
+                                  OPJ_UINT32 p_comp_no,
+                                  OPJ_UINT32 nb_comps,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-        OPJ_BYTE * l_current_data = 00;
-        OPJ_UINT32 l_rgn_size;
-        opj_cp_t *l_cp = 00;
-        opj_tcp_t *l_tcp = 00;
-        opj_tccp_t *l_tccp = 00;
-        OPJ_UINT32 l_comp_room;
+    OPJ_BYTE * l_current_data = 00;
+    OPJ_UINT32 l_rgn_size;
+    opj_cp_t *l_cp = 00;
+    opj_tcp_t *l_tcp = 00;
+    opj_tccp_t *l_tccp = 00;
+    OPJ_UINT32 l_comp_room;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = &l_cp->tcps[p_tile_no];
-        l_tccp = &l_tcp->tccps[p_comp_no];
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = &l_cp->tcps[p_tile_no];
+    l_tccp = &l_tcp->tccps[p_comp_no];
 
-        if (nb_comps <= 256) {
-                l_comp_room = 1;
-        }
-        else {
-                l_comp_room = 2;
-        }
+    if (nb_comps <= 256) {
+        l_comp_room = 1;
+    } else {
+        l_comp_room = 2;
+    }
 
-        l_rgn_size = 6 + l_comp_room;
+    l_rgn_size = 6 + l_comp_room;
 
-        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
 
-        opj_write_bytes(l_current_data,J2K_MS_RGN,2);                                   /* RGN  */
-        l_current_data += 2;
+    opj_write_bytes(l_current_data, J2K_MS_RGN,
+                    2);                                   /* RGN  */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,l_rgn_size-2,2);                                 /* Lrgn */
-        l_current_data += 2;
+    opj_write_bytes(l_current_data, l_rgn_size - 2,
+                    2);                                 /* Lrgn */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,p_comp_no,l_comp_room);                          /* Crgn */
-        l_current_data+=l_comp_room;
+    opj_write_bytes(l_current_data, p_comp_no,
+                    l_comp_room);                          /* Crgn */
+    l_current_data += l_comp_room;
 
-        opj_write_bytes(l_current_data, 0,1);                                           /* Srgn */
-        ++l_current_data;
+    opj_write_bytes(l_current_data, 0,
+                    1);                                           /* Srgn */
+    ++l_current_data;
 
-        opj_write_bytes(l_current_data, (OPJ_UINT32)l_tccp->roishift,1);                            /* SPrgn */
-        ++l_current_data;
+    opj_write_bytes(l_current_data, (OPJ_UINT32)l_tccp->roishift,
+                    1);                            /* SPrgn */
+    ++l_current_data;
 
-        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_rgn_size,p_manager) != l_rgn_size) {
-                return OPJ_FALSE;
-        }
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_rgn_size,
+                              p_manager) != l_rgn_size) {
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_eoc(     opj_j2k_t *p_j2k,
-                            opj_stream_private_t *p_stream,
-                            opj_event_mgr_t * p_manager
-                            )
+static OPJ_BOOL opj_j2k_write_eoc(opj_j2k_t *p_j2k,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_header_tile_data,J2K_MS_EOC,2);                                     /* EOC */
+    opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_header_tile_data,
+                    J2K_MS_EOC, 2);                                    /* EOC */
 
-/* UniPG>> */
+    /* UniPG>> */
 #ifdef USE_JPWL
-        /* update markers struct */
-        /*
-        OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_EOC, p_stream_tell(p_stream) - 2, 2);
-*/
+    /* update markers struct */
+    /*
+    OPJ_BOOL res = j2k_add_marker(p_j2k->cstr_info, J2K_MS_EOC, p_stream_tell(p_stream) - 2, 2);
+    */
 #endif /* USE_JPWL */
 
-        if ( opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,2,p_manager) != 2) {
-                return OPJ_FALSE;
-        }
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, 2, p_manager) != 2) {
+        return OPJ_FALSE;
+    }
 
-        if ( ! opj_stream_flush(p_stream,p_manager) ) {
-                return OPJ_FALSE;
-        }
+    if (! opj_stream_flush(p_stream, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /**
@@ -4526,594 +4912,622 @@
  * @param       p_header_size   the size of the data contained in the POC marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_rgn (opj_j2k_t *p_j2k,
-                                  OPJ_BYTE * p_header_data,
-                                  OPJ_UINT32 p_header_size,
-                                  opj_event_mgr_t * p_manager
-                                  )
+static OPJ_BOOL opj_j2k_read_rgn(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        OPJ_UINT32 l_nb_comp;
-        opj_image_t * l_image = 00;
+    OPJ_UINT32 l_nb_comp;
+    opj_image_t * l_image = 00;
 
-        opj_cp_t *l_cp = 00;
-        opj_tcp_t *l_tcp = 00;
-        OPJ_UINT32 l_comp_room, l_comp_no, l_roi_sty;
+    opj_cp_t *l_cp = 00;
+    opj_tcp_t *l_tcp = 00;
+    OPJ_UINT32 l_comp_room, l_comp_no, l_roi_sty;
 
-        /* preconditions*/
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions*/
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_image = p_j2k->m_private_image;
-        l_nb_comp = l_image->numcomps;
+    l_image = p_j2k->m_private_image;
+    l_nb_comp = l_image->numcomps;
 
-        if (l_nb_comp <= 256) {
-                l_comp_room = 1; }
-        else {
-                l_comp_room = 2; }
+    if (l_nb_comp <= 256) {
+        l_comp_room = 1;
+    } else {
+        l_comp_room = 2;
+    }
 
-        if (p_header_size != 2 + l_comp_room) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading RGN marker\n");
-                return OPJ_FALSE;
-        }
+    if (p_header_size != 2 + l_comp_room) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading RGN marker\n");
+        return OPJ_FALSE;
+    }
 
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
-                                &l_cp->tcps[p_j2k->m_current_tile_number] :
-                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
+            &l_cp->tcps[p_j2k->m_current_tile_number] :
+            p_j2k->m_specific_param.m_decoder.m_default_tcp;
 
-        opj_read_bytes(p_header_data,&l_comp_no,l_comp_room);           /* Crgn */
-        p_header_data+=l_comp_room;
-        opj_read_bytes(p_header_data,&l_roi_sty,1);                                     /* Srgn */
-        ++p_header_data;
+    opj_read_bytes(p_header_data, &l_comp_no, l_comp_room);         /* Crgn */
+    p_header_data += l_comp_room;
+    opj_read_bytes(p_header_data, &l_roi_sty,
+                   1);                                     /* Srgn */
+    ++p_header_data;
 
 #ifdef USE_JPWL
-        if (l_cp->correct) {
-                /* totlen is negative or larger than the bytes left!!! */
-                if (l_comp_room >= l_nb_comp) {
-                        opj_event_msg(p_manager, EVT_ERROR,
-                                "JPWL: bad component number in RGN (%d when there are only %d)\n",
-                                l_comp_room, l_nb_comp);
-                        if (!JPWL_ASSUME || JPWL_ASSUME) {
-                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
-                                return OPJ_FALSE;
-                        }
-                }
-        };
+    if (l_cp->correct) {
+        /* totlen is negative or larger than the bytes left!!! */
+        if (l_comp_room >= l_nb_comp) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "JPWL: bad component number in RGN (%d when there are only %d)\n",
+                          l_comp_room, l_nb_comp);
+            if (!JPWL_ASSUME) {
+                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                return OPJ_FALSE;
+            }
+        }
+    };
 #endif /* USE_JPWL */
 
-        /* testcase 3635.pdf.asan.77.2930 */
-        if (l_comp_no >= l_nb_comp) {
-                opj_event_msg(p_manager, EVT_ERROR,
-                        "bad component number in RGN (%d when there are only %d)\n",
-                        l_comp_no, l_nb_comp);
-                return OPJ_FALSE;
-        }
+    /* testcase 3635.pdf.asan.77.2930 */
+    if (l_comp_no >= l_nb_comp) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "bad component number in RGN (%d when there are only %d)\n",
+                      l_comp_no, l_nb_comp);
+        return OPJ_FALSE;
+    }
 
-        opj_read_bytes(p_header_data,(OPJ_UINT32 *) (&(l_tcp->tccps[l_comp_no].roishift)),1);   /* SPrgn */
-        ++p_header_data;
+    opj_read_bytes(p_header_data,
+                   (OPJ_UINT32 *)(&(l_tcp->tccps[l_comp_no].roishift)), 1);  /* SPrgn */
+    ++p_header_data;
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 
 }
 
-static OPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp)
+static OPJ_FLOAT32 opj_j2k_get_tp_stride(opj_tcp_t * p_tcp)
 {
-        return (OPJ_FLOAT32) ((p_tcp->m_nb_tile_parts - 1) * 14);
+    return (OPJ_FLOAT32)((p_tcp->m_nb_tile_parts - 1) * 14);
 }
 
-static OPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp)
+static OPJ_FLOAT32 opj_j2k_get_default_stride(opj_tcp_t * p_tcp)
 {
     (void)p_tcp;
     return 0;
 }
 
-static OPJ_BOOL opj_j2k_update_rates(  opj_j2k_t *p_j2k,
-                                                            opj_stream_private_t *p_stream,
-                                                            opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_update_rates(opj_j2k_t *p_j2k,
+                                     opj_stream_private_t *p_stream,
+                                     opj_event_mgr_t * p_manager)
 {
-        opj_cp_t * l_cp = 00;
-        opj_image_t * l_image = 00;
-        opj_tcp_t * l_tcp = 00;
-        opj_image_comp_t * l_img_comp = 00;
+    opj_cp_t * l_cp = 00;
+    opj_image_t * l_image = 00;
+    opj_tcp_t * l_tcp = 00;
+    opj_image_comp_t * l_img_comp = 00;
 
-        OPJ_UINT32 i,j,k;
-        OPJ_INT32 l_x0,l_y0,l_x1,l_y1;
-        OPJ_FLOAT32 * l_rates = 0;
-        OPJ_FLOAT32 l_sot_remove;
-        OPJ_UINT32 l_bits_empty, l_size_pixel;
-        OPJ_UINT32 l_tile_size = 0;
-        OPJ_UINT32 l_last_res;
-        OPJ_FLOAT32 (* l_tp_stride_func)(opj_tcp_t *) = 00;
+    OPJ_UINT32 i, j, k;
+    OPJ_INT32 l_x0, l_y0, l_x1, l_y1;
+    OPJ_FLOAT32 * l_rates = 0;
+    OPJ_FLOAT32 l_sot_remove;
+    OPJ_UINT32 l_bits_empty, l_size_pixel;
+    OPJ_UINT32 l_tile_size = 0;
+    OPJ_UINT32 l_last_res;
+    OPJ_FLOAT32(* l_tp_stride_func)(opj_tcp_t *) = 00;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        l_cp = &(p_j2k->m_cp);
-        l_image = p_j2k->m_private_image;
-        l_tcp = l_cp->tcps;
+    OPJ_UNUSED(p_manager);
 
-        l_bits_empty = 8 * l_image->comps->dx * l_image->comps->dy;
-        l_size_pixel = l_image->numcomps * l_image->comps->prec;
-        l_sot_remove = (OPJ_FLOAT32) opj_stream_tell(p_stream) / (OPJ_FLOAT32)(l_cp->th * l_cp->tw);
+    l_cp = &(p_j2k->m_cp);
+    l_image = p_j2k->m_private_image;
+    l_tcp = l_cp->tcps;
 
-        if (l_cp->m_specific_param.m_enc.m_tp_on) {
-                l_tp_stride_func = opj_j2k_get_tp_stride;
-        }
-        else {
-                l_tp_stride_func = opj_j2k_get_default_stride;
-        }
+    l_bits_empty = 8 * l_image->comps->dx * l_image->comps->dy;
+    l_size_pixel = l_image->numcomps * l_image->comps->prec;
+    l_sot_remove = (OPJ_FLOAT32) opj_stream_tell(p_stream) / (OPJ_FLOAT32)(
+                       l_cp->th * l_cp->tw);
 
-        for (i=0;i<l_cp->th;++i) {
-                for (j=0;j<l_cp->tw;++j) {
-                        OPJ_FLOAT32 l_offset = (OPJ_FLOAT32)(*l_tp_stride_func)(l_tcp) / (OPJ_FLOAT32)l_tcp->numlayers;
+    if (l_cp->m_specific_param.m_enc.m_tp_on) {
+        l_tp_stride_func = opj_j2k_get_tp_stride;
+    } else {
+        l_tp_stride_func = opj_j2k_get_default_stride;
+    }
 
-                        /* 4 borders of the tile rescale on the image if necessary */
-                        l_x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + j * l_cp->tdx), (OPJ_INT32)l_image->x0);
-                        l_y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + i * l_cp->tdy), (OPJ_INT32)l_image->y0);
-                        l_x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (j + 1) * l_cp->tdx), (OPJ_INT32)l_image->x1);
-                        l_y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (i + 1) * l_cp->tdy), (OPJ_INT32)l_image->y1);
+    for (i = 0; i < l_cp->th; ++i) {
+        for (j = 0; j < l_cp->tw; ++j) {
+            OPJ_FLOAT32 l_offset = (OPJ_FLOAT32)(*l_tp_stride_func)(l_tcp) /
+                                   (OPJ_FLOAT32)l_tcp->numlayers;
 
-                        l_rates = l_tcp->rates;
+            /* 4 borders of the tile rescale on the image if necessary */
+            l_x0 = opj_int_max((OPJ_INT32)(l_cp->tx0 + j * l_cp->tdx),
+                               (OPJ_INT32)l_image->x0);
+            l_y0 = opj_int_max((OPJ_INT32)(l_cp->ty0 + i * l_cp->tdy),
+                               (OPJ_INT32)l_image->y0);
+            l_x1 = opj_int_min((OPJ_INT32)(l_cp->tx0 + (j + 1) * l_cp->tdx),
+                               (OPJ_INT32)l_image->x1);
+            l_y1 = opj_int_min((OPJ_INT32)(l_cp->ty0 + (i + 1) * l_cp->tdy),
+                               (OPJ_INT32)l_image->y1);
 
-                        /* Modification of the RATE >> */
-                        if (*l_rates) {
-                                *l_rates =              (( (OPJ_FLOAT32) (l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) * (OPJ_UINT32)(l_y1 - l_y0)))
-                                                                /
-                                                                ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)
-                                                                )
-                                                                -
-                                                                l_offset;
-                        }
+            l_rates = l_tcp->rates;
 
-                        ++l_rates;
+            /* Modification of the RATE >> */
+            if (*l_rates > 0.0f) {
+                *l_rates = (((OPJ_FLOAT32)(l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) *
+                                           (OPJ_UINT32)(l_y1 - l_y0)))
+                            /
+                            ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)
+                           )
+                           -
+                           l_offset;
+            }
 
-                        for (k = 1; k < l_tcp->numlayers; ++k) {
-                                if (*l_rates) {
-                                        *l_rates =              (( (OPJ_FLOAT32) (l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) * (OPJ_UINT32)(l_y1 - l_y0)))
-                                                                        /
-                                                                                ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)
-                                                                        )
-                                                                        -
-                                                                        l_offset;
-                                }
+            ++l_rates;
 
-                                ++l_rates;
-                        }
-
-                        ++l_tcp;
-
-                }
-        }
-
-        l_tcp = l_cp->tcps;
-
-        for (i=0;i<l_cp->th;++i) {
-                for     (j=0;j<l_cp->tw;++j) {
-                        l_rates = l_tcp->rates;
-
-                        if (*l_rates) {
-                                *l_rates -= l_sot_remove;
-
-                                if (*l_rates < 30) {
-                                        *l_rates = 30;
-                                }
-                        }
-
-                        ++l_rates;
-
-                        l_last_res = l_tcp->numlayers - 1;
-
-                        for (k = 1; k < l_last_res; ++k) {
-
-                                if (*l_rates) {
-                                        *l_rates -= l_sot_remove;
-
-                                        if (*l_rates < *(l_rates - 1) + 10) {
-                                                *l_rates  = (*(l_rates - 1)) + 20;
-                                        }
-                                }
-
-                                ++l_rates;
-                        }
-
-                        if (*l_rates) {
-                                *l_rates -= (l_sot_remove + 2.f);
-
-                                if (*l_rates < *(l_rates - 1) + 10) {
-                                        *l_rates  = (*(l_rates - 1)) + 20;
-                                }
-                        }
-
-                        ++l_tcp;
-                }
-        }
-
-        l_img_comp = l_image->comps;
-        l_tile_size = 0;
-
-        for (i=0;i<l_image->numcomps;++i) {
-                l_tile_size += (        opj_uint_ceildiv(l_cp->tdx,l_img_comp->dx)
-                                                        *
-                                                        opj_uint_ceildiv(l_cp->tdy,l_img_comp->dy)
-                                                        *
-                                                        l_img_comp->prec
-                                                );
-
-                ++l_img_comp;
-        }
-
-        l_tile_size = (OPJ_UINT32) (l_tile_size * 0.1625); /* 1.3/8 = 0.1625 */
-
-        l_tile_size += opj_j2k_get_specific_header_sizes(p_j2k);
-
-        p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = l_tile_size;
-        p_j2k->m_specific_param.m_encoder.m_encoded_tile_data =
-                        (OPJ_BYTE *) opj_malloc(p_j2k->m_specific_param.m_encoder.m_encoded_tile_size);
-        if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data == 00) {
-                return OPJ_FALSE;
-        }
-
-        if (OPJ_IS_CINEMA(l_cp->rsiz)) {
-                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer =
-                                (OPJ_BYTE *) opj_malloc(5*p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
-                if (! p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
-                        return OPJ_FALSE;
+            for (k = 1; k < l_tcp->numlayers; ++k) {
+                if (*l_rates > 0.0f) {
+                    *l_rates = (((OPJ_FLOAT32)(l_size_pixel * (OPJ_UINT32)(l_x1 - l_x0) *
+                                               (OPJ_UINT32)(l_y1 - l_y0)))
+                                /
+                                ((*l_rates) * (OPJ_FLOAT32)l_bits_empty)
+                               )
+                               -
+                               l_offset;
                 }
 
-                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current =
-                                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer;
+                ++l_rates;
+            }
+
+            ++l_tcp;
+
+        }
+    }
+
+    l_tcp = l_cp->tcps;
+
+    for (i = 0; i < l_cp->th; ++i) {
+        for (j = 0; j < l_cp->tw; ++j) {
+            l_rates = l_tcp->rates;
+
+            if (*l_rates > 0.0f) {
+                *l_rates -= l_sot_remove;
+
+                if (*l_rates < 30.0f) {
+                    *l_rates = 30.0f;
+                }
+            }
+
+            ++l_rates;
+
+            l_last_res = l_tcp->numlayers - 1;
+
+            for (k = 1; k < l_last_res; ++k) {
+
+                if (*l_rates > 0.0f) {
+                    *l_rates -= l_sot_remove;
+
+                    if (*l_rates < * (l_rates - 1) + 10.0f) {
+                        *l_rates  = (*(l_rates - 1)) + 20.0f;
+                    }
+                }
+
+                ++l_rates;
+            }
+
+            if (*l_rates > 0.0f) {
+                *l_rates -= (l_sot_remove + 2.f);
+
+                if (*l_rates < * (l_rates - 1) + 10.0f) {
+                    *l_rates  = (*(l_rates - 1)) + 20.0f;
+                }
+            }
+
+            ++l_tcp;
+        }
+    }
+
+    l_img_comp = l_image->comps;
+    l_tile_size = 0;
+
+    for (i = 0; i < l_image->numcomps; ++i) {
+        l_tile_size += (opj_uint_ceildiv(l_cp->tdx, l_img_comp->dx)
+                        *
+                        opj_uint_ceildiv(l_cp->tdy, l_img_comp->dy)
+                        *
+                        l_img_comp->prec
+                       );
+
+        ++l_img_comp;
+    }
+
+    l_tile_size = (OPJ_UINT32)(l_tile_size * 0.1625);  /* 1.3/8 = 0.1625 */
+
+    l_tile_size += opj_j2k_get_specific_header_sizes(p_j2k);
+
+    p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = l_tile_size;
+    p_j2k->m_specific_param.m_encoder.m_encoded_tile_data =
+        (OPJ_BYTE *) opj_malloc(p_j2k->m_specific_param.m_encoder.m_encoded_tile_size);
+    if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data == 00) {
+        return OPJ_FALSE;
+    }
+
+    if (OPJ_IS_CINEMA(l_cp->rsiz)) {
+        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer =
+            (OPJ_BYTE *) opj_malloc(5 *
+                                    p_j2k->m_specific_param.m_encoder.m_total_tile_parts);
+        if (! p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
+            return OPJ_FALSE;
         }
 
-        return OPJ_TRUE;
+        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current =
+            p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer;
+    }
+
+    return OPJ_TRUE;
 }
 
 #if 0
-static OPJ_BOOL opj_j2k_read_eoc (     opj_j2k_t *p_j2k,
-                                                        opj_stream_private_t *p_stream,
-                                                        opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_read_eoc(opj_j2k_t *p_j2k,
+                                 opj_stream_private_t *p_stream,
+                                 opj_event_mgr_t * p_manager)
 {
-        OPJ_UINT32 i;
-        opj_tcd_t * l_tcd = 00;
-        OPJ_UINT32 l_nb_tiles;
-        opj_tcp_t * l_tcp = 00;
-        OPJ_BOOL l_success;
+    OPJ_UINT32 i;
+    opj_tcd_t * l_tcd = 00;
+    OPJ_UINT32 l_nb_tiles;
+    opj_tcp_t * l_tcp = 00;
+    OPJ_BOOL l_success;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
-        l_tcp = p_j2k->m_cp.tcps;
+    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+    l_tcp = p_j2k->m_cp.tcps;
 
-        l_tcd = opj_tcd_create(OPJ_TRUE);
-        if (l_tcd == 00) {
+    l_tcd = opj_tcd_create(OPJ_TRUE);
+    if (l_tcd == 00) {
+        opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
+        return OPJ_FALSE;
+    }
+
+    for (i = 0; i < l_nb_tiles; ++i) {
+        if (l_tcp->m_data) {
+            if (! opj_tcd_init_decode_tile(l_tcd, i)) {
+                opj_tcd_destroy(l_tcd);
                 opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
                 return OPJ_FALSE;
+            }
+
+            l_success = opj_tcd_decode_tile(l_tcd, l_tcp->m_data, l_tcp->m_data_size, i,
+                                            p_j2k->cstr_index);
+            /* cleanup */
+
+            if (! l_success) {
+                p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
+                break;
+            }
         }
 
-        for (i = 0; i < l_nb_tiles; ++i) {
-                if (l_tcp->m_data) {
-                        if (! opj_tcd_init_decode_tile(l_tcd, i)) {
-                                opj_tcd_destroy(l_tcd);
-                                opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
-                                return OPJ_FALSE;
-                        }
+        opj_j2k_tcp_destroy(l_tcp);
+        ++l_tcp;
+    }
 
-                        l_success = opj_tcd_decode_tile(l_tcd, l_tcp->m_data, l_tcp->m_data_size, i, p_j2k->cstr_index);
-                        /* cleanup */
-
-                        if (! l_success) {
-                                p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
-                                break;
-                        }
-                }
-
-                opj_j2k_tcp_destroy(l_tcp);
-                ++l_tcp;
-        }
-
-        opj_tcd_destroy(l_tcd);
-        return OPJ_TRUE;
+    opj_tcd_destroy(l_tcd);
+    return OPJ_TRUE;
 }
 #endif
 
 static OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k,
-                                                        struct opj_stream_private *p_stream,
-                                                        struct opj_event_mgr * p_manager )
+                                       struct opj_stream_private *p_stream,
+                                       struct opj_event_mgr * p_manager)
 {
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        p_j2k->cstr_index->main_head_end = opj_stream_tell(p_stream);
+    OPJ_UNUSED(p_manager);
 
-        return OPJ_TRUE;
+    p_j2k->cstr_index->main_head_end = opj_stream_tell(p_stream);
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_mct_data_group(  opj_j2k_t *p_j2k,
-                                                                        struct opj_stream_private *p_stream,
-                                                                        struct opj_event_mgr * p_manager )
+static OPJ_BOOL opj_j2k_write_mct_data_group(opj_j2k_t *p_j2k,
+        struct opj_stream_private *p_stream,
+        struct opj_event_mgr * p_manager)
 {
-        OPJ_UINT32 i;
-        opj_simple_mcc_decorrelation_data_t * l_mcc_record;
-        opj_mct_data_t * l_mct_record;
-        opj_tcp_t * l_tcp;
+    OPJ_UINT32 i;
+    opj_simple_mcc_decorrelation_data_t * l_mcc_record;
+    opj_mct_data_t * l_mct_record;
+    opj_tcp_t * l_tcp;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_stream != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_stream != 00);
+    assert(p_manager != 00);
 
-        if (! opj_j2k_write_cbd(p_j2k,p_stream,p_manager)) {
+    if (! opj_j2k_write_cbd(p_j2k, p_stream, p_manager)) {
+        return OPJ_FALSE;
+    }
+
+    l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
+    l_mct_record = l_tcp->m_mct_records;
+
+    for (i = 0; i < l_tcp->m_nb_mct_records; ++i) {
+
+        if (! opj_j2k_write_mct_record(p_j2k, l_mct_record, p_stream, p_manager)) {
+            return OPJ_FALSE;
+        }
+
+        ++l_mct_record;
+    }
+
+    l_mcc_record = l_tcp->m_mcc_records;
+
+    for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
+
+        if (! opj_j2k_write_mcc_record(p_j2k, l_mcc_record, p_stream, p_manager)) {
+            return OPJ_FALSE;
+        }
+
+        ++l_mcc_record;
+    }
+
+    if (! opj_j2k_write_mco(p_j2k, p_stream, p_manager)) {
+        return OPJ_FALSE;
+    }
+
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_j2k_write_all_coc(
+    opj_j2k_t *p_j2k,
+    struct opj_stream_private *p_stream,
+    struct opj_event_mgr * p_manager)
+{
+    OPJ_UINT32 compno;
+
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
+
+    for (compno = 1; compno < p_j2k->m_private_image->numcomps; ++compno) {
+        /* cod is first component of first tile */
+        if (! opj_j2k_compare_coc(p_j2k, 0, compno)) {
+            if (! opj_j2k_write_coc(p_j2k, compno, p_stream, p_manager)) {
                 return OPJ_FALSE;
+            }
         }
+    }
 
-        l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
-        l_mct_record = l_tcp->m_mct_records;
+    return OPJ_TRUE;
+}
 
-        for (i=0;i<l_tcp->m_nb_mct_records;++i) {
+static OPJ_BOOL opj_j2k_write_all_qcc(
+    opj_j2k_t *p_j2k,
+    struct opj_stream_private *p_stream,
+    struct opj_event_mgr * p_manager)
+{
+    OPJ_UINT32 compno;
 
-                if (! opj_j2k_write_mct_record(p_j2k,l_mct_record,p_stream,p_manager)) {
-                        return OPJ_FALSE;
-                }
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-                ++l_mct_record;
-        }
-
-        l_mcc_record = l_tcp->m_mcc_records;
-
-        for     (i=0;i<l_tcp->m_nb_mcc_records;++i) {
-
-                if (! opj_j2k_write_mcc_record(p_j2k,l_mcc_record,p_stream,p_manager)) {
-                        return OPJ_FALSE;
-                }
-
-                ++l_mcc_record;
-        }
-
-        if (! opj_j2k_write_mco(p_j2k,p_stream,p_manager)) {
+    for (compno = 1; compno < p_j2k->m_private_image->numcomps; ++compno) {
+        /* qcd is first component of first tile */
+        if (! opj_j2k_compare_qcc(p_j2k, 0, compno)) {
+            if (! opj_j2k_write_qcc(p_j2k, compno, p_stream, p_manager)) {
                 return OPJ_FALSE;
+            }
         }
-
-        return OPJ_TRUE;
+    }
+    return OPJ_TRUE;
 }
 
-#if 0
-static OPJ_BOOL opj_j2k_write_all_coc(opj_j2k_t *p_j2k,
-                                                                        struct opj_stream_private *p_stream,
-                                                                        struct opj_event_mgr * p_manager )
+static OPJ_BOOL opj_j2k_write_regions(opj_j2k_t *p_j2k,
+                                      struct opj_stream_private *p_stream,
+                                      struct opj_event_mgr * p_manager)
 {
-        OPJ_UINT32 compno;
+    OPJ_UINT32 compno;
+    const opj_tccp_t *l_tccp = 00;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)
-        {
-                if (! opj_j2k_write_coc(p_j2k,compno,p_stream, p_manager)) {
-                        return OPJ_FALSE;
-                }
+    l_tccp = p_j2k->m_cp.tcps->tccps;
+
+    for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)  {
+        if (l_tccp->roishift) {
+
+            if (! opj_j2k_write_rgn(p_j2k, 0, compno, p_j2k->m_private_image->numcomps,
+                                    p_stream, p_manager)) {
+                return OPJ_FALSE;
+            }
         }
 
-        return OPJ_TRUE;
-}
-#endif
+        ++l_tccp;
+    }
 
-#if 0
-static OPJ_BOOL opj_j2k_write_all_qcc(opj_j2k_t *p_j2k,
-                                                                        struct opj_stream_private *p_stream,
-                                                                        struct opj_event_mgr * p_manager )
-{
-        OPJ_UINT32 compno;
-
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
-
-        for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)
-        {
-                if (! opj_j2k_write_qcc(p_j2k,compno,p_stream, p_manager)) {
-                        return OPJ_FALSE;
-                }
-        }
-
-        return OPJ_TRUE;
-}
-#endif
-
-
-static OPJ_BOOL opj_j2k_write_regions( opj_j2k_t *p_j2k,
-                                                        struct opj_stream_private *p_stream,
-                                                        struct opj_event_mgr * p_manager )
-{
-        OPJ_UINT32 compno;
-        const opj_tccp_t *l_tccp = 00;
-
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
-
-        l_tccp = p_j2k->m_cp.tcps->tccps;
-
-        for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno)  {
-                if (l_tccp->roishift) {
-
-                        if (! opj_j2k_write_rgn(p_j2k,0,compno,p_j2k->m_private_image->numcomps,p_stream,p_manager)) {
-                                return OPJ_FALSE;
-                        }
-                }
-
-                ++l_tccp;
-        }
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_epc(     opj_j2k_t *p_j2k,
-                                                struct opj_stream_private *p_stream,
-                                                struct opj_event_mgr * p_manager )
+static OPJ_BOOL opj_j2k_write_epc(opj_j2k_t *p_j2k,
+                                  struct opj_stream_private *p_stream,
+                                  struct opj_event_mgr * p_manager)
 {
-        opj_codestream_index_t * l_cstr_index = 00;
+    opj_codestream_index_t * l_cstr_index = 00;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        l_cstr_index = p_j2k->cstr_index;
-        if (l_cstr_index) {
-                l_cstr_index->codestream_size = (OPJ_UINT64)opj_stream_tell(p_stream);
-                /* UniPG>> */
-                /* The following adjustment is done to adjust the codestream size */
-                /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */
-                /* the first bunch of bytes is not in the codestream              */
-                l_cstr_index->codestream_size -= (OPJ_UINT64)l_cstr_index->main_head_start;
-                /* <<UniPG */
-        }
+    OPJ_UNUSED(p_manager);
+
+    l_cstr_index = p_j2k->cstr_index;
+    if (l_cstr_index) {
+        l_cstr_index->codestream_size = (OPJ_UINT64)opj_stream_tell(p_stream);
+        /* UniPG>> */
+        /* The following adjustment is done to adjust the codestream size */
+        /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */
+        /* the first bunch of bytes is not in the codestream              */
+        l_cstr_index->codestream_size -= (OPJ_UINT64)l_cstr_index->main_head_start;
+        /* <<UniPG */
+    }
 
 #ifdef USE_JPWL
-        /* preparation of JPWL marker segments */
+    /* preparation of JPWL marker segments */
 #if 0
-        if(cp->epc_on) {
+    if (cp->epc_on) {
 
-                /* encode according to JPWL */
-                jpwl_encode(p_j2k, p_stream, image);
+        /* encode according to JPWL */
+        jpwl_encode(p_j2k, p_stream, image);
 
-        }
+    }
 #endif
-  assert( 0 && "TODO" );
+    assert(0 && "TODO");
 #endif /* USE_JPWL */
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_read_unk (     opj_j2k_t *p_j2k,
-                                                        opj_stream_private_t *p_stream,
-                                                        OPJ_UINT32 *output_marker,
-                                                        opj_event_mgr_t * p_manager
-                                                        )
+static OPJ_BOOL opj_j2k_read_unk(opj_j2k_t *p_j2k,
+                                 opj_stream_private_t *p_stream,
+                                 OPJ_UINT32 *output_marker,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        OPJ_UINT32 l_unknown_marker;
-        const opj_dec_memory_marker_handler_t * l_marker_handler;
-        OPJ_UINT32 l_size_unk = 2;
+    OPJ_UINT32 l_unknown_marker;
+    const opj_dec_memory_marker_handler_t * l_marker_handler;
+    OPJ_UINT32 l_size_unk = 2;
 
-        /* preconditions*/
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions*/
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n");
+    opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n");
 
-		for (;;) {
-                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
-                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-                        return OPJ_FALSE;
-                }
-
-                /* read 2 bytes as the new marker ID*/
-                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_unknown_marker,2);
-
-                if (!(l_unknown_marker < 0xff00)) {
-
-                        /* Get the marker handler from the marker ID*/
-                        l_marker_handler = opj_j2k_get_marker_handler(l_unknown_marker);
-
-                        if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
-                                opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
-                                return OPJ_FALSE;
-                        }
-                        else {
-                                if (l_marker_handler->id != J2K_MS_UNK) {
-                                        /* Add the marker to the codestream index*/
-                                        if (l_marker_handler->id != J2K_MS_SOT)
-                                        {
-                                                OPJ_BOOL res = opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_UNK,
-                                                                (OPJ_UINT32) opj_stream_tell(p_stream) - l_size_unk,
-                                                                l_size_unk);
-                                                if (res == OPJ_FALSE) {
-                                                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
-                                                        return OPJ_FALSE;
-                                                }
-                                        }
-                                        break; /* next marker is known and well located */
-                                }
-                                else
-                                        l_size_unk += 2;
-                        }
-                }
+    for (;;) {
+        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
+        if (opj_stream_read_data(p_stream,
+                                 p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
+            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+            return OPJ_FALSE;
         }
 
-        *output_marker = l_marker_handler->id ;
+        /* read 2 bytes as the new marker ID*/
+        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
+                       &l_unknown_marker, 2);
 
-        return OPJ_TRUE;
-}
+        if (!(l_unknown_marker < 0xff00)) {
 
-static OPJ_BOOL opj_j2k_write_mct_record(      opj_j2k_t *p_j2k,
-                                                                opj_mct_data_t * p_mct_record,
-                                                                struct opj_stream_private *p_stream,
-                                                                struct opj_event_mgr * p_manager )
-{
-        OPJ_UINT32 l_mct_size;
-        OPJ_BYTE * l_current_data = 00;
-        OPJ_UINT32 l_tmp;
+            /* Get the marker handler from the marker ID*/
+            l_marker_handler = opj_j2k_get_marker_handler(l_unknown_marker);
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
-
-        l_mct_size = 10 + p_mct_record->m_data_size;
-
-        if (l_mct_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
-                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size);
-                if (! new_header_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCT marker\n");
-                        return OPJ_FALSE;
-                }
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mct_size;
-        }
-
-        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
-
-        opj_write_bytes(l_current_data,J2K_MS_MCT,2);                                   /* MCT */
-        l_current_data += 2;
-
-        opj_write_bytes(l_current_data,l_mct_size-2,2);                                 /* Lmct */
-        l_current_data += 2;
-
-        opj_write_bytes(l_current_data,0,2);                                                    /* Zmct */
-        l_current_data += 2;
-
-        /* only one marker atm */
-        l_tmp = (p_mct_record->m_index & 0xff) | (p_mct_record->m_array_type << 8) | (p_mct_record->m_element_type << 10);
-
-        opj_write_bytes(l_current_data,l_tmp,2);
-        l_current_data += 2;
-
-        opj_write_bytes(l_current_data,0,2);                                                    /* Ymct */
-        l_current_data+=2;
-
-        memcpy(l_current_data,p_mct_record->m_data,p_mct_record->m_data_size);
-
-        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mct_size,p_manager) != l_mct_size) {
+            if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Marker is not compliant with its position\n");
                 return OPJ_FALSE;
+            } else {
+                if (l_marker_handler->id != J2K_MS_UNK) {
+                    /* Add the marker to the codestream index*/
+                    if (l_marker_handler->id != J2K_MS_SOT) {
+                        OPJ_BOOL res = opj_j2k_add_mhmarker(p_j2k->cstr_index, J2K_MS_UNK,
+                                                            (OPJ_UINT32) opj_stream_tell(p_stream) - l_size_unk,
+                                                            l_size_unk);
+                        if (res == OPJ_FALSE) {
+                            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
+                            return OPJ_FALSE;
+                        }
+                    }
+                    break; /* next marker is known and well located */
+                } else {
+                    l_size_unk += 2;
+                }
+            }
         }
+    }
 
-        return OPJ_TRUE;
+    *output_marker = l_marker_handler->id ;
+
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_j2k_write_mct_record(opj_j2k_t *p_j2k,
+        opj_mct_data_t * p_mct_record,
+        struct opj_stream_private *p_stream,
+        struct opj_event_mgr * p_manager)
+{
+    OPJ_UINT32 l_mct_size;
+    OPJ_BYTE * l_current_data = 00;
+    OPJ_UINT32 l_tmp;
+
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
+
+    l_mct_size = 10 + p_mct_record->m_data_size;
+
+    if (l_mct_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
+                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size);
+        if (! new_header_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCT marker\n");
+            return OPJ_FALSE;
+        }
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mct_size;
+    }
+
+    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+
+    opj_write_bytes(l_current_data, J2K_MS_MCT,
+                    2);                                   /* MCT */
+    l_current_data += 2;
+
+    opj_write_bytes(l_current_data, l_mct_size - 2,
+                    2);                                 /* Lmct */
+    l_current_data += 2;
+
+    opj_write_bytes(l_current_data, 0,
+                    2);                                                    /* Zmct */
+    l_current_data += 2;
+
+    /* only one marker atm */
+    l_tmp = (p_mct_record->m_index & 0xff) | (p_mct_record->m_array_type << 8) |
+            (p_mct_record->m_element_type << 10);
+
+    opj_write_bytes(l_current_data, l_tmp, 2);
+    l_current_data += 2;
+
+    opj_write_bytes(l_current_data, 0,
+                    2);                                                    /* Ymct */
+    l_current_data += 2;
+
+    memcpy(l_current_data, p_mct_record->m_data, p_mct_record->m_data_size);
+
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mct_size,
+                              p_manager) != l_mct_size) {
+        return OPJ_FALSE;
+    }
+
+    return OPJ_TRUE;
 }
 
 /**
@@ -5124,494 +5538,552 @@
  * @param       p_header_size   the size of the data contained in the MCT marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_mct (      opj_j2k_t *p_j2k,
-                                                                    OPJ_BYTE * p_header_data,
-                                                                    OPJ_UINT32 p_header_size,
-                                                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_mct(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        OPJ_UINT32 i;
-        opj_tcp_t *l_tcp = 00;
-        OPJ_UINT32 l_tmp;
-        OPJ_UINT32 l_indix;
-        opj_mct_data_t * l_mct_data;
-        OPJ_BOOL new_mct = OPJ_FALSE;
+    OPJ_UINT32 i;
+    opj_tcp_t *l_tcp = 00;
+    OPJ_UINT32 l_tmp;
+    OPJ_UINT32 l_indix;
+    opj_mct_data_t * l_mct_data;
+    OPJ_BOOL new_mct = OPJ_FALSE;
 
-        /* preconditions */
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
 
-        l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
-                        &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
-                        p_j2k->m_specific_param.m_decoder.m_default_tcp;
+    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
+            &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
+            p_j2k->m_specific_param.m_decoder.m_default_tcp;
 
-        if (p_header_size < 2) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
-                return OPJ_FALSE;
-        }
+    if (p_header_size < 2) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
+        return OPJ_FALSE;
+    }
 
-        /* first marker */
-        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Zmct */
-        p_header_data += 2;
-        if (l_tmp != 0) {
-                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge mct data within multiple MCT records\n");
-                return OPJ_TRUE;
-        }
-
-        if(p_header_size <= 6) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
-                return OPJ_FALSE;
-        }
-
-        /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/
-        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Imct */
-        p_header_data += 2;
-
-        l_indix = l_tmp & 0xff;
-        l_mct_data = l_tcp->m_mct_records;
-
-        for (i=0;i<l_tcp->m_nb_mct_records;++i) {
-                if (l_mct_data->m_index == l_indix) {
-                        break;
-                }
-                ++l_mct_data;
-        }
-
-        /* NOT FOUND */
-        if (i == l_tcp->m_nb_mct_records) {
-                if (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records) {
-                        opj_mct_data_t *new_mct_records;
-                        l_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
-
-                        new_mct_records = (opj_mct_data_t *) opj_realloc(l_tcp->m_mct_records, l_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
-                        if (! new_mct_records) {
-                                opj_free(l_tcp->m_mct_records);
-                                l_tcp->m_mct_records = NULL;
-                                l_tcp->m_nb_max_mct_records = 0;
-                                l_tcp->m_nb_mct_records = 0;
-                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCT marker\n");
-                                return OPJ_FALSE;
-                        }
-                        l_tcp->m_mct_records = new_mct_records;
-                        l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
-                        memset(l_mct_data ,0,(l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
-                }
-
-                l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
-                new_mct = OPJ_TRUE;
-        }
-
-        if (l_mct_data->m_data) {
-                opj_free(l_mct_data->m_data);
-                l_mct_data->m_data = 00;
-        }
-
-        l_mct_data->m_index = l_indix;
-        l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp  >> 8) & 3);
-        l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp  >> 10) & 3);
-
-        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Ymct */
-        p_header_data+=2;
-        if (l_tmp != 0) {
-                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple MCT markers\n");
-                return OPJ_TRUE;
-        }
-
-        p_header_size -= 6;
-
-        l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size);
-        if (! l_mct_data->m_data) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
-                return OPJ_FALSE;
-        }
-        memcpy(l_mct_data->m_data,p_header_data,p_header_size);
-
-        l_mct_data->m_data_size = p_header_size;
-
-        if (new_mct) {
-                ++l_tcp->m_nb_mct_records;
-        }
+    /* first marker */
+    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Zmct */
+    p_header_data += 2;
+    if (l_tmp != 0) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "Cannot take in charge mct data within multiple MCT records\n");
         return OPJ_TRUE;
+    }
+
+    if (p_header_size <= 6) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
+        return OPJ_FALSE;
+    }
+
+    /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/
+    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Imct */
+    p_header_data += 2;
+
+    l_indix = l_tmp & 0xff;
+    l_mct_data = l_tcp->m_mct_records;
+
+    for (i = 0; i < l_tcp->m_nb_mct_records; ++i) {
+        if (l_mct_data->m_index == l_indix) {
+            break;
+        }
+        ++l_mct_data;
+    }
+
+    /* NOT FOUND */
+    if (i == l_tcp->m_nb_mct_records) {
+        if (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records) {
+            opj_mct_data_t *new_mct_records;
+            l_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+
+            new_mct_records = (opj_mct_data_t *) opj_realloc(l_tcp->m_mct_records,
+                              l_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
+            if (! new_mct_records) {
+                opj_free(l_tcp->m_mct_records);
+                l_tcp->m_mct_records = NULL;
+                l_tcp->m_nb_max_mct_records = 0;
+                l_tcp->m_nb_mct_records = 0;
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCT marker\n");
+                return OPJ_FALSE;
+            }
+
+            /* Update m_mcc_records[].m_offset_array and m_decorrelation_array
+             * to point to the new addresses */
+            if (new_mct_records != l_tcp->m_mct_records) {
+                for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
+                    opj_simple_mcc_decorrelation_data_t* l_mcc_record =
+                        &(l_tcp->m_mcc_records[i]);
+                    if (l_mcc_record->m_decorrelation_array) {
+                        l_mcc_record->m_decorrelation_array =
+                            new_mct_records +
+                            (l_mcc_record->m_decorrelation_array -
+                             l_tcp->m_mct_records);
+                    }
+                    if (l_mcc_record->m_offset_array) {
+                        l_mcc_record->m_offset_array =
+                            new_mct_records +
+                            (l_mcc_record->m_offset_array -
+                             l_tcp->m_mct_records);
+                    }
+                }
+            }
+
+            l_tcp->m_mct_records = new_mct_records;
+            l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
+            memset(l_mct_data, 0, (l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) *
+                   sizeof(opj_mct_data_t));
+        }
+
+        l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
+        new_mct = OPJ_TRUE;
+    }
+
+    if (l_mct_data->m_data) {
+        opj_free(l_mct_data->m_data);
+        l_mct_data->m_data = 00;
+        l_mct_data->m_data_size = 0;
+    }
+
+    l_mct_data->m_index = l_indix;
+    l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp  >> 8) & 3);
+    l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp  >> 10) & 3);
+
+    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Ymct */
+    p_header_data += 2;
+    if (l_tmp != 0) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "Cannot take in charge multiple MCT markers\n");
+        return OPJ_TRUE;
+    }
+
+    p_header_size -= 6;
+
+    l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size);
+    if (! l_mct_data->m_data) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCT marker\n");
+        return OPJ_FALSE;
+    }
+    memcpy(l_mct_data->m_data, p_header_data, p_header_size);
+
+    l_mct_data->m_data_size = p_header_size;
+
+    if (new_mct) {
+            ++l_tcp->m_nb_mct_records;
+    }
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_mcc_record(      opj_j2k_t *p_j2k,
-                                                                struct opj_simple_mcc_decorrelation_data * p_mcc_record,
-                                                                struct opj_stream_private *p_stream,
-                                                                struct opj_event_mgr * p_manager )
+static OPJ_BOOL opj_j2k_write_mcc_record(opj_j2k_t *p_j2k,
+        struct opj_simple_mcc_decorrelation_data * p_mcc_record,
+        struct opj_stream_private *p_stream,
+        struct opj_event_mgr * p_manager)
 {
-        OPJ_UINT32 i;
-        OPJ_UINT32 l_mcc_size;
-        OPJ_BYTE * l_current_data = 00;
-        OPJ_UINT32 l_nb_bytes_for_comp;
-        OPJ_UINT32 l_mask;
-        OPJ_UINT32 l_tmcc;
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_mcc_size;
+    OPJ_BYTE * l_current_data = 00;
+    OPJ_UINT32 l_nb_bytes_for_comp;
+    OPJ_UINT32 l_mask;
+    OPJ_UINT32 l_tmcc;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        if (p_mcc_record->m_nb_comps > 255 ) {
+    if (p_mcc_record->m_nb_comps > 255) {
         l_nb_bytes_for_comp = 2;
-                l_mask = 0x8000;
+        l_mask = 0x8000;
+    } else {
+        l_nb_bytes_for_comp = 1;
+        l_mask = 0;
+    }
+
+    l_mcc_size = p_mcc_record->m_nb_comps * 2 * l_nb_bytes_for_comp + 19;
+    if (l_mcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
+                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size);
+        if (! new_header_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCC marker\n");
+            return OPJ_FALSE;
         }
-        else {
-                l_nb_bytes_for_comp = 1;
-                l_mask = 0;
-        }
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mcc_size;
+    }
 
-        l_mcc_size = p_mcc_record->m_nb_comps * 2 * l_nb_bytes_for_comp + 19;
-        if (l_mcc_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size)
-        {
-                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size);
-                if (! new_header_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCC marker\n");
-                        return OPJ_FALSE;
-                }
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mcc_size;
-        }
+    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
 
-        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+    opj_write_bytes(l_current_data, J2K_MS_MCC,
+                    2);                                   /* MCC */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,J2K_MS_MCC,2);                                   /* MCC */
-        l_current_data += 2;
+    opj_write_bytes(l_current_data, l_mcc_size - 2,
+                    2);                                 /* Lmcc */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,l_mcc_size-2,2);                                 /* Lmcc */
-        l_current_data += 2;
+    /* first marker */
+    opj_write_bytes(l_current_data, 0,
+                    2);                                  /* Zmcc */
+    l_current_data += 2;
 
-        /* first marker */
-        opj_write_bytes(l_current_data,0,2);                                    /* Zmcc */
-        l_current_data += 2;
+    opj_write_bytes(l_current_data, p_mcc_record->m_index,
+                    1);                                        /* Imcc -> no need for other values, take the first */
+    ++l_current_data;
 
-        opj_write_bytes(l_current_data,p_mcc_record->m_index,1);                                        /* Imcc -> no need for other values, take the first */
-        ++l_current_data;
+    /* only one marker atm */
+    opj_write_bytes(l_current_data, 0,
+                    2);                                  /* Ymcc */
+    l_current_data += 2;
 
-        /* only one marker atm */
-        opj_write_bytes(l_current_data,0,2);                                    /* Ymcc */
-        l_current_data+=2;
+    opj_write_bytes(l_current_data, 1,
+                    2);                                  /* Qmcc -> number of collections -> 1 */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,1,2);                                    /* Qmcc -> number of collections -> 1 */
-        l_current_data+=2;
+    opj_write_bytes(l_current_data, 0x1,
+                    1);                                /* Xmcci type of component transformation -> array based decorrelation */
+    ++l_current_data;
 
-        opj_write_bytes(l_current_data,0x1,1);                                  /* Xmcci type of component transformation -> array based decorrelation */
-        ++l_current_data;
+    opj_write_bytes(l_current_data, p_mcc_record->m_nb_comps | l_mask,
+                    2);  /* Nmcci number of input components involved and size for each component offset = 8 bits */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,p_mcc_record->m_nb_comps | l_mask,2);    /* Nmcci number of input components involved and size for each component offset = 8 bits */
-        l_current_data+=2;
+    for (i = 0; i < p_mcc_record->m_nb_comps; ++i) {
+        opj_write_bytes(l_current_data, i,
+                        l_nb_bytes_for_comp);                          /* Cmccij Component offset*/
+        l_current_data += l_nb_bytes_for_comp;
+    }
 
-        for (i=0;i<p_mcc_record->m_nb_comps;++i) {
-                opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp);                          /* Cmccij Component offset*/
-                l_current_data+=l_nb_bytes_for_comp;
-        }
+    opj_write_bytes(l_current_data, p_mcc_record->m_nb_comps | l_mask,
+                    2);  /* Mmcci number of output components involved and size for each component offset = 8 bits */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,p_mcc_record->m_nb_comps|l_mask,2);      /* Mmcci number of output components involved and size for each component offset = 8 bits */
-        l_current_data+=2;
+    for (i = 0; i < p_mcc_record->m_nb_comps; ++i) {
+        opj_write_bytes(l_current_data, i,
+                        l_nb_bytes_for_comp);                          /* Wmccij Component offset*/
+        l_current_data += l_nb_bytes_for_comp;
+    }
 
-        for (i=0;i<p_mcc_record->m_nb_comps;++i)
-        {
-                opj_write_bytes(l_current_data,i,l_nb_bytes_for_comp);                          /* Wmccij Component offset*/
-                l_current_data+=l_nb_bytes_for_comp;
-        }
+    l_tmcc = ((!p_mcc_record->m_is_irreversible) & 1U) << 16;
 
-        l_tmcc = ((!p_mcc_record->m_is_irreversible)&1)<<16;
+    if (p_mcc_record->m_decorrelation_array) {
+        l_tmcc |= p_mcc_record->m_decorrelation_array->m_index;
+    }
 
-        if (p_mcc_record->m_decorrelation_array) {
-                l_tmcc |= p_mcc_record->m_decorrelation_array->m_index;
-        }
+    if (p_mcc_record->m_offset_array) {
+        l_tmcc |= ((p_mcc_record->m_offset_array->m_index) << 8);
+    }
 
-        if (p_mcc_record->m_offset_array) {
-                l_tmcc |= ((p_mcc_record->m_offset_array->m_index)<<8);
-        }
+    opj_write_bytes(l_current_data, l_tmcc,
+                    3);     /* Tmcci : use MCT defined as number 1 and irreversible array based. */
+    l_current_data += 3;
 
-        opj_write_bytes(l_current_data,l_tmcc,3);       /* Tmcci : use MCT defined as number 1 and irreversible array based. */
-        l_current_data+=3;
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mcc_size,
+                              p_manager) != l_mcc_size) {
+        return OPJ_FALSE;
+    }
 
-        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mcc_size,p_manager) != l_mcc_size) {
-                return OPJ_FALSE;
-        }
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_read_mcc (     opj_j2k_t *p_j2k,
-                                                OPJ_BYTE * p_header_data,
-                                                OPJ_UINT32 p_header_size,
-                                                opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_read_mcc(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager)
 {
-        OPJ_UINT32 i,j;
-        OPJ_UINT32 l_tmp;
-        OPJ_UINT32 l_indix;
-        opj_tcp_t * l_tcp;
-        opj_simple_mcc_decorrelation_data_t * l_mcc_record;
-        opj_mct_data_t * l_mct_data;
-        OPJ_UINT32 l_nb_collections;
-        OPJ_UINT32 l_nb_comps;
-        OPJ_UINT32 l_nb_bytes_by_comp;
-        OPJ_BOOL new_mcc = OPJ_FALSE;
+    OPJ_UINT32 i, j;
+    OPJ_UINT32 l_tmp;
+    OPJ_UINT32 l_indix;
+    opj_tcp_t * l_tcp;
+    opj_simple_mcc_decorrelation_data_t * l_mcc_record;
+    opj_mct_data_t * l_mct_data;
+    OPJ_UINT32 l_nb_collections;
+    OPJ_UINT32 l_nb_comps;
+    OPJ_UINT32 l_nb_bytes_by_comp;
+    OPJ_BOOL l_new_mcc = OPJ_FALSE;
 
-        /* preconditions */
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
-                        &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
-                        p_j2k->m_specific_param.m_decoder.m_default_tcp;
+    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
+            &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
+            p_j2k->m_specific_param.m_decoder.m_default_tcp;
 
-        if (p_header_size < 2) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+    if (p_header_size < 2) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+        return OPJ_FALSE;
+    }
+
+    /* first marker */
+    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Zmcc */
+    p_header_data += 2;
+    if (l_tmp != 0) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "Cannot take in charge multiple data spanning\n");
+        return OPJ_TRUE;
+    }
+
+    if (p_header_size < 7) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+        return OPJ_FALSE;
+    }
+
+    opj_read_bytes(p_header_data, &l_indix,
+                   1); /* Imcc -> no need for other values, take the first */
+    ++p_header_data;
+
+    l_mcc_record = l_tcp->m_mcc_records;
+
+    for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
+        if (l_mcc_record->m_index == l_indix) {
+            break;
+        }
+        ++l_mcc_record;
+    }
+
+    /** NOT FOUND */
+    if (i == l_tcp->m_nb_mcc_records) {
+        if (l_tcp->m_nb_mcc_records == l_tcp->m_nb_max_mcc_records) {
+            opj_simple_mcc_decorrelation_data_t *new_mcc_records;
+            l_tcp->m_nb_max_mcc_records += OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
+
+            new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
+                                  l_tcp->m_mcc_records, l_tcp->m_nb_max_mcc_records * sizeof(
+                                      opj_simple_mcc_decorrelation_data_t));
+            if (! new_mcc_records) {
+                opj_free(l_tcp->m_mcc_records);
+                l_tcp->m_mcc_records = NULL;
+                l_tcp->m_nb_max_mcc_records = 0;
+                l_tcp->m_nb_mcc_records = 0;
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCC marker\n");
                 return OPJ_FALSE;
+            }
+            l_tcp->m_mcc_records = new_mcc_records;
+            l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
+            memset(l_mcc_record, 0, (l_tcp->m_nb_max_mcc_records - l_tcp->m_nb_mcc_records)
+                   * sizeof(opj_simple_mcc_decorrelation_data_t));
+        }
+        l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
+        l_new_mcc = OPJ_TRUE;
+    }
+    l_mcc_record->m_index = l_indix;
+
+    /* only one marker atm */
+    opj_read_bytes(p_header_data, &l_tmp, 2);                       /* Ymcc */
+    p_header_data += 2;
+    if (l_tmp != 0) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "Cannot take in charge multiple data spanning\n");
+        return OPJ_TRUE;
+    }
+
+    opj_read_bytes(p_header_data, &l_nb_collections,
+                   2);                              /* Qmcc -> number of collections -> 1 */
+    p_header_data += 2;
+
+    if (l_nb_collections > 1) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "Cannot take in charge multiple collections\n");
+        return OPJ_TRUE;
+    }
+
+    p_header_size -= 7;
+
+    for (i = 0; i < l_nb_collections; ++i) {
+        if (p_header_size < 3) {
+            opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+            return OPJ_FALSE;
         }
 
-        /* first marker */
-        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Zmcc */
-        p_header_data += 2;
-        if (l_tmp != 0) {
-                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple data spanning\n");
-                return OPJ_TRUE;
-        }
-
-        if (p_header_size < 7) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
-                return OPJ_FALSE;
-        }
-
-        opj_read_bytes(p_header_data,&l_indix,1); /* Imcc -> no need for other values, take the first */
+        opj_read_bytes(p_header_data, &l_tmp,
+                       1); /* Xmcci type of component transformation -> array based decorrelation */
         ++p_header_data;
 
-        l_mcc_record = l_tcp->m_mcc_records;
-
-        for(i=0;i<l_tcp->m_nb_mcc_records;++i) {
-                if (l_mcc_record->m_index == l_indix) {
-                        break;
-                }
-                ++l_mcc_record;
+        if (l_tmp != 1) {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "Cannot take in charge collections other than array decorrelation\n");
+            return OPJ_TRUE;
         }
 
-        /** NOT FOUND */
-        if (i == l_tcp->m_nb_mcc_records) {
-                if (l_tcp->m_nb_mcc_records == l_tcp->m_nb_max_mcc_records) {
-                        opj_simple_mcc_decorrelation_data_t *new_mcc_records;
-                        l_tcp->m_nb_max_mcc_records += OPJ_J2K_MCC_DEFAULT_NB_RECORDS;
+        opj_read_bytes(p_header_data, &l_nb_comps, 2);
 
-                        new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
-                                        l_tcp->m_mcc_records, l_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t));
-                        if (! new_mcc_records) {
-                                opj_free(l_tcp->m_mcc_records);
-                                l_tcp->m_mcc_records = NULL;
-                                l_tcp->m_nb_max_mcc_records = 0;
-                                l_tcp->m_nb_mcc_records = 0;
-                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read MCC marker\n");
-                                return OPJ_FALSE;
-                        }
-                        l_tcp->m_mcc_records = new_mcc_records;
-                        l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
-                        memset(l_mcc_record,0,(l_tcp->m_nb_max_mcc_records-l_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));
-                }
-                l_mcc_record = l_tcp->m_mcc_records + l_tcp->m_nb_mcc_records;
-                new_mcc = OPJ_TRUE;
+        p_header_data += 2;
+        p_header_size -= 3;
+
+        l_nb_bytes_by_comp = 1 + (l_nb_comps >> 15);
+        l_mcc_record->m_nb_comps = l_nb_comps & 0x7fff;
+
+        if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2)) {
+            opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+            return OPJ_FALSE;
         }
-        l_mcc_record->m_index = l_indix;
 
-        /* only one marker atm */
-        opj_read_bytes(p_header_data,&l_tmp,2);                         /* Ymcc */
-        p_header_data+=2;
-        if (l_tmp != 0) {
-                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple data spanning\n");
+        p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2);
+
+        for (j = 0; j < l_mcc_record->m_nb_comps; ++j) {
+            opj_read_bytes(p_header_data, &l_tmp,
+                           l_nb_bytes_by_comp);      /* Cmccij Component offset*/
+            p_header_data += l_nb_bytes_by_comp;
+
+            if (l_tmp != j) {
+                opj_event_msg(p_manager, EVT_WARNING,
+                              "Cannot take in charge collections with indix shuffle\n");
                 return OPJ_TRUE;
+            }
         }
 
-        opj_read_bytes(p_header_data,&l_nb_collections,2);                              /* Qmcc -> number of collections -> 1 */
-        p_header_data+=2;
+        opj_read_bytes(p_header_data, &l_nb_comps, 2);
+        p_header_data += 2;
 
-        if (l_nb_collections > 1) {
-                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple collections\n");
+        l_nb_bytes_by_comp = 1 + (l_nb_comps >> 15);
+        l_nb_comps &= 0x7fff;
+
+        if (l_nb_comps != l_mcc_record->m_nb_comps) {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "Cannot take in charge collections without same number of indixes\n");
+            return OPJ_TRUE;
+        }
+
+        if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3)) {
+            opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+            return OPJ_FALSE;
+        }
+
+        p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3);
+
+        for (j = 0; j < l_mcc_record->m_nb_comps; ++j) {
+            opj_read_bytes(p_header_data, &l_tmp,
+                           l_nb_bytes_by_comp);      /* Wmccij Component offset*/
+            p_header_data += l_nb_bytes_by_comp;
+
+            if (l_tmp != j) {
+                opj_event_msg(p_manager, EVT_WARNING,
+                              "Cannot take in charge collections with indix shuffle\n");
                 return OPJ_TRUE;
+            }
         }
 
-        p_header_size -= 7;
+        opj_read_bytes(p_header_data, &l_tmp, 3); /* Wmccij Component offset*/
+        p_header_data += 3;
 
-        for (i=0;i<l_nb_collections;++i) {
-                if (p_header_size < 3) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
-                        return OPJ_FALSE;
+        l_mcc_record->m_is_irreversible = !((l_tmp >> 16) & 1);
+        l_mcc_record->m_decorrelation_array = 00;
+        l_mcc_record->m_offset_array = 00;
+
+        l_indix = l_tmp & 0xff;
+        if (l_indix != 0) {
+            l_mct_data = l_tcp->m_mct_records;
+            for (j = 0; j < l_tcp->m_nb_mct_records; ++j) {
+                if (l_mct_data->m_index == l_indix) {
+                    l_mcc_record->m_decorrelation_array = l_mct_data;
+                    break;
                 }
+                ++l_mct_data;
+            }
 
-                opj_read_bytes(p_header_data,&l_tmp,1); /* Xmcci type of component transformation -> array based decorrelation */
-                ++p_header_data;
-
-                if (l_tmp != 1) {
-                        opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections other than array decorrelation\n");
-                        return OPJ_TRUE;
-                }
-
-                opj_read_bytes(p_header_data,&l_nb_comps,2);
-
-                p_header_data+=2;
-                p_header_size-=3;
-
-                l_nb_bytes_by_comp = 1 + (l_nb_comps>>15);
-                l_mcc_record->m_nb_comps = l_nb_comps & 0x7fff;
-
-                if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2)) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
-                        return OPJ_FALSE;
-                }
-
-                p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 2);
-
-                for (j=0;j<l_mcc_record->m_nb_comps;++j) {
-                        opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp);        /* Cmccij Component offset*/
-                        p_header_data+=l_nb_bytes_by_comp;
-
-                        if (l_tmp != j) {
-                                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections with indix shuffle\n");
-                                return OPJ_TRUE;
-                        }
-                }
-
-                opj_read_bytes(p_header_data,&l_nb_comps,2);
-                p_header_data+=2;
-
-                l_nb_bytes_by_comp = 1 + (l_nb_comps>>15);
-                l_nb_comps &= 0x7fff;
-
-                if (l_nb_comps != l_mcc_record->m_nb_comps) {
-                        opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections without same number of indixes\n");
-                        return OPJ_TRUE;
-                }
-
-                if (p_header_size < (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3)) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
-                        return OPJ_FALSE;
-                }
-
-                p_header_size -= (l_nb_bytes_by_comp * l_mcc_record->m_nb_comps + 3);
-
-                for (j=0;j<l_mcc_record->m_nb_comps;++j) {
-                        opj_read_bytes(p_header_data,&l_tmp,l_nb_bytes_by_comp);        /* Wmccij Component offset*/
-                        p_header_data+=l_nb_bytes_by_comp;
-
-                        if (l_tmp != j) {
-                                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge collections with indix shuffle\n");
-                                return OPJ_TRUE;
-                        }
-                }
-
-                opj_read_bytes(p_header_data,&l_tmp,3); /* Wmccij Component offset*/
-                p_header_data += 3;
-
-                l_mcc_record->m_is_irreversible = ! ((l_tmp>>16) & 1);
-                l_mcc_record->m_decorrelation_array = 00;
-                l_mcc_record->m_offset_array = 00;
-
-                l_indix = l_tmp & 0xff;
-                if (l_indix != 0) {
-                        l_mct_data = l_tcp->m_mct_records;
-                        for (j=0;j<l_tcp->m_nb_mct_records;++j) {
-                                if (l_mct_data->m_index == l_indix) {
-                                        l_mcc_record->m_decorrelation_array = l_mct_data;
-                                        break;
-                                }
-                                ++l_mct_data;
-                        }
-
-                        if (l_mcc_record->m_decorrelation_array == 00) {
-                                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
-                                return OPJ_FALSE;
-                        }
-                }
-
-                l_indix = (l_tmp >> 8) & 0xff;
-                if (l_indix != 0) {
-                        l_mct_data = l_tcp->m_mct_records;
-                        for (j=0;j<l_tcp->m_nb_mct_records;++j) {
-                                if (l_mct_data->m_index == l_indix) {
-                                        l_mcc_record->m_offset_array = l_mct_data;
-                                        break;
-                                }
-                                ++l_mct_data;
-                        }
-
-                        if (l_mcc_record->m_offset_array == 00) {
-                                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
-                                return OPJ_FALSE;
-                        }
-                }
-        }
-
-        if (p_header_size != 0) {
+            if (l_mcc_record->m_decorrelation_array == 00) {
                 opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
                 return OPJ_FALSE;
+            }
         }
 
-        if (new_mcc) {
-                ++l_tcp->m_nb_mcc_records;
-        }
+        l_indix = (l_tmp >> 8) & 0xff;
+        if (l_indix != 0) {
+            l_mct_data = l_tcp->m_mct_records;
+            for (j = 0; j < l_tcp->m_nb_mct_records; ++j) {
+                if (l_mct_data->m_index == l_indix) {
+                    l_mcc_record->m_offset_array = l_mct_data;
+                    break;
+                }
+                ++l_mct_data;
+            }
 
-        return OPJ_TRUE;
+            if (l_mcc_record->m_offset_array == 00) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+                return OPJ_FALSE;
+            }
+        }
+    }
+
+    if (p_header_size != 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCC marker\n");
+        return OPJ_FALSE;
+    }
+
+    if (l_new_mcc) {
+        ++l_tcp->m_nb_mcc_records;
+    }
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_mco(     opj_j2k_t *p_j2k,
-                                                struct opj_stream_private *p_stream,
-                                                struct opj_event_mgr * p_manager
-                                  )
+static OPJ_BOOL opj_j2k_write_mco(opj_j2k_t *p_j2k,
+                                  struct opj_stream_private *p_stream,
+                                  struct opj_event_mgr * p_manager
+                                 )
 {
-        OPJ_BYTE * l_current_data = 00;
-        OPJ_UINT32 l_mco_size;
-        opj_tcp_t * l_tcp = 00;
-        opj_simple_mcc_decorrelation_data_t * l_mcc_record;
-        OPJ_UINT32 i;
+    OPJ_BYTE * l_current_data = 00;
+    OPJ_UINT32 l_mco_size;
+    opj_tcp_t * l_tcp = 00;
+    opj_simple_mcc_decorrelation_data_t * l_mcc_record;
+    OPJ_UINT32 i;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        l_tcp =&(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
-	
-        l_mco_size = 5 + l_tcp->m_nb_mcc_records;
-        if (l_mco_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+    l_tcp = &(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]);
 
-                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size);
-                if (! new_header_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCO marker\n");
-                        return OPJ_FALSE;
-                }
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mco_size;
+    l_mco_size = 5 + l_tcp->m_nb_mcc_records;
+    if (l_mco_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+
+        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
+                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size);
+        if (! new_header_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write MCO marker\n");
+            return OPJ_FALSE;
         }
-        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mco_size;
+    }
+    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
 
 
-        opj_write_bytes(l_current_data,J2K_MS_MCO,2);                   /* MCO */
-        l_current_data += 2;
+    opj_write_bytes(l_current_data, J2K_MS_MCO, 2);                 /* MCO */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,l_mco_size-2,2);                 /* Lmco */
-        l_current_data += 2;
+    opj_write_bytes(l_current_data, l_mco_size - 2, 2);             /* Lmco */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,l_tcp->m_nb_mcc_records,1);      /* Nmco : only one transform stage*/
+    opj_write_bytes(l_current_data, l_tcp->m_nb_mcc_records,
+                    1);    /* Nmco : only one transform stage*/
+    ++l_current_data;
+
+    l_mcc_record = l_tcp->m_mcc_records;
+    for (i = 0; i < l_tcp->m_nb_mcc_records; ++i) {
+        opj_write_bytes(l_current_data, l_mcc_record->m_index,
+                        1); /* Imco -> use the mcc indicated by 1*/
         ++l_current_data;
+        ++l_mcc_record;
+    }
 
-        l_mcc_record = l_tcp->m_mcc_records;
-        for (i=0;i<l_tcp->m_nb_mcc_records;++i) {
-                opj_write_bytes(l_current_data,l_mcc_record->m_index,1);/* Imco -> use the mcc indicated by 1*/
-                ++l_current_data;
-                ++l_mcc_record;
-        }
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_mco_size,
+                              p_manager) != l_mco_size) {
+        return OPJ_FALSE;
+    }
 
-        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_mco_size,p_manager) != l_mco_size) {
-                return OPJ_FALSE;
-        }
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /**
@@ -5622,208 +6094,219 @@
  * @param       p_header_size   the size of the data contained in the MCO marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_mco (      opj_j2k_t *p_j2k,
-                                                                    OPJ_BYTE * p_header_data,
-                                                                    OPJ_UINT32 p_header_size,
-                                                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_mco(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        OPJ_UINT32 l_tmp, i;
-        OPJ_UINT32 l_nb_stages;
-        opj_tcp_t * l_tcp;
-        opj_tccp_t * l_tccp;
-        opj_image_t * l_image;
+    OPJ_UINT32 l_tmp, i;
+    OPJ_UINT32 l_nb_stages;
+    opj_tcp_t * l_tcp;
+    opj_tccp_t * l_tccp;
+    opj_image_t * l_image;
 
-        /* preconditions */
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_image = p_j2k->m_private_image;
-        l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
-                        &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
-                        p_j2k->m_specific_param.m_decoder.m_default_tcp;
+    l_image = p_j2k->m_private_image;
+    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
+            &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
+            p_j2k->m_specific_param.m_decoder.m_default_tcp;
 
-        if (p_header_size < 1) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading MCO marker\n");
-                return OPJ_FALSE;
-        }
+    if (p_header_size < 1) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading MCO marker\n");
+        return OPJ_FALSE;
+    }
 
-        opj_read_bytes(p_header_data,&l_nb_stages,1);                           /* Nmco : only one transform stage*/
+    opj_read_bytes(p_header_data, &l_nb_stages,
+                   1);                         /* Nmco : only one transform stage*/
+    ++p_header_data;
+
+    if (l_nb_stages > 1) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "Cannot take in charge multiple transformation stages.\n");
+        return OPJ_TRUE;
+    }
+
+    if (p_header_size != l_nb_stages + 1) {
+        opj_event_msg(p_manager, EVT_WARNING, "Error reading MCO marker\n");
+        return OPJ_FALSE;
+    }
+
+    l_tccp = l_tcp->tccps;
+
+    for (i = 0; i < l_image->numcomps; ++i) {
+        l_tccp->m_dc_level_shift = 0;
+        ++l_tccp;
+    }
+
+    if (l_tcp->m_mct_decoding_matrix) {
+        opj_free(l_tcp->m_mct_decoding_matrix);
+        l_tcp->m_mct_decoding_matrix = 00;
+    }
+
+    for (i = 0; i < l_nb_stages; ++i) {
+        opj_read_bytes(p_header_data, &l_tmp, 1);
         ++p_header_data;
 
-        if (l_nb_stages > 1) {
-                opj_event_msg(p_manager, EVT_WARNING, "Cannot take in charge multiple transformation stages.\n");
-                return OPJ_TRUE;
+        if (! opj_j2k_add_mct(l_tcp, p_j2k->m_private_image, l_tmp)) {
+            return OPJ_FALSE;
         }
+    }
 
-        if (p_header_size != l_nb_stages + 1) {
-                opj_event_msg(p_manager, EVT_WARNING, "Error reading MCO marker\n");
-                return OPJ_FALSE;
-        }
-
-        l_tccp = l_tcp->tccps;
-
-        for (i=0;i<l_image->numcomps;++i) {
-                l_tccp->m_dc_level_shift = 0;
-                ++l_tccp;
-        }
-
-        if (l_tcp->m_mct_decoding_matrix) {
-                opj_free(l_tcp->m_mct_decoding_matrix);
-                l_tcp->m_mct_decoding_matrix = 00;
-        }
-
-        for (i=0;i<l_nb_stages;++i) {
-                opj_read_bytes(p_header_data,&l_tmp,1);
-                ++p_header_data;
-
-                if (! opj_j2k_add_mct(l_tcp,p_j2k->m_private_image,l_tmp)) {
-                        return OPJ_FALSE;
-                }
-        }
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index)
+static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image,
+                                OPJ_UINT32 p_index)
 {
-        OPJ_UINT32 i;
-        opj_simple_mcc_decorrelation_data_t * l_mcc_record;
-        opj_mct_data_t * l_deco_array, * l_offset_array;
-        OPJ_UINT32 l_data_size,l_mct_size, l_offset_size;
-        OPJ_UINT32 l_nb_elem;
-        OPJ_UINT32 * l_offset_data, * l_current_offset_data;
-        opj_tccp_t * l_tccp;
+    OPJ_UINT32 i;
+    opj_simple_mcc_decorrelation_data_t * l_mcc_record;
+    opj_mct_data_t * l_deco_array, * l_offset_array;
+    OPJ_UINT32 l_data_size, l_mct_size, l_offset_size;
+    OPJ_UINT32 l_nb_elem;
+    OPJ_UINT32 * l_offset_data, * l_current_offset_data;
+    opj_tccp_t * l_tccp;
 
-        /* preconditions */
-        assert(p_tcp != 00);
+    /* preconditions */
+    assert(p_tcp != 00);
 
-        l_mcc_record = p_tcp->m_mcc_records;
+    l_mcc_record = p_tcp->m_mcc_records;
 
-        for (i=0;i<p_tcp->m_nb_mcc_records;++i) {
-                if (l_mcc_record->m_index == p_index) {
-                        break;
-                }
+    for (i = 0; i < p_tcp->m_nb_mcc_records; ++i) {
+        if (l_mcc_record->m_index == p_index) {
+            break;
         }
+    }
 
-        if (i==p_tcp->m_nb_mcc_records) {
-                /** element discarded **/
-                return OPJ_TRUE;
-        }
-
-        if (l_mcc_record->m_nb_comps != p_image->numcomps) {
-                /** do not support number of comps != image */
-                return OPJ_TRUE;
-        }
-
-        l_deco_array = l_mcc_record->m_decorrelation_array;
-
-        if (l_deco_array) {
-                l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps * p_image->numcomps;
-                if (l_deco_array->m_data_size != l_data_size || ! l_deco_array->m_data) {
-                        return OPJ_FALSE;
-                }
-
-                l_nb_elem = p_image->numcomps * p_image->numcomps;
-                l_mct_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
-                p_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
-
-                if (! p_tcp->m_mct_decoding_matrix ) {
-                        return OPJ_FALSE;
-                }
-
-                j2k_mct_read_functions_to_float[l_deco_array->m_element_type](l_deco_array->m_data,p_tcp->m_mct_decoding_matrix,l_nb_elem);
-        }
-
-        l_offset_array = l_mcc_record->m_offset_array;
-
-        if (l_offset_array) {
-                l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] * p_image->numcomps;
-                if (l_offset_array->m_data_size != l_data_size || ! l_offset_array->m_data) {
-                        return OPJ_FALSE;
-                }
-
-                l_nb_elem = p_image->numcomps;
-                l_offset_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_UINT32);
-                l_offset_data = (OPJ_UINT32*)opj_malloc(l_offset_size);
-
-                if (! l_offset_data ) {
-                        return OPJ_FALSE;
-                }
-
-                j2k_mct_read_functions_to_int32[l_offset_array->m_element_type](l_offset_array->m_data,l_offset_data,l_nb_elem);
-
-                l_tccp = p_tcp->tccps;
-                l_current_offset_data = l_offset_data;
-
-                for (i=0;i<p_image->numcomps;++i) {
-                        l_tccp->m_dc_level_shift = (OPJ_INT32)*(l_current_offset_data++);
-                        ++l_tccp;
-                }
-
-                opj_free(l_offset_data);
-        }
-
+    if (i == p_tcp->m_nb_mcc_records) {
+        /** element discarded **/
         return OPJ_TRUE;
+    }
+
+    if (l_mcc_record->m_nb_comps != p_image->numcomps) {
+        /** do not support number of comps != image */
+        return OPJ_TRUE;
+    }
+
+    l_deco_array = l_mcc_record->m_decorrelation_array;
+
+    if (l_deco_array) {
+        l_data_size = MCT_ELEMENT_SIZE[l_deco_array->m_element_type] * p_image->numcomps
+                      * p_image->numcomps;
+        if (l_deco_array->m_data_size != l_data_size || ! l_deco_array->m_data) {
+            return OPJ_FALSE;
+        }
+
+        l_nb_elem = p_image->numcomps * p_image->numcomps;
+        l_mct_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+        p_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
+
+        if (! p_tcp->m_mct_decoding_matrix) {
+            return OPJ_FALSE;
+        }
+
+        j2k_mct_read_functions_to_float[l_deco_array->m_element_type](
+            l_deco_array->m_data, p_tcp->m_mct_decoding_matrix, l_nb_elem);
+    }
+
+    l_offset_array = l_mcc_record->m_offset_array;
+
+    if (l_offset_array) {
+        l_data_size = MCT_ELEMENT_SIZE[l_offset_array->m_element_type] *
+                      p_image->numcomps;
+        if (l_offset_array->m_data_size != l_data_size || ! l_offset_array->m_data) {
+            return OPJ_FALSE;
+        }
+
+        l_nb_elem = p_image->numcomps;
+        l_offset_size = l_nb_elem * (OPJ_UINT32)sizeof(OPJ_UINT32);
+        l_offset_data = (OPJ_UINT32*)opj_malloc(l_offset_size);
+
+        if (! l_offset_data) {
+            return OPJ_FALSE;
+        }
+
+        j2k_mct_read_functions_to_int32[l_offset_array->m_element_type](
+            l_offset_array->m_data, l_offset_data, l_nb_elem);
+
+        l_tccp = p_tcp->tccps;
+        l_current_offset_data = l_offset_data;
+
+        for (i = 0; i < p_image->numcomps; ++i) {
+            l_tccp->m_dc_level_shift = (OPJ_INT32) * (l_current_offset_data++);
+            ++l_tccp;
+        }
+
+        opj_free(l_offset_data);
+    }
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_cbd( opj_j2k_t *p_j2k,
-                                                struct opj_stream_private *p_stream,
-                                                struct opj_event_mgr * p_manager )
+static OPJ_BOOL opj_j2k_write_cbd(opj_j2k_t *p_j2k,
+                                  struct opj_stream_private *p_stream,
+                                  struct opj_event_mgr * p_manager)
 {
-        OPJ_UINT32 i;
-        OPJ_UINT32 l_cbd_size;
-        OPJ_BYTE * l_current_data = 00;
-        opj_image_t *l_image = 00;
-        opj_image_comp_t * l_comp = 00;
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_cbd_size;
+    OPJ_BYTE * l_current_data = 00;
+    opj_image_t *l_image = 00;
+    opj_image_comp_t * l_comp = 00;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        l_image = p_j2k->m_private_image;
-        l_cbd_size = 6 + p_j2k->m_private_image->numcomps;
+    l_image = p_j2k->m_private_image;
+    l_cbd_size = 6 + p_j2k->m_private_image->numcomps;
 
-        if (l_cbd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
-                OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size);
-                if (! new_header_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write CBD marker\n");
-                        return OPJ_FALSE;
-                }
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_cbd_size;
+    if (l_cbd_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) {
+        OPJ_BYTE *new_header_tile_data = (OPJ_BYTE *) opj_realloc(
+                                             p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size);
+        if (! new_header_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data = NULL;
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to write CBD marker\n");
+            return OPJ_FALSE;
         }
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data;
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_cbd_size;
+    }
 
-        l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
+    l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data;
 
-        opj_write_bytes(l_current_data,J2K_MS_CBD,2);                   /* CBD */
-        l_current_data += 2;
+    opj_write_bytes(l_current_data, J2K_MS_CBD, 2);                 /* CBD */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,l_cbd_size-2,2);                 /* L_CBD */
-        l_current_data += 2;
+    opj_write_bytes(l_current_data, l_cbd_size - 2, 2);             /* L_CBD */
+    l_current_data += 2;
 
-        opj_write_bytes(l_current_data,l_image->numcomps, 2);           /* Ncbd */
-        l_current_data+=2;
+    opj_write_bytes(l_current_data, l_image->numcomps, 2);          /* Ncbd */
+    l_current_data += 2;
 
-        l_comp = l_image->comps;
+    l_comp = l_image->comps;
 
-        for (i=0;i<l_image->numcomps;++i) {
-                opj_write_bytes(l_current_data, (l_comp->sgnd << 7) | (l_comp->prec - 1), 1);           /* Component bit depth */
-                ++l_current_data;
+    for (i = 0; i < l_image->numcomps; ++i) {
+        opj_write_bytes(l_current_data, (l_comp->sgnd << 7) | (l_comp->prec - 1),
+                        1);           /* Component bit depth */
+        ++l_current_data;
 
-                ++l_comp;
-        }
+        ++l_comp;
+    }
 
-        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_header_tile_data,l_cbd_size,p_manager) != l_cbd_size) {
-                return OPJ_FALSE;
-        }
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_header_tile_data, l_cbd_size,
+                              p_manager) != l_cbd_size) {
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /**
@@ -5833,47 +6316,56 @@
  * @param       p_header_size   the size of the data contained in the CBD marker.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_read_cbd (      opj_j2k_t *p_j2k,
-                                                                OPJ_BYTE * p_header_data,
-                                                                OPJ_UINT32 p_header_size,
-                                                                opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_read_cbd(opj_j2k_t *p_j2k,
+                                 OPJ_BYTE * p_header_data,
+                                 OPJ_UINT32 p_header_size,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-        OPJ_UINT32 l_nb_comp,l_num_comp;
-        OPJ_UINT32 l_comp_def;
-        OPJ_UINT32 i;
-        opj_image_comp_t * l_comp = 00;
+    OPJ_UINT32 l_nb_comp, l_num_comp;
+    OPJ_UINT32 l_comp_def;
+    OPJ_UINT32 i;
+    opj_image_comp_t * l_comp = 00;
 
-        /* preconditions */
-        assert(p_header_data != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        l_num_comp = p_j2k->m_private_image->numcomps;
+    l_num_comp = p_j2k->m_private_image->numcomps;
 
-        if (p_header_size != (p_j2k->m_private_image->numcomps + 2)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
-                return OPJ_FALSE;
+    if (p_header_size != (p_j2k->m_private_image->numcomps + 2)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
+        return OPJ_FALSE;
+    }
+
+    opj_read_bytes(p_header_data, &l_nb_comp,
+                   2);                           /* Ncbd */
+    p_header_data += 2;
+
+    if (l_nb_comp != l_num_comp) {
+        opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
+        return OPJ_FALSE;
+    }
+
+    l_comp = p_j2k->m_private_image->comps;
+    for (i = 0; i < l_num_comp; ++i) {
+        opj_read_bytes(p_header_data, &l_comp_def,
+                       1);                  /* Component bit depth */
+        ++p_header_data;
+        l_comp->sgnd = (l_comp_def >> 7) & 1;
+        l_comp->prec = (l_comp_def & 0x7f) + 1;
+
+        if (l_comp->prec > 31) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Invalid values for comp = %d : prec=%u (should be between 1 and 38 according to the JPEG2000 norm. OpenJpeg only supports up to 31)\n",
+                          i, l_comp->prec);
+            return OPJ_FALSE;
         }
+        ++l_comp;
+    }
 
-        opj_read_bytes(p_header_data,&l_nb_comp,2);                             /* Ncbd */
-        p_header_data+=2;
-
-        if (l_nb_comp != l_num_comp) {
-                opj_event_msg(p_manager, EVT_ERROR, "Crror reading CBD marker\n");
-                return OPJ_FALSE;
-        }
-
-        l_comp = p_j2k->m_private_image->comps;
-        for (i=0;i<l_num_comp;++i) {
-                opj_read_bytes(p_header_data,&l_comp_def,1);                    /* Component bit depth */
-                ++p_header_data;
-        l_comp->sgnd = (l_comp_def>>7) & 1;
-                l_comp->prec = (l_comp_def&0x7f) + 1;
-                ++l_comp;
-        }
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /* ----------------------------------------------------------------------- */
@@ -5882,16 +6374,46 @@
 
 void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters)
 {
-        if(j2k && parameters) {
-                j2k->m_cp.m_specific_param.m_dec.m_layer = parameters->cp_layer;
-                j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce;
+    if (j2k && parameters) {
+        j2k->m_cp.m_specific_param.m_dec.m_layer = parameters->cp_layer;
+        j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce;
 
+        j2k->dump_state = (parameters->flags & OPJ_DPARAMETERS_DUMP_FLAG);
 #ifdef USE_JPWL
-                j2k->m_cp.correct = parameters->jpwl_correct;
-                j2k->m_cp.exp_comps = parameters->jpwl_exp_comps;
-                j2k->m_cp.max_tiles = parameters->jpwl_max_tiles;
+        j2k->m_cp.correct = parameters->jpwl_correct;
+        j2k->m_cp.exp_comps = parameters->jpwl_exp_comps;
+        j2k->m_cp.max_tiles = parameters->jpwl_max_tiles;
 #endif /* USE_JPWL */
+    }
+}
+
+OPJ_BOOL opj_j2k_set_threads(opj_j2k_t *j2k, OPJ_UINT32 num_threads)
+{
+    if (opj_has_thread_support()) {
+        opj_thread_pool_destroy(j2k->m_tp);
+        j2k->m_tp = NULL;
+        if (num_threads <= (OPJ_UINT32)INT_MAX) {
+            j2k->m_tp = opj_thread_pool_create((int)num_threads);
         }
+        if (j2k->m_tp == NULL) {
+            j2k->m_tp = opj_thread_pool_create(0);
+            return OPJ_FALSE;
+        }
+        return OPJ_TRUE;
+    }
+    return OPJ_FALSE;
+}
+
+static int opj_j2k_get_default_thread_count()
+{
+    const char* num_threads = getenv("OPJ_NUM_THREADS");
+    if (num_threads == NULL || !opj_has_thread_support()) {
+        return 0;
+    }
+    if (strcmp(num_threads, "ALL_CPUS") == 0) {
+        return opj_get_num_cpus();
+    }
+    return atoi(num_threads);
 }
 
 /* ----------------------------------------------------------------------- */
@@ -5900,50 +6422,62 @@
 
 opj_j2k_t* opj_j2k_create_compress(void)
 {
-        opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1,sizeof(opj_j2k_t));
-        if (!l_j2k) {
-                return NULL;
-        }
+    opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
+    if (!l_j2k) {
+        return NULL;
+    }
 
 
-        l_j2k->m_is_decoder = 0;
-        l_j2k->m_cp.m_is_decoder = 0;
+    l_j2k->m_is_decoder = 0;
+    l_j2k->m_cp.m_is_decoder = 0;
 
-        l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(OPJ_J2K_DEFAULT_HEADER_SIZE);
-        if (! l_j2k->m_specific_param.m_encoder.m_header_tile_data) {
-                opj_j2k_destroy(l_j2k);
-                return NULL;
-        }
+    l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(
+                OPJ_J2K_DEFAULT_HEADER_SIZE);
+    if (! l_j2k->m_specific_param.m_encoder.m_header_tile_data) {
+        opj_j2k_destroy(l_j2k);
+        return NULL;
+    }
 
-        l_j2k->m_specific_param.m_encoder.m_header_tile_data_size = OPJ_J2K_DEFAULT_HEADER_SIZE;
+    l_j2k->m_specific_param.m_encoder.m_header_tile_data_size =
+        OPJ_J2K_DEFAULT_HEADER_SIZE;
 
-        /* validation list creation*/
-        l_j2k->m_validation_list = opj_procedure_list_create();
-        if (! l_j2k->m_validation_list) {
-                opj_j2k_destroy(l_j2k);
-                return NULL;
-        }
+    /* validation list creation*/
+    l_j2k->m_validation_list = opj_procedure_list_create();
+    if (! l_j2k->m_validation_list) {
+        opj_j2k_destroy(l_j2k);
+        return NULL;
+    }
 
-        /* execution list creation*/
-        l_j2k->m_procedure_list = opj_procedure_list_create();
-        if (! l_j2k->m_procedure_list) {
-                opj_j2k_destroy(l_j2k);
-                return NULL;
-        }
+    /* execution list creation*/
+    l_j2k->m_procedure_list = opj_procedure_list_create();
+    if (! l_j2k->m_procedure_list) {
+        opj_j2k_destroy(l_j2k);
+        return NULL;
+    }
 
-        return l_j2k;
+    l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
+    if (!l_j2k->m_tp) {
+        l_j2k->m_tp = opj_thread_pool_create(0);
+    }
+    if (!l_j2k->m_tp) {
+        opj_j2k_destroy(l_j2k);
+        return NULL;
+    }
+
+    return l_j2k;
 }
 
-static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres){
+static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres)
+{
     POC[0].tile  = 1;
     POC[0].resno0  = 0;
     POC[0].compno0 = 0;
     POC[0].layno1  = 1;
-    POC[0].resno1  = (OPJ_UINT32)(numres-1);
+    POC[0].resno1  = (OPJ_UINT32)(numres - 1);
     POC[0].compno1 = 3;
     POC[0].prg1 = OPJ_CPRL;
     POC[1].tile  = 1;
-    POC[1].resno0  = (OPJ_UINT32)(numres-1);
+    POC[1].resno0  = (OPJ_UINT32)(numres - 1);
     POC[1].compno0 = 0;
     POC[1].layno1  = 1;
     POC[1].resno1  = (OPJ_UINT32)numres;
@@ -5952,15 +6486,16 @@
     return 2;
 }
 
-static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager)
+static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters,
+        opj_image_t *image, opj_event_mgr_t *p_manager)
 {
     /* Configure cinema parameters */
     int i;
 
     /* No tiling */
     parameters->tile_size_on = OPJ_FALSE;
-    parameters->cp_tdx=1;
-    parameters->cp_tdy=1;
+    parameters->cp_tdx = 1;
+    parameters->cp_tdy = 1;
 
     /* One tile part for each component */
     parameters->tp_flag = 'C';
@@ -5990,43 +6525,44 @@
     parameters->irreversible = 1;
 
     /* Number of layers */
-    if (parameters->tcp_numlayers > 1){
+    if (parameters->tcp_numlayers > 1) {
         opj_event_msg(p_manager, EVT_WARNING,
-                "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
-                "1 single quality layer"
-                "-> Number of layers forced to 1 (rather than %d)\n"
-                "-> Rate of the last layer (%3.1f) will be used",
-                parameters->tcp_numlayers, parameters->tcp_rates[parameters->tcp_numlayers-1]);
-        parameters->tcp_rates[0] = parameters->tcp_rates[parameters->tcp_numlayers-1];
+                      "JPEG 2000 Profile-3 and 4 (2k/4k dc profile) requires:\n"
+                      "1 single quality layer"
+                      "-> Number of layers forced to 1 (rather than %d)\n"
+                      "-> Rate of the last layer (%3.1f) will be used",
+                      parameters->tcp_numlayers,
+                      parameters->tcp_rates[parameters->tcp_numlayers - 1]);
+        parameters->tcp_rates[0] = parameters->tcp_rates[parameters->tcp_numlayers - 1];
         parameters->tcp_numlayers = 1;
     }
 
     /* Resolution levels */
-    switch (parameters->rsiz){
+    switch (parameters->rsiz) {
     case OPJ_PROFILE_CINEMA_2K:
-        if(parameters->numresolution > 6){
+        if (parameters->numresolution > 6) {
             opj_event_msg(p_manager, EVT_WARNING,
-                    "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
-                    "Number of decomposition levels <= 5\n"
-                    "-> Number of decomposition levels forced to 5 (rather than %d)\n",
-                    parameters->numresolution+1);
+                          "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+                          "Number of decomposition levels <= 5\n"
+                          "-> Number of decomposition levels forced to 5 (rather than %d)\n",
+                          parameters->numresolution + 1);
             parameters->numresolution = 6;
         }
         break;
     case OPJ_PROFILE_CINEMA_4K:
-        if(parameters->numresolution < 2){
+        if (parameters->numresolution < 2) {
             opj_event_msg(p_manager, EVT_WARNING,
-                    "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
-                    "Number of decomposition levels >= 1 && <= 6\n"
-                    "-> Number of decomposition levels forced to 1 (rather than %d)\n",
-                    parameters->numresolution+1);
+                          "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
+                          "Number of decomposition levels >= 1 && <= 6\n"
+                          "-> Number of decomposition levels forced to 1 (rather than %d)\n",
+                          parameters->numresolution + 1);
             parameters->numresolution = 1;
-        }else if(parameters->numresolution > 7){
+        } else if (parameters->numresolution > 7) {
             opj_event_msg(p_manager, EVT_WARNING,
-                    "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
-                    "Number of decomposition levels >= 1 && <= 6\n"
-                    "-> Number of decomposition levels forced to 6 (rather than %d)\n",
-                    parameters->numresolution+1);
+                          "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
+                          "Number of decomposition levels >= 1 && <= 6\n"
+                          "-> Number of decomposition levels forced to 6 (rather than %d)\n",
+                          parameters->numresolution + 1);
             parameters->numresolution = 7;
         }
         break;
@@ -6036,8 +6572,8 @@
 
     /* Precincts */
     parameters->csty |= 0x01;
-    parameters->res_spec = parameters->numresolution-1;
-    for (i = 0; i<parameters->res_spec; i++) {
+    parameters->res_spec = parameters->numresolution - 1;
+    for (i = 0; i < parameters->res_spec; i++) {
         parameters->prcw_init[i] = 256;
         parameters->prch_init[i] = 256;
     }
@@ -6047,7 +6583,8 @@
 
     /* Progression order changes for 4K, disallowed for 2K */
     if (parameters->rsiz == OPJ_PROFILE_CINEMA_4K) {
-        parameters->numpocs = (OPJ_UINT32)opj_j2k_initialise_4K_poc(parameters->POC,parameters->numresolution);
+        parameters->numpocs = (OPJ_UINT32)opj_j2k_initialise_4K_poc(parameters->POC,
+                              parameters->numresolution);
     } else {
         parameters->numpocs = 0;
     }
@@ -6084,63 +6621,66 @@
         parameters->max_comp_size = OPJ_CINEMA_24_COMP;
     }
 
-    parameters->tcp_rates[0] = (OPJ_FLOAT32) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/
-            (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx * image->comps[0].dy);
+    parameters->tcp_rates[0] = (OPJ_FLOAT32)(image->numcomps * image->comps[0].w *
+                               image->comps[0].h * image->comps[0].prec) /
+                               (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx *
+                                       image->comps[0].dy);
 
 }
 
-static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz, opj_event_mgr_t *p_manager)
+static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz,
+        opj_event_mgr_t *p_manager)
 {
     OPJ_UINT32 i;
 
     /* Number of components */
-    if (image->numcomps != 3){
+    if (image->numcomps != 3) {
         opj_event_msg(p_manager, EVT_WARNING,
-                "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
-                "3 components"
-                "-> Number of components of input image (%d) is not compliant\n"
-                "-> Non-profile-3 codestream will be generated\n",
-                image->numcomps);
+                      "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+                      "3 components"
+                      "-> Number of components of input image (%d) is not compliant\n"
+                      "-> Non-profile-3 codestream will be generated\n",
+                      image->numcomps);
         return OPJ_FALSE;
     }
 
     /* Bitdepth */
     for (i = 0; i < image->numcomps; i++) {
-        if ((image->comps[i].bpp != 12) | (image->comps[i].sgnd)){
+        if ((image->comps[i].bpp != 12) | (image->comps[i].sgnd)) {
             char signed_str[] = "signed";
             char unsigned_str[] = "unsigned";
-            char *tmp_str = image->comps[i].sgnd?signed_str:unsigned_str;
+            char *tmp_str = image->comps[i].sgnd ? signed_str : unsigned_str;
             opj_event_msg(p_manager, EVT_WARNING,
-                    "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
-                    "Precision of each component shall be 12 bits unsigned"
-                    "-> At least component %d of input image (%d bits, %s) is not compliant\n"
-                    "-> Non-profile-3 codestream will be generated\n",
-                    i,image->comps[i].bpp, tmp_str);
+                          "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+                          "Precision of each component shall be 12 bits unsigned"
+                          "-> At least component %d of input image (%d bits, %s) is not compliant\n"
+                          "-> Non-profile-3 codestream will be generated\n",
+                          i, image->comps[i].bpp, tmp_str);
             return OPJ_FALSE;
         }
     }
 
     /* Image size */
-    switch (rsiz){
+    switch (rsiz) {
     case OPJ_PROFILE_CINEMA_2K:
-        if (((image->comps[0].w > 2048) | (image->comps[0].h > 1080))){
+        if (((image->comps[0].w > 2048) | (image->comps[0].h > 1080))) {
             opj_event_msg(p_manager, EVT_WARNING,
-                    "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
-                    "width <= 2048 and height <= 1080\n"
-                    "-> Input image size %d x %d is not compliant\n"
-                    "-> Non-profile-3 codestream will be generated\n",
-                    image->comps[0].w,image->comps[0].h);
+                          "JPEG 2000 Profile-3 (2k dc profile) requires:\n"
+                          "width <= 2048 and height <= 1080\n"
+                          "-> Input image size %d x %d is not compliant\n"
+                          "-> Non-profile-3 codestream will be generated\n",
+                          image->comps[0].w, image->comps[0].h);
             return OPJ_FALSE;
         }
         break;
     case OPJ_PROFILE_CINEMA_4K:
-        if (((image->comps[0].w > 4096) | (image->comps[0].h > 2160))){
+        if (((image->comps[0].w > 4096) | (image->comps[0].h > 2160))) {
             opj_event_msg(p_manager, EVT_WARNING,
-                    "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
-                    "width <= 4096 and height <= 2160\n"
-                    "-> Image size %d x %d is not compliant\n"
-                    "-> Non-profile-4 codestream will be generated\n",
-                    image->comps[0].w,image->comps[0].h);
+                          "JPEG 2000 Profile-4 (4k dc profile) requires:\n"
+                          "width <= 4096 and height <= 2160\n"
+                          "-> Image size %d x %d is not compliant\n"
+                          "-> Non-profile-4 codestream will be generated\n",
+                          image->comps[0].w, image->comps[0].h);
             return OPJ_FALSE;
         }
         break;
@@ -6151,573 +6691,617 @@
     return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_j2k_setup_encoder(     opj_j2k_t *p_j2k,
-                                                    opj_cparameters_t *parameters,
-                                                    opj_image_t *image,
-                                                    opj_event_mgr_t * p_manager)
+OPJ_BOOL opj_j2k_setup_encoder(opj_j2k_t *p_j2k,
+                               opj_cparameters_t *parameters,
+                               opj_image_t *image,
+                               opj_event_mgr_t * p_manager)
 {
-        OPJ_UINT32 i, j, tileno, numpocs_tile;
-        opj_cp_t *cp = 00;
+    OPJ_UINT32 i, j, tileno, numpocs_tile;
+    opj_cp_t *cp = 00;
 
-        if(!p_j2k || !parameters || ! image) {
-                return OPJ_FALSE;
+    if (!p_j2k || !parameters || ! image) {
+        return OPJ_FALSE;
+    }
+
+    if ((parameters->numresolution <= 0) ||
+            (parameters->numresolution > OPJ_J2K_MAXRLVLS)) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Invalid number of resolutions : %d not in range [1,%d]\n",
+                      parameters->numresolution, OPJ_J2K_MAXRLVLS);
+        return OPJ_FALSE;
+    }
+
+    /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
+    cp = &(p_j2k->m_cp);
+
+    /* set default values for cp */
+    cp->tw = 1;
+    cp->th = 1;
+
+    /* FIXME ADE: to be removed once deprecated cp_cinema and cp_rsiz have been removed */
+    if (parameters->rsiz ==
+            OPJ_PROFILE_NONE) { /* consider deprecated fields only if RSIZ has not been set */
+        OPJ_BOOL deprecated_used = OPJ_FALSE;
+        switch (parameters->cp_cinema) {
+        case OPJ_CINEMA2K_24:
+            parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
+            parameters->max_cs_size = OPJ_CINEMA_24_CS;
+            parameters->max_comp_size = OPJ_CINEMA_24_COMP;
+            deprecated_used = OPJ_TRUE;
+            break;
+        case OPJ_CINEMA2K_48:
+            parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
+            parameters->max_cs_size = OPJ_CINEMA_48_CS;
+            parameters->max_comp_size = OPJ_CINEMA_48_COMP;
+            deprecated_used = OPJ_TRUE;
+            break;
+        case OPJ_CINEMA4K_24:
+            parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
+            parameters->max_cs_size = OPJ_CINEMA_24_CS;
+            parameters->max_comp_size = OPJ_CINEMA_24_COMP;
+            deprecated_used = OPJ_TRUE;
+            break;
+        case OPJ_OFF:
+        default:
+            break;
         }
+        switch (parameters->cp_rsiz) {
+        case OPJ_CINEMA2K:
+            parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
+            deprecated_used = OPJ_TRUE;
+            break;
+        case OPJ_CINEMA4K:
+            parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
+            deprecated_used = OPJ_TRUE;
+            break;
+        case OPJ_MCT:
+            parameters->rsiz = OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT;
+            deprecated_used = OPJ_TRUE;
+        case OPJ_STD_RSIZ:
+        default:
+            break;
+        }
+        if (deprecated_used) {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "Deprecated fields cp_cinema or cp_rsiz are used\n"
+                          "Please consider using only the rsiz field\n"
+                          "See openjpeg.h documentation for more details\n");
+        }
+    }
 
-        if ((parameters->numresolution <= 0) || (parameters->numresolution > OPJ_J2K_MAXRLVLS)) {
-            opj_event_msg(p_manager, EVT_ERROR, "Invalid number of resolutions : %d not in range [1,%d]\n", parameters->numresolution, OPJ_J2K_MAXRLVLS);
+    /* see if max_codestream_size does limit input rate */
+    if (parameters->max_cs_size <= 0) {
+        if (parameters->tcp_rates[parameters->tcp_numlayers - 1] > 0) {
+            OPJ_FLOAT32 temp_size;
+            temp_size = (OPJ_FLOAT32)(image->numcomps * image->comps[0].w *
+                                      image->comps[0].h * image->comps[0].prec) /
+                        (parameters->tcp_rates[parameters->tcp_numlayers - 1] * 8 *
+                         (OPJ_FLOAT32)image->comps[0].dx * (OPJ_FLOAT32)image->comps[0].dy);
+            parameters->max_cs_size = (int) floor(temp_size);
+        } else {
+            parameters->max_cs_size = 0;
+        }
+    } else {
+        OPJ_FLOAT32 temp_rate;
+        OPJ_BOOL cap = OPJ_FALSE;
+        temp_rate = (OPJ_FLOAT32)(image->numcomps * image->comps[0].w *
+                                  image->comps[0].h * image->comps[0].prec) /
+                    (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx *
+                                  image->comps[0].dy);
+        for (i = 0; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
+            if (parameters->tcp_rates[i] < temp_rate) {
+                parameters->tcp_rates[i] = temp_rate;
+                cap = OPJ_TRUE;
+            }
+        }
+        if (cap) {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "The desired maximum codestream size has limited\n"
+                          "at least one of the desired quality layers\n");
+        }
+    }
+
+    /* Manage profiles and applications and set RSIZ */
+    /* set cinema parameters if required */
+    if (OPJ_IS_CINEMA(parameters->rsiz)) {
+        if ((parameters->rsiz == OPJ_PROFILE_CINEMA_S2K)
+                || (parameters->rsiz == OPJ_PROFILE_CINEMA_S4K)) {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "JPEG 2000 Scalable Digital Cinema profiles not yet supported\n");
+            parameters->rsiz = OPJ_PROFILE_NONE;
+        } else {
+            opj_j2k_set_cinema_parameters(parameters, image, p_manager);
+            if (!opj_j2k_is_cinema_compliant(image, parameters->rsiz, p_manager)) {
+                parameters->rsiz = OPJ_PROFILE_NONE;
+            }
+        }
+    } else if (OPJ_IS_STORAGE(parameters->rsiz)) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "JPEG 2000 Long Term Storage profile not yet supported\n");
+        parameters->rsiz = OPJ_PROFILE_NONE;
+    } else if (OPJ_IS_BROADCAST(parameters->rsiz)) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "JPEG 2000 Broadcast profiles not yet supported\n");
+        parameters->rsiz = OPJ_PROFILE_NONE;
+    } else if (OPJ_IS_IMF(parameters->rsiz)) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "JPEG 2000 IMF profiles not yet supported\n");
+        parameters->rsiz = OPJ_PROFILE_NONE;
+    } else if (OPJ_IS_PART2(parameters->rsiz)) {
+        if (parameters->rsiz == ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_NONE))) {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "JPEG 2000 Part-2 profile defined\n"
+                          "but no Part-2 extension enabled.\n"
+                          "Profile set to NONE.\n");
+            parameters->rsiz = OPJ_PROFILE_NONE;
+        } else if (parameters->rsiz != ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_MCT))) {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "Unsupported Part-2 extension enabled\n"
+                          "Profile set to NONE.\n");
+            parameters->rsiz = OPJ_PROFILE_NONE;
+        }
+    }
+
+    /*
+    copy user encoding parameters
+    */
+    cp->m_specific_param.m_enc.m_max_comp_size = (OPJ_UINT32)
+            parameters->max_comp_size;
+    cp->rsiz = parameters->rsiz;
+    cp->m_specific_param.m_enc.m_disto_alloc = (OPJ_UINT32)
+            parameters->cp_disto_alloc & 1u;
+    cp->m_specific_param.m_enc.m_fixed_alloc = (OPJ_UINT32)
+            parameters->cp_fixed_alloc & 1u;
+    cp->m_specific_param.m_enc.m_fixed_quality = (OPJ_UINT32)
+            parameters->cp_fixed_quality & 1u;
+
+    /* mod fixed_quality */
+    if (parameters->cp_fixed_alloc && parameters->cp_matrice) {
+        size_t array_size = (size_t)parameters->tcp_numlayers *
+                            (size_t)parameters->numresolution * 3 * sizeof(OPJ_INT32);
+        cp->m_specific_param.m_enc.m_matrice = (OPJ_INT32 *) opj_malloc(array_size);
+        if (!cp->m_specific_param.m_enc.m_matrice) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Not enough memory to allocate copy of user encoding parameters matrix \n");
             return OPJ_FALSE;
         }
+        memcpy(cp->m_specific_param.m_enc.m_matrice, parameters->cp_matrice,
+               array_size);
+    }
 
-        /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
-        cp = &(p_j2k->m_cp);
+    /* tiles */
+    cp->tdx = (OPJ_UINT32)parameters->cp_tdx;
+    cp->tdy = (OPJ_UINT32)parameters->cp_tdy;
 
-        /* set default values for cp */
-        cp->tw = 1;
-        cp->th = 1;
+    /* tile offset */
+    cp->tx0 = (OPJ_UINT32)parameters->cp_tx0;
+    cp->ty0 = (OPJ_UINT32)parameters->cp_ty0;
 
-        /* FIXME ADE: to be removed once deprecated cp_cinema and cp_rsiz have been removed */
-        if (parameters->rsiz == OPJ_PROFILE_NONE) { /* consider deprecated fields only if RSIZ has not been set */
-            OPJ_BOOL deprecated_used = OPJ_FALSE;
-            switch (parameters->cp_cinema){
-            case OPJ_CINEMA2K_24:
-                parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
-                parameters->max_cs_size = OPJ_CINEMA_24_CS;
-                parameters->max_comp_size = OPJ_CINEMA_24_COMP;
-                deprecated_used = OPJ_TRUE;
-                break;
-            case OPJ_CINEMA2K_48:
-                parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
-                parameters->max_cs_size = OPJ_CINEMA_48_CS;
-                parameters->max_comp_size = OPJ_CINEMA_48_COMP;
-                deprecated_used = OPJ_TRUE;
-                break;
-            case OPJ_CINEMA4K_24:
-                parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
-                parameters->max_cs_size = OPJ_CINEMA_24_CS;
-                parameters->max_comp_size = OPJ_CINEMA_24_COMP;
-                deprecated_used = OPJ_TRUE;
-                break;
-            case OPJ_OFF:
-            default:
-                break;
-            }
-            switch (parameters->cp_rsiz){
-            case OPJ_CINEMA2K:
-                parameters->rsiz = OPJ_PROFILE_CINEMA_2K;
-                deprecated_used = OPJ_TRUE;
-                break;
-            case OPJ_CINEMA4K:
-                parameters->rsiz = OPJ_PROFILE_CINEMA_4K;
-                deprecated_used = OPJ_TRUE;
-                break;
-            case OPJ_MCT:
-                parameters->rsiz = OPJ_PROFILE_PART2 | OPJ_EXTENSION_MCT;
-                deprecated_used = OPJ_TRUE;
-            case OPJ_STD_RSIZ:
-            default:
-                break;
-            }
-            if (deprecated_used) {
-                opj_event_msg(p_manager, EVT_WARNING,
-                        "Deprecated fields cp_cinema or cp_rsiz are used\n"
-                        "Please consider using only the rsiz field\n"
-                        "See openjpeg.h documentation for more details\n");
-            }
+    /* comment string */
+    if (parameters->cp_comment) {
+        cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1U);
+        if (!cp->comment) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Not enough memory to allocate copy of comment string\n");
+            return OPJ_FALSE;
         }
+        strcpy(cp->comment, parameters->cp_comment);
+    } else {
+        /* Create default comment for codestream */
+        const char comment[] = "Created by OpenJPEG version ";
+        const size_t clen = strlen(comment);
+        const char *version = opj_version();
 
-        /* see if max_codestream_size does limit input rate */
-        if (parameters->max_cs_size <= 0) {
-            if (parameters->tcp_rates[parameters->tcp_numlayers-1] > 0) {
-                OPJ_FLOAT32 temp_size;
-                temp_size =(OPJ_FLOAT32)(image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/
-                        (parameters->tcp_rates[parameters->tcp_numlayers-1] * 8 * (OPJ_FLOAT32)image->comps[0].dx * (OPJ_FLOAT32)image->comps[0].dy);
-                parameters->max_cs_size = (int) floor(temp_size);
-            } else {
-                parameters->max_cs_size = 0;
-            }
-        } else {
-            OPJ_FLOAT32 temp_rate;
-            OPJ_BOOL cap = OPJ_FALSE;
-            temp_rate = (OPJ_FLOAT32) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec)/
-                    (OPJ_FLOAT32)(((OPJ_UINT32)parameters->max_cs_size) * 8 * image->comps[0].dx * image->comps[0].dy);
-            for (i = 0; i < (OPJ_UINT32) parameters->tcp_numlayers; i++) {
-                if (parameters->tcp_rates[i] < temp_rate) {
-                    parameters->tcp_rates[i] = temp_rate;
-                    cap = OPJ_TRUE;
-                }
-            }
-            if (cap) {
-                opj_event_msg(p_manager, EVT_WARNING,
-                        "The desired maximum codestream size has limited\n"
-                        "at least one of the desired quality layers\n");
-            }
-        }
-
-        /* Manage profiles and applications and set RSIZ */
-        /* set cinema parameters if required */
-        if (OPJ_IS_CINEMA(parameters->rsiz)){
-            if ((parameters->rsiz == OPJ_PROFILE_CINEMA_S2K)
-                    || (parameters->rsiz == OPJ_PROFILE_CINEMA_S4K)){
-                opj_event_msg(p_manager, EVT_WARNING,
-                        "JPEG 2000 Scalable Digital Cinema profiles not yet supported\n");
-                parameters->rsiz = OPJ_PROFILE_NONE;
-            } else {
-                opj_j2k_set_cinema_parameters(parameters,image,p_manager);
-                if (!opj_j2k_is_cinema_compliant(image,parameters->rsiz,p_manager)) {
-                    parameters->rsiz = OPJ_PROFILE_NONE;
-                }
-            }
-        } else if (OPJ_IS_STORAGE(parameters->rsiz)) {
-            opj_event_msg(p_manager, EVT_WARNING,
-                    "JPEG 2000 Long Term Storage profile not yet supported\n");
-            parameters->rsiz = OPJ_PROFILE_NONE;
-        } else if (OPJ_IS_BROADCAST(parameters->rsiz)) {
-            opj_event_msg(p_manager, EVT_WARNING,
-                    "JPEG 2000 Broadcast profiles not yet supported\n");
-            parameters->rsiz = OPJ_PROFILE_NONE;
-        } else if (OPJ_IS_IMF(parameters->rsiz)) {
-            opj_event_msg(p_manager, EVT_WARNING,
-                    "JPEG 2000 IMF profiles not yet supported\n");
-            parameters->rsiz = OPJ_PROFILE_NONE;
-        } else if (OPJ_IS_PART2(parameters->rsiz)) {
-            if (parameters->rsiz == ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_NONE))) {
-                opj_event_msg(p_manager, EVT_WARNING,
-                              "JPEG 2000 Part-2 profile defined\n"
-                              "but no Part-2 extension enabled.\n"
-                              "Profile set to NONE.\n");
-                parameters->rsiz = OPJ_PROFILE_NONE;
-            } else if (parameters->rsiz != ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_MCT))) {
-                opj_event_msg(p_manager, EVT_WARNING,
-                              "Unsupported Part-2 extension enabled\n"
-                              "Profile set to NONE.\n");
-                parameters->rsiz = OPJ_PROFILE_NONE;
-            }
-        }
-
-        /*
-        copy user encoding parameters
-        */
-        cp->m_specific_param.m_enc.m_max_comp_size = (OPJ_UINT32)parameters->max_comp_size;
-        cp->rsiz = parameters->rsiz;
-        cp->m_specific_param.m_enc.m_disto_alloc = (OPJ_UINT32)parameters->cp_disto_alloc & 1u;
-        cp->m_specific_param.m_enc.m_fixed_alloc = (OPJ_UINT32)parameters->cp_fixed_alloc & 1u;
-        cp->m_specific_param.m_enc.m_fixed_quality = (OPJ_UINT32)parameters->cp_fixed_quality & 1u;
-
-        /* mod fixed_quality */
-        if (parameters->cp_fixed_alloc && parameters->cp_matrice) {
-                size_t array_size = (size_t)parameters->tcp_numlayers * (size_t)parameters->numresolution * 3 * sizeof(OPJ_INT32);
-                cp->m_specific_param.m_enc.m_matrice = (OPJ_INT32 *) opj_malloc(array_size);
-								if (!cp->m_specific_param.m_enc.m_matrice) {
-								        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate copy of user encoding parameters matrix \n");
-								        return OPJ_FALSE;
-								}
-                memcpy(cp->m_specific_param.m_enc.m_matrice, parameters->cp_matrice, array_size);
-        }
-
-        /* tiles */
-        cp->tdx = (OPJ_UINT32)parameters->cp_tdx;
-        cp->tdy = (OPJ_UINT32)parameters->cp_tdy;
-
-        /* tile offset */
-        cp->tx0 = (OPJ_UINT32)parameters->cp_tx0;
-        cp->ty0 = (OPJ_UINT32)parameters->cp_ty0;
-
-        /* comment string */
-        if(parameters->cp_comment) {
-                cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1U);
-								if(!cp->comment) {
-								        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate copy of comment string\n");
-								        return OPJ_FALSE;
-								}
-                strcpy(cp->comment, parameters->cp_comment);
-        } else {
-                /* Create default comment for codestream */
-                const char comment[] = "Created by OpenJPEG version ";
-                const size_t clen = strlen(comment);
-                const char *version = opj_version();
-
-                /* UniPG>> */
+        /* UniPG>> */
 #ifdef USE_JPWL
-                cp->comment = (char*)opj_malloc(clen+strlen(version)+11);
-								if(!cp->comment) {
-								        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate comment string\n");
-								        return OPJ_FALSE;
-								}
-                sprintf(cp->comment,"%s%s with JPWL", comment, version);
+        cp->comment = (char*)opj_malloc(clen + strlen(version) + 11);
+        if (!cp->comment) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Not enough memory to allocate comment string\n");
+            return OPJ_FALSE;
+        }
+        sprintf(cp->comment, "%s%s with JPWL", comment, version);
 #else
-                cp->comment = (char*)opj_malloc(clen+strlen(version)+1);
-								if(!cp->comment) {
-								        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate comment string\n");
-								        return OPJ_FALSE;
-								}
-                sprintf(cp->comment,"%s%s", comment, version);
+        cp->comment = (char*)opj_malloc(clen + strlen(version) + 1);
+        if (!cp->comment) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Not enough memory to allocate comment string\n");
+            return OPJ_FALSE;
+        }
+        sprintf(cp->comment, "%s%s", comment, version);
 #endif
-                /* <<UniPG */
-				}
+        /* <<UniPG */
+    }
 
-        /*
-        calculate other encoding parameters
-        */
+    /*
+    calculate other encoding parameters
+    */
 
-        if (parameters->tile_size_on) {
-                cp->tw = opj_uint_ceildiv(image->x1 - cp->tx0, cp->tdx);
-                cp->th = opj_uint_ceildiv(image->y1 - cp->ty0, cp->tdy);
-        } else {
-                cp->tdx = image->x1 - cp->tx0;
-                cp->tdy = image->y1 - cp->ty0;
-        }
+    if (parameters->tile_size_on) {
+        cp->tw = opj_uint_ceildiv(image->x1 - cp->tx0, cp->tdx);
+        cp->th = opj_uint_ceildiv(image->y1 - cp->ty0, cp->tdy);
+    } else {
+        cp->tdx = image->x1 - cp->tx0;
+        cp->tdy = image->y1 - cp->ty0;
+    }
 
-        if (parameters->tp_on) {
-                cp->m_specific_param.m_enc.m_tp_flag = (OPJ_BYTE)parameters->tp_flag;
-                cp->m_specific_param.m_enc.m_tp_on = 1;
-        }
+    if (parameters->tp_on) {
+        cp->m_specific_param.m_enc.m_tp_flag = (OPJ_BYTE)parameters->tp_flag;
+        cp->m_specific_param.m_enc.m_tp_on = 1;
+    }
 
 #ifdef USE_JPWL
-        /*
-        calculate JPWL encoding parameters
-        */
+    /*
+    calculate JPWL encoding parameters
+    */
 
-        if (parameters->jpwl_epc_on) {
-                OPJ_INT32 i;
+    if (parameters->jpwl_epc_on) {
+        OPJ_INT32 i;
 
-                /* set JPWL on */
-                cp->epc_on = OPJ_TRUE;
-                cp->info_on = OPJ_FALSE; /* no informative technique */
+        /* set JPWL on */
+        cp->epc_on = OPJ_TRUE;
+        cp->info_on = OPJ_FALSE; /* no informative technique */
 
-                /* set EPB on */
-                if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {
-                        cp->epb_on = OPJ_TRUE;
+        /* set EPB on */
+        if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {
+            cp->epb_on = OPJ_TRUE;
 
-                        cp->hprot_MH = parameters->jpwl_hprot_MH;
-                        for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
-                                cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];
-                                cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];
-                        }
-                        /* if tile specs are not specified, copy MH specs */
-                        if (cp->hprot_TPH[0] == -1) {
-                                cp->hprot_TPH_tileno[0] = 0;
-                                cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;
-                        }
-                        for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
-                                cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];
-                                cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];
-                                cp->pprot[i] = parameters->jpwl_pprot[i];
-                        }
-                }
-
-                /* set ESD writing */
-                if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
-                        cp->esd_on = OPJ_TRUE;
-
-                        cp->sens_size = parameters->jpwl_sens_size;
-                        cp->sens_addr = parameters->jpwl_sens_addr;
-                        cp->sens_range = parameters->jpwl_sens_range;
-
-                        cp->sens_MH = parameters->jpwl_sens_MH;
-                        for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
-                                cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];
-                                cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];
-                        }
-                }
-
-                /* always set RED writing to false: we are at the encoder */
-                cp->red_on = OPJ_FALSE;
-
-        } else {
-                cp->epc_on = OPJ_FALSE;
+            cp->hprot_MH = parameters->jpwl_hprot_MH;
+            for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
+                cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];
+                cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];
+            }
+            /* if tile specs are not specified, copy MH specs */
+            if (cp->hprot_TPH[0] == -1) {
+                cp->hprot_TPH_tileno[0] = 0;
+                cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;
+            }
+            for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
+                cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];
+                cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];
+                cp->pprot[i] = parameters->jpwl_pprot[i];
+            }
         }
+
+        /* set ESD writing */
+        if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
+            cp->esd_on = OPJ_TRUE;
+
+            cp->sens_size = parameters->jpwl_sens_size;
+            cp->sens_addr = parameters->jpwl_sens_addr;
+            cp->sens_range = parameters->jpwl_sens_range;
+
+            cp->sens_MH = parameters->jpwl_sens_MH;
+            for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
+                cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];
+                cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];
+            }
+        }
+
+        /* always set RED writing to false: we are at the encoder */
+        cp->red_on = OPJ_FALSE;
+
+    } else {
+        cp->epc_on = OPJ_FALSE;
+    }
 #endif /* USE_JPWL */
 
-        /* initialize the mutiple tiles */
-        /* ---------------------------- */
-        cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
-        if (!cp->tcps) {
-                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate tile coding parameters\n");
-                return OPJ_FALSE;
+    /* initialize the mutiple tiles */
+    /* ---------------------------- */
+    cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
+    if (!cp->tcps) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Not enough memory to allocate tile coding parameters\n");
+        return OPJ_FALSE;
+    }
+    if (parameters->numpocs) {
+        /* initialisation of POC */
+        opj_j2k_check_poc_val(parameters->POC, parameters->numpocs,
+                              (OPJ_UINT32)parameters->numresolution, image->numcomps,
+                              (OPJ_UINT32)parameters->tcp_numlayers, p_manager);
+        /* TODO MSD use the return value*/
+    }
+
+    for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
+        opj_tcp_t *tcp = &cp->tcps[tileno];
+        tcp->numlayers = (OPJ_UINT32)parameters->tcp_numlayers;
+
+        for (j = 0; j < tcp->numlayers; j++) {
+            if (OPJ_IS_CINEMA(cp->rsiz)) {
+                if (cp->m_specific_param.m_enc.m_fixed_quality) {
+                    tcp->distoratio[j] = parameters->tcp_distoratio[j];
+                }
+                tcp->rates[j] = parameters->tcp_rates[j];
+            } else {
+                if (cp->m_specific_param.m_enc.m_fixed_quality) {       /* add fixed_quality */
+                    tcp->distoratio[j] = parameters->tcp_distoratio[j];
+                } else {
+                    tcp->rates[j] = parameters->tcp_rates[j];
+                }
+            }
         }
+
+        tcp->csty = (OPJ_UINT32)parameters->csty;
+        tcp->prg = parameters->prog_order;
+        tcp->mct = (OPJ_UINT32)parameters->tcp_mct;
+
+        numpocs_tile = 0;
+        tcp->POC = 0;
+
         if (parameters->numpocs) {
-                /* initialisation of POC */
-                opj_j2k_check_poc_val(parameters->POC,parameters->numpocs, (OPJ_UINT32)parameters->numresolution, image->numcomps, (OPJ_UINT32)parameters->tcp_numlayers, p_manager);
-                /* TODO MSD use the return value*/
+            /* initialisation of POC */
+            tcp->POC = 1;
+            for (i = 0; i < parameters->numpocs; i++) {
+                if (tileno + 1 == parameters->POC[i].tile)  {
+                    opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
+
+                    tcp_poc->resno0         = parameters->POC[numpocs_tile].resno0;
+                    tcp_poc->compno0        = parameters->POC[numpocs_tile].compno0;
+                    tcp_poc->layno1         = parameters->POC[numpocs_tile].layno1;
+                    tcp_poc->resno1         = parameters->POC[numpocs_tile].resno1;
+                    tcp_poc->compno1        = parameters->POC[numpocs_tile].compno1;
+                    tcp_poc->prg1           = parameters->POC[numpocs_tile].prg1;
+                    tcp_poc->tile           = parameters->POC[numpocs_tile].tile;
+
+                    numpocs_tile++;
+                }
+            }
+
+            tcp->numpocs = numpocs_tile - 1 ;
+        } else {
+            tcp->numpocs = 0;
         }
 
-        for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
-                opj_tcp_t *tcp = &cp->tcps[tileno];
-                tcp->numlayers = (OPJ_UINT32)parameters->tcp_numlayers;
-
-                for (j = 0; j < tcp->numlayers; j++) {
-                        if(OPJ_IS_CINEMA(cp->rsiz)){
-                                if (cp->m_specific_param.m_enc.m_fixed_quality) {
-                                        tcp->distoratio[j] = parameters->tcp_distoratio[j];
-                                }
-                                tcp->rates[j] = parameters->tcp_rates[j];
-                        }else{
-                                if (cp->m_specific_param.m_enc.m_fixed_quality) {       /* add fixed_quality */
-                                        tcp->distoratio[j] = parameters->tcp_distoratio[j];
-                                } else {
-                                        tcp->rates[j] = parameters->tcp_rates[j];
-                                }
-                        }
-                }
-
-                tcp->csty = (OPJ_UINT32)parameters->csty;
-                tcp->prg = parameters->prog_order;
-                tcp->mct = (OPJ_UINT32)parameters->tcp_mct;
-
-                numpocs_tile = 0;
-                tcp->POC = 0;
-
-                if (parameters->numpocs) {
-                        /* initialisation of POC */
-                        tcp->POC = 1;
-                        for (i = 0; i < parameters->numpocs; i++) {
-                                if (tileno + 1 == parameters->POC[i].tile )  {
-                                        opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
-
-                                        tcp_poc->resno0         = parameters->POC[numpocs_tile].resno0;
-                                        tcp_poc->compno0        = parameters->POC[numpocs_tile].compno0;
-                                        tcp_poc->layno1         = parameters->POC[numpocs_tile].layno1;
-                                        tcp_poc->resno1         = parameters->POC[numpocs_tile].resno1;
-                                        tcp_poc->compno1        = parameters->POC[numpocs_tile].compno1;
-                                        tcp_poc->prg1           = parameters->POC[numpocs_tile].prg1;
-                                        tcp_poc->tile           = parameters->POC[numpocs_tile].tile;
-
-                                        numpocs_tile++;
-                                }
-                        }
-
-                        tcp->numpocs = numpocs_tile -1 ;
-                }else{
-                        tcp->numpocs = 0;
-                }
-
-                tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
-                if (!tcp->tccps) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate tile component coding parameters\n");
-                        return OPJ_FALSE;
-                }
-                if (parameters->mct_data) {
-                      
-                    OPJ_UINT32 lMctSize = image->numcomps * image->numcomps * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
-                    OPJ_FLOAT32 * lTmpBuf = (OPJ_FLOAT32*)opj_malloc(lMctSize);
-                    OPJ_INT32 * l_dc_shift = (OPJ_INT32 *) ((OPJ_BYTE *) parameters->mct_data + lMctSize);
-
-										if (!lTmpBuf) {
-                            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate temp buffer\n");
-                            return OPJ_FALSE;
-                    }
-
-                    tcp->mct = 2;
-                    tcp->m_mct_coding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
-										if (! tcp->m_mct_coding_matrix) {
-                            opj_free(lTmpBuf);
-														lTmpBuf = NULL;
-                            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate encoder MCT coding matrix \n");
-                            return OPJ_FALSE;
-                    }
-                    memcpy(tcp->m_mct_coding_matrix,parameters->mct_data,lMctSize);
-                    memcpy(lTmpBuf,parameters->mct_data,lMctSize);
-
-                    tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
-										if (! tcp->m_mct_decoding_matrix) {
-														opj_free(lTmpBuf);
-														lTmpBuf = NULL;
-                            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate encoder MCT decoding matrix \n");
-                            return OPJ_FALSE;
-                    }
-                    if(opj_matrix_inversion_f(lTmpBuf,(tcp->m_mct_decoding_matrix),image->numcomps) == OPJ_FALSE) {
-                            opj_free(lTmpBuf);
-														lTmpBuf = NULL;
-                            opj_event_msg(p_manager, EVT_ERROR, "Failed to inverse encoder MCT decoding matrix \n");
-                            return OPJ_FALSE;
-										}
-
-                    tcp->mct_norms = (OPJ_FLOAT64*)
-                                    opj_malloc(image->numcomps * sizeof(OPJ_FLOAT64));
-										if (! tcp->mct_norms) {
-                            opj_free(lTmpBuf);
-														lTmpBuf = NULL;
-                            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to allocate encoder MCT norms \n");
-                            return OPJ_FALSE;
-                    }
-                    opj_calculate_norms(tcp->mct_norms,image->numcomps,tcp->m_mct_decoding_matrix);
-                    opj_free(lTmpBuf);
-
-                    for (i = 0; i < image->numcomps; i++) {
-                            opj_tccp_t *tccp = &tcp->tccps[i];
-                            tccp->m_dc_level_shift = l_dc_shift[i];
-                    }
-
-                    if (opj_j2k_setup_mct_encoding(tcp,image) == OPJ_FALSE) {
-                        /* free will be handled by opj_j2k_destroy */
-												opj_event_msg(p_manager, EVT_ERROR, "Failed to setup j2k mct encoding\n");
-                        return OPJ_FALSE;
-                    }
-                }
-                else {
-                    if(tcp->mct==1 && image->numcomps >= 3) { /* RGB->YCC MCT is enabled */
-                        if ((image->comps[0].dx != image->comps[1].dx) ||
-                                (image->comps[0].dx != image->comps[2].dx) ||
-                                (image->comps[0].dy != image->comps[1].dy) ||
-                                (image->comps[0].dy != image->comps[2].dy)) {
-                            opj_event_msg(p_manager, EVT_WARNING, "Cannot perform MCT on components with different sizes. Disabling MCT.\n");
-                            tcp->mct = 0;
-                        }
-                    }
-                        for (i = 0; i < image->numcomps; i++) {
-                                opj_tccp_t *tccp = &tcp->tccps[i];
-                                opj_image_comp_t * l_comp = &(image->comps[i]);
-
-                                if (! l_comp->sgnd) {
-                                        tccp->m_dc_level_shift = 1 << (l_comp->prec - 1);
-                                }
-                        }
-                }
-
-                for (i = 0; i < image->numcomps; i++) {
-                        opj_tccp_t *tccp = &tcp->tccps[i];
-
-                        tccp->csty = parameters->csty & 0x01;   /* 0 => one precinct || 1 => custom precinct  */
-                        tccp->numresolutions = (OPJ_UINT32)parameters->numresolution;
-                        tccp->cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
-                        tccp->cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
-                        tccp->cblksty = (OPJ_UINT32)parameters->mode;
-                        tccp->qmfbid = parameters->irreversible ? 0 : 1;
-                        tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT : J2K_CCP_QNTSTY_NOQNT;
-                        tccp->numgbits = 2;
-
-                        if ((OPJ_INT32)i == parameters->roi_compno) {
-                                tccp->roishift = parameters->roi_shift;
-                        } else {
-                                tccp->roishift = 0;
-                        }
-
-                                if (parameters->csty & J2K_CCP_CSTY_PRT) {
-                                        OPJ_INT32 p = 0, it_res;
-                                        assert( tccp->numresolutions > 0 );
-                                        for (it_res = (OPJ_INT32)tccp->numresolutions - 1; it_res >= 0; it_res--) {
-                                                if (p < parameters->res_spec) {
-
-                                                        if (parameters->prcw_init[p] < 1) {
-                                                                tccp->prcw[it_res] = 1;
-                                                        } else {
-                                                                tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prcw_init[p]);
-                                                        }
-
-                                                        if (parameters->prch_init[p] < 1) {
-                                                                tccp->prch[it_res] = 1;
-                                                        }else {
-                                                                tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prch_init[p]);
-                                                        }
-
-                                                } else {
-                                                        OPJ_INT32 res_spec = parameters->res_spec;
-                                                        OPJ_INT32 size_prcw = 0;
-                                                        OPJ_INT32 size_prch = 0;
-
-                                                        assert(res_spec>0); /* issue 189 */
-                                                        size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
-                                                        size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
-
-
-                                                        if (size_prcw < 1) {
-                                                                tccp->prcw[it_res] = 1;
-                                                        } else {
-                                                                tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prcw);
-                                                        }
-
-                                                        if (size_prch < 1) {
-                                                                tccp->prch[it_res] = 1;
-                                                        } else {
-                                                                tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prch);
-                                                        }
-                                                }
-                                                p++;
-                                                /*printf("\nsize precinct for level %d : %d,%d\n", it_res,tccp->prcw[it_res], tccp->prch[it_res]); */
-                                        }       /*end for*/
-                                } else {
-                                        for (j = 0; j < tccp->numresolutions; j++) {
-                                                tccp->prcw[j] = 15;
-                                                tccp->prch[j] = 15;
-                                        }
-                                }
-
-                        opj_dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
-                }
+        tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
+        if (!tcp->tccps) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Not enough memory to allocate tile component coding parameters\n");
+            return OPJ_FALSE;
         }
-
         if (parameters->mct_data) {
-                opj_free(parameters->mct_data);
-                parameters->mct_data = 00;
+
+            OPJ_UINT32 lMctSize = image->numcomps * image->numcomps * (OPJ_UINT32)sizeof(
+                                      OPJ_FLOAT32);
+            OPJ_FLOAT32 * lTmpBuf = (OPJ_FLOAT32*)opj_malloc(lMctSize);
+            OPJ_INT32 * l_dc_shift = (OPJ_INT32 *)((OPJ_BYTE *) parameters->mct_data +
+                                                   lMctSize);
+
+            if (!lTmpBuf) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Not enough memory to allocate temp buffer\n");
+                return OPJ_FALSE;
+            }
+
+            tcp->mct = 2;
+            tcp->m_mct_coding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
+            if (! tcp->m_mct_coding_matrix) {
+                opj_free(lTmpBuf);
+                lTmpBuf = NULL;
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Not enough memory to allocate encoder MCT coding matrix \n");
+                return OPJ_FALSE;
+            }
+            memcpy(tcp->m_mct_coding_matrix, parameters->mct_data, lMctSize);
+            memcpy(lTmpBuf, parameters->mct_data, lMctSize);
+
+            tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(lMctSize);
+            if (! tcp->m_mct_decoding_matrix) {
+                opj_free(lTmpBuf);
+                lTmpBuf = NULL;
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Not enough memory to allocate encoder MCT decoding matrix \n");
+                return OPJ_FALSE;
+            }
+            if (opj_matrix_inversion_f(lTmpBuf, (tcp->m_mct_decoding_matrix),
+                                       image->numcomps) == OPJ_FALSE) {
+                opj_free(lTmpBuf);
+                lTmpBuf = NULL;
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Failed to inverse encoder MCT decoding matrix \n");
+                return OPJ_FALSE;
+            }
+
+            tcp->mct_norms = (OPJ_FLOAT64*)
+                             opj_malloc(image->numcomps * sizeof(OPJ_FLOAT64));
+            if (! tcp->mct_norms) {
+                opj_free(lTmpBuf);
+                lTmpBuf = NULL;
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Not enough memory to allocate encoder MCT norms \n");
+                return OPJ_FALSE;
+            }
+            opj_calculate_norms(tcp->mct_norms, image->numcomps,
+                                tcp->m_mct_decoding_matrix);
+            opj_free(lTmpBuf);
+
+            for (i = 0; i < image->numcomps; i++) {
+                opj_tccp_t *tccp = &tcp->tccps[i];
+                tccp->m_dc_level_shift = l_dc_shift[i];
+            }
+
+            if (opj_j2k_setup_mct_encoding(tcp, image) == OPJ_FALSE) {
+                /* free will be handled by opj_j2k_destroy */
+                opj_event_msg(p_manager, EVT_ERROR, "Failed to setup j2k mct encoding\n");
+                return OPJ_FALSE;
+            }
+        } else {
+            if (tcp->mct == 1 && image->numcomps >= 3) { /* RGB->YCC MCT is enabled */
+                if ((image->comps[0].dx != image->comps[1].dx) ||
+                        (image->comps[0].dx != image->comps[2].dx) ||
+                        (image->comps[0].dy != image->comps[1].dy) ||
+                        (image->comps[0].dy != image->comps[2].dy)) {
+                    opj_event_msg(p_manager, EVT_WARNING,
+                                  "Cannot perform MCT on components with different sizes. Disabling MCT.\n");
+                    tcp->mct = 0;
+                }
+            }
+            for (i = 0; i < image->numcomps; i++) {
+                opj_tccp_t *tccp = &tcp->tccps[i];
+                opj_image_comp_t * l_comp = &(image->comps[i]);
+
+                if (! l_comp->sgnd) {
+                    tccp->m_dc_level_shift = 1 << (l_comp->prec - 1);
+                }
+            }
         }
-        return OPJ_TRUE;
+
+        for (i = 0; i < image->numcomps; i++) {
+            opj_tccp_t *tccp = &tcp->tccps[i];
+
+            tccp->csty = parameters->csty &
+                         0x01;   /* 0 => one precinct || 1 => custom precinct  */
+            tccp->numresolutions = (OPJ_UINT32)parameters->numresolution;
+            tccp->cblkw = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockw_init);
+            tccp->cblkh = (OPJ_UINT32)opj_int_floorlog2(parameters->cblockh_init);
+            tccp->cblksty = (OPJ_UINT32)parameters->mode;
+            tccp->qmfbid = parameters->irreversible ? 0 : 1;
+            tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT :
+                           J2K_CCP_QNTSTY_NOQNT;
+            tccp->numgbits = 2;
+
+            if ((OPJ_INT32)i == parameters->roi_compno) {
+                tccp->roishift = parameters->roi_shift;
+            } else {
+                tccp->roishift = 0;
+            }
+
+            if (parameters->csty & J2K_CCP_CSTY_PRT) {
+                OPJ_INT32 p = 0, it_res;
+                assert(tccp->numresolutions > 0);
+                for (it_res = (OPJ_INT32)tccp->numresolutions - 1; it_res >= 0; it_res--) {
+                    if (p < parameters->res_spec) {
+
+                        if (parameters->prcw_init[p] < 1) {
+                            tccp->prcw[it_res] = 1;
+                        } else {
+                            tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prcw_init[p]);
+                        }
+
+                        if (parameters->prch_init[p] < 1) {
+                            tccp->prch[it_res] = 1;
+                        } else {
+                            tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(parameters->prch_init[p]);
+                        }
+
+                    } else {
+                        OPJ_INT32 res_spec = parameters->res_spec;
+                        OPJ_INT32 size_prcw = 0;
+                        OPJ_INT32 size_prch = 0;
+
+                        assert(res_spec > 0); /* issue 189 */
+                        size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
+                        size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
+
+
+                        if (size_prcw < 1) {
+                            tccp->prcw[it_res] = 1;
+                        } else {
+                            tccp->prcw[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prcw);
+                        }
+
+                        if (size_prch < 1) {
+                            tccp->prch[it_res] = 1;
+                        } else {
+                            tccp->prch[it_res] = (OPJ_UINT32)opj_int_floorlog2(size_prch);
+                        }
+                    }
+                    p++;
+                    /*printf("\nsize precinct for level %d : %d,%d\n", it_res,tccp->prcw[it_res], tccp->prch[it_res]); */
+                }       /*end for*/
+            } else {
+                for (j = 0; j < tccp->numresolutions; j++) {
+                    tccp->prcw[j] = 15;
+                    tccp->prch[j] = 15;
+                }
+            }
+
+            opj_dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
+        }
+    }
+
+    if (parameters->mct_data) {
+        opj_free(parameters->mct_data);
+        parameters->mct_data = 00;
+    }
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)
+static OPJ_BOOL opj_j2k_add_mhmarker(opj_codestream_index_t *cstr_index,
+                                     OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)
 {
-        assert(cstr_index != 00);
+    assert(cstr_index != 00);
 
-        /* expand the list? */
-        if ((cstr_index->marknum + 1) > cstr_index->maxmarknum) {
-                opj_marker_info_t *new_marker;
-                cstr_index->maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32) cstr_index->maxmarknum);
-                new_marker = (opj_marker_info_t *) opj_realloc(cstr_index->marker, cstr_index->maxmarknum *sizeof(opj_marker_info_t));
-                if (! new_marker) {
-                        opj_free(cstr_index->marker);
-                        cstr_index->marker = NULL;
-                        cstr_index->maxmarknum = 0;
-                        cstr_index->marknum = 0;
-                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n"); */
-                        return OPJ_FALSE;
-                }
-                cstr_index->marker = new_marker;
+    /* expand the list? */
+    if ((cstr_index->marknum + 1) > cstr_index->maxmarknum) {
+        opj_marker_info_t *new_marker;
+        cstr_index->maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32)
+                                              cstr_index->maxmarknum);
+        new_marker = (opj_marker_info_t *) opj_realloc(cstr_index->marker,
+                     cstr_index->maxmarknum * sizeof(opj_marker_info_t));
+        if (! new_marker) {
+            opj_free(cstr_index->marker);
+            cstr_index->marker = NULL;
+            cstr_index->maxmarknum = 0;
+            cstr_index->marknum = 0;
+            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n"); */
+            return OPJ_FALSE;
         }
+        cstr_index->marker = new_marker;
+    }
 
-        /* add the marker */
-        cstr_index->marker[cstr_index->marknum].type = (OPJ_UINT16)type;
-        cstr_index->marker[cstr_index->marknum].pos = (OPJ_INT32)pos;
-        cstr_index->marker[cstr_index->marknum].len = (OPJ_INT32)len;
-        cstr_index->marknum++;
-        return OPJ_TRUE;
+    /* add the marker */
+    cstr_index->marker[cstr_index->marknum].type = (OPJ_UINT16)type;
+    cstr_index->marker[cstr_index->marknum].pos = (OPJ_INT32)pos;
+    cstr_index->marker[cstr_index->marknum].len = (OPJ_INT32)len;
+    cstr_index->marknum++;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno, opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos, OPJ_UINT32 len)
+static OPJ_BOOL opj_j2k_add_tlmarker(OPJ_UINT32 tileno,
+                                     opj_codestream_index_t *cstr_index, OPJ_UINT32 type, OPJ_OFF_T pos,
+                                     OPJ_UINT32 len)
 {
-        assert(cstr_index != 00);
-        assert(cstr_index->tile_index != 00);
+    assert(cstr_index != 00);
+    assert(cstr_index->tile_index != 00);
 
-        /* expand the list? */
-        if ((cstr_index->tile_index[tileno].marknum + 1) > cstr_index->tile_index[tileno].maxmarknum) {
-                opj_marker_info_t *new_marker;
-                cstr_index->tile_index[tileno].maxmarknum = (OPJ_UINT32)(100 + (OPJ_FLOAT32) cstr_index->tile_index[tileno].maxmarknum);
-                new_marker = (opj_marker_info_t *) opj_realloc(
-                                cstr_index->tile_index[tileno].marker,
-                                cstr_index->tile_index[tileno].maxmarknum *sizeof(opj_marker_info_t));
-                if (! new_marker) {
-                        opj_free(cstr_index->tile_index[tileno].marker);
-                        cstr_index->tile_index[tileno].marker = NULL;
-                        cstr_index->tile_index[tileno].maxmarknum = 0;
-                        cstr_index->tile_index[tileno].marknum = 0;
-                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n"); */
-                        return OPJ_FALSE;
-                }
-                cstr_index->tile_index[tileno].marker = new_marker;
+    /* expand the list? */
+    if ((cstr_index->tile_index[tileno].marknum + 1) >
+            cstr_index->tile_index[tileno].maxmarknum) {
+        opj_marker_info_t *new_marker;
+        cstr_index->tile_index[tileno].maxmarknum = (OPJ_UINT32)(100 +
+                (OPJ_FLOAT32) cstr_index->tile_index[tileno].maxmarknum);
+        new_marker = (opj_marker_info_t *) opj_realloc(
+                         cstr_index->tile_index[tileno].marker,
+                         cstr_index->tile_index[tileno].maxmarknum * sizeof(opj_marker_info_t));
+        if (! new_marker) {
+            opj_free(cstr_index->tile_index[tileno].marker);
+            cstr_index->tile_index[tileno].marker = NULL;
+            cstr_index->tile_index[tileno].maxmarknum = 0;
+            cstr_index->tile_index[tileno].marknum = 0;
+            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n"); */
+            return OPJ_FALSE;
+        }
+        cstr_index->tile_index[tileno].marker = new_marker;
+    }
+
+    /* add the marker */
+    cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].type
+        = (OPJ_UINT16)type;
+    cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].pos
+        = (OPJ_INT32)pos;
+    cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].len
+        = (OPJ_INT32)len;
+    cstr_index->tile_index[tileno].marknum++;
+
+    if (type == J2K_MS_SOT) {
+        OPJ_UINT32 l_current_tile_part = cstr_index->tile_index[tileno].current_tpsno;
+
+        if (cstr_index->tile_index[tileno].tp_index) {
+            cstr_index->tile_index[tileno].tp_index[l_current_tile_part].start_pos = pos;
         }
 
-        /* add the marker */
-        cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].type = (OPJ_UINT16)type;
-        cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].pos = (OPJ_INT32)pos;
-        cstr_index->tile_index[tileno].marker[cstr_index->tile_index[tileno].marknum].len = (OPJ_INT32)len;
-        cstr_index->tile_index[tileno].marknum++;
-
-        if (type == J2K_MS_SOT) {
-                OPJ_UINT32 l_current_tile_part = cstr_index->tile_index[tileno].current_tpsno;
-
-                if (cstr_index->tile_index[tileno].tp_index)
-                        cstr_index->tile_index[tileno].tp_index[l_current_tile_part].start_pos = pos;
-
-        }
-        return OPJ_TRUE;
+    }
+    return OPJ_TRUE;
 }
 
 /*
@@ -6729,7 +7313,7 @@
 OPJ_BOOL opj_j2k_end_decompress(opj_j2k_t *p_j2k,
                                 opj_stream_private_t *p_stream,
                                 opj_event_mgr_t * p_manager
-                                )
+                               )
 {
     (void)p_j2k;
     (void)p_stream;
@@ -6737,2581 +7321,2839 @@
     return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_j2k_read_header(   opj_stream_private_t *p_stream,
-                                                            opj_j2k_t* p_j2k,
-                                                            opj_image_t** p_image,
-                                                            opj_event_mgr_t* p_manager )
+OPJ_BOOL opj_j2k_read_header(opj_stream_private_t *p_stream,
+                             opj_j2k_t* p_j2k,
+                             opj_image_t** p_image,
+                             opj_event_mgr_t* p_manager)
 {
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_stream != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_stream != 00);
+    assert(p_manager != 00);
 
-        /* create an empty image header */
-        p_j2k->m_private_image = opj_image_create0();
-        if (! p_j2k->m_private_image) {
-                return OPJ_FALSE;
-        }
+    /* create an empty image header */
+    p_j2k->m_private_image = opj_image_create0();
+    if (! p_j2k->m_private_image) {
+        return OPJ_FALSE;
+    }
 
-        /* customization of the validation */
-        if (! opj_j2k_setup_decoding_validation(p_j2k, p_manager)) {
-                opj_image_destroy(p_j2k->m_private_image);
-                p_j2k->m_private_image = NULL;
-                return OPJ_FALSE;
-        }
+    /* customization of the validation */
+    if (! opj_j2k_setup_decoding_validation(p_j2k, p_manager)) {
+        opj_image_destroy(p_j2k->m_private_image);
+        p_j2k->m_private_image = NULL;
+        return OPJ_FALSE;
+    }
 
-        /* validation of the parameters codec */
-        if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream,p_manager)) {
-                opj_image_destroy(p_j2k->m_private_image);
-                p_j2k->m_private_image = NULL;
-                return OPJ_FALSE;
-        }
+    /* validation of the parameters codec */
+    if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream, p_manager)) {
+        opj_image_destroy(p_j2k->m_private_image);
+        p_j2k->m_private_image = NULL;
+        return OPJ_FALSE;
+    }
 
-        /* customization of the encoding */
-        if (! opj_j2k_setup_header_reading(p_j2k, p_manager)) {
-                opj_image_destroy(p_j2k->m_private_image);
-                p_j2k->m_private_image = NULL;
-                return OPJ_FALSE;
-        }
+    /* customization of the encoding */
+    if (! opj_j2k_setup_header_reading(p_j2k, p_manager)) {
+        opj_image_destroy(p_j2k->m_private_image);
+        p_j2k->m_private_image = NULL;
+        return OPJ_FALSE;
+    }
 
-        /* read header */
-        if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
-                opj_image_destroy(p_j2k->m_private_image);
-                p_j2k->m_private_image = NULL;
-                return OPJ_FALSE;
-        }
+    /* read header */
+    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
+        opj_image_destroy(p_j2k->m_private_image);
+        p_j2k->m_private_image = NULL;
+        return OPJ_FALSE;
+    }
 
-        *p_image = opj_image_create0();
-        if (! (*p_image)) {
-                return OPJ_FALSE;
-        }
+    *p_image = opj_image_create0();
+    if (!(*p_image)) {
+        return OPJ_FALSE;
+    }
 
-        /* Copy codestream image information to the output image */
-        opj_copy_image_header(p_j2k->m_private_image, *p_image);
+    /* Copy codestream image information to the output image */
+    opj_copy_image_header(p_j2k->m_private_image, *p_image);
 
     /*Allocate and initialize some elements of codestrem index*/
-        if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)){
-                return OPJ_FALSE;
-        }
+    if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)) {
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_setup_header_reading (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_j2k_setup_header_reading(opj_j2k_t *p_j2k,
+        opj_event_mgr_t * p_manager)
 {
-        /* preconditions*/
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions*/
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_read_header_procedure, p_manager)) {
-                return OPJ_FALSE;
-        }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_read_header_procedure, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        /* DEVELOPER CORNER, add your custom procedures */
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd, p_manager))  {
-                return OPJ_FALSE;
-        }
-	
-        return OPJ_TRUE;
+    /* DEVELOPER CORNER, add your custom procedures */
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd, p_manager))  {
+        return OPJ_FALSE;
+    }
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_j2k_setup_decoding_validation(opj_j2k_t *p_j2k,
+        opj_event_mgr_t * p_manager)
 {
-        /* preconditions*/
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions*/
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,(opj_procedure)opj_j2k_build_decoder, p_manager)) {
-                return OPJ_FALSE;
-        }
-        if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,(opj_procedure)opj_j2k_decoding_validation, p_manager)) {
-                return OPJ_FALSE;
-        }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
+                                           (opj_procedure)opj_j2k_build_decoder, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
+                                           (opj_procedure)opj_j2k_decoding_validation, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        /* DEVELOPER CORNER, add your custom validation procedure */
-        return OPJ_TRUE;
+    /* DEVELOPER CORNER, add your custom validation procedure */
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_mct_validation (       opj_j2k_t * p_j2k,
-                                                                opj_stream_private_t *p_stream,
-                                                                opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_mct_validation(opj_j2k_t * p_j2k,
+                                       opj_stream_private_t *p_stream,
+                                       opj_event_mgr_t * p_manager)
 {
-        OPJ_BOOL l_is_valid = OPJ_TRUE;
-        OPJ_UINT32 i,j;
+    OPJ_BOOL l_is_valid = OPJ_TRUE;
+    OPJ_UINT32 i, j;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_stream != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_stream != 00);
+    assert(p_manager != 00);
 
-        if ((p_j2k->m_cp.rsiz & 0x8200) == 0x8200) {
-                OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
-                opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
+    OPJ_UNUSED(p_stream);
+    OPJ_UNUSED(p_manager);
 
-                for (i=0;i<l_nb_tiles;++i) {
-                        if (l_tcp->mct == 2) {
-                                opj_tccp_t * l_tccp = l_tcp->tccps;
-                                l_is_valid &= (l_tcp->m_mct_coding_matrix != 00);
+    if ((p_j2k->m_cp.rsiz & 0x8200) == 0x8200) {
+        OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+        opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
 
-                                for (j=0;j<p_j2k->m_private_image->numcomps;++j) {
-                                        l_is_valid &= ! (l_tccp->qmfbid & 1);
-                                        ++l_tccp;
-                                }
-                        }
-                        ++l_tcp;
+        for (i = 0; i < l_nb_tiles; ++i) {
+            if (l_tcp->mct == 2) {
+                opj_tccp_t * l_tccp = l_tcp->tccps;
+                l_is_valid &= (l_tcp->m_mct_coding_matrix != 00);
+
+                for (j = 0; j < p_j2k->m_private_image->numcomps; ++j) {
+                    l_is_valid &= !(l_tccp->qmfbid & 1);
+                    ++l_tccp;
                 }
+            }
+            ++l_tcp;
         }
+    }
 
-        return l_is_valid;
+    return l_is_valid;
 }
 
 OPJ_BOOL opj_j2k_setup_mct_encoding(opj_tcp_t * p_tcp, opj_image_t * p_image)
 {
-        OPJ_UINT32 i;
-        OPJ_UINT32 l_indix = 1;
-        opj_mct_data_t * l_mct_deco_data = 00,* l_mct_offset_data = 00;
-        opj_simple_mcc_decorrelation_data_t * l_mcc_data;
-        OPJ_UINT32 l_mct_size,l_nb_elem;
-        OPJ_FLOAT32 * l_data, * l_current_data;
-        opj_tccp_t * l_tccp;
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_indix = 1;
+    opj_mct_data_t * l_mct_deco_data = 00, * l_mct_offset_data = 00;
+    opj_simple_mcc_decorrelation_data_t * l_mcc_data;
+    OPJ_UINT32 l_mct_size, l_nb_elem;
+    OPJ_FLOAT32 * l_data, * l_current_data;
+    opj_tccp_t * l_tccp;
 
-        /* preconditions */
-        assert(p_tcp != 00);
+    /* preconditions */
+    assert(p_tcp != 00);
 
-        if (p_tcp->mct != 2) {
-                return OPJ_TRUE;
-        }
+    if (p_tcp->mct != 2) {
+        return OPJ_TRUE;
+    }
 
-        if (p_tcp->m_mct_decoding_matrix) {
-                if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
-                        opj_mct_data_t *new_mct_records;
-                        p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
-
-                        new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records, p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
-                        if (! new_mct_records) {
-                                opj_free(p_tcp->m_mct_records);
-                                p_tcp->m_mct_records = NULL;
-                                p_tcp->m_nb_max_mct_records = 0;
-                                p_tcp->m_nb_mct_records = 0;
-                                /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
-                                return OPJ_FALSE;
-                        }
-                        p_tcp->m_mct_records = new_mct_records;
-                        l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
-
-                        memset(l_mct_deco_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
-                }
-                l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
-
-                if (l_mct_deco_data->m_data) {
-                        opj_free(l_mct_deco_data->m_data);
-                        l_mct_deco_data->m_data = 00;
-                }
-
-                l_mct_deco_data->m_index = l_indix++;
-                l_mct_deco_data->m_array_type = MCT_TYPE_DECORRELATION;
-                l_mct_deco_data->m_element_type = MCT_TYPE_FLOAT;
-                l_nb_elem = p_image->numcomps * p_image->numcomps;
-                l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_deco_data->m_element_type];
-                l_mct_deco_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size );
-
-                if (! l_mct_deco_data->m_data) {
-                        return OPJ_FALSE;
-                }
-
-                j2k_mct_write_functions_from_float[l_mct_deco_data->m_element_type](p_tcp->m_mct_decoding_matrix,l_mct_deco_data->m_data,l_nb_elem);
-
-                l_mct_deco_data->m_data_size = l_mct_size;
-                ++p_tcp->m_nb_mct_records;
-        }
-
+    if (p_tcp->m_mct_decoding_matrix) {
         if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
-                opj_mct_data_t *new_mct_records;
-                p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
-                new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records, p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
-                if (! new_mct_records) {
-                        opj_free(p_tcp->m_mct_records);
-                        p_tcp->m_mct_records = NULL;
-                        p_tcp->m_nb_max_mct_records = 0;
-                        p_tcp->m_nb_mct_records = 0;
-                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
-                        return OPJ_FALSE;
-                }
-                p_tcp->m_mct_records = new_mct_records;
-                l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
+            opj_mct_data_t *new_mct_records;
+            p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
 
-                memset(l_mct_offset_data ,0,(p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
+            new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records,
+                              p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
+            if (! new_mct_records) {
+                opj_free(p_tcp->m_mct_records);
+                p_tcp->m_mct_records = NULL;
+                p_tcp->m_nb_max_mct_records = 0;
+                p_tcp->m_nb_mct_records = 0;
+                /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
+                return OPJ_FALSE;
+            }
+            p_tcp->m_mct_records = new_mct_records;
+            l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
 
-                if (l_mct_deco_data) {
-                        l_mct_deco_data = l_mct_offset_data - 1;
-                }
+            memset(l_mct_deco_data, 0,
+                   (p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(
+                       opj_mct_data_t));
+        }
+        l_mct_deco_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
+
+        if (l_mct_deco_data->m_data) {
+            opj_free(l_mct_deco_data->m_data);
+            l_mct_deco_data->m_data = 00;
         }
 
+        l_mct_deco_data->m_index = l_indix++;
+        l_mct_deco_data->m_array_type = MCT_TYPE_DECORRELATION;
+        l_mct_deco_data->m_element_type = MCT_TYPE_FLOAT;
+        l_nb_elem = p_image->numcomps * p_image->numcomps;
+        l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_deco_data->m_element_type];
+        l_mct_deco_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size);
+
+        if (! l_mct_deco_data->m_data) {
+            return OPJ_FALSE;
+        }
+
+        j2k_mct_write_functions_from_float[l_mct_deco_data->m_element_type](
+            p_tcp->m_mct_decoding_matrix, l_mct_deco_data->m_data, l_nb_elem);
+
+        l_mct_deco_data->m_data_size = l_mct_size;
+        ++p_tcp->m_nb_mct_records;
+    }
+
+    if (p_tcp->m_nb_mct_records == p_tcp->m_nb_max_mct_records) {
+        opj_mct_data_t *new_mct_records;
+        p_tcp->m_nb_max_mct_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+        new_mct_records = (opj_mct_data_t *) opj_realloc(p_tcp->m_mct_records,
+                          p_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
+        if (! new_mct_records) {
+            opj_free(p_tcp->m_mct_records);
+            p_tcp->m_mct_records = NULL;
+            p_tcp->m_nb_max_mct_records = 0;
+            p_tcp->m_nb_mct_records = 0;
+            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
+            return OPJ_FALSE;
+        }
+        p_tcp->m_mct_records = new_mct_records;
         l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
 
-        if (l_mct_offset_data->m_data) {
-                opj_free(l_mct_offset_data->m_data);
-                l_mct_offset_data->m_data = 00;
+        memset(l_mct_offset_data, 0,
+               (p_tcp->m_nb_max_mct_records - p_tcp->m_nb_mct_records) * sizeof(
+                   opj_mct_data_t));
+
+        if (l_mct_deco_data) {
+            l_mct_deco_data = l_mct_offset_data - 1;
         }
+    }
 
-        l_mct_offset_data->m_index = l_indix++;
-        l_mct_offset_data->m_array_type = MCT_TYPE_OFFSET;
-        l_mct_offset_data->m_element_type = MCT_TYPE_FLOAT;
-        l_nb_elem = p_image->numcomps;
-        l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_offset_data->m_element_type];
-        l_mct_offset_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size );
+    l_mct_offset_data = p_tcp->m_mct_records + p_tcp->m_nb_mct_records;
 
-        if (! l_mct_offset_data->m_data) {
-                return OPJ_FALSE;
+    if (l_mct_offset_data->m_data) {
+        opj_free(l_mct_offset_data->m_data);
+        l_mct_offset_data->m_data = 00;
+    }
+
+    l_mct_offset_data->m_index = l_indix++;
+    l_mct_offset_data->m_array_type = MCT_TYPE_OFFSET;
+    l_mct_offset_data->m_element_type = MCT_TYPE_FLOAT;
+    l_nb_elem = p_image->numcomps;
+    l_mct_size = l_nb_elem * MCT_ELEMENT_SIZE[l_mct_offset_data->m_element_type];
+    l_mct_offset_data->m_data = (OPJ_BYTE*)opj_malloc(l_mct_size);
+
+    if (! l_mct_offset_data->m_data) {
+        return OPJ_FALSE;
+    }
+
+    l_data = (OPJ_FLOAT32*)opj_malloc(l_nb_elem * sizeof(OPJ_FLOAT32));
+    if (! l_data) {
+        opj_free(l_mct_offset_data->m_data);
+        l_mct_offset_data->m_data = 00;
+        return OPJ_FALSE;
+    }
+
+    l_tccp = p_tcp->tccps;
+    l_current_data = l_data;
+
+    for (i = 0; i < l_nb_elem; ++i) {
+        *(l_current_data++) = (OPJ_FLOAT32)(l_tccp->m_dc_level_shift);
+        ++l_tccp;
+    }
+
+    j2k_mct_write_functions_from_float[l_mct_offset_data->m_element_type](l_data,
+            l_mct_offset_data->m_data, l_nb_elem);
+
+    opj_free(l_data);
+
+    l_mct_offset_data->m_data_size = l_mct_size;
+
+    ++p_tcp->m_nb_mct_records;
+
+    if (p_tcp->m_nb_mcc_records == p_tcp->m_nb_max_mcc_records) {
+        opj_simple_mcc_decorrelation_data_t *new_mcc_records;
+        p_tcp->m_nb_max_mcc_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
+        new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
+                              p_tcp->m_mcc_records, p_tcp->m_nb_max_mcc_records * sizeof(
+                                  opj_simple_mcc_decorrelation_data_t));
+        if (! new_mcc_records) {
+            opj_free(p_tcp->m_mcc_records);
+            p_tcp->m_mcc_records = NULL;
+            p_tcp->m_nb_max_mcc_records = 0;
+            p_tcp->m_nb_mcc_records = 0;
+            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
+            return OPJ_FALSE;
         }
-
-        l_data = (OPJ_FLOAT32*)opj_malloc(l_nb_elem * sizeof(OPJ_FLOAT32));
-        if (! l_data) {
-                opj_free(l_mct_offset_data->m_data);
-                l_mct_offset_data->m_data = 00;
-                return OPJ_FALSE;
-        }
-
-        l_tccp = p_tcp->tccps;
-        l_current_data = l_data;
-
-        for (i=0;i<l_nb_elem;++i) {
-                *(l_current_data++) = (OPJ_FLOAT32) (l_tccp->m_dc_level_shift);
-                ++l_tccp;
-        }
-
-        j2k_mct_write_functions_from_float[l_mct_offset_data->m_element_type](l_data,l_mct_offset_data->m_data,l_nb_elem);
-
-        opj_free(l_data);
-
-        l_mct_offset_data->m_data_size = l_mct_size;
-
-        ++p_tcp->m_nb_mct_records;
-
-        if (p_tcp->m_nb_mcc_records == p_tcp->m_nb_max_mcc_records) {
-                opj_simple_mcc_decorrelation_data_t *new_mcc_records;
-                p_tcp->m_nb_max_mcc_records += OPJ_J2K_MCT_DEFAULT_NB_RECORDS;
-                new_mcc_records = (opj_simple_mcc_decorrelation_data_t *) opj_realloc(
-                                p_tcp->m_mcc_records, p_tcp->m_nb_max_mcc_records * sizeof(opj_simple_mcc_decorrelation_data_t));
-                if (! new_mcc_records) {
-                        opj_free(p_tcp->m_mcc_records);
-                        p_tcp->m_mcc_records = NULL;
-                        p_tcp->m_nb_max_mcc_records = 0;
-                        p_tcp->m_nb_mcc_records = 0;
-                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup mct encoding\n"); */
-                        return OPJ_FALSE;
-                }
-                p_tcp->m_mcc_records = new_mcc_records;
-                l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
-                memset(l_mcc_data ,0,(p_tcp->m_nb_max_mcc_records - p_tcp->m_nb_mcc_records) * sizeof(opj_simple_mcc_decorrelation_data_t));
-
-        }
-
+        p_tcp->m_mcc_records = new_mcc_records;
         l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
-        l_mcc_data->m_decorrelation_array = l_mct_deco_data;
-        l_mcc_data->m_is_irreversible = 1;
-        l_mcc_data->m_nb_comps = p_image->numcomps;
-        l_mcc_data->m_index = l_indix++;
-        l_mcc_data->m_offset_array = l_mct_offset_data;
-        ++p_tcp->m_nb_mcc_records;
+        memset(l_mcc_data, 0, (p_tcp->m_nb_max_mcc_records - p_tcp->m_nb_mcc_records) *
+               sizeof(opj_simple_mcc_decorrelation_data_t));
 
-        return OPJ_TRUE;
+    }
+
+    l_mcc_data = p_tcp->m_mcc_records + p_tcp->m_nb_mcc_records;
+    l_mcc_data->m_decorrelation_array = l_mct_deco_data;
+    l_mcc_data->m_is_irreversible = 1;
+    l_mcc_data->m_nb_comps = p_image->numcomps;
+    l_mcc_data->m_index = l_indix++;
+    l_mcc_data->m_offset_array = l_mct_offset_data;
+    ++p_tcp->m_nb_mcc_records;
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_build_decoder (opj_j2k_t * p_j2k,
-                                                            opj_stream_private_t *p_stream,
-                                                            opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_build_decoder(opj_j2k_t * p_j2k,
+                                      opj_stream_private_t *p_stream,
+                                      opj_event_mgr_t * p_manager)
 {
-        /* add here initialization of cp
-           copy paste of setup_decoder */
-  (void)p_j2k;
-  (void)p_stream;
-  (void)p_manager;
-        return OPJ_TRUE;
+    /* add here initialization of cp
+       copy paste of setup_decoder */
+    (void)p_j2k;
+    (void)p_stream;
+    (void)p_manager;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_build_encoder (opj_j2k_t * p_j2k,
-                                                        opj_stream_private_t *p_stream,
-                                                        opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_build_encoder(opj_j2k_t * p_j2k,
+                                      opj_stream_private_t *p_stream,
+                                      opj_event_mgr_t * p_manager)
 {
-        /* add here initialization of cp
-           copy paste of setup_encoder */
-  (void)p_j2k;
-  (void)p_stream;
-  (void)p_manager;
-        return OPJ_TRUE;
+    /* add here initialization of cp
+       copy paste of setup_encoder */
+    (void)p_j2k;
+    (void)p_stream;
+    (void)p_manager;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_encoding_validation (  opj_j2k_t * p_j2k,
-                                                                            opj_stream_private_t *p_stream,
-                                                                            opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_encoding_validation(opj_j2k_t * p_j2k,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager)
 {
-        OPJ_BOOL l_is_valid = OPJ_TRUE;
+    OPJ_BOOL l_is_valid = OPJ_TRUE;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_stream != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_stream != 00);
+    assert(p_manager != 00);
 
-        /* STATE checking */
-        /* make sure the state is at 0 */
-        l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NONE);
+    OPJ_UNUSED(p_stream);
 
-        /* POINTER validation */
-        /* make sure a p_j2k codec is present */
-        l_is_valid &= (p_j2k->m_procedure_list != 00);
-        /* make sure a validation list is present */
-        l_is_valid &= (p_j2k->m_validation_list != 00);
+    /* STATE checking */
+    /* make sure the state is at 0 */
+    l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NONE);
 
-        /* ISO 15444-1:2004 states between 1 & 33 (0 -> 32) */
-        /* 33 (32) would always fail the check below (if a cast to 64bits was done) */
-        /* FIXME Shall we change OPJ_J2K_MAXRLVLS to 32 ? */
-        if ((p_j2k->m_cp.tcps->tccps->numresolutions <= 0) || (p_j2k->m_cp.tcps->tccps->numresolutions > 32)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n");
-                return OPJ_FALSE;
-        }
+    /* POINTER validation */
+    /* make sure a p_j2k codec is present */
+    l_is_valid &= (p_j2k->m_procedure_list != 00);
+    /* make sure a validation list is present */
+    l_is_valid &= (p_j2k->m_validation_list != 00);
 
-        if ((p_j2k->m_cp.tdx) < (OPJ_UINT32) (1 << (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
-                opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n");
-                return OPJ_FALSE;
-        }
+    /* ISO 15444-1:2004 states between 1 & 33 (0 -> 32) */
+    /* 33 (32) would always fail the check below (if a cast to 64bits was done) */
+    /* FIXME Shall we change OPJ_J2K_MAXRLVLS to 32 ? */
+    if ((p_j2k->m_cp.tcps->tccps->numresolutions <= 0) ||
+            (p_j2k->m_cp.tcps->tccps->numresolutions > 32)) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Number of resolutions is too high in comparison to the size of tiles\n");
+        return OPJ_FALSE;
+    }
 
-        if ((p_j2k->m_cp.tdy) < (OPJ_UINT32) (1 << (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
-                opj_event_msg(p_manager, EVT_ERROR, "Number of resolutions is too high in comparison to the size of tiles\n");
-                return OPJ_FALSE;
-        }
+    if ((p_j2k->m_cp.tdx) < (OPJ_UINT32)(1 <<
+                                         (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Number of resolutions is too high in comparison to the size of tiles\n");
+        return OPJ_FALSE;
+    }
 
-        /* PARAMETER VALIDATION */
-        return l_is_valid;
+    if ((p_j2k->m_cp.tdy) < (OPJ_UINT32)(1 <<
+                                         (p_j2k->m_cp.tcps->tccps->numresolutions - 1U))) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Number of resolutions is too high in comparison to the size of tiles\n");
+        return OPJ_FALSE;
+    }
+
+    /* PARAMETER VALIDATION */
+    return l_is_valid;
 }
 
-static OPJ_BOOL opj_j2k_decoding_validation (  opj_j2k_t *p_j2k,
-                                        opj_stream_private_t *p_stream,
-                                        opj_event_mgr_t * p_manager
-                                        )
+static OPJ_BOOL opj_j2k_decoding_validation(opj_j2k_t *p_j2k,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager
+                                           )
 {
-        OPJ_BOOL l_is_valid = OPJ_TRUE;
+    OPJ_BOOL l_is_valid = OPJ_TRUE;
 
-        /* preconditions*/
-        assert(p_j2k != 00);
-        assert(p_stream != 00);
-        assert(p_manager != 00);
+    /* preconditions*/
+    assert(p_j2k != 00);
+    assert(p_stream != 00);
+    assert(p_manager != 00);
 
-        /* STATE checking */
-        /* make sure the state is at 0 */
+    OPJ_UNUSED(p_stream);
+    OPJ_UNUSED(p_manager);
+
+    /* STATE checking */
+    /* make sure the state is at 0 */
 #ifdef TODO_MSD
-        l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_NONE);
+    l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == J2K_DEC_STATE_NONE);
 #endif
-        l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == 0x0000);
+    l_is_valid &= (p_j2k->m_specific_param.m_decoder.m_state == 0x0000);
 
-        /* POINTER validation */
-        /* make sure a p_j2k codec is present */
-        /* make sure a procedure list is present */
-        l_is_valid &= (p_j2k->m_procedure_list != 00);
-        /* make sure a validation list is present */
-        l_is_valid &= (p_j2k->m_validation_list != 00);
+    /* POINTER validation */
+    /* make sure a p_j2k codec is present */
+    /* make sure a procedure list is present */
+    l_is_valid &= (p_j2k->m_procedure_list != 00);
+    /* make sure a validation list is present */
+    l_is_valid &= (p_j2k->m_validation_list != 00);
 
-        /* PARAMETER VALIDATION */
-        return l_is_valid;
+    /* PARAMETER VALIDATION */
+    return l_is_valid;
 }
 
-static OPJ_BOOL opj_j2k_read_header_procedure( opj_j2k_t *p_j2k,
-                                                                            opj_stream_private_t *p_stream,
-                                                                            opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_j2k_read_header_procedure(opj_j2k_t *p_j2k,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager)
 {
-        OPJ_UINT32 l_current_marker;
-        OPJ_UINT32 l_marker_size;
-        const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
-        OPJ_BOOL l_has_siz = 0;
-        OPJ_BOOL l_has_cod = 0;
-        OPJ_BOOL l_has_qcd = 0;
+    OPJ_UINT32 l_current_marker;
+    OPJ_UINT32 l_marker_size;
+    const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
+    OPJ_BOOL l_has_siz = 0;
+    OPJ_BOOL l_has_cod = 0;
+    OPJ_BOOL l_has_qcd = 0;
 
-        /* preconditions */
-        assert(p_stream != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_stream != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        /*  We enter in the main header */
-        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSOC;
+    /*  We enter in the main header */
+    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_MHSOC;
 
-        /* Try to read the SOC marker, the codestream must begin with SOC marker */
-        if (! opj_j2k_read_soc(p_j2k,p_stream,p_manager)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Expected a SOC marker \n");
+    /* Try to read the SOC marker, the codestream must begin with SOC marker */
+    if (! opj_j2k_read_soc(p_j2k, p_stream, p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Expected a SOC marker \n");
+        return OPJ_FALSE;
+    }
+
+    /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
+    if (opj_stream_read_data(p_stream,
+                             p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
+        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+        return OPJ_FALSE;
+    }
+
+    /* Read 2 bytes as the new marker ID */
+    opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
+                   &l_current_marker, 2);
+
+    /* Try to read until the SOT is detected */
+    while (l_current_marker != J2K_MS_SOT) {
+
+        /* Check if the current marker ID is valid */
+        if (l_current_marker < 0xff00) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "A marker ID was expected (0xff--) instead of %.8x\n", l_current_marker);
+            return OPJ_FALSE;
+        }
+
+        /* Get the marker handler from the marker ID */
+        l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
+
+        /* Manage case where marker is unknown */
+        if (l_marker_handler->id == J2K_MS_UNK) {
+            if (! opj_j2k_read_unk(p_j2k, p_stream, &l_current_marker, p_manager)) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Unknow marker have been detected and generated error.\n");
                 return OPJ_FALSE;
+            }
+
+            if (l_current_marker == J2K_MS_SOT) {
+                break;    /* SOT marker is detected main header is completely read */
+            } else { /* Get the marker handler from the marker ID */
+                l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
+            }
+        }
+
+        if (l_marker_handler->id == J2K_MS_SIZ) {
+            /* Mark required SIZ marker as found */
+            l_has_siz = 1;
+        }
+        if (l_marker_handler->id == J2K_MS_COD) {
+            /* Mark required COD marker as found */
+            l_has_cod = 1;
+        }
+        if (l_marker_handler->id == J2K_MS_QCD) {
+            /* Mark required QCD marker as found */
+            l_has_qcd = 1;
+        }
+
+        /* Check if the marker is known and if it is the right place to find it */
+        if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Marker is not compliant with its position\n");
+            return OPJ_FALSE;
+        }
+
+        /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
+        if (opj_stream_read_data(p_stream,
+                                 p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
+            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+            return OPJ_FALSE;
+        }
+
+        /* read 2 bytes as the marker size */
+        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker_size,
+                       2);
+        if (l_marker_size < 2) {
+            opj_event_msg(p_manager, EVT_ERROR, "Invalid marker size\n");
+            return OPJ_FALSE;
+        }
+        l_marker_size -= 2; /* Subtract the size of the marker ID already read */
+
+        /* Check if the marker size is compatible with the header data size */
+        if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
+            OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(
+                                            p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
+            if (! new_header_data) {
+                opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
+                p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
+                p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
+                return OPJ_FALSE;
+            }
+            p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
+            p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
+        }
+
+        /* Try to read the rest of the marker segment from stream and copy them into the buffer */
+        if (opj_stream_read_data(p_stream,
+                                 p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size,
+                                 p_manager) != l_marker_size) {
+            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+            return OPJ_FALSE;
+        }
+
+        /* Read the marker segment with the correct marker handler */
+        if (!(*(l_marker_handler->handler))(p_j2k,
+                                            p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size, p_manager)) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Marker handler function failed to read the marker segment\n");
+            return OPJ_FALSE;
+        }
+
+        /* Add the marker to the codestream index*/
+        if (OPJ_FALSE == opj_j2k_add_mhmarker(
+                    p_j2k->cstr_index,
+                    l_marker_handler->id,
+                    (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
+                    l_marker_size + 4)) {
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
+            return OPJ_FALSE;
         }
 
         /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
-        if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
-                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-                return OPJ_FALSE;
-        }
-
-        /* Read 2 bytes as the new marker ID */
-        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
-
-        /* Try to read until the SOT is detected */
-        while (l_current_marker != J2K_MS_SOT) {
-
-                /* Check if the current marker ID is valid */
-                if (l_current_marker < 0xff00) {
-                        opj_event_msg(p_manager, EVT_ERROR, "A marker ID was expected (0xff--) instead of %.8x\n", l_current_marker);
-                        return OPJ_FALSE;
-                }
-
-                /* Get the marker handler from the marker ID */
-                l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
-
-                /* Manage case where marker is unknown */
-                if (l_marker_handler->id == J2K_MS_UNK) {
-                        if (! opj_j2k_read_unk(p_j2k, p_stream, &l_current_marker, p_manager)){
-                                opj_event_msg(p_manager, EVT_ERROR, "Unknow marker have been detected and generated error.\n");
-                                return OPJ_FALSE;
-                        }
-
-                        if (l_current_marker == J2K_MS_SOT)
-                                break; /* SOT marker is detected main header is completely read */
-                        else    /* Get the marker handler from the marker ID */
-                                l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
-                }
-
-                if (l_marker_handler->id == J2K_MS_SIZ) {
-                    /* Mark required SIZ marker as found */
-                    l_has_siz = 1;
-                }
-                if (l_marker_handler->id == J2K_MS_COD) {
-                    /* Mark required COD marker as found */
-                    l_has_cod = 1;
-                }
-                if (l_marker_handler->id == J2K_MS_QCD) {
-                    /* Mark required QCD marker as found */
-                    l_has_qcd = 1;
-                }
-
-                /* Check if the marker is known and if it is the right place to find it */
-                if (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) ) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
-                        return OPJ_FALSE;
-                }
-
-                /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
-                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-                        return OPJ_FALSE;
-                }
-
-                /* read 2 bytes as the marker size */
-                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2);
-                if (l_marker_size < 2) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Invalid marker size\n");
-                        return OPJ_FALSE;
-                }
-                l_marker_size -= 2; /* Subtract the size of the marker ID already read */
-
-                /* Check if the marker size is compatible with the header data size */
-                if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
-                        OPJ_BYTE *new_header_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
-                        if (! new_header_data) {
-                                opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
-                                p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
-                                p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
-                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
-                                return OPJ_FALSE;
-                        }
-                        p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
-                        p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
-                }
-
-                /* Try to read the rest of the marker segment from stream and copy them into the buffer */
-                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager) != l_marker_size) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-                        return OPJ_FALSE;
-                }
-
-                /* Read the marker segment with the correct marker handler */
-                if (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager)) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Marker handler function failed to read the marker segment\n");
-                        return OPJ_FALSE;
-                }
-
-                /* Add the marker to the codestream index*/
-                if (OPJ_FALSE == opj_j2k_add_mhmarker(
-                                        p_j2k->cstr_index,
-                                        l_marker_handler->id,
-                                        (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
-                                        l_marker_size + 4 )) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add mh marker\n");
-                        return OPJ_FALSE;
-                }
-
-                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
-                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-                        return OPJ_FALSE;
-                }
-
-                /* read 2 bytes as the new marker ID */
-                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
-        }
-
-        if (l_has_siz == 0) {
-            opj_event_msg(p_manager, EVT_ERROR, "required SIZ marker not found in main header\n");
-            return OPJ_FALSE;
-        }
-        if (l_has_cod == 0) {
-            opj_event_msg(p_manager, EVT_ERROR, "required COD marker not found in main header\n");
-            return OPJ_FALSE;
-        }
-        if (l_has_qcd == 0) {
-            opj_event_msg(p_manager, EVT_ERROR, "required QCD marker not found in main header\n");
-            return OPJ_FALSE;
-        }
-	
-        if (! opj_j2k_merge_ppm(&(p_j2k->m_cp), p_manager)) {
-            opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPM data\n");
+        if (opj_stream_read_data(p_stream,
+                                 p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
+            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
             return OPJ_FALSE;
         }
 
-        opj_event_msg(p_manager, EVT_INFO, "Main header has been correctly decoded.\n");
+        /* read 2 bytes as the new marker ID */
+        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
+                       &l_current_marker, 2);
+    }
 
-        /* Position of the last element if the main header */
-        p_j2k->cstr_index->main_head_end = (OPJ_UINT32) opj_stream_tell(p_stream) - 2;
+    if (l_has_siz == 0) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "required SIZ marker not found in main header\n");
+        return OPJ_FALSE;
+    }
+    if (l_has_cod == 0) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "required COD marker not found in main header\n");
+        return OPJ_FALSE;
+    }
+    if (l_has_qcd == 0) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "required QCD marker not found in main header\n");
+        return OPJ_FALSE;
+    }
 
-        /* Next step: read a tile-part header */
-        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+    if (! opj_j2k_merge_ppm(&(p_j2k->m_cp), p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPM data\n");
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    opj_event_msg(p_manager, EVT_INFO, "Main header has been correctly decoded.\n");
+
+    /* Position of the last element if the main header */
+    p_j2k->cstr_index->main_head_end = (OPJ_UINT32) opj_stream_tell(p_stream) - 2;
+
+    /* Next step: read a tile-part header */
+    p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_exec ( opj_j2k_t * p_j2k,
-                                        opj_procedure_list_t * p_procedure_list,
-                                        opj_stream_private_t *p_stream,
-                                        opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_exec(opj_j2k_t * p_j2k,
+                             opj_procedure_list_t * p_procedure_list,
+                             opj_stream_private_t *p_stream,
+                             opj_event_mgr_t * p_manager)
 {
-        OPJ_BOOL (** l_procedure) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *) = 00;
-        OPJ_BOOL l_result = OPJ_TRUE;
-        OPJ_UINT32 l_nb_proc, i;
+    OPJ_BOOL(** l_procedure)(opj_j2k_t *, opj_stream_private_t *,
+                             opj_event_mgr_t *) = 00;
+    OPJ_BOOL l_result = OPJ_TRUE;
+    OPJ_UINT32 l_nb_proc, i;
 
-        /* preconditions*/
-        assert(p_procedure_list != 00);
-        assert(p_j2k != 00);
-        assert(p_stream != 00);
-        assert(p_manager != 00);
+    /* preconditions*/
+    assert(p_procedure_list != 00);
+    assert(p_j2k != 00);
+    assert(p_stream != 00);
+    assert(p_manager != 00);
 
-        l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
-        l_procedure = (OPJ_BOOL (**) (opj_j2k_t * ,opj_stream_private_t *,opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
+    l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
+    l_procedure = (OPJ_BOOL(**)(opj_j2k_t *, opj_stream_private_t *,
+                                opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
 
-        for     (i=0;i<l_nb_proc;++i) {
-                l_result = l_result && ((*l_procedure) (p_j2k,p_stream,p_manager));
-                ++l_procedure;
-        }
+    for (i = 0; i < l_nb_proc; ++i) {
+        l_result = l_result && ((*l_procedure)(p_j2k, p_stream, p_manager));
+        ++l_procedure;
+    }
 
-        /* and clear the procedure list at the end.*/
-        opj_procedure_list_clear(p_procedure_list);
-        return l_result;
+    /* and clear the procedure list at the end.*/
+    opj_procedure_list_clear(p_procedure_list);
+    return l_result;
 }
 
 /* FIXME DOC*/
-static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd (       opj_j2k_t * p_j2k,
-                                                            opj_stream_private_t *p_stream,
-                                                            opj_event_mgr_t * p_manager
-                                                            )
+static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd(opj_j2k_t * p_j2k,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager
+                                                       )
 {
-        opj_tcp_t * l_tcp = 00;
-        opj_tcp_t * l_default_tcp = 00;
-        OPJ_UINT32 l_nb_tiles;
-        OPJ_UINT32 i,j;
-        opj_tccp_t *l_current_tccp = 00;
-        OPJ_UINT32 l_tccp_size;
-        OPJ_UINT32 l_mct_size;
-        opj_image_t * l_image;
-        OPJ_UINT32 l_mcc_records_size,l_mct_records_size;
-        opj_mct_data_t * l_src_mct_rec, *l_dest_mct_rec;
-        opj_simple_mcc_decorrelation_data_t * l_src_mcc_rec, *l_dest_mcc_rec;
-        OPJ_UINT32 l_offset;
+    opj_tcp_t * l_tcp = 00;
+    opj_tcp_t * l_default_tcp = 00;
+    OPJ_UINT32 l_nb_tiles;
+    OPJ_UINT32 i, j;
+    opj_tccp_t *l_current_tccp = 00;
+    OPJ_UINT32 l_tccp_size;
+    OPJ_UINT32 l_mct_size;
+    opj_image_t * l_image;
+    OPJ_UINT32 l_mcc_records_size, l_mct_records_size;
+    opj_mct_data_t * l_src_mct_rec, *l_dest_mct_rec;
+    opj_simple_mcc_decorrelation_data_t * l_src_mcc_rec, *l_dest_mcc_rec;
+    OPJ_UINT32 l_offset;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_stream != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_stream != 00);
+    assert(p_manager != 00);
 
-        l_image = p_j2k->m_private_image;
-        l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
-        l_tcp = p_j2k->m_cp.tcps;
-        l_tccp_size = l_image->numcomps * (OPJ_UINT32)sizeof(opj_tccp_t);
-        l_default_tcp = p_j2k->m_specific_param.m_decoder.m_default_tcp;
-        l_mct_size = l_image->numcomps * l_image->numcomps * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+    OPJ_UNUSED(p_stream);
 
-        /* For each tile */
-        for (i=0; i<l_nb_tiles; ++i) {
-                /* keep the tile-compo coding parameters pointer of the current tile coding parameters*/
-                l_current_tccp = l_tcp->tccps;
-                /*Copy default coding parameters into the current tile coding parameters*/
-                memcpy(l_tcp, l_default_tcp, sizeof(opj_tcp_t));
-                /* Initialize some values of the current tile coding parameters*/
-                l_tcp->cod = 0;
-                l_tcp->ppt = 0;
-                l_tcp->ppt_data = 00;
-                /* Remove memory not owned by this tile in case of early error return. */
-                l_tcp->m_mct_decoding_matrix = 00;
-                l_tcp->m_nb_max_mct_records = 0;
-                l_tcp->m_mct_records = 00;
-                l_tcp->m_nb_max_mcc_records = 0;
-                l_tcp->m_mcc_records = 00;
-                /* Reconnect the tile-compo coding parameters pointer to the current tile coding parameters*/
-                l_tcp->tccps = l_current_tccp;
+    l_image = p_j2k->m_private_image;
+    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+    l_tcp = p_j2k->m_cp.tcps;
+    l_tccp_size = l_image->numcomps * (OPJ_UINT32)sizeof(opj_tccp_t);
+    l_default_tcp = p_j2k->m_specific_param.m_decoder.m_default_tcp;
+    l_mct_size = l_image->numcomps * l_image->numcomps * (OPJ_UINT32)sizeof(
+                     OPJ_FLOAT32);
 
-                /* Get the mct_decoding_matrix of the dflt_tile_cp and copy them into the current tile cp*/
-                if (l_default_tcp->m_mct_decoding_matrix) {
-                        l_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
-                        if (! l_tcp->m_mct_decoding_matrix ) {
-                                return OPJ_FALSE;
-                        }
-                        memcpy(l_tcp->m_mct_decoding_matrix,l_default_tcp->m_mct_decoding_matrix,l_mct_size);
-                }
+    /* For each tile */
+    for (i = 0; i < l_nb_tiles; ++i) {
+        /* keep the tile-compo coding parameters pointer of the current tile coding parameters*/
+        l_current_tccp = l_tcp->tccps;
+        /*Copy default coding parameters into the current tile coding parameters*/
+        memcpy(l_tcp, l_default_tcp, sizeof(opj_tcp_t));
+        /* Initialize some values of the current tile coding parameters*/
+        l_tcp->cod = 0;
+        l_tcp->ppt = 0;
+        l_tcp->ppt_data = 00;
+        l_tcp->m_current_tile_part_number = -1;
+        /* Remove memory not owned by this tile in case of early error return. */
+        l_tcp->m_mct_decoding_matrix = 00;
+        l_tcp->m_nb_max_mct_records = 0;
+        l_tcp->m_mct_records = 00;
+        l_tcp->m_nb_max_mcc_records = 0;
+        l_tcp->m_mcc_records = 00;
+        /* Reconnect the tile-compo coding parameters pointer to the current tile coding parameters*/
+        l_tcp->tccps = l_current_tccp;
 
-                /* Get the mct_record of the dflt_tile_cp and copy them into the current tile cp*/
-                l_mct_records_size = l_default_tcp->m_nb_max_mct_records * (OPJ_UINT32)sizeof(opj_mct_data_t);
-                l_tcp->m_mct_records = (opj_mct_data_t*)opj_malloc(l_mct_records_size);
-                if (! l_tcp->m_mct_records) {
-                        return OPJ_FALSE;
-                }
-                memcpy(l_tcp->m_mct_records, l_default_tcp->m_mct_records,l_mct_records_size);
-
-                /* Copy the mct record data from dflt_tile_cp to the current tile*/
-                l_src_mct_rec = l_default_tcp->m_mct_records;
-                l_dest_mct_rec = l_tcp->m_mct_records;
-
-                for (j=0;j<l_default_tcp->m_nb_mct_records;++j) {
-
-                        if (l_src_mct_rec->m_data) {
-
-                                l_dest_mct_rec->m_data = (OPJ_BYTE*) opj_malloc(l_src_mct_rec->m_data_size);
-                                if(! l_dest_mct_rec->m_data) {
-                                        return OPJ_FALSE;
-                                }
-                                memcpy(l_dest_mct_rec->m_data,l_src_mct_rec->m_data,l_src_mct_rec->m_data_size);
-                        }
-
-                        ++l_src_mct_rec;
-                        ++l_dest_mct_rec;
-                        /* Update with each pass to free exactly what has been allocated on early return. */
-                        l_tcp->m_nb_max_mct_records += 1;
-                }
-
-                /* Get the mcc_record of the dflt_tile_cp and copy them into the current tile cp*/
-                l_mcc_records_size = l_default_tcp->m_nb_max_mcc_records * (OPJ_UINT32)sizeof(opj_simple_mcc_decorrelation_data_t);
-                l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*) opj_malloc(l_mcc_records_size);
-                if (! l_tcp->m_mcc_records) {
-                        return OPJ_FALSE;
-                }
-                memcpy(l_tcp->m_mcc_records,l_default_tcp->m_mcc_records,l_mcc_records_size);
-                l_tcp->m_nb_max_mcc_records = l_default_tcp->m_nb_max_mcc_records;
-
-                /* Copy the mcc record data from dflt_tile_cp to the current tile*/
-                l_src_mcc_rec = l_default_tcp->m_mcc_records;
-                l_dest_mcc_rec = l_tcp->m_mcc_records;
-
-                for (j=0;j<l_default_tcp->m_nb_max_mcc_records;++j) {
-
-                        if (l_src_mcc_rec->m_decorrelation_array) {
-                                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_decorrelation_array - l_default_tcp->m_mct_records);
-                                l_dest_mcc_rec->m_decorrelation_array = l_tcp->m_mct_records + l_offset;
-                        }
-
-                        if (l_src_mcc_rec->m_offset_array) {
-                                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_offset_array - l_default_tcp->m_mct_records);
-                                l_dest_mcc_rec->m_offset_array = l_tcp->m_mct_records + l_offset;
-                        }
-
-                        ++l_src_mcc_rec;
-                        ++l_dest_mcc_rec;
-                }
-
-                /* Copy all the dflt_tile_compo_cp to the current tile cp */
-                memcpy(l_current_tccp,l_default_tcp->tccps,l_tccp_size);
-
-                /* Move to next tile cp*/
-                ++l_tcp;
-        }
-
-        /* Create the current tile decoder*/
-        p_j2k->m_tcd = (opj_tcd_t*)opj_tcd_create(OPJ_TRUE); /* FIXME why a cast ? */
-        if (! p_j2k->m_tcd ) {
+        /* Get the mct_decoding_matrix of the dflt_tile_cp and copy them into the current tile cp*/
+        if (l_default_tcp->m_mct_decoding_matrix) {
+            l_tcp->m_mct_decoding_matrix = (OPJ_FLOAT32*)opj_malloc(l_mct_size);
+            if (! l_tcp->m_mct_decoding_matrix) {
                 return OPJ_FALSE;
+            }
+            memcpy(l_tcp->m_mct_decoding_matrix, l_default_tcp->m_mct_decoding_matrix,
+                   l_mct_size);
         }
 
-        if ( !opj_tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp)) ) {
-                opj_tcd_destroy(p_j2k->m_tcd);
-                p_j2k->m_tcd = 00;
-                opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
-                return OPJ_FALSE;
+        /* Get the mct_record of the dflt_tile_cp and copy them into the current tile cp*/
+        l_mct_records_size = l_default_tcp->m_nb_max_mct_records * (OPJ_UINT32)sizeof(
+                                 opj_mct_data_t);
+        l_tcp->m_mct_records = (opj_mct_data_t*)opj_malloc(l_mct_records_size);
+        if (! l_tcp->m_mct_records) {
+            return OPJ_FALSE;
+        }
+        memcpy(l_tcp->m_mct_records, l_default_tcp->m_mct_records, l_mct_records_size);
+
+        /* Copy the mct record data from dflt_tile_cp to the current tile*/
+        l_src_mct_rec = l_default_tcp->m_mct_records;
+        l_dest_mct_rec = l_tcp->m_mct_records;
+
+        for (j = 0; j < l_default_tcp->m_nb_mct_records; ++j) {
+
+            if (l_src_mct_rec->m_data) {
+
+                l_dest_mct_rec->m_data = (OPJ_BYTE*) opj_malloc(l_src_mct_rec->m_data_size);
+                if (! l_dest_mct_rec->m_data) {
+                    return OPJ_FALSE;
+                }
+                memcpy(l_dest_mct_rec->m_data, l_src_mct_rec->m_data,
+                       l_src_mct_rec->m_data_size);
+            }
+
+            ++l_src_mct_rec;
+            ++l_dest_mct_rec;
+            /* Update with each pass to free exactly what has been allocated on early return. */
+            l_tcp->m_nb_max_mct_records += 1;
         }
 
-        return OPJ_TRUE;
-}
-
-static const opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler (OPJ_UINT32 p_id)
-{
-        const opj_dec_memory_marker_handler_t *e;
-        for (e = j2k_memory_marker_handler_tab; e->id != 0; ++e) {
-                if (e->id == p_id) {
-                        break; /* we find a handler corresponding to the marker ID*/
-                }
+        /* Get the mcc_record of the dflt_tile_cp and copy them into the current tile cp*/
+        l_mcc_records_size = l_default_tcp->m_nb_max_mcc_records * (OPJ_UINT32)sizeof(
+                                 opj_simple_mcc_decorrelation_data_t);
+        l_tcp->m_mcc_records = (opj_simple_mcc_decorrelation_data_t*) opj_malloc(
+                                   l_mcc_records_size);
+        if (! l_tcp->m_mcc_records) {
+            return OPJ_FALSE;
         }
-        return e;
-}
+        memcpy(l_tcp->m_mcc_records, l_default_tcp->m_mcc_records, l_mcc_records_size);
+        l_tcp->m_nb_max_mcc_records = l_default_tcp->m_nb_max_mcc_records;
 
-void opj_j2k_destroy (opj_j2k_t *p_j2k)
-{
-        if (p_j2k == 00) {
-                return;
+        /* Copy the mcc record data from dflt_tile_cp to the current tile*/
+        l_src_mcc_rec = l_default_tcp->m_mcc_records;
+        l_dest_mcc_rec = l_tcp->m_mcc_records;
+
+        for (j = 0; j < l_default_tcp->m_nb_max_mcc_records; ++j) {
+
+            if (l_src_mcc_rec->m_decorrelation_array) {
+                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_decorrelation_array -
+                                        l_default_tcp->m_mct_records);
+                l_dest_mcc_rec->m_decorrelation_array = l_tcp->m_mct_records + l_offset;
+            }
+
+            if (l_src_mcc_rec->m_offset_array) {
+                l_offset = (OPJ_UINT32)(l_src_mcc_rec->m_offset_array -
+                                        l_default_tcp->m_mct_records);
+                l_dest_mcc_rec->m_offset_array = l_tcp->m_mct_records + l_offset;
+            }
+
+            ++l_src_mcc_rec;
+            ++l_dest_mcc_rec;
         }
 
-        if (p_j2k->m_is_decoder) {
+        /* Copy all the dflt_tile_compo_cp to the current tile cp */
+        memcpy(l_current_tccp, l_default_tcp->tccps, l_tccp_size);
 
-                if (p_j2k->m_specific_param.m_decoder.m_default_tcp != 00) {
-                        opj_j2k_tcp_destroy(p_j2k->m_specific_param.m_decoder.m_default_tcp);
-                        opj_free(p_j2k->m_specific_param.m_decoder.m_default_tcp);
-                        p_j2k->m_specific_param.m_decoder.m_default_tcp = 00;
-                }
+        /* Move to next tile cp*/
+        ++l_tcp;
+    }
 
-                if (p_j2k->m_specific_param.m_decoder.m_header_data != 00) {
-                        opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
-                        p_j2k->m_specific_param.m_decoder.m_header_data = 00;
-                        p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
-                }
-        }
-        else {
+    /* Create the current tile decoder*/
+    p_j2k->m_tcd = (opj_tcd_t*)opj_tcd_create(OPJ_TRUE); /* FIXME why a cast ? */
+    if (! p_j2k->m_tcd) {
+        return OPJ_FALSE;
+    }
 
-                if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 00;
-                }
-
-                if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
-                        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 00;
-                        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 00;
-                }
-
-                if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
-                        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data = 00;
-                        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
-                }
-        }
-
+    if (!opj_tcd_init(p_j2k->m_tcd, l_image, &(p_j2k->m_cp), p_j2k->m_tp)) {
         opj_tcd_destroy(p_j2k->m_tcd);
+        p_j2k->m_tcd = 00;
+        opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
+        return OPJ_FALSE;
+    }
 
-        opj_j2k_cp_destroy(&(p_j2k->m_cp));
-        memset(&(p_j2k->m_cp),0,sizeof(opj_cp_t));
-
-        opj_procedure_list_destroy(p_j2k->m_procedure_list);
-        p_j2k->m_procedure_list = 00;
-
-        opj_procedure_list_destroy(p_j2k->m_validation_list);
-        p_j2k->m_procedure_list = 00;
-
-        j2k_destroy_cstr_index(p_j2k->cstr_index);
-        p_j2k->cstr_index = NULL;
-
-        opj_image_destroy(p_j2k->m_private_image);
-        p_j2k->m_private_image = NULL;
-
-        opj_image_destroy(p_j2k->m_output_image);
-        p_j2k->m_output_image = NULL;
-
-        opj_free(p_j2k);
+    return OPJ_TRUE;
 }
 
-void j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind)
+static const opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler(
+    OPJ_UINT32 p_id)
 {
-        if (p_cstr_ind) {
-
-                if (p_cstr_ind->marker) {
-                        opj_free(p_cstr_ind->marker);
-                        p_cstr_ind->marker = NULL;
-                }
-
-                if (p_cstr_ind->tile_index) {
-                        OPJ_UINT32 it_tile = 0;
-
-                        for (it_tile=0; it_tile < p_cstr_ind->nb_of_tiles; it_tile++) {
-
-                                if(p_cstr_ind->tile_index[it_tile].packet_index) {
-                                        opj_free(p_cstr_ind->tile_index[it_tile].packet_index);
-                                        p_cstr_ind->tile_index[it_tile].packet_index = NULL;
-                                }
-
-                                if(p_cstr_ind->tile_index[it_tile].tp_index){
-                                        opj_free(p_cstr_ind->tile_index[it_tile].tp_index);
-                                        p_cstr_ind->tile_index[it_tile].tp_index = NULL;
-                                }
-
-                                if(p_cstr_ind->tile_index[it_tile].marker){
-                                        opj_free(p_cstr_ind->tile_index[it_tile].marker);
-                                        p_cstr_ind->tile_index[it_tile].marker = NULL;
-
-                                }
-                        }
-
-                        opj_free( p_cstr_ind->tile_index);
-                        p_cstr_ind->tile_index = NULL;
-                }
-
-                opj_free(p_cstr_ind);
+    const opj_dec_memory_marker_handler_t *e;
+    for (e = j2k_memory_marker_handler_tab; e->id != 0; ++e) {
+        if (e->id == p_id) {
+            break; /* we find a handler corresponding to the marker ID*/
         }
+    }
+    return e;
 }
 
-static void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp)
+void opj_j2k_destroy(opj_j2k_t *p_j2k)
 {
-	if (p_tcp == 00) {
-		return;
-	}
-	
-	if (p_tcp->ppt_markers != 00) {
-		OPJ_UINT32 i;
-		for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
-			if (p_tcp->ppt_markers[i].m_data != NULL) {
-				opj_free(p_tcp->ppt_markers[i].m_data);
-			}
-		}
-		p_tcp->ppt_markers_count = 0U;
-		opj_free(p_tcp->ppt_markers);
-		p_tcp->ppt_markers = NULL;
-	}
-	
-	if (p_tcp->ppt_buffer != 00) {
-		opj_free(p_tcp->ppt_buffer);
-		p_tcp->ppt_buffer = 00;
-	}
-	
-	if (p_tcp->tccps != 00) {
-		opj_free(p_tcp->tccps);
-		p_tcp->tccps = 00;
-	}
-	
-	if (p_tcp->m_mct_coding_matrix != 00) {
-		opj_free(p_tcp->m_mct_coding_matrix);
-		p_tcp->m_mct_coding_matrix = 00;
-	}
-	
-	if (p_tcp->m_mct_decoding_matrix != 00) {
-		opj_free(p_tcp->m_mct_decoding_matrix);
-		p_tcp->m_mct_decoding_matrix = 00;
-	}
-	
-	if (p_tcp->m_mcc_records) {
-		opj_free(p_tcp->m_mcc_records);
-		p_tcp->m_mcc_records = 00;
-		p_tcp->m_nb_max_mcc_records = 0;
-		p_tcp->m_nb_mcc_records = 0;
-	}
-	
-	if (p_tcp->m_mct_records) {
-		opj_mct_data_t * l_mct_data = p_tcp->m_mct_records;
-		OPJ_UINT32 i;
-		
-		for (i=0;i<p_tcp->m_nb_mct_records;++i) {
-			if (l_mct_data->m_data) {
-				opj_free(l_mct_data->m_data);
-				l_mct_data->m_data = 00;
-			}
-			
-			++l_mct_data;
-		}
-		
-		opj_free(p_tcp->m_mct_records);
-		p_tcp->m_mct_records = 00;
-	}
+    if (p_j2k == 00) {
+        return;
+    }
 
-	if (p_tcp->mct_norms != 00) {
-		opj_free(p_tcp->mct_norms);
-		p_tcp->mct_norms = 00;
-	}
+    if (p_j2k->m_is_decoder) {
 
-	opj_j2k_tcp_data_destroy(p_tcp);
+        if (p_j2k->m_specific_param.m_decoder.m_default_tcp != 00) {
+            opj_j2k_tcp_destroy(p_j2k->m_specific_param.m_decoder.m_default_tcp);
+            opj_free(p_j2k->m_specific_param.m_decoder.m_default_tcp);
+            p_j2k->m_specific_param.m_decoder.m_default_tcp = 00;
+        }
+
+        if (p_j2k->m_specific_param.m_decoder.m_header_data != 00) {
+            opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
+            p_j2k->m_specific_param.m_decoder.m_header_data = 00;
+            p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
+        }
+    } else {
+
+        if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 00;
+        }
+
+        if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
+            p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 00;
+            p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 00;
+        }
+
+        if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
+            opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data = 00;
+            p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+        }
+    }
+
+    opj_tcd_destroy(p_j2k->m_tcd);
+
+    opj_j2k_cp_destroy(&(p_j2k->m_cp));
+    memset(&(p_j2k->m_cp), 0, sizeof(opj_cp_t));
+
+    opj_procedure_list_destroy(p_j2k->m_procedure_list);
+    p_j2k->m_procedure_list = 00;
+
+    opj_procedure_list_destroy(p_j2k->m_validation_list);
+    p_j2k->m_procedure_list = 00;
+
+    j2k_destroy_cstr_index(p_j2k->cstr_index);
+    p_j2k->cstr_index = NULL;
+
+    opj_image_destroy(p_j2k->m_private_image);
+    p_j2k->m_private_image = NULL;
+
+    opj_image_destroy(p_j2k->m_output_image);
+    p_j2k->m_output_image = NULL;
+
+    opj_thread_pool_destroy(p_j2k->m_tp);
+    p_j2k->m_tp = NULL;
+
+    opj_free(p_j2k);
+}
+
+void j2k_destroy_cstr_index(opj_codestream_index_t *p_cstr_ind)
+{
+    if (p_cstr_ind) {
+
+        if (p_cstr_ind->marker) {
+            opj_free(p_cstr_ind->marker);
+            p_cstr_ind->marker = NULL;
+        }
+
+        if (p_cstr_ind->tile_index) {
+            OPJ_UINT32 it_tile = 0;
+
+            for (it_tile = 0; it_tile < p_cstr_ind->nb_of_tiles; it_tile++) {
+
+                if (p_cstr_ind->tile_index[it_tile].packet_index) {
+                    opj_free(p_cstr_ind->tile_index[it_tile].packet_index);
+                    p_cstr_ind->tile_index[it_tile].packet_index = NULL;
+                }
+
+                if (p_cstr_ind->tile_index[it_tile].tp_index) {
+                    opj_free(p_cstr_ind->tile_index[it_tile].tp_index);
+                    p_cstr_ind->tile_index[it_tile].tp_index = NULL;
+                }
+
+                if (p_cstr_ind->tile_index[it_tile].marker) {
+                    opj_free(p_cstr_ind->tile_index[it_tile].marker);
+                    p_cstr_ind->tile_index[it_tile].marker = NULL;
+
+                }
+            }
+
+            opj_free(p_cstr_ind->tile_index);
+            p_cstr_ind->tile_index = NULL;
+        }
+
+        opj_free(p_cstr_ind);
+    }
+}
+
+static void opj_j2k_tcp_destroy(opj_tcp_t *p_tcp)
+{
+    if (p_tcp == 00) {
+        return;
+    }
+
+    if (p_tcp->ppt_markers != 00) {
+        OPJ_UINT32 i;
+        for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
+            if (p_tcp->ppt_markers[i].m_data != NULL) {
+                opj_free(p_tcp->ppt_markers[i].m_data);
+            }
+        }
+        p_tcp->ppt_markers_count = 0U;
+        opj_free(p_tcp->ppt_markers);
+        p_tcp->ppt_markers = NULL;
+    }
+
+    if (p_tcp->ppt_buffer != 00) {
+        opj_free(p_tcp->ppt_buffer);
+        p_tcp->ppt_buffer = 00;
+    }
+
+    if (p_tcp->tccps != 00) {
+        opj_free(p_tcp->tccps);
+        p_tcp->tccps = 00;
+    }
+
+    if (p_tcp->m_mct_coding_matrix != 00) {
+        opj_free(p_tcp->m_mct_coding_matrix);
+        p_tcp->m_mct_coding_matrix = 00;
+    }
+
+    if (p_tcp->m_mct_decoding_matrix != 00) {
+        opj_free(p_tcp->m_mct_decoding_matrix);
+        p_tcp->m_mct_decoding_matrix = 00;
+    }
+
+    if (p_tcp->m_mcc_records) {
+        opj_free(p_tcp->m_mcc_records);
+        p_tcp->m_mcc_records = 00;
+        p_tcp->m_nb_max_mcc_records = 0;
+        p_tcp->m_nb_mcc_records = 0;
+    }
+
+    if (p_tcp->m_mct_records) {
+        opj_mct_data_t * l_mct_data = p_tcp->m_mct_records;
+        OPJ_UINT32 i;
+
+        for (i = 0; i < p_tcp->m_nb_mct_records; ++i) {
+            if (l_mct_data->m_data) {
+                opj_free(l_mct_data->m_data);
+                l_mct_data->m_data = 00;
+            }
+
+            ++l_mct_data;
+        }
+
+        opj_free(p_tcp->m_mct_records);
+        p_tcp->m_mct_records = 00;
+    }
+
+    if (p_tcp->mct_norms != 00) {
+        opj_free(p_tcp->mct_norms);
+        p_tcp->mct_norms = 00;
+    }
+
+    opj_j2k_tcp_data_destroy(p_tcp);
 
 }
 
-static void opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp)
+static void opj_j2k_tcp_data_destroy(opj_tcp_t *p_tcp)
 {
-        if (p_tcp->m_data) {
-                opj_free(p_tcp->m_data);
-                p_tcp->m_data = NULL;
-                p_tcp->m_data_size = 0;
-        }
+    if (p_tcp->m_data) {
+        opj_free(p_tcp->m_data);
+        p_tcp->m_data = NULL;
+        p_tcp->m_data_size = 0;
+    }
 }
 
-static void opj_j2k_cp_destroy (opj_cp_t *p_cp)
+static void opj_j2k_cp_destroy(opj_cp_t *p_cp)
 {
-	OPJ_UINT32 l_nb_tiles;
-	opj_tcp_t * l_current_tile = 00;
+    OPJ_UINT32 l_nb_tiles;
+    opj_tcp_t * l_current_tile = 00;
 
-	if (p_cp == 00)
-	{
-		return;
-	}
-	if (p_cp->tcps != 00)
-	{
-		OPJ_UINT32 i;
-		l_current_tile = p_cp->tcps;
-		l_nb_tiles = p_cp->th * p_cp->tw;
-		
-		for (i = 0U; i < l_nb_tiles; ++i)
-		{
-			opj_j2k_tcp_destroy(l_current_tile);
-			++l_current_tile;
-		}
-		opj_free(p_cp->tcps);
-		p_cp->tcps = 00;
-	}
-	if (p_cp->ppm_markers != 00) {
-		OPJ_UINT32 i;
-		for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
-			if (p_cp->ppm_markers[i].m_data != NULL) {
-				opj_free(p_cp->ppm_markers[i].m_data);
-			}
-		}
-		p_cp->ppm_markers_count = 0U;
-		opj_free(p_cp->ppm_markers);
-		p_cp->ppm_markers = NULL;
-	}
-	opj_free(p_cp->ppm_buffer);
-	p_cp->ppm_buffer = 00;
-	p_cp->ppm_data = NULL; /* ppm_data belongs to the allocated buffer pointed by ppm_buffer */
-	opj_free(p_cp->comment);
-	p_cp->comment = 00;
-	if (! p_cp->m_is_decoder)
-	{
-		opj_free(p_cp->m_specific_param.m_enc.m_matrice);
-		p_cp->m_specific_param.m_enc.m_matrice = 00;
-	}
+    if (p_cp == 00) {
+        return;
+    }
+    if (p_cp->tcps != 00) {
+        OPJ_UINT32 i;
+        l_current_tile = p_cp->tcps;
+        l_nb_tiles = p_cp->th * p_cp->tw;
+
+        for (i = 0U; i < l_nb_tiles; ++i) {
+            opj_j2k_tcp_destroy(l_current_tile);
+            ++l_current_tile;
+        }
+        opj_free(p_cp->tcps);
+        p_cp->tcps = 00;
+    }
+    if (p_cp->ppm_markers != 00) {
+        OPJ_UINT32 i;
+        for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
+            if (p_cp->ppm_markers[i].m_data != NULL) {
+                opj_free(p_cp->ppm_markers[i].m_data);
+            }
+        }
+        p_cp->ppm_markers_count = 0U;
+        opj_free(p_cp->ppm_markers);
+        p_cp->ppm_markers = NULL;
+    }
+    opj_free(p_cp->ppm_buffer);
+    p_cp->ppm_buffer = 00;
+    p_cp->ppm_data =
+        NULL; /* ppm_data belongs to the allocated buffer pointed by ppm_buffer */
+    opj_free(p_cp->comment);
+    p_cp->comment = 00;
+    if (! p_cp->m_is_decoder) {
+        opj_free(p_cp->m_specific_param.m_enc.m_matrice);
+        p_cp->m_specific_param.m_enc.m_matrice = 00;
+    }
 }
 
-static OPJ_BOOL opj_j2k_need_nb_tile_parts_correction(opj_stream_private_t *p_stream, OPJ_UINT32 tile_no, OPJ_BOOL* p_correction_needed, opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_need_nb_tile_parts_correction(opj_stream_private_t
+        *p_stream, OPJ_UINT32 tile_no, OPJ_BOOL* p_correction_needed,
+        opj_event_mgr_t * p_manager)
 {
-	OPJ_BYTE   l_header_data[10];
-	OPJ_OFF_T  l_stream_pos_backup;
-	OPJ_UINT32 l_current_marker;
-	OPJ_UINT32 l_marker_size;
-	OPJ_UINT32 l_tile_no, l_tot_len, l_current_part, l_num_parts;
-	
-	/* initialize to no correction needed */
-	*p_correction_needed = OPJ_FALSE;
-	
-	l_stream_pos_backup = opj_stream_tell(p_stream);
-	if (l_stream_pos_backup == -1) {
-		/* let's do nothing */
-		return OPJ_TRUE;
-	}
-	
-	for (;;) {
-		/* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
-		if (opj_stream_read_data(p_stream,l_header_data, 2, p_manager) != 2) {
-			/* assume all is OK */
-			if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
-				return OPJ_FALSE;
-			}
-			return OPJ_TRUE;
-		}
-		
-		/* Read 2 bytes from buffer as the new marker ID */
-		opj_read_bytes(l_header_data, &l_current_marker, 2);
-		
-		if (l_current_marker != J2K_MS_SOT) {
-			/* assume all is OK */
-			if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
-				return OPJ_FALSE;
-			}
-			return OPJ_TRUE;
-		}
-		
-		/* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
-		if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
-			opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-			return OPJ_FALSE;
-		}
-		
-		/* Read 2 bytes from the buffer as the marker size */
-		opj_read_bytes(l_header_data, &l_marker_size, 2);
-		
-		/* Check marker size for SOT Marker */
-		if (l_marker_size != 10) {
-			opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
-			return OPJ_FALSE;
-		}
-		l_marker_size -= 2;
-		
-		if (opj_stream_read_data(p_stream, l_header_data, l_marker_size, p_manager) != l_marker_size) {
-			opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-			return OPJ_FALSE;
-		}
-		
-		if (! opj_j2k_get_sot_values(l_header_data, l_marker_size, &l_tile_no, &l_tot_len, &l_current_part, &l_num_parts, p_manager)) {
-			return OPJ_FALSE;
-		}
-		
-		if (l_tile_no == tile_no) {
-			/* we found what we were looking for */
-			break;
-		}
-		
-		if ((l_tot_len == 0U) || (l_tot_len < 14U)) {
-			/* last SOT until EOC or invalid Psot value */
-			/* assume all is OK */
-			if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
-				return OPJ_FALSE;
-			}
-			return OPJ_TRUE;
-		}
-		l_tot_len -= 12U;
-		/* look for next SOT marker */
-		if (opj_stream_skip(p_stream, (OPJ_OFF_T)(l_tot_len), p_manager) != (OPJ_OFF_T)(l_tot_len)) {
-			/* assume all is OK */
-			if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
-				return OPJ_FALSE;
-			}
-			return OPJ_TRUE;
-		}
-	}
-	
-	/* check for correction */
-	if (l_current_part == l_num_parts) {
-		*p_correction_needed = OPJ_TRUE;
-	}
-	
-	if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
-		return OPJ_FALSE;
-	}
-	return OPJ_TRUE;
-}
+    OPJ_BYTE   l_header_data[10];
+    OPJ_OFF_T  l_stream_pos_backup;
+    OPJ_UINT32 l_current_marker;
+    OPJ_UINT32 l_marker_size;
+    OPJ_UINT32 l_tile_no, l_tot_len, l_current_part, l_num_parts;
 
-OPJ_BOOL opj_j2k_read_tile_header(      opj_j2k_t * p_j2k,
-                                                                    OPJ_UINT32 * p_tile_index,
-                                                                    OPJ_UINT32 * p_data_size,
-                                                                    OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
-                                                                    OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
-                                                                    OPJ_UINT32 * p_nb_comps,
-                                                                    OPJ_BOOL * p_go_on,
-                                                                    opj_stream_private_t *p_stream,
-                                                                    opj_event_mgr_t * p_manager )
-{
-        OPJ_UINT32 l_current_marker = J2K_MS_SOT;
-        OPJ_UINT32 l_marker_size;
-        const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
-        opj_tcp_t * l_tcp = NULL;
+    /* initialize to no correction needed */
+    *p_correction_needed = OPJ_FALSE;
 
-        /* preconditions */
-        assert(p_stream != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-
-        /* Reach the End Of Codestream ?*/
-        if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC){
-                l_current_marker = J2K_MS_EOC;
-        }
-        /* We need to encounter a SOT marker (a new tile-part header) */
-        else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT){
-                return OPJ_FALSE;
-        }
-
-        /* Read into the codestream until reach the EOC or ! can_decode ??? FIXME */
-        while ( (!p_j2k->m_specific_param.m_decoder.m_can_decode) && (l_current_marker != J2K_MS_EOC) ) {
-
-                /* Try to read until the Start Of Data is detected */
-                while (l_current_marker != J2K_MS_SOD) {
-                    
-                    if(opj_stream_get_number_byte_left(p_stream) == 0)
-                    {
-                        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
-                        break;
-                    }
-
-                        /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
-                        if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
-                                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-                                return OPJ_FALSE;
-                        }
-
-                        /* Read 2 bytes from the buffer as the marker size */
-                        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_marker_size,2);
-
-                        /* Check marker size (does not include marker ID but includes marker size) */
-                        if (l_marker_size < 2) {
-                                opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
-                                return OPJ_FALSE;
-                        }
-
-                        /* cf. https://code.google.com/p/openjpeg/issues/detail?id=226 */
-                        if (l_current_marker == 0x8080 && opj_stream_get_number_byte_left(p_stream) == 0) {
-                                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
-                                break;
-                        }
-
-                        /* Why this condition? FIXME */
-                        if (p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_TPH){
-                                p_j2k->m_specific_param.m_decoder.m_sot_length -= (l_marker_size + 2);
-                        }
-                        l_marker_size -= 2; /* Subtract the size of the marker ID already read */
-
-                        /* Get the marker handler from the marker ID */
-                        l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
-
-                        /* Check if the marker is known and if it is the right place to find it */
-                        if (! (p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states) ) {
-                                opj_event_msg(p_manager, EVT_ERROR, "Marker is not compliant with its position\n");
-                                return OPJ_FALSE;
-                        }
-/* FIXME manage case of unknown marker as in the main header ? */
-
-                        /* Check if the marker size is compatible with the header data size */
-                        if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
-                                OPJ_BYTE *new_header_data = NULL;
-                                /* If we are here, this means we consider this marker as known & we will read it */
-                                /* Check enough bytes left in stream before allocation */
-                                if ((OPJ_OFF_T)l_marker_size >  opj_stream_get_number_byte_left(p_stream)) {
-                                        opj_event_msg(p_manager, EVT_ERROR, "Marker size inconsistent with stream length\n");
-                                        return OPJ_FALSE;
-                                }
-                                new_header_data = (OPJ_BYTE *) opj_realloc(p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
-                                if (! new_header_data) {
-                                        opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
-                                        p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
-                                        p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
-                                        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
-                                        return OPJ_FALSE;
-                                }
-                                p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
-                                p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
-                        }
-
-                        /* Try to read the rest of the marker segment from stream and copy them into the buffer */
-                        if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager) != l_marker_size) {
-                                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-                                return OPJ_FALSE;
-                        }
-
-                        if (!l_marker_handler->handler) {
-                                /* See issue #175 */
-                                opj_event_msg(p_manager, EVT_ERROR, "Not sure how that happened.\n");
-                                return OPJ_FALSE;
-                        }
-                        /* Read the marker segment with the correct marker handler */
-                        if (! (*(l_marker_handler->handler))(p_j2k,p_j2k->m_specific_param.m_decoder.m_header_data,l_marker_size,p_manager)) {
-                                opj_event_msg(p_manager, EVT_ERROR, "Fail to read the current marker segment (%#x)\n", l_current_marker);
-                                return OPJ_FALSE;
-                        }
-
-                        /* Add the marker to the codestream index*/
-                        if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
-                                                p_j2k->cstr_index,
-                                                l_marker_handler->id,
-                                                (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
-                                                l_marker_size + 4 )) {
-                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
-                                return OPJ_FALSE;
-                        }
-
-                        /* Keep the position of the last SOT marker read */
-                        if ( l_marker_handler->id == J2K_MS_SOT ) {
-                                OPJ_UINT32 sot_pos = (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4 ;
-                                if (sot_pos > p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos)
-                                {
-                                        p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = sot_pos;
-                                }
-                        }
-
-                        if (p_j2k->m_specific_param.m_decoder.m_skip_data) {
-                                /* Skip the rest of the tile part header*/
-                                if (opj_stream_skip(p_stream,p_j2k->m_specific_param.m_decoder.m_sot_length,p_manager) != p_j2k->m_specific_param.m_decoder.m_sot_length) {
-                                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-                                        return OPJ_FALSE;
-                                }
-                                l_current_marker = J2K_MS_SOD; /* Normally we reached a SOD */
-                        }
-                        else {
-                                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
-                                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
-                                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-                                        return OPJ_FALSE;
-                                }
-                                /* Read 2 bytes from the buffer as the new marker ID */
-                                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
-                        }
-                }
-                if(opj_stream_get_number_byte_left(p_stream) == 0
-                    && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC)
-                    break;
-
-                /* If we didn't skip data before, we need to read the SOD marker*/
-                if (! p_j2k->m_specific_param.m_decoder.m_skip_data) {
-                        /* Try to read the SOD marker and skip data ? FIXME */
-                        if (! opj_j2k_read_sod(p_j2k, p_stream, p_manager)) {
-                                return OPJ_FALSE;
-                        }
-                        if (p_j2k->m_specific_param.m_decoder.m_can_decode && !p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked) {
-                                /* Issue 254 */
-                                OPJ_BOOL l_correction_needed;
-													
-                                p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
-                                if(!opj_j2k_need_nb_tile_parts_correction(p_stream, p_j2k->m_current_tile_number, &l_correction_needed, p_manager)) {
-                                        opj_event_msg(p_manager, EVT_ERROR, "opj_j2k_apply_nb_tile_parts_correction error\n");
-                                        return OPJ_FALSE;
-                                }
-                                if (l_correction_needed) {
-                                        OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
-                                        OPJ_UINT32 l_tile_no;
-
-                                        p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
-                                        p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction = 1;
-                                        /* correct tiles */
-                                        for (l_tile_no = 0U; l_tile_no < l_nb_tiles; ++l_tile_no) {
-                                                if (p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts != 0U) {
-                                                        p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts+=1;
-                                                }
-                                        }
-                                        opj_event_msg(p_manager, EVT_WARNING, "Non conformant codestream TPsot==TNsot.\n");
-                                }
-                        }
-                        if (! p_j2k->m_specific_param.m_decoder.m_can_decode){
-                                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
-                                if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
-                                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-                                        return OPJ_FALSE;
-                                }
-
-                                /* Read 2 bytes from buffer as the new marker ID */
-                                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
-                        }
-                }
-                else {
-                        /* Indicate we will try to read a new tile-part header*/
-                        p_j2k->m_specific_param.m_decoder.m_skip_data = 0;
-                        p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
-                        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
-
-                        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
-                        if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) {
-                                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-                                return OPJ_FALSE;
-                        }
-
-                        /* Read 2 bytes from buffer as the new marker ID */
-                        opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,&l_current_marker,2);
-                }
-        }
-
-        /* Current marker is the EOC marker ?*/
-        if (l_current_marker == J2K_MS_EOC) {
-                if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC ){
-                        p_j2k->m_current_tile_number = 0;
-                        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
-                }
-        }
-
-        /* FIXME DOC ???*/
-        if ( ! p_j2k->m_specific_param.m_decoder.m_can_decode) {
-                OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
-                l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;
-
-                while( (p_j2k->m_current_tile_number < l_nb_tiles) && (l_tcp->m_data == 00) ) {
-                        ++p_j2k->m_current_tile_number;
-                        ++l_tcp;
-                }
-
-                if (p_j2k->m_current_tile_number == l_nb_tiles) {
-                        *p_go_on = OPJ_FALSE;
-                        return OPJ_TRUE;
-                }
-        }
-
-        if (! opj_j2k_merge_ppt(p_j2k->m_cp.tcps + p_j2k->m_current_tile_number, p_manager)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPT data\n");
-                return OPJ_FALSE;
-        }
-        /*FIXME ???*/
-        if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number, p_manager)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
-                return OPJ_FALSE;
-        }
-
-        opj_event_msg(p_manager, EVT_INFO, "Header of tile %d / %d has been read.\n",
-                        p_j2k->m_current_tile_number+1, (p_j2k->m_cp.th * p_j2k->m_cp.tw));
-
-        *p_tile_index = p_j2k->m_current_tile_number;
-        *p_go_on = OPJ_TRUE;
-        *p_data_size = opj_tcd_get_decoded_tile_size(p_j2k->m_tcd);
-        if (*p_data_size == (OPJ_UINT32)-1) {
-                return OPJ_FALSE;
-        }
-
-        *p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0;
-        *p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0;
-        *p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
-        *p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;
-        *p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;
-
-         p_j2k->m_specific_param.m_decoder.m_state |= 0x0080;/* FIXME J2K_DEC_STATE_DATA;*/
-
+    if (!opj_stream_has_seek(p_stream)) {
+        /* We can't do much in this case, seek is needed */
         return OPJ_TRUE;
-}
+    }
 
-OPJ_BOOL opj_j2k_decode_tile (  opj_j2k_t * p_j2k,
-                                                        OPJ_UINT32 p_tile_index,
-                                                        OPJ_BYTE * p_data,
-                                                        OPJ_UINT32 p_data_size,
-                                                        opj_stream_private_t *p_stream,
-                                                        opj_event_mgr_t * p_manager )
-{
-        OPJ_UINT32 l_current_marker;
-        OPJ_BYTE l_data [2];
-        opj_tcp_t * l_tcp;
+    l_stream_pos_backup = opj_stream_tell(p_stream);
+    if (l_stream_pos_backup == -1) {
+        /* let's do nothing */
+        return OPJ_TRUE;
+    }
 
-        /* preconditions */
-        assert(p_stream != 00);
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-
-        if ( !(p_j2k->m_specific_param.m_decoder.m_state & 0x0080/*FIXME J2K_DEC_STATE_DATA*/)
-                || (p_tile_index != p_j2k->m_current_tile_number) ) {
+    for (;;) {
+        /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
+        if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
+            /* assume all is OK */
+            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
                 return OPJ_FALSE;
-        }
-
-        l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);
-        if (! l_tcp->m_data) {
-                opj_j2k_tcp_destroy(l_tcp);
-                return OPJ_FALSE;
-        }
-
-        if (! opj_tcd_decode_tile(      p_j2k->m_tcd,
-                                                                l_tcp->m_data,
-                                                                l_tcp->m_data_size,
-                                                                p_tile_index,
-                                                                p_j2k->cstr_index, p_manager) ) {
-                opj_j2k_tcp_destroy(l_tcp);
-                p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;/*FIXME J2K_DEC_STATE_ERR;*/
-                opj_event_msg(p_manager, EVT_ERROR, "Failed to decode.\n");
-                return OPJ_FALSE;
-        }
-
-        if (! opj_tcd_update_tile_data(p_j2k->m_tcd,p_data,p_data_size)) {
-                return OPJ_FALSE;
-        }
-
-        /* To avoid to destroy the tcp which can be useful when we try to decode a tile decoded before (cf j2k_random_tile_access)
-         * we destroy just the data which will be re-read in read_tile_header*/
-        /*opj_j2k_tcp_destroy(l_tcp);
-        p_j2k->m_tcd->tcp = 0;*/
-        opj_j2k_tcp_data_destroy(l_tcp);
-
-        p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
-        p_j2k->m_specific_param.m_decoder.m_state &= (~ (0x0080u));/* FIXME J2K_DEC_STATE_DATA);*/
-
-        if(opj_stream_get_number_byte_left(p_stream) == 0 
-            && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC){
+            }
             return OPJ_TRUE;
         }
 
-        if (p_j2k->m_specific_param.m_decoder.m_state != 0x0100){ /*FIXME J2K_DEC_STATE_EOC)*/
-                if (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
-                        return OPJ_FALSE;
-                }
+        /* Read 2 bytes from buffer as the new marker ID */
+        opj_read_bytes(l_header_data, &l_current_marker, 2);
 
-                opj_read_bytes(l_data,&l_current_marker,2);
-
-                if (l_current_marker == J2K_MS_EOC) {
-                        p_j2k->m_current_tile_number = 0;
-                        p_j2k->m_specific_param.m_decoder.m_state =  0x0100;/*FIXME J2K_DEC_STATE_EOC;*/
-                }
-                else if (l_current_marker != J2K_MS_SOT)
-                {       
-                        if(opj_stream_get_number_byte_left(p_stream) == 0) {
-                            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
-                            opj_event_msg(p_manager, EVT_WARNING, "Stream does not end with EOC\n");
-                            return OPJ_TRUE;
-                        }
-                        opj_event_msg(p_manager, EVT_ERROR, "Stream too short, expected SOT\n");
-                        return OPJ_FALSE;
-                }
-        }
-
-        return OPJ_TRUE;
-}
-
-static OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image)
-{
-        OPJ_UINT32 i,j,k = 0;
-        OPJ_UINT32 l_width_src,l_height_src;
-        OPJ_UINT32 l_width_dest,l_height_dest;
-        OPJ_INT32 l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src;
-        OPJ_SIZE_T l_start_offset_src, l_line_offset_src, l_end_offset_src ;
-        OPJ_UINT32 l_start_x_dest , l_start_y_dest;
-        OPJ_UINT32 l_x0_dest, l_y0_dest, l_x1_dest, l_y1_dest;
-        OPJ_SIZE_T l_start_offset_dest, l_line_offset_dest;
-
-        opj_image_comp_t * l_img_comp_src = 00;
-        opj_image_comp_t * l_img_comp_dest = 00;
-
-        opj_tcd_tilecomp_t * l_tilec = 00;
-        opj_image_t * l_image_src = 00;
-        OPJ_UINT32 l_size_comp, l_remaining;
-        OPJ_INT32 * l_dest_ptr;
-        opj_tcd_resolution_t* l_res= 00;
-
-        l_tilec = p_tcd->tcd_image->tiles->comps;
-        l_image_src = p_tcd->image;
-        l_img_comp_src = l_image_src->comps;
-
-        l_img_comp_dest = p_output_image->comps;
-
-        for (i=0; i<l_image_src->numcomps; i++) {
-
-                /* Allocate output component buffer if necessary */
-                if (!l_img_comp_dest->data) {
-                    OPJ_UINT32 width = l_img_comp_dest->w;
-                    OPJ_UINT32 height = l_img_comp_dest->h;
-                    const OPJ_UINT32 MAX_SIZE = UINT32_MAX / sizeof(OPJ_INT32);
-                    if (height == 0 || width > MAX_SIZE / height) {
-                        return OPJ_FALSE;
-                    }
-                    l_img_comp_dest->data = (OPJ_INT32*)opj_calloc(width * height, sizeof(OPJ_INT32));
-                    if (!l_img_comp_dest->data) {
-                        return OPJ_FALSE;
-                    }
-                }
-
-                /* Copy info from decoded comp image to output image */
-                l_img_comp_dest->resno_decoded = l_img_comp_src->resno_decoded;
-
-                /*-----*/
-                /* Compute the precision of the output buffer */
-                l_size_comp = l_img_comp_src->prec >> 3; /*(/ 8)*/
-                l_remaining = l_img_comp_src->prec & 7;  /* (%8) */
-                l_res = l_tilec->resolutions + l_img_comp_src->resno_decoded;
-
-                if (l_remaining) {
-                        ++l_size_comp;
-                }
-
-                if (l_size_comp == 3) {
-                        l_size_comp = 4;
-                }
-                /*-----*/
-
-                /* Current tile component size*/
-                /*if (i == 0) {
-                fprintf(stdout, "SRC: l_res_x0=%d, l_res_x1=%d, l_res_y0=%d, l_res_y1=%d\n",
-                                l_res->x0, l_res->x1, l_res->y0, l_res->y1);
-                }*/
-
-                l_width_src = (OPJ_UINT32)(l_res->x1 - l_res->x0);
-                l_height_src = (OPJ_UINT32)(l_res->y1 - l_res->y0);
-
-                /* Border of the current output component*/
-                l_x0_dest = opj_uint_ceildivpow2(l_img_comp_dest->x0, l_img_comp_dest->factor);
-                l_y0_dest = opj_uint_ceildivpow2(l_img_comp_dest->y0, l_img_comp_dest->factor);
-                l_x1_dest = l_x0_dest + l_img_comp_dest->w; /* can't overflow given that image->x1 is uint32 */
-                l_y1_dest = l_y0_dest + l_img_comp_dest->h;
-
-                /*if (i == 0) {
-                fprintf(stdout, "DEST: l_x0_dest=%d, l_x1_dest=%d, l_y0_dest=%d, l_y1_dest=%d (%d)\n",
-                                l_x0_dest, l_x1_dest, l_y0_dest, l_y1_dest, l_img_comp_dest->factor );
-                }*/
-
-                /*-----*/
-                /* Compute the area (l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src)
-                 * of the input buffer (decoded tile component) which will be move
-                 * in the output buffer. Compute the area of the output buffer (l_start_x_dest,
-                 * l_start_y_dest, l_width_dest, l_height_dest)  which will be modified
-                 * by this input area.
-                 * */
-                assert( l_res->x0 >= 0);
-                assert( l_res->x1 >= 0);
-
-                /* Prevent bad casting to unsigned values in the subsequent lines. */
-                if ( l_res->x0 < 0 || l_res->x1 < 0 || l_res->y0 < 0 || l_res->y1 < 0 ) {
-                        return OPJ_FALSE;
-                }
-
-                if ( l_x0_dest < (OPJ_UINT32)l_res->x0 ) {
-                        l_start_x_dest = (OPJ_UINT32)l_res->x0 - l_x0_dest;
-                        l_offset_x0_src = 0;
-
-                        if ( l_x1_dest >= (OPJ_UINT32)l_res->x1 ) {
-                                l_width_dest = l_width_src;
-                                l_offset_x1_src = 0;
-                        }
-                        else {
-                                l_width_dest = l_x1_dest - (OPJ_UINT32)l_res->x0 ;
-                                l_offset_x1_src = (OPJ_INT32)(l_width_src - l_width_dest);
-                        }
-                }
-                else {
-                        l_start_x_dest = 0U;
-                        l_offset_x0_src = (OPJ_INT32)l_x0_dest - l_res->x0;
-
-                        if ( l_x1_dest >= (OPJ_UINT32)l_res->x1 ) {
-                                l_width_dest = l_width_src - (OPJ_UINT32)l_offset_x0_src;
-                                l_offset_x1_src = 0;
-                        }
-                        else {
-                                l_width_dest = l_img_comp_dest->w ;
-                                l_offset_x1_src = l_res->x1 - (OPJ_INT32)l_x1_dest;
-                        }
-                }
-
-                if ( l_y0_dest < (OPJ_UINT32)l_res->y0 ) {
-                        l_start_y_dest = (OPJ_UINT32)l_res->y0 - l_y0_dest;
-                        l_offset_y0_src = 0;
-
-                        if ( l_y1_dest >= (OPJ_UINT32)l_res->y1 ) {
-                                l_height_dest = l_height_src;
-                                l_offset_y1_src = 0;
-                        }
-                        else {
-                                l_height_dest = l_y1_dest - (OPJ_UINT32)l_res->y0 ;
-                                l_offset_y1_src =  (OPJ_INT32)(l_height_src - l_height_dest);
-                        }
-                }
-                else {
-                        l_start_y_dest = 0U;
-                        l_offset_y0_src = (OPJ_INT32)l_y0_dest - l_res->y0;
-
-                        if ( l_y1_dest >= (OPJ_UINT32)l_res->y1 ) {
-                                l_height_dest = l_height_src - (OPJ_UINT32)l_offset_y0_src;
-                                l_offset_y1_src = 0;
-                        }
-                        else {
-                                l_height_dest = l_img_comp_dest->h ;
-                                l_offset_y1_src = l_res->y1 - (OPJ_INT32)l_y1_dest;
-                        }
-                }
-
-                if( (l_offset_x0_src < 0 ) || (l_offset_y0_src < 0 ) || (l_offset_x1_src < 0 ) || (l_offset_y1_src < 0 ) ){
-                        return OPJ_FALSE;
-                }
-                /* testcase 2977.pdf.asan.67.2198 */
-                if ((OPJ_INT32)l_width_dest < 0 || (OPJ_INT32)l_height_dest < 0) {
-                        return OPJ_FALSE;
-                }
-                /*-----*/
-
-                /* Compute the input buffer offset */
-                l_start_offset_src = (OPJ_SIZE_T)l_offset_x0_src + (OPJ_SIZE_T)l_offset_y0_src * (OPJ_SIZE_T)l_width_src;
-                l_line_offset_src  = (OPJ_SIZE_T)l_offset_x1_src + (OPJ_SIZE_T)l_offset_x0_src;
-                l_end_offset_src   = (OPJ_SIZE_T)l_offset_y1_src * (OPJ_SIZE_T)l_width_src - (OPJ_SIZE_T)l_offset_x0_src;
-
-                /* Compute the output buffer offset */
-                l_start_offset_dest = (OPJ_SIZE_T)l_start_x_dest + (OPJ_SIZE_T)l_start_y_dest * (OPJ_SIZE_T)l_img_comp_dest->w;
-                l_line_offset_dest  = (OPJ_SIZE_T)l_img_comp_dest->w - (OPJ_SIZE_T)l_width_dest;
-
-                /* Move the output buffer to the first place where we will write*/
-                l_dest_ptr = l_img_comp_dest->data + l_start_offset_dest;
-
-                /*if (i == 0) {
-                        fprintf(stdout, "COMPO[%d]:\n",i);
-                        fprintf(stdout, "SRC: l_start_x_src=%d, l_start_y_src=%d, l_width_src=%d, l_height_src=%d\n"
-                                        "\t tile offset:%d, %d, %d, %d\n"
-                                        "\t buffer offset: %d; %d, %d\n",
-                                        l_res->x0, l_res->y0, l_width_src, l_height_src,
-                                        l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src,
-                                        l_start_offset_src, l_line_offset_src, l_end_offset_src);
-
-                        fprintf(stdout, "DEST: l_start_x_dest=%d, l_start_y_dest=%d, l_width_dest=%d, l_height_dest=%d\n"
-                                        "\t start offset: %d, line offset= %d\n",
-                                        l_start_x_dest, l_start_y_dest, l_width_dest, l_height_dest, l_start_offset_dest, l_line_offset_dest);
-                }*/
-
-                switch (l_size_comp) {
-                        case 1:
-                                {
-                                        OPJ_CHAR * l_src_ptr = (OPJ_CHAR*) p_data;
-                                        l_src_ptr += l_start_offset_src; /* Move to the first place where we will read*/
-
-                                        if (l_img_comp_src->sgnd) {
-                                                for (j = 0 ; j < l_height_dest ; ++j) {
-                                                        for ( k = 0 ; k < l_width_dest ; ++k) {
-                                                                *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++)); /* Copy only the data needed for the output image */
-                                                        }
-
-                                                        l_dest_ptr+= l_line_offset_dest; /* Move to the next place where we will write */
-                                                        l_src_ptr += l_line_offset_src ; /* Move to the next place where we will read */
-                                                }
-                                        }
-                                        else {
-                                                for ( j = 0 ; j < l_height_dest ; ++j ) {
-                                                        for ( k = 0 ; k < l_width_dest ; ++k) {
-                                                                *(l_dest_ptr++) = (OPJ_INT32) ((*(l_src_ptr++))&0xff);
-                                                        }
-
-                                                        l_dest_ptr+= l_line_offset_dest;
-                                                        l_src_ptr += l_line_offset_src;
-                                                }
-                                        }
-
-                                        l_src_ptr += l_end_offset_src; /* Move to the end of this component-part of the input buffer */
-                                        p_data = (OPJ_BYTE*) l_src_ptr; /* Keep the current position for the next component-part */
-                                }
-                                break;
-                        case 2:
-                                {
-                                        OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_data;
-                                        l_src_ptr += l_start_offset_src;
-
-                                        if (l_img_comp_src->sgnd) {
-                                                for (j=0;j<l_height_dest;++j) {
-                                                        for (k=0;k<l_width_dest;++k) {
-                                                                *(l_dest_ptr++) = *(l_src_ptr++);
-                                                        }
-
-                                                        l_dest_ptr+= l_line_offset_dest;
-                                                        l_src_ptr += l_line_offset_src ;
-                                                }
-                                        }
-                                        else {
-                                                for (j=0;j<l_height_dest;++j) {
-                                                        for (k=0;k<l_width_dest;++k) {
-                                                                *(l_dest_ptr++) = (*(l_src_ptr++))&0xffff;
-                                                        }
-
-                                                        l_dest_ptr+= l_line_offset_dest;
-                                                        l_src_ptr += l_line_offset_src ;
-                                                }
-                                        }
-
-                                        l_src_ptr += l_end_offset_src;
-                                        p_data = (OPJ_BYTE*) l_src_ptr;
-                                }
-                                break;
-                        case 4:
-                                {
-                                        OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_data;
-                                        l_src_ptr += l_start_offset_src;
-
-                                        for (j=0;j<l_height_dest;++j) {
-                                                for (k=0;k<l_width_dest;++k) {
-                                                        *(l_dest_ptr++) = (*(l_src_ptr++));
-                                                }
-
-                                                l_dest_ptr+= l_line_offset_dest;
-                                                l_src_ptr += l_line_offset_src ;
-                                        }
-
-                                        l_src_ptr += l_end_offset_src;
-                                        p_data = (OPJ_BYTE*) l_src_ptr;
-                                }
-                                break;
-                }
-
-                ++l_img_comp_dest;
-                ++l_img_comp_src;
-                ++l_tilec;
-        }
-
-        return OPJ_TRUE;
-}
-
-OPJ_BOOL opj_j2k_set_decode_area(       opj_j2k_t *p_j2k,
-                                                                    opj_image_t* p_image,
-                                                                    OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
-                                                                    OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
-                                                                    opj_event_mgr_t * p_manager )
-{
-        opj_cp_t * l_cp = &(p_j2k->m_cp);
-        opj_image_t * l_image = p_j2k->m_private_image;
-
-        OPJ_UINT32 it_comp;
-        OPJ_INT32 l_comp_x1, l_comp_y1;
-        opj_image_comp_t* l_img_comp = NULL;
-
-        /* Check if we are read the main header */
-        if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) { /* FIXME J2K_DEC_STATE_TPHSOT)*/
-                opj_event_msg(p_manager, EVT_ERROR, "Need to decode the main header before begin to decode the remaining codestream");
+        if (l_current_marker != J2K_MS_SOT) {
+            /* assume all is OK */
+            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
                 return OPJ_FALSE;
+            }
+            return OPJ_TRUE;
         }
 
-        if ( !p_start_x && !p_start_y && !p_end_x && !p_end_y){
-                opj_event_msg(p_manager, EVT_INFO, "No decoded area parameters, set the decoded area to the whole image\n");
+        /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
+        if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
+            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+            return OPJ_FALSE;
+        }
 
-                p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
-                p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
-                p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
-                p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
+        /* Read 2 bytes from the buffer as the marker size */
+        opj_read_bytes(l_header_data, &l_marker_size, 2);
 
+        /* Check marker size for SOT Marker */
+        if (l_marker_size != 10) {
+            opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
+            return OPJ_FALSE;
+        }
+        l_marker_size -= 2;
+
+        if (opj_stream_read_data(p_stream, l_header_data, l_marker_size,
+                                 p_manager) != l_marker_size) {
+            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+            return OPJ_FALSE;
+        }
+
+        if (! opj_j2k_get_sot_values(l_header_data, l_marker_size, &l_tile_no,
+                                     &l_tot_len, &l_current_part, &l_num_parts, p_manager)) {
+            return OPJ_FALSE;
+        }
+
+        if (l_tile_no == tile_no) {
+            /* we found what we were looking for */
+            break;
+        }
+
+        if ((l_tot_len == 0U) || (l_tot_len < 14U)) {
+            /* last SOT until EOC or invalid Psot value */
+            /* assume all is OK */
+            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
+                return OPJ_FALSE;
+            }
+            return OPJ_TRUE;
+        }
+        l_tot_len -= 12U;
+        /* look for next SOT marker */
+        if (opj_stream_skip(p_stream, (OPJ_OFF_T)(l_tot_len),
+                            p_manager) != (OPJ_OFF_T)(l_tot_len)) {
+            /* assume all is OK */
+            if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
+                return OPJ_FALSE;
+            }
+            return OPJ_TRUE;
+        }
+    }
+
+    /* check for correction */
+    if (l_current_part == l_num_parts) {
+        *p_correction_needed = OPJ_TRUE;
+    }
+
+    if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
+        return OPJ_FALSE;
+    }
+    return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_read_tile_header(opj_j2k_t * p_j2k,
+                                  OPJ_UINT32 * p_tile_index,
+                                  OPJ_UINT32 * p_data_size,
+                                  OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
+                                  OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
+                                  OPJ_UINT32 * p_nb_comps,
+                                  OPJ_BOOL * p_go_on,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager)
+{
+    OPJ_UINT32 l_current_marker = J2K_MS_SOT;
+    OPJ_UINT32 l_marker_size;
+    const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
+    opj_tcp_t * l_tcp = NULL;
+
+    /* preconditions */
+    assert(p_stream != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+
+    /* Reach the End Of Codestream ?*/
+    if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC) {
+        l_current_marker = J2K_MS_EOC;
+    }
+    /* We need to encounter a SOT marker (a new tile-part header) */
+    else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) {
+        return OPJ_FALSE;
+    }
+
+    /* Read into the codestream until reach the EOC or ! can_decode ??? FIXME */
+    while ((!p_j2k->m_specific_param.m_decoder.m_can_decode) &&
+            (l_current_marker != J2K_MS_EOC)) {
+
+        /* Try to read until the Start Of Data is detected */
+        while (l_current_marker != J2K_MS_SOD) {
+
+            if (opj_stream_get_number_byte_left(p_stream) == 0) {
+                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
+                break;
+            }
+
+            /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
+            if (opj_stream_read_data(p_stream,
+                                     p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
+                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                return OPJ_FALSE;
+            }
+
+            /* Read 2 bytes from the buffer as the marker size */
+            opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data, &l_marker_size,
+                           2);
+
+            /* Check marker size (does not include marker ID but includes marker size) */
+            if (l_marker_size < 2) {
+                opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
+                return OPJ_FALSE;
+            }
+
+            /* cf. https://code.google.com/p/openjpeg/issues/detail?id=226 */
+            if (l_current_marker == 0x8080 &&
+                    opj_stream_get_number_byte_left(p_stream) == 0) {
+                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
+                break;
+            }
+
+            /* Why this condition? FIXME */
+            if (p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_TPH) {
+                p_j2k->m_specific_param.m_decoder.m_sot_length -= (l_marker_size + 2);
+            }
+            l_marker_size -= 2; /* Subtract the size of the marker ID already read */
+
+            /* Get the marker handler from the marker ID */
+            l_marker_handler = opj_j2k_get_marker_handler(l_current_marker);
+
+            /* Check if the marker is known and if it is the right place to find it */
+            if (!(p_j2k->m_specific_param.m_decoder.m_state & l_marker_handler->states)) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Marker is not compliant with its position\n");
+                return OPJ_FALSE;
+            }
+            /* FIXME manage case of unknown marker as in the main header ? */
+
+            /* Check if the marker size is compatible with the header data size */
+            if (l_marker_size > p_j2k->m_specific_param.m_decoder.m_header_data_size) {
+                OPJ_BYTE *new_header_data = NULL;
+                /* If we are here, this means we consider this marker as known & we will read it */
+                /* Check enough bytes left in stream before allocation */
+                if ((OPJ_OFF_T)l_marker_size >  opj_stream_get_number_byte_left(p_stream)) {
+                    opj_event_msg(p_manager, EVT_ERROR,
+                                  "Marker size inconsistent with stream length\n");
+                    return OPJ_FALSE;
+                }
+                new_header_data = (OPJ_BYTE *) opj_realloc(
+                                      p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size);
+                if (! new_header_data) {
+                    opj_free(p_j2k->m_specific_param.m_decoder.m_header_data);
+                    p_j2k->m_specific_param.m_decoder.m_header_data = NULL;
+                    p_j2k->m_specific_param.m_decoder.m_header_data_size = 0;
+                    opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read header\n");
+                    return OPJ_FALSE;
+                }
+                p_j2k->m_specific_param.m_decoder.m_header_data = new_header_data;
+                p_j2k->m_specific_param.m_decoder.m_header_data_size = l_marker_size;
+            }
+
+            /* Try to read the rest of the marker segment from stream and copy them into the buffer */
+            if (opj_stream_read_data(p_stream,
+                                     p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size,
+                                     p_manager) != l_marker_size) {
+                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                return OPJ_FALSE;
+            }
+
+            if (!l_marker_handler->handler) {
+                /* See issue #175 */
+                opj_event_msg(p_manager, EVT_ERROR, "Not sure how that happened.\n");
+                return OPJ_FALSE;
+            }
+            /* Read the marker segment with the correct marker handler */
+            if (!(*(l_marker_handler->handler))(p_j2k,
+                                                p_j2k->m_specific_param.m_decoder.m_header_data, l_marker_size, p_manager)) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Fail to read the current marker segment (%#x)\n", l_current_marker);
+                return OPJ_FALSE;
+            }
+
+            /* Add the marker to the codestream index*/
+            if (OPJ_FALSE == opj_j2k_add_tlmarker(p_j2k->m_current_tile_number,
+                                                  p_j2k->cstr_index,
+                                                  l_marker_handler->id,
+                                                  (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4,
+                                                  l_marker_size + 4)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to add tl marker\n");
+                return OPJ_FALSE;
+            }
+
+            /* Keep the position of the last SOT marker read */
+            if (l_marker_handler->id == J2K_MS_SOT) {
+                OPJ_UINT32 sot_pos = (OPJ_UINT32) opj_stream_tell(p_stream) - l_marker_size - 4
+                                     ;
+                if (sot_pos > p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos) {
+                    p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = sot_pos;
+                }
+            }
+
+            if (p_j2k->m_specific_param.m_decoder.m_skip_data) {
+                /* Skip the rest of the tile part header*/
+                if (opj_stream_skip(p_stream, p_j2k->m_specific_param.m_decoder.m_sot_length,
+                                    p_manager) != p_j2k->m_specific_param.m_decoder.m_sot_length) {
+                    opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                    return OPJ_FALSE;
+                }
+                l_current_marker = J2K_MS_SOD; /* Normally we reached a SOD */
+            } else {
+                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer*/
+                if (opj_stream_read_data(p_stream,
+                                         p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
+                    opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                    return OPJ_FALSE;
+                }
+                /* Read 2 bytes from the buffer as the new marker ID */
+                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
+                               &l_current_marker, 2);
+            }
+        }
+        if (opj_stream_get_number_byte_left(p_stream) == 0
+                && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
+            break;
+        }
+
+        /* If we didn't skip data before, we need to read the SOD marker*/
+        if (! p_j2k->m_specific_param.m_decoder.m_skip_data) {
+            /* Try to read the SOD marker and skip data ? FIXME */
+            if (! opj_j2k_read_sod(p_j2k, p_stream, p_manager)) {
+                return OPJ_FALSE;
+            }
+            if (p_j2k->m_specific_param.m_decoder.m_can_decode &&
+                    !p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked) {
+                /* Issue 254 */
+                OPJ_BOOL l_correction_needed;
+
+                p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
+                if (!opj_j2k_need_nb_tile_parts_correction(p_stream,
+                        p_j2k->m_current_tile_number, &l_correction_needed, p_manager)) {
+                    opj_event_msg(p_manager, EVT_ERROR,
+                                  "opj_j2k_apply_nb_tile_parts_correction error\n");
+                    return OPJ_FALSE;
+                }
+                if (l_correction_needed) {
+                    OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
+                    OPJ_UINT32 l_tile_no;
+
+                    p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
+                    p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction = 1;
+                    /* correct tiles */
+                    for (l_tile_no = 0U; l_tile_no < l_nb_tiles; ++l_tile_no) {
+                        if (p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts != 0U) {
+                            p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts += 1;
+                        }
+                    }
+                    opj_event_msg(p_manager, EVT_WARNING,
+                                  "Non conformant codestream TPsot==TNsot.\n");
+                }
+            }
+            if (! p_j2k->m_specific_param.m_decoder.m_can_decode) {
+                /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
+                if (opj_stream_read_data(p_stream,
+                                         p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
+                    opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                    return OPJ_FALSE;
+                }
+
+                /* Read 2 bytes from buffer as the new marker ID */
+                opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
+                               &l_current_marker, 2);
+            }
+        } else {
+            /* Indicate we will try to read a new tile-part header*/
+            p_j2k->m_specific_param.m_decoder.m_skip_data = 0;
+            p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
+            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+
+            /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
+            if (opj_stream_read_data(p_stream,
+                                     p_j2k->m_specific_param.m_decoder.m_header_data, 2, p_manager) != 2) {
+                opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+                return OPJ_FALSE;
+            }
+
+            /* Read 2 bytes from buffer as the new marker ID */
+            opj_read_bytes(p_j2k->m_specific_param.m_decoder.m_header_data,
+                           &l_current_marker, 2);
+        }
+    }
+
+    /* Current marker is the EOC marker ?*/
+    if (l_current_marker == J2K_MS_EOC) {
+        p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
+    }
+
+    /* FIXME DOC ???*/
+    if (! p_j2k->m_specific_param.m_decoder.m_can_decode) {
+        OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+        l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number;
+
+        while ((p_j2k->m_current_tile_number < l_nb_tiles) && (l_tcp->m_data == 00)) {
+            ++p_j2k->m_current_tile_number;
+            ++l_tcp;
+        }
+
+        if (p_j2k->m_current_tile_number == l_nb_tiles) {
+            *p_go_on = OPJ_FALSE;
+            return OPJ_TRUE;
+        }
+    }
+
+    if (! opj_j2k_merge_ppt(p_j2k->m_cp.tcps + p_j2k->m_current_tile_number,
+                            p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPT data\n");
+        return OPJ_FALSE;
+    }
+    /*FIXME ???*/
+    if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number,
+                                   p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n");
+        return OPJ_FALSE;
+    }
+
+    opj_event_msg(p_manager, EVT_INFO, "Header of tile %d / %d has been read.\n",
+                  p_j2k->m_current_tile_number + 1, (p_j2k->m_cp.th * p_j2k->m_cp.tw));
+
+    *p_tile_index = p_j2k->m_current_tile_number;
+    *p_go_on = OPJ_TRUE;
+    *p_data_size = opj_tcd_get_decoded_tile_size(p_j2k->m_tcd);
+    if (*p_data_size == UINT_MAX) {
+        return OPJ_FALSE;
+    }
+    *p_tile_x0 = p_j2k->m_tcd->tcd_image->tiles->x0;
+    *p_tile_y0 = p_j2k->m_tcd->tcd_image->tiles->y0;
+    *p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
+    *p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;
+    *p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;
+
+    p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_DATA;
+
+    return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_decode_tile(opj_j2k_t * p_j2k,
+                             OPJ_UINT32 p_tile_index,
+                             OPJ_BYTE * p_data,
+                             OPJ_UINT32 p_data_size,
+                             opj_stream_private_t *p_stream,
+                             opj_event_mgr_t * p_manager)
+{
+    OPJ_UINT32 l_current_marker;
+    OPJ_BYTE l_data [2];
+    opj_tcp_t * l_tcp;
+
+    /* preconditions */
+    assert(p_stream != 00);
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+
+    if (!(p_j2k->m_specific_param.m_decoder.m_state & J2K_STATE_DATA)
+            || (p_tile_index != p_j2k->m_current_tile_number)) {
+        return OPJ_FALSE;
+    }
+
+    l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);
+    if (! l_tcp->m_data) {
+        opj_j2k_tcp_destroy(l_tcp);
+        return OPJ_FALSE;
+    }
+
+    if (! opj_tcd_decode_tile(p_j2k->m_tcd,
+                              l_tcp->m_data,
+                              l_tcp->m_data_size,
+                              p_tile_index,
+                              p_j2k->cstr_index, p_manager)) {
+        opj_j2k_tcp_destroy(l_tcp);
+        p_j2k->m_specific_param.m_decoder.m_state |= J2K_STATE_ERR;
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to decode.\n");
+        return OPJ_FALSE;
+    }
+
+    /* p_data can be set to NULL when the call will take care of using */
+    /* itself the TCD data. This is typically the case for whole single */
+    /* tile decoding optimization. */
+    if (p_data != NULL) {
+        if (! opj_tcd_update_tile_data(p_j2k->m_tcd, p_data, p_data_size)) {
+            return OPJ_FALSE;
+        }
+
+        /* To avoid to destroy the tcp which can be useful when we try to decode a tile decoded before (cf j2k_random_tile_access)
+        * we destroy just the data which will be re-read in read_tile_header*/
+        /*opj_j2k_tcp_destroy(l_tcp);
+        p_j2k->m_tcd->tcp = 0;*/
+        opj_j2k_tcp_data_destroy(l_tcp);
+    }
+
+    p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
+    p_j2k->m_specific_param.m_decoder.m_state &= (~(OPJ_UINT32)J2K_STATE_DATA);
+
+    if (opj_stream_get_number_byte_left(p_stream) == 0
+            && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
+        return OPJ_TRUE;
+    }
+
+    if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_EOC) {
+        if (opj_stream_read_data(p_stream, l_data, 2, p_manager) != 2) {
+            opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
+            return OPJ_FALSE;
+        }
+
+        opj_read_bytes(l_data, &l_current_marker, 2);
+
+        if (l_current_marker == J2K_MS_EOC) {
+            p_j2k->m_current_tile_number = 0;
+            p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_EOC;
+        } else if (l_current_marker != J2K_MS_SOT) {
+            if (opj_stream_get_number_byte_left(p_stream) == 0) {
+                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_NEOC;
+                opj_event_msg(p_manager, EVT_WARNING, "Stream does not end with EOC\n");
                 return OPJ_TRUE;
+            }
+            opj_event_msg(p_manager, EVT_ERROR, "Stream too short, expected SOT\n");
+            return OPJ_FALSE;
         }
+    }
 
-        /* ----- */
-        /* Check if the positions provided by the user are correct */
+    return OPJ_TRUE;
+}
 
-        /* Left */
-        assert(p_start_x >= 0 );
-        assert(p_start_y >= 0 );
+static OPJ_BOOL opj_j2k_update_image_data(opj_tcd_t * p_tcd, OPJ_BYTE * p_data,
+        opj_image_t* p_output_image)
+{
+    OPJ_UINT32 i, j, k = 0;
+    OPJ_UINT32 l_width_src, l_height_src;
+    OPJ_UINT32 l_width_dest, l_height_dest;
+    OPJ_INT32 l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src;
+    OPJ_SIZE_T l_start_offset_src, l_line_offset_src, l_end_offset_src ;
+    OPJ_UINT32 l_start_x_dest, l_start_y_dest;
+    OPJ_UINT32 l_x0_dest, l_y0_dest, l_x1_dest, l_y1_dest;
+    OPJ_SIZE_T l_start_offset_dest, l_line_offset_dest;
 
-        if ((OPJ_UINT32)p_start_x > l_image->x1 ) {
-                opj_event_msg(p_manager, EVT_ERROR,
-                        "Left position of the decoded area (region_x0=%d) is outside the image area (Xsiz=%d).\n",
-                        p_start_x, l_image->x1);
+    opj_image_comp_t * l_img_comp_src = 00;
+    opj_image_comp_t * l_img_comp_dest = 00;
+
+    opj_tcd_tilecomp_t * l_tilec = 00;
+    opj_image_t * l_image_src = 00;
+    OPJ_UINT32 l_size_comp, l_remaining;
+    OPJ_INT32 * l_dest_ptr;
+    opj_tcd_resolution_t* l_res = 00;
+
+    l_tilec = p_tcd->tcd_image->tiles->comps;
+    l_image_src = p_tcd->image;
+    l_img_comp_src = l_image_src->comps;
+
+    l_img_comp_dest = p_output_image->comps;
+
+    for (i = 0; i < l_image_src->numcomps; i++) {
+
+        /* Allocate output component buffer if necessary */
+        if (!l_img_comp_dest->data) {
+            OPJ_SIZE_T l_width = l_img_comp_dest->w;
+            OPJ_SIZE_T l_height = l_img_comp_dest->h;
+
+            if ((l_height == 0U) || (l_width > (SIZE_MAX / l_height)) ||
+                    l_width * l_height > SIZE_MAX / sizeof(OPJ_INT32)) {
+                /* would overflow */
                 return OPJ_FALSE;
-        }
-        else if ((OPJ_UINT32)p_start_x < l_image->x0){
-                opj_event_msg(p_manager, EVT_WARNING,
-                                "Left position of the decoded area (region_x0=%d) is outside the image area (XOsiz=%d).\n",
-                                p_start_x, l_image->x0);
-                p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
-                p_image->x0 = l_image->x0;
-        }
-        else {
-                p_j2k->m_specific_param.m_decoder.m_start_tile_x = ((OPJ_UINT32)p_start_x - l_cp->tx0) / l_cp->tdx;
-                p_image->x0 = (OPJ_UINT32)p_start_x;
-        }
-
-        /* Up */
-        if ((OPJ_UINT32)p_start_y > l_image->y1){
-                opj_event_msg(p_manager, EVT_ERROR,
-                                "Up position of the decoded area (region_y0=%d) is outside the image area (Ysiz=%d).\n",
-                                p_start_y, l_image->y1);
+            }
+            l_img_comp_dest->data = (OPJ_INT32*) opj_image_data_alloc(l_width * l_height *
+                                    sizeof(OPJ_INT32));
+            if (! l_img_comp_dest->data) {
                 return OPJ_FALSE;
-        }
-        else if ((OPJ_UINT32)p_start_y < l_image->y0){
-                opj_event_msg(p_manager, EVT_WARNING,
-                                "Up position of the decoded area (region_y0=%d) is outside the image area (YOsiz=%d).\n",
-                                p_start_y, l_image->y0);
-                p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
-                p_image->y0 = l_image->y0;
-        }
-        else {
-                p_j2k->m_specific_param.m_decoder.m_start_tile_y = ((OPJ_UINT32)p_start_y - l_cp->ty0) / l_cp->tdy;
-                p_image->y0 = (OPJ_UINT32)p_start_y;
+            }
+            /* Do we really need this memset ? */
+            memset(l_img_comp_dest->data, 0, l_width * l_height * sizeof(OPJ_INT32));
         }
 
-        /* Right */
-        assert((OPJ_UINT32)p_end_x > 0);
-        assert((OPJ_UINT32)p_end_y > 0);
-        if ((OPJ_UINT32)p_end_x < l_image->x0) {
-                opj_event_msg(p_manager, EVT_ERROR,
-                        "Right position of the decoded area (region_x1=%d) is outside the image area (XOsiz=%d).\n",
-                        p_end_x, l_image->x0);
-                return OPJ_FALSE;
-        }
-        else if ((OPJ_UINT32)p_end_x > l_image->x1) {
-                opj_event_msg(p_manager, EVT_WARNING,
-                        "Right position of the decoded area (region_x1=%d) is outside the image area (Xsiz=%d).\n",
-                        p_end_x, l_image->x1);
-                p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
-                p_image->x1 = l_image->x1;
-        }
-        else {
-                p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv(p_end_x - (OPJ_INT32)l_cp->tx0, (OPJ_INT32)l_cp->tdx);
-                p_image->x1 = (OPJ_UINT32)p_end_x;
+        /* Copy info from decoded comp image to output image */
+        l_img_comp_dest->resno_decoded = l_img_comp_src->resno_decoded;
+
+        /*-----*/
+        /* Compute the precision of the output buffer */
+        l_size_comp = l_img_comp_src->prec >> 3; /*(/ 8)*/
+        l_remaining = l_img_comp_src->prec & 7;  /* (%8) */
+        l_res = l_tilec->resolutions + l_img_comp_src->resno_decoded;
+
+        if (l_remaining) {
+            ++l_size_comp;
         }
 
-        /* Bottom */
-        if ((OPJ_UINT32)p_end_y < l_image->y0) {
-                opj_event_msg(p_manager, EVT_ERROR,
-                        "Bottom position of the decoded area (region_y1=%d) is outside the image area (YOsiz=%d).\n",
-                        p_end_y, l_image->y0);
-                return OPJ_FALSE;
+        if (l_size_comp == 3) {
+            l_size_comp = 4;
         }
-        if ((OPJ_UINT32)p_end_y > l_image->y1){
-                opj_event_msg(p_manager, EVT_WARNING,
-                        "Bottom position of the decoded area (region_y1=%d) is outside the image area (Ysiz=%d).\n",
-                        p_end_y, l_image->y1);
-                p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
-                p_image->y1 = l_image->y1;
+        /*-----*/
+
+        /* Current tile component size*/
+        /*if (i == 0) {
+        fprintf(stdout, "SRC: l_res_x0=%d, l_res_x1=%d, l_res_y0=%d, l_res_y1=%d\n",
+                        l_res->x0, l_res->x1, l_res->y0, l_res->y1);
+        }*/
+
+        l_width_src = (OPJ_UINT32)(l_res->x1 - l_res->x0);
+        l_height_src = (OPJ_UINT32)(l_res->y1 - l_res->y0);
+
+        /* Border of the current output component*/
+        l_x0_dest = opj_uint_ceildivpow2(l_img_comp_dest->x0, l_img_comp_dest->factor);
+        l_y0_dest = opj_uint_ceildivpow2(l_img_comp_dest->y0, l_img_comp_dest->factor);
+        l_x1_dest = l_x0_dest +
+                    l_img_comp_dest->w; /* can't overflow given that image->x1 is uint32 */
+        l_y1_dest = l_y0_dest + l_img_comp_dest->h;
+
+        /*if (i == 0) {
+        fprintf(stdout, "DEST: l_x0_dest=%d, l_x1_dest=%d, l_y0_dest=%d, l_y1_dest=%d (%d)\n",
+                        l_x0_dest, l_x1_dest, l_y0_dest, l_y1_dest, l_img_comp_dest->factor );
+        }*/
+
+        /*-----*/
+        /* Compute the area (l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src)
+         * of the input buffer (decoded tile component) which will be move
+         * in the output buffer. Compute the area of the output buffer (l_start_x_dest,
+         * l_start_y_dest, l_width_dest, l_height_dest)  which will be modified
+         * by this input area.
+         * */
+        assert(l_res->x0 >= 0);
+        assert(l_res->x1 >= 0);
+
+        /* Prevent bad casting to unsigned values in the subsequent lines. */
+        if ( l_res->x0 < 0 || l_res->x1 < 0 || l_res->y0 < 0 || l_res->y1 < 0 ) {
+            return OPJ_FALSE;
         }
-        else{
-                p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv(p_end_y - (OPJ_INT32)l_cp->ty0, (OPJ_INT32)l_cp->tdy);
-                p_image->y1 = (OPJ_UINT32)p_end_y;
+
+        if (l_x0_dest < (OPJ_UINT32)l_res->x0) {
+            l_start_x_dest = (OPJ_UINT32)l_res->x0 - l_x0_dest;
+            l_offset_x0_src = 0;
+
+            if (l_x1_dest >= (OPJ_UINT32)l_res->x1) {
+                l_width_dest = l_width_src;
+                l_offset_x1_src = 0;
+            } else {
+                l_width_dest = l_x1_dest - (OPJ_UINT32)l_res->x0 ;
+                l_offset_x1_src = (OPJ_INT32)(l_width_src - l_width_dest);
+            }
+        } else {
+            l_start_x_dest = 0U;
+            l_offset_x0_src = (OPJ_INT32)l_x0_dest - l_res->x0;
+
+            if (l_x1_dest >= (OPJ_UINT32)l_res->x1) {
+                l_width_dest = l_width_src - (OPJ_UINT32)l_offset_x0_src;
+                l_offset_x1_src = 0;
+            } else {
+                l_width_dest = l_img_comp_dest->w ;
+                l_offset_x1_src = l_res->x1 - (OPJ_INT32)l_x1_dest;
+            }
         }
-        /* ----- */
 
-        p_j2k->m_specific_param.m_decoder.m_discard_tiles = 1;
+        if (l_y0_dest < (OPJ_UINT32)l_res->y0) {
+            l_start_y_dest = (OPJ_UINT32)l_res->y0 - l_y0_dest;
+            l_offset_y0_src = 0;
 
-        l_img_comp = p_image->comps;
-        for (it_comp=0; it_comp < p_image->numcomps; ++it_comp)
-        {
-                OPJ_INT32 l_h,l_w;
+            if (l_y1_dest >= (OPJ_UINT32)l_res->y1) {
+                l_height_dest = l_height_src;
+                l_offset_y1_src = 0;
+            } else {
+                l_height_dest = l_y1_dest - (OPJ_UINT32)l_res->y0 ;
+                l_offset_y1_src = (OPJ_INT32)(l_height_src - l_height_dest);
+            }
+        } else {
+            l_start_y_dest = 0U;
+            l_offset_y0_src = (OPJ_INT32)l_y0_dest - l_res->y0;
 
-                l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
-                l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
-                l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
-                l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
+            if (l_y1_dest >= (OPJ_UINT32)l_res->y1) {
+                l_height_dest = l_height_src - (OPJ_UINT32)l_offset_y0_src;
+                l_offset_y1_src = 0;
+            } else {
+                l_height_dest = l_img_comp_dest->h ;
+                l_offset_y1_src = l_res->y1 - (OPJ_INT32)l_y1_dest;
+            }
+        }
 
-                l_w = opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor)
-                                - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor);
-                if (l_w < 0){
-                        opj_event_msg(p_manager, EVT_ERROR,
-                                "Size x of the decoded component image is incorrect (comp[%d].w=%d).\n",
-                                it_comp, l_w);
-                        return OPJ_FALSE;
+        if ((l_offset_x0_src < 0) || (l_offset_y0_src < 0) || (l_offset_x1_src < 0) ||
+                (l_offset_y1_src < 0)) {
+            return OPJ_FALSE;
+        }
+        /* testcase 2977.pdf.asan.67.2198 */
+        if ((OPJ_INT32)l_width_dest < 0 || (OPJ_INT32)l_height_dest < 0) {
+            return OPJ_FALSE;
+        }
+        /*-----*/
+
+        /* Compute the input buffer offset */
+        l_start_offset_src = (OPJ_SIZE_T)l_offset_x0_src + (OPJ_SIZE_T)l_offset_y0_src
+                             * (OPJ_SIZE_T)l_width_src;
+        l_line_offset_src  = (OPJ_SIZE_T)l_offset_x1_src + (OPJ_SIZE_T)l_offset_x0_src;
+        l_end_offset_src   = (OPJ_SIZE_T)l_offset_y1_src * (OPJ_SIZE_T)l_width_src -
+                             (OPJ_SIZE_T)l_offset_x0_src;
+
+        /* Compute the output buffer offset */
+        l_start_offset_dest = (OPJ_SIZE_T)l_start_x_dest + (OPJ_SIZE_T)l_start_y_dest
+                              * (OPJ_SIZE_T)l_img_comp_dest->w;
+        l_line_offset_dest  = (OPJ_SIZE_T)l_img_comp_dest->w - (OPJ_SIZE_T)l_width_dest;
+
+        /* Move the output buffer to the first place where we will write*/
+        l_dest_ptr = l_img_comp_dest->data + l_start_offset_dest;
+
+        /*if (i == 0) {
+                fprintf(stdout, "COMPO[%d]:\n",i);
+                fprintf(stdout, "SRC: l_start_x_src=%d, l_start_y_src=%d, l_width_src=%d, l_height_src=%d\n"
+                                "\t tile offset:%d, %d, %d, %d\n"
+                                "\t buffer offset: %d; %d, %d\n",
+                                l_res->x0, l_res->y0, l_width_src, l_height_src,
+                                l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src,
+                                l_start_offset_src, l_line_offset_src, l_end_offset_src);
+
+                fprintf(stdout, "DEST: l_start_x_dest=%d, l_start_y_dest=%d, l_width_dest=%d, l_height_dest=%d\n"
+                                "\t start offset: %d, line offset= %d\n",
+                                l_start_x_dest, l_start_y_dest, l_width_dest, l_height_dest, l_start_offset_dest, l_line_offset_dest);
+        }*/
+
+        switch (l_size_comp) {
+        case 1: {
+            OPJ_CHAR * l_src_ptr = (OPJ_CHAR*) p_data;
+            l_src_ptr += l_start_offset_src; /* Move to the first place where we will read*/
+
+            if (l_img_comp_src->sgnd) {
+                for (j = 0 ; j < l_height_dest ; ++j) {
+                    for (k = 0 ; k < l_width_dest ; ++k) {
+                        *(l_dest_ptr++) = (OPJ_INT32)(*
+                                                      (l_src_ptr++));  /* Copy only the data needed for the output image */
+                    }
+
+                    l_dest_ptr +=
+                        l_line_offset_dest; /* Move to the next place where we will write */
+                    l_src_ptr += l_line_offset_src ; /* Move to the next place where we will read */
                 }
-                l_img_comp->w = (OPJ_UINT32)l_w;
+            } else {
+                for (j = 0 ; j < l_height_dest ; ++j) {
+                    for (k = 0 ; k < l_width_dest ; ++k) {
+                        *(l_dest_ptr++) = (OPJ_INT32)((*(l_src_ptr++)) & 0xff);
+                    }
 
-                l_h = opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor)
-                                - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor);
-                if (l_h < 0){
-                        opj_event_msg(p_manager, EVT_ERROR,
-                                "Size y of the decoded component image is incorrect (comp[%d].h=%d).\n",
-                                it_comp, l_h);
-                        return OPJ_FALSE;
+                    l_dest_ptr += l_line_offset_dest;
+                    l_src_ptr += l_line_offset_src;
                 }
-                l_img_comp->h = (OPJ_UINT32)l_h;
+            }
 
-                l_img_comp++;
+            l_src_ptr +=
+                l_end_offset_src; /* Move to the end of this component-part of the input buffer */
+            p_data = (OPJ_BYTE*)
+                     l_src_ptr; /* Keep the current position for the next component-part */
+        }
+        break;
+        case 2: {
+            OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_data;
+            l_src_ptr += l_start_offset_src;
+
+            if (l_img_comp_src->sgnd) {
+                for (j = 0; j < l_height_dest; ++j) {
+                    for (k = 0; k < l_width_dest; ++k) {
+                        OPJ_INT16 val;
+                        memcpy(&val, l_src_ptr, sizeof(val));
+                        l_src_ptr ++;
+                        *(l_dest_ptr++) = val;
+                    }
+
+                    l_dest_ptr += l_line_offset_dest;
+                    l_src_ptr += l_line_offset_src ;
+                }
+            } else {
+                for (j = 0; j < l_height_dest; ++j) {
+                    for (k = 0; k < l_width_dest; ++k) {
+                        OPJ_INT16 val;
+                        memcpy(&val, l_src_ptr, sizeof(val));
+                        l_src_ptr ++;
+                        *(l_dest_ptr++) = val & 0xffff;
+                    }
+
+                    l_dest_ptr += l_line_offset_dest;
+                    l_src_ptr += l_line_offset_src ;
+                }
+            }
+
+            l_src_ptr += l_end_offset_src;
+            p_data = (OPJ_BYTE*) l_src_ptr;
+        }
+        break;
+        case 4: {
+            OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_data;
+            l_src_ptr += l_start_offset_src;
+
+            for (j = 0; j < l_height_dest; ++j) {
+                memcpy(l_dest_ptr, l_src_ptr, l_width_dest * sizeof(OPJ_INT32));
+                l_dest_ptr += l_width_dest + l_line_offset_dest;
+                l_src_ptr += l_width_dest + l_line_offset_src ;
+            }
+
+            l_src_ptr += l_end_offset_src;
+            p_data = (OPJ_BYTE*) l_src_ptr;
+        }
+        break;
         }
 
-        opj_event_msg( p_manager, EVT_INFO,"Setting decoding area to %d,%d,%d,%d\n",
-                        p_image->x0, p_image->y0, p_image->x1, p_image->y1);
+        ++l_img_comp_dest;
+        ++l_img_comp_src;
+        ++l_tilec;
+    }
+
+    return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_j2k_set_decode_area(opj_j2k_t *p_j2k,
+                                 opj_image_t* p_image,
+                                 OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+                                 OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
+                                 opj_event_mgr_t * p_manager)
+{
+    opj_cp_t * l_cp = &(p_j2k->m_cp);
+    opj_image_t * l_image = p_j2k->m_private_image;
+
+    OPJ_UINT32 it_comp;
+    OPJ_INT32 l_comp_x1, l_comp_y1;
+    opj_image_comp_t* l_img_comp = NULL;
+
+    /* Check if we are read the main header */
+    if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Need to decode the main header before begin to decode the remaining codestream");
+        return OPJ_FALSE;
+    }
+
+    if (!p_start_x && !p_start_y && !p_end_x && !p_end_y) {
+        opj_event_msg(p_manager, EVT_INFO,
+                      "No decoded area parameters, set the decoded area to the whole image\n");
+
+        p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
+        p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
+        p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
+        p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
 
         return OPJ_TRUE;
+    }
+
+    /* ----- */
+    /* Check if the positions provided by the user are correct */
+
+    /* Left */
+    if (p_start_x < 0) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Left position of the decoded area (region_x0=%d) should be >= 0.\n",
+                      p_start_x);
+        return OPJ_FALSE;
+    } else if ((OPJ_UINT32)p_start_x > l_image->x1) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Left position of the decoded area (region_x0=%d) is outside the image area (Xsiz=%d).\n",
+                      p_start_x, l_image->x1);
+        return OPJ_FALSE;
+    } else if ((OPJ_UINT32)p_start_x < l_image->x0) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "Left position of the decoded area (region_x0=%d) is outside the image area (XOsiz=%d).\n",
+                      p_start_x, l_image->x0);
+        p_j2k->m_specific_param.m_decoder.m_start_tile_x = 0;
+        p_image->x0 = l_image->x0;
+    } else {
+        p_j2k->m_specific_param.m_decoder.m_start_tile_x = ((OPJ_UINT32)p_start_x -
+                l_cp->tx0) / l_cp->tdx;
+        p_image->x0 = (OPJ_UINT32)p_start_x;
+    }
+
+    /* Up */
+    if (p_start_x < 0) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Up position of the decoded area (region_y0=%d) should be >= 0.\n",
+                      p_start_y);
+        return OPJ_FALSE;
+    } else if ((OPJ_UINT32)p_start_y > l_image->y1) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Up position of the decoded area (region_y0=%d) is outside the image area (Ysiz=%d).\n",
+                      p_start_y, l_image->y1);
+        return OPJ_FALSE;
+    } else if ((OPJ_UINT32)p_start_y < l_image->y0) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "Up position of the decoded area (region_y0=%d) is outside the image area (YOsiz=%d).\n",
+                      p_start_y, l_image->y0);
+        p_j2k->m_specific_param.m_decoder.m_start_tile_y = 0;
+        p_image->y0 = l_image->y0;
+    } else {
+        p_j2k->m_specific_param.m_decoder.m_start_tile_y = ((OPJ_UINT32)p_start_y -
+                l_cp->ty0) / l_cp->tdy;
+        p_image->y0 = (OPJ_UINT32)p_start_y;
+    }
+
+    /* Right */
+    if (p_end_x <= 0) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Right position of the decoded area (region_x1=%d) should be > 0.\n",
+                      p_end_x);
+        return OPJ_FALSE;
+    } else if ((OPJ_UINT32)p_end_x < l_image->x0) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Right position of the decoded area (region_x1=%d) is outside the image area (XOsiz=%d).\n",
+                      p_end_x, l_image->x0);
+        return OPJ_FALSE;
+    } else if ((OPJ_UINT32)p_end_x > l_image->x1) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "Right position of the decoded area (region_x1=%d) is outside the image area (Xsiz=%d).\n",
+                      p_end_x, l_image->x1);
+        p_j2k->m_specific_param.m_decoder.m_end_tile_x = l_cp->tw;
+        p_image->x1 = l_image->x1;
+    } else {
+        p_j2k->m_specific_param.m_decoder.m_end_tile_x = (OPJ_UINT32)opj_int_ceildiv(
+                    p_end_x - (OPJ_INT32)l_cp->tx0, (OPJ_INT32)l_cp->tdx);
+        p_image->x1 = (OPJ_UINT32)p_end_x;
+    }
+
+    /* Bottom */
+    if (p_end_y <= 0) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Bottom position of the decoded area (region_y1=%d) should be > 0.\n",
+                      p_end_y);
+        return OPJ_FALSE;
+    } else if ((OPJ_UINT32)p_end_y < l_image->y0) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Bottom position of the decoded area (region_y1=%d) is outside the image area (YOsiz=%d).\n",
+                      p_end_y, l_image->y0);
+        return OPJ_FALSE;
+    }
+    if ((OPJ_UINT32)p_end_y > l_image->y1) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "Bottom position of the decoded area (region_y1=%d) is outside the image area (Ysiz=%d).\n",
+                      p_end_y, l_image->y1);
+        p_j2k->m_specific_param.m_decoder.m_end_tile_y = l_cp->th;
+        p_image->y1 = l_image->y1;
+    } else {
+        p_j2k->m_specific_param.m_decoder.m_end_tile_y = (OPJ_UINT32)opj_int_ceildiv(
+                    p_end_y - (OPJ_INT32)l_cp->ty0, (OPJ_INT32)l_cp->tdy);
+        p_image->y1 = (OPJ_UINT32)p_end_y;
+    }
+    /* ----- */
+
+    p_j2k->m_specific_param.m_decoder.m_discard_tiles = 1;
+
+    l_img_comp = p_image->comps;
+    for (it_comp = 0; it_comp < p_image->numcomps; ++it_comp) {
+        OPJ_INT32 l_h, l_w;
+
+        l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
+        l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
+        l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
+        l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
+
+        l_w = opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor)
+              - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor);
+        if (l_w < 0) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Size x of the decoded component image is incorrect (comp[%d].w=%d).\n",
+                          it_comp, l_w);
+            return OPJ_FALSE;
+        }
+        l_img_comp->w = (OPJ_UINT32)l_w;
+
+        l_h = opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor)
+              - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor);
+        if (l_h < 0) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Size y of the decoded component image is incorrect (comp[%d].h=%d).\n",
+                          it_comp, l_h);
+            return OPJ_FALSE;
+        }
+        l_img_comp->h = (OPJ_UINT32)l_h;
+
+        l_img_comp++;
+    }
+
+    opj_event_msg(p_manager, EVT_INFO, "Setting decoding area to %d,%d,%d,%d\n",
+                  p_image->x0, p_image->y0, p_image->x1, p_image->y1);
+
+    return OPJ_TRUE;
 }
 
 opj_j2k_t* opj_j2k_create_decompress(void)
 {
-        opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1,sizeof(opj_j2k_t));
-        if (!l_j2k) {
-                return 00;
-        }
+    opj_j2k_t *l_j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
+    if (!l_j2k) {
+        return 00;
+    }
 
-        l_j2k->m_is_decoder = 1;
-        l_j2k->m_cp.m_is_decoder = 1;
+    l_j2k->m_is_decoder = 1;
+    l_j2k->m_cp.m_is_decoder = 1;
+    /* in the absence of JP2 boxes, consider different bit depth / sign */
+    /* per component is allowed */
+    l_j2k->m_cp.allow_different_bit_depth_sign = 1;
 
 #ifdef OPJ_DISABLE_TPSOT_FIX
-        l_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
+    l_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1;
 #endif
 
-        l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_calloc(1,sizeof(opj_tcp_t));
-        if (!l_j2k->m_specific_param.m_decoder.m_default_tcp) {
-                opj_j2k_destroy(l_j2k);
-                return 00;
-        }
+    l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_calloc(1,
+            sizeof(opj_tcp_t));
+    if (!l_j2k->m_specific_param.m_decoder.m_default_tcp) {
+        opj_j2k_destroy(l_j2k);
+        return 00;
+    }
 
-        l_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE *) opj_calloc(1,OPJ_J2K_DEFAULT_HEADER_SIZE);
-        if (! l_j2k->m_specific_param.m_decoder.m_header_data) {
-                opj_j2k_destroy(l_j2k);
-                return 00;
-        }
+    l_j2k->m_specific_param.m_decoder.m_header_data = (OPJ_BYTE *) opj_calloc(1,
+            OPJ_J2K_DEFAULT_HEADER_SIZE);
+    if (! l_j2k->m_specific_param.m_decoder.m_header_data) {
+        opj_j2k_destroy(l_j2k);
+        return 00;
+    }
 
-        l_j2k->m_specific_param.m_decoder.m_header_data_size = OPJ_J2K_DEFAULT_HEADER_SIZE;
+    l_j2k->m_specific_param.m_decoder.m_header_data_size =
+        OPJ_J2K_DEFAULT_HEADER_SIZE;
 
-        l_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = -1 ;
+    l_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = -1 ;
 
-        l_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = 0 ;
+    l_j2k->m_specific_param.m_decoder.m_last_sot_read_pos = 0 ;
 
-        /* codestream index creation */
-        l_j2k->cstr_index = opj_j2k_create_cstr_index();
-        if (!l_j2k->cstr_index){
-                opj_j2k_destroy(l_j2k);
-                return 00;
-        }
+    /* codestream index creation */
+    l_j2k->cstr_index = opj_j2k_create_cstr_index();
+    if (!l_j2k->cstr_index) {
+        opj_j2k_destroy(l_j2k);
+        return 00;
+    }
 
-        /* validation list creation */
-        l_j2k->m_validation_list = opj_procedure_list_create();
-        if (! l_j2k->m_validation_list) {
-                opj_j2k_destroy(l_j2k);
-                return 00;
-        }
+    /* validation list creation */
+    l_j2k->m_validation_list = opj_procedure_list_create();
+    if (! l_j2k->m_validation_list) {
+        opj_j2k_destroy(l_j2k);
+        return 00;
+    }
 
-        /* execution list creation */
-        l_j2k->m_procedure_list = opj_procedure_list_create();
-        if (! l_j2k->m_procedure_list) {
-                opj_j2k_destroy(l_j2k);
-                return 00;
-        }
+    /* execution list creation */
+    l_j2k->m_procedure_list = opj_procedure_list_create();
+    if (! l_j2k->m_procedure_list) {
+        opj_j2k_destroy(l_j2k);
+        return 00;
+    }
 
-        return l_j2k;
+    l_j2k->m_tp = opj_thread_pool_create(opj_j2k_get_default_thread_count());
+    if (!l_j2k->m_tp) {
+        l_j2k->m_tp = opj_thread_pool_create(0);
+    }
+    if (!l_j2k->m_tp) {
+        opj_j2k_destroy(l_j2k);
+        return NULL;
+    }
+
+    return l_j2k;
 }
 
 static opj_codestream_index_t* opj_j2k_create_cstr_index(void)
 {
-        opj_codestream_index_t* cstr_index = (opj_codestream_index_t*)
-                        opj_calloc(1,sizeof(opj_codestream_index_t));
-        if (!cstr_index)
-                return NULL;
+    opj_codestream_index_t* cstr_index = (opj_codestream_index_t*)
+                                         opj_calloc(1, sizeof(opj_codestream_index_t));
+    if (!cstr_index) {
+        return NULL;
+    }
 
-        cstr_index->maxmarknum = 100;
-        cstr_index->marknum = 0;
-        cstr_index->marker = (opj_marker_info_t*)
-                        opj_calloc(cstr_index->maxmarknum, sizeof(opj_marker_info_t));
-        if (!cstr_index-> marker) {
-                opj_free(cstr_index);
-                return NULL;
-        }
+    cstr_index->maxmarknum = 100;
+    cstr_index->marknum = 0;
+    cstr_index->marker = (opj_marker_info_t*)
+                         opj_calloc(cstr_index->maxmarknum, sizeof(opj_marker_info_t));
+    if (!cstr_index-> marker) {
+        opj_free(cstr_index);
+        return NULL;
+    }
 
-        cstr_index->tile_index = NULL;
+    cstr_index->tile_index = NULL;
 
-        return cstr_index;
+    return cstr_index;
 }
 
-static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size (       opj_j2k_t *p_j2k,
-                                                                                OPJ_UINT32 p_tile_no,
-                                                                                OPJ_UINT32 p_comp_no )
+static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size(opj_j2k_t *p_j2k,
+        OPJ_UINT32 p_tile_no,
+        OPJ_UINT32 p_comp_no)
 {
-        opj_cp_t *l_cp = 00;
-        opj_tcp_t *l_tcp = 00;
-        opj_tccp_t *l_tccp = 00;
+    opj_cp_t *l_cp = 00;
+    opj_tcp_t *l_tcp = 00;
+    opj_tccp_t *l_tccp = 00;
 
-        /* preconditions */
-        assert(p_j2k != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
 
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = &l_cp->tcps[p_tile_no];
-        l_tccp = &l_tcp->tccps[p_comp_no];
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = &l_cp->tcps[p_tile_no];
+    l_tccp = &l_tcp->tccps[p_comp_no];
 
-        /* preconditions again */
-        assert(p_tile_no < (l_cp->tw * l_cp->th));
-        assert(p_comp_no < p_j2k->m_private_image->numcomps);
+    /* preconditions again */
+    assert(p_tile_no < (l_cp->tw * l_cp->th));
+    assert(p_comp_no < p_j2k->m_private_image->numcomps);
 
-        if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
-                return 5 + l_tccp->numresolutions;
-        }
-        else {
-                return 5;
-        }
+    if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
+        return 5 + l_tccp->numresolutions;
+    } else {
+        return 5;
+    }
 }
 
-static OPJ_BOOL opj_j2k_write_SPCod_SPCoc(     opj_j2k_t *p_j2k,
-                                                                    OPJ_UINT32 p_tile_no,
-                                                                    OPJ_UINT32 p_comp_no,
-                                                                    OPJ_BYTE * p_data,
-                                                                    OPJ_UINT32 * p_header_size,
-                                                                    struct opj_event_mgr * p_manager )
+static OPJ_BOOL opj_j2k_compare_SPCod_SPCoc(opj_j2k_t *p_j2k,
+        OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
 {
-        OPJ_UINT32 i;
-        opj_cp_t *l_cp = 00;
-        opj_tcp_t *l_tcp = 00;
-        opj_tccp_t *l_tccp = 00;
+    OPJ_UINT32 i;
+    opj_cp_t *l_cp = NULL;
+    opj_tcp_t *l_tcp = NULL;
+    opj_tccp_t *l_tccp0 = NULL;
+    opj_tccp_t *l_tccp1 = NULL;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_header_size != 00);
-        assert(p_manager != 00);
-        assert(p_data != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
 
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = &l_cp->tcps[p_tile_no];
-        l_tccp = &l_tcp->tccps[p_comp_no];
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = &l_cp->tcps[p_tile_no];
+    l_tccp0 = &l_tcp->tccps[p_first_comp_no];
+    l_tccp1 = &l_tcp->tccps[p_second_comp_no];
 
-        /* preconditions again */
-        assert(p_tile_no < (l_cp->tw * l_cp->th));
-        assert(p_comp_no <(p_j2k->m_private_image->numcomps));
+    if (l_tccp0->numresolutions != l_tccp1->numresolutions) {
+        return OPJ_FALSE;
+    }
+    if (l_tccp0->cblkw != l_tccp1->cblkw) {
+        return OPJ_FALSE;
+    }
+    if (l_tccp0->cblkh != l_tccp1->cblkh) {
+        return OPJ_FALSE;
+    }
+    if (l_tccp0->cblksty != l_tccp1->cblksty) {
+        return OPJ_FALSE;
+    }
+    if (l_tccp0->qmfbid != l_tccp1->qmfbid) {
+        return OPJ_FALSE;
+    }
+    if ((l_tccp0->csty & J2K_CCP_CSTY_PRT) != (l_tccp1->csty & J2K_CCP_CSTY_PRT)) {
+        return OPJ_FALSE;
+    }
 
-        if (*p_header_size < 5) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
-                return OPJ_FALSE;
+    for (i = 0U; i < l_tccp0->numresolutions; ++i) {
+        if (l_tccp0->prcw[i] != l_tccp1->prcw[i]) {
+            return OPJ_FALSE;
         }
-
-        opj_write_bytes(p_data,l_tccp->numresolutions - 1, 1);  /* SPcoc (D) */
-        ++p_data;
-
-        opj_write_bytes(p_data,l_tccp->cblkw - 2, 1);                   /* SPcoc (E) */
-        ++p_data;
-
-        opj_write_bytes(p_data,l_tccp->cblkh - 2, 1);                   /* SPcoc (F) */
-        ++p_data;
-
-        opj_write_bytes(p_data,l_tccp->cblksty, 1);                             /* SPcoc (G) */
-        ++p_data;
-
-        opj_write_bytes(p_data,l_tccp->qmfbid, 1);                              /* SPcoc (H) */
-        ++p_data;
-
-        *p_header_size = *p_header_size - 5;
-
-        if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
-
-                if (*p_header_size < l_tccp->numresolutions) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
-                        return OPJ_FALSE;
-                }
-
-                for (i = 0; i < l_tccp->numresolutions; ++i) {
-                        opj_write_bytes(p_data,l_tccp->prcw[i] + (l_tccp->prch[i] << 4), 1);    /* SPcoc (I_i) */
-                        ++p_data;
-                }
-
-                *p_header_size = *p_header_size - l_tccp->numresolutions;
+        if (l_tccp0->prch[i] != l_tccp1->prch[i]) {
+            return OPJ_FALSE;
         }
-
-        return OPJ_TRUE;
+    }
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(  opj_j2k_t *p_j2k,
-                                                                OPJ_UINT32 compno,
-                                                                OPJ_BYTE * p_header_data,
-                                                                OPJ_UINT32 * p_header_size,
-                                                                opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_j2k_write_SPCod_SPCoc(opj_j2k_t *p_j2k,
+        OPJ_UINT32 p_tile_no,
+        OPJ_UINT32 p_comp_no,
+        OPJ_BYTE * p_data,
+        OPJ_UINT32 * p_header_size,
+        struct opj_event_mgr * p_manager)
 {
-        OPJ_UINT32 i, l_tmp;
-        opj_cp_t *l_cp = NULL;
-        opj_tcp_t *l_tcp = NULL;
-        opj_tccp_t *l_tccp = NULL;
-        OPJ_BYTE * l_current_ptr = NULL;
+    OPJ_UINT32 i;
+    opj_cp_t *l_cp = 00;
+    opj_tcp_t *l_tcp = 00;
+    opj_tccp_t *l_tccp = 00;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_header_data != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_header_size != 00);
+    assert(p_manager != 00);
+    assert(p_data != 00);
 
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
-                                &l_cp->tcps[p_j2k->m_current_tile_number] :
-                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = &l_cp->tcps[p_tile_no];
+    l_tccp = &l_tcp->tccps[p_comp_no];
 
-        /* precondition again */
-        if (compno >= p_j2k->m_private_image->numcomps) {
-                return OPJ_FALSE;
-        }
+    /* preconditions again */
+    assert(p_tile_no < (l_cp->tw * l_cp->th));
+    assert(p_comp_no < (p_j2k->m_private_image->numcomps));
 
-        l_tccp = &l_tcp->tccps[compno];
-        l_current_ptr = p_header_data;
+    if (*p_header_size < 5) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
+        return OPJ_FALSE;
+    }
 
-        /* make sure room is sufficient */
-        if (*p_header_size < 5) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
-                return OPJ_FALSE;
-        }
+    opj_write_bytes(p_data, l_tccp->numresolutions - 1, 1); /* SPcoc (D) */
+    ++p_data;
 
-        opj_read_bytes(l_current_ptr, &l_tccp->numresolutions ,1);              /* SPcox (D) */
-        ++l_tccp->numresolutions;                                                                               /* tccp->numresolutions = read() + 1 */
-        if (l_tccp->numresolutions > OPJ_J2K_MAXRLVLS) {
-                opj_event_msg(p_manager, EVT_ERROR,
-                              "Invalid value for numresolutions : %d, max value is set in openjpeg.h at %d\n",
-                              l_tccp->numresolutions, OPJ_J2K_MAXRLVLS);
-                return OPJ_FALSE;
-        }
-        ++l_current_ptr;
+    opj_write_bytes(p_data, l_tccp->cblkw - 2, 1);                  /* SPcoc (E) */
+    ++p_data;
 
-        /* If user wants to remove more resolutions than the codestream contains, return error */
-        if (l_cp->m_specific_param.m_dec.m_reduce >= l_tccp->numresolutions) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error decoding component %d.\nThe number of resolutions to remove is higher than the number "
-                                        "of resolutions of this component\nModify the cp_reduce parameter.\n\n", compno);
-                p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;/* FIXME J2K_DEC_STATE_ERR;*/
-                return OPJ_FALSE;
-        }
+    opj_write_bytes(p_data, l_tccp->cblkh - 2, 1);                  /* SPcoc (F) */
+    ++p_data;
 
-        opj_read_bytes(l_current_ptr,&l_tccp->cblkw ,1);                /* SPcoc (E) */
-        ++l_current_ptr;
-        l_tccp->cblkw += 2;
+    opj_write_bytes(p_data, l_tccp->cblksty,
+                    1);                            /* SPcoc (G) */
+    ++p_data;
 
-        opj_read_bytes(l_current_ptr,&l_tccp->cblkh ,1);                /* SPcoc (F) */
-        ++l_current_ptr;
-        l_tccp->cblkh += 2;
+    opj_write_bytes(p_data, l_tccp->qmfbid,
+                    1);                             /* SPcoc (H) */
+    ++p_data;
 
-        if ((l_tccp->cblkw > 10) || (l_tccp->cblkh > 10) || ((l_tccp->cblkw + l_tccp->cblkh) > 12)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element, Invalid cblkw/cblkh combination\n");
-                return OPJ_FALSE;
-        }
-	
+    *p_header_size = *p_header_size - 5;
 
-        opj_read_bytes(l_current_ptr,&l_tccp->cblksty ,1);              /* SPcoc (G) */
-        ++l_current_ptr;
+    if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
 
-        opj_read_bytes(l_current_ptr,&l_tccp->qmfbid ,1);               /* SPcoc (H) */
-        ++l_current_ptr;
-
-        *p_header_size = *p_header_size - 5;
-
-        /* use custom precinct size ? */
-        if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
-                if (*p_header_size < l_tccp->numresolutions) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
-                        return OPJ_FALSE;
-                }
-
-                for     (i = 0; i < l_tccp->numresolutions; ++i) {
-                        opj_read_bytes(l_current_ptr,&l_tmp ,1);                /* SPcoc (I_i) */
-                        ++l_current_ptr;
-                        /* Precinct exponent 0 is only allowed for lowest resolution level (Table A.21) */
-                        if ((i != 0) && (((l_tmp & 0xf) == 0) || ((l_tmp >> 4) == 0))) {
-                                opj_event_msg(p_manager, EVT_ERROR, "Invalid precinct size\n");
-                                return OPJ_FALSE;
-                        }
-                        l_tccp->prcw[i] = l_tmp & 0xf;
-                        l_tccp->prch[i] = l_tmp >> 4;
-                }
-
-                *p_header_size = *p_header_size - l_tccp->numresolutions;
-        }
-        else {
-                /* set default size for the precinct width and height */
-                for     (i = 0; i < l_tccp->numresolutions; ++i) {
-                        l_tccp->prcw[i] = 15;
-                        l_tccp->prch[i] = 15;
-                }
-        }
-
-#ifdef WIP_REMOVE_MSD
-        /* INDEX >> */
-        if (p_j2k->cstr_info && compno == 0) {
-                OPJ_UINT32 l_data_size = l_tccp->numresolutions * sizeof(OPJ_UINT32);
-
-                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkh = l_tccp->cblkh;
-                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkw = l_tccp->cblkw;
-                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].numresolutions = l_tccp->numresolutions;
-                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblksty = l_tccp->cblksty;
-                p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].qmfbid = l_tccp->qmfbid;
-
-                memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdx,l_tccp->prcw, l_data_size);
-                memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdy,l_tccp->prch, l_data_size);
-        }
-        /* << INDEX */
-#endif
-
-        return OPJ_TRUE;
-}
-
-static void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k )
-{
-        /* loop */
-        OPJ_UINT32 i;
-        opj_cp_t *l_cp = NULL;
-        opj_tcp_t *l_tcp = NULL;
-        opj_tccp_t *l_ref_tccp = NULL, *l_copied_tccp = NULL;
-        OPJ_UINT32 l_prc_size;
-
-        /* preconditions */
-        assert(p_j2k != 00);
-
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? /* FIXME J2K_DEC_STATE_TPH*/
-                                &l_cp->tcps[p_j2k->m_current_tile_number] :
-                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
-
-        l_ref_tccp = &l_tcp->tccps[0];
-        l_copied_tccp = l_ref_tccp + 1;
-        l_prc_size = l_ref_tccp->numresolutions * (OPJ_UINT32)sizeof(OPJ_UINT32);
-
-        for     (i=1; i<p_j2k->m_private_image->numcomps; ++i) {
-                l_copied_tccp->numresolutions = l_ref_tccp->numresolutions;
-                l_copied_tccp->cblkw = l_ref_tccp->cblkw;
-                l_copied_tccp->cblkh = l_ref_tccp->cblkh;
-                l_copied_tccp->cblksty = l_ref_tccp->cblksty;
-                l_copied_tccp->qmfbid = l_ref_tccp->qmfbid;
-                memcpy(l_copied_tccp->prcw,l_ref_tccp->prcw,l_prc_size);
-                memcpy(l_copied_tccp->prch,l_ref_tccp->prch,l_prc_size);
-                ++l_copied_tccp;
-        }
-}
-
-static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size ( opj_j2k_t *p_j2k,
-                                                                        OPJ_UINT32 p_tile_no,
-                                                                        OPJ_UINT32 p_comp_no )
-{
-        OPJ_UINT32 l_num_bands;
-
-        opj_cp_t *l_cp = 00;
-        opj_tcp_t *l_tcp = 00;
-        opj_tccp_t *l_tccp = 00;
-
-        /* preconditions */
-        assert(p_j2k != 00);
-
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = &l_cp->tcps[p_tile_no];
-        l_tccp = &l_tcp->tccps[p_comp_no];
-
-        /* preconditions again */
-        assert(p_tile_no < l_cp->tw * l_cp->th);
-        assert(p_comp_no < p_j2k->m_private_image->numcomps);
-
-        l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2);
-
-        if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
-                return 1 + l_num_bands;
-        }
-        else {
-                return 1 + 2*l_num_bands;
-        }
-}
-
-static OPJ_BOOL opj_j2k_write_SQcd_SQcc(       opj_j2k_t *p_j2k,
-                                                                OPJ_UINT32 p_tile_no,
-                                                                OPJ_UINT32 p_comp_no,
-                                                                OPJ_BYTE * p_data,
-                                                                OPJ_UINT32 * p_header_size,
-                                                                struct opj_event_mgr * p_manager )
-{
-        OPJ_UINT32 l_header_size;
-        OPJ_UINT32 l_band_no, l_num_bands;
-        OPJ_UINT32 l_expn,l_mant;
-
-        opj_cp_t *l_cp = 00;
-        opj_tcp_t *l_tcp = 00;
-        opj_tccp_t *l_tccp = 00;
-
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_header_size != 00);
-        assert(p_manager != 00);
-        assert(p_data != 00);
-
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = &l_cp->tcps[p_tile_no];
-        l_tccp = &l_tcp->tccps[p_comp_no];
-
-        /* preconditions again */
-        assert(p_tile_no < l_cp->tw * l_cp->th);
-        assert(p_comp_no <p_j2k->m_private_image->numcomps);
-
-        l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (l_tccp->numresolutions * 3 - 2);
-
-        if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
-                l_header_size = 1 + l_num_bands;
-
-                if (*p_header_size < l_header_size) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
-                        return OPJ_FALSE;
-                }
-
-                opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1);    /* Sqcx */
-                ++p_data;
-
-                for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
-                        l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
-                        opj_write_bytes(p_data, l_expn << 3, 1);        /* SPqcx_i */
-                        ++p_data;
-                }
-        }
-        else {
-                l_header_size = 1 + 2*l_num_bands;
-
-                if (*p_header_size < l_header_size) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
-                        return OPJ_FALSE;
-                }
-
-                opj_write_bytes(p_data,l_tccp->qntsty + (l_tccp->numgbits << 5), 1);    /* Sqcx */
-                ++p_data;
-
-                for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
-                        l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
-                        l_mant = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].mant;
-
-                        opj_write_bytes(p_data, (l_expn << 11) + l_mant, 2);    /* SPqcx_i */
-                        p_data += 2;
-                }
-        }
-
-        *p_header_size = *p_header_size - l_header_size;
-
-        return OPJ_TRUE;
-}
-
-static OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
-                                                            OPJ_UINT32 p_comp_no,
-                                                            OPJ_BYTE* p_header_data,
-                                                            OPJ_UINT32 * p_header_size,
-                                                            opj_event_mgr_t * p_manager
-                                                            )
-{
-        /* loop*/
-        OPJ_UINT32 l_band_no;
-        opj_cp_t *l_cp = 00;
-        opj_tcp_t *l_tcp = 00;
-        opj_tccp_t *l_tccp = 00;
-        OPJ_BYTE * l_current_ptr = 00;
-        OPJ_UINT32 l_tmp, l_num_band;
-
-        /* preconditions*/
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_header_data != 00);
-
-        l_cp = &(p_j2k->m_cp);
-        /* come from tile part header or main header ?*/
-        l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ? /*FIXME J2K_DEC_STATE_TPH*/
-                                &l_cp->tcps[p_j2k->m_current_tile_number] :
-                                p_j2k->m_specific_param.m_decoder.m_default_tcp;
-
-        /* precondition again*/
-        if (p_comp_no >=  p_j2k->m_private_image->numcomps) {
+        if (*p_header_size < l_tccp->numresolutions) {
+            opj_event_msg(p_manager, EVT_ERROR, "Error writing SPCod SPCoc element\n");
             return OPJ_FALSE;
         }
 
-        l_tccp = &l_tcp->tccps[p_comp_no];
-        l_current_ptr = p_header_data;
+        for (i = 0; i < l_tccp->numresolutions; ++i) {
+            opj_write_bytes(p_data, l_tccp->prcw[i] + (l_tccp->prch[i] << 4),
+                            1);   /* SPcoc (I_i) */
+            ++p_data;
+        }
 
-        if (*p_header_size < 1) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error reading SQcd or SQcc element\n");
+        *p_header_size = *p_header_size - l_tccp->numresolutions;
+    }
+
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_j2k_read_SPCod_SPCoc(opj_j2k_t *p_j2k,
+        OPJ_UINT32 compno,
+        OPJ_BYTE * p_header_data,
+        OPJ_UINT32 * p_header_size,
+        opj_event_mgr_t * p_manager)
+{
+    OPJ_UINT32 i, l_tmp;
+    opj_cp_t *l_cp = NULL;
+    opj_tcp_t *l_tcp = NULL;
+    opj_tccp_t *l_tccp = NULL;
+    OPJ_BYTE * l_current_ptr = NULL;
+
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_header_data != 00);
+
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH) ?
+            &l_cp->tcps[p_j2k->m_current_tile_number] :
+            p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+    /* precondition again */
+    if (compno >= p_j2k->m_private_image->numcomps) {
+        return OPJ_FALSE;
+    }
+
+    assert(compno < p_j2k->m_private_image->numcomps);
+
+    l_tccp = &l_tcp->tccps[compno];
+    l_current_ptr = p_header_data;
+
+    /* make sure room is sufficient */
+    if (*p_header_size < 5) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
+        return OPJ_FALSE;
+    }
+
+    opj_read_bytes(l_current_ptr, &l_tccp->numresolutions,
+                   1);              /* SPcox (D) */
+    ++l_tccp->numresolutions;                                                                               /* tccp->numresolutions = read() + 1 */
+    if (l_tccp->numresolutions > OPJ_J2K_MAXRLVLS) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Invalid value for numresolutions : %d, max value is set in openjpeg.h at %d\n",
+                      l_tccp->numresolutions, OPJ_J2K_MAXRLVLS);
+        return OPJ_FALSE;
+    }
+    ++l_current_ptr;
+
+    /* If user wants to remove more resolutions than the codestream contains, return error */
+    if (l_cp->m_specific_param.m_dec.m_reduce >= l_tccp->numresolutions) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Error decoding component %d.\nThe number of resolutions to remove is higher than the number "
+                      "of resolutions of this component\nModify the cp_reduce parameter.\n\n",
+                      compno);
+        p_j2k->m_specific_param.m_decoder.m_state |=
+            0x8000;/* FIXME J2K_DEC_STATE_ERR;*/
+        return OPJ_FALSE;
+    }
+
+    opj_read_bytes(l_current_ptr, &l_tccp->cblkw, 1);               /* SPcoc (E) */
+    ++l_current_ptr;
+    l_tccp->cblkw += 2;
+
+    opj_read_bytes(l_current_ptr, &l_tccp->cblkh, 1);               /* SPcoc (F) */
+    ++l_current_ptr;
+    l_tccp->cblkh += 2;
+
+    if ((l_tccp->cblkw > 10) || (l_tccp->cblkh > 10) ||
+            ((l_tccp->cblkw + l_tccp->cblkh) > 12)) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Error reading SPCod SPCoc element, Invalid cblkw/cblkh combination\n");
+        return OPJ_FALSE;
+    }
+
+
+    opj_read_bytes(l_current_ptr, &l_tccp->cblksty, 1);             /* SPcoc (G) */
+    ++l_current_ptr;
+    if (l_tccp->cblksty & 0xC0U) { /* 2 msb are reserved, assume we can't read */
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Error reading SPCod SPCoc element, Invalid code-block style found\n");
+        return OPJ_FALSE;
+    }
+
+    opj_read_bytes(l_current_ptr, &l_tccp->qmfbid, 1);              /* SPcoc (H) */
+    ++l_current_ptr;
+
+    *p_header_size = *p_header_size - 5;
+
+    /* use custom precinct size ? */
+    if (l_tccp->csty & J2K_CCP_CSTY_PRT) {
+        if (*p_header_size < l_tccp->numresolutions) {
+            opj_event_msg(p_manager, EVT_ERROR, "Error reading SPCod SPCoc element\n");
+            return OPJ_FALSE;
+        }
+
+        for (i = 0; i < l_tccp->numresolutions; ++i) {
+            opj_read_bytes(l_current_ptr, &l_tmp, 1);               /* SPcoc (I_i) */
+            ++l_current_ptr;
+            /* Precinct exponent 0 is only allowed for lowest resolution level (Table A.21) */
+            if ((i != 0) && (((l_tmp & 0xf) == 0) || ((l_tmp >> 4) == 0))) {
+                opj_event_msg(p_manager, EVT_ERROR, "Invalid precinct size\n");
                 return OPJ_FALSE;
+            }
+            l_tccp->prcw[i] = l_tmp & 0xf;
+            l_tccp->prch[i] = l_tmp >> 4;
         }
-        *p_header_size -= 1;
 
-        opj_read_bytes(l_current_ptr, &l_tmp ,1);                       /* Sqcx */
-        ++l_current_ptr;
+        *p_header_size = *p_header_size - l_tccp->numresolutions;
+    } else {
+        /* set default size for the precinct width and height */
+        for (i = 0; i < l_tccp->numresolutions; ++i) {
+            l_tccp->prcw[i] = 15;
+            l_tccp->prch[i] = 15;
+        }
+    }
 
-        l_tccp->qntsty = l_tmp & 0x1f;
-        l_tccp->numgbits = l_tmp >> 5;
-        if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
+#ifdef WIP_REMOVE_MSD
+    /* INDEX >> */
+    if (p_j2k->cstr_info && compno == 0) {
+        OPJ_UINT32 l_data_size = l_tccp->numresolutions * sizeof(OPJ_UINT32);
+
+        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkh =
+            l_tccp->cblkh;
+        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblkw =
+            l_tccp->cblkw;
+        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].numresolutions
+            = l_tccp->numresolutions;
+        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].cblksty =
+            l_tccp->cblksty;
+        p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].tccp_info[compno].qmfbid =
+            l_tccp->qmfbid;
+
+        memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdx, l_tccp->prcw,
+               l_data_size);
+        memcpy(p_j2k->cstr_info->tile[p_j2k->m_current_tile_number].pdy, l_tccp->prch,
+               l_data_size);
+    }
+    /* << INDEX */
+#endif
+
+    return OPJ_TRUE;
+}
+
+static void opj_j2k_copy_tile_component_parameters(opj_j2k_t *p_j2k)
+{
+    /* loop */
+    OPJ_UINT32 i;
+    opj_cp_t *l_cp = NULL;
+    opj_tcp_t *l_tcp = NULL;
+    opj_tccp_t *l_ref_tccp = NULL, *l_copied_tccp = NULL;
+    OPJ_UINT32 l_prc_size;
+
+    /* preconditions */
+    assert(p_j2k != 00);
+
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
+            ?
+            &l_cp->tcps[p_j2k->m_current_tile_number] :
+            p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+    l_ref_tccp = &l_tcp->tccps[0];
+    l_copied_tccp = l_ref_tccp + 1;
+    l_prc_size = l_ref_tccp->numresolutions * (OPJ_UINT32)sizeof(OPJ_UINT32);
+
+    for (i = 1; i < p_j2k->m_private_image->numcomps; ++i) {
+        l_copied_tccp->numresolutions = l_ref_tccp->numresolutions;
+        l_copied_tccp->cblkw = l_ref_tccp->cblkw;
+        l_copied_tccp->cblkh = l_ref_tccp->cblkh;
+        l_copied_tccp->cblksty = l_ref_tccp->cblksty;
+        l_copied_tccp->qmfbid = l_ref_tccp->qmfbid;
+        memcpy(l_copied_tccp->prcw, l_ref_tccp->prcw, l_prc_size);
+        memcpy(l_copied_tccp->prch, l_ref_tccp->prch, l_prc_size);
+        ++l_copied_tccp;
+    }
+}
+
+static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size(opj_j2k_t *p_j2k,
+        OPJ_UINT32 p_tile_no,
+        OPJ_UINT32 p_comp_no)
+{
+    OPJ_UINT32 l_num_bands;
+
+    opj_cp_t *l_cp = 00;
+    opj_tcp_t *l_tcp = 00;
+    opj_tccp_t *l_tccp = 00;
+
+    /* preconditions */
+    assert(p_j2k != 00);
+
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = &l_cp->tcps[p_tile_no];
+    l_tccp = &l_tcp->tccps[p_comp_no];
+
+    /* preconditions again */
+    assert(p_tile_no < l_cp->tw * l_cp->th);
+    assert(p_comp_no < p_j2k->m_private_image->numcomps);
+
+    l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
+                  (l_tccp->numresolutions * 3 - 2);
+
+    if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
+        return 1 + l_num_bands;
+    } else {
+        return 1 + 2 * l_num_bands;
+    }
+}
+
+static OPJ_BOOL opj_j2k_compare_SQcd_SQcc(opj_j2k_t *p_j2k,
+        OPJ_UINT32 p_tile_no, OPJ_UINT32 p_first_comp_no, OPJ_UINT32 p_second_comp_no)
+{
+    opj_cp_t *l_cp = NULL;
+    opj_tcp_t *l_tcp = NULL;
+    opj_tccp_t *l_tccp0 = NULL;
+    opj_tccp_t *l_tccp1 = NULL;
+    OPJ_UINT32 l_band_no, l_num_bands;
+
+    /* preconditions */
+    assert(p_j2k != 00);
+
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = &l_cp->tcps[p_tile_no];
+    l_tccp0 = &l_tcp->tccps[p_first_comp_no];
+    l_tccp1 = &l_tcp->tccps[p_second_comp_no];
+
+    if (l_tccp0->qntsty != l_tccp1->qntsty) {
+        return OPJ_FALSE;
+    }
+    if (l_tccp0->numgbits != l_tccp1->numgbits) {
+        return OPJ_FALSE;
+    }
+    if (l_tccp0->qntsty == J2K_CCP_QNTSTY_SIQNT) {
+        l_num_bands = 1U;
+    } else {
+        l_num_bands = l_tccp0->numresolutions * 3U - 2U;
+        if (l_num_bands != (l_tccp1->numresolutions * 3U - 2U)) {
+            return OPJ_FALSE;
+        }
+    }
+
+    for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
+        if (l_tccp0->stepsizes[l_band_no].expn != l_tccp1->stepsizes[l_band_no].expn) {
+            return OPJ_FALSE;
+        }
+    }
+    if (l_tccp0->qntsty != J2K_CCP_QNTSTY_NOQNT) {
+        for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
+            if (l_tccp0->stepsizes[l_band_no].mant != l_tccp1->stepsizes[l_band_no].mant) {
+                return OPJ_FALSE;
+            }
+        }
+    }
+    return OPJ_TRUE;
+}
+
+
+static OPJ_BOOL opj_j2k_write_SQcd_SQcc(opj_j2k_t *p_j2k,
+                                        OPJ_UINT32 p_tile_no,
+                                        OPJ_UINT32 p_comp_no,
+                                        OPJ_BYTE * p_data,
+                                        OPJ_UINT32 * p_header_size,
+                                        struct opj_event_mgr * p_manager)
+{
+    OPJ_UINT32 l_header_size;
+    OPJ_UINT32 l_band_no, l_num_bands;
+    OPJ_UINT32 l_expn, l_mant;
+
+    opj_cp_t *l_cp = 00;
+    opj_tcp_t *l_tcp = 00;
+    opj_tccp_t *l_tccp = 00;
+
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_header_size != 00);
+    assert(p_manager != 00);
+    assert(p_data != 00);
+
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = &l_cp->tcps[p_tile_no];
+    l_tccp = &l_tcp->tccps[p_comp_no];
+
+    /* preconditions again */
+    assert(p_tile_no < l_cp->tw * l_cp->th);
+    assert(p_comp_no < p_j2k->m_private_image->numcomps);
+
+    l_num_bands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
+                  (l_tccp->numresolutions * 3 - 2);
+
+    if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT)  {
+        l_header_size = 1 + l_num_bands;
+
+        if (*p_header_size < l_header_size) {
+            opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
+            return OPJ_FALSE;
+        }
+
+        opj_write_bytes(p_data, l_tccp->qntsty + (l_tccp->numgbits << 5),
+                        1);   /* Sqcx */
+        ++p_data;
+
+        for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
+            l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
+            opj_write_bytes(p_data, l_expn << 3, 1);        /* SPqcx_i */
+            ++p_data;
+        }
+    } else {
+        l_header_size = 1 + 2 * l_num_bands;
+
+        if (*p_header_size < l_header_size) {
+            opj_event_msg(p_manager, EVT_ERROR, "Error writing SQcd SQcc element\n");
+            return OPJ_FALSE;
+        }
+
+        opj_write_bytes(p_data, l_tccp->qntsty + (l_tccp->numgbits << 5),
+                        1);   /* Sqcx */
+        ++p_data;
+
+        for (l_band_no = 0; l_band_no < l_num_bands; ++l_band_no) {
+            l_expn = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].expn;
+            l_mant = (OPJ_UINT32)l_tccp->stepsizes[l_band_no].mant;
+
+            opj_write_bytes(p_data, (l_expn << 11) + l_mant, 2);    /* SPqcx_i */
+            p_data += 2;
+        }
+    }
+
+    *p_header_size = *p_header_size - l_header_size;
+
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k,
+                                       OPJ_UINT32 p_comp_no,
+                                       OPJ_BYTE* p_header_data,
+                                       OPJ_UINT32 * p_header_size,
+                                       opj_event_mgr_t * p_manager
+                                      )
+{
+    /* loop*/
+    OPJ_UINT32 l_band_no;
+    opj_cp_t *l_cp = 00;
+    opj_tcp_t *l_tcp = 00;
+    opj_tccp_t *l_tccp = 00;
+    OPJ_BYTE * l_current_ptr = 00;
+    OPJ_UINT32 l_tmp, l_num_band;
+
+    /* preconditions*/
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_header_data != 00);
+
+    l_cp = &(p_j2k->m_cp);
+    /* come from tile part header or main header ?*/
+    l_tcp = (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH)
+            ?
+            &l_cp->tcps[p_j2k->m_current_tile_number] :
+            p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+    /* precondition again*/
+    if (p_comp_no >=  p_j2k->m_private_image->numcomps) {
+        return OPJ_FALSE;
+    }
+
+    l_tccp = &l_tcp->tccps[p_comp_no];
+    l_current_ptr = p_header_data;
+
+    if (*p_header_size < 1) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error reading SQcd or SQcc element\n");
+        return OPJ_FALSE;
+    }
+    *p_header_size -= 1;
+
+    opj_read_bytes(l_current_ptr, &l_tmp, 1);                       /* Sqcx */
+    ++l_current_ptr;
+
+    l_tccp->qntsty = l_tmp & 0x1f;
+    l_tccp->numgbits = l_tmp >> 5;
+    if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
         l_num_band = 1;
-        }
-        else {
-                l_num_band = (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ?
-                        (*p_header_size) :
-                        (*p_header_size) / 2;
+    } else {
+        l_num_band = (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ?
+                     (*p_header_size) :
+                     (*p_header_size) / 2;
 
-                if( l_num_band > OPJ_J2K_MAXBANDS ) {
-                        opj_event_msg(p_manager, EVT_WARNING, "While reading CCP_QNTSTY element inside QCD or QCC marker segment, "
-                                "number of subbands (%d) is greater to OPJ_J2K_MAXBANDS (%d). So we limit the number of elements stored to "
-                                "OPJ_J2K_MAXBANDS (%d) and skip the rest. \n", l_num_band, OPJ_J2K_MAXBANDS, OPJ_J2K_MAXBANDS);
-                        /*return OPJ_FALSE;*/
-                }
+        if (l_num_band > OPJ_J2K_MAXBANDS) {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "While reading CCP_QNTSTY element inside QCD or QCC marker segment, "
+                          "number of subbands (%d) is greater to OPJ_J2K_MAXBANDS (%d). So we limit the number of elements stored to "
+                          "OPJ_J2K_MAXBANDS (%d) and skip the rest. \n", l_num_band, OPJ_J2K_MAXBANDS,
+                          OPJ_J2K_MAXBANDS);
+            /*return OPJ_FALSE;*/
         }
+    }
 
 #ifdef USE_JPWL
-        if (l_cp->correct) {
+    if (l_cp->correct) {
 
-                /* if JPWL is on, we check whether there are too many subbands */
-                if (/*(l_num_band < 0) ||*/ (l_num_band >= OPJ_J2K_MAXBANDS)) {
-                        opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
-                                "JPWL: bad number of subbands in Sqcx (%d)\n",
-                                l_num_band);
-                        if (!JPWL_ASSUME) {
-                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
-                                return OPJ_FALSE;
-                        }
-                        /* we try to correct */
-                        l_num_band = 1;
-                        opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n"
-                                "- setting number of bands to %d => HYPOTHESIS!!!\n",
-                                l_num_band);
-                };
-
+        /* if JPWL is on, we check whether there are too many subbands */
+        if (/*(l_num_band < 0) ||*/ (l_num_band >= OPJ_J2K_MAXBANDS)) {
+            opj_event_msg(p_manager, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
+                          "JPWL: bad number of subbands in Sqcx (%d)\n",
+                          l_num_band);
+            if (!JPWL_ASSUME) {
+                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                return OPJ_FALSE;
+            }
+            /* we try to correct */
+            l_num_band = 1;
+            opj_event_msg(p_manager, EVT_WARNING, "- trying to adjust them\n"
+                          "- setting number of bands to %d => HYPOTHESIS!!!\n",
+                          l_num_band);
         };
+
+    };
 #endif /* USE_JPWL */
 
-        if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
-                for     (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
-                        opj_read_bytes(l_current_ptr, &l_tmp ,1);                       /* SPqcx_i */
-                        ++l_current_ptr;
-                        if (l_band_no < OPJ_J2K_MAXBANDS){
-                                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 3);
-                                l_tccp->stepsizes[l_band_no].mant = 0;
-                        }
-                }
-                *p_header_size = *p_header_size - l_num_band;
-        }
-        else {
-                for     (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
-                        opj_read_bytes(l_current_ptr, &l_tmp ,2);                       /* SPqcx_i */
-                        l_current_ptr+=2;
-                        if (l_band_no < OPJ_J2K_MAXBANDS){
-                                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 11);
-                                l_tccp->stepsizes[l_band_no].mant = l_tmp & 0x7ff;
-                        }
-                }
-                *p_header_size = *p_header_size - 2*l_num_band;
-        }
-
-        /* Add Antonin : if scalar_derived -> compute other stepsizes */
-        if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
-                for (l_band_no = 1; l_band_no < OPJ_J2K_MAXBANDS; l_band_no++) {
-                        l_tccp->stepsizes[l_band_no].expn =
-                                ((OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) > 0) ?
-                                        (OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) : 0;
-                        l_tccp->stepsizes[l_band_no].mant = l_tccp->stepsizes[0].mant;
-                }
-        }
-
-        return OPJ_TRUE;
-}
-
-static void opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k )
-{
-        OPJ_UINT32 i;
-        opj_cp_t *l_cp = NULL;
-        opj_tcp_t *l_tcp = NULL;
-        opj_tccp_t *l_ref_tccp = NULL;
-        opj_tccp_t *l_copied_tccp = NULL;
-        OPJ_UINT32 l_size;
-
-        /* preconditions */
-        assert(p_j2k != 00);
-
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
-                        &l_cp->tcps[p_j2k->m_current_tile_number] :
-                        p_j2k->m_specific_param.m_decoder.m_default_tcp;
-
-        l_ref_tccp = &l_tcp->tccps[0];
-        l_copied_tccp = l_ref_tccp + 1;
-        l_size = OPJ_J2K_MAXBANDS * sizeof(opj_stepsize_t);
-
-        for     (i=1;i<p_j2k->m_private_image->numcomps;++i) {
-                l_copied_tccp->qntsty = l_ref_tccp->qntsty;
-                l_copied_tccp->numgbits = l_ref_tccp->numgbits;
-                memcpy(l_copied_tccp->stepsizes,l_ref_tccp->stepsizes,l_size);
-                ++l_copied_tccp;
-        }
-}
-
-static void opj_j2k_dump_tile_info( opj_tcp_t * l_default_tile,OPJ_INT32 numcomps,FILE* out_stream)
-{
-        if (l_default_tile)
-        {
-                OPJ_INT32 compno;
-
-                fprintf(out_stream, "\t default tile {\n");
-                fprintf(out_stream, "\t\t csty=%#x\n", l_default_tile->csty);
-                fprintf(out_stream, "\t\t prg=%#x\n", l_default_tile->prg);
-                fprintf(out_stream, "\t\t numlayers=%d\n", l_default_tile->numlayers);
-                fprintf(out_stream, "\t\t mct=%x\n", l_default_tile->mct);
-
-                for (compno = 0; compno < numcomps; compno++) {
-                        opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
-                        OPJ_UINT32 resno;
-      OPJ_INT32 bandno, numbands;
-
-                        /* coding style*/
-                        fprintf(out_stream, "\t\t comp %d {\n", compno);
-                        fprintf(out_stream, "\t\t\t csty=%#x\n", l_tccp->csty);
-                        fprintf(out_stream, "\t\t\t numresolutions=%d\n", l_tccp->numresolutions);
-                        fprintf(out_stream, "\t\t\t cblkw=2^%d\n", l_tccp->cblkw);
-                        fprintf(out_stream, "\t\t\t cblkh=2^%d\n", l_tccp->cblkh);
-                        fprintf(out_stream, "\t\t\t cblksty=%#x\n", l_tccp->cblksty);
-                        fprintf(out_stream, "\t\t\t qmfbid=%d\n", l_tccp->qmfbid);
-
-                        fprintf(out_stream, "\t\t\t preccintsize (w,h)=");
-                        for (resno = 0; resno < l_tccp->numresolutions; resno++) {
-                                fprintf(out_stream, "(%d,%d) ", l_tccp->prcw[resno], l_tccp->prch[resno]);
-                        }
-                        fprintf(out_stream, "\n");
-
-                        /* quantization style*/
-                        fprintf(out_stream, "\t\t\t qntsty=%d\n", l_tccp->qntsty);
-                        fprintf(out_stream, "\t\t\t numgbits=%d\n", l_tccp->numgbits);
-                        fprintf(out_stream, "\t\t\t stepsizes (m,e)=");
-                        numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
-                        for (bandno = 0; bandno < numbands; bandno++) {
-                                fprintf(out_stream, "(%d,%d) ", l_tccp->stepsizes[bandno].mant,
-                                        l_tccp->stepsizes[bandno].expn);
-                        }
-                        fprintf(out_stream, "\n");
-
-                        /* RGN value*/
-                        fprintf(out_stream, "\t\t\t roishift=%d\n", l_tccp->roishift);
-
-                        fprintf(out_stream, "\t\t }\n");
-                } /*end of component of default tile*/
-                fprintf(out_stream, "\t }\n"); /*end of default tile*/
+    if (l_tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
+        for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
+            opj_read_bytes(l_current_ptr, &l_tmp, 1);                       /* SPqcx_i */
+            ++l_current_ptr;
+            if (l_band_no < OPJ_J2K_MAXBANDS) {
+                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 3);
+                l_tccp->stepsizes[l_band_no].mant = 0;
             }
+        }
+        *p_header_size = *p_header_size - l_num_band;
+    } else {
+        for (l_band_no = 0; l_band_no < l_num_band; l_band_no++) {
+            opj_read_bytes(l_current_ptr, &l_tmp, 2);                       /* SPqcx_i */
+            l_current_ptr += 2;
+            if (l_band_no < OPJ_J2K_MAXBANDS) {
+                l_tccp->stepsizes[l_band_no].expn = (OPJ_INT32)(l_tmp >> 11);
+                l_tccp->stepsizes[l_band_no].mant = l_tmp & 0x7ff;
+            }
+        }
+        *p_header_size = *p_header_size - 2 * l_num_band;
+    }
+
+    /* Add Antonin : if scalar_derived -> compute other stepsizes */
+    if (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
+        for (l_band_no = 1; l_band_no < OPJ_J2K_MAXBANDS; l_band_no++) {
+            l_tccp->stepsizes[l_band_no].expn =
+                ((OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) > 0)
+                ?
+                (OPJ_INT32)(l_tccp->stepsizes[0].expn) - (OPJ_INT32)((l_band_no - 1) / 3) : 0;
+            l_tccp->stepsizes[l_band_no].mant = l_tccp->stepsizes[0].mant;
+        }
+    }
+
+    return OPJ_TRUE;
 }
 
-void j2k_dump (opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream)
+static void opj_j2k_copy_tile_quantization_parameters(opj_j2k_t *p_j2k)
 {
-        /* Check if the flag is compatible with j2k file*/
-        if ( (flag & OPJ_JP2_INFO) || (flag & OPJ_JP2_IND)){
-                fprintf(out_stream, "Wrong flag\n");
-                return;
-        }
+    OPJ_UINT32 i;
+    opj_cp_t *l_cp = NULL;
+    opj_tcp_t *l_tcp = NULL;
+    opj_tccp_t *l_ref_tccp = NULL;
+    opj_tccp_t *l_copied_tccp = NULL;
+    OPJ_UINT32 l_size;
 
-        /* Dump the image_header */
-        if (flag & OPJ_IMG_INFO){
-                if (p_j2k->m_private_image)
-                        j2k_dump_image_header(p_j2k->m_private_image, 0, out_stream);
-        }
+    /* preconditions */
+    assert(p_j2k != 00);
 
-        /* Dump the codestream info from main header */
-        if (flag & OPJ_J2K_MH_INFO){
-                opj_j2k_dump_MH_info(p_j2k, out_stream);
-        }
-        /* Dump all tile/codestream info */
-        if (flag & OPJ_J2K_TCH_INFO){
-          OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
-          OPJ_UINT32 i;
-          opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
-          for (i=0;i<l_nb_tiles;++i) {
-            opj_j2k_dump_tile_info( l_tcp,(OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);
-            ++l_tcp;
-          }
-        }
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
+            &l_cp->tcps[p_j2k->m_current_tile_number] :
+            p_j2k->m_specific_param.m_decoder.m_default_tcp;
 
-        /* Dump the codestream info of the current tile */
-        if (flag & OPJ_J2K_TH_INFO){
+    l_ref_tccp = &l_tcp->tccps[0];
+    l_copied_tccp = l_ref_tccp + 1;
+    l_size = OPJ_J2K_MAXBANDS * sizeof(opj_stepsize_t);
 
+    for (i = 1; i < p_j2k->m_private_image->numcomps; ++i) {
+        l_copied_tccp->qntsty = l_ref_tccp->qntsty;
+        l_copied_tccp->numgbits = l_ref_tccp->numgbits;
+        memcpy(l_copied_tccp->stepsizes, l_ref_tccp->stepsizes, l_size);
+        ++l_copied_tccp;
+    }
+}
+
+static void opj_j2k_dump_tile_info(opj_tcp_t * l_default_tile,
+                                   OPJ_INT32 numcomps, FILE* out_stream)
+{
+    if (l_default_tile) {
+        OPJ_INT32 compno;
+
+        fprintf(out_stream, "\t default tile {\n");
+        fprintf(out_stream, "\t\t csty=%#x\n", l_default_tile->csty);
+        fprintf(out_stream, "\t\t prg=%#x\n", l_default_tile->prg);
+        fprintf(out_stream, "\t\t numlayers=%d\n", l_default_tile->numlayers);
+        fprintf(out_stream, "\t\t mct=%x\n", l_default_tile->mct);
+
+        for (compno = 0; compno < numcomps; compno++) {
+            opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
+            OPJ_UINT32 resno;
+            OPJ_INT32 bandno, numbands;
+
+            /* coding style*/
+            fprintf(out_stream, "\t\t comp %d {\n", compno);
+            fprintf(out_stream, "\t\t\t csty=%#x\n", l_tccp->csty);
+            fprintf(out_stream, "\t\t\t numresolutions=%d\n", l_tccp->numresolutions);
+            fprintf(out_stream, "\t\t\t cblkw=2^%d\n", l_tccp->cblkw);
+            fprintf(out_stream, "\t\t\t cblkh=2^%d\n", l_tccp->cblkh);
+            fprintf(out_stream, "\t\t\t cblksty=%#x\n", l_tccp->cblksty);
+            fprintf(out_stream, "\t\t\t qmfbid=%d\n", l_tccp->qmfbid);
+
+            fprintf(out_stream, "\t\t\t preccintsize (w,h)=");
+            for (resno = 0; resno < l_tccp->numresolutions; resno++) {
+                fprintf(out_stream, "(%d,%d) ", l_tccp->prcw[resno], l_tccp->prch[resno]);
+            }
+            fprintf(out_stream, "\n");
+
+            /* quantization style*/
+            fprintf(out_stream, "\t\t\t qntsty=%d\n", l_tccp->qntsty);
+            fprintf(out_stream, "\t\t\t numgbits=%d\n", l_tccp->numgbits);
+            fprintf(out_stream, "\t\t\t stepsizes (m,e)=");
+            numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
+                       (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
+            for (bandno = 0; bandno < numbands; bandno++) {
+                fprintf(out_stream, "(%d,%d) ", l_tccp->stepsizes[bandno].mant,
+                        l_tccp->stepsizes[bandno].expn);
+            }
+            fprintf(out_stream, "\n");
+
+            /* RGN value*/
+            fprintf(out_stream, "\t\t\t roishift=%d\n", l_tccp->roishift);
+
+            fprintf(out_stream, "\t\t }\n");
+        } /*end of component of default tile*/
+        fprintf(out_stream, "\t }\n"); /*end of default tile*/
+    }
+}
+
+void j2k_dump(opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream)
+{
+    /* Check if the flag is compatible with j2k file*/
+    if ((flag & OPJ_JP2_INFO) || (flag & OPJ_JP2_IND)) {
+        fprintf(out_stream, "Wrong flag\n");
+        return;
+    }
+
+    /* Dump the image_header */
+    if (flag & OPJ_IMG_INFO) {
+        if (p_j2k->m_private_image) {
+            j2k_dump_image_header(p_j2k->m_private_image, 0, out_stream);
         }
+    }
 
-        /* Dump the codestream index from main header */
-        if (flag & OPJ_J2K_MH_IND){
-                opj_j2k_dump_MH_index(p_j2k, out_stream);
+    /* Dump the codestream info from main header */
+    if (flag & OPJ_J2K_MH_INFO) {
+        if (p_j2k->m_private_image) {
+            opj_j2k_dump_MH_info(p_j2k, out_stream);
         }
-
-        /* Dump the codestream index of the current tile */
-        if (flag & OPJ_J2K_TH_IND){
-
+    }
+    /* Dump all tile/codestream info */
+    if (flag & OPJ_J2K_TCH_INFO) {
+        OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+        OPJ_UINT32 i;
+        opj_tcp_t * l_tcp = p_j2k->m_cp.tcps;
+        if (p_j2k->m_private_image) {
+            for (i = 0; i < l_nb_tiles; ++i) {
+                opj_j2k_dump_tile_info(l_tcp, (OPJ_INT32)p_j2k->m_private_image->numcomps,
+                                       out_stream);
+                ++l_tcp;
+            }
         }
+    }
+
+    /* Dump the codestream info of the current tile */
+    if (flag & OPJ_J2K_TH_INFO) {
+
+    }
+
+    /* Dump the codestream index from main header */
+    if (flag & OPJ_J2K_MH_IND) {
+        opj_j2k_dump_MH_index(p_j2k, out_stream);
+    }
+
+    /* Dump the codestream index of the current tile */
+    if (flag & OPJ_J2K_TH_IND) {
+
+    }
 
 }
 
 static void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream)
 {
-        opj_codestream_index_t* cstr_index = p_j2k->cstr_index;
-        OPJ_UINT32 it_marker, it_tile, it_tile_part;
+    opj_codestream_index_t* cstr_index = p_j2k->cstr_index;
+    OPJ_UINT32 it_marker, it_tile, it_tile_part;
 
-        fprintf(out_stream, "Codestream index from main header: {\n");
+    fprintf(out_stream, "Codestream index from main header: {\n");
 
-        fprintf(out_stream, "\t Main header start position=%" PRIi64 "\n"
-                                    "\t Main header end position=%" PRIi64 "\n",
-                        cstr_index->main_head_start, cstr_index->main_head_end);
+    fprintf(out_stream, "\t Main header start position=%" PRIi64 "\n"
+            "\t Main header end position=%" PRIi64 "\n",
+            cstr_index->main_head_start, cstr_index->main_head_end);
 
-        fprintf(out_stream, "\t Marker list: {\n");
+    fprintf(out_stream, "\t Marker list: {\n");
 
-        if (cstr_index->marker){
-                for (it_marker=0; it_marker < cstr_index->marknum ; it_marker++){
-                        fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
-                                        cstr_index->marker[it_marker].type,
-                                        cstr_index->marker[it_marker].pos,
-                                        cstr_index->marker[it_marker].len );
-                }
+    if (cstr_index->marker) {
+        for (it_marker = 0; it_marker < cstr_index->marknum ; it_marker++) {
+            fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
+                    cstr_index->marker[it_marker].type,
+                    cstr_index->marker[it_marker].pos,
+                    cstr_index->marker[it_marker].len);
         }
+    }
 
-        fprintf(out_stream, "\t }\n");
+    fprintf(out_stream, "\t }\n");
 
-        if (cstr_index->tile_index){
+    if (cstr_index->tile_index) {
 
         /* Simple test to avoid to write empty information*/
         OPJ_UINT32 l_acc_nb_of_tile_part = 0;
-        for (it_tile=0; it_tile < cstr_index->nb_of_tiles ; it_tile++){
-                        l_acc_nb_of_tile_part += cstr_index->tile_index[it_tile].nb_tps;
+        for (it_tile = 0; it_tile < cstr_index->nb_of_tiles ; it_tile++) {
+            l_acc_nb_of_tile_part += cstr_index->tile_index[it_tile].nb_tps;
         }
 
-        if (l_acc_nb_of_tile_part)
-        {
+        if (l_acc_nb_of_tile_part) {
             fprintf(out_stream, "\t Tile index: {\n");
 
-                    for (it_tile=0; it_tile < cstr_index->nb_of_tiles ; it_tile++){
-                            OPJ_UINT32 nb_of_tile_part = cstr_index->tile_index[it_tile].nb_tps;
+            for (it_tile = 0; it_tile < cstr_index->nb_of_tiles ; it_tile++) {
+                OPJ_UINT32 nb_of_tile_part = cstr_index->tile_index[it_tile].nb_tps;
 
-                            fprintf(out_stream, "\t\t nb of tile-part in tile [%d]=%d\n", it_tile, nb_of_tile_part);
+                fprintf(out_stream, "\t\t nb of tile-part in tile [%d]=%d\n", it_tile,
+                        nb_of_tile_part);
 
-                            if (cstr_index->tile_index[it_tile].tp_index){
-                                    for (it_tile_part =0; it_tile_part < nb_of_tile_part; it_tile_part++){
-                                            fprintf(out_stream, "\t\t\t tile-part[%d]: star_pos=%" PRIi64 ", end_header=%" PRIi64 ", end_pos=%" PRIi64 ".\n",
-                                                            it_tile_part,
-                                                            cstr_index->tile_index[it_tile].tp_index[it_tile_part].start_pos,
-                                                            cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_header,
-                                                            cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_pos);
-                                    }
-                            }
-
-                            if (cstr_index->tile_index[it_tile].marker){
-                                    for (it_marker=0; it_marker < cstr_index->tile_index[it_tile].marknum ; it_marker++){
-                                            fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
-                                                            cstr_index->tile_index[it_tile].marker[it_marker].type,
-                                                            cstr_index->tile_index[it_tile].marker[it_marker].pos,
-                                                            cstr_index->tile_index[it_tile].marker[it_marker].len );
-                                    }
-                            }
+                if (cstr_index->tile_index[it_tile].tp_index) {
+                    for (it_tile_part = 0; it_tile_part < nb_of_tile_part; it_tile_part++) {
+                        fprintf(out_stream, "\t\t\t tile-part[%d]: star_pos=%" PRIi64 ", end_header=%"
+                                PRIi64 ", end_pos=%" PRIi64 ".\n",
+                                it_tile_part,
+                                cstr_index->tile_index[it_tile].tp_index[it_tile_part].start_pos,
+                                cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_header,
+                                cstr_index->tile_index[it_tile].tp_index[it_tile_part].end_pos);
                     }
-                    fprintf(out_stream,"\t }\n");
-        }
-        }
+                }
 
-        fprintf(out_stream,"}\n");
+                if (cstr_index->tile_index[it_tile].marker) {
+                    for (it_marker = 0; it_marker < cstr_index->tile_index[it_tile].marknum ;
+                            it_marker++) {
+                        fprintf(out_stream, "\t\t type=%#x, pos=%" PRIi64 ", len=%d\n",
+                                cstr_index->tile_index[it_tile].marker[it_marker].type,
+                                cstr_index->tile_index[it_tile].marker[it_marker].pos,
+                                cstr_index->tile_index[it_tile].marker[it_marker].len);
+                    }
+                }
+            }
+            fprintf(out_stream, "\t }\n");
+        }
+    }
+
+    fprintf(out_stream, "}\n");
 
 }
 
@@ -9319,1455 +10161,1635 @@
 static void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream)
 {
 
-        fprintf(out_stream, "Codestream info from main header: {\n");
+    fprintf(out_stream, "Codestream info from main header: {\n");
 
-        fprintf(out_stream, "\t tx0=%d, ty0=%d\n", p_j2k->m_cp.tx0, p_j2k->m_cp.ty0);
-        fprintf(out_stream, "\t tdx=%d, tdy=%d\n", p_j2k->m_cp.tdx, p_j2k->m_cp.tdy);
-        fprintf(out_stream, "\t tw=%d, th=%d\n", p_j2k->m_cp.tw, p_j2k->m_cp.th);
-        opj_j2k_dump_tile_info(p_j2k->m_specific_param.m_decoder.m_default_tcp,(OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);
-        fprintf(out_stream, "}\n");
+    fprintf(out_stream, "\t tx0=%d, ty0=%d\n", p_j2k->m_cp.tx0, p_j2k->m_cp.ty0);
+    fprintf(out_stream, "\t tdx=%d, tdy=%d\n", p_j2k->m_cp.tdx, p_j2k->m_cp.tdy);
+    fprintf(out_stream, "\t tw=%d, th=%d\n", p_j2k->m_cp.tw, p_j2k->m_cp.th);
+    opj_j2k_dump_tile_info(p_j2k->m_specific_param.m_decoder.m_default_tcp,
+                           (OPJ_INT32)p_j2k->m_private_image->numcomps, out_stream);
+    fprintf(out_stream, "}\n");
 }
 
-void j2k_dump_image_header(opj_image_t* img_header, OPJ_BOOL dev_dump_flag, FILE* out_stream)
+void j2k_dump_image_header(opj_image_t* img_header, OPJ_BOOL dev_dump_flag,
+                           FILE* out_stream)
 {
-        char tab[2];
+    char tab[2];
 
-        if (dev_dump_flag){
-                fprintf(stdout, "[DEV] Dump an image_header struct {\n");
-                tab[0] = '\0';
+    if (dev_dump_flag) {
+        fprintf(stdout, "[DEV] Dump an image_header struct {\n");
+        tab[0] = '\0';
+    } else {
+        fprintf(out_stream, "Image info {\n");
+        tab[0] = '\t';
+        tab[1] = '\0';
+    }
+
+    fprintf(out_stream, "%s x0=%d, y0=%d\n", tab, img_header->x0, img_header->y0);
+    fprintf(out_stream,     "%s x1=%d, y1=%d\n", tab, img_header->x1,
+            img_header->y1);
+    fprintf(out_stream, "%s numcomps=%d\n", tab, img_header->numcomps);
+
+    if (img_header->comps) {
+        OPJ_UINT32 compno;
+        for (compno = 0; compno < img_header->numcomps; compno++) {
+            fprintf(out_stream, "%s\t component %d {\n", tab, compno);
+            j2k_dump_image_comp_header(&(img_header->comps[compno]), dev_dump_flag,
+                                       out_stream);
+            fprintf(out_stream, "%s}\n", tab);
         }
-        else {
-                fprintf(out_stream, "Image info {\n");
-                tab[0] = '\t';tab[1] = '\0';
-        }
+    }
 
-        fprintf(out_stream, "%s x0=%d, y0=%d\n", tab, img_header->x0, img_header->y0);
-        fprintf(out_stream,     "%s x1=%d, y1=%d\n", tab, img_header->x1, img_header->y1);
-        fprintf(out_stream, "%s numcomps=%d\n", tab, img_header->numcomps);
-
-        if (img_header->comps){
-                OPJ_UINT32 compno;
-                for (compno = 0; compno < img_header->numcomps; compno++) {
-                        fprintf(out_stream, "%s\t component %d {\n", tab, compno);
-                        j2k_dump_image_comp_header(&(img_header->comps[compno]), dev_dump_flag, out_stream);
-                        fprintf(out_stream,"%s}\n",tab);
-                }
-        }
-
-        fprintf(out_stream, "}\n");
+    fprintf(out_stream, "}\n");
 }
 
-void j2k_dump_image_comp_header(opj_image_comp_t* comp_header, OPJ_BOOL dev_dump_flag, FILE* out_stream)
+void j2k_dump_image_comp_header(opj_image_comp_t* comp_header,
+                                OPJ_BOOL dev_dump_flag, FILE* out_stream)
 {
-        char tab[3];
+    char tab[3];
 
-        if (dev_dump_flag){
-                fprintf(stdout, "[DEV] Dump an image_comp_header struct {\n");
-                tab[0] = '\0';
-        }       else {
-                tab[0] = '\t';tab[1] = '\t';tab[2] = '\0';
-        }
+    if (dev_dump_flag) {
+        fprintf(stdout, "[DEV] Dump an image_comp_header struct {\n");
+        tab[0] = '\0';
+    }       else {
+        tab[0] = '\t';
+        tab[1] = '\t';
+        tab[2] = '\0';
+    }
 
-        fprintf(out_stream, "%s dx=%d, dy=%d\n", tab, comp_header->dx, comp_header->dy);
-        fprintf(out_stream, "%s prec=%d\n", tab, comp_header->prec);
-        fprintf(out_stream, "%s sgnd=%d\n", tab, comp_header->sgnd);
+    fprintf(out_stream, "%s dx=%d, dy=%d\n", tab, comp_header->dx, comp_header->dy);
+    fprintf(out_stream, "%s prec=%d\n", tab, comp_header->prec);
+    fprintf(out_stream, "%s sgnd=%d\n", tab, comp_header->sgnd);
 
-        if (dev_dump_flag)
-                fprintf(out_stream, "}\n");
+    if (dev_dump_flag) {
+        fprintf(out_stream, "}\n");
+    }
 }
 
 opj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_t* p_j2k)
 {
-        OPJ_UINT32 compno;
-        OPJ_UINT32 numcomps = p_j2k->m_private_image->numcomps;
-        opj_tcp_t *l_default_tile;
-        opj_codestream_info_v2_t* cstr_info = (opj_codestream_info_v2_t*) opj_calloc(1,sizeof(opj_codestream_info_v2_t));
-		if (!cstr_info)
-			return NULL;
+    OPJ_UINT32 compno;
+    OPJ_UINT32 numcomps = p_j2k->m_private_image->numcomps;
+    opj_tcp_t *l_default_tile;
+    opj_codestream_info_v2_t* cstr_info = (opj_codestream_info_v2_t*) opj_calloc(1,
+                                          sizeof(opj_codestream_info_v2_t));
+    if (!cstr_info) {
+        return NULL;
+    }
 
-        cstr_info->nbcomps = p_j2k->m_private_image->numcomps;
+    cstr_info->nbcomps = p_j2k->m_private_image->numcomps;
 
-        cstr_info->tx0 = p_j2k->m_cp.tx0;
-        cstr_info->ty0 = p_j2k->m_cp.ty0;
-        cstr_info->tdx = p_j2k->m_cp.tdx;
-        cstr_info->tdy = p_j2k->m_cp.tdy;
-        cstr_info->tw = p_j2k->m_cp.tw;
-        cstr_info->th = p_j2k->m_cp.th;
+    cstr_info->tx0 = p_j2k->m_cp.tx0;
+    cstr_info->ty0 = p_j2k->m_cp.ty0;
+    cstr_info->tdx = p_j2k->m_cp.tdx;
+    cstr_info->tdy = p_j2k->m_cp.tdy;
+    cstr_info->tw = p_j2k->m_cp.tw;
+    cstr_info->th = p_j2k->m_cp.th;
 
-        cstr_info->tile_info = NULL; /* Not fill from the main header*/
+    cstr_info->tile_info = NULL; /* Not fill from the main header*/
 
-        l_default_tile = p_j2k->m_specific_param.m_decoder.m_default_tcp;
+    l_default_tile = p_j2k->m_specific_param.m_decoder.m_default_tcp;
 
-        cstr_info->m_default_tile_info.csty = l_default_tile->csty;
-        cstr_info->m_default_tile_info.prg = l_default_tile->prg;
-        cstr_info->m_default_tile_info.numlayers = l_default_tile->numlayers;
-        cstr_info->m_default_tile_info.mct = l_default_tile->mct;
+    cstr_info->m_default_tile_info.csty = l_default_tile->csty;
+    cstr_info->m_default_tile_info.prg = l_default_tile->prg;
+    cstr_info->m_default_tile_info.numlayers = l_default_tile->numlayers;
+    cstr_info->m_default_tile_info.mct = l_default_tile->mct;
 
-        cstr_info->m_default_tile_info.tccp_info = (opj_tccp_info_t*) opj_calloc(cstr_info->nbcomps, sizeof(opj_tccp_info_t));
-		if (!cstr_info->m_default_tile_info.tccp_info)
-		{
-			opj_destroy_cstr_info(&cstr_info);
-			return NULL;
-		}
+    cstr_info->m_default_tile_info.tccp_info = (opj_tccp_info_t*) opj_calloc(
+                cstr_info->nbcomps, sizeof(opj_tccp_info_t));
+    if (!cstr_info->m_default_tile_info.tccp_info) {
+        opj_destroy_cstr_info(&cstr_info);
+        return NULL;
+    }
 
-        for (compno = 0; compno < numcomps; compno++) {
-                opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
-                opj_tccp_info_t *l_tccp_info = &(cstr_info->m_default_tile_info.tccp_info[compno]);
-                OPJ_INT32 bandno, numbands;
+    for (compno = 0; compno < numcomps; compno++) {
+        opj_tccp_t *l_tccp = &(l_default_tile->tccps[compno]);
+        opj_tccp_info_t *l_tccp_info = &
+                                       (cstr_info->m_default_tile_info.tccp_info[compno]);
+        OPJ_INT32 bandno, numbands;
 
-                /* coding style*/
-                l_tccp_info->csty = l_tccp->csty;
-                l_tccp_info->numresolutions = l_tccp->numresolutions;
-                l_tccp_info->cblkw = l_tccp->cblkw;
-                l_tccp_info->cblkh = l_tccp->cblkh;
-                l_tccp_info->cblksty = l_tccp->cblksty;
-                l_tccp_info->qmfbid = l_tccp->qmfbid;
-                if (l_tccp->numresolutions < OPJ_J2K_MAXRLVLS)
-                {
-                        memcpy(l_tccp_info->prch, l_tccp->prch, l_tccp->numresolutions);
-                        memcpy(l_tccp_info->prcw, l_tccp->prcw, l_tccp->numresolutions);
-                }
-
-                /* quantization style*/
-                l_tccp_info->qntsty = l_tccp->qntsty;
-                l_tccp_info->numgbits = l_tccp->numgbits;
-
-                numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 : (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
-                if (numbands < OPJ_J2K_MAXBANDS) {
-                        for (bandno = 0; bandno < numbands; bandno++) {
-                                l_tccp_info->stepsizes_mant[bandno] = (OPJ_UINT32)l_tccp->stepsizes[bandno].mant;
-                                l_tccp_info->stepsizes_expn[bandno] = (OPJ_UINT32)l_tccp->stepsizes[bandno].expn;
-                        }
-                }
-
-                /* RGN value*/
-                l_tccp_info->roishift = l_tccp->roishift;
+        /* coding style*/
+        l_tccp_info->csty = l_tccp->csty;
+        l_tccp_info->numresolutions = l_tccp->numresolutions;
+        l_tccp_info->cblkw = l_tccp->cblkw;
+        l_tccp_info->cblkh = l_tccp->cblkh;
+        l_tccp_info->cblksty = l_tccp->cblksty;
+        l_tccp_info->qmfbid = l_tccp->qmfbid;
+        if (l_tccp->numresolutions < OPJ_J2K_MAXRLVLS) {
+            memcpy(l_tccp_info->prch, l_tccp->prch, l_tccp->numresolutions);
+            memcpy(l_tccp_info->prcw, l_tccp->prcw, l_tccp->numresolutions);
         }
 
-        return cstr_info;
+        /* quantization style*/
+        l_tccp_info->qntsty = l_tccp->qntsty;
+        l_tccp_info->numgbits = l_tccp->numgbits;
+
+        numbands = (l_tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ? 1 :
+                   (OPJ_INT32)l_tccp->numresolutions * 3 - 2;
+        if (numbands < OPJ_J2K_MAXBANDS) {
+            for (bandno = 0; bandno < numbands; bandno++) {
+                l_tccp_info->stepsizes_mant[bandno] = (OPJ_UINT32)
+                                                      l_tccp->stepsizes[bandno].mant;
+                l_tccp_info->stepsizes_expn[bandno] = (OPJ_UINT32)
+                                                      l_tccp->stepsizes[bandno].expn;
+            }
+        }
+
+        /* RGN value*/
+        l_tccp_info->roishift = l_tccp->roishift;
+    }
+
+    return cstr_info;
 }
 
 opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k)
 {
-        opj_codestream_index_t* l_cstr_index = (opj_codestream_index_t*)
-                        opj_calloc(1,sizeof(opj_codestream_index_t));
-        if (!l_cstr_index)
-                return NULL;
+    opj_codestream_index_t* l_cstr_index = (opj_codestream_index_t*)
+                                           opj_calloc(1, sizeof(opj_codestream_index_t));
+    if (!l_cstr_index) {
+        return NULL;
+    }
 
-        l_cstr_index->main_head_start = p_j2k->cstr_index->main_head_start;
-        l_cstr_index->main_head_end = p_j2k->cstr_index->main_head_end;
-        l_cstr_index->codestream_size = p_j2k->cstr_index->codestream_size;
+    l_cstr_index->main_head_start = p_j2k->cstr_index->main_head_start;
+    l_cstr_index->main_head_end = p_j2k->cstr_index->main_head_end;
+    l_cstr_index->codestream_size = p_j2k->cstr_index->codestream_size;
 
-        l_cstr_index->marknum = p_j2k->cstr_index->marknum;
-        l_cstr_index->marker = (opj_marker_info_t*)opj_malloc(l_cstr_index->marknum*sizeof(opj_marker_info_t));
-        if (!l_cstr_index->marker){
-                opj_free( l_cstr_index);
-                return NULL;
-        }
+    l_cstr_index->marknum = p_j2k->cstr_index->marknum;
+    l_cstr_index->marker = (opj_marker_info_t*)opj_malloc(l_cstr_index->marknum *
+                           sizeof(opj_marker_info_t));
+    if (!l_cstr_index->marker) {
+        opj_free(l_cstr_index);
+        return NULL;
+    }
 
-        if (p_j2k->cstr_index->marker)
-                memcpy(l_cstr_index->marker, p_j2k->cstr_index->marker, l_cstr_index->marknum * sizeof(opj_marker_info_t) );
-        else{
-                opj_free(l_cstr_index->marker);
-                l_cstr_index->marker = NULL;
-        }
+    if (p_j2k->cstr_index->marker) {
+        memcpy(l_cstr_index->marker, p_j2k->cstr_index->marker,
+               l_cstr_index->marknum * sizeof(opj_marker_info_t));
+    } else {
+        opj_free(l_cstr_index->marker);
+        l_cstr_index->marker = NULL;
+    }
 
-        l_cstr_index->nb_of_tiles = p_j2k->cstr_index->nb_of_tiles;
-        l_cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(l_cstr_index->nb_of_tiles, sizeof(opj_tile_index_t) );
-        if (!l_cstr_index->tile_index){
-                opj_free( l_cstr_index->marker);
-                opj_free( l_cstr_index);
-                return NULL;
-        }
+    l_cstr_index->nb_of_tiles = p_j2k->cstr_index->nb_of_tiles;
+    l_cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(
+                                   l_cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
+    if (!l_cstr_index->tile_index) {
+        opj_free(l_cstr_index->marker);
+        opj_free(l_cstr_index);
+        return NULL;
+    }
 
-        if (!p_j2k->cstr_index->tile_index){
-                opj_free(l_cstr_index->tile_index);
-                l_cstr_index->tile_index = NULL;
-        }
-        else {
-                OPJ_UINT32 it_tile = 0;
-                for (it_tile = 0; it_tile < l_cstr_index->nb_of_tiles; it_tile++ ){
+    if (!p_j2k->cstr_index->tile_index) {
+        opj_free(l_cstr_index->tile_index);
+        l_cstr_index->tile_index = NULL;
+    } else {
+        OPJ_UINT32 it_tile = 0;
+        for (it_tile = 0; it_tile < l_cstr_index->nb_of_tiles; it_tile++) {
 
-                        /* Tile Marker*/
-                        l_cstr_index->tile_index[it_tile].marknum = p_j2k->cstr_index->tile_index[it_tile].marknum;
+            /* Tile Marker*/
+            l_cstr_index->tile_index[it_tile].marknum =
+                p_j2k->cstr_index->tile_index[it_tile].marknum;
 
-                        l_cstr_index->tile_index[it_tile].marker =
-                                (opj_marker_info_t*)opj_malloc(l_cstr_index->tile_index[it_tile].marknum*sizeof(opj_marker_info_t));
+            l_cstr_index->tile_index[it_tile].marker =
+                (opj_marker_info_t*)opj_malloc(l_cstr_index->tile_index[it_tile].marknum *
+                                               sizeof(opj_marker_info_t));
 
-                        if (!l_cstr_index->tile_index[it_tile].marker) {
-                                OPJ_UINT32 it_tile_free;
+            if (!l_cstr_index->tile_index[it_tile].marker) {
+                OPJ_UINT32 it_tile_free;
 
-                                for (it_tile_free=0; it_tile_free < it_tile; it_tile_free++){
-                                        opj_free(l_cstr_index->tile_index[it_tile_free].marker);
-                                }
-
-                                opj_free( l_cstr_index->tile_index);
-                                opj_free( l_cstr_index->marker);
-                                opj_free( l_cstr_index);
-                                return NULL;
-                        }
-
-                        if (p_j2k->cstr_index->tile_index[it_tile].marker)
-                                memcpy( l_cstr_index->tile_index[it_tile].marker,
-                                                p_j2k->cstr_index->tile_index[it_tile].marker,
-                                                l_cstr_index->tile_index[it_tile].marknum * sizeof(opj_marker_info_t) );
-                        else{
-                                opj_free(l_cstr_index->tile_index[it_tile].marker);
-                                l_cstr_index->tile_index[it_tile].marker = NULL;
-                        }
-
-                        /* Tile part index*/
-                        l_cstr_index->tile_index[it_tile].nb_tps = p_j2k->cstr_index->tile_index[it_tile].nb_tps;
-
-                        l_cstr_index->tile_index[it_tile].tp_index =
-                                (opj_tp_index_t*)opj_malloc(l_cstr_index->tile_index[it_tile].nb_tps*sizeof(opj_tp_index_t));
-
-                        if(!l_cstr_index->tile_index[it_tile].tp_index){
-                                OPJ_UINT32 it_tile_free;
-
-                                for (it_tile_free=0; it_tile_free < it_tile; it_tile_free++){
-                                        opj_free(l_cstr_index->tile_index[it_tile_free].marker);
-                                        opj_free(l_cstr_index->tile_index[it_tile_free].tp_index);
-                                }
-
-                                opj_free( l_cstr_index->tile_index);
-                                opj_free( l_cstr_index->marker);
-                                opj_free( l_cstr_index);
-                                return NULL;
-                        }
-
-                        if (p_j2k->cstr_index->tile_index[it_tile].tp_index){
-                                memcpy( l_cstr_index->tile_index[it_tile].tp_index,
-                                                p_j2k->cstr_index->tile_index[it_tile].tp_index,
-                                                l_cstr_index->tile_index[it_tile].nb_tps * sizeof(opj_tp_index_t) );
-                        }
-                        else{
-                                opj_free(l_cstr_index->tile_index[it_tile].tp_index);
-                                l_cstr_index->tile_index[it_tile].tp_index = NULL;
-                        }
-
-                        /* Packet index (NOT USED)*/
-                        l_cstr_index->tile_index[it_tile].nb_packet = 0;
-                        l_cstr_index->tile_index[it_tile].packet_index = NULL;
-
+                for (it_tile_free = 0; it_tile_free < it_tile; it_tile_free++) {
+                    opj_free(l_cstr_index->tile_index[it_tile_free].marker);
                 }
-        }
 
-        return l_cstr_index;
+                opj_free(l_cstr_index->tile_index);
+                opj_free(l_cstr_index->marker);
+                opj_free(l_cstr_index);
+                return NULL;
+            }
+
+            if (p_j2k->cstr_index->tile_index[it_tile].marker)
+                memcpy(l_cstr_index->tile_index[it_tile].marker,
+                       p_j2k->cstr_index->tile_index[it_tile].marker,
+                       l_cstr_index->tile_index[it_tile].marknum * sizeof(opj_marker_info_t));
+            else {
+                opj_free(l_cstr_index->tile_index[it_tile].marker);
+                l_cstr_index->tile_index[it_tile].marker = NULL;
+            }
+
+            /* Tile part index*/
+            l_cstr_index->tile_index[it_tile].nb_tps =
+                p_j2k->cstr_index->tile_index[it_tile].nb_tps;
+
+            l_cstr_index->tile_index[it_tile].tp_index =
+                (opj_tp_index_t*)opj_malloc(l_cstr_index->tile_index[it_tile].nb_tps * sizeof(
+                                                opj_tp_index_t));
+
+            if (!l_cstr_index->tile_index[it_tile].tp_index) {
+                OPJ_UINT32 it_tile_free;
+
+                for (it_tile_free = 0; it_tile_free < it_tile; it_tile_free++) {
+                    opj_free(l_cstr_index->tile_index[it_tile_free].marker);
+                    opj_free(l_cstr_index->tile_index[it_tile_free].tp_index);
+                }
+
+                opj_free(l_cstr_index->tile_index);
+                opj_free(l_cstr_index->marker);
+                opj_free(l_cstr_index);
+                return NULL;
+            }
+
+            if (p_j2k->cstr_index->tile_index[it_tile].tp_index) {
+                memcpy(l_cstr_index->tile_index[it_tile].tp_index,
+                       p_j2k->cstr_index->tile_index[it_tile].tp_index,
+                       l_cstr_index->tile_index[it_tile].nb_tps * sizeof(opj_tp_index_t));
+            } else {
+                opj_free(l_cstr_index->tile_index[it_tile].tp_index);
+                l_cstr_index->tile_index[it_tile].tp_index = NULL;
+            }
+
+            /* Packet index (NOT USED)*/
+            l_cstr_index->tile_index[it_tile].nb_packet = 0;
+            l_cstr_index->tile_index[it_tile].packet_index = NULL;
+
+        }
+    }
+
+    return l_cstr_index;
 }
 
 static OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k)
 {
-        OPJ_UINT32 it_tile=0;
+    OPJ_UINT32 it_tile = 0;
 
-        p_j2k->cstr_index->nb_of_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
-        p_j2k->cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(p_j2k->cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
-        if (!p_j2k->cstr_index->tile_index)
-                return OPJ_FALSE;
+    p_j2k->cstr_index->nb_of_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
+    p_j2k->cstr_index->tile_index = (opj_tile_index_t*)opj_calloc(
+                                        p_j2k->cstr_index->nb_of_tiles, sizeof(opj_tile_index_t));
+    if (!p_j2k->cstr_index->tile_index) {
+        return OPJ_FALSE;
+    }
 
-        for (it_tile=0; it_tile < p_j2k->cstr_index->nb_of_tiles; it_tile++){
-                p_j2k->cstr_index->tile_index[it_tile].maxmarknum = 100;
-                p_j2k->cstr_index->tile_index[it_tile].marknum = 0;
-                p_j2k->cstr_index->tile_index[it_tile].marker = (opj_marker_info_t*)
-                                opj_calloc(p_j2k->cstr_index->tile_index[it_tile].maxmarknum, sizeof(opj_marker_info_t));
-                if (!p_j2k->cstr_index->tile_index[it_tile].marker)
-                        return OPJ_FALSE;
+    for (it_tile = 0; it_tile < p_j2k->cstr_index->nb_of_tiles; it_tile++) {
+        p_j2k->cstr_index->tile_index[it_tile].maxmarknum = 100;
+        p_j2k->cstr_index->tile_index[it_tile].marknum = 0;
+        p_j2k->cstr_index->tile_index[it_tile].marker = (opj_marker_info_t*)
+                opj_calloc(p_j2k->cstr_index->tile_index[it_tile].maxmarknum,
+                           sizeof(opj_marker_info_t));
+        if (!p_j2k->cstr_index->tile_index[it_tile].marker) {
+            return OPJ_FALSE;
         }
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_decode_tiles ( opj_j2k_t *p_j2k,
-                                                            opj_stream_private_t *p_stream,
-                                                            opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_j2k_decode_tiles(opj_j2k_t *p_j2k,
+                                     opj_stream_private_t *p_stream,
+                                     opj_event_mgr_t * p_manager)
 {
-        OPJ_BOOL l_go_on = OPJ_TRUE;
-        OPJ_UINT32 l_current_tile_no;
-        OPJ_UINT32 l_data_size,l_max_data_size;
-        OPJ_INT32 l_tile_x0,l_tile_y0,l_tile_x1,l_tile_y1;
-        OPJ_UINT32 l_nb_comps;
-        OPJ_BYTE * l_current_data;
-        OPJ_UINT32 nr_tiles = 0;
+    OPJ_BOOL l_go_on = OPJ_TRUE;
+    OPJ_UINT32 l_current_tile_no;
+    OPJ_UINT32 l_data_size, l_max_data_size;
+    OPJ_INT32 l_tile_x0, l_tile_y0, l_tile_x1, l_tile_y1;
+    OPJ_UINT32 l_nb_comps;
+    OPJ_BYTE * l_current_data;
+    OPJ_UINT32 nr_tiles = 0;
 
-        l_current_data = (OPJ_BYTE*)opj_malloc(1000);
-        if (! l_current_data) {
-                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tiles\n");
-                return OPJ_FALSE;
-        }
-        l_max_data_size = 1000;
-
-		for (;;) {
-                if (! opj_j2k_read_tile_header( p_j2k,
-                                        &l_current_tile_no,
-                                        &l_data_size,
-                                        &l_tile_x0, &l_tile_y0,
-                                        &l_tile_x1, &l_tile_y1,
-                                        &l_nb_comps,
-                                        &l_go_on,
-                                        p_stream,
-                                        p_manager)) {
-                        opj_free(l_current_data);
-                        return OPJ_FALSE;
-                }
-
-                if (! l_go_on) {
-                        break;
-                }
-
-                if (l_data_size > l_max_data_size) {
-                        OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_data_size);
-                        if (! l_new_current_data) {
-                                opj_free(l_current_data);
-                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile %d/%d\n", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
-                                return OPJ_FALSE;
-                        }
-                        l_current_data = l_new_current_data;
-                        l_max_data_size = l_data_size;
-                }
-
-                if (! opj_j2k_decode_tile(p_j2k,l_current_tile_no,l_current_data,l_data_size,p_stream,p_manager)) {
-                        opj_free(l_current_data);
-                        opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile %d/%d\n", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
-                        return OPJ_FALSE;
-                }
-                opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n", l_current_tile_no +1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
-
-                if (! opj_j2k_update_image_data(p_j2k->m_tcd,l_current_data, p_j2k->m_output_image)) {
-                        opj_free(l_current_data);
-                        return OPJ_FALSE;
-                }
-                opj_event_msg(p_manager, EVT_INFO, "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
-                
-                if(opj_stream_get_number_byte_left(p_stream) == 0  
-                    && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC)
-                    break;
-                if(++nr_tiles ==  p_j2k->m_cp.th * p_j2k->m_cp.tw) 
-                    break;
+    /* Particular case for whole single tile decoding */
+    /* We can avoid allocating intermediate tile buffers */
+    if (p_j2k->m_cp.tw == 1 && p_j2k->m_cp.th == 1 &&
+            p_j2k->m_cp.tx0 == 0 && p_j2k->m_cp.ty0 == 0 &&
+            p_j2k->m_output_image->x0 == 0 &&
+            p_j2k->m_output_image->y0 == 0 &&
+            p_j2k->m_output_image->x1 == p_j2k->m_cp.tdx &&
+            p_j2k->m_output_image->y1 == p_j2k->m_cp.tdy &&
+            p_j2k->m_output_image->comps[0].factor == 0) {
+        OPJ_UINT32 i;
+        if (! opj_j2k_read_tile_header(p_j2k,
+                                       &l_current_tile_no,
+                                       &l_data_size,
+                                       &l_tile_x0, &l_tile_y0,
+                                       &l_tile_x1, &l_tile_y1,
+                                       &l_nb_comps,
+                                       &l_go_on,
+                                       p_stream,
+                                       p_manager)) {
+            return OPJ_FALSE;
         }
 
-        opj_free(l_current_data);
+        if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, NULL, 0,
+                                  p_stream, p_manager)) {
+            opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile 1/1\n");
+            return OPJ_FALSE;
+        }
+
+        /* Transfer TCD data to output image data */
+        for (i = 0; i < p_j2k->m_output_image->numcomps; i++) {
+            opj_image_data_free(p_j2k->m_output_image->comps[i].data);
+            p_j2k->m_output_image->comps[i].data =
+                p_j2k->m_tcd->tcd_image->tiles->comps[i].data;
+            p_j2k->m_output_image->comps[i].resno_decoded =
+                p_j2k->m_tcd->image->comps[i].resno_decoded;
+            p_j2k->m_tcd->tcd_image->tiles->comps[i].data = NULL;
+        }
 
         return OPJ_TRUE;
+    }
+
+    l_current_data = (OPJ_BYTE*)opj_malloc(1000);
+    if (! l_current_data) {
+        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tiles\n");
+        return OPJ_FALSE;
+    }
+    l_max_data_size = 1000;
+
+    for (;;) {
+        if (! opj_j2k_read_tile_header(p_j2k,
+                                       &l_current_tile_no,
+                                       &l_data_size,
+                                       &l_tile_x0, &l_tile_y0,
+                                       &l_tile_x1, &l_tile_y1,
+                                       &l_nb_comps,
+                                       &l_go_on,
+                                       p_stream,
+                                       p_manager)) {
+            opj_free(l_current_data);
+            return OPJ_FALSE;
+        }
+
+        if (! l_go_on) {
+            break;
+        }
+
+        if (l_data_size > l_max_data_size) {
+            OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data,
+                                           l_data_size);
+            if (! l_new_current_data) {
+                opj_free(l_current_data);
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile %d/%d\n",
+                              l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
+                return OPJ_FALSE;
+            }
+            l_current_data = l_new_current_data;
+            l_max_data_size = l_data_size;
+        }
+
+        if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, l_current_data, l_data_size,
+                                  p_stream, p_manager)) {
+            opj_free(l_current_data);
+            opj_event_msg(p_manager, EVT_ERROR, "Failed to decode tile %d/%d\n",
+                          l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
+            return OPJ_FALSE;
+        }
+        opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n",
+                      l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
+
+        if (! opj_j2k_update_image_data(p_j2k->m_tcd, l_current_data,
+                                        p_j2k->m_output_image)) {
+            opj_free(l_current_data);
+            return OPJ_FALSE;
+        }
+        opj_event_msg(p_manager, EVT_INFO,
+                      "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
+
+        if (opj_stream_get_number_byte_left(p_stream) == 0
+                && p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_NEOC) {
+            break;
+        }
+        if (++nr_tiles ==  p_j2k->m_cp.th * p_j2k->m_cp.tw) {
+            break;
+        }
+    }
+
+    opj_free(l_current_data);
+
+    return OPJ_TRUE;
 }
 
 /**
  * Sets up the procedures to do on decoding data. Developpers wanting to extend the library can add their own reading procedures.
  */
-static OPJ_BOOL opj_j2k_setup_decoding (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_j2k_setup_decoding(opj_j2k_t *p_j2k,
+                                       opj_event_mgr_t * p_manager)
 {
-        /* preconditions*/
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions*/
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_tiles, p_manager)) {
-                return OPJ_FALSE;
-        }
-        /* DEVELOPER CORNER, add your custom procedures */
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_decode_tiles, p_manager)) {
+        return OPJ_FALSE;
+    }
+    /* DEVELOPER CORNER, add your custom procedures */
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /*
  * Read and decode one tile.
  */
-static OPJ_BOOL opj_j2k_decode_one_tile (       opj_j2k_t *p_j2k,
-                                                                            opj_stream_private_t *p_stream,
-                                                                            opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_j2k_decode_one_tile(opj_j2k_t *p_j2k,
+                                        opj_stream_private_t *p_stream,
+                                        opj_event_mgr_t * p_manager)
 {
-        OPJ_BOOL l_go_on = OPJ_TRUE;
-        OPJ_UINT32 l_current_tile_no;
-        OPJ_UINT32 l_tile_no_to_dec;
-        OPJ_UINT32 l_data_size,l_max_data_size;
-        OPJ_INT32 l_tile_x0,l_tile_y0,l_tile_x1,l_tile_y1;
-        OPJ_UINT32 l_nb_comps;
-        OPJ_BYTE * l_current_data;
+    OPJ_BOOL l_go_on = OPJ_TRUE;
+    OPJ_UINT32 l_current_tile_no;
+    OPJ_UINT32 l_tile_no_to_dec;
+    OPJ_UINT32 l_data_size, l_max_data_size;
+    OPJ_INT32 l_tile_x0, l_tile_y0, l_tile_x1, l_tile_y1;
+    OPJ_UINT32 l_nb_comps;
+    OPJ_BYTE * l_current_data;
+    OPJ_UINT32 l_nb_tiles;
+    OPJ_UINT32 i;
 
-        l_current_data = (OPJ_BYTE*)opj_malloc(1000);
-        if (! l_current_data) {
-                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode one tile\n");
+    l_current_data = (OPJ_BYTE*)opj_malloc(1000);
+    if (! l_current_data) {
+        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode one tile\n");
+        return OPJ_FALSE;
+    }
+    l_max_data_size = 1000;
+
+    /*Allocate and initialize some elements of codestrem index if not already done*/
+    if (!p_j2k->cstr_index->tile_index) {
+        if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)) {
+            opj_free(l_current_data);
+            return OPJ_FALSE;
+        }
+    }
+    /* Move into the codestream to the first SOT used to decode the desired tile */
+    l_tile_no_to_dec = (OPJ_UINT32)
+                       p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec;
+    if (p_j2k->cstr_index->tile_index)
+        if (p_j2k->cstr_index->tile_index->tp_index) {
+            if (! p_j2k->cstr_index->tile_index[l_tile_no_to_dec].nb_tps) {
+                /* the index for this tile has not been built,
+                 *  so move to the last SOT read */
+                if (!(opj_stream_read_seek(p_stream,
+                                           p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos + 2, p_manager))) {
+                    opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
+                    opj_free(l_current_data);
+                    return OPJ_FALSE;
+                }
+            } else {
+                if (!(opj_stream_read_seek(p_stream,
+                                           p_j2k->cstr_index->tile_index[l_tile_no_to_dec].tp_index[0].start_pos + 2,
+                                           p_manager))) {
+                    opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
+                    opj_free(l_current_data);
+                    return OPJ_FALSE;
+                }
+            }
+            /* Special case if we have previously read the EOC marker (if the previous tile getted is the last ) */
+            if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC) {
+                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
+            }
+        }
+
+    /* Reset current tile part number for all tiles, and not only the one */
+    /* of interest. */
+    /* Not completely sure this is always correct but required for */
+    /* ./build/bin/j2k_random_tile_access ./build/tests/tte1.j2k */
+    l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th;
+    for (i = 0; i < l_nb_tiles; ++i) {
+        p_j2k->m_cp.tcps[i].m_current_tile_part_number = -1;
+    }
+
+    for (;;) {
+        if (! opj_j2k_read_tile_header(p_j2k,
+                                       &l_current_tile_no,
+                                       &l_data_size,
+                                       &l_tile_x0, &l_tile_y0,
+                                       &l_tile_x1, &l_tile_y1,
+                                       &l_nb_comps,
+                                       &l_go_on,
+                                       p_stream,
+                                       p_manager)) {
+            opj_free(l_current_data);
+            return OPJ_FALSE;
+        }
+
+        if (! l_go_on) {
+            break;
+        }
+
+        if (l_data_size > l_max_data_size) {
+            OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data,
+                                           l_data_size);
+            if (! l_new_current_data) {
+                opj_free(l_current_data);
+                l_current_data = NULL;
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile %d/%d\n",
+                              l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
                 return OPJ_FALSE;
-        }
-        l_max_data_size = 1000;
-
-        /*Allocate and initialize some elements of codestrem index if not already done*/
-        if( !p_j2k->cstr_index->tile_index)
-        {
-                if (!opj_j2k_allocate_tile_element_cstr_index(p_j2k)){
-                        opj_free(l_current_data);
-                        return OPJ_FALSE;
-                }
-        }
-        /* Move into the codestream to the first SOT used to decode the desired tile */
-        l_tile_no_to_dec = (OPJ_UINT32)p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec;
-        if (p_j2k->cstr_index->tile_index)
-                if(p_j2k->cstr_index->tile_index->tp_index)
-                {
-                        if ( ! p_j2k->cstr_index->tile_index[l_tile_no_to_dec].nb_tps) {
-                                /* the index for this tile has not been built,
-                                 *  so move to the last SOT read */
-                                if ( !(opj_stream_read_seek(p_stream, p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos+2, p_manager)) ){
-                                        opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
-                                        opj_free(l_current_data);
-                                        return OPJ_FALSE;
-                                }
-                        }
-                        else{
-                                if ( !(opj_stream_read_seek(p_stream, p_j2k->cstr_index->tile_index[l_tile_no_to_dec].tp_index[0].start_pos+2, p_manager)) ) {
-                                        opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
-                                        opj_free(l_current_data);
-                                        return OPJ_FALSE;
-                                }
-                        }
-                        /* Special case if we have previously read the EOC marker (if the previous tile getted is the last ) */
-                        if(p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC)
-                                p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT;
-                }
-
-		for (;;) {
-                if (! opj_j2k_read_tile_header( p_j2k,
-                                        &l_current_tile_no,
-                                        &l_data_size,
-                                        &l_tile_x0, &l_tile_y0,
-                                        &l_tile_x1, &l_tile_y1,
-                                        &l_nb_comps,
-                                        &l_go_on,
-                                        p_stream,
-                                        p_manager)) {
-                        opj_free(l_current_data);
-                        return OPJ_FALSE;
-                }
-
-                if (! l_go_on) {
-                        break;
-                }
-
-                if (l_data_size > l_max_data_size) {
-                        OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_data_size);
-                        if (! l_new_current_data) {
-                                opj_free(l_current_data);
-                                l_current_data = NULL;
-                                /* TODO: LH: why tile numbering policy used in messages differs from
-                                   the one used in opj_j2k_decode_tiles() ? */
-                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to decode tile %d/%d\n", l_current_tile_no, (p_j2k->m_cp.th * p_j2k->m_cp.tw) - 1);
-                                return OPJ_FALSE;
-                        }
-                        l_current_data = l_new_current_data;
-                        l_max_data_size = l_data_size;
-                }
-
-                if (! opj_j2k_decode_tile(p_j2k,l_current_tile_no,l_current_data,l_data_size,p_stream,p_manager)) {
-                        opj_free(l_current_data);
-                        return OPJ_FALSE;
-                }
-                opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n", l_current_tile_no, (p_j2k->m_cp.th * p_j2k->m_cp.tw) - 1);
-
-                if (! opj_j2k_update_image_data(p_j2k->m_tcd,l_current_data, p_j2k->m_output_image)) {
-                        opj_free(l_current_data);
-                        return OPJ_FALSE;
-                }
-                opj_event_msg(p_manager, EVT_INFO, "Image data has been updated with tile %d.\n\n", l_current_tile_no);
-
-                if(l_current_tile_no == l_tile_no_to_dec)
-                {
-                        /* move into the codestream to the the first SOT (FIXME or not move?)*/
-                        if (!(opj_stream_read_seek(p_stream, p_j2k->cstr_index->main_head_end + 2, p_manager) ) ) {
-                                opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
-                                opj_free(l_current_data);
-                                return OPJ_FALSE;
-                        }
-                        break;
-                }
-                else {
-                        opj_event_msg(p_manager, EVT_WARNING, "Tile read, decode and updated is not the desired (%d vs %d).\n", l_current_tile_no, l_tile_no_to_dec);
-                }
-
+            }
+            l_current_data = l_new_current_data;
+            l_max_data_size = l_data_size;
         }
 
-        opj_free(l_current_data);
+        if (! opj_j2k_decode_tile(p_j2k, l_current_tile_no, l_current_data, l_data_size,
+                                  p_stream, p_manager)) {
+            opj_free(l_current_data);
+            return OPJ_FALSE;
+        }
+        opj_event_msg(p_manager, EVT_INFO, "Tile %d/%d has been decoded.\n",
+                      l_current_tile_no + 1, p_j2k->m_cp.th * p_j2k->m_cp.tw);
 
-        return OPJ_TRUE;
+        if (! opj_j2k_update_image_data(p_j2k->m_tcd, l_current_data,
+                                        p_j2k->m_output_image)) {
+            opj_free(l_current_data);
+            return OPJ_FALSE;
+        }
+        opj_event_msg(p_manager, EVT_INFO,
+                      "Image data has been updated with tile %d.\n\n", l_current_tile_no + 1);
+
+        if (l_current_tile_no == l_tile_no_to_dec) {
+            /* move into the codestream to the first SOT (FIXME or not move?)*/
+            if (!(opj_stream_read_seek(p_stream, p_j2k->cstr_index->main_head_end + 2,
+                                       p_manager))) {
+                opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n");
+                opj_free(l_current_data);
+                return OPJ_FALSE;
+            }
+            break;
+        } else {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "Tile read, decoded and updated is not the desired one (%d vs %d).\n",
+                          l_current_tile_no + 1, l_tile_no_to_dec + 1);
+        }
+
+    }
+
+    opj_free(l_current_data);
+
+    return OPJ_TRUE;
 }
 
 /**
  * Sets up the procedures to do on decoding one tile. Developpers wanting to extend the library can add their own reading procedures.
  */
-static OPJ_BOOL opj_j2k_setup_decoding_tile (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_j2k_setup_decoding_tile(opj_j2k_t *p_j2k,
+        opj_event_mgr_t * p_manager)
 {
-        /* preconditions*/
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions*/
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_one_tile, p_manager)) {
-                return OPJ_FALSE;
-        }
-        /* DEVELOPER CORNER, add your custom procedures */
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_decode_one_tile, p_manager)) {
+        return OPJ_FALSE;
+    }
+    /* DEVELOPER CORNER, add your custom procedures */
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 OPJ_BOOL opj_j2k_decode(opj_j2k_t * p_j2k,
-                                                opj_stream_private_t * p_stream,
-                                                opj_image_t * p_image,
-                                                opj_event_mgr_t * p_manager)
+                        opj_stream_private_t * p_stream,
+                        opj_image_t * p_image,
+                        opj_event_mgr_t * p_manager)
 {
-        OPJ_UINT32 compno;
+    OPJ_UINT32 compno;
 
-        if (!p_image)
-                return OPJ_FALSE;
-	
-        p_j2k->m_output_image = opj_image_create0();
-        if (! (p_j2k->m_output_image)) {
-                return OPJ_FALSE;
-        }
-        opj_copy_image_header(p_image, p_j2k->m_output_image);
+    if (!p_image) {
+        return OPJ_FALSE;
+    }
 
-        /* customization of the decoding */
-        opj_j2k_setup_decoding(p_j2k, p_manager);
+    p_j2k->m_output_image = opj_image_create0();
+    if (!(p_j2k->m_output_image)) {
+        return OPJ_FALSE;
+    }
+    opj_copy_image_header(p_image, p_j2k->m_output_image);
 
-        /* Decode the codestream */
-        if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
-                opj_image_destroy(p_j2k->m_private_image);
-                p_j2k->m_private_image = NULL;
-                return OPJ_FALSE;
-        }
+    /* customization of the decoding */
+    if (!opj_j2k_setup_decoding(p_j2k, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        /* Move data and copy one information from codec to output image*/
-        for (compno = 0; compno < p_image->numcomps; compno++) {
-                p_image->comps[compno].resno_decoded = p_j2k->m_output_image->comps[compno].resno_decoded;
-                p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
+    /* Decode the codestream */
+    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
+        opj_image_destroy(p_j2k->m_private_image);
+        p_j2k->m_private_image = NULL;
+        return OPJ_FALSE;
+    }
+
+    /* Move data and copy one information from codec to output image*/
+    for (compno = 0; compno < p_image->numcomps; compno++) {
+        p_image->comps[compno].resno_decoded =
+            p_j2k->m_output_image->comps[compno].resno_decoded;
+        p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
 #if 0
-                char fn[256];
-                sprintf( fn, "/tmp/%d.raw", compno );
-                FILE *debug = fopen( fn, "wb" );
-                fwrite( p_image->comps[compno].data, sizeof(OPJ_INT32), p_image->comps[compno].w * p_image->comps[compno].h, debug );
-                fclose( debug );
+        char fn[256];
+        sprintf(fn, "/tmp/%d.raw", compno);
+        FILE *debug = fopen(fn, "wb");
+        fwrite(p_image->comps[compno].data, sizeof(OPJ_INT32),
+               p_image->comps[compno].w * p_image->comps[compno].h, debug);
+        fclose(debug);
 #endif
-                p_j2k->m_output_image->comps[compno].data = NULL;
-        }
+        p_j2k->m_output_image->comps[compno].data = NULL;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_j2k_get_tile(      opj_j2k_t *p_j2k,
-                                                    opj_stream_private_t *p_stream,
-                                                    opj_image_t* p_image,
-                                                    opj_event_mgr_t * p_manager,
-                                                    OPJ_UINT32 tile_index )
+OPJ_BOOL opj_j2k_get_tile(opj_j2k_t *p_j2k,
+                          opj_stream_private_t *p_stream,
+                          opj_image_t* p_image,
+                          opj_event_mgr_t * p_manager,
+                          OPJ_UINT32 tile_index)
 {
-        OPJ_UINT32 compno;
-        OPJ_UINT32 l_tile_x, l_tile_y;
-        opj_image_comp_t* l_img_comp;
+    OPJ_UINT32 compno;
+    OPJ_UINT32 l_tile_x, l_tile_y;
+    opj_image_comp_t* l_img_comp;
 
-        if (!p_image) {
-                opj_event_msg(p_manager, EVT_ERROR, "We need an image previously created.\n");
-                return OPJ_FALSE;
+    if (!p_image) {
+        opj_event_msg(p_manager, EVT_ERROR, "We need an image previously created.\n");
+        return OPJ_FALSE;
+    }
+
+    if (/*(tile_index < 0) &&*/ (tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th)) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Tile index provided by the user is incorrect %d (max = %d) \n", tile_index,
+                      (p_j2k->m_cp.tw * p_j2k->m_cp.th) - 1);
+        return OPJ_FALSE;
+    }
+
+    /* Compute the dimension of the desired tile*/
+    l_tile_x = tile_index % p_j2k->m_cp.tw;
+    l_tile_y = tile_index / p_j2k->m_cp.tw;
+
+    p_image->x0 = l_tile_x * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
+    if (p_image->x0 < p_j2k->m_private_image->x0) {
+        p_image->x0 = p_j2k->m_private_image->x0;
+    }
+    p_image->x1 = (l_tile_x + 1) * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
+    if (p_image->x1 > p_j2k->m_private_image->x1) {
+        p_image->x1 = p_j2k->m_private_image->x1;
+    }
+
+    p_image->y0 = l_tile_y * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
+    if (p_image->y0 < p_j2k->m_private_image->y0) {
+        p_image->y0 = p_j2k->m_private_image->y0;
+    }
+    p_image->y1 = (l_tile_y + 1) * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
+    if (p_image->y1 > p_j2k->m_private_image->y1) {
+        p_image->y1 = p_j2k->m_private_image->y1;
+    }
+
+    l_img_comp = p_image->comps;
+    for (compno = 0; compno < p_image->numcomps; ++compno) {
+        OPJ_INT32 l_comp_x1, l_comp_y1;
+
+        l_img_comp->factor = p_j2k->m_private_image->comps[compno].factor;
+
+        l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
+        l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
+        l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
+        l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
+
+        l_img_comp->w = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_x1,
+                                     (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0,
+                                             (OPJ_INT32)l_img_comp->factor));
+        l_img_comp->h = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_y1,
+                                     (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0,
+                                             (OPJ_INT32)l_img_comp->factor));
+
+        l_img_comp++;
+    }
+
+    /* Destroy the previous output image*/
+    if (p_j2k->m_output_image) {
+        opj_image_destroy(p_j2k->m_output_image);
+    }
+
+    /* Create the ouput image from the information previously computed*/
+    p_j2k->m_output_image = opj_image_create0();
+    if (!(p_j2k->m_output_image)) {
+        return OPJ_FALSE;
+    }
+    opj_copy_image_header(p_image, p_j2k->m_output_image);
+
+    p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = (OPJ_INT32)tile_index;
+
+    /* customization of the decoding */
+    if (!opj_j2k_setup_decoding_tile(p_j2k, p_manager)) {
+        return OPJ_FALSE;
+    }
+
+    /* Decode the codestream */
+    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
+        opj_image_destroy(p_j2k->m_private_image);
+        p_j2k->m_private_image = NULL;
+        return OPJ_FALSE;
+    }
+
+    /* Move data and copy one information from codec to output image*/
+    for (compno = 0; compno < p_image->numcomps; compno++) {
+        p_image->comps[compno].resno_decoded =
+            p_j2k->m_output_image->comps[compno].resno_decoded;
+
+        if (p_image->comps[compno].data) {
+            opj_image_data_free(p_image->comps[compno].data);
         }
 
-        if ( /*(tile_index < 0) &&*/ (tile_index >= p_j2k->m_cp.tw * p_j2k->m_cp.th) ){
-                opj_event_msg(p_manager, EVT_ERROR, "Tile index provided by the user is incorrect %d (max = %d) \n", tile_index, (p_j2k->m_cp.tw * p_j2k->m_cp.th) - 1);
-                return OPJ_FALSE;
-        }
+        p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
 
-        /* Compute the dimension of the desired tile*/
-        l_tile_x = tile_index % p_j2k->m_cp.tw;
-        l_tile_y = tile_index / p_j2k->m_cp.tw;
+        p_j2k->m_output_image->comps[compno].data = NULL;
+    }
 
-        p_image->x0 = l_tile_x * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
-        if (p_image->x0 < p_j2k->m_private_image->x0)
-                p_image->x0 = p_j2k->m_private_image->x0;
-        p_image->x1 = (l_tile_x + 1) * p_j2k->m_cp.tdx + p_j2k->m_cp.tx0;
-        if (p_image->x1 > p_j2k->m_private_image->x1)
-                p_image->x1 = p_j2k->m_private_image->x1;
-
-        p_image->y0 = l_tile_y * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
-        if (p_image->y0 < p_j2k->m_private_image->y0)
-                p_image->y0 = p_j2k->m_private_image->y0;
-        p_image->y1 = (l_tile_y + 1) * p_j2k->m_cp.tdy + p_j2k->m_cp.ty0;
-        if (p_image->y1 > p_j2k->m_private_image->y1)
-                p_image->y1 = p_j2k->m_private_image->y1;
-
-        l_img_comp = p_image->comps;
-        for (compno=0; compno < p_image->numcomps; ++compno)
-        {
-                OPJ_INT32 l_comp_x1, l_comp_y1;
-
-                l_img_comp->factor = p_j2k->m_private_image->comps[compno].factor;
-
-                l_img_comp->x0 = opj_uint_ceildiv(p_image->x0, l_img_comp->dx);
-                l_img_comp->y0 = opj_uint_ceildiv(p_image->y0, l_img_comp->dy);
-                l_comp_x1 = opj_int_ceildiv((OPJ_INT32)p_image->x1, (OPJ_INT32)l_img_comp->dx);
-                l_comp_y1 = opj_int_ceildiv((OPJ_INT32)p_image->y1, (OPJ_INT32)l_img_comp->dy);
-
-                l_img_comp->w = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_x1, (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->x0, (OPJ_INT32)l_img_comp->factor));
-                l_img_comp->h = (OPJ_UINT32)(opj_int_ceildivpow2(l_comp_y1, (OPJ_INT32)l_img_comp->factor) - opj_int_ceildivpow2((OPJ_INT32)l_img_comp->y0, (OPJ_INT32)l_img_comp->factor));
-
-                l_img_comp++;
-        }
-
-        /* Destroy the previous output image*/
-        if (p_j2k->m_output_image)
-                opj_image_destroy(p_j2k->m_output_image);
-
-        /* Create the ouput image from the information previously computed*/
-        p_j2k->m_output_image = opj_image_create0();
-        if (! (p_j2k->m_output_image)) {
-                return OPJ_FALSE;
-        }
-        opj_copy_image_header(p_image, p_j2k->m_output_image);
-
-        p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = (OPJ_INT32)tile_index;
-
-        /* customization of the decoding */
-        opj_j2k_setup_decoding_tile(p_j2k, p_manager);
-
-        /* Decode the codestream */
-        if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
-                opj_image_destroy(p_j2k->m_private_image);
-                p_j2k->m_private_image = NULL;
-                return OPJ_FALSE;
-        }
-
-        /* Move data and copy one information from codec to output image*/
-        for (compno = 0; compno < p_image->numcomps; compno++) {
-                p_image->comps[compno].resno_decoded = p_j2k->m_output_image->comps[compno].resno_decoded;
-
-                if (p_image->comps[compno].data)
-                        opj_free(p_image->comps[compno].data);
-
-                p_image->comps[compno].data = p_j2k->m_output_image->comps[compno].data;
-
-                p_j2k->m_output_image->comps[compno].data = NULL;
-        }
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 OPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k,
-                                               OPJ_UINT32 res_factor,
-                                               opj_event_mgr_t * p_manager)
+        OPJ_UINT32 res_factor,
+        opj_event_mgr_t * p_manager)
 {
-        OPJ_UINT32 it_comp;
+    OPJ_UINT32 it_comp;
 
-        p_j2k->m_cp.m_specific_param.m_dec.m_reduce = res_factor;
+    p_j2k->m_cp.m_specific_param.m_dec.m_reduce = res_factor;
 
-        if (p_j2k->m_private_image) {
-                if (p_j2k->m_private_image->comps) {
-                        if (p_j2k->m_specific_param.m_decoder.m_default_tcp) {
-                                if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps) {
-                                        for (it_comp = 0 ; it_comp < p_j2k->m_private_image->numcomps; it_comp++) {
-                                                OPJ_UINT32 max_res = p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[it_comp].numresolutions;
-                                                if ( res_factor >= max_res){
-                                                        opj_event_msg(p_manager, EVT_ERROR, "Resolution factor is greater than the maximum resolution in the component.\n");
-                                                        return OPJ_FALSE;
-                                                }
-                                                p_j2k->m_private_image->comps[it_comp].factor = res_factor;
-                                        }
-                                        return OPJ_TRUE;
-                                }
+    if (p_j2k->m_private_image) {
+        if (p_j2k->m_private_image->comps) {
+            if (p_j2k->m_specific_param.m_decoder.m_default_tcp) {
+                if (p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps) {
+                    for (it_comp = 0 ; it_comp < p_j2k->m_private_image->numcomps; it_comp++) {
+                        OPJ_UINT32 max_res =
+                            p_j2k->m_specific_param.m_decoder.m_default_tcp->tccps[it_comp].numresolutions;
+                        if (res_factor >= max_res) {
+                            opj_event_msg(p_manager, EVT_ERROR,
+                                          "Resolution factor is greater than the maximum resolution in the component.\n");
+                            return OPJ_FALSE;
                         }
+                        p_j2k->m_private_image->comps[it_comp].factor = res_factor;
+                    }
+                    return OPJ_TRUE;
                 }
+            }
         }
+    }
 
-        return OPJ_FALSE;
+    return OPJ_FALSE;
 }
 
 OPJ_BOOL opj_j2k_encode(opj_j2k_t * p_j2k,
                         opj_stream_private_t *p_stream,
-                        opj_event_mgr_t * p_manager )
+                        opj_event_mgr_t * p_manager)
 {
-        OPJ_UINT32 i, j;
-        OPJ_UINT32 l_nb_tiles;
-        OPJ_UINT32 l_max_tile_size = 0, l_current_tile_size;
-        OPJ_BYTE * l_current_data = 00;
-        opj_tcd_t* p_tcd = 00;
+    OPJ_UINT32 i, j;
+    OPJ_UINT32 l_nb_tiles;
+    OPJ_UINT32 l_max_tile_size = 0, l_current_tile_size;
+    OPJ_BYTE * l_current_data = 00;
+    OPJ_BOOL l_reuse_data = OPJ_FALSE;
+    opj_tcd_t* p_tcd = 00;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_stream != 00);
-        assert(p_manager != 00);
-	
-        p_tcd = p_j2k->m_tcd;
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_stream != 00);
+    assert(p_manager != 00);
 
-        l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
-        for (i=0;i<l_nb_tiles;++i) {
-                if (! opj_j2k_pre_write_tile(p_j2k,i,p_stream,p_manager)) {
-                        if (l_current_data) {
-                                opj_free(l_current_data);
-                        }
-                        return OPJ_FALSE;
-                }
+    p_tcd = p_j2k->m_tcd;
 
-                /* if we only have one tile, then simply set tile component data equal to image component data */
-                /* otherwise, allocate the data */
-                for (j=0;j<p_j2k->m_tcd->image->numcomps;++j) {
-                        opj_tcd_tilecomp_t* l_tilec = p_tcd->tcd_image->tiles->comps + j;
-                        if (l_nb_tiles == 1) {
-												        opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
-												        l_tilec->data  =  l_img_comp->data;
-												        l_tilec->ownsData = OPJ_FALSE;
-                        } else {
-												        if(! opj_alloc_tile_component_data(l_tilec)) {
-												                opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data." );
-												                if (l_current_data) {
-												                        opj_free(l_current_data);
-												                }
-												                return OPJ_FALSE;
-												        }
-                        }
-                }
-                l_current_tile_size = opj_tcd_get_encoded_tile_size(p_j2k->m_tcd);
-                if (l_nb_tiles > 1) {
-                        if (l_current_tile_size > l_max_tile_size) {
-												        OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data, l_current_tile_size);
-												        if (! l_new_current_data) {
-												                if (l_current_data) {
-												                        opj_free(l_current_data);
-												                }
-												                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to encode all tiles\n");
-												                return OPJ_FALSE;
-																}
-																l_current_data = l_new_current_data;
-																l_max_tile_size = l_current_tile_size;
-                        }
-
-                        /* copy image data (32 bit) to l_current_data as contiguous, all-component, zero offset buffer */
-                        /* 32 bit components @ 8 bit precision get converted to 8 bit */
-                        /* 32 bit components @ 16 bit precision get converted to 16 bit */
-                        opj_j2k_get_tile_data(p_j2k->m_tcd,l_current_data);
-
-                        /* now copy this data into the tile component */
-                        if (! opj_tcd_copy_tile_data(p_j2k->m_tcd,l_current_data,l_current_tile_size)) {
-																opj_event_msg(p_manager, EVT_ERROR, "Size mismatch between tile data and sent data." );
-																opj_free(l_current_data);
-																return OPJ_FALSE;
-                        }
-                }
-
-                if (! opj_j2k_post_write_tile (p_j2k,p_stream,p_manager)) {
-                        if (l_current_data) {
-                                opj_free(l_current_data);
-                        }
-                        return OPJ_FALSE;
-                }
+    l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw;
+    if (l_nb_tiles == 1) {
+        l_reuse_data = OPJ_TRUE;
+#ifdef __SSE__
+        for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
+            opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
+            if (((size_t)l_img_comp->data & 0xFU) !=
+                    0U) { /* tile data shall be aligned on 16 bytes */
+                l_reuse_data = OPJ_FALSE;
+            }
         }
-
-        if (l_current_data) {
+#endif
+    }
+    for (i = 0; i < l_nb_tiles; ++i) {
+        if (! opj_j2k_pre_write_tile(p_j2k, i, p_stream, p_manager)) {
+            if (l_current_data) {
                 opj_free(l_current_data);
+            }
+            return OPJ_FALSE;
         }
-        return OPJ_TRUE;
+
+        /* if we only have one tile, then simply set tile component data equal to image component data */
+        /* otherwise, allocate the data */
+        for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
+            opj_tcd_tilecomp_t* l_tilec = p_tcd->tcd_image->tiles->comps + j;
+            if (l_reuse_data) {
+                opj_image_comp_t * l_img_comp = p_tcd->image->comps + j;
+                l_tilec->data  =  l_img_comp->data;
+                l_tilec->ownsData = OPJ_FALSE;
+            } else {
+                if (! opj_alloc_tile_component_data(l_tilec)) {
+                    opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data.");
+                    if (l_current_data) {
+                        opj_free(l_current_data);
+                    }
+                    return OPJ_FALSE;
+                }
+            }
+        }
+        l_current_tile_size = opj_tcd_get_encoded_tile_size(p_j2k->m_tcd);
+        if (!l_reuse_data) {
+            if (l_current_tile_size > l_max_tile_size) {
+                OPJ_BYTE *l_new_current_data = (OPJ_BYTE *) opj_realloc(l_current_data,
+                                               l_current_tile_size);
+                if (! l_new_current_data) {
+                    if (l_current_data) {
+                        opj_free(l_current_data);
+                    }
+                    opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to encode all tiles\n");
+                    return OPJ_FALSE;
+                }
+                l_current_data = l_new_current_data;
+                l_max_tile_size = l_current_tile_size;
+            }
+
+            /* copy image data (32 bit) to l_current_data as contiguous, all-component, zero offset buffer */
+            /* 32 bit components @ 8 bit precision get converted to 8 bit */
+            /* 32 bit components @ 16 bit precision get converted to 16 bit */
+            opj_j2k_get_tile_data(p_j2k->m_tcd, l_current_data);
+
+            /* now copy this data into the tile component */
+            if (! opj_tcd_copy_tile_data(p_j2k->m_tcd, l_current_data,
+                                         l_current_tile_size)) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Size mismatch between tile data and sent data.");
+                opj_free(l_current_data);
+                return OPJ_FALSE;
+            }
+        }
+
+        if (! opj_j2k_post_write_tile(p_j2k, p_stream, p_manager)) {
+            if (l_current_data) {
+                opj_free(l_current_data);
+            }
+            return OPJ_FALSE;
+        }
+    }
+
+    if (l_current_data) {
+        opj_free(l_current_data);
+    }
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_j2k_end_compress(  opj_j2k_t *p_j2k,
-                                                        opj_stream_private_t *p_stream,
-                                                        opj_event_mgr_t * p_manager)
+OPJ_BOOL opj_j2k_end_compress(opj_j2k_t *p_j2k,
+                              opj_stream_private_t *p_stream,
+                              opj_event_mgr_t * p_manager)
 {
-        /* customization of the encoding */
-        if (! opj_j2k_setup_end_compress(p_j2k, p_manager)) {
-                return OPJ_FALSE;
-        }
+    /* customization of the encoding */
+    if (! opj_j2k_setup_end_compress(p_j2k, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        if (! opj_j2k_exec (p_j2k, p_j2k->m_procedure_list, p_stream, p_manager))
-        {
-                return OPJ_FALSE;
-        }
+    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k,
-                                                            opj_stream_private_t *p_stream,
-                                                            opj_image_t * p_image,
-                                                            opj_event_mgr_t * p_manager)
+                                opj_stream_private_t *p_stream,
+                                opj_image_t * p_image,
+                                opj_event_mgr_t * p_manager)
 {
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_stream != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_stream != 00);
+    assert(p_manager != 00);
 
-        p_j2k->m_private_image = opj_image_create0();
-        if (! p_j2k->m_private_image) {
-                opj_event_msg(p_manager, EVT_ERROR, "Failed to allocate image header." );
-                return OPJ_FALSE;
+    p_j2k->m_private_image = opj_image_create0();
+    if (! p_j2k->m_private_image) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to allocate image header.");
+        return OPJ_FALSE;
+    }
+    opj_copy_image_header(p_image, p_j2k->m_private_image);
+
+    /* TODO_MSD: Find a better way */
+    if (p_image->comps) {
+        OPJ_UINT32 it_comp;
+        for (it_comp = 0 ; it_comp < p_image->numcomps; it_comp++) {
+            if (p_image->comps[it_comp].data) {
+                p_j2k->m_private_image->comps[it_comp].data = p_image->comps[it_comp].data;
+                p_image->comps[it_comp].data = NULL;
+
+            }
         }
-        opj_copy_image_header(p_image, p_j2k->m_private_image);
+    }
 
-        /* TODO_MSD: Find a better way */
-        if (p_image->comps) {
-                OPJ_UINT32 it_comp;
-                for (it_comp = 0 ; it_comp < p_image->numcomps; it_comp++) {
-                        if (p_image->comps[it_comp].data) {
-                                p_j2k->m_private_image->comps[it_comp].data =p_image->comps[it_comp].data;
-                                p_image->comps[it_comp].data = NULL;
+    /* customization of the validation */
+    if (! opj_j2k_setup_encoding_validation(p_j2k, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-                        }
-                }
-        }
+    /* validation of the parameters codec */
+    if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        /* customization of the validation */
-        if (! opj_j2k_setup_encoding_validation (p_j2k, p_manager)) {
-                return OPJ_FALSE;
-        }
+    /* customization of the encoding */
+    if (! opj_j2k_setup_header_writing(p_j2k, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        /* validation of the parameters codec */
-        if (! opj_j2k_exec(p_j2k,p_j2k->m_validation_list,p_stream,p_manager)) {
-                return OPJ_FALSE;
-        }
+    /* write header */
+    if (! opj_j2k_exec(p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        /* customization of the encoding */
-        if (! opj_j2k_setup_header_writing(p_j2k, p_manager)) {
-                return OPJ_FALSE;
-        }
-
-        /* write header */
-        if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) {
-                return OPJ_FALSE;
-        }
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_pre_write_tile (       opj_j2k_t * p_j2k,
-                                                                OPJ_UINT32 p_tile_index,
-                                                                opj_stream_private_t *p_stream,
-                                                                opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_pre_write_tile(opj_j2k_t * p_j2k,
+                                       OPJ_UINT32 p_tile_index,
+                                       opj_stream_private_t *p_stream,
+                                       opj_event_mgr_t * p_manager)
 {
-  (void)p_stream;
-        if (p_tile_index != p_j2k->m_current_tile_number) {
-                opj_event_msg(p_manager, EVT_ERROR, "The given tile index does not match." );
-                return OPJ_FALSE;
-        }
+    (void)p_stream;
+    if (p_tile_index != p_j2k->m_current_tile_number) {
+        opj_event_msg(p_manager, EVT_ERROR, "The given tile index does not match.");
+        return OPJ_FALSE;
+    }
 
-        opj_event_msg(p_manager, EVT_INFO, "tile number %d / %d\n", p_j2k->m_current_tile_number + 1, p_j2k->m_cp.tw * p_j2k->m_cp.th);
+    opj_event_msg(p_manager, EVT_INFO, "tile number %d / %d\n",
+                  p_j2k->m_current_tile_number + 1, p_j2k->m_cp.tw * p_j2k->m_cp.th);
 
-        p_j2k->m_specific_param.m_encoder.m_current_tile_part_number = 0;
-        p_j2k->m_tcd->cur_totnum_tp = p_j2k->m_cp.tcps[p_tile_index].m_nb_tile_parts;
-        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
+    p_j2k->m_specific_param.m_encoder.m_current_tile_part_number = 0;
+    p_j2k->m_tcd->cur_totnum_tp = p_j2k->m_cp.tcps[p_tile_index].m_nb_tile_parts;
+    p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
 
-        /* initialisation before tile encoding  */
-        if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number, p_manager)) {
-                return OPJ_FALSE;
-        }
+    /* initialisation before tile encoding  */
+    if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number,
+                                   p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 static void opj_get_tile_dimensions(opj_image_t * l_image,
-                             opj_tcd_tilecomp_t * l_tilec,
-                             opj_image_comp_t * l_img_comp,
-                             OPJ_UINT32* l_size_comp,
-                             OPJ_UINT32* l_width,
-                             OPJ_UINT32* l_height,
-                             OPJ_UINT32* l_offset_x,
-                             OPJ_UINT32* l_offset_y,
-                             OPJ_UINT32* l_image_width,
-                             OPJ_UINT32* l_stride,
-                             OPJ_UINT32* l_tile_offset) {
-	OPJ_UINT32 l_remaining;
-	*l_size_comp = l_img_comp->prec >> 3; /* (/8) */
-	l_remaining = l_img_comp->prec & 7;  /* (%8) */
-	if (l_remaining) {
-		*l_size_comp += 1;
-	}
+                                    opj_tcd_tilecomp_t * l_tilec,
+                                    opj_image_comp_t * l_img_comp,
+                                    OPJ_UINT32* l_size_comp,
+                                    OPJ_UINT32* l_width,
+                                    OPJ_UINT32* l_height,
+                                    OPJ_UINT32* l_offset_x,
+                                    OPJ_UINT32* l_offset_y,
+                                    OPJ_UINT32* l_image_width,
+                                    OPJ_UINT32* l_stride,
+                                    OPJ_UINT32* l_tile_offset)
+{
+    OPJ_UINT32 l_remaining;
+    *l_size_comp = l_img_comp->prec >> 3; /* (/8) */
+    l_remaining = l_img_comp->prec & 7;  /* (%8) */
+    if (l_remaining) {
+        *l_size_comp += 1;
+    }
 
-	if (*l_size_comp == 3) {
-		*l_size_comp = 4;
-	}
+    if (*l_size_comp == 3) {
+        *l_size_comp = 4;
+    }
 
-	*l_width  = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
-	*l_height = (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);
-	*l_offset_x = opj_uint_ceildiv(l_image->x0, l_img_comp->dx);
-	*l_offset_y = opj_uint_ceildiv(l_image->y0, l_img_comp->dy);
-	*l_image_width = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x1 - (OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);
-	*l_stride = *l_image_width - *l_width;
-	*l_tile_offset = ((OPJ_UINT32)l_tilec->x0 - *l_offset_x) + ((OPJ_UINT32)l_tilec->y0 - *l_offset_y) * *l_image_width;
+    *l_width  = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
+    *l_height = (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);
+    *l_offset_x = opj_uint_ceildiv(l_image->x0, l_img_comp->dx);
+    *l_offset_y = opj_uint_ceildiv(l_image->y0, l_img_comp->dy);
+    *l_image_width = (OPJ_UINT32)opj_int_ceildiv((OPJ_INT32)l_image->x1 -
+                     (OPJ_INT32)l_image->x0, (OPJ_INT32)l_img_comp->dx);
+    *l_stride = *l_image_width - *l_width;
+    *l_tile_offset = ((OPJ_UINT32)l_tilec->x0 - *l_offset_x) + ((
+                         OPJ_UINT32)l_tilec->y0 - *l_offset_y) * *l_image_width;
 }
 
-static void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data)
+static void opj_j2k_get_tile_data(opj_tcd_t * p_tcd, OPJ_BYTE * p_data)
 {
-        OPJ_UINT32 i,j,k = 0;
+    OPJ_UINT32 i, j, k = 0;
 
-        for (i=0;i<p_tcd->image->numcomps;++i) {
-                opj_image_t * l_image =  p_tcd->image;
-                OPJ_INT32 * l_src_ptr;
-                opj_tcd_tilecomp_t * l_tilec = p_tcd->tcd_image->tiles->comps + i;
-                opj_image_comp_t * l_img_comp = l_image->comps + i;
-                OPJ_UINT32 l_size_comp,l_width,l_height,l_offset_x,l_offset_y, l_image_width,l_stride,l_tile_offset;
+    for (i = 0; i < p_tcd->image->numcomps; ++i) {
+        opj_image_t * l_image =  p_tcd->image;
+        OPJ_INT32 * l_src_ptr;
+        opj_tcd_tilecomp_t * l_tilec = p_tcd->tcd_image->tiles->comps + i;
+        opj_image_comp_t * l_img_comp = l_image->comps + i;
+        OPJ_UINT32 l_size_comp, l_width, l_height, l_offset_x, l_offset_y,
+                   l_image_width, l_stride, l_tile_offset;
 
-                opj_get_tile_dimensions(l_image,
-                                        l_tilec,
-                                        l_img_comp,
-                                        &l_size_comp,
-                                        &l_width,
-                                        &l_height,
-                                        &l_offset_x,
-                                        &l_offset_y,
-                                        &l_image_width,
-                                        &l_stride,
-                                        &l_tile_offset);
+        opj_get_tile_dimensions(l_image,
+                                l_tilec,
+                                l_img_comp,
+                                &l_size_comp,
+                                &l_width,
+                                &l_height,
+                                &l_offset_x,
+                                &l_offset_y,
+                                &l_image_width,
+                                &l_stride,
+                                &l_tile_offset);
 
-                l_src_ptr = l_img_comp->data + l_tile_offset;
+        l_src_ptr = l_img_comp->data + l_tile_offset;
 
-                switch (l_size_comp) {
-                        case 1:
-                                {
-                                        OPJ_CHAR * l_dest_ptr = (OPJ_CHAR*) p_data;
-                                        if (l_img_comp->sgnd) {
-                                                for     (j=0;j<l_height;++j) {
-                                                        for (k=0;k<l_width;++k) {
-                                                                *(l_dest_ptr) = (OPJ_CHAR) (*l_src_ptr);
-                                                                ++l_dest_ptr;
-                                                                ++l_src_ptr;
-                                                        }
-                                                        l_src_ptr += l_stride;
-                                                }
-                                        }
-                                        else {
-                                                for (j=0;j<l_height;++j) {
-                                                        for (k=0;k<l_width;++k) {
-                                                                *(l_dest_ptr) = (OPJ_CHAR)((*l_src_ptr)&0xff);
-                                                                ++l_dest_ptr;
-                                                                ++l_src_ptr;
-                                                        }
-                                                        l_src_ptr += l_stride;
-                                                }
-                                        }
-
-                                        p_data = (OPJ_BYTE*) l_dest_ptr;
-                                }
-                                break;
-                        case 2:
-                                {
-                                        OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_data;
-                                        if (l_img_comp->sgnd) {
-                                                for (j=0;j<l_height;++j) {
-                                                        for (k=0;k<l_width;++k) {
-                                                                *(l_dest_ptr++) = (OPJ_INT16) (*(l_src_ptr++));
-                                                        }
-                                                        l_src_ptr += l_stride;
-                                                }
-                                        }
-                                        else {
-                                                for (j=0;j<l_height;++j) {
-                                                        for (k=0;k<l_width;++k) {
-                                                                *(l_dest_ptr++) = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff);
-                                                        }
-                                                        l_src_ptr += l_stride;
-                                                }
-                                        }
-
-                                        p_data = (OPJ_BYTE*) l_dest_ptr;
-                                }
-                                break;
-                        case 4:
-                                {
-                                        OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_data;
-                                        for (j=0;j<l_height;++j) {
-                                                for (k=0;k<l_width;++k) {
-                                                        *(l_dest_ptr++) = *(l_src_ptr++);
-                                                }
-                                                l_src_ptr += l_stride;
-                                        }
-
-                                        p_data = (OPJ_BYTE*) l_dest_ptr;
-                                }
-                                break;
+        switch (l_size_comp) {
+        case 1: {
+            OPJ_CHAR * l_dest_ptr = (OPJ_CHAR*) p_data;
+            if (l_img_comp->sgnd) {
+                for (j = 0; j < l_height; ++j) {
+                    for (k = 0; k < l_width; ++k) {
+                        *(l_dest_ptr) = (OPJ_CHAR)(*l_src_ptr);
+                        ++l_dest_ptr;
+                        ++l_src_ptr;
+                    }
+                    l_src_ptr += l_stride;
                 }
+            } else {
+                for (j = 0; j < l_height; ++j) {
+                    for (k = 0; k < l_width; ++k) {
+                        *(l_dest_ptr) = (OPJ_CHAR)((*l_src_ptr) & 0xff);
+                        ++l_dest_ptr;
+                        ++l_src_ptr;
+                    }
+                    l_src_ptr += l_stride;
+                }
+            }
+
+            p_data = (OPJ_BYTE*) l_dest_ptr;
         }
+        break;
+        case 2: {
+            OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_data;
+            if (l_img_comp->sgnd) {
+                for (j = 0; j < l_height; ++j) {
+                    for (k = 0; k < l_width; ++k) {
+                        *(l_dest_ptr++) = (OPJ_INT16)(*(l_src_ptr++));
+                    }
+                    l_src_ptr += l_stride;
+                }
+            } else {
+                for (j = 0; j < l_height; ++j) {
+                    for (k = 0; k < l_width; ++k) {
+                        *(l_dest_ptr++) = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff);
+                    }
+                    l_src_ptr += l_stride;
+                }
+            }
+
+            p_data = (OPJ_BYTE*) l_dest_ptr;
+        }
+        break;
+        case 4: {
+            OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_data;
+            for (j = 0; j < l_height; ++j) {
+                for (k = 0; k < l_width; ++k) {
+                    *(l_dest_ptr++) = *(l_src_ptr++);
+                }
+                l_src_ptr += l_stride;
+            }
+
+            p_data = (OPJ_BYTE*) l_dest_ptr;
+        }
+        break;
+        }
+    }
 }
 
-static OPJ_BOOL opj_j2k_post_write_tile (      opj_j2k_t * p_j2k,
-                                                                opj_stream_private_t *p_stream,
-                                                                opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_j2k_post_write_tile(opj_j2k_t * p_j2k,
+                                        opj_stream_private_t *p_stream,
+                                        opj_event_mgr_t * p_manager)
 {
-        OPJ_UINT32 l_nb_bytes_written;
-        OPJ_BYTE * l_current_data = 00;
-        OPJ_UINT32 l_tile_size = 0;
-        OPJ_UINT32 l_available_data;
+    OPJ_UINT32 l_nb_bytes_written;
+    OPJ_BYTE * l_current_data = 00;
+    OPJ_UINT32 l_tile_size = 0;
+    OPJ_UINT32 l_available_data;
 
-        /* preconditions */
-        assert(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
+    /* preconditions */
+    assert(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
 
-        l_tile_size = p_j2k->m_specific_param.m_encoder.m_encoded_tile_size;
-        l_available_data = l_tile_size;
-        l_current_data = p_j2k->m_specific_param.m_encoder.m_encoded_tile_data;
+    l_tile_size = p_j2k->m_specific_param.m_encoder.m_encoded_tile_size;
+    l_available_data = l_tile_size;
+    l_current_data = p_j2k->m_specific_param.m_encoder.m_encoded_tile_data;
 
-        l_nb_bytes_written = 0;
-        if (! opj_j2k_write_first_tile_part(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager)) {
-                return OPJ_FALSE;
-        }
-        l_current_data += l_nb_bytes_written;
-        l_available_data -= l_nb_bytes_written;
+    l_nb_bytes_written = 0;
+    if (! opj_j2k_write_first_tile_part(p_j2k, l_current_data, &l_nb_bytes_written,
+                                        l_available_data, p_stream, p_manager)) {
+        return OPJ_FALSE;
+    }
+    l_current_data += l_nb_bytes_written;
+    l_available_data -= l_nb_bytes_written;
 
-        l_nb_bytes_written = 0;
-        if (! opj_j2k_write_all_tile_parts(p_j2k,l_current_data,&l_nb_bytes_written,l_available_data,p_stream,p_manager)) {
-                return OPJ_FALSE;
-        }
+    l_nb_bytes_written = 0;
+    if (! opj_j2k_write_all_tile_parts(p_j2k, l_current_data, &l_nb_bytes_written,
+                                       l_available_data, p_stream, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        l_available_data -= l_nb_bytes_written;
-        l_nb_bytes_written = l_tile_size - l_available_data;
+    l_available_data -= l_nb_bytes_written;
+    l_nb_bytes_written = l_tile_size - l_available_data;
 
-        if ( opj_stream_write_data(     p_stream,
-                                                                p_j2k->m_specific_param.m_encoder.m_encoded_tile_data,
-                                                                l_nb_bytes_written,p_manager) != l_nb_bytes_written) {
-                return OPJ_FALSE;
-        }
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_encoded_tile_data,
+                              l_nb_bytes_written, p_manager) != l_nb_bytes_written) {
+        return OPJ_FALSE;
+    }
 
-        ++p_j2k->m_current_tile_number;
+    ++p_j2k->m_current_tile_number;
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_setup_end_compress (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_j2k_setup_end_compress(opj_j2k_t *p_j2k,
+        opj_event_mgr_t * p_manager)
 {
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        /* DEVELOPER CORNER, insert your custom procedures */
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_eoc, p_manager)) {
-                return OPJ_FALSE;
-        }
+    /* DEVELOPER CORNER, insert your custom procedures */
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_write_eoc, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        if (OPJ_IS_CINEMA(p_j2k->m_cp.rsiz)) {
-                if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_updated_tlm, p_manager)) {
-                        return OPJ_FALSE;
-                }
+    if (OPJ_IS_CINEMA(p_j2k->m_cp.rsiz)) {
+        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                               (opj_procedure)opj_j2k_write_updated_tlm, p_manager)) {
+            return OPJ_FALSE;
         }
+    }
 
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_epc, p_manager)) {
-                return OPJ_FALSE;
-        }
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_end_encoding, p_manager)) {
-                return OPJ_FALSE;
-        }
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_destroy_header_memory, p_manager)) {
-                return OPJ_FALSE;
-        }
-        return OPJ_TRUE;
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_write_epc, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_end_encoding, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_destroy_header_memory, p_manager)) {
+        return OPJ_FALSE;
+    }
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_j2k_setup_encoding_validation(opj_j2k_t *p_j2k,
+        opj_event_mgr_t * p_manager)
 {
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_build_encoder, p_manager)) {
-                return OPJ_FALSE;
-        }
-        if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_encoding_validation, p_manager)) {
-                return OPJ_FALSE;
-				}
+    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
+                                           (opj_procedure)opj_j2k_build_encoder, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
+                                           (opj_procedure)opj_j2k_encoding_validation, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        /* DEVELOPER CORNER, add your custom validation procedure */
-        if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_mct_validation, p_manager)) {
-                return OPJ_FALSE;
-        }
-	
-        return OPJ_TRUE;
+    /* DEVELOPER CORNER, add your custom validation procedure */
+    if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,
+                                           (opj_procedure)opj_j2k_mct_validation, p_manager)) {
+        return OPJ_FALSE;
+    }
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_setup_header_writing (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_j2k_setup_header_writing(opj_j2k_t *p_j2k,
+        opj_event_mgr_t * p_manager)
 {
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
 
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_init_info, p_manager)) {
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_init_info, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_write_soc, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_write_siz, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_write_cod, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_write_qcd, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_write_all_coc, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_write_all_qcc, p_manager)) {
+        return OPJ_FALSE;
+    }
+
+    if (OPJ_IS_CINEMA(p_j2k->m_cp.rsiz)) {
+        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                               (opj_procedure)opj_j2k_write_tlm, p_manager)) {
+            return OPJ_FALSE;
+        }
+
+        if (p_j2k->m_cp.rsiz == OPJ_PROFILE_CINEMA_4K) {
+            if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                                   (opj_procedure)opj_j2k_write_poc, p_manager)) {
                 return OPJ_FALSE;
+            }
         }
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_soc, p_manager)) {
-                return OPJ_FALSE;
-        }
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_siz, p_manager)) {
-                return OPJ_FALSE;
-        }
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_cod, p_manager)) {
-                return OPJ_FALSE;
-        }
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_qcd, p_manager)) {
-                return OPJ_FALSE;
-        }
+    }
 
-        if (OPJ_IS_CINEMA(p_j2k->m_cp.rsiz)) {
-                /* No need for COC or QCC, QCD and COD are used
-                if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_coc, p_manager)) {
-                        return OPJ_FALSE;
-                }
-                if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_qcc, p_manager)) {
-                        return OPJ_FALSE;
-                }
-                */
-                if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_tlm, p_manager)) {
-                        return OPJ_FALSE;
-                }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_write_regions, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-                if (p_j2k->m_cp.rsiz == OPJ_PROFILE_CINEMA_4K) {
-                        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_poc, p_manager)) {
-                                return OPJ_FALSE;
-                        }
-                }
+    if (p_j2k->m_cp.comment != 00)  {
+        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                               (opj_procedure)opj_j2k_write_com, p_manager)) {
+            return OPJ_FALSE;
         }
+    }
 
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_regions, p_manager)) {
-                return OPJ_FALSE;
+    /* DEVELOPER CORNER, insert your custom procedures */
+    if (p_j2k->m_cp.rsiz & OPJ_EXTENSION_MCT) {
+        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                               (opj_procedure)opj_j2k_write_mct_data_group, p_manager)) {
+            return OPJ_FALSE;
         }
+    }
+    /* End of Developer Corner */
 
-        if (p_j2k->m_cp.comment != 00)  {
-                if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_com, p_manager)) {
-                        return OPJ_FALSE;
-                }
+    if (p_j2k->cstr_index) {
+        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                               (opj_procedure)opj_j2k_get_end_header, p_manager)) {
+            return OPJ_FALSE;
         }
+    }
 
-        /* DEVELOPER CORNER, insert your custom procedures */
-        if (p_j2k->m_cp.rsiz & OPJ_EXTENSION_MCT) {
-                if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_mct_data_group, p_manager)) {
-                        return OPJ_FALSE;
-                }
-        }
-        /* End of Developer Corner */
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_create_tcd, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,
+                                           (opj_procedure)opj_j2k_update_rates, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        if (p_j2k->cstr_index) {
-                if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_get_end_header, p_manager)) {
-                        return OPJ_FALSE;
-                }
-        }
-
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_create_tcd, p_manager)) {
-                return OPJ_FALSE;
-        }
-        if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_update_rates, p_manager)) {
-                return OPJ_FALSE;
-        }
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_first_tile_part (opj_j2k_t *p_j2k,
-                                                                        OPJ_BYTE * p_data,
-                                                                        OPJ_UINT32 * p_data_written,
-                                                                        OPJ_UINT32 p_total_data_size,
-                                                                        opj_stream_private_t *p_stream,
-                                                                        struct opj_event_mgr * p_manager )
+static OPJ_BOOL opj_j2k_write_first_tile_part(opj_j2k_t *p_j2k,
+        OPJ_BYTE * p_data,
+        OPJ_UINT32 * p_data_written,
+        OPJ_UINT32 p_total_data_size,
+        opj_stream_private_t *p_stream,
+        struct opj_event_mgr * p_manager)
 {
-        OPJ_UINT32 l_nb_bytes_written = 0;
-        OPJ_UINT32 l_current_nb_bytes_written;
-        OPJ_BYTE * l_begin_data = 00;
+    OPJ_UINT32 l_nb_bytes_written = 0;
+    OPJ_UINT32 l_current_nb_bytes_written;
+    OPJ_BYTE * l_begin_data = 00;
 
-        opj_tcd_t * l_tcd = 00;
-        opj_cp_t * l_cp = 00;
+    opj_tcd_t * l_tcd = 00;
+    opj_cp_t * l_cp = 00;
 
-        l_tcd = p_j2k->m_tcd;
-        l_cp = &(p_j2k->m_cp);
+    l_tcd = p_j2k->m_tcd;
+    l_cp = &(p_j2k->m_cp);
 
-        l_tcd->cur_pino = 0;
+    l_tcd->cur_pino = 0;
 
-        /*Get number of tile parts*/
-        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
+    /*Get number of tile parts*/
+    p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0;
 
-        /* INDEX >> */
-        /* << INDEX */
+    /* INDEX >> */
+    /* << INDEX */
 
+    l_current_nb_bytes_written = 0;
+    l_begin_data = p_data;
+    if (! opj_j2k_write_sot(p_j2k, p_data, &l_current_nb_bytes_written, p_stream,
+                            p_manager)) {
+        return OPJ_FALSE;
+    }
+
+    l_nb_bytes_written += l_current_nb_bytes_written;
+    p_data += l_current_nb_bytes_written;
+    p_total_data_size -= l_current_nb_bytes_written;
+
+    if (!OPJ_IS_CINEMA(l_cp->rsiz)) {
+#if 0
+        for (compno = 1; compno < p_j2k->m_private_image->numcomps; compno++) {
+            l_current_nb_bytes_written = 0;
+            opj_j2k_write_coc_in_memory(p_j2k, compno, p_data, &l_current_nb_bytes_written,
+                                        p_manager);
+            l_nb_bytes_written += l_current_nb_bytes_written;
+            p_data += l_current_nb_bytes_written;
+            p_total_data_size -= l_current_nb_bytes_written;
+
+            l_current_nb_bytes_written = 0;
+            opj_j2k_write_qcc_in_memory(p_j2k, compno, p_data, &l_current_nb_bytes_written,
+                                        p_manager);
+            l_nb_bytes_written += l_current_nb_bytes_written;
+            p_data += l_current_nb_bytes_written;
+            p_total_data_size -= l_current_nb_bytes_written;
+        }
+#endif
+        if (l_cp->tcps[p_j2k->m_current_tile_number].numpocs) {
+            l_current_nb_bytes_written = 0;
+            opj_j2k_write_poc_in_memory(p_j2k, p_data, &l_current_nb_bytes_written,
+                                        p_manager);
+            l_nb_bytes_written += l_current_nb_bytes_written;
+            p_data += l_current_nb_bytes_written;
+            p_total_data_size -= l_current_nb_bytes_written;
+        }
+    }
+
+    l_current_nb_bytes_written = 0;
+    if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
+                            p_total_data_size, p_stream, p_manager)) {
+        return OPJ_FALSE;
+    }
+
+    l_nb_bytes_written += l_current_nb_bytes_written;
+    * p_data_written = l_nb_bytes_written;
+
+    /* Writing Psot in SOT marker */
+    opj_write_bytes(l_begin_data + 6, l_nb_bytes_written,
+                    4);                                 /* PSOT */
+
+    if (OPJ_IS_CINEMA(l_cp->rsiz)) {
+        opj_j2k_update_tlm(p_j2k, l_nb_bytes_written);
+    }
+
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_j2k_write_all_tile_parts(opj_j2k_t *p_j2k,
+        OPJ_BYTE * p_data,
+        OPJ_UINT32 * p_data_written,
+        OPJ_UINT32 p_total_data_size,
+        opj_stream_private_t *p_stream,
+        struct opj_event_mgr * p_manager
+                                            )
+{
+    OPJ_UINT32 tilepartno = 0;
+    OPJ_UINT32 l_nb_bytes_written = 0;
+    OPJ_UINT32 l_current_nb_bytes_written;
+    OPJ_UINT32 l_part_tile_size;
+    OPJ_UINT32 tot_num_tp;
+    OPJ_UINT32 pino;
+
+    OPJ_BYTE * l_begin_data;
+    opj_tcp_t *l_tcp = 00;
+    opj_tcd_t * l_tcd = 00;
+    opj_cp_t * l_cp = 00;
+
+    l_tcd = p_j2k->m_tcd;
+    l_cp = &(p_j2k->m_cp);
+    l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;
+
+    /*Get number of tile parts*/
+    tot_num_tp = opj_j2k_get_num_tp(l_cp, 0, p_j2k->m_current_tile_number);
+
+    /* start writing remaining tile parts */
+    ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
+    for (tilepartno = 1; tilepartno < tot_num_tp ; ++tilepartno) {
+        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
         l_current_nb_bytes_written = 0;
+        l_part_tile_size = 0;
         l_begin_data = p_data;
-        if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager))
-        {
-                return OPJ_FALSE;
+
+        if (! opj_j2k_write_sot(p_j2k, p_data, &l_current_nb_bytes_written, p_stream,
+                                p_manager)) {
+            return OPJ_FALSE;
         }
 
         l_nb_bytes_written += l_current_nb_bytes_written;
         p_data += l_current_nb_bytes_written;
         p_total_data_size -= l_current_nb_bytes_written;
-
-        if (!OPJ_IS_CINEMA(l_cp->rsiz)) {
-#if 0
-                for (compno = 1; compno < p_j2k->m_private_image->numcomps; compno++) {
-                        l_current_nb_bytes_written = 0;
-                        opj_j2k_write_coc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager);
-                        l_nb_bytes_written += l_current_nb_bytes_written;
-                        p_data += l_current_nb_bytes_written;
-                        p_total_data_size -= l_current_nb_bytes_written;
-
-                        l_current_nb_bytes_written = 0;
-                        opj_j2k_write_qcc_in_memory(p_j2k,compno,p_data,&l_current_nb_bytes_written,p_manager);
-                        l_nb_bytes_written += l_current_nb_bytes_written;
-                        p_data += l_current_nb_bytes_written;
-                        p_total_data_size -= l_current_nb_bytes_written;
-                }
-#endif
-
-                if (l_cp->tcps[p_j2k->m_current_tile_number].numpocs) {
-                        l_current_nb_bytes_written = 0;
-                        opj_j2k_write_poc_in_memory(p_j2k,p_data,&l_current_nb_bytes_written,p_manager);
-                        l_nb_bytes_written += l_current_nb_bytes_written;
-                        p_data += l_current_nb_bytes_written;
-                        p_total_data_size -= l_current_nb_bytes_written;
-                }
-        }
+        l_part_tile_size += l_current_nb_bytes_written;
 
         l_current_nb_bytes_written = 0;
-        if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {
-                return OPJ_FALSE;
+        if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
+                                p_total_data_size, p_stream, p_manager)) {
+            return OPJ_FALSE;
         }
 
+        p_data += l_current_nb_bytes_written;
         l_nb_bytes_written += l_current_nb_bytes_written;
-        * p_data_written = l_nb_bytes_written;
+        p_total_data_size -= l_current_nb_bytes_written;
+        l_part_tile_size += l_current_nb_bytes_written;
 
         /* Writing Psot in SOT marker */
-        opj_write_bytes(l_begin_data + 6,l_nb_bytes_written,4);                                 /* PSOT */
+        opj_write_bytes(l_begin_data + 6, l_part_tile_size,
+                        4);                                   /* PSOT */
 
-        if (OPJ_IS_CINEMA(l_cp->rsiz)){
-                opj_j2k_update_tlm(p_j2k,l_nb_bytes_written);
+        if (OPJ_IS_CINEMA(l_cp->rsiz)) {
+            opj_j2k_update_tlm(p_j2k, l_part_tile_size);
         }
 
-        return OPJ_TRUE;
-}
+        ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
+    }
 
-static OPJ_BOOL opj_j2k_write_all_tile_parts(  opj_j2k_t *p_j2k,
-                                                                        OPJ_BYTE * p_data,
-                                                                        OPJ_UINT32 * p_data_written,
-                                                                        OPJ_UINT32 p_total_data_size,
-                                                                        opj_stream_private_t *p_stream,
-                                                                        struct opj_event_mgr * p_manager
-                                                                )
-{
-        OPJ_UINT32 tilepartno=0;
-        OPJ_UINT32 l_nb_bytes_written = 0;
-        OPJ_UINT32 l_current_nb_bytes_written;
-        OPJ_UINT32 l_part_tile_size;
-        OPJ_UINT32 tot_num_tp;
-        OPJ_UINT32 pino;
-
-        OPJ_BYTE * l_begin_data;
-        opj_tcp_t *l_tcp = 00;
-        opj_tcd_t * l_tcd = 00;
-        opj_cp_t * l_cp = 00;
-
-        l_tcd = p_j2k->m_tcd;
-        l_cp = &(p_j2k->m_cp);
-        l_tcp = l_cp->tcps + p_j2k->m_current_tile_number;
+    for (pino = 1; pino <= l_tcp->numpocs; ++pino) {
+        l_tcd->cur_pino = pino;
 
         /*Get number of tile parts*/
-        tot_num_tp = opj_j2k_get_num_tp(l_cp,0,p_j2k->m_current_tile_number);
+        tot_num_tp = opj_j2k_get_num_tp(l_cp, pino, p_j2k->m_current_tile_number);
+        for (tilepartno = 0; tilepartno < tot_num_tp ; ++tilepartno) {
+            p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
+            l_current_nb_bytes_written = 0;
+            l_part_tile_size = 0;
+            l_begin_data = p_data;
 
-        /* start writing remaining tile parts */
-        ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
-        for (tilepartno = 1; tilepartno < tot_num_tp ; ++tilepartno) {
-                p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
-                l_current_nb_bytes_written = 0;
-                l_part_tile_size = 0;
-                l_begin_data = p_data;
+            if (! opj_j2k_write_sot(p_j2k, p_data, &l_current_nb_bytes_written, p_stream,
+                                    p_manager)) {
+                return OPJ_FALSE;
+            }
 
-                if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager)) {
-                        return OPJ_FALSE;
-                }
+            l_nb_bytes_written += l_current_nb_bytes_written;
+            p_data += l_current_nb_bytes_written;
+            p_total_data_size -= l_current_nb_bytes_written;
+            l_part_tile_size += l_current_nb_bytes_written;
 
-                l_nb_bytes_written += l_current_nb_bytes_written;
-                p_data += l_current_nb_bytes_written;
-                p_total_data_size -= l_current_nb_bytes_written;
-                l_part_tile_size += l_current_nb_bytes_written;
+            l_current_nb_bytes_written = 0;
 
-                l_current_nb_bytes_written = 0;
-                if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {
-                        return OPJ_FALSE;
-                }
+            if (! opj_j2k_write_sod(p_j2k, l_tcd, p_data, &l_current_nb_bytes_written,
+                                    p_total_data_size, p_stream, p_manager)) {
+                return OPJ_FALSE;
+            }
 
-                p_data += l_current_nb_bytes_written;
-                l_nb_bytes_written += l_current_nb_bytes_written;
-                p_total_data_size -= l_current_nb_bytes_written;
-                l_part_tile_size += l_current_nb_bytes_written;
+            l_nb_bytes_written += l_current_nb_bytes_written;
+            p_data += l_current_nb_bytes_written;
+            p_total_data_size -= l_current_nb_bytes_written;
+            l_part_tile_size += l_current_nb_bytes_written;
 
-                /* Writing Psot in SOT marker */
-                opj_write_bytes(l_begin_data + 6,l_part_tile_size,4);                                   /* PSOT */
+            /* Writing Psot in SOT marker */
+            opj_write_bytes(l_begin_data + 6, l_part_tile_size,
+                            4);                                   /* PSOT */
 
-                if (OPJ_IS_CINEMA(l_cp->rsiz)) {
-                        opj_j2k_update_tlm(p_j2k,l_part_tile_size);
-                }
+            if (OPJ_IS_CINEMA(l_cp->rsiz)) {
+                opj_j2k_update_tlm(p_j2k, l_part_tile_size);
+            }
 
-                ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
+            ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
         }
+    }
 
-        for (pino = 1; pino <= l_tcp->numpocs; ++pino) {
-                l_tcd->cur_pino = pino;
+    *p_data_written = l_nb_bytes_written;
 
-                /*Get number of tile parts*/
-                tot_num_tp = opj_j2k_get_num_tp(l_cp,pino,p_j2k->m_current_tile_number);
-                for (tilepartno = 0; tilepartno < tot_num_tp ; ++tilepartno) {
-                        p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = tilepartno;
-                        l_current_nb_bytes_written = 0;
-                        l_part_tile_size = 0;
-                        l_begin_data = p_data;
-
-                        if (! opj_j2k_write_sot(p_j2k,p_data,&l_current_nb_bytes_written,p_stream,p_manager)) {
-                                return OPJ_FALSE;
-                        }
-
-                        l_nb_bytes_written += l_current_nb_bytes_written;
-                        p_data += l_current_nb_bytes_written;
-                        p_total_data_size -= l_current_nb_bytes_written;
-                        l_part_tile_size += l_current_nb_bytes_written;
-
-                        l_current_nb_bytes_written = 0;
-
-                        if (! opj_j2k_write_sod(p_j2k,l_tcd,p_data,&l_current_nb_bytes_written,p_total_data_size,p_stream,p_manager)) {
-                                return OPJ_FALSE;
-                        }
-
-                        l_nb_bytes_written += l_current_nb_bytes_written;
-                        p_data += l_current_nb_bytes_written;
-                        p_total_data_size -= l_current_nb_bytes_written;
-                        l_part_tile_size += l_current_nb_bytes_written;
-
-                        /* Writing Psot in SOT marker */
-                        opj_write_bytes(l_begin_data + 6,l_part_tile_size,4);                                   /* PSOT */
-
-                        if (OPJ_IS_CINEMA(l_cp->rsiz)) {
-                                opj_j2k_update_tlm(p_j2k,l_part_tile_size);
-                        }
-
-                        ++p_j2k->m_specific_param.m_encoder.m_current_tile_part_number;
-                }
-        }
-
-        *p_data_written = l_nb_bytes_written;
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_write_updated_tlm( opj_j2k_t *p_j2k,
-                                                                    struct opj_stream_private *p_stream,
-                                                                    struct opj_event_mgr * p_manager )
+static OPJ_BOOL opj_j2k_write_updated_tlm(opj_j2k_t *p_j2k,
+        struct opj_stream_private *p_stream,
+        struct opj_event_mgr * p_manager)
 {
-        OPJ_UINT32 l_tlm_size;
-        OPJ_OFF_T l_tlm_position, l_current_position;
+    OPJ_UINT32 l_tlm_size;
+    OPJ_OFF_T l_tlm_position, l_current_position;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        l_tlm_size = 5 * p_j2k->m_specific_param.m_encoder.m_total_tile_parts;
-        l_tlm_position = 6 + p_j2k->m_specific_param.m_encoder.m_tlm_start;
-        l_current_position = opj_stream_tell(p_stream);
+    l_tlm_size = 5 * p_j2k->m_specific_param.m_encoder.m_total_tile_parts;
+    l_tlm_position = 6 + p_j2k->m_specific_param.m_encoder.m_tlm_start;
+    l_current_position = opj_stream_tell(p_stream);
 
-        if (! opj_stream_seek(p_stream,l_tlm_position,p_manager)) {
-                return OPJ_FALSE;
-        }
+    if (! opj_stream_seek(p_stream, l_tlm_position, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        if (opj_stream_write_data(p_stream,p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer,l_tlm_size,p_manager) != l_tlm_size) {
-                return OPJ_FALSE;
-        }
+    if (opj_stream_write_data(p_stream,
+                              p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer, l_tlm_size,
+                              p_manager) != l_tlm_size) {
+        return OPJ_FALSE;
+    }
 
-        if (! opj_stream_seek(p_stream,l_current_position,p_manager)) {
-                return OPJ_FALSE;
-        }
+    if (! opj_stream_seek(p_stream, l_current_position, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_end_encoding(  opj_j2k_t *p_j2k,
-                                                        struct opj_stream_private *p_stream,
-                                                        struct opj_event_mgr * p_manager )
+static OPJ_BOOL opj_j2k_end_encoding(opj_j2k_t *p_j2k,
+                                     struct opj_stream_private *p_stream,
+                                     struct opj_event_mgr * p_manager)
 {
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        opj_tcd_destroy(p_j2k->m_tcd);
-        p_j2k->m_tcd = 00;
+    OPJ_UNUSED(p_stream);
+    OPJ_UNUSED(p_manager);
 
-        if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
-                opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
-                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 0;
-                p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 0;
-        }
+    opj_tcd_destroy(p_j2k->m_tcd);
+    p_j2k->m_tcd = 00;
 
-        if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
-                opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
-                p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 0;
-        }
+    if (p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer) {
+        opj_free(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer);
+        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_buffer = 0;
+        p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current = 0;
+    }
 
-        p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = 0;
+    if (p_j2k->m_specific_param.m_encoder.m_encoded_tile_data) {
+        opj_free(p_j2k->m_specific_param.m_encoder.m_encoded_tile_data);
+        p_j2k->m_specific_param.m_encoder.m_encoded_tile_data = 0;
+    }
 
-        return OPJ_TRUE;
+    p_j2k->m_specific_param.m_encoder.m_encoded_tile_size = 0;
+
+    return OPJ_TRUE;
 }
 
 /**
  * Destroys the memory associated with the decoding of headers.
  */
-static OPJ_BOOL opj_j2k_destroy_header_memory ( opj_j2k_t * p_j2k,
-                                                opj_stream_private_t *p_stream,
-                                                opj_event_mgr_t * p_manager
-                                                )
+static OPJ_BOOL opj_j2k_destroy_header_memory(opj_j2k_t * p_j2k,
+        opj_stream_private_t *p_stream,
+        opj_event_mgr_t * p_manager
+                                             )
 {
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_stream != 00);
-        assert(p_manager != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_stream != 00);
+    assert(p_manager != 00);
 
-        if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
-                opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
-                p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0;
-        }
+    OPJ_UNUSED(p_stream);
+    OPJ_UNUSED(p_manager);
 
-        p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+    if (p_j2k->m_specific_param.m_encoder.m_header_tile_data) {
+        opj_free(p_j2k->m_specific_param.m_encoder.m_header_tile_data);
+        p_j2k->m_specific_param.m_encoder.m_header_tile_data = 0;
+    }
 
-        return OPJ_TRUE;
+    p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = 0;
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_j2k_init_info(     opj_j2k_t *p_j2k,
-                                                struct opj_stream_private *p_stream,
-                                                struct opj_event_mgr * p_manager )
+static OPJ_BOOL opj_j2k_init_info(opj_j2k_t *p_j2k,
+                                  struct opj_stream_private *p_stream,
+                                  struct opj_event_mgr * p_manager)
 {
-        opj_codestream_info_t * l_cstr_info = 00;
+    opj_codestream_info_t * l_cstr_info = 00;
 
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
-  (void)l_cstr_info;
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
+    (void)l_cstr_info;
 
-        /* TODO mergeV2: check this part which use cstr_info */
-        /*l_cstr_info = p_j2k->cstr_info;
+    OPJ_UNUSED(p_stream);
 
-        if (l_cstr_info)  {
-                OPJ_UINT32 compno;
-                l_cstr_info->tile = (opj_tile_info_t *) opj_malloc(p_j2k->m_cp.tw * p_j2k->m_cp.th * sizeof(opj_tile_info_t));
+    /* TODO mergeV2: check this part which use cstr_info */
+    /*l_cstr_info = p_j2k->cstr_info;
 
-                l_cstr_info->image_w = p_j2k->m_image->x1 - p_j2k->m_image->x0;
-                l_cstr_info->image_h = p_j2k->m_image->y1 - p_j2k->m_image->y0;
+    if (l_cstr_info)  {
+            OPJ_UINT32 compno;
+            l_cstr_info->tile = (opj_tile_info_t *) opj_malloc(p_j2k->m_cp.tw * p_j2k->m_cp.th * sizeof(opj_tile_info_t));
 
-                l_cstr_info->prog = (&p_j2k->m_cp.tcps[0])->prg;
+            l_cstr_info->image_w = p_j2k->m_image->x1 - p_j2k->m_image->x0;
+            l_cstr_info->image_h = p_j2k->m_image->y1 - p_j2k->m_image->y0;
 
-                l_cstr_info->tw = p_j2k->m_cp.tw;
-                l_cstr_info->th = p_j2k->m_cp.th;
+            l_cstr_info->prog = (&p_j2k->m_cp.tcps[0])->prg;
 
-                l_cstr_info->tile_x = p_j2k->m_cp.tdx;*/        /* new version parser */
-                /*l_cstr_info->tile_y = p_j2k->m_cp.tdy;*/      /* new version parser */
-                /*l_cstr_info->tile_Ox = p_j2k->m_cp.tx0;*/     /* new version parser */
-                /*l_cstr_info->tile_Oy = p_j2k->m_cp.ty0;*/     /* new version parser */
+            l_cstr_info->tw = p_j2k->m_cp.tw;
+            l_cstr_info->th = p_j2k->m_cp.th;
 
-                /*l_cstr_info->numcomps = p_j2k->m_image->numcomps;
+            l_cstr_info->tile_x = p_j2k->m_cp.tdx;*/        /* new version parser */
+    /*l_cstr_info->tile_y = p_j2k->m_cp.tdy;*/      /* new version parser */
+    /*l_cstr_info->tile_Ox = p_j2k->m_cp.tx0;*/     /* new version parser */
+    /*l_cstr_info->tile_Oy = p_j2k->m_cp.ty0;*/     /* new version parser */
 
-                l_cstr_info->numlayers = (&p_j2k->m_cp.tcps[0])->numlayers;
+    /*l_cstr_info->numcomps = p_j2k->m_image->numcomps;
 
-                l_cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(p_j2k->m_image->numcomps * sizeof(OPJ_INT32));
+    l_cstr_info->numlayers = (&p_j2k->m_cp.tcps[0])->numlayers;
 
-                for (compno=0; compno < p_j2k->m_image->numcomps; compno++) {
-                        l_cstr_info->numdecompos[compno] = (&p_j2k->m_cp.tcps[0])->tccps->numresolutions - 1;
-                }
+    l_cstr_info->numdecompos = (OPJ_INT32*) opj_malloc(p_j2k->m_image->numcomps * sizeof(OPJ_INT32));
 
-                l_cstr_info->D_max = 0.0;       */      /* ADD Marcela */
+    for (compno=0; compno < p_j2k->m_image->numcomps; compno++) {
+            l_cstr_info->numdecompos[compno] = (&p_j2k->m_cp.tcps[0])->tccps->numresolutions - 1;
+    }
 
-                /*l_cstr_info->main_head_start = opj_stream_tell(p_stream);*/ /* position of SOC */
+    l_cstr_info->D_max = 0.0;       */      /* ADD Marcela */
 
-                /*l_cstr_info->maxmarknum = 100;
-                l_cstr_info->marker = (opj_marker_info_t *) opj_malloc(l_cstr_info->maxmarknum * sizeof(opj_marker_info_t));
-                l_cstr_info->marknum = 0;
-        }*/
+    /*l_cstr_info->main_head_start = opj_stream_tell(p_stream);*/ /* position of SOC */
 
-        return opj_j2k_calculate_tp(p_j2k,&(p_j2k->m_cp),&p_j2k->m_specific_param.m_encoder.m_total_tile_parts,p_j2k->m_private_image,p_manager);
+    /*l_cstr_info->maxmarknum = 100;
+    l_cstr_info->marker = (opj_marker_info_t *) opj_malloc(l_cstr_info->maxmarknum * sizeof(opj_marker_info_t));
+    l_cstr_info->marknum = 0;
+    }*/
+
+    return opj_j2k_calculate_tp(p_j2k, &(p_j2k->m_cp),
+                                &p_j2k->m_specific_param.m_encoder.m_total_tile_parts, p_j2k->m_private_image,
+                                p_manager);
 }
 
 /**
@@ -10777,65 +11799,70 @@
  * @param       p_j2k                   J2K codec.
  * @param       p_manager               the user event manager.
 */
-static OPJ_BOOL opj_j2k_create_tcd(     opj_j2k_t *p_j2k,
-                                                                    opj_stream_private_t *p_stream,
-                                                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_j2k_create_tcd(opj_j2k_t *p_j2k,
+                                   opj_stream_private_t *p_stream,
+                                   opj_event_mgr_t * p_manager
+                                  )
 {
-        /* preconditions */
-        assert(p_j2k != 00);
-        assert(p_manager != 00);
-        assert(p_stream != 00);
+    /* preconditions */
+    assert(p_j2k != 00);
+    assert(p_manager != 00);
+    assert(p_stream != 00);
 
-        p_j2k->m_tcd = opj_tcd_create(OPJ_FALSE);
+    OPJ_UNUSED(p_stream);
 
-        if (! p_j2k->m_tcd) {
-                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to create Tile Coder\n");
-                return OPJ_FALSE;
-        }
+    p_j2k->m_tcd = opj_tcd_create(OPJ_FALSE);
 
-        if (!opj_tcd_init(p_j2k->m_tcd,p_j2k->m_private_image,&p_j2k->m_cp)) {
-                opj_tcd_destroy(p_j2k->m_tcd);
-                p_j2k->m_tcd = 00;
-                return OPJ_FALSE;
-        }
+    if (! p_j2k->m_tcd) {
+        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to create Tile Coder\n");
+        return OPJ_FALSE;
+    }
 
-        return OPJ_TRUE;
+    if (!opj_tcd_init(p_j2k->m_tcd, p_j2k->m_private_image, &p_j2k->m_cp,
+                      p_j2k->m_tp)) {
+        opj_tcd_destroy(p_j2k->m_tcd);
+        p_j2k->m_tcd = 00;
+        return OPJ_FALSE;
+    }
+
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_j2k_write_tile (opj_j2k_t * p_j2k,
-                                                 OPJ_UINT32 p_tile_index,
-                                                 OPJ_BYTE * p_data,
-                                                 OPJ_UINT32 p_data_size,
-                                                 opj_stream_private_t *p_stream,
-                                                 opj_event_mgr_t * p_manager )
+OPJ_BOOL opj_j2k_write_tile(opj_j2k_t * p_j2k,
+                            OPJ_UINT32 p_tile_index,
+                            OPJ_BYTE * p_data,
+                            OPJ_UINT32 p_data_size,
+                            opj_stream_private_t *p_stream,
+                            opj_event_mgr_t * p_manager)
 {
-        if (! opj_j2k_pre_write_tile(p_j2k,p_tile_index,p_stream,p_manager)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Error while opj_j2k_pre_write_tile with tile index = %d\n", p_tile_index);
+    if (! opj_j2k_pre_write_tile(p_j2k, p_tile_index, p_stream, p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Error while opj_j2k_pre_write_tile with tile index = %d\n", p_tile_index);
+        return OPJ_FALSE;
+    } else {
+        OPJ_UINT32 j;
+        /* Allocate data */
+        for (j = 0; j < p_j2k->m_tcd->image->numcomps; ++j) {
+            opj_tcd_tilecomp_t* l_tilec = p_j2k->m_tcd->tcd_image->tiles->comps + j;
+
+            if (! opj_alloc_tile_component_data(l_tilec)) {
+                opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data.");
                 return OPJ_FALSE;
-        }
-        else {
-                OPJ_UINT32 j;
-                /* Allocate data */
-                for (j=0;j<p_j2k->m_tcd->image->numcomps;++j) {
-                        opj_tcd_tilecomp_t* l_tilec = p_j2k->m_tcd->tcd_image->tiles->comps + j;
-
-                        if(! opj_alloc_tile_component_data(l_tilec)) {
-												        opj_event_msg(p_manager, EVT_ERROR, "Error allocating tile component data." );
-                                return OPJ_FALSE;
-                        }
-                }
-
-                /* now copy data into the the tile component */
-                if (! opj_tcd_copy_tile_data(p_j2k->m_tcd,p_data,p_data_size)) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Size mismatch between tile data and sent data." );
-                        return OPJ_FALSE;
-                }
-                if (! opj_j2k_post_write_tile(p_j2k,p_stream,p_manager)) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Error while opj_j2k_post_write_tile with tile index = %d\n", p_tile_index);
-                        return OPJ_FALSE;
-                }
+            }
         }
 
-        return OPJ_TRUE;
+        /* now copy data into the tile component */
+        if (! opj_tcd_copy_tile_data(p_j2k->m_tcd, p_data, p_data_size)) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Size mismatch between tile data and sent data.");
+            return OPJ_FALSE;
+        }
+        if (! opj_j2k_post_write_tile(p_j2k, p_stream, p_manager)) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Error while opj_j2k_post_write_tile with tile index = %d\n", p_tile_index);
+            return OPJ_FALSE;
+        }
+    }
+
+    return OPJ_TRUE;
 }
diff --git a/third_party/libopenjpeg20/j2k.h b/third_party/libopenjpeg20/j2k.h
index 358e073..d61c96d 100644
--- a/third_party/libopenjpeg20/j2k.h
+++ b/third_party/libopenjpeg20/j2k.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,12 +8,12 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2006-2007, Parvatha Elangovan
  * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
- * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France 
+ * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France
  * Copyright (c) 2012, CS Systemes d'Information, France
  *
  * All rights reserved.
@@ -39,8 +39,8 @@
  * 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
+#ifndef OPJ_J2K_H
+#define OPJ_J2K_H
 /**
 @file j2k.h
 @brief The JPEG-2000 Codestream Reader/Writer (J2K)
@@ -65,43 +65,41 @@
 #define J2K_CCP_QNTSTY_SIQNT 1
 #define J2K_CCP_QNTSTY_SEQNT 2
 
-#define OPJ_J2K_DEFAULT_CBLK_DATA_SIZE 8192
-
 /* ----------------------------------------------------------------------- */
 
-#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 */
-#define J2K_MS_CBD 0xff78	/**< CBD marker value */
-#define J2K_MS_MCC 0xff75	/**< MCC marker value */
-#define J2K_MS_MCT 0xff74	/**< MCT marker value */
-#define J2K_MS_MCO 0xff77	/**< MCO marker value */
+#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 */
+#define J2K_MS_CBD 0xff78   /**< CBD marker value */
+#define J2K_MS_MCC 0xff75   /**< MCC marker value */
+#define J2K_MS_MCT 0xff74   /**< MCT marker value */
+#define J2K_MS_MCO 0xff77   /**< MCO marker value */
 
-#define J2K_MS_UNK 0		/**< UNKNOWN marker value */
+#define J2K_MS_UNK 0        /**< UNKNOWN marker value */
 
 /* UniPG>> */
 #ifdef USE_JPWL
-#define J2K_MS_EPC 0xff68	/**< EPC marker value (Part 11: JPEG 2000 for Wireless) */
-#define J2K_MS_EPB 0xff66	/**< EPB marker value (Part 11: JPEG 2000 for Wireless) */ 
-#define J2K_MS_ESD 0xff67	/**< ESD marker value (Part 11: JPEG 2000 for Wireless) */ 
-#define J2K_MS_RED 0xff69	/**< RED marker value (Part 11: JPEG 2000 for Wireless) */
+#define J2K_MS_EPC 0xff68   /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */
+#define J2K_MS_EPB 0xff66   /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */
+#define J2K_MS_ESD 0xff67   /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */
+#define J2K_MS_RED 0xff69   /**< RED marker value (Part 11: JPEG 2000 for Wireless) */
 #endif /* USE_JPWL */
 #ifdef USE_JPSEC
 #define J2K_MS_SEC 0xff65    /**< SEC marker value (Part 8: Secure JPEG 2000) */
@@ -116,91 +114,89 @@
  * These values may be combined with a | operator.
  * */
 typedef enum J2K_STATUS {
-	J2K_STATE_NONE  =  0x0000, /**< a SOC marker is expected */
-	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_STATE_NONE  =  0x0000, /**< a SOC marker is expected */
+    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_STATE_DATA   = 0x0080, /**< a tile header has been successfully read and codestream is expected */
 
-	J2K_STATE_EOC	 = 0x0100, /**< the decoding process has encountered the EOC marker */
-	J2K_STATE_ERR    = 0x8000  /**< the decoding process has encountered an error (FIXME warning V1 = 0x0080)*/
+    J2K_STATE_EOC    = 0x0100, /**< the decoding process has encountered the EOC marker */
+    J2K_STATE_ERR    = 0x8000  /**< the decoding process has encountered an error (FIXME warning V1 = 0x0080)*/
 } J2K_STATUS;
 
 /**
  * Type of elements storing in the MCT data
  */
-typedef enum MCT_ELEMENT_TYPE
-{
-	MCT_TYPE_INT16 = 0,		/** MCT data is stored as signed shorts*/
-	MCT_TYPE_INT32 = 1,		/** MCT data is stored as signed integers*/
-	MCT_TYPE_FLOAT = 2,		/** MCT data is stored as floats*/
-	MCT_TYPE_DOUBLE = 3		/** MCT data is stored as doubles*/
+typedef enum MCT_ELEMENT_TYPE {
+    MCT_TYPE_INT16 = 0,     /** MCT data is stored as signed shorts*/
+    MCT_TYPE_INT32 = 1,     /** MCT data is stored as signed integers*/
+    MCT_TYPE_FLOAT = 2,     /** MCT data is stored as floats*/
+    MCT_TYPE_DOUBLE = 3     /** MCT data is stored as doubles*/
 } J2K_MCT_ELEMENT_TYPE;
 
 /**
  * Type of MCT array
  */
-typedef enum MCT_ARRAY_TYPE
-{
-	MCT_TYPE_DEPENDENCY = 0,
-	MCT_TYPE_DECORRELATION = 1,
-	MCT_TYPE_OFFSET = 2
+typedef enum MCT_ARRAY_TYPE {
+    MCT_TYPE_DEPENDENCY = 0,
+    MCT_TYPE_DECORRELATION = 1,
+    MCT_TYPE_OFFSET = 2
 } J2K_MCT_ARRAY_TYPE;
 
 /* ----------------------------------------------------------------------- */
 
-/** 
-T2 encoding mode 
+/**
+T2 encoding mode
 */
 typedef enum T2_MODE {
-	THRESH_CALC = 0,	/** Function called in Rate allocation process*/
-	FINAL_PASS = 1		/** Function called in Tier 2 process*/
-}J2K_T2_MODE;
+    THRESH_CALC = 0,    /** Function called in Rate allocation process*/
+    FINAL_PASS = 1      /** Function called in Tier 2 process*/
+} J2K_T2_MODE;
 
 /**
  * Quantization stepsize
  */
 typedef struct opj_stepsize {
-	/** exponent */
-	OPJ_INT32 expn;
-	/** mantissa */
-	OPJ_INT32 mant;
+    /** exponent */
+    OPJ_INT32 expn;
+    /** mantissa */
+    OPJ_INT32 mant;
 } opj_stepsize_t;
 
 /**
 Tile-component coding parameters
 */
-typedef struct opj_tccp
-{
-	/** coding style */
-	OPJ_UINT32 csty;
-	/** number of resolutions */
-	OPJ_UINT32 numresolutions;
-	/** code-blocks width */
-	OPJ_UINT32 cblkw;
-	/** code-blocks height */
-	OPJ_UINT32 cblkh;
-	/** code-block coding style */
-	OPJ_UINT32 cblksty;
-	/** discrete wavelet transform identifier */
-	OPJ_UINT32 qmfbid;
-	/** quantisation style */
-	OPJ_UINT32 qntsty;
-	/** stepsizes used for quantization */
-	opj_stepsize_t stepsizes[OPJ_J2K_MAXBANDS];
-	/** number of guard bits */
-	OPJ_UINT32 numgbits;
-	/** Region Of Interest shift */
-	OPJ_INT32 roishift;
-	/** precinct width */
-	OPJ_UINT32 prcw[OPJ_J2K_MAXRLVLS];
-	/** precinct height */
-	OPJ_UINT32 prch[OPJ_J2K_MAXRLVLS];
-	/** the dc_level_shift **/
-	OPJ_INT32 m_dc_level_shift;
+typedef struct opj_tccp {
+    /** coding style */
+    OPJ_UINT32 csty;
+    /** number of resolutions */
+    OPJ_UINT32 numresolutions;
+    /** code-blocks width */
+    OPJ_UINT32 cblkw;
+    /** code-blocks height */
+    OPJ_UINT32 cblkh;
+    /** code-block coding style */
+    OPJ_UINT32 cblksty;
+    /** discrete wavelet transform identifier */
+    OPJ_UINT32 qmfbid;
+    /** quantisation style */
+    OPJ_UINT32 qntsty;
+    /** stepsizes used for quantization */
+    opj_stepsize_t stepsizes[OPJ_J2K_MAXBANDS];
+    /** number of guard bits */
+    OPJ_UINT32 numgbits;
+    /** Region Of Interest shift */
+    OPJ_INT32 roishift;
+    /** precinct width */
+    OPJ_UINT32 prcw[OPJ_J2K_MAXRLVLS];
+    /** precinct height */
+    OPJ_UINT32 prch[OPJ_J2K_MAXRLVLS];
+    /** the dc_level_shift **/
+    OPJ_INT32 m_dc_level_shift;
 }
 opj_tccp_t;
 
@@ -209,33 +205,30 @@
 /**
  * FIXME DOC
  */
-typedef struct opj_mct_data
-{
-	J2K_MCT_ELEMENT_TYPE m_element_type;
-	J2K_MCT_ARRAY_TYPE	 m_array_type;
-	OPJ_UINT32			 m_index;
-	OPJ_BYTE *			 m_data;
-	OPJ_UINT32			 m_data_size;
+typedef struct opj_mct_data {
+    J2K_MCT_ELEMENT_TYPE m_element_type;
+    J2K_MCT_ARRAY_TYPE   m_array_type;
+    OPJ_UINT32           m_index;
+    OPJ_BYTE *           m_data;
+    OPJ_UINT32           m_data_size;
 }
 opj_mct_data_t;
 
 /**
  * FIXME DOC
  */
-typedef struct opj_simple_mcc_decorrelation_data
-{
-	OPJ_UINT32			 m_index;
-	OPJ_UINT32			 m_nb_comps;
-	opj_mct_data_t *	 m_decorrelation_array;
-	opj_mct_data_t *	 m_offset_array;
-	OPJ_UINT32			 m_is_irreversible : 1;
+typedef struct opj_simple_mcc_decorrelation_data {
+    OPJ_UINT32           m_index;
+    OPJ_UINT32           m_nb_comps;
+    opj_mct_data_t *     m_decorrelation_array;
+    opj_mct_data_t *     m_offset_array;
+    OPJ_BITFIELD         m_is_irreversible : 1;
 }
 opj_simple_mcc_decorrelation_data_t;
 
-typedef struct opj_ppx_struct
-{
-	OPJ_BYTE*   m_data; /* m_data == NULL => Zppx not read yet */
-	OPJ_UINT32	m_data_size;
+typedef struct opj_ppx_struct {
+    OPJ_BYTE*   m_data; /* m_data == NULL => Zppx not read yet */
+    OPJ_UINT32  m_data_size;
 } opj_ppx;
 
 /**
@@ -243,106 +236,105 @@
 this structure is used to store coding/decoding parameters common to all
 tiles (information like COD, COC in main header)
 */
-typedef struct opj_tcp
-{
-	/** coding style */
-	OPJ_UINT32 csty;
-	/** progression order */
-	OPJ_PROG_ORDER prg;
-	/** number of layers */
-	OPJ_UINT32 numlayers;
-	OPJ_UINT32 num_layers_to_decode;
-	/** multi-component transform identifier */
-	OPJ_UINT32 mct;
-	/** rates of layers */
-	OPJ_FLOAT32 rates[100];
-	/** number of progression order changes */
-	OPJ_UINT32 numpocs;
-	/** progression order changes */
-	opj_poc_t pocs[32];
-	
-	/** number of ppt markers (reserved size) */
-	OPJ_UINT32 ppt_markers_count;
-	/** ppt markers data (table indexed by Zppt) */
-	opj_ppx* ppt_markers;
-	
-	/** packet header store there for future use in t2_decode_packet */
-	OPJ_BYTE *ppt_data;
-	/** used to keep a track of the allocated memory */
-	OPJ_BYTE *ppt_buffer;
-	/** Number of bytes stored inside ppt_data*/
-	OPJ_UINT32 ppt_data_size;
-	/** size of ppt_data*/
-	OPJ_UINT32 ppt_len;
-	/** add fixed_quality */
-	OPJ_FLOAT32 distoratio[100];
-	/** tile-component coding parameters */
-	opj_tccp_t *tccps;
-	/** number of tile parts for the tile. */
-	OPJ_UINT32 m_nb_tile_parts;
-	/** data for the tile */
-	OPJ_BYTE *		m_data;
-	/** size of data */
-	OPJ_UINT32		m_data_size;
-	/** encoding norms */
-	OPJ_FLOAT64 *	mct_norms;
-	/** the mct decoding matrix */
-	OPJ_FLOAT32 *	m_mct_decoding_matrix;
-	/** the mct coding matrix */
-	OPJ_FLOAT32 *	m_mct_coding_matrix;
-	/** mct records */
-	opj_mct_data_t * m_mct_records;
-	/** the number of mct records. */
-	OPJ_UINT32 m_nb_mct_records;
-	/** the max number of mct records. */
-	OPJ_UINT32 m_nb_max_mct_records;
-	/** mcc records */
-	opj_simple_mcc_decorrelation_data_t * m_mcc_records;
-	/** the number of mct records. */
-	OPJ_UINT32 m_nb_mcc_records;
-	/** the max number of mct records. */
-	OPJ_UINT32 m_nb_max_mcc_records;
+typedef struct opj_tcp {
+    /** coding style */
+    OPJ_UINT32 csty;
+    /** progression order */
+    OPJ_PROG_ORDER prg;
+    /** number of layers */
+    OPJ_UINT32 numlayers;
+    OPJ_UINT32 num_layers_to_decode;
+    /** multi-component transform identifier */
+    OPJ_UINT32 mct;
+    /** rates of layers */
+    OPJ_FLOAT32 rates[100];
+    /** number of progression order changes */
+    OPJ_UINT32 numpocs;
+    /** progression order changes */
+    opj_poc_t pocs[32];
+
+    /** number of ppt markers (reserved size) */
+    OPJ_UINT32 ppt_markers_count;
+    /** ppt markers data (table indexed by Zppt) */
+    opj_ppx* ppt_markers;
+
+    /** packet header store there for future use in t2_decode_packet */
+    OPJ_BYTE *ppt_data;
+    /** used to keep a track of the allocated memory */
+    OPJ_BYTE *ppt_buffer;
+    /** Number of bytes stored inside ppt_data*/
+    OPJ_UINT32 ppt_data_size;
+    /** size of ppt_data*/
+    OPJ_UINT32 ppt_len;
+    /** add fixed_quality */
+    OPJ_FLOAT32 distoratio[100];
+    /** tile-component coding parameters */
+    opj_tccp_t *tccps;
+    /** current tile part number or -1 if first time into this tile */
+    OPJ_INT32  m_current_tile_part_number;
+    /** number of tile parts for the tile. */
+    OPJ_UINT32 m_nb_tile_parts;
+    /** data for the tile */
+    OPJ_BYTE *      m_data;
+    /** size of data */
+    OPJ_UINT32      m_data_size;
+    /** encoding norms */
+    OPJ_FLOAT64 *   mct_norms;
+    /** the mct decoding matrix */
+    OPJ_FLOAT32 *   m_mct_decoding_matrix;
+    /** the mct coding matrix */
+    OPJ_FLOAT32 *   m_mct_coding_matrix;
+    /** mct records */
+    opj_mct_data_t * m_mct_records;
+    /** the number of mct records. */
+    OPJ_UINT32 m_nb_mct_records;
+    /** the max number of mct records. */
+    OPJ_UINT32 m_nb_max_mct_records;
+    /** mcc records */
+    opj_simple_mcc_decorrelation_data_t * m_mcc_records;
+    /** the number of mct records. */
+    OPJ_UINT32 m_nb_mcc_records;
+    /** the max number of mct records. */
+    OPJ_UINT32 m_nb_max_mcc_records;
 
 
-	/***** FLAGS *******/
-	/** If cod == 1 --> there was a COD marker for the present tile */
-	OPJ_UINT32 cod : 1;
-	/** If ppt == 1 --> there was a PPT marker for the present tile */
-	OPJ_UINT32 ppt : 1;
-	/** indicates if a POC marker has been used O:NO, 1:YES */
-	OPJ_UINT32 POC : 1;
+    /***** FLAGS *******/
+    /** If cod == 1 --> there was a COD marker for the present tile */
+    OPJ_BITFIELD cod : 1;
+    /** If ppt == 1 --> there was a PPT marker for the present tile */
+    OPJ_BITFIELD ppt : 1;
+    /** indicates if a POC marker has been used O:NO, 1:YES */
+    OPJ_BITFIELD POC : 1;
 } opj_tcp_t;
 
 
 
 
-typedef struct opj_encoding_param
-{
-	/** Maximum rate for each component. If == 0, component size limitation is not considered */
-	OPJ_UINT32 m_max_comp_size;
-	/** Position of tile part flag in progression order*/
-	OPJ_INT32 m_tp_pos;
-	/** fixed layer */
-	OPJ_INT32 *m_matrice;
-	/** Flag determining tile part generation*/
-	OPJ_BYTE m_tp_flag;
-	/** allocation by rate/distortion */
-	OPJ_UINT32 m_disto_alloc : 1;
-	/** allocation by fixed layer */
-	OPJ_UINT32 m_fixed_alloc : 1;
-	/** add fixed_quality */
-	OPJ_UINT32 m_fixed_quality : 1;
-	/** Enabling Tile part generation*/
-	OPJ_UINT32 m_tp_on : 1;
+typedef struct opj_encoding_param {
+    /** Maximum rate for each component. If == 0, component size limitation is not considered */
+    OPJ_UINT32 m_max_comp_size;
+    /** Position of tile part flag in progression order*/
+    OPJ_INT32 m_tp_pos;
+    /** fixed layer */
+    OPJ_INT32 *m_matrice;
+    /** Flag determining tile part generation*/
+    OPJ_BYTE m_tp_flag;
+    /** allocation by rate/distortion */
+    OPJ_BITFIELD m_disto_alloc : 1;
+    /** allocation by fixed layer */
+    OPJ_BITFIELD m_fixed_alloc : 1;
+    /** add fixed_quality */
+    OPJ_BITFIELD m_fixed_quality : 1;
+    /** Enabling Tile part generation*/
+    OPJ_BITFIELD m_tp_on : 1;
 }
 opj_encoding_param_t;
 
-typedef struct opj_decoding_param
-{
-	/** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
-	OPJ_UINT32 m_reduce;
-	/** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
-	OPJ_UINT32 m_layer;
+typedef struct opj_decoding_param {
+    /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
+    OPJ_UINT32 m_reduce;
+    /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
+    OPJ_UINT32 m_layer;
 }
 opj_decoding_param_t;
 
@@ -350,199 +342,190 @@
 /**
  * Coding parameters
  */
-typedef struct opj_cp
-{
-	/** Size of the image in bits*/
-	/*int img_size;*/
-	/** Rsiz*/
+typedef struct opj_cp {
+    /** Size of the image in bits*/
+    /*int img_size;*/
+    /** Rsiz*/
     OPJ_UINT16 rsiz;
-	/** XTOsiz */
-	OPJ_UINT32 tx0; /* MSD see norm */
-	/** YTOsiz */
-	OPJ_UINT32 ty0; /* MSD see norm */
-	/** XTsiz */
-	OPJ_UINT32 tdx;
-	/** YTsiz */
-	OPJ_UINT32 tdy;
-	/** comment */
-	OPJ_CHAR *comment;
-	/** number of tiles in width */
-	OPJ_UINT32 tw;
-	/** number of tiles in heigth */
-	OPJ_UINT32 th;
+    /** XTOsiz */
+    OPJ_UINT32 tx0; /* MSD see norm */
+    /** YTOsiz */
+    OPJ_UINT32 ty0; /* MSD see norm */
+    /** XTsiz */
+    OPJ_UINT32 tdx;
+    /** YTsiz */
+    OPJ_UINT32 tdy;
+    /** comment */
+    OPJ_CHAR *comment;
+    /** number of tiles in width */
+    OPJ_UINT32 tw;
+    /** number of tiles in height */
+    OPJ_UINT32 th;
 
-	/** number of ppm markers (reserved size) */
-	OPJ_UINT32 ppm_markers_count;
-	/** ppm markers data (table indexed by Zppm) */
-	opj_ppx* ppm_markers;
-	
-	/** packet header store there for future use in t2_decode_packet */
-	OPJ_BYTE *ppm_data;
-	/** size of the ppm_data*/
-	OPJ_UINT32 ppm_len;
-	/** size of the ppm_data*/
-	OPJ_UINT32 ppm_data_read;
+    /** number of ppm markers (reserved size) */
+    OPJ_UINT32 ppm_markers_count;
+    /** ppm markers data (table indexed by Zppm) */
+    opj_ppx* ppm_markers;
 
-	OPJ_BYTE *ppm_data_current;
+    /** packet header store there for future use in t2_decode_packet */
+    OPJ_BYTE *ppm_data;
+    /** size of the ppm_data*/
+    OPJ_UINT32 ppm_len;
+    /** size of the ppm_data*/
+    OPJ_UINT32 ppm_data_read;
 
-	/** packet header storage original buffer */
-	OPJ_BYTE *ppm_buffer;
-	/** pointer remaining on the first byte of the first header if ppm is used */
-	OPJ_BYTE *ppm_data_first;
-	/** Number of bytes actually stored inside the ppm_data */
-	OPJ_UINT32 ppm_data_size;
-	/** use in case of multiple marker PPM (number of info already store) */
-	OPJ_INT32 ppm_store;
-	/** use in case of multiple marker PPM (case on non-finished previous info) */
-	OPJ_INT32 ppm_previous;
+    OPJ_BYTE *ppm_data_current;
 
-	/** tile coding parameters */
-	opj_tcp_t *tcps;
+    /** packet header storage original buffer */
+    OPJ_BYTE *ppm_buffer;
+    /** pointer remaining on the first byte of the first header if ppm is used */
+    OPJ_BYTE *ppm_data_first;
+    /** Number of bytes actually stored inside the ppm_data */
+    OPJ_UINT32 ppm_data_size;
+    /** use in case of multiple marker PPM (number of info already store) */
+    OPJ_INT32 ppm_store;
+    /** use in case of multiple marker PPM (case on non-finished previous info) */
+    OPJ_INT32 ppm_previous;
 
-	union
-	{
-		opj_decoding_param_t m_dec;
-		opj_encoding_param_t m_enc;
-	}
-	m_specific_param;
+    /** tile coding parameters */
+    opj_tcp_t *tcps;
+
+    union {
+        opj_decoding_param_t m_dec;
+        opj_encoding_param_t m_enc;
+    }
+    m_specific_param;
 
 
-/* UniPG>> */
+    /* UniPG>> */
 #ifdef USE_JPWL
-	/** enables writing of EPC in MH, thus activating JPWL */
-	OPJ_BOOL epc_on;
-	/** enables writing of EPB, in case of activated JPWL */
-	OPJ_BOOL epb_on;
-	/** enables writing of ESD, in case of activated JPWL */
-	OPJ_BOOL esd_on;
-	/** enables writing of informative techniques of ESD, in case of activated JPWL */
-	OPJ_BOOL info_on;
-	/** enables writing of RED, in case of activated JPWL */
-	OPJ_BOOL red_on;
-	/** error protection method for MH (0,1,16,32,37-128) */
-	int hprot_MH;
-	/** tile number of header protection specification (>=0) */
-	int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
-	/** error protection methods for TPHs (0,1,16,32,37-128) */
-	int hprot_TPH[JPWL_MAX_NO_TILESPECS];
-	/** tile number of packet protection specification (>=0) */
-	int pprot_tileno[JPWL_MAX_NO_PACKSPECS];
-	/** packet number of packet protection specification (>=0) */
-	int pprot_packno[JPWL_MAX_NO_PACKSPECS];
-	/** error protection methods for packets (0,1,16,32,37-128) */
-	int pprot[JPWL_MAX_NO_PACKSPECS];
-	/** enables writing of ESD, (0/2/4 bytes) */
-	int sens_size;
-	/** sensitivity addressing size (0=auto/2/4 bytes) */
-	int sens_addr;
-	/** sensitivity range (0-3) */
-	int sens_range;
-	/** sensitivity method for MH (-1,0-7) */
-	int sens_MH;
-	/** tile number of sensitivity specification (>=0) */
-	int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
-	/** sensitivity methods for TPHs (-1,0-7) */
-	int sens_TPH[JPWL_MAX_NO_TILESPECS];
-	/** enables JPWL correction at the decoder */
-	OPJ_BOOL correct;
-	/** expected number of components at the decoder */
-	int exp_comps;
-	/** maximum number of tiles at the decoder */
-	OPJ_UINT32 max_tiles;
+    /** enables writing of EPC in MH, thus activating JPWL */
+    OPJ_BOOL epc_on;
+    /** enables writing of EPB, in case of activated JPWL */
+    OPJ_BOOL epb_on;
+    /** enables writing of ESD, in case of activated JPWL */
+    OPJ_BOOL esd_on;
+    /** enables writing of informative techniques of ESD, in case of activated JPWL */
+    OPJ_BOOL info_on;
+    /** enables writing of RED, in case of activated JPWL */
+    OPJ_BOOL red_on;
+    /** error protection method for MH (0,1,16,32,37-128) */
+    int hprot_MH;
+    /** tile number of header protection specification (>=0) */
+    int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+    /** error protection methods for TPHs (0,1,16,32,37-128) */
+    int hprot_TPH[JPWL_MAX_NO_TILESPECS];
+    /** tile number of packet protection specification (>=0) */
+    int pprot_tileno[JPWL_MAX_NO_PACKSPECS];
+    /** packet number of packet protection specification (>=0) */
+    int pprot_packno[JPWL_MAX_NO_PACKSPECS];
+    /** error protection methods for packets (0,1,16,32,37-128) */
+    int pprot[JPWL_MAX_NO_PACKSPECS];
+    /** enables writing of ESD, (0/2/4 bytes) */
+    int sens_size;
+    /** sensitivity addressing size (0=auto/2/4 bytes) */
+    int sens_addr;
+    /** sensitivity range (0-3) */
+    int sens_range;
+    /** sensitivity method for MH (-1,0-7) */
+    int sens_MH;
+    /** tile number of sensitivity specification (>=0) */
+    int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+    /** sensitivity methods for TPHs (-1,0-7) */
+    int sens_TPH[JPWL_MAX_NO_TILESPECS];
+    /** enables JPWL correction at the decoder */
+    OPJ_BOOL correct;
+    /** expected number of components at the decoder */
+    int exp_comps;
+    /** maximum number of tiles at the decoder */
+    OPJ_UINT32 max_tiles;
 #endif /* USE_JPWL */
 
-	/******** FLAGS *********/
-	/** if ppm == 1 --> there was a PPM marker*/
-	OPJ_UINT32 ppm : 1;
-	/** tells if the parameter is a coding or decoding one */
-	OPJ_UINT32 m_is_decoder : 1;
-/* <<UniPG */
+    /******** FLAGS *********/
+    /** if ppm == 1 --> there was a PPM marker*/
+    OPJ_BITFIELD ppm : 1;
+    /** tells if the parameter is a coding or decoding one */
+    OPJ_BITFIELD m_is_decoder : 1;
+    /** whether different bit depth or sign per component is allowed. Decoder only for ow */
+    OPJ_BITFIELD allow_different_bit_depth_sign : 1;
+    /* <<UniPG */
 } opj_cp_t;
 
 
-typedef struct opj_j2k_dec
-{
-	/** locate in which part of the codestream the decoder is (main header, tile header, end) */
-	OPJ_UINT32 m_state;
-	/**
-	 * store decoding parameters common to all tiles (information like COD, COC in main header)
-	 */
-	opj_tcp_t *m_default_tcp;
-	OPJ_BYTE  *m_header_data;
-	OPJ_UINT32 m_header_data_size;
-	/** to tell the tile part length */
-	OPJ_UINT32 m_sot_length;
-	/** Only tiles index in the correct range will be decoded.*/
-	OPJ_UINT32 m_start_tile_x;
-	OPJ_UINT32 m_start_tile_y;
-	OPJ_UINT32 m_end_tile_x;
-	OPJ_UINT32 m_end_tile_y;
-	/**
-	 * Decoded area set by the user
-	 */
-	OPJ_UINT32 m_DA_x0;
-	OPJ_UINT32 m_DA_y0;
-	OPJ_UINT32 m_DA_x1;
-	OPJ_UINT32 m_DA_y1;
+typedef struct opj_j2k_dec {
+    /** locate in which part of the codestream the decoder is (main header, tile header, end) */
+    OPJ_UINT32 m_state;
+    /**
+     * store decoding parameters common to all tiles (information like COD, COC in main header)
+     */
+    opj_tcp_t *m_default_tcp;
+    OPJ_BYTE  *m_header_data;
+    OPJ_UINT32 m_header_data_size;
+    /** to tell the tile part length */
+    OPJ_UINT32 m_sot_length;
+    /** Only tiles index in the correct range will be decoded.*/
+    OPJ_UINT32 m_start_tile_x;
+    OPJ_UINT32 m_start_tile_y;
+    OPJ_UINT32 m_end_tile_x;
+    OPJ_UINT32 m_end_tile_y;
 
-	/** Index of the tile to decode (used in get_tile) */
-	OPJ_INT32 m_tile_ind_to_dec;
-	/** Position of the last SOT marker read */
-	OPJ_OFF_T m_last_sot_read_pos;
+    /** Index of the tile to decode (used in get_tile) */
+    OPJ_INT32 m_tile_ind_to_dec;
+    /** Position of the last SOT marker read */
+    OPJ_OFF_T m_last_sot_read_pos;
 
-	/**
-	 * Indicate that the current tile-part is assume as the last tile part of the codestream.
-	 * It is useful in the case of PSot is equal to zero. The sot length will be compute in the
-	 * SOD reader function. FIXME NOT USED for the moment
-	 */
-	OPJ_BOOL   m_last_tile_part;
-	/** to tell that a tile can be decoded. */
-	OPJ_UINT32 m_can_decode			: 1;
-	OPJ_UINT32 m_discard_tiles		: 1;
-	OPJ_UINT32 m_skip_data			: 1;
-	/** TNsot correction : see issue 254 **/
-	OPJ_UINT32 m_nb_tile_parts_correction_checked : 1;
-	OPJ_UINT32 m_nb_tile_parts_correction : 1;
+    /**
+     * Indicate that the current tile-part is assume as the last tile part of the codestream.
+     * It is useful in the case of PSot is equal to zero. The sot length will be compute in the
+     * SOD reader function. FIXME NOT USED for the moment
+     */
+    OPJ_BOOL   m_last_tile_part;
+    /** to tell that a tile can be decoded. */
+    OPJ_BITFIELD m_can_decode : 1;
+    OPJ_BITFIELD m_discard_tiles : 1;
+    OPJ_BITFIELD m_skip_data : 1;
+    /** TNsot correction : see issue 254 **/
+    OPJ_BITFIELD m_nb_tile_parts_correction_checked : 1;
+    OPJ_BITFIELD m_nb_tile_parts_correction : 1;
 
 } opj_j2k_dec_t;
 
-typedef struct opj_j2k_enc
-{
-	/** Tile part number, regardless of poc, for each new poc, tp is reset to 1*/
-	OPJ_UINT32 m_current_poc_tile_part_number; /* tp_num */
+typedef struct opj_j2k_enc {
+    /** Tile part number, regardless of poc, for each new poc, tp is reset to 1*/
+    OPJ_UINT32 m_current_poc_tile_part_number; /* tp_num */
 
-	/** Tile part number currently coding, taking into account POC. m_current_tile_part_number holds the total number of tile parts while encoding the last tile part.*/
-	OPJ_UINT32 m_current_tile_part_number; /*cur_tp_num */
+    /** Tile part number currently coding, taking into account POC. m_current_tile_part_number holds the total number of tile parts while encoding the last tile part.*/
+    OPJ_UINT32 m_current_tile_part_number; /*cur_tp_num */
 
-	/**
-	locate the start position of the TLM marker
-	after encoding the tilepart, a jump (in j2k_write_sod) is done to the TLM marker to store the value of its length.
-	*/
+    /**
+    locate the start position of the TLM marker
+    after encoding the tilepart, a jump (in j2k_write_sod) is done to the TLM marker to store the value of its length.
+    */
     OPJ_OFF_T m_tlm_start;
-	/**
-	 * Stores the sizes of the tlm.
-	 */
-	OPJ_BYTE * m_tlm_sot_offsets_buffer;
-	/**
-	 * The current offset of the tlm buffer.
-	 */
-	OPJ_BYTE * m_tlm_sot_offsets_current;
+    /**
+     * Stores the sizes of the tlm.
+     */
+    OPJ_BYTE * m_tlm_sot_offsets_buffer;
+    /**
+     * The current offset of the tlm buffer.
+     */
+    OPJ_BYTE * m_tlm_sot_offsets_current;
 
-	/** Total num of tile parts in whole image = num tiles* num tileparts in each tile*/
-	/** used in TLMmarker*/
-	OPJ_UINT32 m_total_tile_parts;	 /* totnum_tp */
+    /** Total num of tile parts in whole image = num tiles* num tileparts in each tile*/
+    /** used in TLMmarker*/
+    OPJ_UINT32 m_total_tile_parts;   /* totnum_tp */
 
-	/* encoded data for a tile */
-	OPJ_BYTE * m_encoded_tile_data;
+    /* encoded data for a tile */
+    OPJ_BYTE * m_encoded_tile_data;
 
-	/* size of the encoded_data */
-	OPJ_UINT32 m_encoded_tile_size;
+    /* size of the encoded_data */
+    OPJ_UINT32 m_encoded_tile_size;
 
-	/* encoded data for a tile */
-	OPJ_BYTE * m_header_tile_data;
+    /* encoded data for a tile */
+    OPJ_BYTE * m_header_tile_data;
 
-	/* size of the encoded_data */
-	OPJ_UINT32 m_header_tile_data_size;
+    /* size of the encoded_data */
+    OPJ_UINT32 m_header_tile_data_size;
 
 
 } opj_j2k_enc_t;
@@ -553,42 +536,51 @@
 /**
 JPEG-2000 codestream reader/writer
 */
-typedef struct opj_j2k
-{
-	/* J2K codestream is decoded*/
-	OPJ_BOOL m_is_decoder;
+typedef struct opj_j2k {
+    /* J2K codestream is decoded*/
+    OPJ_BOOL m_is_decoder;
 
-	/* FIXME DOC*/
-	union
-	{
-		opj_j2k_dec_t m_decoder;
-		opj_j2k_enc_t m_encoder;
-	}
-	m_specific_param;
+    /* FIXME DOC*/
+    union {
+        opj_j2k_dec_t m_decoder;
+        opj_j2k_enc_t m_encoder;
+    }
+    m_specific_param;
 
-	/** pointer to the internal/private encoded / decoded image */
-	opj_image_t* m_private_image;
+    /** pointer to the internal/private encoded / decoded image */
+    opj_image_t* m_private_image;
 
-	/* pointer to the output image (decoded)*/
-	opj_image_t* m_output_image;
+    /* pointer to the output image (decoded)*/
+    opj_image_t* m_output_image;
 
-	/** Coding parameters */
-	opj_cp_t m_cp;
+    /** Coding parameters */
+    opj_cp_t m_cp;
 
-	/** the list of procedures to exec **/
-	opj_procedure_list_t *	m_procedure_list;
+    /** the list of procedures to exec **/
+    opj_procedure_list_t *  m_procedure_list;
 
-	/** the list of validation procedures to follow to make sure the code is valid **/
-	opj_procedure_list_t *	m_validation_list;
+    /** the list of validation procedures to follow to make sure the code is valid **/
+    opj_procedure_list_t *  m_validation_list;
 
-	/** helper used to write the index file */
-	opj_codestream_index_t *cstr_index;
+    /** helper used to write the index file */
+    opj_codestream_index_t *cstr_index;
 
-	/** number of the tile curently concern by coding/decoding */
-	OPJ_UINT32 m_current_tile_number;
+    /** number of the tile currently concern by coding/decoding */
+    OPJ_UINT32 m_current_tile_number;
 
-	/** the current tile coder/decoder **/
-	struct opj_tcd *	m_tcd;
+    /** the current tile coder/decoder **/
+    struct opj_tcd *    m_tcd;
+
+    /** Number of threads to use */
+    int m_num_threads;
+
+    /** Thread pool */
+    opj_thread_pool_t* m_tp;
+
+    OPJ_UINT32 ihdr_w;
+    OPJ_UINT32 ihdr_h;
+    OPJ_UINT32 enumcs;
+    unsigned int dump_state;
 }
 opj_j2k_t;
 
@@ -601,12 +593,14 @@
 
 /**
 Setup the decoder decoding parameters using user parameters.
-Decoding parameters are returned in j2k->cp. 
+Decoding parameters are returned in j2k->cp.
 @param j2k J2K decompressor handle
 @param parameters decompression parameters
 */
 void opj_j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);
 
+OPJ_BOOL opj_j2k_set_threads(opj_j2k_t *j2k, OPJ_UINT32 num_threads);
+
 /**
  * Creates a J2K compression structure
  *
@@ -615,10 +609,10 @@
 opj_j2k_t* opj_j2k_create_compress(void);
 
 
-OPJ_BOOL opj_j2k_setup_encoder(	opj_j2k_t *p_j2k,
-						    opj_cparameters_t *parameters,
-						    opj_image_t *image,
-						    opj_event_mgr_t * p_manager);
+OPJ_BOOL opj_j2k_setup_encoder(opj_j2k_t *p_j2k,
+                               opj_cparameters_t *parameters,
+                               opj_image_t *image,
+                               opj_event_mgr_t * p_manager);
 
 /**
 Converts an enum type progression order to string type
@@ -648,87 +642,87 @@
  *
  * @return true if the box is valid.
  */
-OPJ_BOOL opj_j2k_read_header(	opj_stream_private_t *p_stream,
-                                opj_j2k_t* p_j2k,
-                                opj_image_t** p_image,
-                                opj_event_mgr_t* p_manager );
+OPJ_BOOL opj_j2k_read_header(opj_stream_private_t *p_stream,
+                             opj_j2k_t* p_j2k,
+                             opj_image_t** p_image,
+                             opj_event_mgr_t* p_manager);
 
 
 /**
  * Destroys a jpeg2000 codec.
  *
- * @param	p_j2k	the jpeg20000 structure to destroy.
+ * @param   p_j2k   the jpeg20000 structure to destroy.
  */
-void opj_j2k_destroy (opj_j2k_t *p_j2k);
+void opj_j2k_destroy(opj_j2k_t *p_j2k);
 
 /**
  * Destroys a codestream index structure.
  *
- * @param	p_cstr_ind	the codestream index parameter to destroy.
+ * @param   p_cstr_ind  the codestream index parameter to destroy.
  */
-void j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind);
+void j2k_destroy_cstr_index(opj_codestream_index_t *p_cstr_ind);
 
 /**
  * Decode tile data.
- * @param	p_j2k		the jpeg2000 codec.
- * @param	p_tile_index
+ * @param   p_j2k       the jpeg2000 codec.
+ * @param   p_tile_index
  * @param p_data       FIXME DOC
  * @param p_data_size  FIXME DOC
- * @param	p_stream			the stream to write data to.
- * @param	p_manager	the user event manager.
+ * @param   p_stream            the stream to write data to.
+ * @param   p_manager   the user event manager.
  */
-OPJ_BOOL opj_j2k_decode_tile (  opj_j2k_t * p_j2k,
-                                OPJ_UINT32 p_tile_index,
-                                OPJ_BYTE * p_data,
-                                OPJ_UINT32 p_data_size,
-                                opj_stream_private_t *p_stream,
-                                opj_event_mgr_t * p_manager );
+OPJ_BOOL opj_j2k_decode_tile(opj_j2k_t * p_j2k,
+                             OPJ_UINT32 p_tile_index,
+                             OPJ_BYTE * p_data,
+                             OPJ_UINT32 p_data_size,
+                             opj_stream_private_t *p_stream,
+                             opj_event_mgr_t * p_manager);
 
 /**
  * Reads a tile header.
- * @param	p_j2k		the jpeg2000 codec.
- * @param	p_tile_index FIXME DOC
- * @param	p_data_size FIXME DOC
- * @param	p_tile_x0 FIXME DOC
- * @param	p_tile_y0 FIXME DOC
- * @param	p_tile_x1 FIXME DOC
- * @param	p_tile_y1 FIXME DOC
- * @param	p_nb_comps FIXME DOC
- * @param	p_go_on FIXME DOC
- * @param	p_stream			the stream to write data to.
- * @param	p_manager	the user event manager.
+ * @param   p_j2k       the jpeg2000 codec.
+ * @param   p_tile_index FIXME DOC
+ * @param   p_data_size FIXME DOC
+ * @param   p_tile_x0 FIXME DOC
+ * @param   p_tile_y0 FIXME DOC
+ * @param   p_tile_x1 FIXME DOC
+ * @param   p_tile_y1 FIXME DOC
+ * @param   p_nb_comps FIXME DOC
+ * @param   p_go_on FIXME DOC
+ * @param   p_stream            the stream to write data to.
+ * @param   p_manager   the user event manager.
  */
-OPJ_BOOL opj_j2k_read_tile_header ( opj_j2k_t * p_j2k,
-                                    OPJ_UINT32 * p_tile_index,
-                                    OPJ_UINT32 * p_data_size,
-                                    OPJ_INT32 * p_tile_x0,
-                                    OPJ_INT32 * p_tile_y0,
-                                    OPJ_INT32 * p_tile_x1,
-                                    OPJ_INT32 * p_tile_y1,
-                                    OPJ_UINT32 * p_nb_comps,
-                                    OPJ_BOOL * p_go_on,
-                                    opj_stream_private_t *p_stream,
-                                    opj_event_mgr_t * p_manager );
+OPJ_BOOL opj_j2k_read_tile_header(opj_j2k_t * p_j2k,
+                                  OPJ_UINT32 * p_tile_index,
+                                  OPJ_UINT32 * p_data_size,
+                                  OPJ_INT32 * p_tile_x0,
+                                  OPJ_INT32 * p_tile_y0,
+                                  OPJ_INT32 * p_tile_x1,
+                                  OPJ_INT32 * p_tile_y1,
+                                  OPJ_UINT32 * p_nb_comps,
+                                  OPJ_BOOL * p_go_on,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 
 /**
  * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.
  *
- * @param	p_j2k			the jpeg2000 codec.
- * @param	p_image     FIXME DOC
- * @param	p_start_x		the left position of the rectangle to decode (in image coordinates).
- * @param	p_start_y		the up position of the rectangle to decode (in image coordinates).
- * @param	p_end_x			the right position of the rectangle to decode (in image coordinates).
- * @param	p_end_y			the bottom position of the rectangle to decode (in image coordinates).
- * @param	p_manager		the user event manager
+ * @param   p_j2k           the jpeg2000 codec.
+ * @param   p_image     FIXME DOC
+ * @param   p_start_x       the left position of the rectangle to decode (in image coordinates).
+ * @param   p_start_y       the up position of the rectangle to decode (in image coordinates).
+ * @param   p_end_x         the right position of the rectangle to decode (in image coordinates).
+ * @param   p_end_y         the bottom position of the rectangle to decode (in image coordinates).
+ * @param   p_manager       the user event manager
  *
- * @return	true			if the area could be set.
+ * @return  true            if the area could be set.
  */
-OPJ_BOOL opj_j2k_set_decode_area(	opj_j2k_t *p_j2k,
-								    opj_image_t* p_image,
-								    OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
-								    OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
-								    opj_event_mgr_t * p_manager );
+OPJ_BOOL opj_j2k_set_decode_area(opj_j2k_t *p_j2k,
+                                 opj_image_t* p_image,
+                                 OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+                                 OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
+                                 opj_event_mgr_t * p_manager);
 
 /**
  * Creates a J2K decompression structure.
@@ -741,48 +735,50 @@
 /**
  * Dump some elements from the J2K decompression structure .
  *
- *@param p_j2k				the jpeg2000 codec.
- *@param flag				flag to describe what elments are dump.
- *@param out_stream			output stream where dump the elements.
+ *@param p_j2k              the jpeg2000 codec.
+ *@param flag               flag to describe what elements are dump.
+ *@param out_stream         output stream where dump the elements.
  *
 */
-void j2k_dump (opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream);
+void j2k_dump(opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream);
 
 
 
 /**
  * Dump an image header structure.
  *
- *@param image			the image header to dump.
- *@param dev_dump_flag		flag to describe if we are in the case of this function is use outside j2k_dump function
- *@param out_stream			output stream where dump the elements.
+ *@param image          the image header to dump.
+ *@param dev_dump_flag      flag to describe if we are in the case of this function is use outside j2k_dump function
+ *@param out_stream         output stream where dump the elements.
  */
-void j2k_dump_image_header(opj_image_t* image, OPJ_BOOL dev_dump_flag, FILE* out_stream);
+void j2k_dump_image_header(opj_image_t* image, OPJ_BOOL dev_dump_flag,
+                           FILE* out_stream);
 
 /**
  * Dump a component image header structure.
  *
- *@param comp		the component image header to dump.
- *@param dev_dump_flag		flag to describe if we are in the case of this function is use outside j2k_dump function
- *@param out_stream			output stream where dump the elements.
+ *@param comp       the component image header to dump.
+ *@param dev_dump_flag      flag to describe if we are in the case of this function is use outside j2k_dump function
+ *@param out_stream         output stream where dump the elements.
  */
-void j2k_dump_image_comp_header(opj_image_comp_t* comp, OPJ_BOOL dev_dump_flag, FILE* out_stream);
+void j2k_dump_image_comp_header(opj_image_comp_t* comp, OPJ_BOOL dev_dump_flag,
+                                FILE* out_stream);
 
 /**
  * Get the codestream info from a JPEG2000 codec.
  *
- *@param	p_j2k				the component image header to dump.
+ *@param    p_j2k               the component image header to dump.
  *
- *@return	the codestream information extract from the jpg2000 codec
+ *@return   the codestream information extract from the jpg2000 codec
  */
 opj_codestream_info_v2_t* j2k_get_cstr_info(opj_j2k_t* p_j2k);
 
 /**
  * Get the codestream index from a JPEG2000 codec.
  *
- *@param	p_j2k				the component image header to dump.
+ *@param    p_j2k               the component image header to dump.
  *
- *@return	the codestream index extract from the jpg2000 codec
+ *@return   the codestream index extract from the jpg2000 codec
  */
 opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k);
 
@@ -800,64 +796,64 @@
                         opj_event_mgr_t *p_manager);
 
 
-OPJ_BOOL opj_j2k_get_tile(	opj_j2k_t *p_j2k,
-			    			opj_stream_private_t *p_stream,
-				    		opj_image_t* p_image,
-					    	opj_event_mgr_t * p_manager,
-						    OPJ_UINT32 tile_index );
+OPJ_BOOL opj_j2k_get_tile(opj_j2k_t *p_j2k,
+                          opj_stream_private_t *p_stream,
+                          opj_image_t* p_image,
+                          opj_event_mgr_t * p_manager,
+                          OPJ_UINT32 tile_index);
 
-OPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k, 
-                                               OPJ_UINT32 res_factor,
-                                               opj_event_mgr_t * p_manager);
+OPJ_BOOL opj_j2k_set_decoded_resolution_factor(opj_j2k_t *p_j2k,
+        OPJ_UINT32 res_factor,
+        opj_event_mgr_t * p_manager);
 
 
 /**
  * Writes a tile.
- * @param	p_j2k		the jpeg2000 codec.
+ * @param   p_j2k       the jpeg2000 codec.
  * @param p_tile_index FIXME DOC
  * @param p_data FIXME DOC
  * @param p_data_size FIXME DOC
- * @param	p_stream			the stream to write data to.
- * @param	p_manager	the user event manager.
+ * @param   p_stream            the stream to write data to.
+ * @param   p_manager   the user event manager.
  */
-OPJ_BOOL opj_j2k_write_tile (	opj_j2k_t * p_j2k,
-							    OPJ_UINT32 p_tile_index,
-							    OPJ_BYTE * p_data,
-							    OPJ_UINT32 p_data_size,
-							    opj_stream_private_t *p_stream,
-							    opj_event_mgr_t * p_manager );
+OPJ_BOOL opj_j2k_write_tile(opj_j2k_t * p_j2k,
+                            OPJ_UINT32 p_tile_index,
+                            OPJ_BYTE * p_data,
+                            OPJ_UINT32 p_data_size,
+                            opj_stream_private_t *p_stream,
+                            opj_event_mgr_t * p_manager);
 
 /**
  * Encodes an image into a JPEG-2000 codestream
  */
-OPJ_BOOL opj_j2k_encode(	opj_j2k_t * p_j2k,
-			    			opj_stream_private_t *cio,
-				    		opj_event_mgr_t * p_manager );
+OPJ_BOOL opj_j2k_encode(opj_j2k_t * p_j2k,
+                        opj_stream_private_t *cio,
+                        opj_event_mgr_t * p_manager);
 
 /**
  * Starts a compression scheme, i.e. validates the codec parameters, writes the header.
  *
- * @param	p_j2k		the jpeg2000 codec.
- * @param	p_stream			the stream object.
- * @param	p_image FIXME DOC
- * @param	p_manager	the user event manager.
+ * @param   p_j2k       the jpeg2000 codec.
+ * @param   p_stream            the stream object.
+ * @param   p_image FIXME DOC
+ * @param   p_manager   the user event manager.
  *
  * @return true if the codec is valid.
  */
 OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k,
-							    opj_stream_private_t *p_stream,
-							    opj_image_t * p_image,
-							    opj_event_mgr_t * p_manager);
+                                opj_stream_private_t *p_stream,
+                                opj_image_t * p_image,
+                                opj_event_mgr_t * p_manager);
 
 /**
  * Ends the compression procedures and possibiliy add data to be read after the
  * codestream.
  */
-OPJ_BOOL opj_j2k_end_compress( 	opj_j2k_t *p_j2k,
-							    opj_stream_private_t *cio,
-							    opj_event_mgr_t * p_manager);
+OPJ_BOOL opj_j2k_end_compress(opj_j2k_t *p_j2k,
+                              opj_stream_private_t *cio,
+                              opj_event_mgr_t * p_manager);
 
-OPJ_BOOL opj_j2k_setup_mct_encoding (opj_tcp_t * p_tcp, opj_image_t * p_image);
+OPJ_BOOL opj_j2k_setup_mct_encoding(opj_tcp_t * p_tcp, opj_image_t * p_image);
 
 
-#endif /* __J2K_H */
+#endif /* OPJ_J2K_H */
diff --git a/third_party/libopenjpeg20/jp2.c b/third_party/libopenjpeg20/jp2.c
index 8128d98..9178f3f 100644
--- a/third_party/libopenjpeg20/jp2.c
+++ b/third_party/libopenjpeg20/jp2.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,11 +8,11 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2010-2011, Kaori Hagihara
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -42,7 +42,9 @@
 /** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
 /*@{*/
 
-#define OPJ_BOX_SIZE	1024
+#define OPJ_BOX_SIZE    1024
+
+#define OPJ_UNUSED(x) (void)x
 
 /** @name Local static functions */
 /*@{*/
@@ -52,130 +54,131 @@
 /**
  * Reads a IHDR box - Image Header box
  *
- * @param	p_image_header_data			pointer to actual data (already read from file)
- * @param	jp2							the jpeg2000 file codec.
- * @param	p_image_header_size			the size of the image header
- * @param	p_manager					the user event manager.
+ * @param   p_image_header_data         pointer to actual data (already read from file)
+ * @param   jp2                         the jpeg2000 file codec.
+ * @param   p_image_header_size         the size of the image header
+ * @param   p_manager                   the user event manager.
  *
- * @return	true if the image header is valid, false else.
+ * @return  true if the image header is valid, false else.
  */
-static OPJ_BOOL opj_jp2_read_ihdr(  opj_jp2_t *jp2,
-                                    OPJ_BYTE *p_image_header_data,
-                                    OPJ_UINT32 p_image_header_size,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_read_ihdr(opj_jp2_t *jp2,
+                                  OPJ_BYTE *p_image_header_data,
+                                  OPJ_UINT32 p_image_header_size,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Writes the Image Header box - Image Header box.
  *
- * @param jp2					jpeg2000 file codec.
- * @param p_nb_bytes_written	pointer to store the nb of bytes written by the function.
+ * @param jp2                   jpeg2000 file codec.
+ * @param p_nb_bytes_written    pointer to store the nb of bytes written by the function.
  *
- * @return	the data being copied.
+ * @return  the data being copied.
 */
 static OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,
-                                     OPJ_UINT32 * p_nb_bytes_written );
+                                     OPJ_UINT32 * p_nb_bytes_written);
 
 /**
  * Writes the Bit per Component box.
  *
- * @param	jp2						jpeg2000 file codec.
- * @param	p_nb_bytes_written		pointer to store the nb of bytes written by the function.
+ * @param   jp2                     jpeg2000 file codec.
+ * @param   p_nb_bytes_written      pointer to store the nb of bytes written by the function.
  *
- * @return	the data being copied.
+ * @return  the data being copied.
 */
-static OPJ_BYTE * opj_jp2_write_bpcc(	opj_jp2_t *jp2,
-								        OPJ_UINT32 * p_nb_bytes_written );
+static OPJ_BYTE * opj_jp2_write_bpcc(opj_jp2_t *jp2,
+                                     OPJ_UINT32 * p_nb_bytes_written);
 
 /**
  * Reads a Bit per Component box.
  *
- * @param	p_bpc_header_data			pointer to actual data (already read from file)
- * @param	jp2							the jpeg2000 file codec.
- * @param	p_bpc_header_size			the size of the bpc header
- * @param	p_manager					the user event manager.
+ * @param   p_bpc_header_data           pointer to actual data (already read from file)
+ * @param   jp2                         the jpeg2000 file codec.
+ * @param   p_bpc_header_size           the size of the bpc header
+ * @param   p_manager                   the user event manager.
  *
- * @return	true if the bpc header is valid, fale else.
+ * @return  true if the bpc header is valid, false else.
  */
-static OPJ_BOOL opj_jp2_read_bpcc(  opj_jp2_t *jp2,
-                                    OPJ_BYTE * p_bpc_header_data,
-                                    OPJ_UINT32 p_bpc_header_size,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_read_bpcc(opj_jp2_t *jp2,
+                                  OPJ_BYTE * p_bpc_header_data,
+                                  OPJ_UINT32 p_bpc_header_size,
+                                  opj_event_mgr_t * p_manager);
 
-static OPJ_BOOL opj_jp2_read_cdef(	opj_jp2_t * jp2,
-                                    OPJ_BYTE * p_cdef_header_data,
-									OPJ_UINT32 p_cdef_header_size,
-									opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_read_cdef(opj_jp2_t * jp2,
+                                  OPJ_BYTE * p_cdef_header_data,
+                                  OPJ_UINT32 p_cdef_header_size,
+                                  opj_event_mgr_t * p_manager);
 
-static void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color, opj_event_mgr_t *);
+static void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color,
+                               opj_event_mgr_t *);
 
 /**
  * Writes the Channel Definition box.
  *
- * @param jp2					jpeg2000 file codec.
- * @param p_nb_bytes_written	pointer to store the nb of bytes written by the function.
+ * @param jp2                   jpeg2000 file codec.
+ * @param p_nb_bytes_written    pointer to store the nb of bytes written by the function.
  *
- * @return	the data being copied.
+ * @return  the data being copied.
  */
-static OPJ_BYTE * opj_jp2_write_cdef(   opj_jp2_t *jp2,
-																		 OPJ_UINT32 * p_nb_bytes_written );
+static OPJ_BYTE * opj_jp2_write_cdef(opj_jp2_t *jp2,
+                                     OPJ_UINT32 * p_nb_bytes_written);
 
 /**
  * Writes the Colour Specification box.
  *
- * @param jp2					jpeg2000 file codec.
- * @param p_nb_bytes_written	pointer to store the nb of bytes written by the function.
+ * @param jp2                   jpeg2000 file codec.
+ * @param p_nb_bytes_written    pointer to store the nb of bytes written by the function.
  *
- * @return	the data being copied.
+ * @return  the data being copied.
 */
-static OPJ_BYTE * opj_jp2_write_colr(   opj_jp2_t *jp2,
-									    OPJ_UINT32 * p_nb_bytes_written );
+static OPJ_BYTE * opj_jp2_write_colr(opj_jp2_t *jp2,
+                                     OPJ_UINT32 * p_nb_bytes_written);
 
 /**
  * Writes a FTYP box - File type box
  *
- * @param	cio			the stream to write data to.
- * @param	jp2			the jpeg2000 file codec.
- * @param	p_manager	the user event manager.
+ * @param   cio         the stream to write data to.
+ * @param   jp2         the jpeg2000 file codec.
+ * @param   p_manager   the user event manager.
  *
- * @return	true if writing was successful.
+ * @return  true if writing was successful.
  */
-static OPJ_BOOL opj_jp2_write_ftyp(	opj_jp2_t *jp2,
-									opj_stream_private_t *cio,
-									opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_write_ftyp(opj_jp2_t *jp2,
+                                   opj_stream_private_t *cio,
+                                   opj_event_mgr_t * p_manager);
 
 /**
  * Reads a a FTYP box - File type box
  *
- * @param	p_header_data	the data contained in the FTYP box.
- * @param	jp2				the jpeg2000 file codec.
- * @param	p_header_size	the size of the data contained in the FTYP box.
- * @param	p_manager		the user event manager.
+ * @param   p_header_data   the data contained in the FTYP box.
+ * @param   jp2             the jpeg2000 file codec.
+ * @param   p_header_size   the size of the data contained in the FTYP box.
+ * @param   p_manager       the user event manager.
  *
  * @return true if the FTYP box is valid.
  */
-static OPJ_BOOL opj_jp2_read_ftyp(	opj_jp2_t *jp2,
-									OPJ_BYTE * p_header_data,
-									OPJ_UINT32 p_header_size,
-									opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_read_ftyp(opj_jp2_t *jp2,
+                                  OPJ_BYTE * p_header_data,
+                                  OPJ_UINT32 p_header_size,
+                                  opj_event_mgr_t * p_manager);
 
-static OPJ_BOOL opj_jp2_skip_jp2c(	opj_jp2_t *jp2,
-						    opj_stream_private_t *cio,
-						    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_skip_jp2c(opj_jp2_t *jp2,
+                                  opj_stream_private_t *cio,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
  *
- * @param	p_header_data	the data contained in the file header box.
- * @param	jp2				the jpeg2000 file codec.
- * @param	p_header_size	the size of the data contained in the file header box.
- * @param	p_manager		the user event manager.
+ * @param   p_header_data   the data contained in the file header box.
+ * @param   jp2             the jpeg2000 file codec.
+ * @param   p_header_size   the size of the data contained in the file header box.
+ * @param   p_manager       the user event manager.
  *
  * @return true if the JP2 Header box was successfully recognized.
 */
-static OPJ_BOOL opj_jp2_read_jp2h(  opj_jp2_t *jp2,
-                                    OPJ_BYTE *p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_read_jp2h(opj_jp2_t *jp2,
+                                  OPJ_BYTE *p_header_data,
+                                  OPJ_UINT32 p_header_size,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Writes the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
@@ -187,61 +190,61 @@
  * @return true if writing was successful.
  */
 static OPJ_BOOL opj_jp2_write_jp2h(opj_jp2_t *jp2,
-														opj_stream_private_t *stream,
-														opj_event_mgr_t * p_manager );
+                                   opj_stream_private_t *stream,
+                                   opj_event_mgr_t * p_manager);
 
 /**
  * Writes the Jpeg2000 codestream Header box - JP2C Header box. This function must be called AFTER the coding has been done.
  *
- * @param	cio			the stream to write data to.
- * @param	jp2			the jpeg2000 file codec.
- * @param	p_manager	user event manager.
+ * @param   cio         the stream to write data to.
+ * @param   jp2         the jpeg2000 file codec.
+ * @param   p_manager   user event manager.
  *
  * @return true if writing was successful.
 */
-static OPJ_BOOL opj_jp2_write_jp2c(	opj_jp2_t *jp2,
-								    opj_stream_private_t *cio,
-								    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_write_jp2c(opj_jp2_t *jp2,
+                                   opj_stream_private_t *cio,
+                                   opj_event_mgr_t * p_manager);
 
 #ifdef USE_JPIP
 /**
  * Write index Finder box
  * @param cio     the stream to write to.
- * @param	jp2			the jpeg2000 file codec.
- * @param	p_manager	user event manager.
+ * @param   jp2         the jpeg2000 file codec.
+ * @param   p_manager   user event manager.
 */
-static OPJ_BOOL opj_jpip_write_iptr(	opj_jp2_t *jp2,
-								    opj_stream_private_t *cio,
-								    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jpip_write_iptr(opj_jp2_t *jp2,
+                                    opj_stream_private_t *cio,
+                                    opj_event_mgr_t * p_manager);
 
 /**
  * Write index Finder box
  * @param cio     the stream to write to.
- * @param	jp2			the jpeg2000 file codec.
- * @param	p_manager	user event manager.
+ * @param   jp2         the jpeg2000 file codec.
+ * @param   p_manager   user event manager.
  */
 static OPJ_BOOL opj_jpip_write_cidx(opj_jp2_t *jp2,
-  opj_stream_private_t *cio,
-  opj_event_mgr_t * p_manager );
+                                    opj_stream_private_t *cio,
+                                    opj_event_mgr_t * p_manager);
 
 /**
  * Write file Index (superbox)
  * @param cio     the stream to write to.
- * @param	jp2			the jpeg2000 file codec.
- * @param	p_manager	user event manager.
+ * @param   jp2         the jpeg2000 file codec.
+ * @param   p_manager   user event manager.
  */
 static OPJ_BOOL opj_jpip_write_fidx(opj_jp2_t *jp2,
-  opj_stream_private_t *cio,
-  opj_event_mgr_t * p_manager );
+                                    opj_stream_private_t *cio,
+                                    opj_event_mgr_t * p_manager);
 #endif /* USE_JPIP */
 
 /**
  * Reads a jpeg2000 file signature box.
  *
- * @param	p_header_data	the data contained in the signature box.
- * @param	jp2				the jpeg2000 file codec.
- * @param	p_header_size	the size of the data contained in the signature box.
- * @param	p_manager		the user event manager.
+ * @param   p_header_data   the data contained in the signature box.
+ * @param   jp2             the jpeg2000 file codec.
+ * @param   p_header_size   the size of the data contained in the signature box.
+ * @param   p_manager       the user event manager.
  *
  * @return true if the file signature box is valid.
  */
@@ -254,21 +257,25 @@
  * Writes a jpeg2000 file signature box.
  *
  * @param cio the stream to write data to.
- * @param	jp2			the jpeg2000 file codec.
+ * @param   jp2         the jpeg2000 file codec.
  * @param p_manager the user event manager.
  *
  * @return true if writing was successful.
  */
-static OPJ_BOOL opj_jp2_write_jp(	opj_jp2_t *jp2,
-			    	        	    opj_stream_private_t *cio,
-				            		opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_write_jp(opj_jp2_t *jp2,
+                                 opj_stream_private_t *cio,
+                                 opj_event_mgr_t * p_manager);
 
 /**
 Apply collected palette data
-@param color Collector for profile, cdef and pclr data
-@param image
+@param image Image.
+@param color Collector for profile, cdef and pclr data.
+@param p_manager the user event manager.
+@return true in case of success
 */
-static void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color);
+static OPJ_BOOL opj_jp2_apply_pclr(opj_image_t *image,
+                                   opj_jp2_color_t *color,
+                                   opj_event_mgr_t * p_manager);
 
 static void opj_jp2_free_pclr(opj_jp2_color_t *color);
 
@@ -282,10 +289,10 @@
  *
  * @return Returns true if successful, returns false otherwise
 */
-static OPJ_BOOL opj_jp2_read_pclr(	opj_jp2_t *jp2,
-                                    OPJ_BYTE * p_pclr_header_data,
-                                    OPJ_UINT32 p_pclr_header_size,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_read_pclr(opj_jp2_t *jp2,
+                                  OPJ_BYTE * p_pclr_header_data,
+                                  OPJ_UINT32 p_pclr_header_size,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Collect component mapping data
@@ -298,25 +305,25 @@
  * @return Returns true if successful, returns false otherwise
 */
 
-static OPJ_BOOL opj_jp2_read_cmap(	opj_jp2_t * jp2,
-                                    OPJ_BYTE * p_cmap_header_data,
-                                    OPJ_UINT32 p_cmap_header_size,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_read_cmap(opj_jp2_t * jp2,
+                                  OPJ_BYTE * p_cmap_header_data,
+                                  OPJ_UINT32 p_cmap_header_size,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Reads the Color Specification box.
  *
- * @param	p_colr_header_data			pointer to actual data (already read from file)
- * @param	jp2							the jpeg2000 file codec.
- * @param	p_colr_header_size			the size of the color header
- * @param	p_manager					the user event manager.
+ * @param   p_colr_header_data          pointer to actual data (already read from file)
+ * @param   jp2                         the jpeg2000 file codec.
+ * @param   p_colr_header_size          the size of the color header
+ * @param   p_manager                   the user event manager.
  *
- * @return	true if the bpc header is valid, fale else.
+ * @return  true if the bpc header is valid, false else.
 */
-static OPJ_BOOL opj_jp2_read_colr(  opj_jp2_t *jp2,
-                                    OPJ_BYTE * p_colr_header_data,
-                                    OPJ_UINT32 p_colr_header_size,
-                                    opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_read_colr(opj_jp2_t *jp2,
+                                  OPJ_BYTE * p_colr_header_data,
+                                  OPJ_UINT32 p_colr_header_size,
+                                  opj_event_mgr_t * p_manager);
 
 /*@}*/
 
@@ -326,13 +333,15 @@
  * Sets up the procedures to do on writing header after the codestream.
  * Developpers wanting to extend the library can add their own writing procedures.
  */
-static OPJ_BOOL opj_jp2_setup_end_header_writing (opj_jp2_t *jp2, opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_jp2_setup_end_header_writing(opj_jp2_t *jp2,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Sets up the procedures to do on reading header after the codestream.
  * Developpers wanting to extend the library can add their own writing procedures.
  */
-static OPJ_BOOL opj_jp2_setup_end_header_reading (opj_jp2_t *jp2, opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_jp2_setup_end_header_reading(opj_jp2_t *jp2,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Reads a jpeg2000 file header structure.
@@ -343,34 +352,34 @@
  *
  * @return true if the box is valid.
  */
-static OPJ_BOOL opj_jp2_read_header_procedure(  opj_jp2_t *jp2,
-                                                opj_stream_private_t *stream,
-                                                opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_read_header_procedure(opj_jp2_t *jp2,
+        opj_stream_private_t *stream,
+        opj_event_mgr_t * p_manager);
 
 /**
- * Excutes the given procedures on the given codec.
+ * Executes the given procedures on the given codec.
  *
- * @param	p_procedure_list	the list of procedures to execute
- * @param	jp2					the jpeg2000 file codec to execute the procedures on.
- * @param	stream					the stream to execute the procedures on.
- * @param	p_manager			the user manager.
+ * @param   p_procedure_list    the list of procedures to execute
+ * @param   jp2                 the jpeg2000 file codec to execute the procedures on.
+ * @param   stream                  the stream to execute the procedures on.
+ * @param   p_manager           the user manager.
  *
- * @return	true				if all the procedures were successfully executed.
+ * @return  true                if all the procedures were successfully executed.
  */
-static OPJ_BOOL opj_jp2_exec (  opj_jp2_t * jp2,
-                                opj_procedure_list_t * p_procedure_list,
-                                opj_stream_private_t *stream,
-                                opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_exec(opj_jp2_t * jp2,
+                             opj_procedure_list_t * p_procedure_list,
+                             opj_stream_private_t *stream,
+                             opj_event_mgr_t * p_manager);
 
 /**
  * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure.
  *
- * @param	cio						the input stream to read data from.
- * @param	box						the box structure to fill.
- * @param	p_number_bytes_read		pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
- * @param	p_manager				user event manager.
+ * @param   cio                     the input stream to read data from.
+ * @param   box                     the box structure to fill.
+ * @param   p_number_bytes_read     pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
+ * @param   p_manager               user event manager.
  *
- * @return	true if the box is recognized, false otherwise
+ * @return  true if the box is recognized, false otherwise
 */
 static OPJ_BOOL opj_jp2_read_boxhdr(opj_jp2_box_t *box,
                                     OPJ_UINT32 * p_number_bytes_read,
@@ -378,445 +387,489 @@
                                     opj_event_mgr_t * p_manager);
 
 /**
- * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
+ * Sets up the validation ,i.e. adds the procedures to launch to make sure the codec parameters
  * are valid. Developpers wanting to extend the library can add their own validation procedures.
  */
-static OPJ_BOOL opj_jp2_setup_encoding_validation (opj_jp2_t *jp2, opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_jp2_setup_encoding_validation(opj_jp2_t *jp2,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Sets up the procedures to do on writing header. Developpers wanting to extend the library can add their own writing procedures.
  */
-static OPJ_BOOL opj_jp2_setup_header_writing (opj_jp2_t *jp2, opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_jp2_setup_header_writing(opj_jp2_t *jp2,
+        opj_event_mgr_t * p_manager);
 
-static OPJ_BOOL opj_jp2_default_validation (	opj_jp2_t * jp2,
-                                        opj_stream_private_t *cio,
-                                        opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_default_validation(opj_jp2_t * jp2,
+        opj_stream_private_t *cio,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Finds the image execution function related to the given box id.
  *
- * @param	p_id	the id of the handler to fetch.
+ * @param   p_id    the id of the handler to fetch.
  *
- * @return	the given handler or NULL if it could not be found.
+ * @return  the given handler or NULL if it could not be found.
  */
-static const opj_jp2_header_handler_t * opj_jp2_img_find_handler (OPJ_UINT32 p_id);
+static const opj_jp2_header_handler_t * opj_jp2_img_find_handler(
+    OPJ_UINT32 p_id);
 
 /**
  * Finds the execution function related to the given box id.
  *
- * @param	p_id	the id of the handler to fetch.
+ * @param   p_id    the id of the handler to fetch.
  *
- * @return	the given handler or NULL if it could not be found.
+ * @return  the given handler or NULL if it could not be found.
  */
-static const opj_jp2_header_handler_t * opj_jp2_find_handler (OPJ_UINT32 p_id );
+static const opj_jp2_header_handler_t * opj_jp2_find_handler(OPJ_UINT32 p_id);
 
-static const opj_jp2_header_handler_t jp2_header [] =
-{
-	{JP2_JP,opj_jp2_read_jp},
-	{JP2_FTYP,opj_jp2_read_ftyp},
-	{JP2_JP2H,opj_jp2_read_jp2h}
+static const opj_jp2_header_handler_t jp2_header [] = {
+    {JP2_JP, opj_jp2_read_jp},
+    {JP2_FTYP, opj_jp2_read_ftyp},
+    {JP2_JP2H, opj_jp2_read_jp2h}
 };
 
-static const opj_jp2_header_handler_t jp2_img_header [] =
-{
-	{JP2_IHDR,opj_jp2_read_ihdr},
-	{JP2_COLR,opj_jp2_read_colr},
-	{JP2_BPCC,opj_jp2_read_bpcc},
-	{JP2_PCLR,opj_jp2_read_pclr},
-	{JP2_CMAP,opj_jp2_read_cmap},
-	{JP2_CDEF,opj_jp2_read_cdef}
+static const opj_jp2_header_handler_t jp2_img_header [] = {
+    {JP2_IHDR, opj_jp2_read_ihdr},
+    {JP2_COLR, opj_jp2_read_colr},
+    {JP2_BPCC, opj_jp2_read_bpcc},
+    {JP2_PCLR, opj_jp2_read_pclr},
+    {JP2_CMAP, opj_jp2_read_cmap},
+    {JP2_CDEF, opj_jp2_read_cdef}
 
 };
 
 /**
  * Reads a box header. The box is the way data is packed inside a jpeg2000 file structure. Data is read from a character string
  *
- * @param	box						the box structure to fill.
- * @param	p_data					the character string to read data from.
- * @param	p_number_bytes_read		pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
- * @param	p_box_max_size			the maximum number of bytes in the box.
- * @param	p_manager         FIXME DOC
+ * @param   box                     the box structure to fill.
+ * @param   p_data                  the character string to read data from.
+ * @param   p_number_bytes_read     pointer to an int that will store the number of bytes read from the stream (shoul usually be 2).
+ * @param   p_box_max_size          the maximum number of bytes in the box.
+ * @param   p_manager         FIXME DOC
  *
- * @return	true if the box is recognized, false otherwise
+ * @return  true if the box is recognized, false otherwise
 */
-static OPJ_BOOL opj_jp2_read_boxhdr_char(   opj_jp2_box_t *box,
-                                            OPJ_BYTE * p_data,
-                                            OPJ_UINT32 * p_number_bytes_read,
-                                            OPJ_UINT32 p_box_max_size,
-                                            opj_event_mgr_t * p_manager );
+static OPJ_BOOL opj_jp2_read_boxhdr_char(opj_jp2_box_t *box,
+        OPJ_BYTE * p_data,
+        OPJ_UINT32 * p_number_bytes_read,
+        OPJ_UINT32 p_box_max_size,
+        opj_event_mgr_t * p_manager);
 
 /**
- * Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters
+ * Sets up the validation ,i.e. adds the procedures to launch to make sure the codec parameters
  * are valid. Developpers wanting to extend the library can add their own validation procedures.
  */
-static OPJ_BOOL opj_jp2_setup_decoding_validation (opj_jp2_t *jp2, opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_jp2_setup_decoding_validation(opj_jp2_t *jp2,
+        opj_event_mgr_t * p_manager);
 
 /**
  * Sets up the procedures to do on reading header.
  * Developpers wanting to extend the library can add their own writing procedures.
  */
-static OPJ_BOOL opj_jp2_setup_header_reading (opj_jp2_t *jp2, opj_event_mgr_t * p_manager);
+static OPJ_BOOL opj_jp2_setup_header_reading(opj_jp2_t *jp2,
+        opj_event_mgr_t * p_manager);
 
 /* ----------------------------------------------------------------------- */
 static OPJ_BOOL opj_jp2_read_boxhdr(opj_jp2_box_t *box,
-                              OPJ_UINT32 * p_number_bytes_read,
-                              opj_stream_private_t *cio,
-                              opj_event_mgr_t * p_manager )
+                                    OPJ_UINT32 * p_number_bytes_read,
+                                    opj_stream_private_t *cio,
+                                    opj_event_mgr_t * p_manager)
 {
-	/* read header from file */
-	OPJ_BYTE l_data_header [8];
+    /* read header from file */
+    OPJ_BYTE l_data_header [8];
 
-	/* preconditions */
-	assert(cio != 00);
-	assert(box != 00);
-	assert(p_number_bytes_read != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(cio != 00);
+    assert(box != 00);
+    assert(p_number_bytes_read != 00);
+    assert(p_manager != 00);
 
-	*p_number_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio,l_data_header,8,p_manager);
-	if (*p_number_bytes_read != 8) {
-		return OPJ_FALSE;
-	}
-
-	/* process read data */
-	opj_read_bytes(l_data_header,&(box->length), 4);
-	opj_read_bytes(l_data_header+4,&(box->type), 4);
-    
-  if(box->length == 0)/* last box */
-    {
-    const OPJ_OFF_T bleft = opj_stream_get_number_byte_left(cio);
-    box->length = (OPJ_UINT32)bleft;
-    assert( (OPJ_OFF_T)box->length == bleft );
-    return OPJ_TRUE;
+    *p_number_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio, l_data_header, 8,
+                           p_manager);
+    if (*p_number_bytes_read != 8) {
+        return OPJ_FALSE;
     }
 
-	/* do we have a "special very large box ?" */
-	/* read then the XLBox */
-	if (box->length == 1) {
-		OPJ_UINT32 l_xl_part_size;
+    /* process read data */
+    opj_read_bytes(l_data_header, &(box->length), 4);
+    opj_read_bytes(l_data_header + 4, &(box->type), 4);
 
-		OPJ_UINT32 l_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio,l_data_header,8,p_manager);
-		if (l_nb_bytes_read != 8) {
-			if (l_nb_bytes_read > 0) {
-				*p_number_bytes_read += l_nb_bytes_read;
-			}
+    if (box->length == 0) { /* last box */
+        const OPJ_OFF_T bleft = opj_stream_get_number_byte_left(cio);
+        if (bleft > (OPJ_OFF_T)(0xFFFFFFFFU - 8U)) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Cannot handle box sizes higher than 2^32\n");
+            return OPJ_FALSE;
+        }
+        box->length = (OPJ_UINT32)bleft + 8U;
+        assert((OPJ_OFF_T)box->length == bleft + 8);
+        return OPJ_TRUE;
+    }
 
-			return OPJ_FALSE;
-		}
+    /* do we have a "special very large box ?" */
+    /* read then the XLBox */
+    if (box->length == 1) {
+        OPJ_UINT32 l_xl_part_size;
+
+        OPJ_UINT32 l_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(cio,
+                                     l_data_header, 8, p_manager);
+        if (l_nb_bytes_read != 8) {
+            if (l_nb_bytes_read > 0) {
+                *p_number_bytes_read += l_nb_bytes_read;
+            }
+
+            return OPJ_FALSE;
+        }
 
         *p_number_bytes_read = 16;
-		opj_read_bytes(l_data_header,&l_xl_part_size, 4);
-		if (l_xl_part_size != 0) {
-			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
-			return OPJ_FALSE;
-		}
-		opj_read_bytes(l_data_header+4,&(box->length), 4);
-	}
+        opj_read_bytes(l_data_header, &l_xl_part_size, 4);
+        if (l_xl_part_size != 0) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Cannot handle box sizes higher than 2^32\n");
+            return OPJ_FALSE;
+        }
+        opj_read_bytes(l_data_header + 4, &(box->length), 4);
+    }
     return OPJ_TRUE;
 }
 
 #if 0
-static void jp2_write_url(opj_cio_t *cio, char *Idx_file) {
-	OPJ_UINT32 i;
-	opj_jp2_box_t box;
+static void jp2_write_url(opj_cio_t *cio, char *Idx_file)
+{
+    OPJ_UINT32 i;
+    opj_jp2_box_t box;
 
-	box.init_pos = cio_tell(cio);
-	cio_skip(cio, 4);
-	cio_write(cio, JP2_URL, 4);	/* DBTL */
-	cio_write(cio, 0, 1);		/* VERS */
-	cio_write(cio, 0, 3);		/* FLAG */
+    box.init_pos = cio_tell(cio);
+    cio_skip(cio, 4);
+    cio_write(cio, JP2_URL, 4); /* DBTL */
+    cio_write(cio, 0, 1);       /* VERS */
+    cio_write(cio, 0, 3);       /* FLAG */
 
-	if(Idx_file) {
-		for (i = 0; i < strlen(Idx_file); i++) {
-			cio_write(cio, Idx_file[i], 1);
-		}
-	}
+    if (Idx_file) {
+        for (i = 0; i < strlen(Idx_file); i++) {
+            cio_write(cio, Idx_file[i], 1);
+        }
+    }
 
-	box.length = cio_tell(cio) - box.init_pos;
-	cio_seek(cio, box.init_pos);
-	cio_write(cio, box.length, 4);	/* L */
-	cio_seek(cio, box.init_pos + box.length);
+    box.length = cio_tell(cio) - box.init_pos;
+    cio_seek(cio, box.init_pos);
+    cio_write(cio, box.length, 4);  /* L */
+    cio_seek(cio, box.init_pos + box.length);
 }
 #endif
 
-static OPJ_BOOL opj_jp2_read_ihdr( opj_jp2_t *jp2,
-                            OPJ_BYTE *p_image_header_data,
-                            OPJ_UINT32 p_image_header_size,
-                            opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_jp2_read_ihdr(opj_jp2_t *jp2,
+                                  OPJ_BYTE *p_image_header_data,
+                                  OPJ_UINT32 p_image_header_size,
+                                  opj_event_mgr_t * p_manager)
 {
-	/* preconditions */
-	assert(p_image_header_data != 00);
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(p_image_header_data != 00);
+    assert(jp2 != 00);
+    assert(p_manager != 00);
 
-	if (p_image_header_size != 14) {
-		opj_event_msg(p_manager, EVT_ERROR, "Bad image header box (bad size)\n");
-		return OPJ_FALSE;
-	}
+    if (jp2->comps != NULL) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "Ignoring ihdr box. First ihdr box already read\n");
+        return OPJ_TRUE;
+    }
 
-	opj_read_bytes(p_image_header_data,&(jp2->h),4);			/* HEIGHT */
-	p_image_header_data += 4;
-	opj_read_bytes(p_image_header_data,&(jp2->w),4);			/* WIDTH */
-	p_image_header_data += 4;
-	opj_read_bytes(p_image_header_data,&(jp2->numcomps),2);		/* NC */
-	p_image_header_data += 2;
+    if (p_image_header_size != 14) {
+        opj_event_msg(p_manager, EVT_ERROR, "Bad image header box (bad size)\n");
+        return OPJ_FALSE;
+    }
 
-	/* allocate memory for components */
-	opj_free(jp2->comps);
-	jp2->comps = (opj_jp2_comps_t*) opj_calloc(jp2->numcomps, sizeof(opj_jp2_comps_t));
-	if (jp2->comps == 0) {
-		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle image header (ihdr)\n");
-		return OPJ_FALSE;
-	}
+    opj_read_bytes(p_image_header_data, &(jp2->h), 4);          /* HEIGHT */
+    p_image_header_data += 4;
+    opj_read_bytes(p_image_header_data, &(jp2->w), 4);          /* WIDTH */
+    p_image_header_data += 4;
+    opj_read_bytes(p_image_header_data, &(jp2->numcomps), 2);   /* NC */
+    p_image_header_data += 2;
 
-	opj_read_bytes(p_image_header_data,&(jp2->bpc),1);			/* BPC */
-	++ p_image_header_data;
+    if ((jp2->numcomps - 1U) >=
+            16384U) { /* unsigned underflow is well defined: 1U <= jp2->numcomps <= 16384U */
+        opj_event_msg(p_manager, EVT_ERROR, "Invalid number of components (ihdr)\n");
+        return OPJ_FALSE;
+    }
 
-	opj_read_bytes(p_image_header_data,&(jp2->C),1);			/* C */
-	++ p_image_header_data;
+    /* allocate memory for components */
+    opj_free(jp2->comps);
+    jp2->comps = (opj_jp2_comps_t*) opj_calloc(jp2->numcomps,
+                 sizeof(opj_jp2_comps_t));
+    if (jp2->comps == 0) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Not enough memory to handle image header (ihdr)\n");
+        return OPJ_FALSE;
+    }
 
-	/* Should be equal to 7 cf. chapter about image header box of the norm */
-	if (jp2->C != 7){
-		opj_event_msg(p_manager, EVT_INFO, "JP2 IHDR box: compression type indicate that the file is not a conforming JP2 file (%d) \n", jp2->C);
-	}
+    opj_read_bytes(p_image_header_data, &(jp2->bpc), 1);        /* BPC */
+    ++ p_image_header_data;
 
-	opj_read_bytes(p_image_header_data,&(jp2->UnkC),1);			/* UnkC */
-	++ p_image_header_data;
-	opj_read_bytes(p_image_header_data,&(jp2->IPR),1);			/* IPR */
-	++ p_image_header_data;
+    opj_read_bytes(p_image_header_data, &(jp2->C), 1);          /* C */
+    ++ p_image_header_data;
 
-	return OPJ_TRUE;
+    /* Should be equal to 7 cf. chapter about image header box of the norm */
+    if (jp2->C != 7) {
+        opj_event_msg(p_manager, EVT_INFO,
+                      "JP2 IHDR box: compression type indicate that the file is not a conforming JP2 file (%d) \n",
+                      jp2->C);
+    }
+
+    opj_read_bytes(p_image_header_data, &(jp2->UnkC), 1);       /* UnkC */
+    ++ p_image_header_data;
+    opj_read_bytes(p_image_header_data, &(jp2->IPR), 1);        /* IPR */
+    ++ p_image_header_data;
+
+    jp2->j2k->m_cp.allow_different_bit_depth_sign = (jp2->bpc == 255);
+    jp2->j2k->ihdr_w = jp2->w;
+    jp2->j2k->ihdr_h = jp2->h;
+    jp2->has_ihdr = 1;
+
+    return OPJ_TRUE;
 }
 
 static OPJ_BYTE * opj_jp2_write_ihdr(opj_jp2_t *jp2,
-                              OPJ_UINT32 * p_nb_bytes_written
-                              )
+                                     OPJ_UINT32 * p_nb_bytes_written
+                                    )
 {
-	OPJ_BYTE * l_ihdr_data,* l_current_ihdr_ptr;
-	
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_nb_bytes_written != 00);
+    OPJ_BYTE * l_ihdr_data, * l_current_ihdr_ptr;
 
-	/* default image header is 22 bytes wide */
-	l_ihdr_data = (OPJ_BYTE *) opj_calloc(1,22);
-	if (l_ihdr_data == 00) {
-		return 00;
-	}
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_nb_bytes_written != 00);
 
-	l_current_ihdr_ptr = l_ihdr_data;
-	
-	opj_write_bytes(l_current_ihdr_ptr,22,4);				/* write box size */
-	l_current_ihdr_ptr+=4;
+    /* default image header is 22 bytes wide */
+    l_ihdr_data = (OPJ_BYTE *) opj_calloc(1, 22);
+    if (l_ihdr_data == 00) {
+        return 00;
+    }
 
-	opj_write_bytes(l_current_ihdr_ptr,JP2_IHDR, 4);		/* IHDR */
-	l_current_ihdr_ptr+=4;
-	
-	opj_write_bytes(l_current_ihdr_ptr,jp2->h, 4);		/* HEIGHT */
-	l_current_ihdr_ptr+=4;
-	
-	opj_write_bytes(l_current_ihdr_ptr, jp2->w, 4);		/* WIDTH */
-	l_current_ihdr_ptr+=4;
-	
-	opj_write_bytes(l_current_ihdr_ptr, jp2->numcomps, 2);		/* NC */
-	l_current_ihdr_ptr+=2;
-	
-	opj_write_bytes(l_current_ihdr_ptr, jp2->bpc, 1);		/* BPC */
-	++l_current_ihdr_ptr;
-	
-	opj_write_bytes(l_current_ihdr_ptr, jp2->C, 1);		/* C : Always 7 */
-	++l_current_ihdr_ptr;
-	
-	opj_write_bytes(l_current_ihdr_ptr, jp2->UnkC, 1);		/* UnkC, colorspace unknown */
-	++l_current_ihdr_ptr;
-	
-	opj_write_bytes(l_current_ihdr_ptr, jp2->IPR, 1);		/* IPR, no intellectual property */
-	++l_current_ihdr_ptr;
-	
-	*p_nb_bytes_written = 22;
-	
-	return l_ihdr_data;
+    l_current_ihdr_ptr = l_ihdr_data;
+
+    opj_write_bytes(l_current_ihdr_ptr, 22, 4);             /* write box size */
+    l_current_ihdr_ptr += 4;
+
+    opj_write_bytes(l_current_ihdr_ptr, JP2_IHDR, 4);       /* IHDR */
+    l_current_ihdr_ptr += 4;
+
+    opj_write_bytes(l_current_ihdr_ptr, jp2->h, 4);     /* HEIGHT */
+    l_current_ihdr_ptr += 4;
+
+    opj_write_bytes(l_current_ihdr_ptr, jp2->w, 4);     /* WIDTH */
+    l_current_ihdr_ptr += 4;
+
+    opj_write_bytes(l_current_ihdr_ptr, jp2->numcomps, 2);      /* NC */
+    l_current_ihdr_ptr += 2;
+
+    opj_write_bytes(l_current_ihdr_ptr, jp2->bpc, 1);       /* BPC */
+    ++l_current_ihdr_ptr;
+
+    opj_write_bytes(l_current_ihdr_ptr, jp2->C, 1);     /* C : Always 7 */
+    ++l_current_ihdr_ptr;
+
+    opj_write_bytes(l_current_ihdr_ptr, jp2->UnkC,
+                    1);      /* UnkC, colorspace unknown */
+    ++l_current_ihdr_ptr;
+
+    opj_write_bytes(l_current_ihdr_ptr, jp2->IPR,
+                    1);       /* IPR, no intellectual property */
+    ++l_current_ihdr_ptr;
+
+    *p_nb_bytes_written = 22;
+
+    return l_ihdr_data;
 }
 
-static OPJ_BYTE * opj_jp2_write_bpcc(	opj_jp2_t *jp2,
-						        OPJ_UINT32 * p_nb_bytes_written
-                                )
+static OPJ_BYTE * opj_jp2_write_bpcc(opj_jp2_t *jp2,
+                                     OPJ_UINT32 * p_nb_bytes_written
+                                    )
 {
-	OPJ_UINT32 i;
-	/* room for 8 bytes for box and 1 byte for each component */
-	OPJ_UINT32 l_bpcc_size = 8 + jp2->numcomps;
-	OPJ_BYTE * l_bpcc_data,* l_current_bpcc_ptr;
-	
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_nb_bytes_written != 00);
+    OPJ_UINT32 i;
+    /* room for 8 bytes for box and 1 byte for each component */
+    OPJ_UINT32 l_bpcc_size;
+    OPJ_BYTE * l_bpcc_data, * l_current_bpcc_ptr;
 
-	l_bpcc_data = (OPJ_BYTE *) opj_calloc(1,l_bpcc_size);
-	if (l_bpcc_data == 00) {
-		return 00;
-	}
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_nb_bytes_written != 00);
+    l_bpcc_size = 8 + jp2->numcomps;
 
-	l_current_bpcc_ptr = l_bpcc_data;
+    l_bpcc_data = (OPJ_BYTE *) opj_calloc(1, l_bpcc_size);
+    if (l_bpcc_data == 00) {
+        return 00;
+    }
 
-	opj_write_bytes(l_current_bpcc_ptr,l_bpcc_size,4);				/* write box size */
-	l_current_bpcc_ptr += 4;
-	
-	opj_write_bytes(l_current_bpcc_ptr,JP2_BPCC,4);					/* BPCC */
-	l_current_bpcc_ptr += 4;
+    l_current_bpcc_ptr = l_bpcc_data;
 
-	for (i = 0; i < jp2->numcomps; ++i)  {
-		opj_write_bytes(l_current_bpcc_ptr, jp2->comps[i].bpcc, 1); /* write each component information */
-		++l_current_bpcc_ptr;
-	}
+    opj_write_bytes(l_current_bpcc_ptr, l_bpcc_size,
+                    4);            /* write box size */
+    l_current_bpcc_ptr += 4;
 
-	*p_nb_bytes_written = l_bpcc_size;
-	
-	return l_bpcc_data;
+    opj_write_bytes(l_current_bpcc_ptr, JP2_BPCC, 4);               /* BPCC */
+    l_current_bpcc_ptr += 4;
+
+    for (i = 0; i < jp2->numcomps; ++i)  {
+        opj_write_bytes(l_current_bpcc_ptr, jp2->comps[i].bpcc,
+                        1); /* write each component information */
+        ++l_current_bpcc_ptr;
+    }
+
+    *p_nb_bytes_written = l_bpcc_size;
+
+    return l_bpcc_data;
 }
 
-static OPJ_BOOL opj_jp2_read_bpcc( opj_jp2_t *jp2,
-                            OPJ_BYTE * p_bpc_header_data,
-                            OPJ_UINT32 p_bpc_header_size,
-                            opj_event_mgr_t * p_manager
-                            )
+static OPJ_BOOL opj_jp2_read_bpcc(opj_jp2_t *jp2,
+                                  OPJ_BYTE * p_bpc_header_data,
+                                  OPJ_UINT32 p_bpc_header_size,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-	OPJ_UINT32 i;
+    OPJ_UINT32 i;
 
-	/* preconditions */
-	assert(p_bpc_header_data != 00);
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(p_bpc_header_data != 00);
+    assert(jp2 != 00);
+    assert(p_manager != 00);
 
-	
-	if (jp2->bpc != 255 ){
-		opj_event_msg(p_manager, EVT_WARNING, "A BPCC header box is available although BPC given by the IHDR box (%d) indicate components bit depth is constant\n",jp2->bpc);
-	}
 
-	/* and length is relevant */
-	if (p_bpc_header_size != jp2->numcomps) {
-		opj_event_msg(p_manager, EVT_ERROR, "Bad BPCC header box (bad size)\n");
-		return OPJ_FALSE;
-	}
+    if (jp2->bpc != 255) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "A BPCC header box is available although BPC given by the IHDR box (%d) indicate components bit depth is constant\n",
+                      jp2->bpc);
+    }
 
-	/* read info for each component */
-	for (i = 0; i < jp2->numcomps; ++i) {
-		opj_read_bytes(p_bpc_header_data,&jp2->comps[i].bpcc ,1);	/* read each BPCC component */
-		++p_bpc_header_data;
-	}
+    /* and length is relevant */
+    if (p_bpc_header_size != jp2->numcomps) {
+        opj_event_msg(p_manager, EVT_ERROR, "Bad BPCC header box (bad size)\n");
+        return OPJ_FALSE;
+    }
 
-	return OPJ_TRUE;
+    /* read info for each component */
+    for (i = 0; i < jp2->numcomps; ++i) {
+        opj_read_bytes(p_bpc_header_data, &jp2->comps[i].bpcc,
+                       1);  /* read each BPCC component */
+        ++p_bpc_header_data;
+    }
+
+    return OPJ_TRUE;
 }
-static OPJ_BYTE * opj_jp2_write_cdef(opj_jp2_t *jp2, OPJ_UINT32 * p_nb_bytes_written)
+static OPJ_BYTE * opj_jp2_write_cdef(opj_jp2_t *jp2,
+                                     OPJ_UINT32 * p_nb_bytes_written)
 {
-	/* room for 8 bytes for box, 2 for n */
-	OPJ_UINT32 l_cdef_size = 10;
-	OPJ_BYTE * l_cdef_data,* l_current_cdef_ptr;
-	OPJ_UINT32 l_value;
-	OPJ_UINT16 i;
+    /* room for 8 bytes for box, 2 for n */
+    OPJ_UINT32 l_cdef_size = 10;
+    OPJ_BYTE * l_cdef_data, * l_current_cdef_ptr;
+    OPJ_UINT32 l_value;
+    OPJ_UINT16 i;
 
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_nb_bytes_written != 00);
-	assert(jp2->color.jp2_cdef != 00);
-	assert(jp2->color.jp2_cdef->info != 00);
-	assert(jp2->color.jp2_cdef->n > 0U);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_nb_bytes_written != 00);
+    assert(jp2->color.jp2_cdef != 00);
+    assert(jp2->color.jp2_cdef->info != 00);
+    assert(jp2->color.jp2_cdef->n > 0U);
 
-	l_cdef_size += 6U * jp2->color.jp2_cdef->n;
+    l_cdef_size += 6U * jp2->color.jp2_cdef->n;
 
-	l_cdef_data = (OPJ_BYTE *) opj_malloc(l_cdef_size);
-	if (l_cdef_data == 00) {
-		return 00;
-	}
+    l_cdef_data = (OPJ_BYTE *) opj_malloc(l_cdef_size);
+    if (l_cdef_data == 00) {
+        return 00;
+    }
 
-	l_current_cdef_ptr = l_cdef_data;
-	
-	opj_write_bytes(l_current_cdef_ptr,l_cdef_size,4);			/* write box size */
-	l_current_cdef_ptr += 4;
+    l_current_cdef_ptr = l_cdef_data;
 
-	opj_write_bytes(l_current_cdef_ptr,JP2_CDEF,4);					/* BPCC */
-	l_current_cdef_ptr += 4;
+    opj_write_bytes(l_current_cdef_ptr, l_cdef_size, 4);        /* write box size */
+    l_current_cdef_ptr += 4;
 
-	l_value = jp2->color.jp2_cdef->n;
-	opj_write_bytes(l_current_cdef_ptr,l_value,2);					/* N */
-	l_current_cdef_ptr += 2;
+    opj_write_bytes(l_current_cdef_ptr, JP2_CDEF, 4);               /* BPCC */
+    l_current_cdef_ptr += 4;
 
-	for (i = 0U; i < jp2->color.jp2_cdef->n; ++i) {
-		l_value = jp2->color.jp2_cdef->info[i].cn;
-		opj_write_bytes(l_current_cdef_ptr,l_value,2);					/* Cni */
-		l_current_cdef_ptr += 2;
-		l_value = jp2->color.jp2_cdef->info[i].typ;
-		opj_write_bytes(l_current_cdef_ptr,l_value,2);					/* Typi */
-		l_current_cdef_ptr += 2;
-		l_value = jp2->color.jp2_cdef->info[i].asoc;
-		opj_write_bytes(l_current_cdef_ptr,l_value,2);					/* Asoci */
-		l_current_cdef_ptr += 2;
-	}
-	*p_nb_bytes_written = l_cdef_size;
+    l_value = jp2->color.jp2_cdef->n;
+    opj_write_bytes(l_current_cdef_ptr, l_value, 2);                /* N */
+    l_current_cdef_ptr += 2;
 
-	return l_cdef_data;
+    for (i = 0U; i < jp2->color.jp2_cdef->n; ++i) {
+        l_value = jp2->color.jp2_cdef->info[i].cn;
+        opj_write_bytes(l_current_cdef_ptr, l_value, 2);                /* Cni */
+        l_current_cdef_ptr += 2;
+        l_value = jp2->color.jp2_cdef->info[i].typ;
+        opj_write_bytes(l_current_cdef_ptr, l_value, 2);                /* Typi */
+        l_current_cdef_ptr += 2;
+        l_value = jp2->color.jp2_cdef->info[i].asoc;
+        opj_write_bytes(l_current_cdef_ptr, l_value, 2);                /* Asoci */
+        l_current_cdef_ptr += 2;
+    }
+    *p_nb_bytes_written = l_cdef_size;
+
+    return l_cdef_data;
 }
 
-static OPJ_BYTE * opj_jp2_write_colr(  opj_jp2_t *jp2,
-							    OPJ_UINT32 * p_nb_bytes_written
-                                )
+static OPJ_BYTE * opj_jp2_write_colr(opj_jp2_t *jp2,
+                                     OPJ_UINT32 * p_nb_bytes_written
+                                    )
 {
-	/* room for 8 bytes for box 3 for common data and variable upon profile*/
-	OPJ_UINT32 l_colr_size = 11;
-	OPJ_BYTE * l_colr_data,* l_current_colr_ptr;
+    /* room for 8 bytes for box 3 for common data and variable upon profile*/
+    OPJ_UINT32 l_colr_size = 11;
+    OPJ_BYTE * l_colr_data, * l_current_colr_ptr;
 
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_nb_bytes_written != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_nb_bytes_written != 00);
     assert(jp2->meth == 1 || jp2->meth == 2);
 
-	switch (jp2->meth) { 
-		case 1 :
-			l_colr_size += 4; /* EnumCS */
-			break;
-		case 2 :
-            assert(jp2->color.icc_profile_len);	/* ICC profile */
-            l_colr_size += jp2->color.icc_profile_len;
-			break;
-		default :
-			return 00;
-	}
+    switch (jp2->meth) {
+    case 1 :
+        l_colr_size += 4; /* EnumCS */
+        break;
+    case 2 :
+        assert(jp2->color.icc_profile_len); /* ICC profile */
+        l_colr_size += jp2->color.icc_profile_len;
+        break;
+    default :
+        return 00;
+    }
 
-	l_colr_data = (OPJ_BYTE *) opj_calloc(1,l_colr_size);
-	if (l_colr_data == 00) {
-		return 00;
-	}
-	
-	l_current_colr_ptr = l_colr_data;
+    l_colr_data = (OPJ_BYTE *) opj_calloc(1, l_colr_size);
+    if (l_colr_data == 00) {
+        return 00;
+    }
 
-	opj_write_bytes(l_current_colr_ptr,l_colr_size,4);				/* write box size */
-	l_current_colr_ptr += 4;
-	
-	opj_write_bytes(l_current_colr_ptr,JP2_COLR,4);					/* BPCC */
-	l_current_colr_ptr += 4;
-	
-	opj_write_bytes(l_current_colr_ptr, jp2->meth,1);				/* METH */
-	++l_current_colr_ptr;
-	
-	opj_write_bytes(l_current_colr_ptr, jp2->precedence,1);			/* PRECEDENCE */
-	++l_current_colr_ptr;
-	
-	opj_write_bytes(l_current_colr_ptr, jp2->approx,1);				/* APPROX */
-	++l_current_colr_ptr;
-	
-	if (jp2->meth == 1) { /* Meth value is restricted to 1 or 2 (Table I.9 of part 1) */
-        opj_write_bytes(l_current_colr_ptr, jp2->enumcs,4); }       /* EnumCS */
+    l_current_colr_ptr = l_colr_data;
+
+    opj_write_bytes(l_current_colr_ptr, l_colr_size,
+                    4);            /* write box size */
+    l_current_colr_ptr += 4;
+
+    opj_write_bytes(l_current_colr_ptr, JP2_COLR, 4);               /* BPCC */
+    l_current_colr_ptr += 4;
+
+    opj_write_bytes(l_current_colr_ptr, jp2->meth, 1);              /* METH */
+    ++l_current_colr_ptr;
+
+    opj_write_bytes(l_current_colr_ptr, jp2->precedence, 1);        /* PRECEDENCE */
+    ++l_current_colr_ptr;
+
+    opj_write_bytes(l_current_colr_ptr, jp2->approx, 1);            /* APPROX */
+    ++l_current_colr_ptr;
+
+    if (jp2->meth ==
+            1) { /* Meth value is restricted to 1 or 2 (Table I.9 of part 1) */
+        opj_write_bytes(l_current_colr_ptr, jp2->enumcs, 4);
+    }       /* EnumCS */
     else {
         if (jp2->meth == 2) {                                      /* ICC profile */
             OPJ_UINT32 i;
-            for(i = 0; i < jp2->color.icc_profile_len; ++i) {
+            for (i = 0; i < jp2->color.icc_profile_len; ++i) {
                 opj_write_bytes(l_current_colr_ptr, jp2->color.icc_profile_buf[i], 1);
                 ++l_current_colr_ptr;
             }
         }
-	}
+    }
 
-	*p_nb_bytes_written = l_colr_size;
-	
-	return l_colr_data;
+    *p_nb_bytes_written = l_colr_size;
+
+    return l_colr_data;
 }
 
 static void opj_jp2_free_pclr(opj_jp2_color_t *color)
@@ -825,669 +878,725 @@
     opj_free(color->jp2_pclr->channel_size);
     opj_free(color->jp2_pclr->entries);
 
-	if(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap);
+    if (color->jp2_pclr->cmap) {
+        opj_free(color->jp2_pclr->cmap);
+    }
 
-    opj_free(color->jp2_pclr); color->jp2_pclr = NULL;
+    opj_free(color->jp2_pclr);
+    color->jp2_pclr = NULL;
 }
 
-static OPJ_BOOL opj_jp2_check_color(opj_image_t *image, opj_jp2_color_t *color, opj_event_mgr_t *p_manager)
+static OPJ_BOOL opj_jp2_check_color(opj_image_t *image, opj_jp2_color_t *color,
+                                    opj_event_mgr_t *p_manager)
 {
-	OPJ_UINT16 i;
+    OPJ_UINT16 i;
 
-	/* testcase 4149.pdf.SIGSEGV.cf7.3501 */
-	if (color->jp2_cdef) {
-		opj_jp2_cdef_info_t *info = color->jp2_cdef->info;
-		OPJ_UINT16 n = color->jp2_cdef->n;
-		OPJ_UINT32 nr_channels = image->numcomps; /* FIXME image->numcomps == jp2->numcomps before color is applied ??? */
+    /* testcase 4149.pdf.SIGSEGV.cf7.3501 */
+    if (color->jp2_cdef) {
+        opj_jp2_cdef_info_t *info = color->jp2_cdef->info;
+        OPJ_UINT16 n = color->jp2_cdef->n;
+        OPJ_UINT32 nr_channels =
+            image->numcomps; /* FIXME image->numcomps == jp2->numcomps before color is applied ??? */
 
-		/* cdef applies to cmap channels if any */
-		if (color->jp2_pclr && color->jp2_pclr->cmap) {
-			nr_channels = (OPJ_UINT32)color->jp2_pclr->nr_channels;
-		}
+        /* cdef applies to cmap channels if any */
+        if (color->jp2_pclr && color->jp2_pclr->cmap) {
+            nr_channels = (OPJ_UINT32)color->jp2_pclr->nr_channels;
+        }
 
-		for (i = 0; i < n; i++) {
-			if (info[i].cn >= nr_channels) {
-				opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n", info[i].cn, nr_channels);
-				return OPJ_FALSE;
-			}
-			if (info[i].asoc == 65535U) continue;
+        for (i = 0; i < n; i++) {
+            if (info[i].cn >= nr_channels) {
+                opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n",
+                              info[i].cn, nr_channels);
+                return OPJ_FALSE;
+            }
+            if (info[i].asoc == 65535U) {
+                continue;
+            }
 
-			if (info[i].asoc > 0 && (OPJ_UINT32)(info[i].asoc - 1) >= nr_channels) {
-				opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n", info[i].asoc - 1, nr_channels);
-				return OPJ_FALSE;
-			}
-		}
+            if (info[i].asoc > 0 && (OPJ_UINT32)(info[i].asoc - 1) >= nr_channels) {
+                opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n",
+                              info[i].asoc - 1, nr_channels);
+                return OPJ_FALSE;
+            }
+        }
 
-		/* issue 397 */
-		/* ISO 15444-1 states that if cdef is present, it shall contain a complete list of channel definitions. */
-		while (nr_channels > 0)
-		{
-			for(i = 0; i < n; ++i) {
-				if ((OPJ_UINT32)info[i].cn == (nr_channels - 1U)) {
-					break;
-				}
-			}
-			if (i == n) {
-				opj_event_msg(p_manager, EVT_ERROR, "Incomplete channel definitions.\n");
-				return OPJ_FALSE;
-			}
-			--nr_channels;
-		}
-	}
+        /* issue 397 */
+        /* ISO 15444-1 states that if cdef is present, it shall contain a complete list of channel definitions. */
+        while (nr_channels > 0) {
+            for (i = 0; i < n; ++i) {
+                if ((OPJ_UINT32)info[i].cn == (nr_channels - 1U)) {
+                    break;
+                }
+            }
+            if (i == n) {
+                opj_event_msg(p_manager, EVT_ERROR, "Incomplete channel definitions.\n");
+                return OPJ_FALSE;
+            }
+            --nr_channels;
+        }
+    }
 
-	/* testcases 451.pdf.SIGSEGV.f4c.3723, 451.pdf.SIGSEGV.5b5.3723 and
-	   66ea31acbb0f23a2bbc91f64d69a03f5_signal_sigsegv_13937c0_7030_5725.pdf */
-	if (color->jp2_pclr && color->jp2_pclr->cmap) {
-		OPJ_UINT16 nr_channels = color->jp2_pclr->nr_channels;
-		opj_jp2_cmap_comp_t *cmap = color->jp2_pclr->cmap;
-		OPJ_BOOL *pcol_usage, is_sane = OPJ_TRUE;
+    /* testcases 451.pdf.SIGSEGV.f4c.3723, 451.pdf.SIGSEGV.5b5.3723 and
+       66ea31acbb0f23a2bbc91f64d69a03f5_signal_sigsegv_13937c0_7030_5725.pdf */
+    if (color->jp2_pclr && color->jp2_pclr->cmap) {
+        OPJ_UINT16 nr_channels = color->jp2_pclr->nr_channels;
+        opj_jp2_cmap_comp_t *cmap = color->jp2_pclr->cmap;
+        OPJ_BOOL *pcol_usage, is_sane = OPJ_TRUE;
 
-		/* verify that all original components match an existing one */
-		for (i = 0; i < nr_channels; i++) {
-			if (cmap[i].cmp >= image->numcomps) {
-				opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n", cmap[i].cmp, image->numcomps);
-				is_sane = OPJ_FALSE;
-			}
-		}
+        /* verify that all original components match an existing one */
+        for (i = 0; i < nr_channels; i++) {
+            if (cmap[i].cmp >= image->numcomps) {
+                opj_event_msg(p_manager, EVT_ERROR, "Invalid component index %d (>= %d).\n",
+                              cmap[i].cmp, image->numcomps);
+                is_sane = OPJ_FALSE;
+            }
+        }
 
-		pcol_usage = opj_calloc(nr_channels, sizeof(OPJ_BOOL));
-		if (!pcol_usage) {
-			opj_event_msg(p_manager, EVT_ERROR, "Unexpected OOM.\n");
-			return OPJ_FALSE;
-		}
-		/* verify that no component is targeted more than once */
-		for (i = 0; i < nr_channels; i++) {
-			if (cmap[i].mtyp != 0 && cmap[i].mtyp != 1) {
-				opj_event_msg(p_manager, EVT_ERROR, "Unexpected MTYP value.\n");
-				opj_free(pcol_usage);
-				return OPJ_FALSE;
-			}
-			OPJ_UINT16 pcol = cmap[i].pcol;
-			if (pcol >= nr_channels) {
-				opj_event_msg(p_manager, EVT_ERROR, "Invalid component/palette index for direct mapping %d.\n", pcol);
-				is_sane = OPJ_FALSE;
-			}
-			else if (pcol_usage[pcol] && cmap[i].mtyp != 0) {
-				opj_event_msg(p_manager, EVT_ERROR, "Component %d is mapped twice.\n", pcol);
-				is_sane = OPJ_FALSE;
-			}
-      else if (cmap[i].mtyp == 0 && cmap[i].pcol != 0) {
-        /* I.5.3.5 PCOL: If the value of the MTYP field for this channel is 0, then
-         * the value of this field shall be 0. */
-				opj_event_msg(p_manager, EVT_ERROR, "Direct use at #%d however pcol=%d.\n", i, pcol);
-				is_sane = OPJ_FALSE;
-      }
-			else
-				pcol_usage[pcol] = OPJ_TRUE;
-		}
-		/* verify that all components are targeted at least once */
-		for (i = 0; i < nr_channels; i++) {
-			if (!pcol_usage[i] && cmap[i].mtyp != 0) {
-				opj_event_msg(p_manager, EVT_ERROR, "Component %d doesn't have a mapping.\n", i);
-				is_sane = OPJ_FALSE;
-			}
-		}
-		/* Issue 235/447 weird cmap */
-		if (1 && is_sane && (image->numcomps==1U)) {
-			for (i = 0; i < nr_channels; i++) {
-				if (!pcol_usage[i]) {
-					is_sane = 0U;
-					opj_event_msg(p_manager, EVT_WARNING, "Component mapping seems wrong. Trying to correct.\n", i);
-					break;
-				}
-			}
-			if (!is_sane) {
-				is_sane = OPJ_TRUE;
-				for (i = 0; i < nr_channels; i++) {
-					cmap[i].mtyp = 1U;
-					cmap[i].pcol = (OPJ_BYTE) i;
-				}
-			}
-		}
-		opj_free(pcol_usage);
-		if (!is_sane) {
-			return OPJ_FALSE;
-		}
-	}
+        pcol_usage = (OPJ_BOOL *) opj_calloc(nr_channels, sizeof(OPJ_BOOL));
+        if (!pcol_usage) {
+            opj_event_msg(p_manager, EVT_ERROR, "Unexpected OOM.\n");
+            return OPJ_FALSE;
+        }
+        /* verify that no component is targeted more than once */
+        for (i = 0; i < nr_channels; i++) {
+            OPJ_UINT16 pcol = cmap[i].pcol;
+            /* See ISO 15444-1 Table I.14 – MTYPi field values */
+            if (cmap[i].mtyp != 0 && cmap[i].mtyp != 1) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Invalid value for cmap[%d].mtyp = %d.\n", i,
+                              cmap[i].mtyp);
+                is_sane = OPJ_FALSE;
+            } else if (pcol >= nr_channels) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Invalid component/palette index for direct mapping %d.\n", pcol);
+                is_sane = OPJ_FALSE;
+            } else if (pcol_usage[pcol] && cmap[i].mtyp != 0) {
+                opj_event_msg(p_manager, EVT_ERROR, "Component %d is mapped twice.\n", pcol);
+                is_sane = OPJ_FALSE;
+            } else if (cmap[i].mtyp == 0 && cmap[i].pcol != 0) {
+                /* I.5.3.5 PCOL: If the value of the MTYP field for this channel is 0, then
+                 * the value of this field shall be 0. */
+                opj_event_msg(p_manager, EVT_ERROR, "Direct use at #%d however pcol=%d.\n", i,
+                              pcol);
+                is_sane = OPJ_FALSE;
+            } else {
+                pcol_usage[pcol] = OPJ_TRUE;
+            }
+        }
+        /* verify that all components are targeted at least once */
+        for (i = 0; i < nr_channels; i++) {
+            if (!pcol_usage[i] && cmap[i].mtyp != 0) {
+                opj_event_msg(p_manager, EVT_ERROR, "Component %d doesn't have a mapping.\n",
+                              i);
+                is_sane = OPJ_FALSE;
+            }
+        }
+        /* Issue 235/447 weird cmap */
+        if (1 && is_sane && (image->numcomps == 1U)) {
+            for (i = 0; i < nr_channels; i++) {
+                if (!pcol_usage[i]) {
+                    is_sane = 0U;
+                    opj_event_msg(p_manager, EVT_WARNING,
+                                  "Component mapping seems wrong. Trying to correct.\n", i);
+                    break;
+                }
+            }
+            if (!is_sane) {
+                is_sane = OPJ_TRUE;
+                for (i = 0; i < nr_channels; i++) {
+                    cmap[i].mtyp = 1U;
+                    cmap[i].pcol = (OPJ_BYTE) i;
+                }
+            }
+        }
+        opj_free(pcol_usage);
+        if (!is_sane) {
+            return OPJ_FALSE;
+        }
+    }
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /* file9.jp2 */
-static void opj_jp2_apply_pclr(opj_image_t *image, opj_jp2_color_t *color)
+static OPJ_BOOL opj_jp2_apply_pclr(opj_image_t *image,
+                                   opj_jp2_color_t *color,
+                                   opj_event_mgr_t * p_manager)
 {
-	opj_image_comp_t *old_comps, *new_comps;
-	OPJ_BYTE *channel_size, *channel_sign;
-	OPJ_UINT32 *entries;
-	opj_jp2_cmap_comp_t *cmap;
-	OPJ_INT32 *src, *dst;
-	OPJ_UINT32 j, max;
-	OPJ_UINT16 i, nr_channels, cmp, pcol;
-	OPJ_INT32 k, top_k;
+    opj_image_comp_t *old_comps, *new_comps;
+    OPJ_BYTE *channel_size, *channel_sign;
+    OPJ_UINT32 *entries;
+    opj_jp2_cmap_comp_t *cmap;
+    OPJ_INT32 *src, *dst;
+    OPJ_UINT32 j, max;
+    OPJ_UINT16 i, nr_channels, cmp, pcol;
+    OPJ_INT32 k, top_k;
 
-	channel_size = color->jp2_pclr->channel_size;
-	channel_sign = color->jp2_pclr->channel_sign;
-	entries = color->jp2_pclr->entries;
-	cmap = color->jp2_pclr->cmap;
-	nr_channels = color->jp2_pclr->nr_channels;
+    channel_size = color->jp2_pclr->channel_size;
+    channel_sign = color->jp2_pclr->channel_sign;
+    entries = color->jp2_pclr->entries;
+    cmap = color->jp2_pclr->cmap;
+    nr_channels = color->jp2_pclr->nr_channels;
 
-	old_comps = image->comps;
-	/* Overflow check: prevent integer overflow */
-	for (i = 0; i < nr_channels; ++i) {
-		cmp = cmap[i].cmp;
-		if (old_comps[cmp].h == 0 || old_comps[cmp].w > ((OPJ_UINT32)-1) / sizeof(OPJ_INT32) / old_comps[cmp].h) {
-			return;
-		}
-	}
-
-	new_comps = (opj_image_comp_t*)
-			opj_malloc(nr_channels * sizeof(opj_image_comp_t));
-	if (!new_comps) {
-		/* FIXME no error code for opj_jp2_apply_pclr */
-		/* FIXME event manager error callback */
-		return;
-	}
-	for(i = 0; i < nr_channels; ++i) {
-		pcol = cmap[i].pcol; cmp = cmap[i].cmp;
-
-		/* Direct use */
-    if(cmap[i].mtyp == 0){
-      assert( pcol == 0 );
-      new_comps[i] = old_comps[cmp];
-    } else {
-      assert( i == pcol ); // probably wrong?
-      new_comps[i] = old_comps[cmp];
-    }
-
-		/* Palette mapping: */
-		new_comps[i].data = (OPJ_INT32*)
-				opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(OPJ_INT32));
-		if (!new_comps[i].data) {
-			opj_free(new_comps);
-			new_comps = NULL;
-			/* FIXME no error code for opj_jp2_apply_pclr */
-			/* FIXME event manager error callback */
-			return;
-		}
-		new_comps[i].prec = channel_size[i];
-		new_comps[i].sgnd = channel_sign[i];
-	}
-
-	top_k = color->jp2_pclr->nr_entries - 1;
-
-	for(i = 0; i < nr_channels; ++i) {
-		/* Palette mapping: */
-		cmp = cmap[i].cmp; pcol = cmap[i].pcol;
-		src = old_comps[cmp].data;
-		dst = new_comps[i].data;
-		max = new_comps[i].w * new_comps[i].h;
-
-		/* Prevent null pointer access */
-		if (!src || !dst) {
-			for (j = 0; j < nr_channels; ++j) {
-				opj_free(new_comps[j].data);
-			}
-			opj_free(new_comps);
-			new_comps = NULL;
-			return;
-		}
-
-		/* Direct use: */
-    if(cmap[i].mtyp == 0) {
-      assert( cmp == 0 ); // probably wrong.
-      for(j = 0; j < max; ++j) {
-        dst[j] = src[j];
-      }
-    }
-    else {
-      assert( i == pcol ); // probably wrong?
-      for(j = 0; j < max; ++j) {
-        /* The index */
-        if((k = src[j]) < 0) k = 0; else if(k > top_k) k = top_k;
-
-        /* The colour */
-        dst[j] = (OPJ_INT32)entries[k * nr_channels + pcol];
+    for (i = 0; i < nr_channels; ++i) {
+        /* Palette mapping: */
+        cmp = cmap[i].cmp;
+        if (image->comps[cmp].data == NULL) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "image->comps[%d].data == NULL in opj_jp2_apply_pclr().\n", i);
+            return OPJ_FALSE;
         }
     }
-	}
 
-	max = image->numcomps;
-	for(i = 0; i < max; ++i) {
-		if(old_comps[i].data) opj_free(old_comps[i].data);
-	}
+    old_comps = image->comps;
+    /* Overflow check: prevent integer overflow */
+    for (i = 0; i < nr_channels; ++i) {
+      cmp = cmap[i].cmp;
+      if (old_comps[cmp].h == 0 || old_comps[cmp].w > ((OPJ_UINT32)-1) / sizeof(OPJ_INT32) / old_comps[cmp].h) {
+        return OPJ_FALSE;
+      }
+    }
 
-	opj_free(old_comps);
-	image->comps = new_comps;
-	image->numcomps = nr_channels;
+    new_comps = (opj_image_comp_t*)
+                opj_malloc(nr_channels * sizeof(opj_image_comp_t));
+    if (!new_comps) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Memory allocation failure in opj_jp2_apply_pclr().\n");
+        return OPJ_FALSE;
+    }
+    for (i = 0; i < nr_channels; ++i) {
+        pcol = cmap[i].pcol;
+        cmp = cmap[i].cmp;
 
-	opj_jp2_free_pclr(color);
+        /* Direct use */
+        if (cmap[i].mtyp == 0) {
+            assert(pcol == 0);
+            new_comps[i] = old_comps[cmp];
+        } else {
+            assert( i == pcol ); // probably wrong?
+            new_comps[i] = old_comps[cmp];
+        }
 
+        /* Palette mapping: */
+        new_comps[i].data = (OPJ_INT32*)
+                            opj_image_data_alloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(OPJ_INT32));
+        if (!new_comps[i].data) {
+            while (i > 0) {
+                -- i;
+                opj_free(new_comps[i].data);
+            }
+            opj_free(new_comps);
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Memory allocation failure in opj_jp2_apply_pclr().\n");
+            return OPJ_FALSE;
+        }
+        new_comps[i].prec = channel_size[i];
+        new_comps[i].sgnd = channel_sign[i];
+    }
+
+    top_k = color->jp2_pclr->nr_entries - 1;
+
+    for (i = 0; i < nr_channels; ++i) {
+        /* Palette mapping: */
+        cmp = cmap[i].cmp;
+        pcol = cmap[i].pcol;
+        src = old_comps[cmp].data;
+        dst = new_comps[i].data;
+        max = new_comps[i].w * new_comps[i].h;
+
+        /* Prevent null pointer access */
+        if (!src || !dst) {
+          for (j = 0; j < nr_channels; ++j) {
+            opj_free(new_comps[j].data);
+          }
+          opj_free(new_comps);
+          new_comps = NULL;
+          return OPJ_FALSE;
+        }
+
+        /* Direct use: */
+        if (cmap[i].mtyp == 0) {
+            assert( cmp == 0 ); // probably wrong.
+            for (j = 0; j < max; ++j) {
+                dst[j] = src[j];
+            }
+        } else {
+            assert( i == pcol ); // probably wrong?
+            for (j = 0; j < max; ++j) {
+                /* The index */
+                if ((k = src[j]) < 0) {
+                    k = 0;
+                } else if (k > top_k) {
+                    k = top_k;
+                }
+
+                /* The colour */
+                dst[j] = (OPJ_INT32)entries[k * nr_channels + pcol];
+            }
+        }
+    }
+
+    max = image->numcomps;
+    for (i = 0; i < max; ++i) {
+        if (old_comps[i].data) {
+            opj_image_data_free(old_comps[i].data);
+        }
+    }
+
+    opj_free(old_comps);
+    image->comps = new_comps;
+    image->numcomps = nr_channels;
+
+    opj_jp2_free_pclr(color);
+
+    return OPJ_TRUE;
 }/* apply_pclr() */
 
-static OPJ_BOOL opj_jp2_read_pclr(	opj_jp2_t *jp2,
-                            OPJ_BYTE * p_pclr_header_data,
-                            OPJ_UINT32 p_pclr_header_size,
-                            opj_event_mgr_t * p_manager
-                            )
+static OPJ_BOOL opj_jp2_read_pclr(opj_jp2_t *jp2,
+                                  OPJ_BYTE * p_pclr_header_data,
+                                  OPJ_UINT32 p_pclr_header_size,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-	opj_jp2_pclr_t *jp2_pclr;
-	OPJ_BYTE *channel_size, *channel_sign;
-	OPJ_UINT32 *entries;
-	OPJ_UINT16 nr_entries,nr_channels;
-	OPJ_UINT16 i, j;
-	OPJ_UINT32 l_value;
-	OPJ_BYTE *orig_header_data = p_pclr_header_data;
+    opj_jp2_pclr_t *jp2_pclr;
+    OPJ_BYTE *channel_size, *channel_sign;
+    OPJ_UINT32 *entries;
+    OPJ_UINT16 nr_entries, nr_channels;
+    OPJ_UINT16 i, j;
+    OPJ_UINT32 l_value;
+    OPJ_BYTE *orig_header_data = p_pclr_header_data;
 
-	/* preconditions */
-	assert(p_pclr_header_data != 00);
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(p_pclr_header_data != 00);
+    assert(jp2 != 00);
+    assert(p_manager != 00);
     (void)p_pclr_header_size;
 
-	if(jp2->color.jp2_pclr)
-		return OPJ_FALSE;
-
-	if (p_pclr_header_size < 3)
-		return OPJ_FALSE;
-
-	opj_read_bytes(p_pclr_header_data, &l_value , 2);	/* NE */
-	p_pclr_header_data += 2;
-	nr_entries = (OPJ_UINT16) l_value;
-	if ((nr_entries == 0U) || (nr_entries > 1024U)) {
-		opj_event_msg(p_manager, EVT_ERROR, "Invalid PCLR box. Reports %d entries\n", (int)nr_entries);
-		return OPJ_FALSE;
-	}
-
-	opj_read_bytes(p_pclr_header_data, &l_value , 1);	/* NPC */
-	++p_pclr_header_data;
-	nr_channels = (OPJ_UINT16) l_value;
-	if (nr_channels == 0U) {
-		opj_event_msg(p_manager, EVT_ERROR, "Invalid PCLR box. Reports 0 palette columns\n");
-		return OPJ_FALSE;
-	}
-
-	if (p_pclr_header_size < 3 + (OPJ_UINT32)nr_channels)
-		return OPJ_FALSE;
-
-	entries = (OPJ_UINT32*) opj_malloc((size_t)nr_channels * nr_entries * sizeof(OPJ_UINT32));
-    if (!entries)
+    if (jp2->color.jp2_pclr) {
         return OPJ_FALSE;
-	channel_size = (OPJ_BYTE*) opj_malloc(nr_channels);
-    if (!channel_size)
-    {
+    }
+
+    if (p_pclr_header_size < 3) {
+        return OPJ_FALSE;
+    }
+
+    opj_read_bytes(p_pclr_header_data, &l_value, 2);    /* NE */
+    p_pclr_header_data += 2;
+    nr_entries = (OPJ_UINT16) l_value;
+    if ((nr_entries == 0U) || (nr_entries > 1024U)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Invalid PCLR box. Reports %d entries\n",
+                      (int)nr_entries);
+        return OPJ_FALSE;
+    }
+
+    opj_read_bytes(p_pclr_header_data, &l_value, 1);    /* NPC */
+    ++p_pclr_header_data;
+    nr_channels = (OPJ_UINT16) l_value;
+    if (nr_channels == 0U) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Invalid PCLR box. Reports 0 palette columns\n");
+        return OPJ_FALSE;
+    }
+
+    if (p_pclr_header_size < 3 + (OPJ_UINT32)nr_channels) {
+        return OPJ_FALSE;
+    }
+
+    entries = (OPJ_UINT32*) opj_malloc((size_t)nr_channels * nr_entries * sizeof(
+                                           OPJ_UINT32));
+    if (!entries) {
+        return OPJ_FALSE;
+    }
+    channel_size = (OPJ_BYTE*) opj_malloc(nr_channels);
+    if (!channel_size) {
         opj_free(entries);
         return OPJ_FALSE;
     }
-	channel_sign = (OPJ_BYTE*) opj_malloc(nr_channels);
-	if (!channel_sign)
-	{
+    channel_sign = (OPJ_BYTE*) opj_malloc(nr_channels);
+    if (!channel_sign) {
         opj_free(entries);
         opj_free(channel_size);
         return OPJ_FALSE;
-	}
+    }
 
-	jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t));
-    if (!jp2_pclr)
-    {
+    jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t));
+    if (!jp2_pclr) {
         opj_free(entries);
         opj_free(channel_size);
         opj_free(channel_sign);
         return OPJ_FALSE;
     }
 
-	jp2_pclr->channel_sign = channel_sign;
-	jp2_pclr->channel_size = channel_size;
-	jp2_pclr->entries = entries;
-	jp2_pclr->nr_entries = nr_entries;
-	jp2_pclr->nr_channels = (OPJ_BYTE) l_value;
-	jp2_pclr->cmap = NULL;
+    jp2_pclr->channel_sign = channel_sign;
+    jp2_pclr->channel_size = channel_size;
+    jp2_pclr->entries = entries;
+    jp2_pclr->nr_entries = nr_entries;
+    jp2_pclr->nr_channels = (OPJ_BYTE) l_value;
+    jp2_pclr->cmap = NULL;
 
-	jp2->color.jp2_pclr = jp2_pclr;
+    jp2->color.jp2_pclr = jp2_pclr;
 
-	for(i = 0; i < nr_channels; ++i) {
-		opj_read_bytes(p_pclr_header_data, &l_value , 1);	/* Bi */
-		++p_pclr_header_data;
+    for (i = 0; i < nr_channels; ++i) {
+        opj_read_bytes(p_pclr_header_data, &l_value, 1);    /* Bi */
+        ++p_pclr_header_data;
 
-		channel_size[i] = (OPJ_BYTE)((l_value & 0x7f) + 1);
-		channel_sign[i] = (l_value & 0x80) ? 1 : 0;
-	}
+        channel_size[i] = (OPJ_BYTE)((l_value & 0x7f) + 1);
+        channel_sign[i] = (l_value & 0x80) ? 1 : 0;
+    }
 
-	for(j = 0; j < nr_entries; ++j) {
-		for(i = 0; i < nr_channels; ++i) {
-			OPJ_UINT32 bytes_to_read = (OPJ_UINT32)((channel_size[i]+7)>>3);
+    for (j = 0; j < nr_entries; ++j) {
+        for (i = 0; i < nr_channels; ++i) {
+            OPJ_UINT32 bytes_to_read = (OPJ_UINT32)((channel_size[i] + 7) >> 3);
 
-			if (bytes_to_read > sizeof(OPJ_UINT32))
-				bytes_to_read = sizeof(OPJ_UINT32);
-			if ((ptrdiff_t)p_pclr_header_size < (ptrdiff_t)(p_pclr_header_data - orig_header_data) + (ptrdiff_t)bytes_to_read)
-				return OPJ_FALSE;
+            if (bytes_to_read > sizeof(OPJ_UINT32)) {
+                bytes_to_read = sizeof(OPJ_UINT32);
+            }
+            if ((ptrdiff_t)p_pclr_header_size < (ptrdiff_t)(p_pclr_header_data -
+                    orig_header_data) + (ptrdiff_t)bytes_to_read) {
+                return OPJ_FALSE;
+            }
 
-			opj_read_bytes(p_pclr_header_data, &l_value , bytes_to_read);	/* Cji */
-			p_pclr_header_data += bytes_to_read;
-			*entries = (OPJ_UINT32) l_value;
-			entries++;
-		}
-	}
+            opj_read_bytes(p_pclr_header_data, &l_value, bytes_to_read);    /* Cji */
+            p_pclr_header_data += bytes_to_read;
+            *entries = (OPJ_UINT32) l_value;
+            entries++;
+        }
+    }
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_jp2_read_cmap(	opj_jp2_t * jp2,
-                            OPJ_BYTE * p_cmap_header_data,
-                            OPJ_UINT32 p_cmap_header_size,
-                            opj_event_mgr_t * p_manager
-                            )
+static OPJ_BOOL opj_jp2_read_cmap(opj_jp2_t * jp2,
+                                  OPJ_BYTE * p_cmap_header_data,
+                                  OPJ_UINT32 p_cmap_header_size,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-	opj_jp2_cmap_comp_t *cmap;
-	OPJ_BYTE i, nr_channels;
-	OPJ_UINT32 l_value;
+    opj_jp2_cmap_comp_t *cmap;
+    OPJ_BYTE i, nr_channels;
+    OPJ_UINT32 l_value;
 
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_cmap_header_data != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_cmap_header_data != 00);
+    assert(p_manager != 00);
     (void)p_cmap_header_size;
 
-	/* Need nr_channels: */
-	if(jp2->color.jp2_pclr == NULL) {
-		opj_event_msg(p_manager, EVT_ERROR, "Need to read a PCLR box before the CMAP box.\n");
-		return OPJ_FALSE;
-	}
-
-	/* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box
-	 * inside a JP2 Header box' :
-	*/
-	if(jp2->color.jp2_pclr->cmap) {
-		opj_event_msg(p_manager, EVT_ERROR, "Only one CMAP box is allowed.\n");
-		return OPJ_FALSE;
-	}
-
-	nr_channels = jp2->color.jp2_pclr->nr_channels;
-	if (p_cmap_header_size < (OPJ_UINT32)nr_channels * 4) {
-		opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CMAP box.\n");
-		return OPJ_FALSE;
-	}
-
-	cmap = (opj_jp2_cmap_comp_t*) opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t));
-    if (!cmap)
+    /* Need nr_channels: */
+    if (jp2->color.jp2_pclr == NULL) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Need to read a PCLR box before the CMAP box.\n");
         return OPJ_FALSE;
+    }
+
+    /* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box
+     * inside a JP2 Header box' :
+    */
+    if (jp2->color.jp2_pclr->cmap) {
+        opj_event_msg(p_manager, EVT_ERROR, "Only one CMAP box is allowed.\n");
+        return OPJ_FALSE;
+    }
+
+    nr_channels = jp2->color.jp2_pclr->nr_channels;
+    if (p_cmap_header_size < (OPJ_UINT32)nr_channels * 4) {
+        opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CMAP box.\n");
+        return OPJ_FALSE;
+    }
+
+    cmap = (opj_jp2_cmap_comp_t*) opj_malloc(nr_channels * sizeof(
+                opj_jp2_cmap_comp_t));
+    if (!cmap) {
+        return OPJ_FALSE;
+    }
 
 
-	for(i = 0; i < nr_channels; ++i) {
-		opj_read_bytes_BE(p_cmap_header_data, &l_value, 2);			/* CMP^i */
-		p_cmap_header_data +=2;
-		cmap[i].cmp = (OPJ_UINT16) l_value;
+    for (i = 0; i < nr_channels; ++i) {
+        opj_read_bytes_BE(p_cmap_header_data, &l_value, 2);     /* CMP^i */
+        p_cmap_header_data += 2;
+        cmap[i].cmp = (OPJ_UINT16) l_value;
 
-		opj_read_bytes(p_cmap_header_data, &l_value, 1);			/* MTYP^i */
-		++p_cmap_header_data;
-		cmap[i].mtyp = (OPJ_BYTE) l_value;
+        opj_read_bytes(p_cmap_header_data, &l_value, 1);            /* MTYP^i */
+        ++p_cmap_header_data;
+        cmap[i].mtyp = (OPJ_BYTE) l_value;
 
-		opj_read_bytes(p_cmap_header_data, &l_value, 1);			/* PCOL^i */
-		++p_cmap_header_data;
-		cmap[i].pcol = (OPJ_BYTE) l_value;
-	}
+        opj_read_bytes(p_cmap_header_data, &l_value, 1);            /* PCOL^i */
+        ++p_cmap_header_data;
+        cmap[i].pcol = (OPJ_BYTE) l_value;
+    }
 
-	jp2->color.jp2_pclr->cmap = cmap;
+    jp2->color.jp2_pclr->cmap = cmap;
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color, opj_event_mgr_t *manager)
+static void opj_jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color,
+                               opj_event_mgr_t *manager)
 {
-	opj_jp2_cdef_info_t *info;
-	OPJ_UINT16 i, n, cn, asoc, acn;
-	
-	info = color->jp2_cdef->info;
-	n = color->jp2_cdef->n;
-	
-	for(i = 0; i < n; ++i)
-	{
-		/* WATCH: acn = asoc - 1 ! */
-		asoc = info[i].asoc;
-		cn = info[i].cn;
-		
-		if( cn >= image->numcomps)
-		{
-			opj_event_msg(manager, EVT_WARNING, "opj_jp2_apply_cdef: cn=%d, numcomps=%d\n", cn, image->numcomps);
-			continue;
-		}
-		if(asoc == 0 || asoc == 65535)
-		{
-			image->comps[cn].alpha = info[i].typ;
-			continue;
-		}
-		
-		acn = (OPJ_UINT16)(asoc - 1);
-		if( acn >= image->numcomps )
-		{
-			opj_event_msg(manager, EVT_WARNING, "opj_jp2_apply_cdef: acn=%d, numcomps=%d\n", acn, image->numcomps);
-			continue;
-		}
-		
-		/* Swap only if color channel */
-		if((cn != acn) && (info[i].typ == 0))
-		{
-			opj_image_comp_t saved;
-			OPJ_UINT16 j;
-			
-			memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t));
-			memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t));
-			memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t));
-			
-			/* Swap channels in following channel definitions, don't bother with j <= i that are already processed */
-			for (j = (OPJ_UINT16)(i + 1U); j < n ; ++j)
-			{
-				if (info[j].cn == cn) {
-					info[j].cn = acn;
-				}
-				else if (info[j].cn == acn) {
-					info[j].cn = cn;
-				}
-				/* asoc is related to color index. Do not update. */
-			}
-		}
-		
-		image->comps[cn].alpha = info[i].typ;
-	}
-	
-	if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info);
-	
-	opj_free(color->jp2_cdef); color->jp2_cdef = NULL;
-	
+    opj_jp2_cdef_info_t *info;
+    OPJ_UINT16 i, n, cn, asoc, acn;
+
+    info = color->jp2_cdef->info;
+    n = color->jp2_cdef->n;
+
+    for (i = 0; i < n; ++i) {
+        /* WATCH: acn = asoc - 1 ! */
+        asoc = info[i].asoc;
+        cn = info[i].cn;
+
+        if (cn >= image->numcomps) {
+            opj_event_msg(manager, EVT_WARNING, "opj_jp2_apply_cdef: cn=%d, numcomps=%d\n",
+                          cn, image->numcomps);
+            continue;
+        }
+        if (asoc == 0 || asoc == 65535) {
+            image->comps[cn].alpha = info[i].typ;
+            continue;
+        }
+
+        acn = (OPJ_UINT16)(asoc - 1);
+        if (acn >= image->numcomps) {
+            opj_event_msg(manager, EVT_WARNING, "opj_jp2_apply_cdef: acn=%d, numcomps=%d\n",
+                          acn, image->numcomps);
+            continue;
+        }
+
+        /* Swap only if color channel */
+        if ((cn != acn) && (info[i].typ == 0)) {
+            opj_image_comp_t saved;
+            OPJ_UINT16 j;
+
+            memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t));
+            memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t));
+            memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t));
+
+            /* Swap channels in following channel definitions, don't bother with j <= i that are already processed */
+            for (j = (OPJ_UINT16)(i + 1U); j < n ; ++j) {
+                if (info[j].cn == cn) {
+                    info[j].cn = acn;
+                } else if (info[j].cn == acn) {
+                    info[j].cn = cn;
+                }
+                /* asoc is related to color index. Do not update. */
+            }
+        }
+
+        image->comps[cn].alpha = info[i].typ;
+    }
+
+    if (color->jp2_cdef->info) {
+        opj_free(color->jp2_cdef->info);
+    }
+
+    opj_free(color->jp2_cdef);
+    color->jp2_cdef = NULL;
+
 }/* jp2_apply_cdef() */
 
-static OPJ_BOOL opj_jp2_read_cdef(	opj_jp2_t * jp2,
-                            OPJ_BYTE * p_cdef_header_data,
-							OPJ_UINT32 p_cdef_header_size,
-							opj_event_mgr_t * p_manager
-                            )
+static OPJ_BOOL opj_jp2_read_cdef(opj_jp2_t * jp2,
+                                  OPJ_BYTE * p_cdef_header_data,
+                                  OPJ_UINT32 p_cdef_header_size,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-	opj_jp2_cdef_info_t *cdef_info;
-	OPJ_UINT16 i;
-	OPJ_UINT32 l_value;
+    opj_jp2_cdef_info_t *cdef_info;
+    OPJ_UINT16 i;
+    OPJ_UINT32 l_value;
 
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_cdef_header_data != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_cdef_header_data != 00);
+    assert(p_manager != 00);
     (void)p_cdef_header_size;
 
-	/* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box
-	 * inside a JP2 Header box.'*/
-	if(jp2->color.jp2_cdef) return OPJ_FALSE;
+    /* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box
+     * inside a JP2 Header box.'*/
+    if (jp2->color.jp2_cdef) {
+        return OPJ_FALSE;
+    }
 
-	if (p_cdef_header_size < 2) {
-		opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CDEF box.\n");
-		return OPJ_FALSE;
-	}
+    if (p_cdef_header_size < 2) {
+        opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CDEF box.\n");
+        return OPJ_FALSE;
+    }
 
-	opj_read_bytes(p_cdef_header_data,&l_value ,2);			/* N */
-	p_cdef_header_data+= 2;
+    opj_read_bytes(p_cdef_header_data, &l_value, 2);        /* N */
+    p_cdef_header_data += 2;
 
-	if ( (OPJ_UINT16)l_value == 0){ /* szukw000: FIXME */
-		opj_event_msg(p_manager, EVT_ERROR, "Number of channel description is equal to zero in CDEF box.\n");
-		return OPJ_FALSE;
-	}
+    if ((OPJ_UINT16)l_value == 0) { /* szukw000: FIXME */
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Number of channel description is equal to zero in CDEF box.\n");
+        return OPJ_FALSE;
+    }
 
-	if (p_cdef_header_size < 2 + (OPJ_UINT32)(OPJ_UINT16)l_value * 6) {
-		opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CDEF box.\n");
-		return OPJ_FALSE;
-	}
+    if (p_cdef_header_size < 2 + (OPJ_UINT32)(OPJ_UINT16)l_value * 6) {
+        opj_event_msg(p_manager, EVT_ERROR, "Insufficient data for CDEF box.\n");
+        return OPJ_FALSE;
+    }
 
-	cdef_info = (opj_jp2_cdef_info_t*) opj_malloc(l_value * sizeof(opj_jp2_cdef_info_t));
-	if (!cdef_info)
-		return OPJ_FALSE;
+    cdef_info = (opj_jp2_cdef_info_t*) opj_malloc(l_value * sizeof(
+                    opj_jp2_cdef_info_t));
+    if (!cdef_info) {
+        return OPJ_FALSE;
+    }
 
-	jp2->color.jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
-	if(!jp2->color.jp2_cdef)
-	{
-		opj_free(cdef_info);
-		return OPJ_FALSE;
-	}
-	jp2->color.jp2_cdef->info = cdef_info;
-	jp2->color.jp2_cdef->n = (OPJ_UINT16) l_value;
+    jp2->color.jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
+    if (!jp2->color.jp2_cdef) {
+        opj_free(cdef_info);
+        return OPJ_FALSE;
+    }
+    jp2->color.jp2_cdef->info = cdef_info;
+    jp2->color.jp2_cdef->n = (OPJ_UINT16) l_value;
 
-	for(i = 0; i < jp2->color.jp2_cdef->n; ++i) {
-		opj_read_bytes(p_cdef_header_data, &l_value, 2);			/* Cn^i */
-		p_cdef_header_data +=2;
-		cdef_info[i].cn = (OPJ_UINT16) l_value;
+    for (i = 0; i < jp2->color.jp2_cdef->n; ++i) {
+        opj_read_bytes(p_cdef_header_data, &l_value, 2);            /* Cn^i */
+        p_cdef_header_data += 2;
+        cdef_info[i].cn = (OPJ_UINT16) l_value;
 
-		opj_read_bytes(p_cdef_header_data, &l_value, 2);			/* Typ^i */
-		p_cdef_header_data +=2;
-		cdef_info[i].typ = (OPJ_UINT16) l_value;
+        opj_read_bytes(p_cdef_header_data, &l_value, 2);            /* Typ^i */
+        p_cdef_header_data += 2;
+        cdef_info[i].typ = (OPJ_UINT16) l_value;
 
-		opj_read_bytes(p_cdef_header_data, &l_value, 2);			/* Asoc^i */
-		p_cdef_header_data +=2;
-		cdef_info[i].asoc = (OPJ_UINT16) l_value;
-   }
+        opj_read_bytes(p_cdef_header_data, &l_value, 2);            /* Asoc^i */
+        p_cdef_header_data += 2;
+        cdef_info[i].asoc = (OPJ_UINT16) l_value;
+    }
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_jp2_read_colr( opj_jp2_t *jp2,
-                            OPJ_BYTE * p_colr_header_data,
-                            OPJ_UINT32 p_colr_header_size,
-                            opj_event_mgr_t * p_manager
-                            )
+static OPJ_BOOL opj_jp2_read_colr(opj_jp2_t *jp2,
+                                  OPJ_BYTE * p_colr_header_data,
+                                  OPJ_UINT32 p_colr_header_size,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-	OPJ_UINT32 l_value;
+    OPJ_UINT32 l_value;
 
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_colr_header_data != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_colr_header_data != 00);
+    assert(p_manager != 00);
 
-	if (p_colr_header_size < 3) {
-		opj_event_msg(p_manager, EVT_ERROR, "Bad COLR header box (bad size)\n");
-		return OPJ_FALSE;
-	}
+    if (p_colr_header_size < 3) {
+        opj_event_msg(p_manager, EVT_ERROR, "Bad COLR header box (bad size)\n");
+        return OPJ_FALSE;
+    }
 
-	/* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour
-	 * Specification boxes after the first.'
-	*/
-	if(jp2->color.jp2_has_colr) {
-		opj_event_msg(p_manager, EVT_INFO, "A conforming JP2 reader shall ignore all Colour Specification boxes after the first, so we ignore this one.\n");
-		p_colr_header_data += p_colr_header_size;
-		return OPJ_TRUE;
-	}
+    /* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour
+     * Specification boxes after the first.'
+    */
+    if (jp2->color.jp2_has_colr) {
+        opj_event_msg(p_manager, EVT_INFO,
+                      "A conforming JP2 reader shall ignore all Colour Specification boxes after the first, so we ignore this one.\n");
+        p_colr_header_data += p_colr_header_size;
+        return OPJ_TRUE;
+    }
 
-	opj_read_bytes(p_colr_header_data,&jp2->meth ,1);			/* METH */
-	++p_colr_header_data;
+    opj_read_bytes(p_colr_header_data, &jp2->meth, 1);          /* METH */
+    ++p_colr_header_data;
 
-	opj_read_bytes(p_colr_header_data,&jp2->precedence ,1);		/* PRECEDENCE */
-	++p_colr_header_data;
+    opj_read_bytes(p_colr_header_data, &jp2->precedence, 1);    /* PRECEDENCE */
+    ++p_colr_header_data;
 
-	opj_read_bytes(p_colr_header_data,&jp2->approx ,1);			/* APPROX */
-	++p_colr_header_data;
+    opj_read_bytes(p_colr_header_data, &jp2->approx, 1);        /* APPROX */
+    ++p_colr_header_data;
 
-	if (jp2->meth == 1) {
-		if (p_colr_header_size < 7) {
-			opj_event_msg(p_manager, EVT_ERROR, "Bad COLR header box (bad size: %d)\n", p_colr_header_size);
-			return OPJ_FALSE;
-		}
-		if ((p_colr_header_size > 7) && (jp2->enumcs != 14)) { /* handled below for CIELab) */
-			/* testcase Altona_Technical_v20_x4.pdf */
-			opj_event_msg(p_manager, EVT_WARNING, "Bad COLR header box (bad size: %d)\n", p_colr_header_size);
-		}
+    if (jp2->meth == 1) {
+        if (p_colr_header_size < 7) {
+            opj_event_msg(p_manager, EVT_ERROR, "Bad COLR header box (bad size: %d)\n",
+                          p_colr_header_size);
+            return OPJ_FALSE;
+        }
+        if ((p_colr_header_size > 7) &&
+                (jp2->enumcs != 14)) { /* handled below for CIELab) */
+            /* testcase Altona_Technical_v20_x4.pdf */
+            opj_event_msg(p_manager, EVT_WARNING, "Bad COLR header box (bad size: %d)\n",
+                          p_colr_header_size);
+        }
 
-		opj_read_bytes(p_colr_header_data,&jp2->enumcs ,4);			/* EnumCS */
+        opj_read_bytes(p_colr_header_data, &jp2->enumcs, 4);        /* EnumCS */
 
-		p_colr_header_data += 4;
+        p_colr_header_data += 4;
 
-		if(jp2->enumcs == 14)/* CIELab */
-		{
-			OPJ_UINT32 *cielab;
-			OPJ_UINT32 rl, ol, ra, oa, rb, ob, il;
+        if (jp2->enumcs == 14) { /* CIELab */
+            OPJ_UINT32 *cielab;
+            OPJ_UINT32 rl, ol, ra, oa, rb, ob, il;
 
-			cielab = (OPJ_UINT32*)opj_malloc(9 * sizeof(OPJ_UINT32));
-			cielab[0] = 14; /* enumcs */
-			
-			/* default values */
-			rl = ra = rb = ol = oa = ob = 0;
-			il = 0x00443530; /* D50 */
-			cielab[1] = 0x44454600;/* DEF */
+            cielab = (OPJ_UINT32*)opj_malloc(9 * sizeof(OPJ_UINT32));
+            if (cielab == NULL) {
+                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory for cielab\n");
+                return OPJ_FALSE;
+            }
+            cielab[0] = 14; /* enumcs */
 
-			if(p_colr_header_size == 35)
-			{
-				opj_read_bytes(p_colr_header_data, &rl, 4);
-				p_colr_header_data += 4;
-				opj_read_bytes(p_colr_header_data, &ol, 4);
-				p_colr_header_data += 4;
-				opj_read_bytes(p_colr_header_data, &ra, 4);
-				p_colr_header_data += 4;
-				opj_read_bytes(p_colr_header_data, &oa, 4);
-				p_colr_header_data += 4;
-				opj_read_bytes(p_colr_header_data, &rb, 4);
-				p_colr_header_data += 4;
-				opj_read_bytes(p_colr_header_data, &ob, 4);
-				p_colr_header_data += 4;
-				opj_read_bytes(p_colr_header_data, &il, 4);
-				p_colr_header_data += 4;
-				
-				cielab[1] = 0;
-			}
-			else if(p_colr_header_size != 7)
-			{
-				opj_event_msg(p_manager, EVT_WARNING, "Bad COLR header box (CIELab, bad size: %d)\n", p_colr_header_size);
-			}
-			cielab[2] = rl; cielab[4] = ra; cielab[6] = rb;
-			cielab[3] = ol; cielab[5] = oa; cielab[7] = ob;
-			cielab[8] = il;
+            /* default values */
+            rl = ra = rb = ol = oa = ob = 0;
+            il = 0x00443530; /* D50 */
+            cielab[1] = 0x44454600;/* DEF */
 
-			jp2->color.icc_profile_buf = (OPJ_BYTE*)cielab;
-			jp2->color.icc_profile_len = 0;
-		}
-		jp2->color.jp2_has_colr = 1;
-	}
-	else if (jp2->meth == 2) {
-		/* ICC profile */
-		OPJ_INT32 it_icc_value = 0;
-		OPJ_INT32 icc_len = (OPJ_INT32)p_colr_header_size - 3;
+            if (p_colr_header_size == 35) {
+                opj_read_bytes(p_colr_header_data, &rl, 4);
+                p_colr_header_data += 4;
+                opj_read_bytes(p_colr_header_data, &ol, 4);
+                p_colr_header_data += 4;
+                opj_read_bytes(p_colr_header_data, &ra, 4);
+                p_colr_header_data += 4;
+                opj_read_bytes(p_colr_header_data, &oa, 4);
+                p_colr_header_data += 4;
+                opj_read_bytes(p_colr_header_data, &rb, 4);
+                p_colr_header_data += 4;
+                opj_read_bytes(p_colr_header_data, &ob, 4);
+                p_colr_header_data += 4;
+                opj_read_bytes(p_colr_header_data, &il, 4);
+                p_colr_header_data += 4;
 
-		jp2->color.icc_profile_len = (OPJ_UINT32)icc_len;
-		jp2->color.icc_profile_buf = (OPJ_BYTE*) opj_calloc(1,(size_t)icc_len);
-		if (!jp2->color.icc_profile_buf)
-		{
-			jp2->color.icc_profile_len = 0;
-			return OPJ_FALSE;
-		}
+                cielab[1] = 0;
+            } else if (p_colr_header_size != 7) {
+                opj_event_msg(p_manager, EVT_WARNING,
+                              "Bad COLR header box (CIELab, bad size: %d)\n", p_colr_header_size);
+            }
+            cielab[2] = rl;
+            cielab[4] = ra;
+            cielab[6] = rb;
+            cielab[3] = ol;
+            cielab[5] = oa;
+            cielab[7] = ob;
+            cielab[8] = il;
 
-		for (it_icc_value = 0; it_icc_value < icc_len; ++it_icc_value)
-		{
-			opj_read_bytes(p_colr_header_data,&l_value,1);		/* icc values */
-			++p_colr_header_data;
-			jp2->color.icc_profile_buf[it_icc_value] = (OPJ_BYTE) l_value;
-		}
-	    
-		jp2->color.jp2_has_colr = 1;
-	}
-	else if (jp2->meth > 2)
-	{
-		/*	ISO/IEC 15444-1:2004 (E), Table I.9 Legal METH values:
-		conforming JP2 reader shall ignore the entire Colour Specification box.*/
-		opj_event_msg(p_manager, EVT_INFO, "COLR BOX meth value is not a regular value (%d), "
-			"so we will ignore the entire Colour Specification box. \n", jp2->meth);
-	}
-	return OPJ_TRUE;
+            jp2->color.icc_profile_buf = (OPJ_BYTE*)cielab;
+            jp2->color.icc_profile_len = 0;
+        }
+        jp2->color.jp2_has_colr = 1;
+    } else if (jp2->meth == 2) {
+        /* ICC profile */
+        OPJ_INT32 it_icc_value = 0;
+        OPJ_INT32 icc_len = (OPJ_INT32)p_colr_header_size - 3;
+
+        jp2->color.icc_profile_len = (OPJ_UINT32)icc_len;
+        jp2->color.icc_profile_buf = (OPJ_BYTE*) opj_calloc(1, (size_t)icc_len);
+        if (!jp2->color.icc_profile_buf) {
+            jp2->color.icc_profile_len = 0;
+            return OPJ_FALSE;
+        }
+
+        for (it_icc_value = 0; it_icc_value < icc_len; ++it_icc_value) {
+            opj_read_bytes(p_colr_header_data, &l_value, 1);    /* icc values */
+            ++p_colr_header_data;
+            jp2->color.icc_profile_buf[it_icc_value] = (OPJ_BYTE) l_value;
+        }
+
+        jp2->color.jp2_has_colr = 1;
+    } else if (jp2->meth > 2) {
+        /*  ISO/IEC 15444-1:2004 (E), Table I.9 Legal METH values:
+        conforming JP2 reader shall ignore the entire Colour Specification box.*/
+        opj_event_msg(p_manager, EVT_INFO,
+                      "COLR BOX meth value is not a regular value (%d), "
+                      "so we will ignore the entire Colour Specification box. \n", jp2->meth);
+    }
+    if (jp2->color.jp2_has_colr) {
+        jp2->j2k->enumcs = jp2->enumcs;
+    }
+    return OPJ_TRUE;
 }
 
 OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,
@@ -1495,271 +1604,286 @@
                         opj_image_t* p_image,
                         opj_event_mgr_t * p_manager)
 {
-	if (!p_image)
-		return OPJ_FALSE;
+    if (!p_image) {
+        return OPJ_FALSE;
+    }
 
-	/* J2K decoding */
-	if( ! opj_j2k_decode(jp2->j2k, p_stream, p_image, p_manager) ) {
-		opj_event_msg(p_manager, EVT_ERROR, "Failed to decode the codestream in the JP2 file\n");
-		return OPJ_FALSE;
-	}
+    /* J2K decoding */
+    if (! opj_j2k_decode(jp2->j2k, p_stream, p_image, p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Failed to decode the codestream in the JP2 file\n");
+        return OPJ_FALSE;
+    }
 
-	if (!jp2->ignore_pclr_cmap_cdef){
-		if (!opj_jp2_check_color(p_image, &(jp2->color), p_manager)) {
-			return OPJ_FALSE;
-		}
+    if (!jp2->ignore_pclr_cmap_cdef) {
+        if (!opj_jp2_check_color(p_image, &(jp2->color), p_manager)) {
+            return OPJ_FALSE;
+        }
 
-		/* Set Image Color Space */
-		if (jp2->enumcs == 16)
-			p_image->color_space = OPJ_CLRSPC_SRGB;
-		else if (jp2->enumcs == 17)
-			p_image->color_space = OPJ_CLRSPC_GRAY;
-		else if (jp2->enumcs == 18)
-			p_image->color_space = OPJ_CLRSPC_SYCC;
-		else if (jp2->enumcs == 24)
-			p_image->color_space = OPJ_CLRSPC_EYCC;
-		else if (jp2->enumcs == 12)
-			p_image->color_space = OPJ_CLRSPC_CMYK;
-		else
-			p_image->color_space = OPJ_CLRSPC_UNKNOWN;
+        /* Set Image Color Space */
+        if (jp2->enumcs == 16) {
+            p_image->color_space = OPJ_CLRSPC_SRGB;
+        } else if (jp2->enumcs == 17) {
+            p_image->color_space = OPJ_CLRSPC_GRAY;
+        } else if (jp2->enumcs == 18) {
+            p_image->color_space = OPJ_CLRSPC_SYCC;
+        } else if (jp2->enumcs == 24) {
+            p_image->color_space = OPJ_CLRSPC_EYCC;
+        } else if (jp2->enumcs == 12) {
+            p_image->color_space = OPJ_CLRSPC_CMYK;
+        } else {
+            p_image->color_space = OPJ_CLRSPC_UNKNOWN;
+        }
 
-		if(jp2->color.jp2_pclr) {
-			/* Part 1, I.5.3.4: Either both or none : */
-			if( !jp2->color.jp2_pclr->cmap)
-				opj_jp2_free_pclr(&(jp2->color));
-			else if (p_image->pdfium_use_colorspace)
-				opj_jp2_apply_pclr(p_image, &(jp2->color));
-		}
+        if (jp2->color.jp2_pclr) {
+            /* Part 1, I.5.3.4: Either both or none : */
+            if (!jp2->color.jp2_pclr->cmap) {
+                opj_jp2_free_pclr(&(jp2->color));
+            } else if (p_image->pdfium_use_colorspace) {
+                if (!opj_jp2_apply_pclr(p_image, &(jp2->color), p_manager)) {
+                    return OPJ_FALSE;
+                }
+            }
+        }
 
-		/* Apply the color space if needed */
-		if(jp2->color.jp2_cdef) {
-			opj_jp2_apply_cdef(p_image, &(jp2->color), p_manager);
-		}
+        /* Apply the color space if needed */
+        if (jp2->color.jp2_cdef) {
+            opj_jp2_apply_cdef(p_image, &(jp2->color), p_manager);
+        }
 
-		if(jp2->color.icc_profile_buf) {
-			p_image->icc_profile_buf = jp2->color.icc_profile_buf;
-			p_image->icc_profile_len = jp2->color.icc_profile_len;
-			jp2->color.icc_profile_buf = NULL;
-		}
-	}
+        if (jp2->color.icc_profile_buf) {
+            p_image->icc_profile_buf = jp2->color.icc_profile_buf;
+            p_image->icc_profile_len = jp2->color.icc_profile_len;
+            jp2->color.icc_profile_buf = NULL;
+        }
+    }
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 static OPJ_BOOL opj_jp2_write_jp2h(opj_jp2_t *jp2,
-                            opj_stream_private_t *stream,
-                            opj_event_mgr_t * p_manager
-                            )
+                                   opj_stream_private_t *stream,
+                                   opj_event_mgr_t * p_manager
+                                  )
 {
-	opj_jp2_img_header_writer_handler_t l_writers [4];
-	opj_jp2_img_header_writer_handler_t * l_current_writer;
+    opj_jp2_img_header_writer_handler_t l_writers [4];
+    opj_jp2_img_header_writer_handler_t * l_current_writer;
 
-	OPJ_INT32 i, l_nb_pass;
-	/* size of data for super box*/
-	OPJ_UINT32 l_jp2h_size = 8;
-	OPJ_BOOL l_result = OPJ_TRUE;
+    OPJ_INT32 i, l_nb_pass;
+    /* size of data for super box*/
+    OPJ_UINT32 l_jp2h_size = 8;
+    OPJ_BOOL l_result = OPJ_TRUE;
 
-	/* to store the data of the super box */
-	OPJ_BYTE l_jp2h_data [8];
-	
-	/* preconditions */
-	assert(stream != 00);
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* to store the data of the super box */
+    OPJ_BYTE l_jp2h_data [8];
 
-	memset(l_writers,0,sizeof(l_writers));
+    /* preconditions */
+    assert(stream != 00);
+    assert(jp2 != 00);
+    assert(p_manager != 00);
 
-	if (jp2->bpc == 255) {
-		l_nb_pass = 3;
-		l_writers[0].handler = opj_jp2_write_ihdr;
-		l_writers[1].handler = opj_jp2_write_bpcc;
-		l_writers[2].handler = opj_jp2_write_colr;
-	}
-	else {
-		l_nb_pass = 2;
-		l_writers[0].handler = opj_jp2_write_ihdr;
-		l_writers[1].handler = opj_jp2_write_colr;
-	}
-	
-	if (jp2->color.jp2_cdef != NULL) {
-		l_writers[l_nb_pass].handler = opj_jp2_write_cdef;
-		l_nb_pass++;
-	}
-	
-	/* write box header */
-	/* write JP2H type */
-	opj_write_bytes(l_jp2h_data+4,JP2_JP2H,4);
+    memset(l_writers, 0, sizeof(l_writers));
 
-	l_current_writer = l_writers;
-	for (i=0;i<l_nb_pass;++i) {
-		l_current_writer->m_data = l_current_writer->handler(jp2,&(l_current_writer->m_size));
-		if (l_current_writer->m_data == 00) {
-			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to hold JP2 Header data\n");
-			l_result = OPJ_FALSE;
-			break;
-		}
+    if (jp2->bpc == 255) {
+        l_nb_pass = 3;
+        l_writers[0].handler = opj_jp2_write_ihdr;
+        l_writers[1].handler = opj_jp2_write_bpcc;
+        l_writers[2].handler = opj_jp2_write_colr;
+    } else {
+        l_nb_pass = 2;
+        l_writers[0].handler = opj_jp2_write_ihdr;
+        l_writers[1].handler = opj_jp2_write_colr;
+    }
 
-		l_jp2h_size += l_current_writer->m_size;
-		++l_current_writer;
-	}
+    if (jp2->color.jp2_cdef != NULL) {
+        l_writers[l_nb_pass].handler = opj_jp2_write_cdef;
+        l_nb_pass++;
+    }
 
-	if (! l_result) {
-		l_current_writer = l_writers;
-		for (i=0;i<l_nb_pass;++i) {
-			if (l_current_writer->m_data != 00) {
-				opj_free(l_current_writer->m_data );
-			}
-			++l_current_writer;
-		}
+    /* write box header */
+    /* write JP2H type */
+    opj_write_bytes(l_jp2h_data + 4, JP2_JP2H, 4);
 
-		return OPJ_FALSE;
-	}
+    l_current_writer = l_writers;
+    for (i = 0; i < l_nb_pass; ++i) {
+        l_current_writer->m_data = l_current_writer->handler(jp2,
+                                   &(l_current_writer->m_size));
+        if (l_current_writer->m_data == 00) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Not enough memory to hold JP2 Header data\n");
+            l_result = OPJ_FALSE;
+            break;
+        }
 
-	/* write super box size */
-	opj_write_bytes(l_jp2h_data,l_jp2h_size,4);
-	
-	/* write super box data on stream */
-	if (opj_stream_write_data(stream,l_jp2h_data,8,p_manager) != 8) {
-		opj_event_msg(p_manager, EVT_ERROR, "Stream error while writing JP2 Header box\n");
-		l_result = OPJ_FALSE;
-	}
-	
-	if (l_result) {
-		l_current_writer = l_writers;
-		for (i=0;i<l_nb_pass;++i) {
-			if (opj_stream_write_data(stream,l_current_writer->m_data,l_current_writer->m_size,p_manager) != l_current_writer->m_size) {
-				opj_event_msg(p_manager, EVT_ERROR, "Stream error while writing JP2 Header box\n");
-				l_result = OPJ_FALSE;
-				break;
-			}
-			++l_current_writer;
-		}
-	}
+        l_jp2h_size += l_current_writer->m_size;
+        ++l_current_writer;
+    }
 
-	l_current_writer = l_writers;
-	
-	/* cleanup */
-	for (i=0;i<l_nb_pass;++i) {
-		if (l_current_writer->m_data != 00) {
-			opj_free(l_current_writer->m_data );
-		}
-		++l_current_writer;
-	}
+    if (! l_result) {
+        l_current_writer = l_writers;
+        for (i = 0; i < l_nb_pass; ++i) {
+            if (l_current_writer->m_data != 00) {
+                opj_free(l_current_writer->m_data);
+            }
+            ++l_current_writer;
+        }
 
-	return l_result;
+        return OPJ_FALSE;
+    }
+
+    /* write super box size */
+    opj_write_bytes(l_jp2h_data, l_jp2h_size, 4);
+
+    /* write super box data on stream */
+    if (opj_stream_write_data(stream, l_jp2h_data, 8, p_manager) != 8) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Stream error while writing JP2 Header box\n");
+        l_result = OPJ_FALSE;
+    }
+
+    if (l_result) {
+        l_current_writer = l_writers;
+        for (i = 0; i < l_nb_pass; ++i) {
+            if (opj_stream_write_data(stream, l_current_writer->m_data,
+                                      l_current_writer->m_size, p_manager) != l_current_writer->m_size) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Stream error while writing JP2 Header box\n");
+                l_result = OPJ_FALSE;
+                break;
+            }
+            ++l_current_writer;
+        }
+    }
+
+    l_current_writer = l_writers;
+
+    /* cleanup */
+    for (i = 0; i < l_nb_pass; ++i) {
+        if (l_current_writer->m_data != 00) {
+            opj_free(l_current_writer->m_data);
+        }
+        ++l_current_writer;
+    }
+
+    return l_result;
 }
 
 static OPJ_BOOL opj_jp2_write_ftyp(opj_jp2_t *jp2,
-							opj_stream_private_t *cio,
-							opj_event_mgr_t * p_manager )
+                                   opj_stream_private_t *cio,
+                                   opj_event_mgr_t * p_manager)
 {
-	OPJ_UINT32 i;
-	OPJ_UINT32 l_ftyp_size = 16 + 4 * jp2->numcl;
-	OPJ_BYTE * l_ftyp_data, * l_current_data_ptr;
-	OPJ_BOOL l_result;
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_ftyp_size;
+    OPJ_BYTE * l_ftyp_data, * l_current_data_ptr;
+    OPJ_BOOL l_result;
 
-	/* preconditions */
-	assert(cio != 00);
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(cio != 00);
+    assert(jp2 != 00);
+    assert(p_manager != 00);
+    l_ftyp_size = 16 + 4 * jp2->numcl;
 
-	l_ftyp_data = (OPJ_BYTE *) opj_calloc(1,l_ftyp_size);
-	
-	if (l_ftyp_data == 00) {
-		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle ftyp data\n");
-		return OPJ_FALSE;
-	}
+    l_ftyp_data = (OPJ_BYTE *) opj_calloc(1, l_ftyp_size);
 
-	l_current_data_ptr = l_ftyp_data;
+    if (l_ftyp_data == 00) {
+        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle ftyp data\n");
+        return OPJ_FALSE;
+    }
 
-	opj_write_bytes(l_current_data_ptr, l_ftyp_size,4); /* box size */
-	l_current_data_ptr += 4;
+    l_current_data_ptr = l_ftyp_data;
 
-	opj_write_bytes(l_current_data_ptr, JP2_FTYP,4); /* FTYP */
-	l_current_data_ptr += 4;
+    opj_write_bytes(l_current_data_ptr, l_ftyp_size, 4); /* box size */
+    l_current_data_ptr += 4;
 
-	opj_write_bytes(l_current_data_ptr, jp2->brand,4); /* BR */
-	l_current_data_ptr += 4;
+    opj_write_bytes(l_current_data_ptr, JP2_FTYP, 4); /* FTYP */
+    l_current_data_ptr += 4;
 
-	opj_write_bytes(l_current_data_ptr, jp2->minversion,4); /* MinV */
-	l_current_data_ptr += 4;
+    opj_write_bytes(l_current_data_ptr, jp2->brand, 4); /* BR */
+    l_current_data_ptr += 4;
 
-	for (i = 0; i < jp2->numcl; i++)  {
-		opj_write_bytes(l_current_data_ptr, jp2->cl[i],4);	/* CL */
-	}
-	
-	l_result = (opj_stream_write_data(cio,l_ftyp_data,l_ftyp_size,p_manager) == l_ftyp_size);
-	if (! l_result)
-	{
-		opj_event_msg(p_manager, EVT_ERROR, "Error while writing ftyp data to stream\n");
-	}
+    opj_write_bytes(l_current_data_ptr, jp2->minversion, 4); /* MinV */
+    l_current_data_ptr += 4;
 
-	opj_free(l_ftyp_data);
-	
-	return l_result;
+    for (i = 0; i < jp2->numcl; i++)  {
+        opj_write_bytes(l_current_data_ptr, jp2->cl[i], 4); /* CL */
+    }
+
+    l_result = (opj_stream_write_data(cio, l_ftyp_data, l_ftyp_size,
+                                      p_manager) == l_ftyp_size);
+    if (! l_result) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Error while writing ftyp data to stream\n");
+    }
+
+    opj_free(l_ftyp_data);
+
+    return l_result;
 }
 
 static OPJ_BOOL opj_jp2_write_jp2c(opj_jp2_t *jp2,
-							opj_stream_private_t *cio,
-							opj_event_mgr_t * p_manager )
+                                   opj_stream_private_t *cio,
+                                   opj_event_mgr_t * p_manager)
 {
-	OPJ_OFF_T j2k_codestream_exit;
-	OPJ_BYTE l_data_header [8];
-	
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(cio != 00);
-	assert(p_manager != 00);
-	assert(opj_stream_has_seek(cio));
-	
-	j2k_codestream_exit = opj_stream_tell(cio);
-	opj_write_bytes(l_data_header,
-                    (OPJ_UINT32) (j2k_codestream_exit - jp2->j2k_codestream_offset),
+    OPJ_OFF_T j2k_codestream_exit;
+    OPJ_BYTE l_data_header [8];
+
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(cio != 00);
+    assert(p_manager != 00);
+    assert(opj_stream_has_seek(cio));
+
+    j2k_codestream_exit = opj_stream_tell(cio);
+    opj_write_bytes(l_data_header,
+                    (OPJ_UINT32)(j2k_codestream_exit - jp2->j2k_codestream_offset),
                     4); /* size of codestream */
-	opj_write_bytes(l_data_header + 4,JP2_JP2C,4);									   /* JP2C */
+    opj_write_bytes(l_data_header + 4, JP2_JP2C,
+                    4);                                     /* JP2C */
 
-	if (! opj_stream_seek(cio,jp2->j2k_codestream_offset,p_manager)) {
-		opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
-		return OPJ_FALSE;
-	}
-	
-	if (opj_stream_write_data(cio,l_data_header,8,p_manager) != 8) {
-		opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
-		return OPJ_FALSE;
-	}
+    if (! opj_stream_seek(cio, jp2->j2k_codestream_offset, p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+        return OPJ_FALSE;
+    }
 
-	if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
-		opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
-		return OPJ_FALSE;
-	}
+    if (opj_stream_write_data(cio, l_data_header, 8, p_manager) != 8) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+        return OPJ_FALSE;
+    }
 
-	return OPJ_TRUE;
+    if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+        return OPJ_FALSE;
+    }
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_jp2_write_jp(	opj_jp2_t *jp2,
-			    		    opj_stream_private_t *cio,
-				    		opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_jp2_write_jp(opj_jp2_t *jp2,
+                                 opj_stream_private_t *cio,
+                                 opj_event_mgr_t * p_manager)
 {
-	/* 12 bytes will be read */
-	OPJ_BYTE l_signature_data [12];
+    /* 12 bytes will be read */
+    OPJ_BYTE l_signature_data [12];
 
-	/* preconditions */
-	assert(cio != 00);
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(cio != 00);
+    assert(jp2 != 00);
+    assert(p_manager != 00);
 
-	/* write box length */
-	opj_write_bytes(l_signature_data,12,4);
-	/* writes box type */
-	opj_write_bytes(l_signature_data+4,JP2_JP,4);
-	/* writes magic number*/
-	opj_write_bytes(l_signature_data+8,0x0d0a870a,4);
-	
-	if (opj_stream_write_data(cio,l_signature_data,12,p_manager) != 12) {
-		return OPJ_FALSE;
-	}
+    OPJ_UNUSED(jp2);
 
-	return OPJ_TRUE;
+    /* write box length */
+    opj_write_bytes(l_signature_data, 12, 4);
+    /* writes box type */
+    opj_write_bytes(l_signature_data + 4, JP2_JP, 4);
+    /* writes magic number*/
+    opj_write_bytes(l_signature_data + 8, 0x0d0a870a, 4);
+
+    if (opj_stream_write_data(cio, l_signature_data, 12, p_manager) != 12) {
+        return OPJ_FALSE;
+    }
+
+    return OPJ_TRUE;
 }
 
 /* ----------------------------------------------------------------------- */
@@ -1768,578 +1892,645 @@
 
 void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters)
 {
-	/* setup the J2K codec */
-	opj_j2k_setup_decoder(jp2->j2k, parameters);
+    /* setup the J2K codec */
+    opj_j2k_setup_decoder(jp2->j2k, parameters);
 
-	/* further JP2 initializations go here */
-	jp2->color.jp2_has_colr = 0;
-	jp2->comps = NULL;
-    jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
+    /* further JP2 initializations go here */
+    jp2->color.jp2_has_colr = 0;
+    jp2->comps = NULL;
+    jp2->ignore_pclr_cmap_cdef = parameters->flags &
+                                 OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
+}
+
+OPJ_BOOL opj_jp2_set_threads(opj_jp2_t *jp2, OPJ_UINT32 num_threads)
+{
+    return opj_j2k_set_threads(jp2->j2k, num_threads);
 }
 
 /* ----------------------------------------------------------------------- */
 /* JP2 encoder interface                                             */
 /* ----------------------------------------------------------------------- */
 
-OPJ_BOOL opj_jp2_setup_encoder(	opj_jp2_t *jp2,
-                            opj_cparameters_t *parameters,
-                            opj_image_t *image,
-                            opj_event_mgr_t * p_manager)
+OPJ_BOOL opj_jp2_setup_encoder(opj_jp2_t *jp2,
+                               opj_cparameters_t *parameters,
+                               opj_image_t *image,
+                               opj_event_mgr_t * p_manager)
 {
-	OPJ_UINT32 i;
-	OPJ_UINT32 depth_0;
-  OPJ_UINT32 sign;
-	OPJ_UINT32 alpha_count;
-	OPJ_UINT32 color_channels = 0U;
-	OPJ_UINT32 alpha_channel = 0U;
-	
+    OPJ_UINT32 i;
+    OPJ_UINT32 depth_0;
+    OPJ_UINT32 sign;
+    OPJ_UINT32 alpha_count;
+    OPJ_UINT32 color_channels = 0U;
+    OPJ_UINT32 alpha_channel = 0U;
 
-	if(!jp2 || !parameters || !image)
-		return OPJ_FALSE;
 
-	/* setup the J2K codec */
-	/* ------------------- */
-
-	/* Check if number of components respects standard */
-	if (image->numcomps < 1 || image->numcomps > 16384) {
-		opj_event_msg(p_manager, EVT_ERROR, "Invalid number of components specified while setting up JP2 encoder\n");
-		return OPJ_FALSE;
-	}
-
-	if (opj_j2k_setup_encoder(jp2->j2k, parameters, image, p_manager ) == OPJ_FALSE) {
-		return OPJ_FALSE;
-	}
-
-	/* setup the JP2 codec */
-	/* ------------------- */
-	
-	/* Profile box */
-
-	jp2->brand = JP2_JP2;	/* BR */
-	jp2->minversion = 0;	/* MinV */
-	jp2->numcl = 1;
-	jp2->cl = (OPJ_UINT32*) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
-	if (!jp2->cl){
-		jp2->cl = NULL;
-		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
-		return OPJ_FALSE;
-	}
-	jp2->cl[0] = JP2_JP2;	/* CL0 : JP2 */
-
-	/* Image Header box */
-
-	jp2->numcomps = image->numcomps;	/* NC */
-	jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp2_comps_t));
-	if (!jp2->comps) {
-		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP2 encoder\n");
-		/* Memory of jp2->cl will be freed by opj_jp2_destroy */
-		return OPJ_FALSE;
-	}
-
-	jp2->h = image->y1 - image->y0;		/* HEIGHT */
-	jp2->w = image->x1 - image->x0;		/* WIDTH */
-	/* BPC */
-	depth_0 = image->comps[0].prec - 1;
-	sign = image->comps[0].sgnd;
-	jp2->bpc = depth_0 + (sign << 7);
-	for (i = 1; i < image->numcomps; i++) {
-		OPJ_UINT32 depth = image->comps[i].prec - 1;
-		sign = image->comps[i].sgnd;
-		if (depth_0 != depth)
-			jp2->bpc = 255;
-	}
-	jp2->C = 7;			/* C : Always 7 */
-	jp2->UnkC = 0;		/* UnkC, colorspace specified in colr box */
-	jp2->IPR = 0;		/* IPR, no intellectual property */
-	
-	/* BitsPerComponent box */
-	for (i = 0; i < image->numcomps; i++) {
-		jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);
-	}
-
-	/* Colour Specification box */
-    if(image->icc_profile_len) {
-        jp2->meth = 2;
-        jp2->enumcs = 0;
-    } 
-    else {
-        jp2->meth = 1;
-        if (image->color_space == 1)
-            jp2->enumcs = 16;	/* sRGB as defined by IEC 61966-2-1 */
-        else if (image->color_space == 2)
-            jp2->enumcs = 17;	/* greyscale */
-        else if (image->color_space == 3)
-            jp2->enumcs = 18;	/* YUV */
+    if (!jp2 || !parameters || !image) {
+        return OPJ_FALSE;
     }
 
-	/* Channel Definition box */
-	/* FIXME not provided by parameters */
-	/* We try to do what we can... */
-	alpha_count = 0U;
-	for (i = 0; i < image->numcomps; i++) {
-		if (image->comps[i].alpha != 0) {
-			alpha_count++;
-			alpha_channel = i;
-		}
-	}
-	if (alpha_count == 1U) { /* no way to deal with more than 1 alpha channel */
-		switch (jp2->enumcs) {
-			case 16:
-			case 18:
-				color_channels = 3;
-				break;
-			case 17:
-				color_channels = 1;
-				break;
-			default:
-				alpha_count = 0U;
-				break;
-		}
-		if (alpha_count == 0U) {
-			opj_event_msg(p_manager, EVT_WARNING, "Alpha channel specified but unknown enumcs. No cdef box will be created.\n");
-		} else if (image->numcomps < (color_channels+1)) {
-			opj_event_msg(p_manager, EVT_WARNING, "Alpha channel specified but not enough image components for an automatic cdef box creation.\n");
-			alpha_count = 0U;
-		} else if ((OPJ_UINT32)alpha_channel < color_channels) {
-			opj_event_msg(p_manager, EVT_WARNING, "Alpha channel position conflicts with color channel. No cdef box will be created.\n");
-			alpha_count = 0U;
-		}
-	} else if (alpha_count > 1) {
-		opj_event_msg(p_manager, EVT_WARNING, "Multiple alpha channels specified. No cdef box will be created.\n");
-	}
-	if (alpha_count == 1U) { /* if here, we know what we can do */
-		jp2->color.jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
-		if(!jp2->color.jp2_cdef) {
-			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup the JP2 encoder\n");
-			return OPJ_FALSE;
-		}
-		/* no memset needed, all values will be overwritten except if jp2->color.jp2_cdef->info allocation fails, */
-		/* in which case jp2->color.jp2_cdef->info will be NULL => valid for destruction */
-		jp2->color.jp2_cdef->info = (opj_jp2_cdef_info_t*) opj_malloc(image->numcomps * sizeof(opj_jp2_cdef_info_t));
-		if (!jp2->color.jp2_cdef->info) {
-			/* memory will be freed by opj_jp2_destroy */
-			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to setup the JP2 encoder\n");
-			return OPJ_FALSE;
-		}
-		jp2->color.jp2_cdef->n = (OPJ_UINT16) image->numcomps; /* cast is valid : image->numcomps [1,16384] */
-		for (i = 0U; i < color_channels; i++) {
-			jp2->color.jp2_cdef->info[i].cn = (OPJ_UINT16)i; /* cast is valid : image->numcomps [1,16384] */
-			jp2->color.jp2_cdef->info[i].typ = 0U;
-			jp2->color.jp2_cdef->info[i].asoc = (OPJ_UINT16)(i+1U); /* No overflow + cast is valid : image->numcomps [1,16384] */
-		}
-		for (; i < image->numcomps; i++) {
-			if (image->comps[i].alpha != 0) { /* we'll be here exactly once */
-				jp2->color.jp2_cdef->info[i].cn = (OPJ_UINT16)i; /* cast is valid : image->numcomps [1,16384] */
-				jp2->color.jp2_cdef->info[i].typ = 1U; /* Opacity channel */
-				jp2->color.jp2_cdef->info[i].asoc = 0U; /* Apply alpha channel to the whole image */
-			} else {
-				/* Unknown channel */
-				jp2->color.jp2_cdef->info[i].cn = (OPJ_UINT16)i; /* cast is valid : image->numcomps [1,16384] */
-				jp2->color.jp2_cdef->info[i].typ = 65535U;
-				jp2->color.jp2_cdef->info[i].asoc = 65535U;
-			}
-		}
-	}
+    /* setup the J2K codec */
+    /* ------------------- */
 
-	jp2->precedence = 0;	/* PRECEDENCE */
-	jp2->approx = 0;		/* APPROX */
+    /* Check if number of components respects standard */
+    if (image->numcomps < 1 || image->numcomps > 16384) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Invalid number of components specified while setting up JP2 encoder\n");
+        return OPJ_FALSE;
+    }
 
-	jp2->jpip_on = parameters->jpip_on;
+    if (opj_j2k_setup_encoder(jp2->j2k, parameters, image,
+                              p_manager) == OPJ_FALSE) {
+        return OPJ_FALSE;
+    }
 
-	return OPJ_TRUE;
+    /* setup the JP2 codec */
+    /* ------------------- */
+
+    /* Profile box */
+
+    jp2->brand = JP2_JP2;   /* BR */
+    jp2->minversion = 0;    /* MinV */
+    jp2->numcl = 1;
+    jp2->cl = (OPJ_UINT32*) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
+    if (!jp2->cl) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Not enough memory when setup the JP2 encoder\n");
+        return OPJ_FALSE;
+    }
+    jp2->cl[0] = JP2_JP2;   /* CL0 : JP2 */
+
+    /* Image Header box */
+
+    jp2->numcomps = image->numcomps;    /* NC */
+    jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(
+                     opj_jp2_comps_t));
+    if (!jp2->comps) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Not enough memory when setup the JP2 encoder\n");
+        /* Memory of jp2->cl will be freed by opj_jp2_destroy */
+        return OPJ_FALSE;
+    }
+
+    jp2->h = image->y1 - image->y0;     /* HEIGHT */
+    jp2->w = image->x1 - image->x0;     /* WIDTH */
+    /* BPC */
+    depth_0 = image->comps[0].prec - 1;
+    sign = image->comps[0].sgnd;
+    jp2->bpc = depth_0 + (sign << 7);
+    for (i = 1; i < image->numcomps; i++) {
+        OPJ_UINT32 depth = image->comps[i].prec - 1;
+        sign = image->comps[i].sgnd;
+        if (depth_0 != depth) {
+            jp2->bpc = 255;
+        }
+    }
+    jp2->C = 7;         /* C : Always 7 */
+    jp2->UnkC = 0;      /* UnkC, colorspace specified in colr box */
+    jp2->IPR = 0;       /* IPR, no intellectual property */
+
+    /* BitsPerComponent box */
+    for (i = 0; i < image->numcomps; i++) {
+        jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);
+    }
+
+    /* Colour Specification box */
+    if (image->icc_profile_len) {
+        jp2->meth = 2;
+        jp2->enumcs = 0;
+    } else {
+        jp2->meth = 1;
+        if (image->color_space == 1) {
+            jp2->enumcs = 16;    /* sRGB as defined by IEC 61966-2-1 */
+        } else if (image->color_space == 2) {
+            jp2->enumcs = 17;    /* greyscale */
+        } else if (image->color_space == 3) {
+            jp2->enumcs = 18;    /* YUV */
+        }
+    }
+
+    /* Channel Definition box */
+    /* FIXME not provided by parameters */
+    /* We try to do what we can... */
+    alpha_count = 0U;
+    for (i = 0; i < image->numcomps; i++) {
+        if (image->comps[i].alpha != 0) {
+            alpha_count++;
+            alpha_channel = i;
+        }
+    }
+    if (alpha_count == 1U) { /* no way to deal with more than 1 alpha channel */
+        switch (jp2->enumcs) {
+        case 16:
+        case 18:
+            color_channels = 3;
+            break;
+        case 17:
+            color_channels = 1;
+            break;
+        default:
+            alpha_count = 0U;
+            break;
+        }
+        if (alpha_count == 0U) {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "Alpha channel specified but unknown enumcs. No cdef box will be created.\n");
+        } else if (image->numcomps < (color_channels + 1)) {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "Alpha channel specified but not enough image components for an automatic cdef box creation.\n");
+            alpha_count = 0U;
+        } else if ((OPJ_UINT32)alpha_channel < color_channels) {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "Alpha channel position conflicts with color channel. No cdef box will be created.\n");
+            alpha_count = 0U;
+        }
+    } else if (alpha_count > 1) {
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "Multiple alpha channels specified. No cdef box will be created.\n");
+    }
+    if (alpha_count == 1U) { /* if here, we know what we can do */
+        jp2->color.jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
+        if (!jp2->color.jp2_cdef) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Not enough memory to setup the JP2 encoder\n");
+            return OPJ_FALSE;
+        }
+        /* no memset needed, all values will be overwritten except if jp2->color.jp2_cdef->info allocation fails, */
+        /* in which case jp2->color.jp2_cdef->info will be NULL => valid for destruction */
+        jp2->color.jp2_cdef->info = (opj_jp2_cdef_info_t*) opj_malloc(
+                                        image->numcomps * sizeof(opj_jp2_cdef_info_t));
+        if (!jp2->color.jp2_cdef->info) {
+            /* memory will be freed by opj_jp2_destroy */
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Not enough memory to setup the JP2 encoder\n");
+            return OPJ_FALSE;
+        }
+        jp2->color.jp2_cdef->n = (OPJ_UINT16)
+                                 image->numcomps; /* cast is valid : image->numcomps [1,16384] */
+        for (i = 0U; i < color_channels; i++) {
+            jp2->color.jp2_cdef->info[i].cn = (OPJ_UINT16)
+                                              i; /* cast is valid : image->numcomps [1,16384] */
+            jp2->color.jp2_cdef->info[i].typ = 0U;
+            jp2->color.jp2_cdef->info[i].asoc = (OPJ_UINT16)(i +
+                                                1U); /* No overflow + cast is valid : image->numcomps [1,16384] */
+        }
+        for (; i < image->numcomps; i++) {
+            if (image->comps[i].alpha != 0) { /* we'll be here exactly once */
+                jp2->color.jp2_cdef->info[i].cn = (OPJ_UINT16)
+                                                  i; /* cast is valid : image->numcomps [1,16384] */
+                jp2->color.jp2_cdef->info[i].typ = 1U; /* Opacity channel */
+                jp2->color.jp2_cdef->info[i].asoc =
+                    0U; /* Apply alpha channel to the whole image */
+            } else {
+                /* Unknown channel */
+                jp2->color.jp2_cdef->info[i].cn = (OPJ_UINT16)
+                                                  i; /* cast is valid : image->numcomps [1,16384] */
+                jp2->color.jp2_cdef->info[i].typ = 65535U;
+                jp2->color.jp2_cdef->info[i].asoc = 65535U;
+            }
+        }
+    }
+
+    jp2->precedence = 0;    /* PRECEDENCE */
+    jp2->approx = 0;        /* APPROX */
+
+    jp2->jpip_on = parameters->jpip_on;
+
+    return OPJ_TRUE;
 }
 
 OPJ_BOOL opj_jp2_encode(opj_jp2_t *jp2,
-						opj_stream_private_t *stream,
-						opj_event_mgr_t * p_manager)
+                        opj_stream_private_t *stream,
+                        opj_event_mgr_t * p_manager)
 {
-	return opj_j2k_encode(jp2->j2k, stream, p_manager);
+    return opj_j2k_encode(jp2->j2k, stream, p_manager);
 }
 
 OPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2,
                                 opj_stream_private_t *cio,
                                 opj_event_mgr_t * p_manager
-                                )
+                               )
 {
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(cio != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(cio != 00);
+    assert(p_manager != 00);
 
-	/* customization of the end encoding */
-	if (! opj_jp2_setup_end_header_reading(jp2, p_manager)) {
-		return OPJ_FALSE;
-	}
+    /* customization of the end encoding */
+    if (! opj_jp2_setup_end_header_reading(jp2, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-	/* write header */
-	if (! opj_jp2_exec (jp2,jp2->m_procedure_list,cio,p_manager)) {
-		return OPJ_FALSE;
-	}
+    /* write header */
+    if (! opj_jp2_exec(jp2, jp2->m_procedure_list, cio, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-	return opj_j2k_end_decompress(jp2->j2k, cio, p_manager);
+    return opj_j2k_end_decompress(jp2->j2k, cio, p_manager);
 }
 
-OPJ_BOOL opj_jp2_end_compress(	opj_jp2_t *jp2,
-							    opj_stream_private_t *cio,
-							    opj_event_mgr_t * p_manager
-                                )
+OPJ_BOOL opj_jp2_end_compress(opj_jp2_t *jp2,
+                              opj_stream_private_t *cio,
+                              opj_event_mgr_t * p_manager
+                             )
 {
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(cio != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(cio != 00);
+    assert(p_manager != 00);
 
-	/* customization of the end encoding */
-	if (! opj_jp2_setup_end_header_writing(jp2, p_manager)) {
-		return OPJ_FALSE;
-	}
+    /* customization of the end encoding */
+    if (! opj_jp2_setup_end_header_writing(jp2, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-	if (! opj_j2k_end_compress(jp2->j2k,cio,p_manager)) {
-		return OPJ_FALSE;
-	}
+    if (! opj_j2k_end_compress(jp2->j2k, cio, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-	/* write header */
-	return opj_jp2_exec(jp2,jp2->m_procedure_list,cio,p_manager);
+    /* write header */
+    return opj_jp2_exec(jp2, jp2->m_procedure_list, cio, p_manager);
 }
 
-static OPJ_BOOL opj_jp2_setup_end_header_writing (opj_jp2_t *jp2, opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_jp2_setup_end_header_writing(opj_jp2_t *jp2,
+        opj_event_mgr_t * p_manager)
 {
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_manager != 00);
 
 #ifdef USE_JPIP
-	if( jp2->jpip_on ) {
-		if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_iptr, p_manager)) {
-			return OPJ_FALSE;
-		}
-	}
+    if (jp2->jpip_on) {
+        if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
+                                               (opj_procedure)opj_jpip_write_iptr, p_manager)) {
+            return OPJ_FALSE;
+        }
+    }
 #endif
-	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp2c, p_manager)) {
-		return OPJ_FALSE;
-	}
-	/* DEVELOPER CORNER, add your custom procedures */
+    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
+                                           (opj_procedure)opj_jp2_write_jp2c, p_manager)) {
+        return OPJ_FALSE;
+    }
+    /* DEVELOPER CORNER, add your custom procedures */
 #ifdef USE_JPIP
-  if( jp2->jpip_on )
-	{
-		if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_cidx, p_manager)) {
-			return OPJ_FALSE;
-		}
-		if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_write_fidx, p_manager)) {
-			return OPJ_FALSE;
-		}
-	}
+    if (jp2->jpip_on) {
+        if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
+                                               (opj_procedure)opj_jpip_write_cidx, p_manager)) {
+            return OPJ_FALSE;
+        }
+        if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
+                                               (opj_procedure)opj_jpip_write_fidx, p_manager)) {
+            return OPJ_FALSE;
+        }
+    }
 #endif
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_jp2_setup_end_header_reading (opj_jp2_t *jp2, opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_jp2_setup_end_header_reading(opj_jp2_t *jp2,
+        opj_event_mgr_t * p_manager)
 {
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_manager != 00);
-	
-	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_read_header_procedure, p_manager)) {
-		return OPJ_FALSE;
-	}
-	/* DEVELOPER CORNER, add your custom procedures */
-	
-	return OPJ_TRUE;
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_manager != 00);
+
+    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
+                                           (opj_procedure)opj_jp2_read_header_procedure, p_manager)) {
+        return OPJ_FALSE;
+    }
+    /* DEVELOPER CORNER, add your custom procedures */
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_jp2_default_validation (	opj_jp2_t * jp2,
-                                        opj_stream_private_t *cio,
-                                        opj_event_mgr_t * p_manager
-                                        )
+static OPJ_BOOL opj_jp2_default_validation(opj_jp2_t * jp2,
+        opj_stream_private_t *cio,
+        opj_event_mgr_t * p_manager
+                                          )
 {
-	OPJ_BOOL l_is_valid = OPJ_TRUE;
-	OPJ_UINT32 i;
+    OPJ_BOOL l_is_valid = OPJ_TRUE;
+    OPJ_UINT32 i;
 
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(cio != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(cio != 00);
+    assert(p_manager != 00);
 
-	/* JPEG2000 codec validation */
+    OPJ_UNUSED(p_manager);
 
-	/* STATE checking */
-	/* make sure the state is at 0 */
-	l_is_valid &= (jp2->jp2_state == JP2_STATE_NONE);
+    /* JPEG2000 codec validation */
 
-	/* make sure not reading a jp2h ???? WEIRD */
-	l_is_valid &= (jp2->jp2_img_state == JP2_IMG_STATE_NONE);
+    /* STATE checking */
+    /* make sure the state is at 0 */
+    l_is_valid &= (jp2->jp2_state == JP2_STATE_NONE);
 
-	/* POINTER validation */
-	/* make sure a j2k codec is present */
-	l_is_valid &= (jp2->j2k != 00);
+    /* make sure not reading a jp2h ???? WEIRD */
+    l_is_valid &= (jp2->jp2_img_state == JP2_IMG_STATE_NONE);
 
-	/* make sure a procedure list is present */
-	l_is_valid &= (jp2->m_procedure_list != 00);
+    /* POINTER validation */
+    /* make sure a j2k codec is present */
+    l_is_valid &= (jp2->j2k != 00);
 
-	/* make sure a validation list is present */
-	l_is_valid &= (jp2->m_validation_list != 00);
+    /* make sure a procedure list is present */
+    l_is_valid &= (jp2->m_procedure_list != 00);
 
-	/* PARAMETER VALIDATION */
-	/* number of components */
-	l_is_valid &= (jp2->numcl > 0);
-	/* width */
-	l_is_valid &= (jp2->h > 0);
-	/* height */
-	l_is_valid &= (jp2->w > 0);
-	/* precision */
-	for (i = 0; i < jp2->numcomps; ++i)	{
-		l_is_valid &= ((jp2->comps[i].bpcc & 0x7FU) < 38U); /* 0 is valid, ignore sign for check */
-	}
+    /* make sure a validation list is present */
+    l_is_valid &= (jp2->m_validation_list != 00);
 
-	/* METH */
-	l_is_valid &= ((jp2->meth > 0) && (jp2->meth < 3));
+    /* PARAMETER VALIDATION */
+    /* number of components */
+    l_is_valid &= (jp2->numcl > 0);
+    /* width */
+    l_is_valid &= (jp2->h > 0);
+    /* height */
+    l_is_valid &= (jp2->w > 0);
+    /* precision */
+    for (i = 0; i < jp2->numcomps; ++i) {
+        l_is_valid &= ((jp2->comps[i].bpcc & 0x7FU) <
+                       38U); /* 0 is valid, ignore sign for check */
+    }
 
-	/* stream validation */
-	/* back and forth is needed */
-	l_is_valid &= opj_stream_has_seek(cio);
+    /* METH */
+    l_is_valid &= ((jp2->meth > 0) && (jp2->meth < 3));
 
-	return l_is_valid;
+    /* stream validation */
+    /* back and forth is needed */
+    l_is_valid &= opj_stream_has_seek(cio);
+
+    return l_is_valid;
 }
 
-static OPJ_BOOL opj_jp2_read_header_procedure(  opj_jp2_t *jp2,
-                                                opj_stream_private_t *stream,
-                                                opj_event_mgr_t * p_manager
-                                                )
+static OPJ_BOOL opj_jp2_read_header_procedure(opj_jp2_t *jp2,
+        opj_stream_private_t *stream,
+        opj_event_mgr_t * p_manager
+                                             )
 {
-	opj_jp2_box_t box;
-	OPJ_UINT32 l_nb_bytes_read;
-	const opj_jp2_header_handler_t * l_current_handler;
-	const opj_jp2_header_handler_t * l_current_handler_misplaced;
-	OPJ_UINT32 l_last_data_size = OPJ_BOX_SIZE;
-	OPJ_UINT32 l_current_data_size;
-	OPJ_BYTE * l_current_data = 00;
+    opj_jp2_box_t box;
+    OPJ_UINT32 l_nb_bytes_read;
+    const opj_jp2_header_handler_t * l_current_handler;
+    const opj_jp2_header_handler_t * l_current_handler_misplaced;
+    OPJ_UINT32 l_last_data_size = OPJ_BOX_SIZE;
+    OPJ_UINT32 l_current_data_size;
+    OPJ_BYTE * l_current_data = 00;
 
-	/* preconditions */
-	assert(stream != 00);
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(stream != 00);
+    assert(jp2 != 00);
+    assert(p_manager != 00);
 
-	l_current_data = (OPJ_BYTE*)opj_calloc(1,l_last_data_size);
+    l_current_data = (OPJ_BYTE*)opj_calloc(1, l_last_data_size);
 
-	if (l_current_data == 00) {
-		opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle jpeg2000 file header\n");
-		return OPJ_FALSE;
-	}
+    if (l_current_data == 00) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Not enough memory to handle jpeg2000 file header\n");
+        return OPJ_FALSE;
+    }
 
-	while (opj_jp2_read_boxhdr(&box,&l_nb_bytes_read,stream,p_manager)) {
-		/* is it the codestream box ? */
-		if (box.type == JP2_JP2C) {
-			if (jp2->jp2_state & JP2_STATE_HEADER) {
-				jp2->jp2_state |= JP2_STATE_CODESTREAM;
-                                opj_free(l_current_data);
-				return OPJ_TRUE;
-			}
-			else {
-				opj_event_msg(p_manager, EVT_ERROR, "bad placed jpeg codestream\n");
-				opj_free(l_current_data);
-				return OPJ_FALSE;
-			}
-		}
-		else if	(box.length == 0) {
-			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
-			opj_free(l_current_data);
-			return OPJ_FALSE;
-		}
-		/* testcase 1851.pdf.SIGSEGV.ce9.948 */
+    while (opj_jp2_read_boxhdr(&box, &l_nb_bytes_read, stream, p_manager)) {
+        /* is it the codestream box ? */
+        if (box.type == JP2_JP2C) {
+            if (jp2->jp2_state & JP2_STATE_HEADER) {
+                jp2->jp2_state |= JP2_STATE_CODESTREAM;
+                opj_free(l_current_data);
+                return OPJ_TRUE;
+            } else {
+                opj_event_msg(p_manager, EVT_ERROR, "bad placed jpeg codestream\n");
+                opj_free(l_current_data);
+                return OPJ_FALSE;
+            }
+        } else if (box.length == 0) {
+            opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
+            opj_free(l_current_data);
+            return OPJ_FALSE;
+        }
+        /* testcase 1851.pdf.SIGSEGV.ce9.948 */
         else if (box.length < l_nb_bytes_read) {
-			opj_event_msg(p_manager, EVT_ERROR, "invalid box size %d (%x)\n", box.length, box.type);
-			opj_free(l_current_data);
-			return OPJ_FALSE;
-		}
+            opj_event_msg(p_manager, EVT_ERROR, "invalid box size %d (%x)\n", box.length,
+                          box.type);
+            opj_free(l_current_data);
+            return OPJ_FALSE;
+        }
 
-		l_current_handler = opj_jp2_find_handler(box.type);
-		l_current_handler_misplaced = opj_jp2_img_find_handler(box.type);
-		l_current_data_size = box.length - l_nb_bytes_read;
+        l_current_handler = opj_jp2_find_handler(box.type);
+        l_current_handler_misplaced = opj_jp2_img_find_handler(box.type);
+        l_current_data_size = box.length - l_nb_bytes_read;
 
-		if ((l_current_handler != 00) || (l_current_handler_misplaced != 00)) {
-			if (l_current_handler == 00) {
-				opj_event_msg(p_manager, EVT_WARNING, "Found a misplaced '%c%c%c%c' box outside jp2h box\n", (OPJ_BYTE)(box.type>>24), (OPJ_BYTE)(box.type>>16), (OPJ_BYTE)(box.type>>8), (OPJ_BYTE)(box.type>>0));
-				if (jp2->jp2_state & JP2_STATE_HEADER) {
-					/* read anyway, we already have jp2h */
-					l_current_handler = l_current_handler_misplaced;
-				} else {
-					opj_event_msg(p_manager, EVT_WARNING, "JPEG2000 Header box not read yet, '%c%c%c%c' box will be ignored\n", (OPJ_BYTE)(box.type>>24), (OPJ_BYTE)(box.type>>16), (OPJ_BYTE)(box.type>>8), (OPJ_BYTE)(box.type>>0));
-					jp2->jp2_state |= JP2_STATE_UNKNOWN;
-					if (opj_stream_skip(stream,l_current_data_size,p_manager) != l_current_data_size) {
-							opj_event_msg(p_manager, EVT_ERROR, "Problem with skipping JPEG2000 box, stream error\n");
-							opj_free(l_current_data);
-							return OPJ_FALSE;
-					}
-					continue;
-				}
-			}
-			if ((OPJ_OFF_T)l_current_data_size > opj_stream_get_number_byte_left(stream)) {
-				/* do not even try to malloc if we can't read */
-				opj_event_msg(p_manager, EVT_ERROR, "Invalid box size %d for box '%c%c%c%c'. Need %d bytes, %d bytes remaining \n", box.length, (OPJ_BYTE)(box.type>>24), (OPJ_BYTE)(box.type>>16), (OPJ_BYTE)(box.type>>8), (OPJ_BYTE)(box.type>>0), l_current_data_size, (OPJ_UINT32)opj_stream_get_number_byte_left(stream));
-				opj_free(l_current_data);
-				return OPJ_FALSE;
-			}
-			if (l_current_data_size > l_last_data_size) {
-				OPJ_BYTE* new_current_data = (OPJ_BYTE*)opj_realloc(l_current_data,l_current_data_size);
-				if (!new_current_data) {
-					opj_free(l_current_data);
-                    opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle jpeg2000 box\n");
-					return OPJ_FALSE;
-				}
+        if ((l_current_handler != 00) || (l_current_handler_misplaced != 00)) {
+            if (l_current_handler == 00) {
+                opj_event_msg(p_manager, EVT_WARNING,
+                              "Found a misplaced '%c%c%c%c' box outside jp2h box\n",
+                              (OPJ_BYTE)(box.type >> 24), (OPJ_BYTE)(box.type >> 16),
+                              (OPJ_BYTE)(box.type >> 8), (OPJ_BYTE)(box.type >> 0));
+                if (jp2->jp2_state & JP2_STATE_HEADER) {
+                    /* read anyway, we already have jp2h */
+                    l_current_handler = l_current_handler_misplaced;
+                } else {
+                    opj_event_msg(p_manager, EVT_WARNING,
+                                  "JPEG2000 Header box not read yet, '%c%c%c%c' box will be ignored\n",
+                                  (OPJ_BYTE)(box.type >> 24), (OPJ_BYTE)(box.type >> 16),
+                                  (OPJ_BYTE)(box.type >> 8), (OPJ_BYTE)(box.type >> 0));
+                    jp2->jp2_state |= JP2_STATE_UNKNOWN;
+                    if (opj_stream_skip(stream, l_current_data_size,
+                                        p_manager) != l_current_data_size) {
+                        opj_event_msg(p_manager, EVT_ERROR,
+                                      "Problem with skipping JPEG2000 box, stream error\n");
+                        opj_free(l_current_data);
+                        return OPJ_FALSE;
+                    }
+                    continue;
+                }
+            }
+            if ((OPJ_OFF_T)l_current_data_size > opj_stream_get_number_byte_left(stream)) {
+                /* do not even try to malloc if we can't read */
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Invalid box size %d for box '%c%c%c%c'. Need %d bytes, %d bytes remaining \n",
+                              box.length, (OPJ_BYTE)(box.type >> 24), (OPJ_BYTE)(box.type >> 16),
+                              (OPJ_BYTE)(box.type >> 8), (OPJ_BYTE)(box.type >> 0), l_current_data_size,
+                              (OPJ_UINT32)opj_stream_get_number_byte_left(stream));
+                opj_free(l_current_data);
+                return OPJ_FALSE;
+            }
+            if (l_current_data_size > l_last_data_size) {
+                OPJ_BYTE* new_current_data = (OPJ_BYTE*)opj_realloc(l_current_data,
+                                             l_current_data_size);
+                if (!new_current_data) {
+                    opj_free(l_current_data);
+                    opj_event_msg(p_manager, EVT_ERROR,
+                                  "Not enough memory to handle jpeg2000 box\n");
+                    return OPJ_FALSE;
+                }
                 l_current_data = new_current_data;
-				l_last_data_size = l_current_data_size;
-			}
+                l_last_data_size = l_current_data_size;
+            }
 
-			l_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(stream,l_current_data,l_current_data_size,p_manager);
-			if (l_nb_bytes_read != l_current_data_size) {
-				opj_event_msg(p_manager, EVT_ERROR, "Problem with reading JPEG2000 box, stream error\n");
-                opj_free(l_current_data);                
-				return OPJ_FALSE;
-			}
+            l_nb_bytes_read = (OPJ_UINT32)opj_stream_read_data(stream, l_current_data,
+                              l_current_data_size, p_manager);
+            if (l_nb_bytes_read != l_current_data_size) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Problem with reading JPEG2000 box, stream error\n");
+                opj_free(l_current_data);
+                return OPJ_FALSE;
+            }
 
-			if (! l_current_handler->handler(jp2,l_current_data,l_current_data_size,p_manager)) {
-				opj_free(l_current_data);
-				return OPJ_FALSE;
-			}
-		}
-		else {
+            if (! l_current_handler->handler(jp2, l_current_data, l_current_data_size,
+                                             p_manager)) {
+                opj_free(l_current_data);
+                return OPJ_FALSE;
+            }
+        } else {
             if (!(jp2->jp2_state & JP2_STATE_SIGNATURE)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Malformed JP2 file format: first box must be JPEG 2000 signature box\n");
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Malformed JP2 file format: first box must be JPEG 2000 signature box\n");
                 opj_free(l_current_data);
                 return OPJ_FALSE;
             }
             if (!(jp2->jp2_state & JP2_STATE_FILE_TYPE)) {
-                opj_event_msg(p_manager, EVT_ERROR, "Malformed JP2 file format: second box must be file type box\n");
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Malformed JP2 file format: second box must be file type box\n");
                 opj_free(l_current_data);
                 return OPJ_FALSE;
             }
-			jp2->jp2_state |= JP2_STATE_UNKNOWN;
-			if (opj_stream_skip(stream,l_current_data_size,p_manager) != l_current_data_size) {
-				opj_event_msg(p_manager, EVT_ERROR, "Problem with skipping JPEG2000 box, stream error\n");
-				opj_free(l_current_data);
-				return OPJ_FALSE;
-			}
-		}
-	}
+            jp2->jp2_state |= JP2_STATE_UNKNOWN;
+            if (opj_stream_skip(stream, l_current_data_size,
+                                p_manager) != l_current_data_size) {
+                if (jp2->jp2_state & JP2_STATE_CODESTREAM) {
+                    /* If we already read the codestream, do not error out */
+                    /* Needed for data/input/nonregression/issue254.jp2 */
+                    opj_event_msg(p_manager, EVT_WARNING,
+                                  "Problem with skipping JPEG2000 box, stream error\n");
+                    opj_free(l_current_data);
+                    return OPJ_TRUE;
+                } else {
+                    opj_event_msg(p_manager, EVT_ERROR,
+                                  "Problem with skipping JPEG2000 box, stream error\n");
+                    opj_free(l_current_data);
+                    return OPJ_FALSE;
+                }
+            }
+        }
+    }
 
-	opj_free(l_current_data);
+    opj_free(l_current_data);
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /**
- * Excutes the given procedures on the given codec.
+ * Executes the given procedures on the given codec.
  *
- * @param	p_procedure_list	the list of procedures to execute
- * @param	jp2					the jpeg2000 file codec to execute the procedures on.
- * @param	stream					the stream to execute the procedures on.
- * @param	p_manager			the user manager.
+ * @param   p_procedure_list    the list of procedures to execute
+ * @param   jp2                 the jpeg2000 file codec to execute the procedures on.
+ * @param   stream                  the stream to execute the procedures on.
+ * @param   p_manager           the user manager.
  *
- * @return	true				if all the procedures were successfully executed.
+ * @return  true                if all the procedures were successfully executed.
  */
-static OPJ_BOOL opj_jp2_exec (  opj_jp2_t * jp2,
-                                opj_procedure_list_t * p_procedure_list,
-                                opj_stream_private_t *stream,
-                                opj_event_mgr_t * p_manager
-                                )
+static OPJ_BOOL opj_jp2_exec(opj_jp2_t * jp2,
+                             opj_procedure_list_t * p_procedure_list,
+                             opj_stream_private_t *stream,
+                             opj_event_mgr_t * p_manager
+                            )
 
 {
-	OPJ_BOOL (** l_procedure) (opj_jp2_t * jp2, opj_stream_private_t *, opj_event_mgr_t *) = 00;
-	OPJ_BOOL l_result = OPJ_TRUE;
-	OPJ_UINT32 l_nb_proc, i;
+    OPJ_BOOL(** l_procedure)(opj_jp2_t * jp2, opj_stream_private_t *,
+                             opj_event_mgr_t *) = 00;
+    OPJ_BOOL l_result = OPJ_TRUE;
+    OPJ_UINT32 l_nb_proc, i;
 
-	/* preconditions */
-	assert(p_procedure_list != 00);
-	assert(jp2 != 00);
-	assert(stream != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(p_procedure_list != 00);
+    assert(jp2 != 00);
+    assert(stream != 00);
+    assert(p_manager != 00);
 
-	l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
-	l_procedure = (OPJ_BOOL (**) (opj_jp2_t * jp2, opj_stream_private_t *, opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
+    l_nb_proc = opj_procedure_list_get_nb_procedures(p_procedure_list);
+    l_procedure = (OPJ_BOOL(**)(opj_jp2_t * jp2, opj_stream_private_t *,
+                                opj_event_mgr_t *)) opj_procedure_list_get_first_procedure(p_procedure_list);
 
-	for	(i=0;i<l_nb_proc;++i) {
-		l_result = l_result && (*l_procedure) (jp2,stream,p_manager);
-		++l_procedure;
-	}
+    for (i = 0; i < l_nb_proc; ++i) {
+        l_result = l_result && (*l_procedure)(jp2, stream, p_manager);
+        ++l_procedure;
+    }
 
-	/* and clear the procedure list at the end. */
-	opj_procedure_list_clear(p_procedure_list);
-	return l_result;
+    /* and clear the procedure list at the end. */
+    opj_procedure_list_clear(p_procedure_list);
+    return l_result;
 }
 
 OPJ_BOOL opj_jp2_start_compress(opj_jp2_t *jp2,
                                 opj_stream_private_t *stream,
                                 opj_image_t * p_image,
                                 opj_event_mgr_t * p_manager
-                                )
+                               )
 {
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(stream != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(stream != 00);
+    assert(p_manager != 00);
 
-	/* customization of the validation */
-	if (! opj_jp2_setup_encoding_validation (jp2, p_manager)) {
-		return OPJ_FALSE;
-	}
+    /* customization of the validation */
+    if (! opj_jp2_setup_encoding_validation(jp2, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-	/* validation of the parameters codec */
-	if (! opj_jp2_exec(jp2,jp2->m_validation_list,stream,p_manager)) {
-		return OPJ_FALSE;
-	}
+    /* validation of the parameters codec */
+    if (! opj_jp2_exec(jp2, jp2->m_validation_list, stream, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-	/* customization of the encoding */
-	if (! opj_jp2_setup_header_writing(jp2, p_manager)) {
-		return OPJ_FALSE;
-	}
+    /* customization of the encoding */
+    if (! opj_jp2_setup_header_writing(jp2, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-	/* write header */
-	if (! opj_jp2_exec (jp2,jp2->m_procedure_list,stream,p_manager)) {
-		return OPJ_FALSE;
-	}
+    /* write header */
+    if (! opj_jp2_exec(jp2, jp2->m_procedure_list, stream, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-	return opj_j2k_start_compress(jp2->j2k,stream,p_image,p_manager);
+    return opj_j2k_start_compress(jp2->j2k, stream, p_image, p_manager);
 }
 
-static const opj_jp2_header_handler_t * opj_jp2_find_handler (OPJ_UINT32 p_id)
+static const opj_jp2_header_handler_t * opj_jp2_find_handler(OPJ_UINT32 p_id)
 {
-	OPJ_UINT32 i, l_handler_size = sizeof(jp2_header) / sizeof(opj_jp2_header_handler_t);
+    OPJ_UINT32 i, l_handler_size = sizeof(jp2_header) / sizeof(
+                                       opj_jp2_header_handler_t);
 
-	for (i=0;i<l_handler_size;++i) {
-		if (jp2_header[i].id == p_id) {
-			return &jp2_header[i];
-		}
-	}
-	return NULL;
+    for (i = 0; i < l_handler_size; ++i) {
+        if (jp2_header[i].id == p_id) {
+            return &jp2_header[i];
+        }
+    }
+    return NULL;
 }
 
 /**
  * Finds the image execution function related to the given box id.
  *
- * @param	p_id	the id of the handler to fetch.
+ * @param   p_id    the id of the handler to fetch.
  *
- * @return	the given handler or 00 if it could not be found.
+ * @return  the given handler or 00 if it could not be found.
  */
-static const opj_jp2_header_handler_t * opj_jp2_img_find_handler (OPJ_UINT32 p_id)
+static const opj_jp2_header_handler_t * opj_jp2_img_find_handler(
+    OPJ_UINT32 p_id)
 {
-	OPJ_UINT32 i, l_handler_size = sizeof(jp2_img_header) / sizeof(opj_jp2_header_handler_t);
-	for (i=0;i<l_handler_size;++i)
-	{
-		if (jp2_img_header[i].id == p_id) {
-			return &jp2_img_header[i];
-		}
-	}
+    OPJ_UINT32 i, l_handler_size = sizeof(jp2_img_header) / sizeof(
+                                       opj_jp2_header_handler_t);
+    for (i = 0; i < l_handler_size; ++i) {
+        if (jp2_img_header[i].id == p_id) {
+            return &jp2_img_header[i];
+        }
+    }
 
-	return NULL;
+    return NULL;
 }
 
 /**
  * Reads a jpeg2000 file signature box.
  *
- * @param	p_header_data	the data contained in the signature box.
- * @param	jp2				the jpeg2000 file codec.
- * @param	p_header_size	the size of the data contained in the signature box.
- * @param	p_manager		the user event manager.
+ * @param   p_header_data   the data contained in the signature box.
+ * @param   jp2             the jpeg2000 file codec.
+ * @param   p_header_size   the size of the data contained in the signature box.
+ * @param   p_manager       the user event manager.
  *
  * @return true if the file signature box is valid.
  */
@@ -2347,578 +2538,619 @@
                                 OPJ_BYTE * p_header_data,
                                 OPJ_UINT32 p_header_size,
                                 opj_event_mgr_t * p_manager
-                                )
+                               )
 
 {
-	OPJ_UINT32 l_magic_number;
+    OPJ_UINT32 l_magic_number;
 
-	/* preconditions */
-	assert(p_header_data != 00);
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(jp2 != 00);
+    assert(p_manager != 00);
 
-	if (jp2->jp2_state != JP2_STATE_NONE) {
-		opj_event_msg(p_manager, EVT_ERROR, "The signature box must be the first box in the file.\n");
-		return OPJ_FALSE;
-	}
+    if (jp2->jp2_state != JP2_STATE_NONE) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "The signature box must be the first box in the file.\n");
+        return OPJ_FALSE;
+    }
 
-	/* assure length of data is correct (4 -> magic number) */
-	if (p_header_size != 4) {
-		opj_event_msg(p_manager, EVT_ERROR, "Error with JP signature Box size\n");
-		return OPJ_FALSE;
-	}
+    /* assure length of data is correct (4 -> magic number) */
+    if (p_header_size != 4) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error with JP signature Box size\n");
+        return OPJ_FALSE;
+    }
 
-	/* rearrange data */
-	opj_read_bytes(p_header_data,&l_magic_number,4);
-	if (l_magic_number != 0x0d0a870a ) {
-		opj_event_msg(p_manager, EVT_ERROR, "Error with JP Signature : bad magic number\n");
-		return OPJ_FALSE;
-	}
+    /* rearrange data */
+    opj_read_bytes(p_header_data, &l_magic_number, 4);
+    if (l_magic_number != 0x0d0a870a) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Error with JP Signature : bad magic number\n");
+        return OPJ_FALSE;
+    }
 
-	jp2->jp2_state |= JP2_STATE_SIGNATURE;
+    jp2->jp2_state |= JP2_STATE_SIGNATURE;
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /**
  * Reads a a FTYP box - File type box
  *
- * @param	p_header_data	the data contained in the FTYP box.
- * @param	jp2				the jpeg2000 file codec.
- * @param	p_header_size	the size of the data contained in the FTYP box.
- * @param	p_manager		the user event manager.
+ * @param   p_header_data   the data contained in the FTYP box.
+ * @param   jp2             the jpeg2000 file codec.
+ * @param   p_header_size   the size of the data contained in the FTYP box.
+ * @param   p_manager       the user event manager.
  *
  * @return true if the FTYP box is valid.
  */
-static OPJ_BOOL opj_jp2_read_ftyp(	opj_jp2_t *jp2,
-									OPJ_BYTE * p_header_data,
-									OPJ_UINT32 p_header_size,
-									opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_jp2_read_ftyp(opj_jp2_t *jp2,
+                                  OPJ_BYTE * p_header_data,
+                                  OPJ_UINT32 p_header_size,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-	OPJ_UINT32 i, l_remaining_bytes;
+    OPJ_UINT32 i, l_remaining_bytes;
 
-	/* preconditions */
-	assert(p_header_data != 00);
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(jp2 != 00);
+    assert(p_manager != 00);
 
-	if (jp2->jp2_state != JP2_STATE_SIGNATURE) {
-		opj_event_msg(p_manager, EVT_ERROR, "The ftyp box must be the second box in the file.\n");
-		return OPJ_FALSE;
-	}
+    if (jp2->jp2_state != JP2_STATE_SIGNATURE) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "The ftyp box must be the second box in the file.\n");
+        return OPJ_FALSE;
+    }
 
-	/* assure length of data is correct */
-	if (p_header_size < 8) {
-		opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
-		return OPJ_FALSE;
-	}
+    /* assure length of data is correct */
+    if (p_header_size < 8) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
+        return OPJ_FALSE;
+    }
 
-	opj_read_bytes(p_header_data,&jp2->brand,4);		/* BR */
-	p_header_data += 4;
+    opj_read_bytes(p_header_data, &jp2->brand, 4);      /* BR */
+    p_header_data += 4;
 
-	opj_read_bytes(p_header_data,&jp2->minversion,4);		/* MinV */
-	p_header_data += 4;
+    opj_read_bytes(p_header_data, &jp2->minversion, 4);     /* MinV */
+    p_header_data += 4;
 
-	l_remaining_bytes = p_header_size - 8;
+    l_remaining_bytes = p_header_size - 8;
 
-	/* the number of remaining bytes should be a multiple of 4 */
-	if ((l_remaining_bytes & 0x3) != 0) {
-		opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
-		return OPJ_FALSE;
-	}
+    /* the number of remaining bytes should be a multiple of 4 */
+    if ((l_remaining_bytes & 0x3) != 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature Box size\n");
+        return OPJ_FALSE;
+    }
 
-	/* div by 4 */
-	jp2->numcl = l_remaining_bytes >> 2;
-	if (jp2->numcl) {
-		jp2->cl = (OPJ_UINT32 *) opj_calloc(jp2->numcl, sizeof(OPJ_UINT32));
-		if (jp2->cl == 00) {
-			opj_event_msg(p_manager, EVT_ERROR, "Not enough memory with FTYP Box\n");
-			return OPJ_FALSE;
-		}
-	}
+    /* div by 4 */
+    jp2->numcl = l_remaining_bytes >> 2;
+    if (jp2->numcl) {
+        jp2->cl = (OPJ_UINT32 *) opj_calloc(jp2->numcl, sizeof(OPJ_UINT32));
+        if (jp2->cl == 00) {
+            opj_event_msg(p_manager, EVT_ERROR, "Not enough memory with FTYP Box\n");
+            return OPJ_FALSE;
+        }
+    }
 
-	for (i = 0; i < jp2->numcl; ++i)
-	{
-		opj_read_bytes(p_header_data,&jp2->cl[i],4);		/* CLi */
-		p_header_data += 4;
-	}
+    for (i = 0; i < jp2->numcl; ++i) {
+        opj_read_bytes(p_header_data, &jp2->cl[i], 4);      /* CLi */
+        p_header_data += 4;
+    }
 
-	jp2->jp2_state |= JP2_STATE_FILE_TYPE;
+    jp2->jp2_state |= JP2_STATE_FILE_TYPE;
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_jp2_skip_jp2c(	opj_jp2_t *jp2,
-					    	opj_stream_private_t *stream,
-					    	opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_jp2_skip_jp2c(opj_jp2_t *jp2,
+                                  opj_stream_private_t *stream,
+                                  opj_event_mgr_t * p_manager)
 {
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(stream != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(stream != 00);
+    assert(p_manager != 00);
 
-	jp2->j2k_codestream_offset = opj_stream_tell(stream);
+    jp2->j2k_codestream_offset = opj_stream_tell(stream);
 
-	if (opj_stream_skip(stream,8,p_manager) != 8) {
-		return OPJ_FALSE;
-	}
+    if (opj_stream_skip(stream, 8, p_manager) != 8) {
+        return OPJ_FALSE;
+    }
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_jpip_skip_iptr(	opj_jp2_t *jp2,
-  opj_stream_private_t *stream,
-  opj_event_mgr_t * p_manager )
+static OPJ_BOOL opj_jpip_skip_iptr(opj_jp2_t *jp2,
+                                   opj_stream_private_t *stream,
+                                   opj_event_mgr_t * p_manager)
 {
-  /* preconditions */
-  assert(jp2 != 00);
-  assert(stream != 00);
-  assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(stream != 00);
+    assert(p_manager != 00);
 
-  jp2->jpip_iptr_offset = opj_stream_tell(stream);
+    jp2->jpip_iptr_offset = opj_stream_tell(stream);
 
-  if (opj_stream_skip(stream,24,p_manager) != 24) {
-    return OPJ_FALSE;
-  }
+    if (opj_stream_skip(stream, 24, p_manager) != 24) {
+        return OPJ_FALSE;
+    }
 
-  return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /**
  * Reads the Jpeg2000 file Header box - JP2 Header box (warning, this is a super box).
  *
- * @param	p_header_data	the data contained in the file header box.
- * @param	jp2				the jpeg2000 file codec.
- * @param	p_header_size	the size of the data contained in the file header box.
- * @param	p_manager		the user event manager.
+ * @param   p_header_data   the data contained in the file header box.
+ * @param   jp2             the jpeg2000 file codec.
+ * @param   p_header_size   the size of the data contained in the file header box.
+ * @param   p_manager       the user event manager.
  *
  * @return true if the JP2 Header box was successfully recognized.
 */
-static OPJ_BOOL opj_jp2_read_jp2h(  opj_jp2_t *jp2,
-                                    OPJ_BYTE *p_header_data,
-                                    OPJ_UINT32 p_header_size,
-                                    opj_event_mgr_t * p_manager
-                                    )
+static OPJ_BOOL opj_jp2_read_jp2h(opj_jp2_t *jp2,
+                                  OPJ_BYTE *p_header_data,
+                                  OPJ_UINT32 p_header_size,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-	OPJ_UINT32 l_box_size=0, l_current_data_size = 0;
-	opj_jp2_box_t box;
-	const opj_jp2_header_handler_t * l_current_handler;
-	OPJ_BOOL l_has_ihdr = 0;
+    OPJ_UINT32 l_box_size = 0, l_current_data_size = 0;
+    opj_jp2_box_t box;
+    const opj_jp2_header_handler_t * l_current_handler;
+    OPJ_BOOL l_has_ihdr = 0;
 
-	/* preconditions */
-	assert(p_header_data != 00);
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(p_header_data != 00);
+    assert(jp2 != 00);
+    assert(p_manager != 00);
 
-	/* make sure the box is well placed */
-	if ((jp2->jp2_state & JP2_STATE_FILE_TYPE) != JP2_STATE_FILE_TYPE ) {
-		opj_event_msg(p_manager, EVT_ERROR, "The  box must be the first box in the file.\n");
-		return OPJ_FALSE;
-	}
+    /* make sure the box is well placed */
+    if ((jp2->jp2_state & JP2_STATE_FILE_TYPE) != JP2_STATE_FILE_TYPE) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "The  box must be the first box in the file.\n");
+        return OPJ_FALSE;
+    }
 
-	jp2->jp2_img_state = JP2_IMG_STATE_NONE;
+    jp2->jp2_img_state = JP2_IMG_STATE_NONE;
 
-	/* iterate while remaining data */
-	while (p_header_size > 0) {
+    /* iterate while remaining data */
+    while (p_header_size > 0) {
 
-		if (! opj_jp2_read_boxhdr_char(&box,p_header_data,&l_box_size,p_header_size, p_manager)) {
-			opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box\n");
-			return OPJ_FALSE;
-		}
+        if (! opj_jp2_read_boxhdr_char(&box, p_header_data, &l_box_size, p_header_size,
+                                       p_manager)) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Stream error while reading JP2 Header box\n");
+            return OPJ_FALSE;
+        }
 
-		if (box.length > p_header_size) {
-			opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box: box length is inconsistent.\n");
-			return OPJ_FALSE;
-		}
+        if (box.length > p_header_size) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Stream error while reading JP2 Header box: box length is inconsistent.\n");
+            return OPJ_FALSE;
+        }
 
-		l_current_handler = opj_jp2_img_find_handler(box.type);
-		l_current_data_size = box.length - l_box_size;
-		p_header_data += l_box_size;
+        l_current_handler = opj_jp2_img_find_handler(box.type);
+        l_current_data_size = box.length - l_box_size;
+        p_header_data += l_box_size;
 
-		if (l_current_handler != 00) {
-			if (! l_current_handler->handler(jp2,p_header_data,l_current_data_size,p_manager)) {
-				return OPJ_FALSE;
-			}
-		}
-		else {
-			jp2->jp2_img_state |= JP2_IMG_STATE_UNKNOWN;
-		}
+        if (l_current_handler != 00) {
+            if (! l_current_handler->handler(jp2, p_header_data, l_current_data_size,
+                                             p_manager)) {
+                return OPJ_FALSE;
+            }
+        } else {
+            jp2->jp2_img_state |= JP2_IMG_STATE_UNKNOWN;
+        }
 
-		if (box.type == JP2_IHDR) {
-			l_has_ihdr = 1;
-		}
+        if (box.type == JP2_IHDR) {
+            l_has_ihdr = 1;
+        }
 
-		p_header_data += l_current_data_size;
-		p_header_size -= box.length;
-	}
+        p_header_data += l_current_data_size;
+        p_header_size -= box.length;
+    }
 
-	if (l_has_ihdr == 0) {
-		opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box: no 'ihdr' box.\n");
-		return OPJ_FALSE;
-	}
+    if (l_has_ihdr == 0) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Stream error while reading JP2 Header box: no 'ihdr' box.\n");
+        return OPJ_FALSE;
+    }
 
-	jp2->jp2_state |= JP2_STATE_HEADER;
+    jp2->jp2_state |= JP2_STATE_HEADER;
+    jp2->has_jp2h = 1;
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_jp2_read_boxhdr_char(   opj_jp2_box_t *box,
-                                     OPJ_BYTE * p_data,
-                                     OPJ_UINT32 * p_number_bytes_read,
-                                     OPJ_UINT32 p_box_max_size,
-                                     opj_event_mgr_t * p_manager
-                                     )
+static OPJ_BOOL opj_jp2_read_boxhdr_char(opj_jp2_box_t *box,
+        OPJ_BYTE * p_data,
+        OPJ_UINT32 * p_number_bytes_read,
+        OPJ_UINT32 p_box_max_size,
+        opj_event_mgr_t * p_manager
+                                        )
 {
-	OPJ_UINT32 l_value;
+    OPJ_UINT32 l_value;
 
-	/* preconditions */
-	assert(p_data != 00);
-	assert(box != 00);
-	assert(p_number_bytes_read != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(p_data != 00);
+    assert(box != 00);
+    assert(p_number_bytes_read != 00);
+    assert(p_manager != 00);
 
-	if (p_box_max_size < 8) {
-		opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of less than 8 bytes\n");
-		return OPJ_FALSE;
-	}
+    if (p_box_max_size < 8) {
+        opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of less than 8 bytes\n");
+        return OPJ_FALSE;
+    }
 
-	/* process read data */
-	opj_read_bytes(p_data, &l_value, 4);
-	p_data += 4;
-	box->length = (OPJ_UINT32)(l_value);
+    /* process read data */
+    opj_read_bytes(p_data, &l_value, 4);
+    p_data += 4;
+    box->length = (OPJ_UINT32)(l_value);
 
-	opj_read_bytes(p_data, &l_value, 4);
-	p_data += 4;
-	box->type = (OPJ_UINT32)(l_value);
+    opj_read_bytes(p_data, &l_value, 4);
+    p_data += 4;
+    box->type = (OPJ_UINT32)(l_value);
 
-	*p_number_bytes_read = 8;
+    *p_number_bytes_read = 8;
 
-	/* do we have a "special very large box ?" */
-	/* read then the XLBox */
-	if (box->length == 1) {
-		OPJ_UINT32 l_xl_part_size;
+    /* do we have a "special very large box ?" */
+    /* read then the XLBox */
+    if (box->length == 1) {
+        OPJ_UINT32 l_xl_part_size;
 
-		if (p_box_max_size < 16) {
-			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle XL box of less than 16 bytes\n");
-			return OPJ_FALSE;
-		}
+        if (p_box_max_size < 16) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Cannot handle XL box of less than 16 bytes\n");
+            return OPJ_FALSE;
+        }
 
-		opj_read_bytes(p_data,&l_xl_part_size, 4);
-		p_data += 4;
-		*p_number_bytes_read += 4;
+        opj_read_bytes(p_data, &l_xl_part_size, 4);
+        p_data += 4;
+        *p_number_bytes_read += 4;
 
-		if (l_xl_part_size != 0) {
-			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
-			return OPJ_FALSE;
-		}
+        if (l_xl_part_size != 0) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Cannot handle box sizes higher than 2^32\n");
+            return OPJ_FALSE;
+        }
 
-		opj_read_bytes(p_data, &l_value, 4);
-		*p_number_bytes_read += 4;
-		box->length = (OPJ_UINT32)(l_value);
+        opj_read_bytes(p_data, &l_value, 4);
+        *p_number_bytes_read += 4;
+        box->length = (OPJ_UINT32)(l_value);
 
-		if (box->length == 0) {
-			opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
-			return OPJ_FALSE;
-		}
-	}
-	else if (box->length == 0) {
-		opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
-		return OPJ_FALSE;
-	}
-	if (box->length < *p_number_bytes_read) {
-		opj_event_msg(p_manager, EVT_ERROR, "Box length is inconsistent.\n");
-		return OPJ_FALSE;
-	}
-	return OPJ_TRUE;
+        if (box->length == 0) {
+            opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
+            return OPJ_FALSE;
+        }
+    } else if (box->length == 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box of undefined sizes\n");
+        return OPJ_FALSE;
+    }
+    if (box->length < *p_number_bytes_read) {
+        opj_event_msg(p_manager, EVT_ERROR, "Box length is inconsistent.\n");
+        return OPJ_FALSE;
+    }
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_jp2_read_header(	opj_stream_private_t *p_stream,
-                                opj_jp2_t *jp2,
-                                opj_image_t ** p_image,
-                                opj_event_mgr_t * p_manager
-                                )
+OPJ_BOOL opj_jp2_read_header(opj_stream_private_t *p_stream,
+                             opj_jp2_t *jp2,
+                             opj_image_t ** p_image,
+                             opj_event_mgr_t * p_manager
+                            )
 {
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_stream != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_stream != 00);
+    assert(p_manager != 00);
 
-	/* customization of the validation */
-	if (! opj_jp2_setup_decoding_validation (jp2, p_manager)) {
-		return OPJ_FALSE;
-	}
+    /* customization of the validation */
+    if (! opj_jp2_setup_decoding_validation(jp2, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-	/* customization of the encoding */
-	if (! opj_jp2_setup_header_reading(jp2, p_manager)) {
-		return OPJ_FALSE;
-	}
+    /* customization of the encoding */
+    if (! opj_jp2_setup_header_reading(jp2, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-	/* validation of the parameters codec */
-	if (! opj_jp2_exec(jp2,jp2->m_validation_list,p_stream,p_manager)) {
-		return OPJ_FALSE;
-	}
+    /* validation of the parameters codec */
+    if (! opj_jp2_exec(jp2, jp2->m_validation_list, p_stream, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-	/* read header */
-	if (! opj_jp2_exec (jp2,jp2->m_procedure_list,p_stream,p_manager)) {
-		return OPJ_FALSE;
-	}
+    /* read header */
+    if (! opj_jp2_exec(jp2, jp2->m_procedure_list, p_stream, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (jp2->has_jp2h == 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "JP2H box missing. Required.\n");
+        return OPJ_FALSE;
+    }
+    if (jp2->has_ihdr == 0) {
+        opj_event_msg(p_manager, EVT_ERROR, "IHDR box_missing. Required.\n");
+        return OPJ_FALSE;
+    }
 
-	return opj_j2k_read_header(	p_stream,
-							jp2->j2k,
-							p_image,
-							p_manager);
+    return opj_j2k_read_header(p_stream,
+                               jp2->j2k,
+                               p_image,
+                               p_manager);
 }
 
-static OPJ_BOOL opj_jp2_setup_encoding_validation (opj_jp2_t *jp2, opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_jp2_setup_encoding_validation(opj_jp2_t *jp2,
+        opj_event_mgr_t * p_manager)
 {
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_manager != 00);
 
-	if (! opj_procedure_list_add_procedure(jp2->m_validation_list, (opj_procedure)opj_jp2_default_validation, p_manager)) {
-		return OPJ_FALSE;
-	}
-	/* DEVELOPER CORNER, add your custom validation procedure */
-	
-	return OPJ_TRUE;
+    if (! opj_procedure_list_add_procedure(jp2->m_validation_list,
+                                           (opj_procedure)opj_jp2_default_validation, p_manager)) {
+        return OPJ_FALSE;
+    }
+    /* DEVELOPER CORNER, add your custom validation procedure */
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_jp2_setup_decoding_validation (opj_jp2_t *jp2, opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_jp2_setup_decoding_validation(opj_jp2_t *jp2,
+        opj_event_mgr_t * p_manager)
 {
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_manager != 00);
-	
-	/* DEVELOPER CORNER, add your custom validation procedure */
-	
-	return OPJ_TRUE;
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_manager != 00);
+
+    OPJ_UNUSED(jp2);
+    OPJ_UNUSED(p_manager);
+
+    /* DEVELOPER CORNER, add your custom validation procedure */
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_jp2_setup_header_writing (opj_jp2_t *jp2, opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_jp2_setup_header_writing(opj_jp2_t *jp2,
+        opj_event_mgr_t * p_manager)
 {
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_manager != 00);
 
-	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp, p_manager)) {
-		return OPJ_FALSE;
-	}
-	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_ftyp, p_manager)) {
-		return OPJ_FALSE;
-	}
-	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_write_jp2h, p_manager)) {
-		return OPJ_FALSE;
-	}
-	if( jp2->jpip_on ) {
-		if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jpip_skip_iptr, p_manager)) {
-			return OPJ_FALSE;
-		}
-	}
-	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_skip_jp2c,p_manager)) {
-		return OPJ_FALSE;
-	}
+    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
+                                           (opj_procedure)opj_jp2_write_jp, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
+                                           (opj_procedure)opj_jp2_write_ftyp, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
+                                           (opj_procedure)opj_jp2_write_jp2h, p_manager)) {
+        return OPJ_FALSE;
+    }
+    if (jp2->jpip_on) {
+        if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
+                                               (opj_procedure)opj_jpip_skip_iptr, p_manager)) {
+            return OPJ_FALSE;
+        }
+    }
+    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
+                                           (opj_procedure)opj_jp2_skip_jp2c, p_manager)) {
+        return OPJ_FALSE;
+    }
 
-	/* DEVELOPER CORNER, insert your custom procedures */
+    /* DEVELOPER CORNER, insert your custom procedures */
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_jp2_setup_header_reading (opj_jp2_t *jp2, opj_event_mgr_t * p_manager)
+static OPJ_BOOL opj_jp2_setup_header_reading(opj_jp2_t *jp2,
+        opj_event_mgr_t * p_manager)
 {
-	/* preconditions */
-	assert(jp2 != 00);
-	assert(p_manager != 00);
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(p_manager != 00);
 
-	if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,(opj_procedure)opj_jp2_read_header_procedure, p_manager)) {
-		return OPJ_FALSE;
-	}
-	
-	/* DEVELOPER CORNER, add your custom procedures */
-	
-	return OPJ_TRUE;
+    if (! opj_procedure_list_add_procedure(jp2->m_procedure_list,
+                                           (opj_procedure)opj_jp2_read_header_procedure, p_manager)) {
+        return OPJ_FALSE;
+    }
+
+    /* DEVELOPER CORNER, add your custom procedures */
+
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_jp2_read_tile_header ( opj_jp2_t * p_jp2,
-                                    OPJ_UINT32 * p_tile_index,
-                                    OPJ_UINT32 * p_data_size,
-                                    OPJ_INT32 * p_tile_x0,
-                                    OPJ_INT32 * p_tile_y0,
-                                    OPJ_INT32 * p_tile_x1,
-                                    OPJ_INT32 * p_tile_y1,
-                                    OPJ_UINT32 * p_nb_comps,
-                                    OPJ_BOOL * p_go_on,
-                                    opj_stream_private_t *p_stream,
-                                    opj_event_mgr_t * p_manager
-                                    )
+OPJ_BOOL opj_jp2_read_tile_header(opj_jp2_t * p_jp2,
+                                  OPJ_UINT32 * p_tile_index,
+                                  OPJ_UINT32 * p_data_size,
+                                  OPJ_INT32 * p_tile_x0,
+                                  OPJ_INT32 * p_tile_y0,
+                                  OPJ_INT32 * p_tile_x1,
+                                  OPJ_INT32 * p_tile_y1,
+                                  OPJ_UINT32 * p_nb_comps,
+                                  OPJ_BOOL * p_go_on,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager
+                                 )
 {
-	return opj_j2k_read_tile_header(p_jp2->j2k,
-								p_tile_index,
-								p_data_size,
-								p_tile_x0, p_tile_y0,
-								p_tile_x1, p_tile_y1,
-								p_nb_comps,
-								p_go_on,
-								p_stream,
-								p_manager);
+    return opj_j2k_read_tile_header(p_jp2->j2k,
+                                    p_tile_index,
+                                    p_data_size,
+                                    p_tile_x0, p_tile_y0,
+                                    p_tile_x1, p_tile_y1,
+                                    p_nb_comps,
+                                    p_go_on,
+                                    p_stream,
+                                    p_manager);
 }
 
-OPJ_BOOL opj_jp2_write_tile (	opj_jp2_t *p_jp2,
-					 	 	    OPJ_UINT32 p_tile_index,
-					 	 	    OPJ_BYTE * p_data,
-					 	 	    OPJ_UINT32 p_data_size,
-					 	 	    opj_stream_private_t *p_stream,
-					 	 	    opj_event_mgr_t * p_manager
-                                )
+OPJ_BOOL opj_jp2_write_tile(opj_jp2_t *p_jp2,
+                            OPJ_UINT32 p_tile_index,
+                            OPJ_BYTE * p_data,
+                            OPJ_UINT32 p_data_size,
+                            opj_stream_private_t *p_stream,
+                            opj_event_mgr_t * p_manager
+                           )
 
 {
-	return opj_j2k_write_tile (p_jp2->j2k,p_tile_index,p_data,p_data_size,p_stream,p_manager);
+    return opj_j2k_write_tile(p_jp2->j2k, p_tile_index, p_data, p_data_size,
+                              p_stream, p_manager);
 }
 
-OPJ_BOOL opj_jp2_decode_tile (  opj_jp2_t * p_jp2,
-                                OPJ_UINT32 p_tile_index,
-                                OPJ_BYTE * p_data,
-                                OPJ_UINT32 p_data_size,
-                                opj_stream_private_t *p_stream,
-                                opj_event_mgr_t * p_manager
-                                )
+OPJ_BOOL opj_jp2_decode_tile(opj_jp2_t * p_jp2,
+                             OPJ_UINT32 p_tile_index,
+                             OPJ_BYTE * p_data,
+                             OPJ_UINT32 p_data_size,
+                             opj_stream_private_t *p_stream,
+                             opj_event_mgr_t * p_manager
+                            )
 {
-	return opj_j2k_decode_tile (p_jp2->j2k,p_tile_index,p_data,p_data_size,p_stream,p_manager);
+    return opj_j2k_decode_tile(p_jp2->j2k, p_tile_index, p_data, p_data_size,
+                               p_stream, p_manager);
 }
 
 void opj_jp2_destroy(opj_jp2_t *jp2)
 {
-	if (jp2) {
-		/* destroy the J2K codec */
-		opj_j2k_destroy(jp2->j2k);
-		jp2->j2k = 00;
+    if (jp2) {
+        /* destroy the J2K codec */
+        opj_j2k_destroy(jp2->j2k);
+        jp2->j2k = 00;
 
-		if (jp2->comps) {
-			opj_free(jp2->comps);
-			jp2->comps = 00;
-		}
+        if (jp2->comps) {
+            opj_free(jp2->comps);
+            jp2->comps = 00;
+        }
 
-		if (jp2->cl) {
-			opj_free(jp2->cl);
-			jp2->cl = 00;
-		}
+        if (jp2->cl) {
+            opj_free(jp2->cl);
+            jp2->cl = 00;
+        }
 
-		if (jp2->color.icc_profile_buf) {
-			opj_free(jp2->color.icc_profile_buf);
-			jp2->color.icc_profile_buf = 00;
-		}
+        if (jp2->color.icc_profile_buf) {
+            opj_free(jp2->color.icc_profile_buf);
+            jp2->color.icc_profile_buf = 00;
+        }
 
-		if (jp2->color.jp2_cdef) {
-			if (jp2->color.jp2_cdef->info) {
-				opj_free(jp2->color.jp2_cdef->info);
-				jp2->color.jp2_cdef->info = NULL;
-			}
+        if (jp2->color.jp2_cdef) {
+            if (jp2->color.jp2_cdef->info) {
+                opj_free(jp2->color.jp2_cdef->info);
+                jp2->color.jp2_cdef->info = NULL;
+            }
 
-			opj_free(jp2->color.jp2_cdef);
-			jp2->color.jp2_cdef = 00;
-		}
+            opj_free(jp2->color.jp2_cdef);
+            jp2->color.jp2_cdef = 00;
+        }
 
-		if (jp2->color.jp2_pclr) {
-			if (jp2->color.jp2_pclr->cmap) {
-				opj_free(jp2->color.jp2_pclr->cmap);
-				jp2->color.jp2_pclr->cmap = NULL;
-			}
-			if (jp2->color.jp2_pclr->channel_sign) {
-				opj_free(jp2->color.jp2_pclr->channel_sign);
-				jp2->color.jp2_pclr->channel_sign = NULL;
-			}
-			if (jp2->color.jp2_pclr->channel_size) {
-				opj_free(jp2->color.jp2_pclr->channel_size);
-				jp2->color.jp2_pclr->channel_size = NULL;
-			}
-			if (jp2->color.jp2_pclr->entries) {
-				opj_free(jp2->color.jp2_pclr->entries);
-				jp2->color.jp2_pclr->entries = NULL;
-			}
+        if (jp2->color.jp2_pclr) {
+            if (jp2->color.jp2_pclr->cmap) {
+                opj_free(jp2->color.jp2_pclr->cmap);
+                jp2->color.jp2_pclr->cmap = NULL;
+            }
+            if (jp2->color.jp2_pclr->channel_sign) {
+                opj_free(jp2->color.jp2_pclr->channel_sign);
+                jp2->color.jp2_pclr->channel_sign = NULL;
+            }
+            if (jp2->color.jp2_pclr->channel_size) {
+                opj_free(jp2->color.jp2_pclr->channel_size);
+                jp2->color.jp2_pclr->channel_size = NULL;
+            }
+            if (jp2->color.jp2_pclr->entries) {
+                opj_free(jp2->color.jp2_pclr->entries);
+                jp2->color.jp2_pclr->entries = NULL;
+            }
 
-			opj_free(jp2->color.jp2_pclr);
-			jp2->color.jp2_pclr = 00;
-		}
+            opj_free(jp2->color.jp2_pclr);
+            jp2->color.jp2_pclr = 00;
+        }
 
-		if (jp2->m_validation_list) {
-			opj_procedure_list_destroy(jp2->m_validation_list);
-			jp2->m_validation_list = 00;
-		}
+        if (jp2->m_validation_list) {
+            opj_procedure_list_destroy(jp2->m_validation_list);
+            jp2->m_validation_list = 00;
+        }
 
-		if (jp2->m_procedure_list) {
-			opj_procedure_list_destroy(jp2->m_procedure_list);
-			jp2->m_procedure_list = 00;
-		}
+        if (jp2->m_procedure_list) {
+            opj_procedure_list_destroy(jp2->m_procedure_list);
+            jp2->m_procedure_list = 00;
+        }
 
-		opj_free(jp2);
-	}
+        opj_free(jp2);
+    }
 }
 
-OPJ_BOOL opj_jp2_set_decode_area(	opj_jp2_t *p_jp2,
-								    opj_image_t* p_image,
-								    OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
-								    OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
-								    opj_event_mgr_t * p_manager
-                                    )
+OPJ_BOOL opj_jp2_set_decode_area(opj_jp2_t *p_jp2,
+                                 opj_image_t* p_image,
+                                 OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+                                 OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
+                                 opj_event_mgr_t * p_manager
+                                )
 {
-	return opj_j2k_set_decode_area(p_jp2->j2k, p_image, p_start_x, p_start_y, p_end_x, p_end_y, p_manager);
+    return opj_j2k_set_decode_area(p_jp2->j2k, p_image, p_start_x, p_start_y,
+                                   p_end_x, p_end_y, p_manager);
 }
 
-OPJ_BOOL opj_jp2_get_tile(	opj_jp2_t *p_jp2,
-                            opj_stream_private_t *p_stream,
-                            opj_image_t* p_image,
-                            opj_event_mgr_t * p_manager,
-                            OPJ_UINT32 tile_index
-                            )
+OPJ_BOOL opj_jp2_get_tile(opj_jp2_t *p_jp2,
+                          opj_stream_private_t *p_stream,
+                          opj_image_t* p_image,
+                          opj_event_mgr_t * p_manager,
+                          OPJ_UINT32 tile_index
+                         )
 {
-	if (!p_image)
-		return OPJ_FALSE;
+    if (!p_image) {
+        return OPJ_FALSE;
+    }
 
-	opj_event_msg(p_manager, EVT_WARNING, "JP2 box which are after the codestream will not be read by this function.\n");
+    opj_event_msg(p_manager, EVT_WARNING,
+                  "JP2 box which are after the codestream will not be read by this function.\n");
 
-	if (! opj_j2k_get_tile(p_jp2->j2k, p_stream, p_image, p_manager, tile_index) ){
-		opj_event_msg(p_manager, EVT_ERROR, "Failed to decode the codestream in the JP2 file\n");
-		return OPJ_FALSE;
-	}
+    if (! opj_j2k_get_tile(p_jp2->j2k, p_stream, p_image, p_manager, tile_index)) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Failed to decode the codestream in the JP2 file\n");
+        return OPJ_FALSE;
+    }
 
-	if (!opj_jp2_check_color(p_image, &(p_jp2->color), p_manager)) {
-		return OPJ_FALSE;
-	}
+    if (!opj_jp2_check_color(p_image, &(p_jp2->color), p_manager)) {
+        return OPJ_FALSE;
+    }
 
-	/* Set Image Color Space */
-	if (p_jp2->enumcs == 16)
-		p_image->color_space = OPJ_CLRSPC_SRGB;
-	else if (p_jp2->enumcs == 17)
-		p_image->color_space = OPJ_CLRSPC_GRAY;
-	else if (p_jp2->enumcs == 18)
-		p_image->color_space = OPJ_CLRSPC_SYCC;
-	else if (p_jp2->enumcs == 24)
-		p_image->color_space = OPJ_CLRSPC_EYCC;
-	else if (p_jp2->enumcs == 12)
-		p_image->color_space = OPJ_CLRSPC_CMYK;
-	else
-		p_image->color_space = OPJ_CLRSPC_UNKNOWN;
+    /* Set Image Color Space */
+    if (p_jp2->enumcs == 16) {
+        p_image->color_space = OPJ_CLRSPC_SRGB;
+    } else if (p_jp2->enumcs == 17) {
+        p_image->color_space = OPJ_CLRSPC_GRAY;
+    } else if (p_jp2->enumcs == 18) {
+        p_image->color_space = OPJ_CLRSPC_SYCC;
+    } else if (p_jp2->enumcs == 24) {
+        p_image->color_space = OPJ_CLRSPC_EYCC;
+    } else if (p_jp2->enumcs == 12) {
+        p_image->color_space = OPJ_CLRSPC_CMYK;
+    } else {
+        p_image->color_space = OPJ_CLRSPC_UNKNOWN;
+    }
 
-	if(p_jp2->color.jp2_pclr) {
-		/* Part 1, I.5.3.4: Either both or none : */
-		if( !p_jp2->color.jp2_pclr->cmap)
-			opj_jp2_free_pclr(&(p_jp2->color));
-		else
-			opj_jp2_apply_pclr(p_image, &(p_jp2->color));
-	}
-	
-	/* Apply the color space if needed */
-	if(p_jp2->color.jp2_cdef) {
-		opj_jp2_apply_cdef(p_image, &(p_jp2->color), p_manager);
-	}
+    if (p_jp2->color.jp2_pclr) {
+        /* Part 1, I.5.3.4: Either both or none : */
+        if (!p_jp2->color.jp2_pclr->cmap) {
+            opj_jp2_free_pclr(&(p_jp2->color));
+        } else {
+            if (!opj_jp2_apply_pclr(p_image, &(p_jp2->color), p_manager)) {
+                return OPJ_FALSE;
+            }
+        }
+    }
 
-	if(p_jp2->color.icc_profile_buf) {
-		p_image->icc_profile_buf = p_jp2->color.icc_profile_buf;
-		p_image->icc_profile_len = p_jp2->color.icc_profile_len;
-		p_jp2->color.icc_profile_buf = NULL;
-	}
+    /* Apply the color space if needed */
+    if (p_jp2->color.jp2_cdef) {
+        opj_jp2_apply_cdef(p_image, &(p_jp2->color), p_manager);
+    }
 
-	return OPJ_TRUE;
+    if (p_jp2->color.icc_profile_buf) {
+        p_image->icc_profile_buf = p_jp2->color.icc_profile_buf;
+        p_image->icc_profile_len = p_jp2->color.icc_profile_len;
+        p_jp2->color.icc_profile_buf = NULL;
+    }
+
+    return OPJ_TRUE;
 }
 
 /* ----------------------------------------------------------------------- */
@@ -2927,251 +3159,259 @@
 
 opj_jp2_t* opj_jp2_create(OPJ_BOOL p_is_decoder)
 {
-	opj_jp2_t *jp2 = (opj_jp2_t*)opj_calloc(1,sizeof(opj_jp2_t));
-	if (jp2) {
+    opj_jp2_t *jp2 = (opj_jp2_t*)opj_calloc(1, sizeof(opj_jp2_t));
+    if (jp2) {
 
-		/* create the J2K codec */
-		if (! p_is_decoder) {
-			jp2->j2k = opj_j2k_create_compress();
-		}
-		else {
-			jp2->j2k = opj_j2k_create_decompress();
-		}
+        /* create the J2K codec */
+        if (! p_is_decoder) {
+            jp2->j2k = opj_j2k_create_compress();
+        } else {
+            jp2->j2k = opj_j2k_create_decompress();
+        }
 
-		if (jp2->j2k == 00) {
-			opj_jp2_destroy(jp2);
-			return 00;
-		}
+        if (jp2->j2k == 00) {
+            opj_jp2_destroy(jp2);
+            return 00;
+        }
 
-		/* Color structure */
-		jp2->color.icc_profile_buf = NULL;
-		jp2->color.icc_profile_len = 0;
-		jp2->color.jp2_cdef = NULL;
-		jp2->color.jp2_pclr = NULL;
-		jp2->color.jp2_has_colr = 0;
+        /* Color structure */
+        jp2->color.icc_profile_buf = NULL;
+        jp2->color.icc_profile_len = 0;
+        jp2->color.jp2_cdef = NULL;
+        jp2->color.jp2_pclr = NULL;
+        jp2->color.jp2_has_colr = 0;
 
-		/* validation list creation */
-		jp2->m_validation_list = opj_procedure_list_create();
-		if (! jp2->m_validation_list) {
-			opj_jp2_destroy(jp2);
-			return 00;
-		}
+        /* validation list creation */
+        jp2->m_validation_list = opj_procedure_list_create();
+        if (! jp2->m_validation_list) {
+            opj_jp2_destroy(jp2);
+            return 00;
+        }
 
-		/* execution list creation */
-		jp2->m_procedure_list = opj_procedure_list_create();
-		if (! jp2->m_procedure_list) {
-			opj_jp2_destroy(jp2);
-			return 00;
-		}
-	}
+        /* execution list creation */
+        jp2->m_procedure_list = opj_procedure_list_create();
+        if (! jp2->m_procedure_list) {
+            opj_jp2_destroy(jp2);
+            return 00;
+        }
+    }
 
-	return jp2;
+    return jp2;
 }
 
 void jp2_dump(opj_jp2_t* p_jp2, OPJ_INT32 flag, FILE* out_stream)
 {
-	/* preconditions */
-	assert(p_jp2 != 00);
+    /* preconditions */
+    assert(p_jp2 != 00);
 
-	j2k_dump(p_jp2->j2k,
-					flag,
-					out_stream);
+    j2k_dump(p_jp2->j2k,
+             flag,
+             out_stream);
 }
 
 opj_codestream_index_t* jp2_get_cstr_index(opj_jp2_t* p_jp2)
 {
-	return j2k_get_cstr_index(p_jp2->j2k);
+    return j2k_get_cstr_index(p_jp2->j2k);
 }
 
 opj_codestream_info_v2_t* jp2_get_cstr_info(opj_jp2_t* p_jp2)
 {
-	return j2k_get_cstr_info(p_jp2->j2k);
+    return j2k_get_cstr_info(p_jp2->j2k);
 }
 
 OPJ_BOOL opj_jp2_set_decoded_resolution_factor(opj_jp2_t *p_jp2,
-                                               OPJ_UINT32 res_factor,
-                                               opj_event_mgr_t * p_manager)
+        OPJ_UINT32 res_factor,
+        opj_event_mgr_t * p_manager)
 {
-	return opj_j2k_set_decoded_resolution_factor(p_jp2->j2k, res_factor, p_manager);
+    return opj_j2k_set_decoded_resolution_factor(p_jp2->j2k, res_factor, p_manager);
 }
 
 /* JPIP specific */
 
 #ifdef USE_JPIP
 static OPJ_BOOL opj_jpip_write_iptr(opj_jp2_t *jp2,
-  opj_stream_private_t *cio,
-  opj_event_mgr_t * p_manager )
+                                    opj_stream_private_t *cio,
+                                    opj_event_mgr_t * p_manager)
 {
-  OPJ_OFF_T j2k_codestream_exit;
-  OPJ_BYTE l_data_header [24];
+    OPJ_OFF_T j2k_codestream_exit;
+    OPJ_BYTE l_data_header [24];
 
-  /* preconditions */
-  assert(jp2 != 00);
-  assert(cio != 00);
-  assert(p_manager != 00);
-  assert(opj_stream_has_seek(cio));
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(cio != 00);
+    assert(p_manager != 00);
+    assert(opj_stream_has_seek(cio));
 
-  j2k_codestream_exit = opj_stream_tell(cio);
-  opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
-  opj_write_bytes(l_data_header + 4,JPIP_IPTR,4);									   /* IPTR */
+    j2k_codestream_exit = opj_stream_tell(cio);
+    opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
+    opj_write_bytes(l_data_header + 4, JPIP_IPTR,
+                    4);                                      /* IPTR */
 #if 0
-  opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
-  opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
+    opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
+    opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
 #else
-  opj_write_double(l_data_header + 4 + 4, 0); /* offset */
-  opj_write_double(l_data_header + 8 + 8, 0); /* length */
+    opj_write_double(l_data_header + 4 + 4, 0); /* offset */
+    opj_write_double(l_data_header + 8 + 8, 0); /* length */
 #endif
 
-  if (! opj_stream_seek(cio,jp2->jpip_iptr_offset,p_manager)) {
-    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
-    return OPJ_FALSE;
-  }
+    if (! opj_stream_seek(cio, jp2->jpip_iptr_offset, p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+        return OPJ_FALSE;
+    }
 
-  if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {
-    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
-    return OPJ_FALSE;
-  }
+    if (opj_stream_write_data(cio, l_data_header, 24, p_manager) != 24) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+        return OPJ_FALSE;
+    }
 
-  if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
-    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
-    return OPJ_FALSE;
-  }
+    if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+        return OPJ_FALSE;
+    }
 
-  return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 static OPJ_BOOL opj_jpip_write_fidx(opj_jp2_t *jp2,
-  opj_stream_private_t *cio,
-  opj_event_mgr_t * p_manager )
+                                    opj_stream_private_t *cio,
+                                    opj_event_mgr_t * p_manager)
 {
-  OPJ_OFF_T j2k_codestream_exit;
-  OPJ_BYTE l_data_header [24];
+    OPJ_OFF_T j2k_codestream_exit;
+    OPJ_BYTE l_data_header [24];
 
-  /* preconditions */
-  assert(jp2 != 00);
-  assert(cio != 00);
-  assert(p_manager != 00);
-  assert(opj_stream_has_seek(cio));
+    OPJ_UNUSED(jp2);
 
-  opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
-  opj_write_bytes(l_data_header + 4,JPIP_FIDX,4);									   /* IPTR */
-  opj_write_double(l_data_header + 4 + 4, 0); /* offset */
-  opj_write_double(l_data_header + 8 + 8, 0); /* length */
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(cio != 00);
+    assert(p_manager != 00);
+    assert(opj_stream_has_seek(cio));
 
-  if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {
-    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
-    return OPJ_FALSE;
-  }
+    opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
+    opj_write_bytes(l_data_header + 4, JPIP_FIDX,
+                    4);                                      /* IPTR */
+    opj_write_double(l_data_header + 4 + 4, 0); /* offset */
+    opj_write_double(l_data_header + 8 + 8, 0); /* length */
 
-  j2k_codestream_exit = opj_stream_tell(cio);
-  if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
-    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
-    return OPJ_FALSE;
-  }
+    if (opj_stream_write_data(cio, l_data_header, 24, p_manager) != 24) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+        return OPJ_FALSE;
+    }
 
-  return OPJ_TRUE;
+    j2k_codestream_exit = opj_stream_tell(cio);
+    if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+        return OPJ_FALSE;
+    }
+
+    return OPJ_TRUE;
 }
 
 static OPJ_BOOL opj_jpip_write_cidx(opj_jp2_t *jp2,
-  opj_stream_private_t *cio,
-  opj_event_mgr_t * p_manager )
+                                    opj_stream_private_t *cio,
+                                    opj_event_mgr_t * p_manager)
 {
-  OPJ_OFF_T j2k_codestream_exit;
-  OPJ_BYTE l_data_header [24];
+    OPJ_OFF_T j2k_codestream_exit;
+    OPJ_BYTE l_data_header [24];
 
-  /* preconditions */
-  assert(jp2 != 00);
-  assert(cio != 00);
-  assert(p_manager != 00);
-  assert(opj_stream_has_seek(cio));
+    OPJ_UNUSED(jp2);
 
-  j2k_codestream_exit = opj_stream_tell(cio);
-  opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
-  opj_write_bytes(l_data_header + 4,JPIP_CIDX,4);									   /* IPTR */
+    /* preconditions */
+    assert(jp2 != 00);
+    assert(cio != 00);
+    assert(p_manager != 00);
+    assert(opj_stream_has_seek(cio));
+
+    j2k_codestream_exit = opj_stream_tell(cio);
+    opj_write_bytes(l_data_header, 24, 4); /* size of iptr */
+    opj_write_bytes(l_data_header + 4, JPIP_CIDX,
+                    4);                                      /* IPTR */
 #if 0
-  opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
-  opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
+    opj_write_bytes(l_data_header + 4 + 4, 0, 8); /* offset */
+    opj_write_bytes(l_data_header + 8 + 8, 0, 8); /* length */
 #else
-  opj_write_double(l_data_header + 4 + 4, 0); /* offset */
-  opj_write_double(l_data_header + 8 + 8, 0); /* length */
+    opj_write_double(l_data_header + 4 + 4, 0); /* offset */
+    opj_write_double(l_data_header + 8 + 8, 0); /* length */
 #endif
 
-  if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
-    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
-    return OPJ_FALSE;
-  }
+    if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+        return OPJ_FALSE;
+    }
 
-  if (opj_stream_write_data(cio,l_data_header,24,p_manager) != 24) {
-    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
-    return OPJ_FALSE;
-  }
+    if (opj_stream_write_data(cio, l_data_header, 24, p_manager) != 24) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+        return OPJ_FALSE;
+    }
 
-  j2k_codestream_exit = opj_stream_tell(cio);
-  if (! opj_stream_seek(cio,j2k_codestream_exit,p_manager)) {
-    opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
-    return OPJ_FALSE;
-  }
+    j2k_codestream_exit = opj_stream_tell(cio);
+    if (! opj_stream_seek(cio, j2k_codestream_exit, p_manager)) {
+        opj_event_msg(p_manager, EVT_ERROR, "Failed to seek in the stream.\n");
+        return OPJ_FALSE;
+    }
 
-  return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 #if 0
-static void write_prxy( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_stream_private_t *cio,
-  opj_event_mgr_t * p_manager )
+static void write_prxy(int offset_jp2c, int length_jp2c, int offset_idx,
+                       int length_idx, opj_stream_private_t *cio,
+                       opj_event_mgr_t * p_manager)
 {
-  OPJ_BYTE l_data_header [8];
-  OPJ_OFF_T len, lenp;
+    OPJ_BYTE l_data_header [8];
+    OPJ_OFF_T len, lenp;
 
-  lenp = opj_stream_tell(cio);
-  opj_stream_skip(cio, 4, p_manager);         /* L [at the end] */
-  opj_write_bytes(l_data_header,JPIP_PRXY,4); /* IPTR           */
-  opj_stream_write_data(cio,l_data_header,4,p_manager);
+    lenp = opj_stream_tell(cio);
+    opj_stream_skip(cio, 4, p_manager);         /* L [at the end] */
+    opj_write_bytes(l_data_header, JPIP_PRXY, 4); /* IPTR           */
+    opj_stream_write_data(cio, l_data_header, 4, p_manager);
 
-  opj_write_bytes( l_data_header, offset_jp2c, 8); /* OOFF           */
-  opj_stream_write_data(cio,l_data_header,8,p_manager);
-  opj_write_bytes( l_data_header, length_jp2c, 4); /* OBH part 1     */
-  opj_write_bytes( l_data_header+4, JP2_JP2C, 4);  /* OBH part 2     */
-  opj_stream_write_data(cio,l_data_header,8,p_manager);
+    opj_write_bytes(l_data_header, offset_jp2c, 8);  /* OOFF           */
+    opj_stream_write_data(cio, l_data_header, 8, p_manager);
+    opj_write_bytes(l_data_header, length_jp2c, 4);  /* OBH part 1     */
+    opj_write_bytes(l_data_header + 4, JP2_JP2C, 4); /* OBH part 2     */
+    opj_stream_write_data(cio, l_data_header, 8, p_manager);
 
-  opj_write_bytes( l_data_header, 1, 1);/* NI             */
-  opj_stream_write_data(cio,l_data_header,1,p_manager);
+    opj_write_bytes(l_data_header, 1, 1); /* NI             */
+    opj_stream_write_data(cio, l_data_header, 1, p_manager);
 
-  opj_write_bytes( l_data_header, offset_idx, 8);  /* IOFF           */
-  opj_stream_write_data(cio,l_data_header,8,p_manager);
-  opj_write_bytes( l_data_header, length_idx, 4);  /* IBH part 1     */
-  opj_write_bytes( l_data_header+4, JPIP_CIDX, 4);   /* IBH part 2     */
-  opj_stream_write_data(cio,l_data_header,8,p_manager);
+    opj_write_bytes(l_data_header, offset_idx, 8);   /* IOFF           */
+    opj_stream_write_data(cio, l_data_header, 8, p_manager);
+    opj_write_bytes(l_data_header, length_idx, 4);   /* IBH part 1     */
+    opj_write_bytes(l_data_header + 4, JPIP_CIDX, 4);  /* IBH part 2     */
+    opj_stream_write_data(cio, l_data_header, 8, p_manager);
 
-  len = opj_stream_tell(cio)-lenp;
-  opj_stream_skip(cio, lenp, p_manager);
-  opj_write_bytes(l_data_header,len,4);/* L              */
-  opj_stream_write_data(cio,l_data_header,4,p_manager);
-  opj_stream_seek(cio, lenp+len,p_manager);
+    len = opj_stream_tell(cio) - lenp;
+    opj_stream_skip(cio, lenp, p_manager);
+    opj_write_bytes(l_data_header, len, 4); /* L              */
+    opj_stream_write_data(cio, l_data_header, 4, p_manager);
+    opj_stream_seek(cio, lenp + len, p_manager);
 }
 #endif
 
 
 #if 0
-static int write_fidx( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_stream_private_t *cio,
-  opj_event_mgr_t * p_manager )
+static int write_fidx(int offset_jp2c, int length_jp2c, int offset_idx,
+                      int length_idx, opj_stream_private_t *cio,
+                      opj_event_mgr_t * p_manager)
 {
-  OPJ_BYTE l_data_header [4];
-  OPJ_OFF_T len, lenp;
+    OPJ_BYTE l_data_header [4];
+    OPJ_OFF_T len, lenp;
 
-  lenp = opj_stream_tell(cio);
-  opj_stream_skip(cio, 4, p_manager);
-  opj_write_bytes(l_data_header,JPIP_FIDX,4); /* FIDX */
-  opj_stream_write_data(cio,l_data_header,4,p_manager);
+    lenp = opj_stream_tell(cio);
+    opj_stream_skip(cio, 4, p_manager);
+    opj_write_bytes(l_data_header, JPIP_FIDX, 4); /* FIDX */
+    opj_stream_write_data(cio, l_data_header, 4, p_manager);
 
-  write_prxy( offset_jp2c, length_jp2c, offset_idx, length_idx, cio,p_manager);
+    write_prxy(offset_jp2c, length_jp2c, offset_idx, length_idx, cio, p_manager);
 
-  len = opj_stream_tell(cio)-lenp;
-  opj_stream_skip(cio, lenp, p_manager);
-  opj_write_bytes(l_data_header,len,4);/* L              */
-  opj_stream_write_data(cio,l_data_header,4,p_manager);
-  opj_stream_seek(cio, lenp+len,p_manager);
+    len = opj_stream_tell(cio) - lenp;
+    opj_stream_skip(cio, lenp, p_manager);
+    opj_write_bytes(l_data_header, len, 4); /* L              */
+    opj_stream_write_data(cio, l_data_header, 4, p_manager);
+    opj_stream_seek(cio, lenp + len, p_manager);
 
-  return len;
+    return len;
 }
 #endif
 #endif /* USE_JPIP */
diff --git a/third_party/libopenjpeg20/jp2.h b/third_party/libopenjpeg20/jp2.h
index 9413883..3ff66eb 100644
--- a/third_party/libopenjpeg20/jp2.h
+++ b/third_party/libopenjpeg20/jp2.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,7 +8,7 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2002-2003, Yannick Verschueren
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -33,8 +33,8 @@
  * 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
+#ifndef OPJ_JP2_H
+#define OPJ_JP2_H
 /**
 @file jp2.h
 @brief The JPEG-2000 file format Reader/Writer (JP2)
@@ -70,56 +70,50 @@
 
 /* ----------------------------------------------------------------------- */
 
-typedef enum
-{
-  JP2_STATE_NONE            = 0x0,
-  JP2_STATE_SIGNATURE       = 0x1,
-  JP2_STATE_FILE_TYPE       = 0x2,
-  JP2_STATE_HEADER          = 0x4,
-  JP2_STATE_CODESTREAM      = 0x8,
-  JP2_STATE_END_CODESTREAM  = 0x10,
-  JP2_STATE_UNKNOWN         = 0x7fffffff /* ISO C restricts enumerator values to range of 'int' */
+typedef enum {
+    JP2_STATE_NONE            = 0x0,
+    JP2_STATE_SIGNATURE       = 0x1,
+    JP2_STATE_FILE_TYPE       = 0x2,
+    JP2_STATE_HEADER          = 0x4,
+    JP2_STATE_CODESTREAM      = 0x8,
+    JP2_STATE_END_CODESTREAM  = 0x10,
+    JP2_STATE_UNKNOWN         = 0x7fffffff /* ISO C restricts enumerator values to range of 'int' */
 }
 JP2_STATE;
 
-typedef enum
-{
-  JP2_IMG_STATE_NONE        = 0x0,
-  JP2_IMG_STATE_UNKNOWN     = 0x7fffffff
+typedef enum {
+    JP2_IMG_STATE_NONE        = 0x0,
+    JP2_IMG_STATE_UNKNOWN     = 0x7fffffff
 }
 JP2_IMG_STATE;
 
-/** 
+/**
 Channel description: channel index, type, association
 */
-typedef struct opj_jp2_cdef_info
-{
+typedef struct opj_jp2_cdef_info {
     OPJ_UINT16 cn, typ, asoc;
 } opj_jp2_cdef_info_t;
 
-/** 
+/**
 Channel descriptions and number of descriptions
 */
-typedef struct opj_jp2_cdef
-{
+typedef struct opj_jp2_cdef {
     opj_jp2_cdef_info_t *info;
     OPJ_UINT16 n;
 } opj_jp2_cdef_t;
 
-/** 
+/**
 Component mappings: channel index, mapping type, palette index
 */
-typedef struct opj_jp2_cmap_comp
-{
+typedef struct opj_jp2_cmap_comp {
     OPJ_UINT16 cmp;
     OPJ_BYTE mtyp, pcol;
 } opj_jp2_cmap_comp_t;
 
-/** 
+/**
 Palette data: table entries, palette columns
 */
-typedef struct opj_jp2_pclr
-{
+typedef struct opj_jp2_pclr {
     OPJ_UINT32 *entries;
     OPJ_BYTE *channel_sign;
     OPJ_BYTE *channel_size;
@@ -128,11 +122,10 @@
     OPJ_BYTE nr_channels;
 } opj_jp2_pclr_t;
 
-/** 
-Collector for ICC profile, palette, component mapping, channel description 
+/**
+Collector for ICC profile, palette, component mapping, channel description
 */
-typedef struct opj_jp2_color
-{
+typedef struct opj_jp2_color {
     OPJ_BYTE *icc_profile_buf;
     OPJ_UINT32 icc_profile_len;
 
@@ -141,60 +134,61 @@
     OPJ_BYTE jp2_has_colr;
 } opj_jp2_color_t;
 
-/** 
+/**
 JP2 component
 */
 typedef struct opj_jp2_comps {
-  OPJ_UINT32 depth;      
-  OPJ_UINT32 sgnd;       
-  OPJ_UINT32 bpcc;
+    OPJ_UINT32 depth;
+    OPJ_UINT32 sgnd;
+    OPJ_UINT32 bpcc;
 } opj_jp2_comps_t;
 
 /**
 JPEG-2000 file format reader/writer
 */
-typedef struct opj_jp2
-{
-  /** handle to the J2K codec  */
-  opj_j2k_t *j2k;
-  /** list of validation procedures */
-  struct opj_procedure_list * m_validation_list;
-  /** list of execution procedures */
-  struct opj_procedure_list * m_procedure_list;
+typedef struct opj_jp2 {
+    /** handle to the J2K codec  */
+    opj_j2k_t *j2k;
+    /** list of validation procedures */
+    struct opj_procedure_list * m_validation_list;
+    /** list of execution procedures */
+    struct opj_procedure_list * m_procedure_list;
 
-  /* width of image */
-  OPJ_UINT32 w;
-  /* height of image */
-  OPJ_UINT32 h;
-  /* number of components in the image */
-  OPJ_UINT32 numcomps;
-  OPJ_UINT32 bpc;
-  OPJ_UINT32 C;
-  OPJ_UINT32 UnkC;
-  OPJ_UINT32 IPR;
-  OPJ_UINT32 meth;
-  OPJ_UINT32 approx;
-  OPJ_UINT32 enumcs;
-  OPJ_UINT32 precedence;
-  OPJ_UINT32 brand;
-  OPJ_UINT32 minversion;
-  OPJ_UINT32 numcl;
-  OPJ_UINT32 *cl;
-  opj_jp2_comps_t *comps;
-  /* FIXME: The following two variables are used to save offset
-    as we write out a JP2 file to disk. This mecanism is not flexible
-    as codec writers will need to extand those fields as new part
-    of the standard are implemented.
-  */
+    /* width of image */
+    OPJ_UINT32 w;
+    /* height of image */
+    OPJ_UINT32 h;
+    /* number of components in the image */
+    OPJ_UINT32 numcomps;
+    OPJ_UINT32 bpc;
+    OPJ_UINT32 C;
+    OPJ_UINT32 UnkC;
+    OPJ_UINT32 IPR;
+    OPJ_UINT32 meth;
+    OPJ_UINT32 approx;
+    OPJ_UINT32 enumcs;
+    OPJ_UINT32 precedence;
+    OPJ_UINT32 brand;
+    OPJ_UINT32 minversion;
+    OPJ_UINT32 numcl;
+    OPJ_UINT32 *cl;
+    opj_jp2_comps_t *comps;
+    /* FIXME: The following two variables are used to save offset
+      as we write out a JP2 file to disk. This mechanism is not flexible
+      as codec writers will need to extand those fields as new part
+      of the standard are implemented.
+    */
     OPJ_OFF_T j2k_codestream_offset;
     OPJ_OFF_T jpip_iptr_offset;
-	OPJ_BOOL jpip_on;
-  OPJ_UINT32 jp2_state;
-  OPJ_UINT32 jp2_img_state;
+    OPJ_BOOL jpip_on;
+    OPJ_UINT32 jp2_state;
+    OPJ_UINT32 jp2_img_state;
 
-  opj_jp2_color_t color;
-    
+    opj_jp2_color_t color;
+
     OPJ_BOOL ignore_pclr_cmap_cdef;
+    OPJ_BYTE has_jp2h;
+    OPJ_BYTE has_ihdr;
 }
 opj_jp2_t;
 
@@ -207,28 +201,26 @@
     OPJ_INT32 init_pos;
 } opj_jp2_box_t;
 
-typedef struct opj_jp2_header_handler
-{
-  /* marker value */
-  OPJ_UINT32 id;
-  /* action linked to the marker */
-  OPJ_BOOL (*handler) (     opj_jp2_t *jp2, 
-                            OPJ_BYTE *p_header_data, 
-                            OPJ_UINT32 p_header_size, 
-                            opj_event_mgr_t * p_manager);
+typedef struct opj_jp2_header_handler {
+    /* marker value */
+    OPJ_UINT32 id;
+    /* action linked to the marker */
+    OPJ_BOOL(*handler)(opj_jp2_t *jp2,
+                       OPJ_BYTE *p_header_data,
+                       OPJ_UINT32 p_header_size,
+                       opj_event_mgr_t * p_manager);
 }
 opj_jp2_header_handler_t;
 
 
-typedef struct opj_jp2_img_header_writer_handler 
-{
-  /* action to perform */
-  OPJ_BYTE*   (*handler) (opj_jp2_t *jp2, OPJ_UINT32 * p_data_size);
-  /* result of the action : data */
-  OPJ_BYTE*   m_data;
-  /* size of data */
-  OPJ_UINT32  m_size;
-} 
+typedef struct opj_jp2_img_header_writer_handler {
+    /* action to perform */
+    OPJ_BYTE*   (*handler)(opj_jp2_t *jp2, OPJ_UINT32 * p_data_size);
+    /* result of the action : data */
+    OPJ_BYTE*   m_data;
+    /* size of data */
+    OPJ_UINT32  m_size;
+}
 opj_jp2_img_header_writer_handler_t;
 
 /** @name Exported functions */
@@ -243,6 +235,8 @@
 */
 void opj_jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);
 
+OPJ_BOOL opj_jp2_set_threads(opj_jp2_t *jp2, OPJ_UINT32 num_threads);
+
 /**
  * Decode an image from a JPEG-2000 file stream
  * @param jp2 JP2 decompressor handle
@@ -254,12 +248,12 @@
 */
 OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,
                         opj_stream_private_t *p_stream,
-            opj_image_t* p_image,
-            opj_event_mgr_t * p_manager);
+                        opj_image_t* p_image,
+                        opj_event_mgr_t * p_manager);
 
 /**
- * Setup the encoder parameters using the current image and using user parameters. 
- * Coding parameters are returned in jp2->j2k->cp. 
+ * 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
@@ -267,10 +261,10 @@
  * @param p_manager  FIXME DOC
  * @return OPJ_TRUE if successful, OPJ_FALSE otherwise
 */
-OPJ_BOOL opj_jp2_setup_encoder(  opj_jp2_t *jp2, 
-                            opj_cparameters_t *parameters, 
-                            opj_image_t *image, 
-                            opj_event_mgr_t * p_manager);
+OPJ_BOOL opj_jp2_setup_encoder(opj_jp2_t *jp2,
+                               opj_cparameters_t *parameters,
+                               opj_image_t *image,
+                               opj_event_mgr_t * p_manager);
 
 /**
 Encode an image into a JPEG-2000 file stream
@@ -279,9 +273,9 @@
 @param p_manager  event manager
 @return Returns true if successful, returns false otherwise
 */
-OPJ_BOOL opj_jp2_encode(  opj_jp2_t *jp2, 
-              opj_stream_private_t *stream, 
-              opj_event_mgr_t * p_manager);
+OPJ_BOOL opj_jp2_encode(opj_jp2_t *jp2,
+                        opj_stream_private_t *stream,
+                        opj_event_mgr_t * p_manager);
 
 
 /**
@@ -304,9 +298,9 @@
  * Ends the compression procedures and possibiliy add data to be read after the
  * codestream.
  */
-OPJ_BOOL opj_jp2_end_compress(  opj_jp2_t *jp2,
-                  opj_stream_private_t *cio,
-                  opj_event_mgr_t * p_manager);
+OPJ_BOOL opj_jp2_end_compress(opj_jp2_t *jp2,
+                              opj_stream_private_t *cio,
+                              opj_event_mgr_t * p_manager);
 
 /* ----------------------------------------------------------------------- */
 
@@ -314,7 +308,7 @@
  * Ends the decompression procedures and possibiliy add data to be read after the
  * codestream.
  */
-OPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2, 
+OPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2,
                                 opj_stream_private_t *cio,
                                 opj_event_mgr_t * p_manager);
 
@@ -328,10 +322,10 @@
  *
  * @return true if the box is valid.
  */
-OPJ_BOOL opj_jp2_read_header(  opj_stream_private_t *p_stream,
-                                opj_jp2_t *jp2,
-                                opj_image_t ** p_image,
-                                opj_event_mgr_t * p_manager );
+OPJ_BOOL opj_jp2_read_header(opj_stream_private_t *p_stream,
+                             opj_jp2_t *jp2,
+                             opj_image_t ** p_image,
+                             opj_event_mgr_t * p_manager);
 
 /**
  * Reads a tile header.
@@ -347,17 +341,17 @@
  * @param  p_stream      the stream to write data to.
  * @param  p_manager     the user event manager.
  */
-OPJ_BOOL opj_jp2_read_tile_header ( opj_jp2_t * p_jp2,
-                                    OPJ_UINT32 * p_tile_index,
-                                    OPJ_UINT32 * p_data_size,
-                                    OPJ_INT32 * p_tile_x0,
-                                    OPJ_INT32 * p_tile_y0,
-                                    OPJ_INT32 * p_tile_x1,
-                                    OPJ_INT32 * p_tile_y1,
-                                    OPJ_UINT32 * p_nb_comps,
-                                    OPJ_BOOL * p_go_on,
-                                    opj_stream_private_t *p_stream,
-                                    opj_event_mgr_t * p_manager );
+OPJ_BOOL opj_jp2_read_tile_header(opj_jp2_t * p_jp2,
+                                  OPJ_UINT32 * p_tile_index,
+                                  OPJ_UINT32 * p_data_size,
+                                  OPJ_INT32 * p_tile_x0,
+                                  OPJ_INT32 * p_tile_y0,
+                                  OPJ_INT32 * p_tile_x1,
+                                  OPJ_INT32 * p_tile_y1,
+                                  OPJ_UINT32 * p_nb_comps,
+                                  OPJ_BOOL * p_go_on,
+                                  opj_stream_private_t *p_stream,
+                                  opj_event_mgr_t * p_manager);
 
 /**
  * Writes a tile.
@@ -369,12 +363,12 @@
  * @param  p_stream      the stream to write data to.
  * @param  p_manager  the user event manager.
  */
-OPJ_BOOL opj_jp2_write_tile (  opj_jp2_t *p_jp2,
-                    OPJ_UINT32 p_tile_index,
-                    OPJ_BYTE * p_data,
-                    OPJ_UINT32 p_data_size,
-                    opj_stream_private_t *p_stream,
-                    opj_event_mgr_t * p_manager );
+OPJ_BOOL opj_jp2_write_tile(opj_jp2_t *p_jp2,
+                            OPJ_UINT32 p_tile_index,
+                            OPJ_BYTE * p_data,
+                            OPJ_UINT32 p_data_size,
+                            opj_stream_private_t *p_stream,
+                            opj_event_mgr_t * p_manager);
 
 /**
  * Decode tile data.
@@ -387,19 +381,19 @@
  *
  * @return FIXME DOC
  */
-OPJ_BOOL opj_jp2_decode_tile (  opj_jp2_t * p_jp2,
-                                OPJ_UINT32 p_tile_index,
-                                OPJ_BYTE * p_data,
-                                OPJ_UINT32 p_data_size,
-                                opj_stream_private_t *p_stream,
-                                opj_event_mgr_t * p_manager );
+OPJ_BOOL opj_jp2_decode_tile(opj_jp2_t * p_jp2,
+                             OPJ_UINT32 p_tile_index,
+                             OPJ_BYTE * p_data,
+                             OPJ_UINT32 p_data_size,
+                             opj_stream_private_t *p_stream,
+                             opj_event_mgr_t * p_manager);
 
 /**
  * Creates a jpeg2000 file decompressor.
  *
  * @return  an empty jpeg2000 file codec.
  */
-opj_jp2_t* opj_jp2_create (OPJ_BOOL p_is_decoder);
+opj_jp2_t* opj_jp2_create(OPJ_BOOL p_is_decoder);
 
 /**
 Destroy a JP2 decompressor handle
@@ -421,28 +415,28 @@
  *
  * @return  true      if the area could be set.
  */
-OPJ_BOOL opj_jp2_set_decode_area(  opj_jp2_t *p_jp2,
-                    opj_image_t* p_image,
-                    OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
-                    OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
-                    opj_event_mgr_t * p_manager );
+OPJ_BOOL opj_jp2_set_decode_area(opj_jp2_t *p_jp2,
+                                 opj_image_t* p_image,
+                                 OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+                                 OPJ_INT32 p_end_x, OPJ_INT32 p_end_y,
+                                 opj_event_mgr_t * p_manager);
 
- /**
- * 
- */
-OPJ_BOOL opj_jp2_get_tile(  opj_jp2_t *p_jp2,
-                            opj_stream_private_t *p_stream,
-                            opj_image_t* p_image,
-                            opj_event_mgr_t * p_manager,
-                            OPJ_UINT32 tile_index );
+/**
+*
+*/
+OPJ_BOOL opj_jp2_get_tile(opj_jp2_t *p_jp2,
+                          opj_stream_private_t *p_stream,
+                          opj_image_t* p_image,
+                          opj_event_mgr_t * p_manager,
+                          OPJ_UINT32 tile_index);
 
 
 /**
- * 
+ *
  */
-OPJ_BOOL opj_jp2_set_decoded_resolution_factor(opj_jp2_t *p_jp2, 
-                                               OPJ_UINT32 res_factor, 
-                                               opj_event_mgr_t * p_manager);
+OPJ_BOOL opj_jp2_set_decoded_resolution_factor(opj_jp2_t *p_jp2,
+        OPJ_UINT32 res_factor,
+        opj_event_mgr_t * p_manager);
 
 
 /* TODO MSD: clean these 3 functions */
@@ -450,11 +444,11 @@
  * Dump some elements from the JP2 decompression structure .
  *
  *@param p_jp2        the jp2 codec.
- *@param flag        flag to describe what elments are dump.
+ *@param flag        flag to describe what elements are dump.
  *@param out_stream      output stream where dump the elements.
  *
 */
-void jp2_dump (opj_jp2_t* p_jp2, OPJ_INT32 flag, FILE* out_stream);
+void jp2_dump(opj_jp2_t* p_jp2, OPJ_INT32 flag, FILE* out_stream);
 
 /**
  * Get the codestream info from a JPEG2000 codec.
@@ -479,5 +473,5 @@
 
 /*@}*/
 
-#endif /* __JP2_H */
+#endif /* OPJ_JP2_H */
 
diff --git a/third_party/libopenjpeg20/mct.c b/third_party/libopenjpeg20/mct.c
index 7731c15..20b9e121 100644
--- a/third_party/libopenjpeg20/mct.c
+++ b/third_party/libopenjpeg20/mct.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,10 +8,10 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -62,14 +62,14 @@
 /* </summary> */
 static const OPJ_FLOAT64 opj_mct_norms_real[3] = { 1.732, 1.805, 1.573 };
 
-const OPJ_FLOAT64 * opj_mct_get_mct_norms ()
+const OPJ_FLOAT64 * opj_mct_get_mct_norms()
 {
-	return opj_mct_norms;
+    return opj_mct_norms;
 }
 
-const OPJ_FLOAT64 * opj_mct_get_mct_norms_real ()
+const OPJ_FLOAT64 * opj_mct_get_mct_norms_real()
 {
-	return opj_mct_norms_real;
+    return opj_mct_norms_real;
 }
 
 /* <summary> */
@@ -77,63 +77,67 @@
 /* </summary> */
 #ifdef USE_SSE2
 void opj_mct_encode(
-		OPJ_INT32* restrict c0,
-		OPJ_INT32* restrict c1,
-		OPJ_INT32* restrict c2,
-		OPJ_UINT32 n)
+    OPJ_INT32* OPJ_RESTRICT c0,
+    OPJ_INT32* OPJ_RESTRICT c1,
+    OPJ_INT32* OPJ_RESTRICT c2,
+    OPJ_UINT32 n)
 {
-	OPJ_SIZE_T i;
-	const OPJ_SIZE_T len = n;
-	
-	for(i = 0; i < (len & ~3U); i += 4) {
-		__m128i y, u, v;
-		__m128i r = _mm_load_si128((const __m128i *)&(c0[i]));
-		__m128i g = _mm_load_si128((const __m128i *)&(c1[i]));
-		__m128i b = _mm_load_si128((const __m128i *)&(c2[i]));
-		y = _mm_add_epi32(g, g);
-		y = _mm_add_epi32(y, b);
-		y = _mm_add_epi32(y, r);
-		y = _mm_srai_epi32(y, 2);
-		u = _mm_sub_epi32(b, g);
-		v = _mm_sub_epi32(r, g);
-		_mm_store_si128((__m128i *)&(c0[i]), y);
-		_mm_store_si128((__m128i *)&(c1[i]), u);
-		_mm_store_si128((__m128i *)&(c2[i]), v);
-	}
-	
-	for(; i < len; ++i) {
-		OPJ_INT32 r = c0[i];
-		OPJ_INT32 g = c1[i];
-		OPJ_INT32 b = c2[i];
-		OPJ_INT32 y = (r + (g * 2) + b) >> 2;
-		OPJ_INT32 u = b - g;
-		OPJ_INT32 v = r - g;
-		c0[i] = y;
-		c1[i] = u;
-		c2[i] = v;
-	}
+    OPJ_SIZE_T i;
+    const OPJ_SIZE_T len = n;
+    /* buffer are aligned on 16 bytes */
+    assert(((size_t)c0 & 0xf) == 0);
+    assert(((size_t)c1 & 0xf) == 0);
+    assert(((size_t)c2 & 0xf) == 0);
+
+    for (i = 0; i < (len & ~3U); i += 4) {
+        __m128i y, u, v;
+        __m128i r = _mm_load_si128((const __m128i *) & (c0[i]));
+        __m128i g = _mm_load_si128((const __m128i *) & (c1[i]));
+        __m128i b = _mm_load_si128((const __m128i *) & (c2[i]));
+        y = _mm_add_epi32(g, g);
+        y = _mm_add_epi32(y, b);
+        y = _mm_add_epi32(y, r);
+        y = _mm_srai_epi32(y, 2);
+        u = _mm_sub_epi32(b, g);
+        v = _mm_sub_epi32(r, g);
+        _mm_store_si128((__m128i *) & (c0[i]), y);
+        _mm_store_si128((__m128i *) & (c1[i]), u);
+        _mm_store_si128((__m128i *) & (c2[i]), v);
+    }
+
+    for (; i < len; ++i) {
+        OPJ_INT32 r = c0[i];
+        OPJ_INT32 g = c1[i];
+        OPJ_INT32 b = c2[i];
+        OPJ_INT32 y = (r + (g * 2) + b) >> 2;
+        OPJ_INT32 u = b - g;
+        OPJ_INT32 v = r - g;
+        c0[i] = y;
+        c1[i] = u;
+        c2[i] = v;
+    }
 }
 #else
 void opj_mct_encode(
-		OPJ_INT32* restrict c0,
-		OPJ_INT32* restrict c1,
-		OPJ_INT32* restrict c2,
-		OPJ_UINT32 n)
+    OPJ_INT32* OPJ_RESTRICT c0,
+    OPJ_INT32* OPJ_RESTRICT c1,
+    OPJ_INT32* OPJ_RESTRICT c2,
+    OPJ_UINT32 n)
 {
-	OPJ_SIZE_T i;
-	const OPJ_SIZE_T len = n;
-	
-	for(i = 0; i < len; ++i) {
-		OPJ_INT32 r = c0[i];
-		OPJ_INT32 g = c1[i];
-		OPJ_INT32 b = c2[i];
-		OPJ_INT32 y = (r + (g * 2) + b) >> 2;
-		OPJ_INT32 u = b - g;
-		OPJ_INT32 v = r - g;
-		c0[i] = y;
-		c1[i] = u;
-		c2[i] = v;
-	}
+    OPJ_SIZE_T i;
+    const OPJ_SIZE_T len = n;
+
+    for (i = 0; i < len; ++i) {
+        OPJ_INT32 r = c0[i];
+        OPJ_INT32 g = c1[i];
+        OPJ_INT32 b = c2[i];
+        OPJ_INT32 y = (r + (g * 2) + b) >> 2;
+        OPJ_INT32 u = b - g;
+        OPJ_INT32 v = r - g;
+        c0[i] = y;
+        c1[i] = u;
+        c2[i] = v;
+    }
 }
 #endif
 
@@ -142,66 +146,67 @@
 /* </summary> */
 #ifdef USE_SSE2
 void opj_mct_decode(
-		OPJ_INT32* restrict c0,
-		OPJ_INT32* restrict c1,
-		OPJ_INT32* restrict c2,
-		OPJ_UINT32 n)
+    OPJ_INT32* OPJ_RESTRICT c0,
+    OPJ_INT32* OPJ_RESTRICT c1,
+    OPJ_INT32* OPJ_RESTRICT c2,
+    OPJ_UINT32 n)
 {
-	OPJ_SIZE_T i;
-	const OPJ_SIZE_T len = n;
-	
-	for(i = 0; i < (len & ~3U); i += 4) {
-		__m128i r, g, b;
-		__m128i y = _mm_load_si128((const __m128i *)&(c0[i]));
-		__m128i u = _mm_load_si128((const __m128i *)&(c1[i]));
-		__m128i v = _mm_load_si128((const __m128i *)&(c2[i]));
-		g = y;
-		g = _mm_sub_epi32(g, _mm_srai_epi32(_mm_add_epi32(u, v), 2));
-		r = _mm_add_epi32(v, g);
-		b = _mm_add_epi32(u, g);
-		_mm_store_si128((__m128i *)&(c0[i]), r);
-		_mm_store_si128((__m128i *)&(c1[i]), g);
-		_mm_store_si128((__m128i *)&(c2[i]), b);
-	}
-	for (; i < len; ++i) {
-		OPJ_INT32 y = c0[i];
-		OPJ_INT32 u = c1[i];
-		OPJ_INT32 v = c2[i];
-		OPJ_INT32 g = y - ((u + v) >> 2);
-		OPJ_INT32 r = v + g;
-		OPJ_INT32 b = u + g;
-		c0[i] = r;
-		c1[i] = g;
-		c2[i] = b;
-	}
+    OPJ_SIZE_T i;
+    const OPJ_SIZE_T len = n;
+
+    for (i = 0; i < (len & ~3U); i += 4) {
+        __m128i r, g, b;
+        __m128i y = _mm_load_si128((const __m128i *) & (c0[i]));
+        __m128i u = _mm_load_si128((const __m128i *) & (c1[i]));
+        __m128i v = _mm_load_si128((const __m128i *) & (c2[i]));
+        g = y;
+        g = _mm_sub_epi32(g, _mm_srai_epi32(_mm_add_epi32(u, v), 2));
+        r = _mm_add_epi32(v, g);
+        b = _mm_add_epi32(u, g);
+        _mm_store_si128((__m128i *) & (c0[i]), r);
+        _mm_store_si128((__m128i *) & (c1[i]), g);
+        _mm_store_si128((__m128i *) & (c2[i]), b);
+    }
+    for (; i < len; ++i) {
+        OPJ_INT32 y = c0[i];
+        OPJ_INT32 u = c1[i];
+        OPJ_INT32 v = c2[i];
+        OPJ_INT32 g = y - ((u + v) >> 2);
+        OPJ_INT32 r = v + g;
+        OPJ_INT32 b = u + g;
+        c0[i] = r;
+        c1[i] = g;
+        c2[i] = b;
+    }
 }
 #else
 void opj_mct_decode(
-		OPJ_INT32* restrict c0,
-		OPJ_INT32* restrict c1, 
-		OPJ_INT32* restrict c2, 
-		OPJ_UINT32 n)
+    OPJ_INT32* OPJ_RESTRICT c0,
+    OPJ_INT32* OPJ_RESTRICT c1,
+    OPJ_INT32* OPJ_RESTRICT c2,
+    OPJ_UINT32 n)
 {
-	OPJ_UINT32 i;
-	for (i = 0; i < n; ++i) {
-		OPJ_INT32 y = c0[i];
-		OPJ_INT32 u = c1[i];
-		OPJ_INT32 v = c2[i];
-		OPJ_INT32 g = y - ((u + v) >> 2);
-		OPJ_INT32 r = v + g;
-		OPJ_INT32 b = u + g;
-		c0[i] = r;
-		c1[i] = g;
-		c2[i] = b;
-	}
+    OPJ_UINT32 i;
+    for (i = 0; i < n; ++i) {
+        OPJ_INT32 y = c0[i];
+        OPJ_INT32 u = c1[i];
+        OPJ_INT32 v = c2[i];
+        OPJ_INT32 g = y - ((u + v) >> 2);
+        OPJ_INT32 r = v + g;
+        OPJ_INT32 b = u + g;
+        c0[i] = r;
+        c1[i] = g;
+        c2[i] = b;
+    }
 }
 #endif
 
 /* <summary> */
 /* Get norm of basis function of reversible MCT. */
 /* </summary> */
-OPJ_FLOAT64 opj_mct_getnorm(OPJ_UINT32 compno) {
-	return opj_mct_norms[compno];
+OPJ_FLOAT64 opj_mct_getnorm(OPJ_UINT32 compno)
+{
+    return opj_mct_norms[compno];
 }
 
 /* <summary> */
@@ -209,164 +214,171 @@
 /* </summary> */
 #ifdef USE_SSE4
 void opj_mct_encode_real(
-												 OPJ_INT32* restrict c0,
-												 OPJ_INT32* restrict c1,
-												 OPJ_INT32* restrict c2,
-												 OPJ_UINT32 n)
+    OPJ_INT32* OPJ_RESTRICT c0,
+    OPJ_INT32* OPJ_RESTRICT c1,
+    OPJ_INT32* OPJ_RESTRICT c2,
+    OPJ_UINT32 n)
 {
-	OPJ_SIZE_T i;
-	const OPJ_SIZE_T len = n;
-	
-	const __m128i ry = _mm_set1_epi32(2449);
-	const __m128i gy = _mm_set1_epi32(4809);
-	const __m128i by = _mm_set1_epi32(934);
-	const __m128i ru = _mm_set1_epi32(1382);
-	const __m128i gu = _mm_set1_epi32(2714);
-	/* const __m128i bu = _mm_set1_epi32(4096); */
-	/* const __m128i rv = _mm_set1_epi32(4096); */
-	const __m128i gv = _mm_set1_epi32(3430);
-	const __m128i bv = _mm_set1_epi32(666);
-	const __m128i mulround = _mm_shuffle_epi32(_mm_cvtsi32_si128(4096), _MM_SHUFFLE(1, 0, 1, 0));
-	
-	for(i = 0; i < (len & ~3U); i += 4) {
-		__m128i lo, hi;
-		__m128i y, u, v;
-		__m128i r = _mm_load_si128((const __m128i *)&(c0[i]));
-		__m128i g = _mm_load_si128((const __m128i *)&(c1[i]));
-		__m128i b = _mm_load_si128((const __m128i *)&(c2[i]));
-		
-		lo = r;
-		hi = _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 3, 1, 1));
-		lo = _mm_mul_epi32(lo, ry);
-		hi = _mm_mul_epi32(hi, ry);
-		lo = _mm_add_epi64(lo, mulround);
-		hi = _mm_add_epi64(hi, mulround);
-		lo = _mm_srli_epi64(lo, 13);
-		hi = _mm_slli_epi64(hi, 32-13);
-		y = _mm_blend_epi16(lo, hi, 0xCC);
-		
-		lo = g;
-		hi = _mm_shuffle_epi32(g, _MM_SHUFFLE(3, 3, 1, 1));
-		lo = _mm_mul_epi32(lo, gy);
-		hi = _mm_mul_epi32(hi, gy);
-		lo = _mm_add_epi64(lo, mulround);
-		hi = _mm_add_epi64(hi, mulround);
-		lo = _mm_srli_epi64(lo, 13);
-		hi = _mm_slli_epi64(hi, 32-13);
-		y = _mm_add_epi32(y, _mm_blend_epi16(lo, hi, 0xCC));
-		
-		lo = b;
-		hi = _mm_shuffle_epi32(b, _MM_SHUFFLE(3, 3, 1, 1));
-		lo = _mm_mul_epi32(lo, by);
-		hi = _mm_mul_epi32(hi, by);
-		lo = _mm_add_epi64(lo, mulround);
-		hi = _mm_add_epi64(hi, mulround);
-		lo = _mm_srli_epi64(lo, 13);
-		hi = _mm_slli_epi64(hi, 32-13);
-		y = _mm_add_epi32(y, _mm_blend_epi16(lo, hi, 0xCC));
-		_mm_store_si128((__m128i *)&(c0[i]), y);
-		
-		/*lo = b;
-		hi = _mm_shuffle_epi32(b, _MM_SHUFFLE(3, 3, 1, 1));
-		lo = _mm_mul_epi32(lo, mulround);
-		hi = _mm_mul_epi32(hi, mulround);*/
-		lo = _mm_cvtepi32_epi64(_mm_shuffle_epi32(b, _MM_SHUFFLE(3, 2, 2, 0)));
-		hi = _mm_cvtepi32_epi64(_mm_shuffle_epi32(b, _MM_SHUFFLE(3, 2, 3, 1)));
-		lo = _mm_slli_epi64(lo, 12);
-		hi = _mm_slli_epi64(hi, 12);
-		lo = _mm_add_epi64(lo, mulround);
-		hi = _mm_add_epi64(hi, mulround);
-		lo = _mm_srli_epi64(lo, 13);
-		hi = _mm_slli_epi64(hi, 32-13);
-		u = _mm_blend_epi16(lo, hi, 0xCC);
-		
-		lo = r;
-		hi = _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 3, 1, 1));
-		lo = _mm_mul_epi32(lo, ru);
-		hi = _mm_mul_epi32(hi, ru);
-		lo = _mm_add_epi64(lo, mulround);
-		hi = _mm_add_epi64(hi, mulround);
-		lo = _mm_srli_epi64(lo, 13);
-		hi = _mm_slli_epi64(hi, 32-13);
-		u = _mm_sub_epi32(u, _mm_blend_epi16(lo, hi, 0xCC));
-		
-		lo = g;
-		hi = _mm_shuffle_epi32(g, _MM_SHUFFLE(3, 3, 1, 1));
-		lo = _mm_mul_epi32(lo, gu);
-		hi = _mm_mul_epi32(hi, gu);
-		lo = _mm_add_epi64(lo, mulround);
-		hi = _mm_add_epi64(hi, mulround);
-		lo = _mm_srli_epi64(lo, 13);
-		hi = _mm_slli_epi64(hi, 32-13);
-		u = _mm_sub_epi32(u, _mm_blend_epi16(lo, hi, 0xCC));
-		_mm_store_si128((__m128i *)&(c1[i]), u);
-		
-		/*lo = r;
-		hi = _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 3, 1, 1));
-		lo = _mm_mul_epi32(lo, mulround);
-		hi = _mm_mul_epi32(hi, mulround);*/
-		lo = _mm_cvtepi32_epi64(_mm_shuffle_epi32(r, _MM_SHUFFLE(3, 2, 2, 0)));
-		hi = _mm_cvtepi32_epi64(_mm_shuffle_epi32(r, _MM_SHUFFLE(3, 2, 3, 1)));
-		lo = _mm_slli_epi64(lo, 12);
-		hi = _mm_slli_epi64(hi, 12);
-		lo = _mm_add_epi64(lo, mulround);
-		hi = _mm_add_epi64(hi, mulround);
-		lo = _mm_srli_epi64(lo, 13);
-		hi = _mm_slli_epi64(hi, 32-13);
-		v = _mm_blend_epi16(lo, hi, 0xCC);
-		
-		lo = g;
-		hi = _mm_shuffle_epi32(g, _MM_SHUFFLE(3, 3, 1, 1));
-		lo = _mm_mul_epi32(lo, gv);
-		hi = _mm_mul_epi32(hi, gv);
-		lo = _mm_add_epi64(lo, mulround);
-		hi = _mm_add_epi64(hi, mulround);
-		lo = _mm_srli_epi64(lo, 13);
-		hi = _mm_slli_epi64(hi, 32-13);
-		v = _mm_sub_epi32(v, _mm_blend_epi16(lo, hi, 0xCC));
-		
-		lo = b;
-		hi = _mm_shuffle_epi32(b, _MM_SHUFFLE(3, 3, 1, 1));
-		lo = _mm_mul_epi32(lo, bv);
-		hi = _mm_mul_epi32(hi, bv);
-		lo = _mm_add_epi64(lo, mulround);
-		hi = _mm_add_epi64(hi, mulround);
-		lo = _mm_srli_epi64(lo, 13);
-		hi = _mm_slli_epi64(hi, 32-13);
-		v = _mm_sub_epi32(v, _mm_blend_epi16(lo, hi, 0xCC));
-		_mm_store_si128((__m128i *)&(c2[i]), v);
-	}
-	for(; i < len; ++i) {
-		OPJ_INT32 r = c0[i];
-		OPJ_INT32 g = c1[i];
-		OPJ_INT32 b = c2[i];
-		OPJ_INT32 y =  opj_int_fix_mul(r, 2449) + opj_int_fix_mul(g, 4809) + opj_int_fix_mul(b, 934);
-		OPJ_INT32 u = -opj_int_fix_mul(r, 1382) - opj_int_fix_mul(g, 2714) + opj_int_fix_mul(b, 4096);
-		OPJ_INT32 v =  opj_int_fix_mul(r, 4096) - opj_int_fix_mul(g, 3430) - opj_int_fix_mul(b, 666);
-		c0[i] = y;
-		c1[i] = u;
-		c2[i] = v;
-	}
+    OPJ_SIZE_T i;
+    const OPJ_SIZE_T len = n;
+
+    const __m128i ry = _mm_set1_epi32(2449);
+    const __m128i gy = _mm_set1_epi32(4809);
+    const __m128i by = _mm_set1_epi32(934);
+    const __m128i ru = _mm_set1_epi32(1382);
+    const __m128i gu = _mm_set1_epi32(2714);
+    /* const __m128i bu = _mm_set1_epi32(4096); */
+    /* const __m128i rv = _mm_set1_epi32(4096); */
+    const __m128i gv = _mm_set1_epi32(3430);
+    const __m128i bv = _mm_set1_epi32(666);
+    const __m128i mulround = _mm_shuffle_epi32(_mm_cvtsi32_si128(4096),
+                             _MM_SHUFFLE(1, 0, 1, 0));
+
+    for (i = 0; i < (len & ~3U); i += 4) {
+        __m128i lo, hi;
+        __m128i y, u, v;
+        __m128i r = _mm_load_si128((const __m128i *) & (c0[i]));
+        __m128i g = _mm_load_si128((const __m128i *) & (c1[i]));
+        __m128i b = _mm_load_si128((const __m128i *) & (c2[i]));
+
+        lo = r;
+        hi = _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 3, 1, 1));
+        lo = _mm_mul_epi32(lo, ry);
+        hi = _mm_mul_epi32(hi, ry);
+        lo = _mm_add_epi64(lo, mulround);
+        hi = _mm_add_epi64(hi, mulround);
+        lo = _mm_srli_epi64(lo, 13);
+        hi = _mm_slli_epi64(hi, 32 - 13);
+        y = _mm_blend_epi16(lo, hi, 0xCC);
+
+        lo = g;
+        hi = _mm_shuffle_epi32(g, _MM_SHUFFLE(3, 3, 1, 1));
+        lo = _mm_mul_epi32(lo, gy);
+        hi = _mm_mul_epi32(hi, gy);
+        lo = _mm_add_epi64(lo, mulround);
+        hi = _mm_add_epi64(hi, mulround);
+        lo = _mm_srli_epi64(lo, 13);
+        hi = _mm_slli_epi64(hi, 32 - 13);
+        y = _mm_add_epi32(y, _mm_blend_epi16(lo, hi, 0xCC));
+
+        lo = b;
+        hi = _mm_shuffle_epi32(b, _MM_SHUFFLE(3, 3, 1, 1));
+        lo = _mm_mul_epi32(lo, by);
+        hi = _mm_mul_epi32(hi, by);
+        lo = _mm_add_epi64(lo, mulround);
+        hi = _mm_add_epi64(hi, mulround);
+        lo = _mm_srli_epi64(lo, 13);
+        hi = _mm_slli_epi64(hi, 32 - 13);
+        y = _mm_add_epi32(y, _mm_blend_epi16(lo, hi, 0xCC));
+        _mm_store_si128((__m128i *) & (c0[i]), y);
+
+        /*lo = b;
+        hi = _mm_shuffle_epi32(b, _MM_SHUFFLE(3, 3, 1, 1));
+        lo = _mm_mul_epi32(lo, mulround);
+        hi = _mm_mul_epi32(hi, mulround);*/
+        lo = _mm_cvtepi32_epi64(_mm_shuffle_epi32(b, _MM_SHUFFLE(3, 2, 2, 0)));
+        hi = _mm_cvtepi32_epi64(_mm_shuffle_epi32(b, _MM_SHUFFLE(3, 2, 3, 1)));
+        lo = _mm_slli_epi64(lo, 12);
+        hi = _mm_slli_epi64(hi, 12);
+        lo = _mm_add_epi64(lo, mulround);
+        hi = _mm_add_epi64(hi, mulround);
+        lo = _mm_srli_epi64(lo, 13);
+        hi = _mm_slli_epi64(hi, 32 - 13);
+        u = _mm_blend_epi16(lo, hi, 0xCC);
+
+        lo = r;
+        hi = _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 3, 1, 1));
+        lo = _mm_mul_epi32(lo, ru);
+        hi = _mm_mul_epi32(hi, ru);
+        lo = _mm_add_epi64(lo, mulround);
+        hi = _mm_add_epi64(hi, mulround);
+        lo = _mm_srli_epi64(lo, 13);
+        hi = _mm_slli_epi64(hi, 32 - 13);
+        u = _mm_sub_epi32(u, _mm_blend_epi16(lo, hi, 0xCC));
+
+        lo = g;
+        hi = _mm_shuffle_epi32(g, _MM_SHUFFLE(3, 3, 1, 1));
+        lo = _mm_mul_epi32(lo, gu);
+        hi = _mm_mul_epi32(hi, gu);
+        lo = _mm_add_epi64(lo, mulround);
+        hi = _mm_add_epi64(hi, mulround);
+        lo = _mm_srli_epi64(lo, 13);
+        hi = _mm_slli_epi64(hi, 32 - 13);
+        u = _mm_sub_epi32(u, _mm_blend_epi16(lo, hi, 0xCC));
+        _mm_store_si128((__m128i *) & (c1[i]), u);
+
+        /*lo = r;
+        hi = _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 3, 1, 1));
+        lo = _mm_mul_epi32(lo, mulround);
+        hi = _mm_mul_epi32(hi, mulround);*/
+        lo = _mm_cvtepi32_epi64(_mm_shuffle_epi32(r, _MM_SHUFFLE(3, 2, 2, 0)));
+        hi = _mm_cvtepi32_epi64(_mm_shuffle_epi32(r, _MM_SHUFFLE(3, 2, 3, 1)));
+        lo = _mm_slli_epi64(lo, 12);
+        hi = _mm_slli_epi64(hi, 12);
+        lo = _mm_add_epi64(lo, mulround);
+        hi = _mm_add_epi64(hi, mulround);
+        lo = _mm_srli_epi64(lo, 13);
+        hi = _mm_slli_epi64(hi, 32 - 13);
+        v = _mm_blend_epi16(lo, hi, 0xCC);
+
+        lo = g;
+        hi = _mm_shuffle_epi32(g, _MM_SHUFFLE(3, 3, 1, 1));
+        lo = _mm_mul_epi32(lo, gv);
+        hi = _mm_mul_epi32(hi, gv);
+        lo = _mm_add_epi64(lo, mulround);
+        hi = _mm_add_epi64(hi, mulround);
+        lo = _mm_srli_epi64(lo, 13);
+        hi = _mm_slli_epi64(hi, 32 - 13);
+        v = _mm_sub_epi32(v, _mm_blend_epi16(lo, hi, 0xCC));
+
+        lo = b;
+        hi = _mm_shuffle_epi32(b, _MM_SHUFFLE(3, 3, 1, 1));
+        lo = _mm_mul_epi32(lo, bv);
+        hi = _mm_mul_epi32(hi, bv);
+        lo = _mm_add_epi64(lo, mulround);
+        hi = _mm_add_epi64(hi, mulround);
+        lo = _mm_srli_epi64(lo, 13);
+        hi = _mm_slli_epi64(hi, 32 - 13);
+        v = _mm_sub_epi32(v, _mm_blend_epi16(lo, hi, 0xCC));
+        _mm_store_si128((__m128i *) & (c2[i]), v);
+    }
+    for (; i < len; ++i) {
+        OPJ_INT32 r = c0[i];
+        OPJ_INT32 g = c1[i];
+        OPJ_INT32 b = c2[i];
+        OPJ_INT32 y =  opj_int_fix_mul(r, 2449) + opj_int_fix_mul(g,
+                       4809) + opj_int_fix_mul(b, 934);
+        OPJ_INT32 u = -opj_int_fix_mul(r, 1382) - opj_int_fix_mul(g,
+                      2714) + opj_int_fix_mul(b, 4096);
+        OPJ_INT32 v =  opj_int_fix_mul(r, 4096) - opj_int_fix_mul(g,
+                       3430) - opj_int_fix_mul(b, 666);
+        c0[i] = y;
+        c1[i] = u;
+        c2[i] = v;
+    }
 }
 #else
 void opj_mct_encode_real(
-		OPJ_INT32* restrict c0,
-		OPJ_INT32* restrict c1,
-		OPJ_INT32* restrict c2,
-		OPJ_UINT32 n)
+    OPJ_INT32* OPJ_RESTRICT c0,
+    OPJ_INT32* OPJ_RESTRICT c1,
+    OPJ_INT32* OPJ_RESTRICT c2,
+    OPJ_UINT32 n)
 {
-	OPJ_UINT32 i;
-	for(i = 0; i < n; ++i) {
-		OPJ_INT32 r = c0[i];
-		OPJ_INT32 g = c1[i];
-		OPJ_INT32 b = c2[i];
-		OPJ_INT32 y =  opj_int_fix_mul(r, 2449) + opj_int_fix_mul(g, 4809) + opj_int_fix_mul(b, 934);
-		OPJ_INT32 u = -opj_int_fix_mul(r, 1382) - opj_int_fix_mul(g, 2714) + opj_int_fix_mul(b, 4096);
-		OPJ_INT32 v =  opj_int_fix_mul(r, 4096) - opj_int_fix_mul(g, 3430) - opj_int_fix_mul(b, 666);
-		c0[i] = y;
-		c1[i] = u;
-		c2[i] = v;
-	}
+    OPJ_UINT32 i;
+    for (i = 0; i < n; ++i) {
+        OPJ_INT32 r = c0[i];
+        OPJ_INT32 g = c1[i];
+        OPJ_INT32 b = c2[i];
+        OPJ_INT32 y =  opj_int_fix_mul(r, 2449) + opj_int_fix_mul(g,
+                       4809) + opj_int_fix_mul(b, 934);
+        OPJ_INT32 u = -opj_int_fix_mul(r, 1382) - opj_int_fix_mul(g,
+                      2714) + opj_int_fix_mul(b, 4096);
+        OPJ_INT32 v =  opj_int_fix_mul(r, 4096) - opj_int_fix_mul(g,
+                       3430) - opj_int_fix_mul(b, 666);
+        c0[i] = y;
+        c1[i] = u;
+        c2[i] = v;
+    }
 }
 #endif
 
@@ -374,183 +386,185 @@
 /* Inverse irreversible MCT. */
 /* </summary> */
 void opj_mct_decode_real(
-		OPJ_FLOAT32* restrict c0,
-		OPJ_FLOAT32* restrict c1,
-		OPJ_FLOAT32* restrict c2,
-		OPJ_UINT32 n)
+    OPJ_FLOAT32* OPJ_RESTRICT c0,
+    OPJ_FLOAT32* OPJ_RESTRICT c1,
+    OPJ_FLOAT32* OPJ_RESTRICT c2,
+    OPJ_UINT32 n)
 {
-	OPJ_UINT32 i;
+    OPJ_UINT32 i;
 #ifdef USE_SSE
-	__m128 vrv, vgu, vgv, vbu;
-	vrv = _mm_set1_ps(1.402f);
-	vgu = _mm_set1_ps(0.34413f);
-	vgv = _mm_set1_ps(0.71414f);
-	vbu = _mm_set1_ps(1.772f);
-	for (i = 0; i < (n >> 3); ++i) {
-		__m128 vy, vu, vv;
-		__m128 vr, vg, vb;
+    __m128 vrv, vgu, vgv, vbu;
+    vrv = _mm_set1_ps(1.402f);
+    vgu = _mm_set1_ps(0.34413f);
+    vgv = _mm_set1_ps(0.71414f);
+    vbu = _mm_set1_ps(1.772f);
+    for (i = 0; i < (n >> 3); ++i) {
+        __m128 vy, vu, vv;
+        __m128 vr, vg, vb;
 
-		vy = _mm_load_ps(c0);
-		vu = _mm_load_ps(c1);
-		vv = _mm_load_ps(c2);
-		vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
-		vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
-		vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
-		_mm_store_ps(c0, vr);
-		_mm_store_ps(c1, vg);
-		_mm_store_ps(c2, vb);
-		c0 += 4;
-		c1 += 4;
-		c2 += 4;
+        vy = _mm_load_ps(c0);
+        vu = _mm_load_ps(c1);
+        vv = _mm_load_ps(c2);
+        vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
+        vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
+        vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
+        _mm_store_ps(c0, vr);
+        _mm_store_ps(c1, vg);
+        _mm_store_ps(c2, vb);
+        c0 += 4;
+        c1 += 4;
+        c2 += 4;
 
-		vy = _mm_load_ps(c0);
-		vu = _mm_load_ps(c1);
-		vv = _mm_load_ps(c2);
-		vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
-		vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
-		vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
-		_mm_store_ps(c0, vr);
-		_mm_store_ps(c1, vg);
-		_mm_store_ps(c2, vb);
-		c0 += 4;
-		c1 += 4;
-		c2 += 4;
-	}
-	n &= 7;
+        vy = _mm_load_ps(c0);
+        vu = _mm_load_ps(c1);
+        vv = _mm_load_ps(c2);
+        vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
+        vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
+        vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
+        _mm_store_ps(c0, vr);
+        _mm_store_ps(c1, vg);
+        _mm_store_ps(c2, vb);
+        c0 += 4;
+        c1 += 4;
+        c2 += 4;
+    }
+    n &= 7;
 #endif
-	for(i = 0; i < n; ++i) {
-		OPJ_FLOAT32 y = c0[i];
-		OPJ_FLOAT32 u = c1[i];
-		OPJ_FLOAT32 v = c2[i];
-		OPJ_FLOAT32 r = y + (v * 1.402f);
-		OPJ_FLOAT32 g = y - (u * 0.34413f) - (v * (0.71414f));
-		OPJ_FLOAT32 b = y + (u * 1.772f);
-		c0[i] = r;
-		c1[i] = g;
-		c2[i] = b;
-	}
+    for (i = 0; i < n; ++i) {
+        OPJ_FLOAT32 y = c0[i];
+        OPJ_FLOAT32 u = c1[i];
+        OPJ_FLOAT32 v = c2[i];
+        OPJ_FLOAT32 r = y + (v * 1.402f);
+        OPJ_FLOAT32 g = y - (u * 0.34413f) - (v * (0.71414f));
+        OPJ_FLOAT32 b = y + (u * 1.772f);
+        c0[i] = r;
+        c1[i] = g;
+        c2[i] = b;
+    }
 }
 
 /* <summary> */
 /* Get norm of basis function of irreversible MCT. */
 /* </summary> */
-OPJ_FLOAT64 opj_mct_getnorm_real(OPJ_UINT32 compno) {
-	return opj_mct_norms_real[compno];
+OPJ_FLOAT64 opj_mct_getnorm_real(OPJ_UINT32 compno)
+{
+    return opj_mct_norms_real[compno];
 }
 
 
 OPJ_BOOL opj_mct_encode_custom(
-					   OPJ_BYTE * pCodingdata,
-					   OPJ_UINT32 n,
-					   OPJ_BYTE ** pData,
-					   OPJ_UINT32 pNbComp,
-					   OPJ_UINT32 isSigned)
+    OPJ_BYTE * pCodingdata,
+    OPJ_UINT32 n,
+    OPJ_BYTE ** pData,
+    OPJ_UINT32 pNbComp,
+    OPJ_UINT32 isSigned)
 {
-	OPJ_FLOAT32 * lMct = (OPJ_FLOAT32 *) pCodingdata;
-	OPJ_UINT32 i;
-	OPJ_UINT32 j;
-	OPJ_UINT32 k;
-	OPJ_UINT32 lNbMatCoeff = pNbComp * pNbComp;
-	OPJ_INT32 * lCurrentData = 00;
-	OPJ_INT32 * lCurrentMatrix = 00;
-	OPJ_INT32 ** lData = (OPJ_INT32 **) pData;
-	OPJ_UINT32 lMultiplicator = 1 << 13;
-	OPJ_INT32 * lMctPtr;
+    OPJ_FLOAT32 * lMct = (OPJ_FLOAT32 *) pCodingdata;
+    OPJ_UINT32 i;
+    OPJ_UINT32 j;
+    OPJ_UINT32 k;
+    OPJ_UINT32 lNbMatCoeff = pNbComp * pNbComp;
+    OPJ_INT32 * lCurrentData = 00;
+    OPJ_INT32 * lCurrentMatrix = 00;
+    OPJ_INT32 ** lData = (OPJ_INT32 **) pData;
+    OPJ_UINT32 lMultiplicator = 1 << 13;
+    OPJ_INT32 * lMctPtr;
 
     OPJ_ARG_NOT_USED(isSigned);
 
-	lCurrentData = (OPJ_INT32 *) opj_malloc((pNbComp + lNbMatCoeff) * sizeof(OPJ_INT32));
-	if (! lCurrentData) {
-		return OPJ_FALSE;
-	}
+    lCurrentData = (OPJ_INT32 *) opj_malloc((pNbComp + lNbMatCoeff) * sizeof(
+            OPJ_INT32));
+    if (! lCurrentData) {
+        return OPJ_FALSE;
+    }
 
-	lCurrentMatrix = lCurrentData + pNbComp;
+    lCurrentMatrix = lCurrentData + pNbComp;
 
-	for (i =0;i<lNbMatCoeff;++i) {
-		lCurrentMatrix[i] = (OPJ_INT32) (*(lMct++) * (OPJ_FLOAT32)lMultiplicator);
-	}
+    for (i = 0; i < lNbMatCoeff; ++i) {
+        lCurrentMatrix[i] = (OPJ_INT32)(*(lMct++) * (OPJ_FLOAT32)lMultiplicator);
+    }
 
-	for (i = 0; i < n; ++i)  {
-		lMctPtr = lCurrentMatrix;
-		for (j=0;j<pNbComp;++j) {
-			lCurrentData[j] = (*(lData[j]));
-		}
+    for (i = 0; i < n; ++i)  {
+        lMctPtr = lCurrentMatrix;
+        for (j = 0; j < pNbComp; ++j) {
+            lCurrentData[j] = (*(lData[j]));
+        }
 
-		for (j=0;j<pNbComp;++j) {
-			*(lData[j]) = 0;
-			for (k=0;k<pNbComp;++k) {
-				*(lData[j]) += opj_int_fix_mul(*lMctPtr, lCurrentData[k]);
-				++lMctPtr;
-			}
+        for (j = 0; j < pNbComp; ++j) {
+            *(lData[j]) = 0;
+            for (k = 0; k < pNbComp; ++k) {
+                *(lData[j]) += opj_int_fix_mul(*lMctPtr, lCurrentData[k]);
+                ++lMctPtr;
+            }
 
-			++lData[j];
-		}
-	}
+            ++lData[j];
+        }
+    }
 
-	opj_free(lCurrentData);
+    opj_free(lCurrentData);
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 OPJ_BOOL opj_mct_decode_custom(
-					   OPJ_BYTE * pDecodingData,
-					   OPJ_UINT32 n,
-					   OPJ_BYTE ** pData,
-					   OPJ_UINT32 pNbComp,
-					   OPJ_UINT32 isSigned)
+    OPJ_BYTE * pDecodingData,
+    OPJ_UINT32 n,
+    OPJ_BYTE ** pData,
+    OPJ_UINT32 pNbComp,
+    OPJ_UINT32 isSigned)
 {
-	OPJ_FLOAT32 * lMct;
-	OPJ_UINT32 i;
-	OPJ_UINT32 j;
-	OPJ_UINT32 k;
+    OPJ_FLOAT32 * lMct;
+    OPJ_UINT32 i;
+    OPJ_UINT32 j;
+    OPJ_UINT32 k;
 
-	OPJ_FLOAT32 * lCurrentData = 00;
-	OPJ_FLOAT32 * lCurrentResult = 00;
-	OPJ_FLOAT32 ** lData = (OPJ_FLOAT32 **) pData;
+    OPJ_FLOAT32 * lCurrentData = 00;
+    OPJ_FLOAT32 * lCurrentResult = 00;
+    OPJ_FLOAT32 ** lData = (OPJ_FLOAT32 **) pData;
 
     OPJ_ARG_NOT_USED(isSigned);
 
-	lCurrentData = (OPJ_FLOAT32 *) opj_malloc (2 * pNbComp * sizeof(OPJ_FLOAT32));
-	if (! lCurrentData) {
-		return OPJ_FALSE;
-	}
-	lCurrentResult = lCurrentData + pNbComp;
+    lCurrentData = (OPJ_FLOAT32 *) opj_malloc(2 * pNbComp * sizeof(OPJ_FLOAT32));
+    if (! lCurrentData) {
+        return OPJ_FALSE;
+    }
+    lCurrentResult = lCurrentData + pNbComp;
 
-	for (i = 0; i < n; ++i) {
-		lMct = (OPJ_FLOAT32 *) pDecodingData;
-		for (j=0;j<pNbComp;++j) {
-			lCurrentData[j] = (OPJ_FLOAT32) (*(lData[j]));
-		}
-		for (j=0;j<pNbComp;++j) {
-			lCurrentResult[j] = 0;
-			for	(k=0;k<pNbComp;++k)	{
-				lCurrentResult[j] += *(lMct++) * lCurrentData[k];
-			}
-			*(lData[j]++) = (OPJ_FLOAT32) (lCurrentResult[j]);
-		}
-	}
-	opj_free(lCurrentData);
-	return OPJ_TRUE;
+    for (i = 0; i < n; ++i) {
+        lMct = (OPJ_FLOAT32 *) pDecodingData;
+        for (j = 0; j < pNbComp; ++j) {
+            lCurrentData[j] = (OPJ_FLOAT32)(*(lData[j]));
+        }
+        for (j = 0; j < pNbComp; ++j) {
+            lCurrentResult[j] = 0;
+            for (k = 0; k < pNbComp; ++k) {
+                lCurrentResult[j] += *(lMct++) * lCurrentData[k];
+            }
+            *(lData[j]++) = (OPJ_FLOAT32)(lCurrentResult[j]);
+        }
+    }
+    opj_free(lCurrentData);
+    return OPJ_TRUE;
 }
 
-void opj_calculate_norms(	OPJ_FLOAT64 * pNorms,
-							OPJ_UINT32 pNbComps,
-							OPJ_FLOAT32 * pMatrix)
+void opj_calculate_norms(OPJ_FLOAT64 * pNorms,
+                         OPJ_UINT32 pNbComps,
+                         OPJ_FLOAT32 * pMatrix)
 {
-	OPJ_UINT32 i,j,lIndex;
-	OPJ_FLOAT32 lCurrentValue;
-	OPJ_FLOAT64 * lNorms = (OPJ_FLOAT64 *) pNorms;
-	OPJ_FLOAT32 * lMatrix = (OPJ_FLOAT32 *) pMatrix;
+    OPJ_UINT32 i, j, lIndex;
+    OPJ_FLOAT32 lCurrentValue;
+    OPJ_FLOAT64 * lNorms = (OPJ_FLOAT64 *) pNorms;
+    OPJ_FLOAT32 * lMatrix = (OPJ_FLOAT32 *) pMatrix;
 
-	for	(i=0;i<pNbComps;++i) {
-		lNorms[i] = 0;
-		lIndex = i;
+    for (i = 0; i < pNbComps; ++i) {
+        lNorms[i] = 0;
+        lIndex = i;
 
-		for	(j=0;j<pNbComps;++j) {
-			lCurrentValue = lMatrix[lIndex];
-			lIndex += pNbComps;
-			lNorms[i] += lCurrentValue * lCurrentValue;
-		}
-		lNorms[i] = sqrt(lNorms[i]);
-	}
+        for (j = 0; j < pNbComps; ++j) {
+            lCurrentValue = lMatrix[lIndex];
+            lIndex += pNbComps;
+            lNorms[i] += lCurrentValue * lCurrentValue;
+        }
+        lNorms[i] = sqrt(lNorms[i]);
+    }
 }
diff --git a/third_party/libopenjpeg20/mct.h b/third_party/libopenjpeg20/mct.h
index 1c1f4d0..0ed980e 100644
--- a/third_party/libopenjpeg20/mct.h
+++ b/third_party/libopenjpeg20/mct.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,10 +8,10 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -37,8 +37,8 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef __MCT_H
-#define __MCT_H
+#ifndef OPJ_MCT_H
+#define OPJ_MCT_H
 /**
 @file mct.h
 @brief Implementation of a multi-component transforms (MCT)
@@ -60,7 +60,8 @@
 @param c2 Samples blue component
 @param n Number of samples for each component
 */
-void opj_mct_encode(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);
+void opj_mct_encode(OPJ_INT32* OPJ_RESTRICT c0, OPJ_INT32* OPJ_RESTRICT c1,
+                    OPJ_INT32* OPJ_RESTRICT c2, OPJ_UINT32 n);
 /**
 Apply a reversible multi-component inverse transform to an image
 @param c0 Samples for luminance component
@@ -68,11 +69,12 @@
 @param c2 Samples for blue chrominance component
 @param n Number of samples for each component
 */
-void opj_mct_decode(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);
+void opj_mct_decode(OPJ_INT32* OPJ_RESTRICT c0, OPJ_INT32* OPJ_RESTRICT c1,
+                    OPJ_INT32* OPJ_RESTRICT c2, OPJ_UINT32 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 
+@return
 */
 OPJ_FLOAT64 opj_mct_getnorm(OPJ_UINT32 compno);
 
@@ -83,7 +85,8 @@
 @param c2 Samples blue component
 @param n Number of samples for each component
 */
-void opj_mct_encode_real(OPJ_INT32 *c0, OPJ_INT32 *c1, OPJ_INT32 *c2, OPJ_UINT32 n);
+void opj_mct_encode_real(OPJ_INT32* OPJ_RESTRICT c0, OPJ_INT32* OPJ_RESTRICT c1,
+                         OPJ_INT32* OPJ_RESTRICT c2, OPJ_UINT32 n);
 /**
 Apply an irreversible multi-component inverse transform to an image
 @param c0 Samples for luminance component
@@ -91,11 +94,12 @@
 @param c2 Samples for blue chrominance component
 @param n Number of samples for each component
 */
-void opj_mct_decode_real(OPJ_FLOAT32* c0, OPJ_FLOAT32* c1, OPJ_FLOAT32* c2, OPJ_UINT32 n);
+void opj_mct_decode_real(OPJ_FLOAT32* OPJ_RESTRICT c0,
+                         OPJ_FLOAT32* OPJ_RESTRICT c1, OPJ_FLOAT32* OPJ_RESTRICT c2, OPJ_UINT32 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 
+@return
 */
 OPJ_FLOAT64 opj_mct_getnorm_real(OPJ_UINT32 compno);
 
@@ -109,11 +113,11 @@
 @return OPJ_FALSE if function encounter a problem, OPJ_TRUE otherwise
 */
 OPJ_BOOL opj_mct_encode_custom(
-					   OPJ_BYTE * p_coding_data,
-					   OPJ_UINT32 n,
-					   OPJ_BYTE ** p_data,
-					   OPJ_UINT32 p_nb_comp,
-					   OPJ_UINT32 is_signed);
+    OPJ_BYTE * p_coding_data,
+    OPJ_UINT32 n,
+    OPJ_BYTE ** p_data,
+    OPJ_UINT32 p_nb_comp,
+    OPJ_UINT32 is_signed);
 /**
 FIXME DOC
 @param pDecodingData    MCT data
@@ -124,32 +128,32 @@
 @return OPJ_FALSE if function encounter a problem, OPJ_TRUE otherwise
 */
 OPJ_BOOL opj_mct_decode_custom(
-					   OPJ_BYTE * pDecodingData,
-					   OPJ_UINT32 n,
-					   OPJ_BYTE ** pData,
-					   OPJ_UINT32 pNbComp,
-					   OPJ_UINT32 isSigned);
+    OPJ_BYTE * pDecodingData,
+    OPJ_UINT32 n,
+    OPJ_BYTE ** pData,
+    OPJ_UINT32 pNbComp,
+    OPJ_UINT32 isSigned);
 /**
 FIXME DOC
 @param pNorms           MCT data
 @param p_nb_comps       size of components
 @param pMatrix          components
-@return 
+@return
 */
-void opj_calculate_norms(   OPJ_FLOAT64 * pNorms,
-                            OPJ_UINT32 p_nb_comps,
-                            OPJ_FLOAT32 * pMatrix);
+void opj_calculate_norms(OPJ_FLOAT64 * pNorms,
+                         OPJ_UINT32 p_nb_comps,
+                         OPJ_FLOAT32 * pMatrix);
 /**
-FIXME DOC 
+FIXME DOC
 */
-const OPJ_FLOAT64 * opj_mct_get_mct_norms (void);
+const OPJ_FLOAT64 * opj_mct_get_mct_norms(void);
 /**
-FIXME DOC 
+FIXME DOC
 */
-const OPJ_FLOAT64 * opj_mct_get_mct_norms_real (void);
+const OPJ_FLOAT64 * opj_mct_get_mct_norms_real(void);
 /* ----------------------------------------------------------------------- */
 /*@}*/
 
 /*@}*/
 
-#endif /* __MCT_H */
+#endif /* OPJ_MCT_H */
diff --git a/third_party/libopenjpeg20/mqc.c b/third_party/libopenjpeg20/mqc.c
index 7e0f563..8f69e29 100644
--- a/third_party/libopenjpeg20/mqc.c
+++ b/third_party/libopenjpeg20/mqc.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,7 +8,7 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
@@ -38,6 +38,8 @@
 
 #include "opj_includes.h"
 
+#include <assert.h>
+
 /** @defgroup MQC MQC - Implementation of an MQ-Coder */
 /*@{*/
 
@@ -70,28 +72,6 @@
 @param mqc MQC handle
 */
 static void opj_mqc_setbits(opj_mqc_t *mqc);
-/**
-FIXME DOC
-@param mqc MQC handle
-@return 
-*/
-static INLINE OPJ_INT32 opj_mqc_mpsexchange(opj_mqc_t *const mqc);
-/**
-FIXME DOC
-@param mqc MQC handle
-@return 
-*/
-static INLINE OPJ_INT32 opj_mqc_lpsexchange(opj_mqc_t *const mqc);
-/**
-Input a byte
-@param mqc MQC handle
-*/
-static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc);
-/**
-Renormalize mqc->a and mqc->c while decoding
-@param mqc MQC handle
-*/
-static INLINE void opj_mqc_renormd(opj_mqc_t *const mqc);
 /*@}*/
 
 /*@}*/
@@ -100,515 +80,481 @@
 /* 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]},
+    {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 opj_mqc_byteout(opj_mqc_t *mqc) {
-	if (*mqc->bp == 0xff) {
-		mqc->bp++;
-		*mqc->bp = (OPJ_BYTE)(mqc->c >> 20);
-		mqc->c &= 0xfffff;
-		mqc->ct = 7;
-	} else {
-		if ((mqc->c & 0x8000000) == 0) {	/* ((mqc->c&0x8000000)==0) CHANGE */
-			mqc->bp++;
-			*mqc->bp = (OPJ_BYTE)(mqc->c >> 19);
-			mqc->c &= 0x7ffff;
-			mqc->ct = 8;
-		} else {
-			(*mqc->bp)++;
-			if (*mqc->bp == 0xff) {
-				mqc->c &= 0x7ffffff;
-				mqc->bp++;
-				*mqc->bp = (OPJ_BYTE)(mqc->c >> 20);
-				mqc->c &= 0xfffff;
-				mqc->ct = 7;
-			} else {
-				mqc->bp++;
-				*mqc->bp = (OPJ_BYTE)(mqc->c >> 19);
-				mqc->c &= 0x7ffff;
-				mqc->ct = 8;
-			}
-		}
-	}
+static void opj_mqc_byteout(opj_mqc_t *mqc)
+{
+    /* bp is initialized to start - 1 in opj_mqc_init_enc() */
+    /* but this is safe, see opj_tcd_code_block_enc_allocate_data() */
+    assert(mqc->bp >= mqc->start - 1);
+    if (*mqc->bp == 0xff) {
+        mqc->bp++;
+        *mqc->bp = (OPJ_BYTE)(mqc->c >> 20);
+        mqc->c &= 0xfffff;
+        mqc->ct = 7;
+    } else {
+        if ((mqc->c & 0x8000000) == 0) {
+            mqc->bp++;
+            *mqc->bp = (OPJ_BYTE)(mqc->c >> 19);
+            mqc->c &= 0x7ffff;
+            mqc->ct = 8;
+        } else {
+            (*mqc->bp)++;
+            if (*mqc->bp == 0xff) {
+                mqc->c &= 0x7ffffff;
+                mqc->bp++;
+                *mqc->bp = (OPJ_BYTE)(mqc->c >> 20);
+                mqc->c &= 0xfffff;
+                mqc->ct = 7;
+            } else {
+                mqc->bp++;
+                *mqc->bp = (OPJ_BYTE)(mqc->c >> 19);
+                mqc->c &= 0x7ffff;
+                mqc->ct = 8;
+            }
+        }
+    }
 }
 
-static void opj_mqc_renorme(opj_mqc_t *mqc) {
-	do {
-		mqc->a <<= 1;
-		mqc->c <<= 1;
-		mqc->ct--;
-		if (mqc->ct == 0) {
-			opj_mqc_byteout(mqc);
-		}
-	} while ((mqc->a & 0x8000) == 0);
+static void opj_mqc_renorme(opj_mqc_t *mqc)
+{
+    do {
+        mqc->a <<= 1;
+        mqc->c <<= 1;
+        mqc->ct--;
+        if (mqc->ct == 0) {
+            opj_mqc_byteout(mqc);
+        }
+    } while ((mqc->a & 0x8000) == 0);
 }
 
-static void opj_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;
-		opj_mqc_renorme(mqc);
-	} else {
-		mqc->c += (*mqc->curctx)->qeval;
-	}
+static void opj_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;
+        opj_mqc_renorme(mqc);
+    } else {
+        mqc->c += (*mqc->curctx)->qeval;
+    }
 }
 
-static void opj_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;
-	opj_mqc_renorme(mqc);
+static void opj_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;
+    opj_mqc_renorme(mqc);
 }
 
-static void opj_mqc_setbits(opj_mqc_t *mqc) {
-	OPJ_UINT32 tempc = mqc->c + mqc->a;
-	mqc->c |= 0xffff;
-	if (mqc->c >= tempc) {
-		mqc->c -= 0x8000;
-	}
+static void opj_mqc_setbits(opj_mqc_t *mqc)
+{
+    OPJ_UINT32 tempc = mqc->c + mqc->a;
+    mqc->c |= 0xffff;
+    if (mqc->c >= tempc) {
+        mqc->c -= 0x8000;
+    }
 }
 
-static INLINE OPJ_INT32 opj_mqc_mpsexchange(opj_mqc_t *const mqc) {
-	OPJ_INT32 d;
-	if (mqc->a < (*mqc->curctx)->qeval) {
-		d = (OPJ_INT32)(1 - (*mqc->curctx)->mps);
-		*mqc->curctx = (*mqc->curctx)->nlps;
-	} else {
-		d = (OPJ_INT32)(*mqc->curctx)->mps;
-		*mqc->curctx = (*mqc->curctx)->nmps;
-	}
-	
-	return d;
-}
-
-static INLINE OPJ_INT32 opj_mqc_lpsexchange(opj_mqc_t *const mqc) {
-	OPJ_INT32 d;
-	if (mqc->a < (*mqc->curctx)->qeval) {
-		mqc->a = (*mqc->curctx)->qeval;
-		d = (OPJ_INT32)(*mqc->curctx)->mps;
-		*mqc->curctx = (*mqc->curctx)->nmps;
-	} else {
-		mqc->a = (*mqc->curctx)->qeval;
-		d = (OPJ_INT32)(1 - (*mqc->curctx)->mps);
-		*mqc->curctx = (*mqc->curctx)->nlps;
-	}
-	
-	return d;
-}
-
-#ifdef MQC_PERF_OPT
-static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc) {
-	unsigned int i = *((unsigned int *) mqc->bp);
-	mqc->c += i & 0xffff00;
-	mqc->ct = i & 0x0f;
-	mqc->bp += (i >> 2) & 0x04;
-}
-#else
-static void opj_mqc_bytein(opj_mqc_t *const mqc) {
-	if (mqc->bp != mqc->end) {
-		OPJ_UINT32 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;
-	}
-}
-#endif
-
-static INLINE void opj_mqc_renormd(opj_mqc_t *const mqc) {
-	do {
-		if (mqc->ct == 0) {
-			opj_mqc_bytein(mqc);
-		}
-		mqc->a <<= 1;
-		mqc->c <<= 1;
-		mqc->ct--;
-	} while (mqc->a < 0x8000);
-}
-
-/* 
+/*
 ==========================================================
    MQ-Coder interface
 ==========================================================
 */
 
-opj_mqc_t* opj_mqc_create(void) {
-	opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
-#ifdef MQC_PERF_OPT
-	if (mqc) {
-		mqc->buffer = NULL;
-	}
-#endif
-	return mqc;
-}
-
-void opj_mqc_destroy(opj_mqc_t *mqc) {
-	if(mqc) {
-#ifdef MQC_PERF_OPT
-		if (mqc->buffer) {
-			opj_free(mqc->buffer);
-		}
-#endif
-		opj_free(mqc);
-	}
-}
-
-OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc) {
-	const ptrdiff_t diff = mqc->bp - mqc->start;
+OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc)
+{
+    const ptrdiff_t diff = mqc->bp - mqc->start;
 #if 0
-  assert( diff <= 0xffffffff && diff >= 0 ); /* UINT32_MAX */
+    assert(diff <= 0xffffffff && diff >= 0);   /* UINT32_MAX */
 #endif
-	return (OPJ_UINT32)diff;
+    return (OPJ_UINT32)diff;
 }
 
-void opj_mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp) {
-    /* TODO MSD: need to take a look to the v2 version */
-	opj_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 opj_mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp)
+{
+    /* To avoid the curctx pointer to be dangling, but not strictly */
+    /* required as the current context is always set before encoding */
+    opj_mqc_setcurctx(mqc, 0);
+
+    /* As specified in Figure C.10 - Initialization of the encoder */
+    /* (C.2.8 Initialization of the encoder (INITENC)) */
+    mqc->a = 0x8000;
+    mqc->c = 0;
+    /* Yes, we point before the start of the buffer, but this is safe */
+    /* given opj_tcd_code_block_enc_allocate_data() */
+    mqc->bp = bp - 1;
+    mqc->ct = 12;
+    /* At this point we should test *(mqc->bp) against 0xFF, but this is not */
+    /* necessary, as this is only used at the beginning of the code block */
+    /* and our initial fake byte is set at 0 */
+    assert(*(mqc->bp) != 0xff);
+
+    mqc->start = bp;
+    mqc->end_of_byte_stream_counter = 0;
 }
 
-void opj_mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d) {
-	if ((*mqc->curctx)->mps == d) {
-		opj_mqc_codemps(mqc);
-	} else {
-		opj_mqc_codelps(mqc);
-	}
+void opj_mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d)
+{
+    if ((*mqc->curctx)->mps == d) {
+        opj_mqc_codemps(mqc);
+    } else {
+        opj_mqc_codelps(mqc);
+    }
 }
 
-void opj_mqc_flush(opj_mqc_t *mqc) {
-	opj_mqc_setbits(mqc);
-	mqc->c <<= mqc->ct;
-	opj_mqc_byteout(mqc);
-	mqc->c <<= mqc->ct;
-	opj_mqc_byteout(mqc);
-	
-	if (*mqc->bp != 0xff) {
-		mqc->bp++;
-	}
+void opj_mqc_flush(opj_mqc_t *mqc)
+{
+    /* C.2.9 Termination of coding (FLUSH) */
+    /* Figure C.11 – FLUSH procedure */
+    opj_mqc_setbits(mqc);
+    mqc->c <<= mqc->ct;
+    opj_mqc_byteout(mqc);
+    mqc->c <<= mqc->ct;
+    opj_mqc_byteout(mqc);
+
+    /* It is forbidden that a coding pass ends with 0xff */
+    if (*mqc->bp != 0xff) {
+        /* Advance pointer so that opj_mqc_numbytes() returns a valid value */
+        mqc->bp++;
+    }
 }
 
-void opj_mqc_bypass_init_enc(opj_mqc_t *mqc) {
-	mqc->c = 0;
-	mqc->ct = 8;
-	/*if (*mqc->bp == 0xff) {
-	mqc->ct = 7;
-     } */
+#define BYPASS_CT_INIT  0xDEADBEEF
+
+void opj_mqc_bypass_init_enc(opj_mqc_t *mqc)
+{
+    /* This function is normally called after at least one opj_mqc_flush() */
+    /* which will have advance mqc->bp by at least 2 bytes beyond its */
+    /* initial position */
+    assert(mqc->bp >= mqc->start);
+    mqc->c = 0;
+    /* in theory we should initialize to 8, but use this special value */
+    /* as a hint that opj_mqc_bypass_enc() has never been called, so */
+    /* as to avoid the 0xff 0x7f elimination trick in opj_mqc_bypass_flush_enc() */
+    /* to trigger when we don't have output any bit during this bypass sequence */
+    /* Any value > 8 will do */
+    mqc->ct = BYPASS_CT_INIT;
+    /* Given that we are called after opj_mqc_flush(), the previous byte */
+    /* cannot be 0xff. */
+    assert(mqc->bp[-1] != 0xff);
 }
 
-void opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d) {
-	mqc->ct--;
-	mqc->c = mqc->c + (d << mqc->ct);
-	if (mqc->ct == 0) {
-		mqc->bp++;
-		*mqc->bp = (OPJ_BYTE)mqc->c;
-		mqc->ct = 8;
-		if (*mqc->bp == 0xff) {
-			mqc->ct = 7;
-		}
-		mqc->c = 0;
-	}
-}
-
-OPJ_UINT32 opj_mqc_bypass_flush_enc(opj_mqc_t *mqc) {
-	OPJ_BYTE bit_padding;
-	
-	bit_padding = 0;
-	
-	if (mqc->ct != 0) {
-		while (mqc->ct > 0) {
-			mqc->ct--;
-			mqc->c += (OPJ_UINT32)(bit_padding << mqc->ct);
-			bit_padding = (bit_padding + 1) & 0x01;
-		}
-		mqc->bp++;
-		*mqc->bp = (OPJ_BYTE)mqc->c;
-		mqc->ct = 8;
-		mqc->c = 0;
-	}
-	
-	return 1;
-}
-
-void opj_mqc_reset_enc(opj_mqc_t *mqc) {
-	opj_mqc_resetstates(mqc);
-	opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
-	opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
-	opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
-}
-
-OPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc) {
-	OPJ_UINT32 correction = 1;
-	
-	/* <flush part> */
-	OPJ_INT32 n = (OPJ_INT32)(27 - 15 - mqc->ct);
-	mqc->c <<= mqc->ct;
-	while (n > 0) {
-		opj_mqc_byteout(mqc);
-		n -= (OPJ_INT32)mqc->ct;
-		mqc->c <<= mqc->ct;
-	}
-	opj_mqc_byteout(mqc);
-	
-	return correction;
-}
-
-void opj_mqc_restart_init_enc(opj_mqc_t *mqc) {
-	/* <Re-init part> */
-	opj_mqc_setcurctx(mqc, 0);
-	mqc->a = 0x8000;
-	mqc->c = 0;
-	mqc->ct = 12;
-	mqc->bp--;
-	if (*mqc->bp == 0xff) {
-		mqc->ct = 13;
-	}
-}
-
-void opj_mqc_erterm_enc(opj_mqc_t *mqc) {
-	OPJ_INT32 k = (OPJ_INT32)(11 - mqc->ct + 1);
-	
-	while (k > 0) {
-		mqc->c <<= mqc->ct;
-		mqc->ct = 0;
-		opj_mqc_byteout(mqc);
-		k -= (OPJ_INT32)mqc->ct;
-	}
-	
-	if (*mqc->bp != 0xff) {
-		opj_mqc_byteout(mqc);
-	}
-}
-
-void opj_mqc_segmark_enc(opj_mqc_t *mqc) {
-	OPJ_UINT32 i;
-	opj_mqc_setcurctx(mqc, 18);
-	
-	for (i = 1; i < 5; i++) {
-		opj_mqc_encode(mqc, i % 2);
-	}
-}
-
-OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len) {
-	opj_mqc_setcurctx(mqc, 0);
-	mqc->start = bp;
-	mqc->end = bp + len;
-	mqc->bp = bp;
-	if (len==0) mqc->c = 0xff << 16;
-	else mqc->c = (OPJ_UINT32)(*mqc->bp << 16);
-
-#ifdef MQC_PERF_OPT /* TODO_MSD: check this option and put in experimental */
-	{
-        OPJ_UINT32 c;
-		OPJ_UINT32 *ip;
-		OPJ_BYTE *end = mqc->end - 1;
-        void* new_buffer = opj_realloc(mqc->buffer, (len + 1) * sizeof(OPJ_UINT32));
-        if (! new_buffer) {
-            opj_free(mqc->buffer);
-            mqc->buffer = NULL;
-            return OPJ_FALSE;
+void opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d)
+{
+    if (mqc->ct == BYPASS_CT_INIT) {
+        mqc->ct = 8;
+    }
+    mqc->ct--;
+    mqc->c = mqc->c + (d << mqc->ct);
+    if (mqc->ct == 0) {
+        *mqc->bp = (OPJ_BYTE)mqc->c;
+        mqc->ct = 8;
+        /* If the previous byte was 0xff, make sure that the next msb is 0 */
+        if (*mqc->bp == 0xff) {
+            mqc->ct = 7;
         }
-        mqc->buffer = new_buffer;
-		
-        ip = (OPJ_UINT32 *) mqc->buffer;
+        mqc->bp++;
+        mqc->c = 0;
+    }
+}
 
-		while (bp < end) {
-			c = *(bp + 1);
-			if (*bp == 0xff) {
-				if (c > 0x8f) {
-					break;
-				} else {
-					*ip = 0x00000017 | (c << 9);
-				}
-			} else {
-				*ip = 0x00000018 | (c << 8);
-			}
-			bp++;
-			ip++;
-		}
+OPJ_UINT32 opj_mqc_bypass_get_extra_bytes(opj_mqc_t *mqc, OPJ_BOOL erterm)
+{
+    return (mqc->ct < 7 ||
+            (mqc->ct == 7 && (erterm || mqc->bp[-1] != 0xff))) ? 1 : 0;
+}
 
-		/* Handle last byte of data */
-		c = 0xff;
-		if (*bp == 0xff) {
-			*ip = 0x0000ff18;
-		} else {
-			bp++;
-			*ip = 0x00000018 | (c << 8);
-		}
-		ip++;
+void opj_mqc_bypass_flush_enc(opj_mqc_t *mqc, OPJ_BOOL erterm)
+{
+    /* Is there any bit remaining to be flushed ? */
+    /* If the last output byte is 0xff, we can discard it, unless */
+    /* erterm is required (I'm not completely sure why in erterm */
+    /* we must output 0xff 0x2a if the last byte was 0xff instead of */
+    /* discarding it, but Kakadu requires it when decoding */
+    /* in -fussy mode) */
+    if (mqc->ct < 7 || (mqc->ct == 7 && (erterm || mqc->bp[-1] != 0xff))) {
+        OPJ_BYTE bit_value = 0;
+        /* If so, fill the remaining lsbs with an alternating sequence of */
+        /* 0,1,... */
+        /* Note: it seems the standard only requires that for a ERTERM flush */
+        /* and doesn't specify what to do for a regular BYPASS flush */
+        while (mqc->ct > 0) {
+            mqc->ct--;
+            mqc->c += (OPJ_UINT32)(bit_value << mqc->ct);
+            bit_value = (OPJ_BYTE)(1U - bit_value);
+        }
+        *mqc->bp = (OPJ_BYTE)mqc->c;
+        /* Advance pointer so that opj_mqc_numbytes() returns a valid value */
+        mqc->bp++;
+    } else if (mqc->ct == 7 && mqc->bp[-1] == 0xff) {
+        /* Discard last 0xff */
+        assert(!erterm);
+        mqc->bp --;
+    } else if (mqc->ct == 8 && !erterm &&
+               mqc->bp[-1] == 0x7f && mqc->bp[-2] == 0xff) {
+        /* Tiny optimization: discard terminating 0xff 0x7f since it is */
+        /* interpreted as 0xff 0x7f [0xff 0xff] by the decoder, and given */
+        /* the bit stuffing, in fact as 0xff 0xff [0xff ..] */
+        /* Happens once on opj_compress -i ../MAPA.tif -o MAPA.j2k  -M 1 */
+        mqc->bp -= 2;
+    }
 
-		*ip = 0x0000ff08;
-		mqc->bp = mqc->buffer;
-	}
+    assert(mqc->bp[-1] != 0xff);
+}
+
+void opj_mqc_reset_enc(opj_mqc_t *mqc)
+{
+    opj_mqc_resetstates(mqc);
+    opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+    opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+    opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+}
+
+#ifdef notdef
+OPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc)
+{
+    OPJ_UINT32 correction = 1;
+
+    /* <flush part> */
+    OPJ_INT32 n = (OPJ_INT32)(27 - 15 - mqc->ct);
+    mqc->c <<= mqc->ct;
+    while (n > 0) {
+        opj_mqc_byteout(mqc);
+        n -= (OPJ_INT32)mqc->ct;
+        mqc->c <<= mqc->ct;
+    }
+    opj_mqc_byteout(mqc);
+
+    return correction;
+}
 #endif
-	opj_mqc_bytein(mqc);
-	mqc->c <<= 7;
-	mqc->ct -= 7;
-	mqc->a = 0x8000;
-        return OPJ_TRUE;
+
+void opj_mqc_restart_init_enc(opj_mqc_t *mqc)
+{
+    /* <Re-init part> */
+
+    /* As specified in Figure C.10 - Initialization of the encoder */
+    /* (C.2.8 Initialization of the encoder (INITENC)) */
+    mqc->a = 0x8000;
+    mqc->c = 0;
+    mqc->ct = 12;
+    /* This function is normally called after at least one opj_mqc_flush() */
+    /* which will have advance mqc->bp by at least 2 bytes beyond its */
+    /* initial position */
+    mqc->bp --;
+    assert(mqc->bp >= mqc->start - 1);
+    assert(*mqc->bp != 0xff);
+    if (*mqc->bp == 0xff) {
+        mqc->ct = 13;
+    }
 }
 
-OPJ_INT32 opj_mqc_decode(opj_mqc_t *const mqc) {
-	OPJ_INT32 d;
-	mqc->a -= (*mqc->curctx)->qeval;
-	if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
-		d = opj_mqc_lpsexchange(mqc);
-		opj_mqc_renormd(mqc);
-	} else {
-		mqc->c -= (*mqc->curctx)->qeval << 16;
-		if ((mqc->a & 0x8000) == 0) {
-			d = opj_mqc_mpsexchange(mqc);
-			opj_mqc_renormd(mqc);
-		} else {
-			d = (OPJ_INT32)(*mqc->curctx)->mps;
-		}
-	}
+void opj_mqc_erterm_enc(opj_mqc_t *mqc)
+{
+    OPJ_INT32 k = (OPJ_INT32)(11 - mqc->ct + 1);
 
-	return d;
+    while (k > 0) {
+        mqc->c <<= mqc->ct;
+        mqc->ct = 0;
+        opj_mqc_byteout(mqc);
+        k -= (OPJ_INT32)mqc->ct;
+    }
+
+    if (*mqc->bp != 0xff) {
+        opj_mqc_byteout(mqc);
+    }
 }
 
-void opj_mqc_resetstates(opj_mqc_t *mqc) {
-	OPJ_UINT32 i;
-	for (i = 0; i < MQC_NUMCTXS; i++) {
-		mqc->ctxs[i] = mqc_states;
-	}
+void opj_mqc_segmark_enc(opj_mqc_t *mqc)
+{
+    OPJ_UINT32 i;
+    opj_mqc_setcurctx(mqc, 18);
+
+    for (i = 1; i < 5; i++) {
+        opj_mqc_encode(mqc, i % 2);
+    }
 }
 
-void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb, OPJ_INT32 prob) {
-	mqc->ctxs[ctxno] = &mqc_states[msb + (OPJ_UINT32)(prob << 1)];
+static void opj_mqc_init_dec_common(opj_mqc_t *mqc,
+                                    OPJ_BYTE *bp,
+                                    OPJ_UINT32 len,
+                                    OPJ_UINT32 extra_writable_bytes)
+{
+    (void)extra_writable_bytes;
+
+    assert(extra_writable_bytes >= OPJ_COMMON_CBLK_DATA_EXTRA);
+    mqc->start = bp;
+    mqc->end = bp + len;
+    /* Insert an artificial 0xFF 0xFF marker at end of the code block */
+    /* data so that the bytein routines stop on it. This saves us comparing */
+    /* the bp and end pointers */
+    /* But before inserting it, backup th bytes we will overwrite */
+    memcpy(mqc->backup, mqc->end, OPJ_COMMON_CBLK_DATA_EXTRA);
+    mqc->end[0] = 0xFF;
+    mqc->end[1] = 0xFF;
+    mqc->bp = bp;
+}
+void opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len,
+                      OPJ_UINT32 extra_writable_bytes)
+{
+    /* Implements ISO 15444-1 C.3.5 Initialization of the decoder (INITDEC) */
+    /* Note: alternate "J.1 - Initialization of the software-conventions */
+    /* decoder" has been tried, but does */
+    /* not bring any improvement. */
+    /* See https://github.com/uclouvain/openjpeg/issues/921 */
+    opj_mqc_init_dec_common(mqc, bp, len, extra_writable_bytes);
+    opj_mqc_setcurctx(mqc, 0);
+    mqc->end_of_byte_stream_counter = 0;
+    if (len == 0) {
+        mqc->c = 0xff << 16;
+    } else {
+        mqc->c = (OPJ_UINT32)(*mqc->bp << 16);
+    }
+
+    opj_mqc_bytein(mqc);
+    mqc->c <<= 7;
+    mqc->ct -= 7;
+    mqc->a = 0x8000;
+}
+
+
+void opj_mqc_raw_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len,
+                          OPJ_UINT32 extra_writable_bytes)
+{
+    opj_mqc_init_dec_common(mqc, bp, len, extra_writable_bytes);
+    mqc->c = 0;
+    mqc->ct = 0;
+}
+
+
+void opq_mqc_finish_dec(opj_mqc_t *mqc)
+{
+    /* Restore the bytes overwritten by opj_mqc_init_dec_common() */
+    memcpy(mqc->end, mqc->backup, OPJ_COMMON_CBLK_DATA_EXTRA);
+}
+
+void opj_mqc_resetstates(opj_mqc_t *mqc)
+{
+    OPJ_UINT32 i;
+    for (i = 0; i < MQC_NUMCTXS; i++) {
+        mqc->ctxs[i] = mqc_states;
+    }
+}
+
+void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb,
+                      OPJ_INT32 prob)
+{
+    mqc->ctxs[ctxno] = &mqc_states[msb + (OPJ_UINT32)(prob << 1)];
 }
 
 
diff --git a/third_party/libopenjpeg20/mqc.h b/third_party/libopenjpeg20/mqc.h
index 69a2d46..ac3aff1 100644
--- a/third_party/libopenjpeg20/mqc.h
+++ b/third_party/libopenjpeg20/mqc.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,7 +8,7 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
@@ -36,8 +36,11 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef __MQC_H
-#define __MQC_H
+#ifndef OPJ_MQC_H
+#define OPJ_MQC_H
+
+#include "opj_common.h"
+
 /**
 @file mqc.h
 @brief Implementation of an MQ-Coder (MQC)
@@ -53,14 +56,14 @@
 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) */
-	OPJ_UINT32 qeval;
-	/** the Most Probable Symbol (0 or 1) */
-	OPJ_UINT32 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;
+    /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
+    OPJ_UINT32 qeval;
+    /** the Most Probable Symbol (0 or 1) */
+    OPJ_UINT32 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 19
@@ -69,32 +72,36 @@
 MQ coder
 */
 typedef struct opj_mqc {
-	OPJ_UINT32 c;
-	OPJ_UINT32 a;
-	OPJ_UINT32 ct;
-	OPJ_BYTE *bp;
-	OPJ_BYTE *start;
-	OPJ_BYTE *end;
-	opj_mqc_state_t *ctxs[MQC_NUMCTXS];
-	opj_mqc_state_t **curctx;
-#ifdef MQC_PERF_OPT
-	unsigned char *buffer;
-#endif
+    /** temporary buffer where bits are coded or decoded */
+    OPJ_UINT32 c;
+    /** only used by MQ decoder */
+    OPJ_UINT32 a;
+    /** number of bits already read or free to write */
+    OPJ_UINT32 ct;
+    /* only used by decoder, to count the number of times a terminating 0xFF >0x8F marker is read */
+    OPJ_UINT32 end_of_byte_stream_counter;
+    /** pointer to the current position in the buffer */
+    OPJ_BYTE *bp;
+    /** pointer to the start of the buffer */
+    OPJ_BYTE *start;
+    /** pointer to the end of the buffer */
+    OPJ_BYTE *end;
+    /** Array of contexts */
+    opj_mqc_state_t *ctxs[MQC_NUMCTXS];
+    /** Active context */
+    opj_mqc_state_t **curctx;
+    /* lut_ctxno_zc shifted by (1 << 9) * bandno */
+    const OPJ_BYTE* lut_ctxno_zc_orient;
+    /** Original value of the 2 bytes at end[0] and end[1] */
+    OPJ_BYTE backup[OPJ_COMMON_CBLK_DATA_EXTRA];
 } opj_mqc_t;
 
+#include "mqc_inl.h"
+
 /** @name Exported functions */
 /*@{*/
 /* ----------------------------------------------------------------------- */
-/**
-Create a new MQC handle 
-@return Returns a new MQC handle if successful, returns NULL otherwise
-*/
-opj_mqc_t* opj_mqc_create(void);
-/**
-Destroy a previously created MQC handle
-@param mqc MQC handle to destroy
-*/
-void opj_mqc_destroy(opj_mqc_t *mqc);
+
 /**
 Return the number of bytes written/read since initialisation
 @param mqc MQC handle
@@ -102,7 +109,7 @@
 */
 OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc);
 /**
-Reset the states of all the context of the coder/decoder 
+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
 */
@@ -114,7 +121,8 @@
 @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 opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb, OPJ_INT32 prob);
+void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb,
+                      OPJ_INT32 prob);
 /**
 Initialize the encoder
 @param mqc MQC handle
@@ -126,7 +134,7 @@
 @param mqc MQC handle
 @param ctxno Number that identifies the context
 */
-#define opj_mqc_setcurctx(mqc, ctxno)	(mqc)->curctx = &(mqc)->ctxs[(OPJ_UINT32)(ctxno)]
+#define opj_mqc_setcurctx(mqc, ctxno)   (mqc)->curctx = &(mqc)->ctxs[(OPJ_UINT32)(ctxno)]
 /**
 Encode a symbol using the MQ-coder
 @param mqc MQC handle
@@ -139,38 +147,47 @@
 */
 void opj_mqc_flush(opj_mqc_t *mqc);
 /**
-BYPASS mode switch, initialization operation. 
-JPEG 2000 p 505. 
-<h2>Not fully implemented and tested !!</h2>
+BYPASS mode switch, initialization operation.
+JPEG 2000 p 505.
 @param mqc MQC handle
 */
 void opj_mqc_bypass_init_enc(opj_mqc_t *mqc);
+
+/** Return number of extra bytes to add to opj_mqc_numbytes() for the²
+    size of a non-terminating BYPASS pass
+@param mqc MQC handle
+@param erterm 1 if ERTERM is enabled, 0 otherwise
+*/
+OPJ_UINT32 opj_mqc_bypass_get_extra_bytes(opj_mqc_t *mqc, OPJ_BOOL erterm);
+
 /**
-BYPASS mode switch, coding operation. 
-JPEG 2000 p 505. 
-<h2>Not fully implemented and tested !!</h2>
+BYPASS mode switch, coding operation.
+JPEG 2000 p 505.
 @param mqc MQC handle
 @param d The symbol to be encoded (0 or 1)
 */
 void opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d);
 /**
 BYPASS mode switch, flush operation
-<h2>Not fully implemented and tested !!</h2>
 @param mqc MQC handle
-@return Returns 1 (always)
+@param erterm 1 if ERTERM is enabled, 0 otherwise
 */
-OPJ_UINT32 opj_mqc_bypass_flush_enc(opj_mqc_t *mqc);
+void opj_mqc_bypass_flush_enc(opj_mqc_t *mqc, OPJ_BOOL erterm);
 /**
 RESET mode switch
 @param mqc MQC handle
 */
 void opj_mqc_reset_enc(opj_mqc_t *mqc);
+
+#ifdef notdef
 /**
 RESTART mode switch (TERMALL)
 @param mqc MQC handle
 @return Returns 1 (always)
 */
 OPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc);
+#endif
+
 /**
 RESTART mode switch (TERMALL) reinitialisation
 @param mqc MQC handle
@@ -186,22 +203,69 @@
 @param mqc MQC handle
 */
 void opj_mqc_segmark_enc(opj_mqc_t *mqc);
+
 /**
-Initialize the decoder
+Initialize the decoder for MQ decoding.
+
+opj_mqc_finish_dec() must be absolutely called after finishing the decoding
+passes, so as to restore the bytes temporarily overwritten.
+
 @param mqc MQC handle
 @param bp Pointer to the start of the buffer from which the bytes will be read
+          Note that OPJ_COMMON_CBLK_DATA_EXTRA bytes at the end of the buffer
+          will be temporarily overwritten with an artificial 0xFF 0xFF marker.
+          (they will be backuped in the mqc structure to be restored later)
+          So bp must be at least len + OPJ_COMMON_CBLK_DATA_EXTRA large, and
+          writable.
 @param len Length of the input buffer
+@param extra_writable_bytes Indicate how many bytes after len are writable.
+                            This is to indicate your consent that bp must be
+                            large enough.
 */
-OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len);
+void opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len,
+                      OPJ_UINT32 extra_writable_bytes);
+
+/**
+Initialize the decoder for RAW decoding.
+
+opj_mqc_finish_dec() must be absolutely called after finishing the decoding
+passes, so as to restore the bytes temporarily overwritten.
+
+@param mqc MQC handle
+@param bp Pointer to the start of the buffer from which the bytes will be read
+          Note that OPJ_COMMON_CBLK_DATA_EXTRA bytes at the end of the buffer
+          will be temporarily overwritten with an artificial 0xFF 0xFF marker.
+          (they will be backuped in the mqc structure to be restored later)
+          So bp must be at least len + OPJ_COMMON_CBLK_DATA_EXTRA large, and
+          writable.
+@param len Length of the input buffer
+@param extra_writable_bytes Indicate how many bytes after len are writable.
+                            This is to indicate your consent that bp must be
+                            large enough.
+*/
+void opj_mqc_raw_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len,
+                          OPJ_UINT32 extra_writable_bytes);
+
+
+/**
+Terminate RAW/MQC decoding
+
+This restores the bytes temporarily overwritten by opj_mqc_init_dec()/
+opj_mqc_raw_init_dec()
+
+@param mqc MQC handle
+*/
+void opq_mqc_finish_dec(opj_mqc_t *mqc);
+
 /**
 Decode a symbol
 @param mqc MQC handle
 @return Returns the decoded symbol (0 or 1)
 */
-OPJ_INT32 opj_mqc_decode(opj_mqc_t * const mqc);
+/*static INLINE OPJ_UINT32 opj_mqc_decode(opj_mqc_t * const mqc);*/
 /* ----------------------------------------------------------------------- */
 /*@}*/
 
 /*@}*/
 
-#endif /* __MQC_H */
+#endif /* OPJ_MQC_H */
diff --git a/third_party/libopenjpeg20/mqc_inl.h b/third_party/libopenjpeg20/mqc_inl.h
new file mode 100644
index 0000000..d95d949
--- /dev/null
+++ b/third_party/libopenjpeg20/mqc_inl.h
@@ -0,0 +1,196 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2014, Professor Benoit Macq
+ * Copyright (c) 2001-2003, David Janssens
+ * Copyright (c) 2002-2003, Yannick Verschueren
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2014, Antonin Descampe
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+ * 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_MQC_INL_H
+#define OPJ_MQC_INL_H
+
+/* For internal use of opj_mqc_decode_macro() */
+#define opj_mqc_mpsexchange_macro(d, curctx, a) \
+{ \
+    if (a < (*curctx)->qeval) { \
+        d = !((*curctx)->mps); \
+        *curctx = (*curctx)->nlps; \
+    } else { \
+        d = (*curctx)->mps; \
+        *curctx = (*curctx)->nmps; \
+    } \
+}
+
+/* For internal use of opj_mqc_decode_macro() */
+#define opj_mqc_lpsexchange_macro(d, curctx, a) \
+{ \
+    if (a < (*curctx)->qeval) { \
+        a = (*curctx)->qeval; \
+        d = (*curctx)->mps; \
+        *curctx = (*curctx)->nmps; \
+    } else { \
+        a = (*curctx)->qeval; \
+        d = !((*curctx)->mps); \
+        *curctx = (*curctx)->nlps; \
+    } \
+}
+
+
+/**
+Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN
+@param mqc MQC handle
+@return Returns the decoded symbol (0 or 1)
+*/
+static INLINE OPJ_UINT32 opj_mqc_raw_decode(opj_mqc_t *mqc)
+{
+    OPJ_UINT32 d;
+    if (mqc->ct == 0) {
+        /* Given opj_mqc_raw_init_dec() we know that at some point we will */
+        /* have a 0xFF 0xFF artificial marker */
+        if (mqc->c == 0xff) {
+            if (*mqc->bp  > 0x8f) {
+                mqc->c = 0xff;
+                mqc->ct = 8;
+            } else {
+                mqc->c = *mqc->bp;
+                mqc->bp ++;
+                mqc->ct = 7;
+            }
+        } else {
+            mqc->c = *mqc->bp;
+            mqc->bp ++;
+            mqc->ct = 8;
+        }
+    }
+    mqc->ct--;
+    d = ((OPJ_UINT32)mqc->c >> mqc->ct) & 0x01U;
+
+    return d;
+}
+
+
+#define opj_mqc_bytein_macro(mqc, c, ct) \
+{ \
+        OPJ_UINT32 l_c;  \
+        /* Given opj_mqc_init_dec() we know that at some point we will */ \
+        /* have a 0xFF 0xFF artificial marker */ \
+        l_c = *(mqc->bp + 1); \
+        if (*mqc->bp == 0xff) { \
+            if (l_c > 0x8f) { \
+                c += 0xff00; \
+                ct = 8; \
+                mqc->end_of_byte_stream_counter ++; \
+            } else { \
+                mqc->bp++; \
+                c += l_c << 9; \
+                ct = 7; \
+            } \
+        } else { \
+            mqc->bp++; \
+            c += l_c << 8; \
+            ct = 8; \
+        } \
+}
+
+/* For internal use of opj_mqc_decode_macro() */
+#define opj_mqc_renormd_macro(mqc, a, c, ct) \
+{ \
+    do { \
+        if (ct == 0) { \
+            opj_mqc_bytein_macro(mqc, c, ct); \
+        } \
+        a <<= 1; \
+        c <<= 1; \
+        ct--; \
+    } while (a < 0x8000); \
+}
+
+#define opj_mqc_decode_macro(d, mqc, curctx, a, c, ct) \
+{ \
+    /* Implements ISO 15444-1 C.3.2 Decoding a decision (DECODE) */ \
+    /* Note: alternate "J.2 - Decoding an MPS or an LPS in the */ \
+    /* software-conventions decoder" has been tried, but does not bring any */ \
+    /* improvement. See https://github.com/uclouvain/openjpeg/issues/921 */ \
+    a -= (*curctx)->qeval;  \
+    if ((c >> 16) < (*curctx)->qeval) {  \
+        opj_mqc_lpsexchange_macro(d, curctx, a);  \
+        opj_mqc_renormd_macro(mqc, a, c, ct);  \
+    } else {  \
+        c -= (*curctx)->qeval << 16;  \
+        if ((a & 0x8000) == 0) { \
+            opj_mqc_mpsexchange_macro(d, curctx, a); \
+            opj_mqc_renormd_macro(mqc, a, c, ct); \
+        } else { \
+            d = (*curctx)->mps; \
+        } \
+    } \
+}
+
+#define DOWNLOAD_MQC_VARIABLES(mqc, curctx, c, a, ct) \
+        register opj_mqc_state_t **curctx = mqc->curctx; \
+        register OPJ_UINT32 c = mqc->c; \
+        register OPJ_UINT32 a = mqc->a; \
+        register OPJ_UINT32 ct = mqc->ct
+
+#define UPLOAD_MQC_VARIABLES(mqc, curctx, c, a, ct) \
+        mqc->curctx = curctx; \
+        mqc->c = c; \
+        mqc->a = a; \
+        mqc->ct = ct;
+
+/**
+Input a byte
+@param mqc MQC handle
+*/
+static INLINE void opj_mqc_bytein(opj_mqc_t *const mqc)
+{
+    opj_mqc_bytein_macro(mqc, mqc->c, mqc->ct);
+}
+
+/**
+Renormalize mqc->a and mqc->c while decoding
+@param mqc MQC handle
+*/
+#define opj_mqc_renormd(mqc) \
+    opj_mqc_renormd_macro(mqc, mqc->a, mqc->c, mqc->ct)
+
+/**
+Decode a symbol
+@param d OPJ_UINT32 value where to store the decoded symbol
+@param mqc MQC handle
+@return Returns the decoded symbol (0 or 1) in d
+*/
+#define opj_mqc_decode(d, mqc) \
+    opj_mqc_decode_macro(d, mqc, mqc->curctx, mqc->a, mqc->c, mqc->ct)
+
+#endif /* OPJ_MQC_INL_H */
diff --git a/third_party/libopenjpeg20/openjpeg.c b/third_party/libopenjpeg20/openjpeg.c
index 5114cc1..4e649a7 100644
--- a/third_party/libopenjpeg20/openjpeg.c
+++ b/third_party/libopenjpeg20/openjpeg.c
@@ -1,11 +1,11 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -41,110 +41,113 @@
 /* ---------------------------------------------------------------------- */
 /* Functions to set the message handlers */
 
-OPJ_BOOL OPJ_CALLCONV opj_set_info_handler(	opj_codec_t * p_codec, 
-											opj_msg_callback p_callback,
-											void * p_user_data)
+OPJ_BOOL OPJ_CALLCONV opj_set_info_handler(opj_codec_t * p_codec,
+        opj_msg_callback p_callback,
+        void * p_user_data)
 {
-	opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
-	if(! l_codec){
-		return OPJ_FALSE;
-	}
-	
-	l_codec->m_event_mgr.info_handler = p_callback;
-	l_codec->m_event_mgr.m_info_data = p_user_data;
-	
-	return OPJ_TRUE;
+    opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+    if (! l_codec) {
+        return OPJ_FALSE;
+    }
+
+    l_codec->m_event_mgr.info_handler = p_callback;
+    l_codec->m_event_mgr.m_info_data = p_user_data;
+
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_set_warning_handler(	opj_codec_t * p_codec, 
-												opj_msg_callback p_callback,
-												void * p_user_data)
+OPJ_BOOL OPJ_CALLCONV opj_set_warning_handler(opj_codec_t * p_codec,
+        opj_msg_callback p_callback,
+        void * p_user_data)
 {
-	opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
-	if (! l_codec) {
-		return OPJ_FALSE;
-	}
-	
-	l_codec->m_event_mgr.warning_handler = p_callback;
-	l_codec->m_event_mgr.m_warning_data = p_user_data;
-	
-	return OPJ_TRUE;
+    opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+    if (! l_codec) {
+        return OPJ_FALSE;
+    }
+
+    l_codec->m_event_mgr.warning_handler = p_callback;
+    l_codec->m_event_mgr.m_warning_data = p_user_data;
+
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_set_error_handler(opj_codec_t * p_codec, 
-											opj_msg_callback p_callback,
-											void * p_user_data)
+OPJ_BOOL OPJ_CALLCONV opj_set_error_handler(opj_codec_t * p_codec,
+        opj_msg_callback p_callback,
+        void * p_user_data)
 {
-	opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
-	if (! l_codec) {
-		return OPJ_FALSE;
-	}
-	
-	l_codec->m_event_mgr.error_handler = p_callback;
-	l_codec->m_event_mgr.m_error_data = p_user_data;
-	
-	return OPJ_TRUE;
+    opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+    if (! l_codec) {
+        return OPJ_FALSE;
+    }
+
+    l_codec->m_event_mgr.error_handler = p_callback;
+    l_codec->m_event_mgr.m_error_data = p_user_data;
+
+    return OPJ_TRUE;
 }
 
 /* ---------------------------------------------------------------------- */
 
-static OPJ_SIZE_T opj_read_from_file (void * p_buffer, OPJ_SIZE_T p_nb_bytes, FILE * p_file)
+static OPJ_SIZE_T opj_read_from_file(void * p_buffer, OPJ_SIZE_T p_nb_bytes,
+                                     FILE * p_file)
 {
-	OPJ_SIZE_T l_nb_read = fread(p_buffer,1,p_nb_bytes,p_file);
-	return l_nb_read ? l_nb_read : (OPJ_SIZE_T)-1;
+    OPJ_SIZE_T l_nb_read = fread(p_buffer, 1, p_nb_bytes, p_file);
+    return l_nb_read ? l_nb_read : (OPJ_SIZE_T) - 1;
 }
 
-static OPJ_UINT64 opj_get_data_length_from_file (FILE * p_file)
+static OPJ_UINT64 opj_get_data_length_from_file(FILE * p_file)
 {
-	OPJ_OFF_T file_length = 0;
+    OPJ_OFF_T file_length = 0;
 
-	OPJ_FSEEK(p_file, 0, SEEK_END);
-	file_length = (OPJ_OFF_T)OPJ_FTELL(p_file);
-	OPJ_FSEEK(p_file, 0, SEEK_SET);
+    OPJ_FSEEK(p_file, 0, SEEK_END);
+    file_length = (OPJ_OFF_T)OPJ_FTELL(p_file);
+    OPJ_FSEEK(p_file, 0, SEEK_SET);
 
-	return (OPJ_UINT64)file_length;
+    return (OPJ_UINT64)file_length;
 }
 
-static OPJ_SIZE_T opj_write_from_file (void * p_buffer, OPJ_SIZE_T p_nb_bytes, FILE * p_file)
+static OPJ_SIZE_T opj_write_from_file(void * p_buffer, OPJ_SIZE_T p_nb_bytes,
+                                      FILE * p_file)
 {
-	return fwrite(p_buffer,1,p_nb_bytes,p_file);
+    return fwrite(p_buffer, 1, p_nb_bytes, p_file);
 }
 
-static OPJ_OFF_T opj_skip_from_file (OPJ_OFF_T p_nb_bytes, FILE * p_user_data)
+static OPJ_OFF_T opj_skip_from_file(OPJ_OFF_T p_nb_bytes, FILE * p_user_data)
 {
-	if (OPJ_FSEEK(p_user_data,p_nb_bytes,SEEK_CUR)) {
-		return -1;
-	}
+    if (OPJ_FSEEK(p_user_data, p_nb_bytes, SEEK_CUR)) {
+        return -1;
+    }
 
-	return p_nb_bytes;
+    return p_nb_bytes;
 }
 
-static OPJ_BOOL opj_seek_from_file (OPJ_OFF_T p_nb_bytes, FILE * p_user_data)
+static OPJ_BOOL opj_seek_from_file(OPJ_OFF_T p_nb_bytes, FILE * p_user_data)
 {
-	if (OPJ_FSEEK(p_user_data,p_nb_bytes,SEEK_SET)) {
-		return OPJ_FALSE;
-	}
+    if (OPJ_FSEEK(p_user_data, p_nb_bytes, SEEK_SET)) {
+        return OPJ_FALSE;
+    }
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /* ---------------------------------------------------------------------- */
 #ifdef _WIN32
 #ifndef OPJ_STATIC
 BOOL APIENTRY
-DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
+DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
+{
 
-	OPJ_ARG_NOT_USED(lpReserved);
-	OPJ_ARG_NOT_USED(hModule);
+    OPJ_ARG_NOT_USED(lpReserved);
+    OPJ_ARG_NOT_USED(hModule);
 
-	switch (ul_reason_for_call) {
-		case DLL_PROCESS_ATTACH :
-			break;
-		case DLL_PROCESS_DETACH :
-			break;
-		case DLL_THREAD_ATTACH :
-		case DLL_THREAD_DETACH :
-			break;
+    switch (ul_reason_for_call) {
+    case DLL_PROCESS_ATTACH :
+        break;
+    case DLL_PROCESS_DETACH :
+        break;
+    case DLL_THREAD_ATTACH :
+    case DLL_THREAD_DETACH :
+        break;
     }
 
     return TRUE;
@@ -154,7 +157,8 @@
 
 /* ---------------------------------------------------------------------- */
 
-const char* OPJ_CALLCONV opj_version(void) {
+const char* OPJ_CALLCONV opj_version(void)
+{
     return OPJ_PACKAGE_VERSION;
 }
 
@@ -163,373 +167,403 @@
 
 opj_codec_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT p_format)
 {
-	opj_codec_private_t *l_codec = 00;
+    opj_codec_private_t *l_codec = 00;
 
-	l_codec = (opj_codec_private_t*) opj_calloc(1, sizeof(opj_codec_private_t));
-	if (!l_codec){
-		return 00;
-	}
+    l_codec = (opj_codec_private_t*) opj_calloc(1, sizeof(opj_codec_private_t));
+    if (!l_codec) {
+        return 00;
+    }
 
-	l_codec->is_decompressor = 1;
+    l_codec->is_decompressor = 1;
 
-	switch (p_format) {
-		case OPJ_CODEC_J2K:
-			l_codec->opj_dump_codec = (void (*) (void*, OPJ_INT32, FILE*)) j2k_dump;
+    switch (p_format) {
+    case OPJ_CODEC_J2K:
+        l_codec->opj_dump_codec = (void (*)(void*, OPJ_INT32, FILE*)) j2k_dump;
 
-			l_codec->opj_get_codec_info = (opj_codestream_info_v2_t* (*) (void*) ) j2k_get_cstr_info;
+        l_codec->opj_get_codec_info = (opj_codestream_info_v2_t* (*)(
+                                           void*)) j2k_get_cstr_info;
 
-			l_codec->opj_get_codec_index = (opj_codestream_index_t* (*) (void*) ) j2k_get_cstr_index;
+        l_codec->opj_get_codec_index = (opj_codestream_index_t* (*)(
+                                            void*)) j2k_get_cstr_index;
 
-			l_codec->m_codec_data.m_decompression.opj_decode =
-					(OPJ_BOOL (*) (	void *,
-									struct opj_stream_private *,
-									opj_image_t*, struct opj_event_mgr * )) opj_j2k_decode;
+        l_codec->m_codec_data.m_decompression.opj_decode =
+            (OPJ_BOOL(*)(void *,
+                         struct opj_stream_private *,
+                         opj_image_t*, struct opj_event_mgr *)) opj_j2k_decode;
 
-			l_codec->m_codec_data.m_decompression.opj_end_decompress =
-					(OPJ_BOOL (*) (	void *,
-									struct opj_stream_private *,
-									struct opj_event_mgr *)) opj_j2k_end_decompress;
+        l_codec->m_codec_data.m_decompression.opj_end_decompress =
+            (OPJ_BOOL(*)(void *,
+                         struct opj_stream_private *,
+                         struct opj_event_mgr *)) opj_j2k_end_decompress;
 
-			l_codec->m_codec_data.m_decompression.opj_read_header =
-					(OPJ_BOOL (*) (	struct opj_stream_private *,
-									void *,
-									opj_image_t **,
-									struct opj_event_mgr * )) opj_j2k_read_header;
+        l_codec->m_codec_data.m_decompression.opj_read_header =
+            (OPJ_BOOL(*)(struct opj_stream_private *,
+                         void *,
+                         opj_image_t **,
+                         struct opj_event_mgr *)) opj_j2k_read_header;
 
-			l_codec->m_codec_data.m_decompression.opj_destroy =
-					(void (*) (void *))opj_j2k_destroy;
+        l_codec->m_codec_data.m_decompression.opj_destroy =
+            (void (*)(void *))opj_j2k_destroy;
 
-			l_codec->m_codec_data.m_decompression.opj_setup_decoder =
-					(void (*) (void * , opj_dparameters_t * )) opj_j2k_setup_decoder;
+        l_codec->m_codec_data.m_decompression.opj_setup_decoder =
+            (void (*)(void *, opj_dparameters_t *)) opj_j2k_setup_decoder;
 
-			l_codec->m_codec_data.m_decompression.opj_read_tile_header =
-					(OPJ_BOOL (*) (	void *,
-									OPJ_UINT32*,
-									OPJ_UINT32*,
-									OPJ_INT32*, OPJ_INT32*,
-									OPJ_INT32*, OPJ_INT32*,
-									OPJ_UINT32*,
-									OPJ_BOOL*,
-									struct opj_stream_private *,
-									struct opj_event_mgr * )) opj_j2k_read_tile_header;
+        l_codec->m_codec_data.m_decompression.opj_read_tile_header =
+            (OPJ_BOOL(*)(void *,
+                         OPJ_UINT32*,
+                         OPJ_UINT32*,
+                         OPJ_INT32*, OPJ_INT32*,
+                         OPJ_INT32*, OPJ_INT32*,
+                         OPJ_UINT32*,
+                         OPJ_BOOL*,
+                         struct opj_stream_private *,
+                         struct opj_event_mgr *)) opj_j2k_read_tile_header;
 
-			l_codec->m_codec_data.m_decompression.opj_decode_tile_data =
-					(OPJ_BOOL (*) ( void *, 
-                                    OPJ_UINT32, 
-                                    OPJ_BYTE*, 
-                                    OPJ_UINT32, 
-                                    struct opj_stream_private *,
-                                    struct opj_event_mgr *)) opj_j2k_decode_tile;
+        l_codec->m_codec_data.m_decompression.opj_decode_tile_data =
+            (OPJ_BOOL(*)(void *,
+                         OPJ_UINT32,
+                         OPJ_BYTE*,
+                         OPJ_UINT32,
+                         struct opj_stream_private *,
+                         struct opj_event_mgr *)) opj_j2k_decode_tile;
 
-			l_codec->m_codec_data.m_decompression.opj_set_decode_area =
-					(OPJ_BOOL (*) ( void *, 
-                                    opj_image_t*, 
-                                    OPJ_INT32, OPJ_INT32, OPJ_INT32, OPJ_INT32, 
-                                    struct opj_event_mgr *)) opj_j2k_set_decode_area;
+        l_codec->m_codec_data.m_decompression.opj_set_decode_area =
+            (OPJ_BOOL(*)(void *,
+                         opj_image_t*,
+                         OPJ_INT32, OPJ_INT32, OPJ_INT32, OPJ_INT32,
+                         struct opj_event_mgr *)) opj_j2k_set_decode_area;
 
-			l_codec->m_codec_data.m_decompression.opj_get_decoded_tile = 
-                    (OPJ_BOOL (*) ( void *p_codec,
-								    opj_stream_private_t *p_cio,
-								    opj_image_t *p_image,
-								    struct opj_event_mgr * p_manager,
-								    OPJ_UINT32 tile_index)) opj_j2k_get_tile;
+        l_codec->m_codec_data.m_decompression.opj_get_decoded_tile =
+            (OPJ_BOOL(*)(void *p_codec,
+                         opj_stream_private_t *p_cio,
+                         opj_image_t *p_image,
+                         struct opj_event_mgr * p_manager,
+                         OPJ_UINT32 tile_index)) opj_j2k_get_tile;
 
-			l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor = 
-                    (OPJ_BOOL (*) ( void * p_codec,
-									OPJ_UINT32 res_factor,
-									struct opj_event_mgr * p_manager)) opj_j2k_set_decoded_resolution_factor;
+        l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor =
+            (OPJ_BOOL(*)(void * p_codec,
+                         OPJ_UINT32 res_factor,
+                         struct opj_event_mgr * p_manager)) opj_j2k_set_decoded_resolution_factor;
 
-			l_codec->m_codec = opj_j2k_create_decompress();
+        l_codec->opj_set_threads =
+            (OPJ_BOOL(*)(void * p_codec, OPJ_UINT32 num_threads)) opj_j2k_set_threads;
 
-			if (! l_codec->m_codec) {
-				opj_free(l_codec);
-				return NULL;
-			}
+        l_codec->m_codec = opj_j2k_create_decompress();
 
-			break;
+        if (! l_codec->m_codec) {
+            opj_free(l_codec);
+            return NULL;
+        }
 
-		case OPJ_CODEC_JP2:
-			/* get a JP2 decoder handle */
-			l_codec->opj_dump_codec = (void (*) (void*, OPJ_INT32, FILE*)) jp2_dump;
+        break;
 
-			l_codec->opj_get_codec_info = (opj_codestream_info_v2_t* (*) (void*) ) jp2_get_cstr_info;
+    case OPJ_CODEC_JP2:
+        /* get a JP2 decoder handle */
+        l_codec->opj_dump_codec = (void (*)(void*, OPJ_INT32, FILE*)) jp2_dump;
 
-			l_codec->opj_get_codec_index = (opj_codestream_index_t* (*) (void*) ) jp2_get_cstr_index;
+        l_codec->opj_get_codec_info = (opj_codestream_info_v2_t* (*)(
+                                           void*)) jp2_get_cstr_info;
 
-			l_codec->m_codec_data.m_decompression.opj_decode =
-					(OPJ_BOOL (*) (	void *,
-									struct opj_stream_private *,
-									opj_image_t*,
-									struct opj_event_mgr * )) opj_jp2_decode;
+        l_codec->opj_get_codec_index = (opj_codestream_index_t* (*)(
+                                            void*)) jp2_get_cstr_index;
 
-			l_codec->m_codec_data.m_decompression.opj_end_decompress =  
-                    (OPJ_BOOL (*) ( void *,
-                                    struct opj_stream_private *,
-                                    struct opj_event_mgr *)) opj_jp2_end_decompress;
+        l_codec->m_codec_data.m_decompression.opj_decode =
+            (OPJ_BOOL(*)(void *,
+                         struct opj_stream_private *,
+                         opj_image_t*,
+                         struct opj_event_mgr *)) opj_jp2_decode;
 
-			l_codec->m_codec_data.m_decompression.opj_read_header =  
-                    (OPJ_BOOL (*) ( struct opj_stream_private *,
-					                void *,
-					                opj_image_t **,
-					                struct opj_event_mgr * )) opj_jp2_read_header;
+        l_codec->m_codec_data.m_decompression.opj_end_decompress =
+            (OPJ_BOOL(*)(void *,
+                         struct opj_stream_private *,
+                         struct opj_event_mgr *)) opj_jp2_end_decompress;
 
-			l_codec->m_codec_data.m_decompression.opj_read_tile_header = 
-                    (OPJ_BOOL (*) ( void *,
-					                OPJ_UINT32*,
-					                OPJ_UINT32*,
-					                OPJ_INT32*,
-					                OPJ_INT32*,
-					                OPJ_INT32 * ,
-					                OPJ_INT32 * ,
-					                OPJ_UINT32 * ,
-					                OPJ_BOOL *,
-					                struct opj_stream_private *,
-					                struct opj_event_mgr * )) opj_jp2_read_tile_header;
+        l_codec->m_codec_data.m_decompression.opj_read_header =
+            (OPJ_BOOL(*)(struct opj_stream_private *,
+                         void *,
+                         opj_image_t **,
+                         struct opj_event_mgr *)) opj_jp2_read_header;
 
-			l_codec->m_codec_data.m_decompression.opj_decode_tile_data = 
-                    (OPJ_BOOL (*) ( void *,
-                                    OPJ_UINT32,OPJ_BYTE*,OPJ_UINT32,
-                                    struct opj_stream_private *,
-                                    struct opj_event_mgr * )) opj_jp2_decode_tile;
+        l_codec->m_codec_data.m_decompression.opj_read_tile_header =
+            (OPJ_BOOL(*)(void *,
+                         OPJ_UINT32*,
+                         OPJ_UINT32*,
+                         OPJ_INT32*,
+                         OPJ_INT32*,
+                         OPJ_INT32 *,
+                         OPJ_INT32 *,
+                         OPJ_UINT32 *,
+                         OPJ_BOOL *,
+                         struct opj_stream_private *,
+                         struct opj_event_mgr *)) opj_jp2_read_tile_header;
 
-			l_codec->m_codec_data.m_decompression.opj_destroy = (void (*) (void *))opj_jp2_destroy;
+        l_codec->m_codec_data.m_decompression.opj_decode_tile_data =
+            (OPJ_BOOL(*)(void *,
+                         OPJ_UINT32, OPJ_BYTE*, OPJ_UINT32,
+                         struct opj_stream_private *,
+                         struct opj_event_mgr *)) opj_jp2_decode_tile;
 
-			l_codec->m_codec_data.m_decompression.opj_setup_decoder = 
-                    (void (*) (void * ,opj_dparameters_t * )) opj_jp2_setup_decoder;
+        l_codec->m_codec_data.m_decompression.opj_destroy = (void (*)(
+                    void *))opj_jp2_destroy;
 
-			l_codec->m_codec_data.m_decompression.opj_set_decode_area = 
-                    (OPJ_BOOL (*) ( void *,
-                                    opj_image_t*, 
-                                    OPJ_INT32,OPJ_INT32,OPJ_INT32,OPJ_INT32,
-                                    struct opj_event_mgr * )) opj_jp2_set_decode_area;
+        l_codec->m_codec_data.m_decompression.opj_setup_decoder =
+            (void (*)(void *, opj_dparameters_t *)) opj_jp2_setup_decoder;
 
-			l_codec->m_codec_data.m_decompression.opj_get_decoded_tile = 
-                    (OPJ_BOOL (*) ( void *p_codec,
-									opj_stream_private_t *p_cio,
-									opj_image_t *p_image,
-									struct opj_event_mgr * p_manager,
-									OPJ_UINT32 tile_index)) opj_jp2_get_tile;
+        l_codec->m_codec_data.m_decompression.opj_set_decode_area =
+            (OPJ_BOOL(*)(void *,
+                         opj_image_t*,
+                         OPJ_INT32, OPJ_INT32, OPJ_INT32, OPJ_INT32,
+                         struct opj_event_mgr *)) opj_jp2_set_decode_area;
 
-			l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor = 
-                    (OPJ_BOOL (*) ( void * p_codec,
-						    		OPJ_UINT32 res_factor,
-							    	opj_event_mgr_t * p_manager)) opj_jp2_set_decoded_resolution_factor;
+        l_codec->m_codec_data.m_decompression.opj_get_decoded_tile =
+            (OPJ_BOOL(*)(void *p_codec,
+                         opj_stream_private_t *p_cio,
+                         opj_image_t *p_image,
+                         struct opj_event_mgr * p_manager,
+                         OPJ_UINT32 tile_index)) opj_jp2_get_tile;
 
-			l_codec->m_codec = opj_jp2_create(OPJ_TRUE);
+        l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor =
+            (OPJ_BOOL(*)(void * p_codec,
+                         OPJ_UINT32 res_factor,
+                         opj_event_mgr_t * p_manager)) opj_jp2_set_decoded_resolution_factor;
 
-			if (! l_codec->m_codec) {
-				opj_free(l_codec);
-				return 00;
-			}
+        l_codec->opj_set_threads =
+            (OPJ_BOOL(*)(void * p_codec, OPJ_UINT32 num_threads)) opj_jp2_set_threads;
 
-			break;
-		case OPJ_CODEC_UNKNOWN:
-		case OPJ_CODEC_JPT:
-		default:
-			opj_free(l_codec);
-			return 00;
-	}
+        l_codec->m_codec = opj_jp2_create(OPJ_TRUE);
 
-	opj_set_default_event_handler(&(l_codec->m_event_mgr));
-	return (opj_codec_t*) l_codec;
+        if (! l_codec->m_codec) {
+            opj_free(l_codec);
+            return 00;
+        }
+
+        break;
+    case OPJ_CODEC_UNKNOWN:
+    case OPJ_CODEC_JPT:
+    default:
+        opj_free(l_codec);
+        return 00;
+    }
+
+    opj_set_default_event_handler(&(l_codec->m_event_mgr));
+    return (opj_codec_t*) l_codec;
 }
 
-void OPJ_CALLCONV 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;
+void OPJ_CALLCONV 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;
-		parameters->flags = 0;		
-/* UniPG>> */
+        parameters->decod_format = -1;
+        parameters->cod_format = -1;
+        parameters->flags = 0;
+        /* UniPG>> */
 #ifdef USE_JPWL
-		parameters->jpwl_correct = OPJ_FALSE;
-		parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS;
-		parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES;
+        parameters->jpwl_correct = OPJ_FALSE;
+        parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS;
+        parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES;
 #endif /* USE_JPWL */
-/* <<UniPG */
-	}
+        /* <<UniPG */
+    }
+}
+
+
+OPJ_BOOL OPJ_CALLCONV opj_codec_set_threads(opj_codec_t *p_codec,
+        int num_threads)
+{
+    if (p_codec && (num_threads >= 0)) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+
+        return l_codec->opj_set_threads(l_codec->m_codec, (OPJ_UINT32)num_threads);
+    }
+    return OPJ_FALSE;
 }
 
 OPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec,
-                                        opj_dparameters_t *parameters 
-										)
+                                        opj_dparameters_t *parameters
+                                       )
 {
-	if (p_codec && parameters) { 
-		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+    if (p_codec && parameters) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
 
-		if (! l_codec->is_decompressor) {
-			opj_event_msg(&(l_codec->m_event_mgr), EVT_ERROR, 
-                "Codec provided to the opj_setup_decoder function is not a decompressor handler.\n");
-			return OPJ_FALSE;
-		}
+        if (! l_codec->is_decompressor) {
+            opj_event_msg(&(l_codec->m_event_mgr), EVT_ERROR,
+                          "Codec provided to the opj_setup_decoder function is not a decompressor handler.\n");
+            return OPJ_FALSE;
+        }
 
-		l_codec->m_codec_data.m_decompression.opj_setup_decoder(l_codec->m_codec,
-																parameters);
-		return OPJ_TRUE;
-	}
-	return OPJ_FALSE;
+        l_codec->m_codec_data.m_decompression.opj_setup_decoder(l_codec->m_codec,
+                parameters);
+        return OPJ_TRUE;
+    }
+    return OPJ_FALSE;
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_read_header (	opj_stream_t *p_stream,
-										opj_codec_t *p_codec,
-										opj_image_t **p_image )
+OPJ_BOOL OPJ_CALLCONV opj_read_header(opj_stream_t *p_stream,
+                                      opj_codec_t *p_codec,
+                                      opj_image_t **p_image)
 {
-	if (p_codec && p_stream) {
-		opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
-		opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
+    if (p_codec && p_stream) {
+        opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
+        opj_stream_private_t* l_stream = (opj_stream_private_t*) p_stream;
 
-		if(! l_codec->is_decompressor) {
-			opj_event_msg(&(l_codec->m_event_mgr), EVT_ERROR, 
-                "Codec provided to the opj_read_header function is not a decompressor handler.\n");
-			return OPJ_FALSE;
-		}
+        if (! l_codec->is_decompressor) {
+            opj_event_msg(&(l_codec->m_event_mgr), EVT_ERROR,
+                          "Codec provided to the opj_read_header function is not a decompressor handler.\n");
+            return OPJ_FALSE;
+        }
 
-		return l_codec->m_codec_data.m_decompression.opj_read_header(	l_stream,
-																		l_codec->m_codec,
-																		p_image,
-																		&(l_codec->m_event_mgr) );
-	}
+        return l_codec->m_codec_data.m_decompression.opj_read_header(l_stream,
+                l_codec->m_codec,
+                p_image,
+                &(l_codec->m_event_mgr));
+    }
 
-	return OPJ_FALSE;
+    return OPJ_FALSE;
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_decode(   opj_codec_t *p_codec,
-                                    opj_stream_t *p_stream,
-                                    opj_image_t* p_image)
+OPJ_BOOL OPJ_CALLCONV opj_decode(opj_codec_t *p_codec,
+                                 opj_stream_t *p_stream,
+                                 opj_image_t* p_image)
 {
-	if (p_codec && p_stream) {
-		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
-		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+    if (p_codec && p_stream) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+        opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
 
-		if (! l_codec->is_decompressor) {
-			return OPJ_FALSE;
-		}
+        if (! l_codec->is_decompressor) {
+            return OPJ_FALSE;
+        }
 
-		return l_codec->m_codec_data.m_decompression.opj_decode(l_codec->m_codec,
-																l_stream,
-																p_image,
-																&(l_codec->m_event_mgr) );
-	}
+        return l_codec->m_codec_data.m_decompression.opj_decode(l_codec->m_codec,
+                l_stream,
+                p_image,
+                &(l_codec->m_event_mgr));
+    }
 
-	return OPJ_FALSE;
+    return OPJ_FALSE;
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_set_decode_area(	opj_codec_t *p_codec,
-											opj_image_t* p_image,
-											OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
-											OPJ_INT32 p_end_x, OPJ_INT32 p_end_y
-											)
+OPJ_BOOL OPJ_CALLCONV opj_set_decode_area(opj_codec_t *p_codec,
+        opj_image_t* p_image,
+        OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+        OPJ_INT32 p_end_x, OPJ_INT32 p_end_y
+                                         )
 {
-	if (p_codec) {
-		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
-		
-		if (! l_codec->is_decompressor) {
-			return OPJ_FALSE;
-		}
+    if (p_codec) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
 
-		return  l_codec->m_codec_data.m_decompression.opj_set_decode_area(	l_codec->m_codec,
-																			p_image,
-																			p_start_x, p_start_y,
-																			p_end_x, p_end_y,
-																			&(l_codec->m_event_mgr) );
-	}
-	return OPJ_FALSE;
+        if (! l_codec->is_decompressor) {
+            return OPJ_FALSE;
+        }
+
+        return  l_codec->m_codec_data.m_decompression.opj_set_decode_area(
+                    l_codec->m_codec,
+                    p_image,
+                    p_start_x, p_start_y,
+                    p_end_x, p_end_y,
+                    &(l_codec->m_event_mgr));
+    }
+    return OPJ_FALSE;
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_read_tile_header(	opj_codec_t *p_codec,
-											opj_stream_t * p_stream,
-											OPJ_UINT32 * p_tile_index,
-											OPJ_UINT32 * p_data_size,
-											OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
-											OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
-											OPJ_UINT32 * p_nb_comps,
-											OPJ_BOOL * p_should_go_on)
+OPJ_BOOL OPJ_CALLCONV opj_read_tile_header(opj_codec_t *p_codec,
+        opj_stream_t * p_stream,
+        OPJ_UINT32 * p_tile_index,
+        OPJ_UINT32 * p_data_size,
+        OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
+        OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
+        OPJ_UINT32 * p_nb_comps,
+        OPJ_BOOL * p_should_go_on)
 {
-	if (p_codec && p_stream && p_data_size && p_tile_index) {
-		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
-		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+    if (p_codec && p_stream && p_data_size && p_tile_index) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+        opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
 
-		if (! l_codec->is_decompressor) {
-			return OPJ_FALSE;
-		}
+        if (! l_codec->is_decompressor) {
+            return OPJ_FALSE;
+        }
 
-		return l_codec->m_codec_data.m_decompression.opj_read_tile_header(	l_codec->m_codec,
-																			p_tile_index,
-																			p_data_size,
-																			p_tile_x0, p_tile_y0,
-																			p_tile_x1, p_tile_y1,
-																			p_nb_comps,
-																			p_should_go_on,
-																			l_stream,
-																			&(l_codec->m_event_mgr));
-	}
-	return OPJ_FALSE;
+        return l_codec->m_codec_data.m_decompression.opj_read_tile_header(
+                   l_codec->m_codec,
+                   p_tile_index,
+                   p_data_size,
+                   p_tile_x0, p_tile_y0,
+                   p_tile_x1, p_tile_y1,
+                   p_nb_comps,
+                   p_should_go_on,
+                   l_stream,
+                   &(l_codec->m_event_mgr));
+    }
+    return OPJ_FALSE;
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_decode_tile_data(	opj_codec_t *p_codec,
-											OPJ_UINT32 p_tile_index,
-											OPJ_BYTE * p_data,
-											OPJ_UINT32 p_data_size,
-											opj_stream_t *p_stream
-											)
+OPJ_BOOL OPJ_CALLCONV opj_decode_tile_data(opj_codec_t *p_codec,
+        OPJ_UINT32 p_tile_index,
+        OPJ_BYTE * p_data,
+        OPJ_UINT32 p_data_size,
+        opj_stream_t *p_stream
+                                          )
 {
-	if (p_codec && p_data && p_stream) {
-		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
-		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+    if (p_codec && p_data && p_stream) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+        opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
 
-		if (! l_codec->is_decompressor) {
-			return OPJ_FALSE;
-		}
+        if (! l_codec->is_decompressor) {
+            return OPJ_FALSE;
+        }
 
-		return l_codec->m_codec_data.m_decompression.opj_decode_tile_data(	l_codec->m_codec,
-																			p_tile_index,
-																			p_data,
-																			p_data_size,
-																			l_stream,
-																			&(l_codec->m_event_mgr) );
-	}
-	return OPJ_FALSE;
+        return l_codec->m_codec_data.m_decompression.opj_decode_tile_data(
+                   l_codec->m_codec,
+                   p_tile_index,
+                   p_data,
+                   p_data_size,
+                   l_stream,
+                   &(l_codec->m_event_mgr));
+    }
+    return OPJ_FALSE;
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_get_decoded_tile(	opj_codec_t *p_codec,
-											opj_stream_t *p_stream,
-											opj_image_t *p_image,
-											OPJ_UINT32 tile_index)
+OPJ_BOOL OPJ_CALLCONV opj_get_decoded_tile(opj_codec_t *p_codec,
+        opj_stream_t *p_stream,
+        opj_image_t *p_image,
+        OPJ_UINT32 tile_index)
 {
-	if (p_codec && p_stream) {
-		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
-		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+    if (p_codec && p_stream) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+        opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
 
-		if (! l_codec->is_decompressor) {
-			return OPJ_FALSE;
-		}
-		
-		return l_codec->m_codec_data.m_decompression.opj_get_decoded_tile(	l_codec->m_codec,
-																			l_stream,
-																			p_image,
-																			&(l_codec->m_event_mgr),
-																			tile_index);
-	}
+        if (! l_codec->is_decompressor) {
+            return OPJ_FALSE;
+        }
 
-	return OPJ_FALSE;
+        return l_codec->m_codec_data.m_decompression.opj_get_decoded_tile(
+                   l_codec->m_codec,
+                   l_stream,
+                   p_image,
+                   &(l_codec->m_event_mgr),
+                   tile_index);
+    }
+
+    return OPJ_FALSE;
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_set_decoded_resolution_factor(opj_codec_t *p_codec, 
-														OPJ_UINT32 res_factor )
+OPJ_BOOL OPJ_CALLCONV opj_set_decoded_resolution_factor(opj_codec_t *p_codec,
+        OPJ_UINT32 res_factor)
 {
-	opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+    opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
 
-	if ( !l_codec ){
-		return OPJ_FALSE;
-	}
+    if (!l_codec) {
+        return OPJ_FALSE;
+    }
 
-	return l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor(l_codec->m_codec,
-																			res_factor,
-																			&(l_codec->m_event_mgr) );
+    return l_codec->m_codec_data.m_decompression.opj_set_decoded_resolution_factor(
+               l_codec->m_codec,
+               res_factor,
+               &(l_codec->m_event_mgr));
 }
 
 /* ---------------------------------------------------------------------- */
@@ -537,395 +571,403 @@
 
 opj_codec_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT p_format)
 {
-	opj_codec_private_t *l_codec = 00;
+    opj_codec_private_t *l_codec = 00;
 
-	l_codec = (opj_codec_private_t*)opj_calloc(1, sizeof(opj_codec_private_t));
-	if (!l_codec) {
-		return 00;
-	}
-	
-	l_codec->is_decompressor = 0;
+    l_codec = (opj_codec_private_t*)opj_calloc(1, sizeof(opj_codec_private_t));
+    if (!l_codec) {
+        return 00;
+    }
 
-	switch(p_format) {
-		case OPJ_CODEC_J2K:
-			l_codec->m_codec_data.m_compression.opj_encode = (OPJ_BOOL (*) (void *,
-																			struct opj_stream_private *,
-																			struct opj_event_mgr * )) opj_j2k_encode;
+    l_codec->is_decompressor = 0;
 
-			l_codec->m_codec_data.m_compression.opj_end_compress = (OPJ_BOOL (*) (	void *,
-																					struct opj_stream_private *,
-																					struct opj_event_mgr *)) opj_j2k_end_compress;
+    switch (p_format) {
+    case OPJ_CODEC_J2K:
+        l_codec->m_codec_data.m_compression.opj_encode = (OPJ_BOOL(*)(void *,
+                struct opj_stream_private *,
+                struct opj_event_mgr *)) opj_j2k_encode;
 
-			l_codec->m_codec_data.m_compression.opj_start_compress = (OPJ_BOOL (*) (void *,
-																					struct opj_stream_private *,
-																					struct opj_image * ,
-																					struct opj_event_mgr *)) opj_j2k_start_compress;
+        l_codec->m_codec_data.m_compression.opj_end_compress = (OPJ_BOOL(*)(void *,
+                struct opj_stream_private *,
+                struct opj_event_mgr *)) opj_j2k_end_compress;
 
-			l_codec->m_codec_data.m_compression.opj_write_tile = (OPJ_BOOL (*) (void *,
-																				OPJ_UINT32,
-																				OPJ_BYTE*,
-																				OPJ_UINT32,
-																				struct opj_stream_private *,
-																				struct opj_event_mgr *) ) opj_j2k_write_tile;
+        l_codec->m_codec_data.m_compression.opj_start_compress = (OPJ_BOOL(*)(void *,
+                struct opj_stream_private *,
+                struct opj_image *,
+                struct opj_event_mgr *)) opj_j2k_start_compress;
 
-			l_codec->m_codec_data.m_compression.opj_destroy = (void (*) (void *)) opj_j2k_destroy;
+        l_codec->m_codec_data.m_compression.opj_write_tile = (OPJ_BOOL(*)(void *,
+                OPJ_UINT32,
+                OPJ_BYTE*,
+                OPJ_UINT32,
+                struct opj_stream_private *,
+                struct opj_event_mgr *)) opj_j2k_write_tile;
 
-			l_codec->m_codec_data.m_compression.opj_setup_encoder = (OPJ_BOOL (*) (	void *,
-																				opj_cparameters_t *,
-																				struct opj_image *,
-																				struct opj_event_mgr * )) opj_j2k_setup_encoder;
+        l_codec->m_codec_data.m_compression.opj_destroy = (void (*)(
+                    void *)) opj_j2k_destroy;
 
-			l_codec->m_codec = opj_j2k_create_compress();
-			if (! l_codec->m_codec) {
-				opj_free(l_codec);
-				return 00;
-			}
+        l_codec->m_codec_data.m_compression.opj_setup_encoder = (OPJ_BOOL(*)(void *,
+                opj_cparameters_t *,
+                struct opj_image *,
+                struct opj_event_mgr *)) opj_j2k_setup_encoder;
 
-			break;
+        l_codec->m_codec = opj_j2k_create_compress();
+        if (! l_codec->m_codec) {
+            opj_free(l_codec);
+            return 00;
+        }
 
-		case OPJ_CODEC_JP2:
-			/* get a JP2 decoder handle */
-			l_codec->m_codec_data.m_compression.opj_encode = (OPJ_BOOL (*) (void *,
-																			struct opj_stream_private *,
-																			struct opj_event_mgr * )) opj_jp2_encode;
+        break;
 
-			l_codec->m_codec_data.m_compression.opj_end_compress = (OPJ_BOOL (*) (	void *,
-																					struct opj_stream_private *,
-																					struct opj_event_mgr *)) opj_jp2_end_compress;
+    case OPJ_CODEC_JP2:
+        /* get a JP2 decoder handle */
+        l_codec->m_codec_data.m_compression.opj_encode = (OPJ_BOOL(*)(void *,
+                struct opj_stream_private *,
+                struct opj_event_mgr *)) opj_jp2_encode;
 
-			l_codec->m_codec_data.m_compression.opj_start_compress = (OPJ_BOOL (*) (void *,
-																					struct opj_stream_private *,
-																					struct opj_image * ,
-																					struct opj_event_mgr *))  opj_jp2_start_compress;
+        l_codec->m_codec_data.m_compression.opj_end_compress = (OPJ_BOOL(*)(void *,
+                struct opj_stream_private *,
+                struct opj_event_mgr *)) opj_jp2_end_compress;
 
-			l_codec->m_codec_data.m_compression.opj_write_tile = (OPJ_BOOL (*) (void *,
-																				OPJ_UINT32,
-																				OPJ_BYTE*,
-																				OPJ_UINT32,
-																				struct opj_stream_private *,
-																				struct opj_event_mgr *)) opj_jp2_write_tile;
+        l_codec->m_codec_data.m_compression.opj_start_compress = (OPJ_BOOL(*)(void *,
+                struct opj_stream_private *,
+                struct opj_image *,
+                struct opj_event_mgr *))  opj_jp2_start_compress;
 
-			l_codec->m_codec_data.m_compression.opj_destroy = (void (*) (void *)) opj_jp2_destroy;
+        l_codec->m_codec_data.m_compression.opj_write_tile = (OPJ_BOOL(*)(void *,
+                OPJ_UINT32,
+                OPJ_BYTE*,
+                OPJ_UINT32,
+                struct opj_stream_private *,
+                struct opj_event_mgr *)) opj_jp2_write_tile;
 
-			l_codec->m_codec_data.m_compression.opj_setup_encoder = (OPJ_BOOL (*) (	void *,
-																				opj_cparameters_t *,
-																				struct opj_image *,
-																				struct opj_event_mgr * )) opj_jp2_setup_encoder;
+        l_codec->m_codec_data.m_compression.opj_destroy = (void (*)(
+                    void *)) opj_jp2_destroy;
 
-			l_codec->m_codec = opj_jp2_create(OPJ_FALSE);
-			if (! l_codec->m_codec) {
-				opj_free(l_codec);
-				return 00;
-			}
+        l_codec->m_codec_data.m_compression.opj_setup_encoder = (OPJ_BOOL(*)(void *,
+                opj_cparameters_t *,
+                struct opj_image *,
+                struct opj_event_mgr *)) opj_jp2_setup_encoder;
 
-			break;
+        l_codec->m_codec = opj_jp2_create(OPJ_FALSE);
+        if (! l_codec->m_codec) {
+            opj_free(l_codec);
+            return 00;
+        }
 
-		case OPJ_CODEC_UNKNOWN:
-		case OPJ_CODEC_JPT:
-		default:
-			opj_free(l_codec);
-			return 00;
-	}
+        break;
 
-	opj_set_default_event_handler(&(l_codec->m_event_mgr));
-	return (opj_codec_t*) l_codec;
+    case OPJ_CODEC_UNKNOWN:
+    case OPJ_CODEC_JPT:
+    default:
+        opj_free(l_codec);
+        return 00;
+    }
+
+    opj_set_default_event_handler(&(l_codec->m_event_mgr));
+    return (opj_codec_t*) l_codec;
 }
 
-void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters) {
-	if(parameters) {
-		memset(parameters, 0, sizeof(opj_cparameters_t));
-		/* default coding parameters */
+void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t
+        *parameters)
+{
+    if (parameters) {
+        memset(parameters, 0, sizeof(opj_cparameters_t));
+        /* default coding parameters */
         parameters->cp_cinema = OPJ_OFF; /* DEPRECATED */
         parameters->rsiz = OPJ_PROFILE_NONE;
-		parameters->max_comp_size = 0;
-		parameters->numresolution = 6;
+        parameters->max_comp_size = 0;
+        parameters->numresolution = 6;
         parameters->cp_rsiz = OPJ_STD_RSIZ; /* DEPRECATED */
-		parameters->cblockw_init = 64;
-		parameters->cblockh_init = 64;
-		parameters->prog_order = OPJ_LRCP;
-		parameters->roi_compno = -1;		/* no ROI */
-		parameters->subsampling_dx = 1;
-		parameters->subsampling_dy = 1;
-		parameters->tp_on = 0;
-		parameters->decod_format = -1;
-		parameters->cod_format = -1;
-		parameters->tcp_rates[0] = 0;   
-		parameters->tcp_numlayers = 0;
-		parameters->cp_disto_alloc = 0;
-		parameters->cp_fixed_alloc = 0;
-		parameters->cp_fixed_quality = 0;
-		parameters->jpip_on = OPJ_FALSE;
-/* UniPG>> */
+        parameters->cblockw_init = 64;
+        parameters->cblockh_init = 64;
+        parameters->prog_order = OPJ_LRCP;
+        parameters->roi_compno = -1;        /* no ROI */
+        parameters->subsampling_dx = 1;
+        parameters->subsampling_dy = 1;
+        parameters->tp_on = 0;
+        parameters->decod_format = -1;
+        parameters->cod_format = -1;
+        parameters->tcp_rates[0] = 0;
+        parameters->tcp_numlayers = 0;
+        parameters->cp_disto_alloc = 0;
+        parameters->cp_fixed_alloc = 0;
+        parameters->cp_fixed_quality = 0;
+        parameters->jpip_on = OPJ_FALSE;
+        /* UniPG>> */
 #ifdef USE_JPWL
-		parameters->jpwl_epc_on = OPJ_FALSE;
-		parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */
-		{
-			int i;
-			for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
-				parameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */
-				parameters->jpwl_hprot_TPH[i] = 0; /* absent */
-			}
-		};
-		{
-			int i;
-			for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
-				parameters->jpwl_pprot_tileno[i] = -1; /* unassigned */
-				parameters->jpwl_pprot_packno[i] = -1; /* unassigned */
-				parameters->jpwl_pprot[i] = 0; /* absent */
-			}
-		};
-		parameters->jpwl_sens_size = 0; /* 0 means no ESD */
-		parameters->jpwl_sens_addr = 0; /* 0 means auto */
-		parameters->jpwl_sens_range = 0; /* 0 means packet */
-		parameters->jpwl_sens_MH = -1; /* -1 means unassigned */
-		{
-			int i;
-			for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
-				parameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */
-				parameters->jpwl_sens_TPH[i] = -1; /* absent */
-			}
-		};
+        parameters->jpwl_epc_on = OPJ_FALSE;
+        parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */
+        {
+            int i;
+            for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
+                parameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */
+                parameters->jpwl_hprot_TPH[i] = 0; /* absent */
+            }
+        };
+        {
+            int i;
+            for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
+                parameters->jpwl_pprot_tileno[i] = -1; /* unassigned */
+                parameters->jpwl_pprot_packno[i] = -1; /* unassigned */
+                parameters->jpwl_pprot[i] = 0; /* absent */
+            }
+        };
+        parameters->jpwl_sens_size = 0; /* 0 means no ESD */
+        parameters->jpwl_sens_addr = 0; /* 0 means auto */
+        parameters->jpwl_sens_range = 0; /* 0 means packet */
+        parameters->jpwl_sens_MH = -1; /* -1 means unassigned */
+        {
+            int i;
+            for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
+                parameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */
+                parameters->jpwl_sens_TPH[i] = -1; /* absent */
+            }
+        };
 #endif /* USE_JPWL */
-/* <<UniPG */
-	}
+        /* <<UniPG */
+    }
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_setup_encoder(opj_codec_t *p_codec, 
-										opj_cparameters_t *parameters, 
-										opj_image_t *p_image)
+OPJ_BOOL OPJ_CALLCONV opj_setup_encoder(opj_codec_t *p_codec,
+                                        opj_cparameters_t *parameters,
+                                        opj_image_t *p_image)
 {
-	if (p_codec && parameters && p_image) {
-		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+    if (p_codec && parameters && p_image) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
 
-		if (! l_codec->is_decompressor) {
-			return l_codec->m_codec_data.m_compression.opj_setup_encoder(	l_codec->m_codec,
-																	parameters,
-																	p_image,
-																	&(l_codec->m_event_mgr) );
-		}
-	}
+        if (! l_codec->is_decompressor) {
+            return l_codec->m_codec_data.m_compression.opj_setup_encoder(l_codec->m_codec,
+                    parameters,
+                    p_image,
+                    &(l_codec->m_event_mgr));
+        }
+    }
 
-	return OPJ_FALSE;
+    return OPJ_FALSE;
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_start_compress (	opj_codec_t *p_codec,
-											opj_image_t * p_image,
-											opj_stream_t *p_stream)
+OPJ_BOOL OPJ_CALLCONV opj_start_compress(opj_codec_t *p_codec,
+        opj_image_t * p_image,
+        opj_stream_t *p_stream)
 {
-	if (p_codec && p_stream) {
-		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
-		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+    if (p_codec && p_stream) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+        opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
 
-		if (! l_codec->is_decompressor) {
-			return l_codec->m_codec_data.m_compression.opj_start_compress(	l_codec->m_codec,
-																			l_stream,
-																			p_image,
-																			&(l_codec->m_event_mgr));
-		}
-	}
+        if (! l_codec->is_decompressor) {
+            return l_codec->m_codec_data.m_compression.opj_start_compress(l_codec->m_codec,
+                    l_stream,
+                    p_image,
+                    &(l_codec->m_event_mgr));
+        }
+    }
 
-	return OPJ_FALSE;
+    return OPJ_FALSE;
 }
 
 OPJ_BOOL OPJ_CALLCONV opj_encode(opj_codec_t *p_info, opj_stream_t *p_stream)
 {
-	if (p_info && p_stream) {
-		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_info;
-		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+    if (p_info && p_stream) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_info;
+        opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
 
-		if (! l_codec->is_decompressor) {
-			return l_codec->m_codec_data.m_compression.opj_encode(	l_codec->m_codec,
-															l_stream,
-															&(l_codec->m_event_mgr));
-		}
-	}
+        if (! l_codec->is_decompressor) {
+            return l_codec->m_codec_data.m_compression.opj_encode(l_codec->m_codec,
+                    l_stream,
+                    &(l_codec->m_event_mgr));
+        }
+    }
 
-	return OPJ_FALSE;
+    return OPJ_FALSE;
 
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_end_compress (opj_codec_t *p_codec,
-										opj_stream_t *p_stream)
+OPJ_BOOL OPJ_CALLCONV opj_end_compress(opj_codec_t *p_codec,
+                                       opj_stream_t *p_stream)
 {
-	if (p_codec && p_stream) {
-		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
-		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+    if (p_codec && p_stream) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+        opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
 
-		if (! l_codec->is_decompressor) {
-			return l_codec->m_codec_data.m_compression.opj_end_compress(l_codec->m_codec,
-																		l_stream,
-																		&(l_codec->m_event_mgr));
-		}
-	}
-	return OPJ_FALSE;
+        if (! l_codec->is_decompressor) {
+            return l_codec->m_codec_data.m_compression.opj_end_compress(l_codec->m_codec,
+                    l_stream,
+                    &(l_codec->m_event_mgr));
+        }
+    }
+    return OPJ_FALSE;
 
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_end_decompress (	opj_codec_t *p_codec,
-											opj_stream_t *p_stream)
+OPJ_BOOL OPJ_CALLCONV opj_end_decompress(opj_codec_t *p_codec,
+        opj_stream_t *p_stream)
 {
-	if (p_codec && p_stream) {
-		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
-		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+    if (p_codec && p_stream) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+        opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
 
-		if (! l_codec->is_decompressor) {
-			return OPJ_FALSE;
-		}
-		
-		return l_codec->m_codec_data.m_decompression.opj_end_decompress(l_codec->m_codec,
-																		l_stream,
-																		&(l_codec->m_event_mgr) );
-	}
+        if (! l_codec->is_decompressor) {
+            return OPJ_FALSE;
+        }
 
-	return OPJ_FALSE;
+        return l_codec->m_codec_data.m_decompression.opj_end_decompress(
+                   l_codec->m_codec,
+                   l_stream,
+                   &(l_codec->m_event_mgr));
+    }
+
+    return OPJ_FALSE;
 }
 
 OPJ_BOOL OPJ_CALLCONV opj_set_MCT(opj_cparameters_t *parameters,
                                   OPJ_FLOAT32 * pEncodingMatrix,
-                                  OPJ_INT32 * p_dc_shift,OPJ_UINT32 pNbComp)
+                                  OPJ_INT32 * p_dc_shift, OPJ_UINT32 pNbComp)
 {
-	OPJ_UINT32 l_matrix_size = pNbComp * pNbComp * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
-	OPJ_UINT32 l_dc_shift_size = pNbComp * (OPJ_UINT32)sizeof(OPJ_INT32);
-	OPJ_UINT32 l_mct_total_size = l_matrix_size + l_dc_shift_size;
+    OPJ_UINT32 l_matrix_size = pNbComp * pNbComp * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
+    OPJ_UINT32 l_dc_shift_size = pNbComp * (OPJ_UINT32)sizeof(OPJ_INT32);
+    OPJ_UINT32 l_mct_total_size = l_matrix_size + l_dc_shift_size;
 
-	/* add MCT capability */
+    /* add MCT capability */
     if (OPJ_IS_PART2(parameters->rsiz)) {
         parameters->rsiz |= OPJ_EXTENSION_MCT;
     } else {
         parameters->rsiz = ((OPJ_PROFILE_PART2) | (OPJ_EXTENSION_MCT));
     }
-	parameters->irreversible = 1;
+    parameters->irreversible = 1;
 
-	/* use array based MCT */
-	parameters->tcp_mct = 2;
-	parameters->mct_data = opj_malloc(l_mct_total_size);
-	if (! parameters->mct_data) {
-		return OPJ_FALSE;
-	}
+    /* use array based MCT */
+    parameters->tcp_mct = 2;
+    parameters->mct_data = opj_malloc(l_mct_total_size);
+    if (! parameters->mct_data) {
+        return OPJ_FALSE;
+    }
 
-	memcpy(parameters->mct_data,pEncodingMatrix,l_matrix_size);
-	memcpy(((OPJ_BYTE *) parameters->mct_data) +  l_matrix_size,p_dc_shift,l_dc_shift_size);
+    memcpy(parameters->mct_data, pEncodingMatrix, l_matrix_size);
+    memcpy(((OPJ_BYTE *) parameters->mct_data) +  l_matrix_size, p_dc_shift,
+           l_dc_shift_size);
 
-	return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL OPJ_CALLCONV opj_write_tile (	opj_codec_t *p_codec,
-										OPJ_UINT32 p_tile_index,
-										OPJ_BYTE * p_data,
-										OPJ_UINT32 p_data_size,
-										opj_stream_t *p_stream )
+OPJ_BOOL OPJ_CALLCONV opj_write_tile(opj_codec_t *p_codec,
+                                     OPJ_UINT32 p_tile_index,
+                                     OPJ_BYTE * p_data,
+                                     OPJ_UINT32 p_data_size,
+                                     opj_stream_t *p_stream)
 {
-	if (p_codec && p_stream && p_data) {
-		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
-		opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
+    if (p_codec && p_stream && p_data) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+        opj_stream_private_t * l_stream = (opj_stream_private_t *) p_stream;
 
-		if (l_codec->is_decompressor) {
-			return OPJ_FALSE;
-		}
+        if (l_codec->is_decompressor) {
+            return OPJ_FALSE;
+        }
 
-		return l_codec->m_codec_data.m_compression.opj_write_tile(	l_codec->m_codec,
-																	p_tile_index,
-																	p_data,
-																	p_data_size,
-																	l_stream,
-																	&(l_codec->m_event_mgr) );
-	}
+        return l_codec->m_codec_data.m_compression.opj_write_tile(l_codec->m_codec,
+                p_tile_index,
+                p_data,
+                p_data_size,
+                l_stream,
+                &(l_codec->m_event_mgr));
+    }
 
-	return OPJ_FALSE;
+    return OPJ_FALSE;
 }
 
 /* ---------------------------------------------------------------------- */
 
 void OPJ_CALLCONV opj_destroy_codec(opj_codec_t *p_codec)
 {
-	if (p_codec) {
-		opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
+    if (p_codec) {
+        opj_codec_private_t * l_codec = (opj_codec_private_t *) p_codec;
 
-		if (l_codec->is_decompressor) {
-			l_codec->m_codec_data.m_decompression.opj_destroy(l_codec->m_codec);
-		}
-		else {
-			l_codec->m_codec_data.m_compression.opj_destroy(l_codec->m_codec);
-		}
+        if (l_codec->is_decompressor) {
+            l_codec->m_codec_data.m_decompression.opj_destroy(l_codec->m_codec);
+        } else {
+            l_codec->m_codec_data.m_compression.opj_destroy(l_codec->m_codec);
+        }
 
-		l_codec->m_codec = 00;
-		opj_free(l_codec);
-	}
+        l_codec->m_codec = 00;
+        opj_free(l_codec);
+    }
 }
 
 /* ---------------------------------------------------------------------- */
 
-void OPJ_CALLCONV opj_dump_codec(	opj_codec_t *p_codec,
-									OPJ_INT32 info_flag,
-									FILE* output_stream)
+void OPJ_CALLCONV opj_dump_codec(opj_codec_t *p_codec,
+                                 OPJ_INT32 info_flag,
+                                 FILE* output_stream)
 {
-	if (p_codec) {
-		opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
+    if (p_codec) {
+        opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
 
-		l_codec->opj_dump_codec(l_codec->m_codec, info_flag, output_stream);
-		return;
-	}
+        l_codec->opj_dump_codec(l_codec->m_codec, info_flag, output_stream);
+        return;
+    }
 
-	/* TODO return error */
-	/* fprintf(stderr, "[ERROR] Input parameter of the dump_codec function are incorrect.\n"); */
-	return;
+    /* TODO return error */
+    /* fprintf(stderr, "[ERROR] Input parameter of the dump_codec function are incorrect.\n"); */
+    return;
 }
 
 opj_codestream_info_v2_t* OPJ_CALLCONV opj_get_cstr_info(opj_codec_t *p_codec)
 {
-	if (p_codec) {
-		opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
+    if (p_codec) {
+        opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
 
-		return l_codec->opj_get_codec_info(l_codec->m_codec);
-	}
+        return l_codec->opj_get_codec_info(l_codec->m_codec);
+    }
 
-	return NULL;
+    return NULL;
 }
 
-void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_v2_t **cstr_info) {
-	if (cstr_info) {
+void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_v2_t **cstr_info)
+{
+    if (cstr_info) {
 
-		if ((*cstr_info)->m_default_tile_info.tccp_info){
-			opj_free((*cstr_info)->m_default_tile_info.tccp_info);
-		}
+        if ((*cstr_info)->m_default_tile_info.tccp_info) {
+            opj_free((*cstr_info)->m_default_tile_info.tccp_info);
+        }
 
-		if ((*cstr_info)->tile_info){
-			/* FIXME not used for the moment*/
-		}
+        if ((*cstr_info)->tile_info) {
+            /* FIXME not used for the moment*/
+        }
 
-		opj_free((*cstr_info));
-		(*cstr_info) = NULL;
-	}
+        opj_free((*cstr_info));
+        (*cstr_info) = NULL;
+    }
 }
 
 opj_codestream_index_t * OPJ_CALLCONV opj_get_cstr_index(opj_codec_t *p_codec)
 {
-	if (p_codec) {
-		opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
+    if (p_codec) {
+        opj_codec_private_t* l_codec = (opj_codec_private_t*) p_codec;
 
-		return l_codec->opj_get_codec_index(l_codec->m_codec);
-	}
+        return l_codec->opj_get_codec_index(l_codec->m_codec);
+    }
 
-	return NULL;
+    return NULL;
 }
 
 void OPJ_CALLCONV opj_destroy_cstr_index(opj_codestream_index_t **p_cstr_index)
 {
-	if (*p_cstr_index){
-		j2k_destroy_cstr_index(*p_cstr_index);
-		(*p_cstr_index) = NULL;
-	}
+    if (*p_cstr_index) {
+        j2k_destroy_cstr_index(*p_cstr_index);
+        (*p_cstr_index) = NULL;
+    }
 }
 
-opj_stream_t* OPJ_CALLCONV opj_stream_create_default_file_stream (const char *fname, OPJ_BOOL p_is_read_stream)
+opj_stream_t* OPJ_CALLCONV opj_stream_create_default_file_stream(
+    const char *fname, OPJ_BOOL p_is_read_stream)
 {
-    return opj_stream_create_file_stream(fname, OPJ_J2K_STREAM_CHUNK_SIZE, p_is_read_stream);
+    return opj_stream_create_file_stream(fname, OPJ_J2K_STREAM_CHUNK_SIZE,
+                                         p_is_read_stream);
 }
 
-opj_stream_t* OPJ_CALLCONV opj_stream_create_file_stream (
-        const char *fname, 
-		OPJ_SIZE_T p_size, 
-        OPJ_BOOL p_is_read_stream)
+opj_stream_t* OPJ_CALLCONV opj_stream_create_file_stream(
+    const char *fname,
+    OPJ_SIZE_T p_size,
+    OPJ_BOOL p_is_read_stream)
 {
     opj_stream_t* l_stream = 00;
     FILE *p_file;
@@ -934,27 +976,48 @@
     if (! fname) {
         return NULL;
     }
-    
-    if(p_is_read_stream) mode = "rb"; else mode = "wb";
+
+    if (p_is_read_stream) {
+        mode = "rb";
+    } else {
+        mode = "wb";
+    }
 
     p_file = fopen(fname, mode);
 
     if (! p_file) {
-	    return NULL;
+        return NULL;
     }
 
-    l_stream = opj_stream_create(p_size,p_is_read_stream);
+    l_stream = opj_stream_create(p_size, p_is_read_stream);
     if (! l_stream) {
         fclose(p_file);
         return NULL;
     }
 
-    opj_stream_set_user_data(l_stream, p_file, (opj_stream_free_user_data_fn) fclose);
-    opj_stream_set_user_data_length(l_stream, opj_get_data_length_from_file(p_file));
+    opj_stream_set_user_data(l_stream, p_file,
+                             (opj_stream_free_user_data_fn) fclose);
+    opj_stream_set_user_data_length(l_stream,
+                                    opj_get_data_length_from_file(p_file));
     opj_stream_set_read_function(l_stream, (opj_stream_read_fn) opj_read_from_file);
-    opj_stream_set_write_function(l_stream, (opj_stream_write_fn) opj_write_from_file);
+    opj_stream_set_write_function(l_stream,
+                                  (opj_stream_write_fn) opj_write_from_file);
     opj_stream_set_skip_function(l_stream, (opj_stream_skip_fn) opj_skip_from_file);
     opj_stream_set_seek_function(l_stream, (opj_stream_seek_fn) opj_seek_from_file);
 
     return l_stream;
 }
+
+
+void* OPJ_CALLCONV opj_image_data_alloc(OPJ_SIZE_T size)
+{
+    void* ret = opj_aligned_malloc(size);
+    /* printf("opj_image_data_alloc %p\n", ret); */
+    return ret;
+}
+
+void OPJ_CALLCONV opj_image_data_free(void* ptr)
+{
+    /* printf("opj_image_data_free %p\n", ptr); */
+    opj_aligned_free(ptr);
+}
diff --git a/third_party/libopenjpeg20/openjpeg.h b/third_party/libopenjpeg20/openjpeg.h
index e571672..e8dbe4f 100644
--- a/third_party/libopenjpeg20/openjpeg.h
+++ b/third_party/libopenjpeg20/openjpeg.h
@@ -1,110 +1,110 @@
- /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
- * party and contributor rights, including patent rights, and no such rights
- * are granted under this license.
- *
- * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2014, Professor Benoit Macq
- * Copyright (c) 2001-2003, David Janssens
- * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
- * Copyright (c) 2003-2014, Antonin Descampe
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2006-2007, Parvatha Elangovan
- * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
- * Copyright (c) 2010-2011, Kaori Hagihara
- * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France 
- * Copyright (c) 2012, CS Systemes d'Information, France
- * 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.
- */
+/*
+* The copyright in this software is being made available under the 2-clauses
+* BSD License, included below. This software may be subject to other third
+* party and contributor rights, including patent rights, and no such rights
+* are granted under this license.
+*
+* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
+* Copyright (c) 2002-2014, Professor Benoit Macq
+* Copyright (c) 2001-2003, David Janssens
+* Copyright (c) 2002-2003, Yannick Verschueren
+* Copyright (c) 2003-2007, Francois-Olivier Devaux
+* Copyright (c) 2003-2014, Antonin Descampe
+* Copyright (c) 2005, Herve Drolon, FreeImage Team
+* Copyright (c) 2006-2007, Parvatha Elangovan
+* Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
+* Copyright (c) 2010-2011, Kaori Hagihara
+* Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France
+* Copyright (c) 2012, CS Systemes d'Information, France
+* 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
 
 
-/* 
+/*
 ==========================================================
    Compiler directives
 ==========================================================
 */
 
 /*
-The inline keyword is supported by C99 but not by C90. 
-Most compilers implement their own version of this keyword ... 
+The inline keyword is supported by C99 but not by C90.
+Most compilers implement their own version of this keyword ...
 */
 #ifndef INLINE
-	#if defined(_MSC_VER)
-		#define INLINE __forceinline
-	#elif defined(__GNUC__)
-		#define INLINE __inline__
-	#elif defined(__MWERKS__)
-		#define INLINE inline
-	#else 
-		/* add other compilers here ... */
-		#define INLINE 
-	#endif /* defined(<Compiler>) */
+#if defined(_MSC_VER)
+#define INLINE __forceinline
+#elif defined(__GNUC__)
+#define INLINE __inline__
+#elif defined(__MWERKS__)
+#define INLINE inline
+#else
+/* add other compilers here ... */
+#define INLINE
+#endif /* defined(<Compiler>) */
 #endif /* INLINE */
 
 /* deprecated attribute */
 #ifdef __GNUC__
-	#define OPJ_DEPRECATED(func) func __attribute__ ((deprecated))
+#define OPJ_DEPRECATED(func) func __attribute__ ((deprecated))
 #elif defined(_MSC_VER)
-	#define OPJ_DEPRECATED(func) __declspec(deprecated) func
+#define OPJ_DEPRECATED(func) __declspec(deprecated) func
 #else
-	#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
-	#define OPJ_DEPRECATED(func) func
+#pragma message("WARNING: You need to implement DEPRECATED for this compiler")
+#define OPJ_DEPRECATED(func) func
 #endif
 
 #if defined(OPJ_STATIC) || !defined(_WIN32)
 /* http://gcc.gnu.org/wiki/Visibility */
-#	if __GNUC__ >= 4
-#		if defined(OPJ_STATIC) /* static library uses "hidden" */
-#			define OPJ_API    __attribute__ ((visibility ("hidden")))
-#		else
-#			define OPJ_API    __attribute__ ((visibility ("default")))
-#		endif
-#		define OPJ_LOCAL  __attribute__ ((visibility ("hidden")))
-#	else
-#		define OPJ_API
-#		define OPJ_LOCAL
-#	endif
-#	define OPJ_CALLCONV
+#   if __GNUC__ >= 4
+#       if defined(OPJ_STATIC) /* static library uses "hidden" */
+#           define OPJ_API    __attribute__ ((visibility ("hidden")))
+#       else
+#           define OPJ_API    __attribute__ ((visibility ("default")))
+#       endif
+#       define OPJ_LOCAL  __attribute__ ((visibility ("hidden")))
+#   else
+#       define OPJ_API
+#       define OPJ_LOCAL
+#   endif
+#   define OPJ_CALLCONV
 #else
-#	define OPJ_CALLCONV __stdcall
+#   define OPJ_CALLCONV __stdcall
 /*
-The following ifdef block is the standard way of creating macros which make exporting 
+The following ifdef block is the standard way of creating macros which make exporting
 from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS
 symbol defined on the command line. this symbol should not be defined on any project
-that uses this DLL. This way any other project whose source files include this file see 
+that uses this DLL. This way any other project whose source files include this file see
 OPJ_API functions as being imported from a DLL, whereas this DLL sees symbols
 defined with this macro as being exported.
 */
-#	if defined(OPJ_EXPORTS) || defined(DLL_EXPORT)
-#		define OPJ_API __declspec(dllexport)
-#	else
-#		define OPJ_API __declspec(dllimport)
-#	endif /* OPJ_EXPORTS */
+#   if defined(OPJ_EXPORTS) || defined(DLL_EXPORT)
+#       define OPJ_API __declspec(dllexport)
+#   else
+#       define OPJ_API __declspec(dllimport)
+#   endif /* OPJ_EXPORTS */
 #endif /* !OPJ_STATIC || !_WIN32 */
 
 typedef int OPJ_BOOL;
@@ -135,7 +135,7 @@
 /* Avoid compile-time warning because parameter is not used */
 #define OPJ_ARG_NOT_USED(x) (void)(x)
 
-/* 
+/*
 ==========================================================
    Useful constant definitions
 ==========================================================
@@ -143,19 +143,19 @@
 
 #define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */
 
-#define OPJ_J2K_MAXRLVLS 33					/**< Number of maximum resolution level authorized */
-#define OPJ_J2K_MAXBANDS (3*OPJ_J2K_MAXRLVLS-2)	/**< Number of maximum sub-band linked to number of resolution level */
+#define OPJ_J2K_MAXRLVLS 33                 /**< Number of maximum resolution level authorized */
+#define OPJ_J2K_MAXBANDS (3*OPJ_J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */
 
-#define OPJ_J2K_DEFAULT_NB_SEGS				10
-#define OPJ_J2K_STREAM_CHUNK_SIZE			0x100000 /** 1 mega by default */
-#define OPJ_J2K_DEFAULT_HEADER_SIZE			1000
-#define OPJ_J2K_MCC_DEFAULT_NB_RECORDS		10
-#define OPJ_J2K_MCT_DEFAULT_NB_RECORDS		10
+#define OPJ_J2K_DEFAULT_NB_SEGS             10
+#define OPJ_J2K_STREAM_CHUNK_SIZE           0x100000 /** 1 mega by default */
+#define OPJ_J2K_DEFAULT_HEADER_SIZE         1000
+#define OPJ_J2K_MCC_DEFAULT_NB_RECORDS      10
+#define OPJ_J2K_MCT_DEFAULT_NB_RECORDS      10
 
 /* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */
-#define JPWL_MAX_NO_TILESPECS	16 /**< Maximum number of tile parts expected by JPWL: increase at your will */
-#define JPWL_MAX_NO_PACKSPECS	16 /**< Maximum number of packet parts expected by JPWL: increase at your will */
-#define JPWL_MAX_NO_MARKERS	512 /**< Maximum number of JPWL markers: increase at your will */
+#define JPWL_MAX_NO_TILESPECS   16 /**< Maximum number of tile parts expected by JPWL: increase at your will */
+#define JPWL_MAX_NO_PACKSPECS   16 /**< Maximum number of packet parts expected by JPWL: increase at your will */
+#define JPWL_MAX_NO_MARKERS 512 /**< Maximum number of JPWL markers: increase at your will */
 #define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */
 #define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */
 #define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */
@@ -167,19 +167,19 @@
  * EXPERIMENTAL FOR THE MOMENT
  * Supported options about file information used only in j2k_dump
 */
-#define OPJ_IMG_INFO		1	/**< Basic image information provided to the user */
-#define OPJ_J2K_MH_INFO		2	/**< Codestream information based only on the main header */
-#define OPJ_J2K_TH_INFO		4	/**< Tile information based on the current tile header */
-#define OPJ_J2K_TCH_INFO	8	/**< Tile/Component information of all tiles */
-#define OPJ_J2K_MH_IND		16	/**< Codestream index based only on the main header */
-#define OPJ_J2K_TH_IND		32	/**< Tile index based on the current tile */
-/*FIXME #define OPJ_J2K_CSTR_IND	48*/	/**<  */
-#define OPJ_JP2_INFO		128	/**< JP2 file information */
-#define OPJ_JP2_IND			256	/**< JP2 file index */
+#define OPJ_IMG_INFO        1   /**< Basic image information provided to the user */
+#define OPJ_J2K_MH_INFO     2   /**< Codestream information based only on the main header */
+#define OPJ_J2K_TH_INFO     4   /**< Tile information based on the current tile header */
+#define OPJ_J2K_TCH_INFO    8   /**< Tile/Component information of all tiles */
+#define OPJ_J2K_MH_IND      16  /**< Codestream index based only on the main header */
+#define OPJ_J2K_TH_IND      32  /**< Tile index based on the current tile */
+/*FIXME #define OPJ_J2K_CSTR_IND    48*/    /**<  */
+#define OPJ_JP2_INFO        128 /**< JP2 file information */
+#define OPJ_JP2_IND         256 /**< JP2 file index */
 
 /**
  * JPEG 2000 Profiles, see Table A.10 from 15444-1 (updated in various AMD)
- * These values help chosing the RSIZ value for the J2K codestream.
+ * These values help choosing the RSIZ value for the J2K codestream.
  * The RSIZ value triggers various encoding options, as detailed in Table A.10.
  * If OPJ_PROFILE_PART2 is chosen, it has to be combined with one or more extensions
  * described hereunder.
@@ -228,12 +228,12 @@
 /**
  * JPEG 2000 codestream and component size limits in cinema profiles
  * */
-#define OPJ_CINEMA_24_CS     1302083   	/** Maximum codestream length for 24fps */
+#define OPJ_CINEMA_24_CS     1302083    /** Maximum codestream length for 24fps */
 #define OPJ_CINEMA_48_CS     651041     /** Maximum codestream length for 48fps */
 #define OPJ_CINEMA_24_COMP   1041666    /** Maximum size per color component for 2K & 4K @ 24fps */
-#define OPJ_CINEMA_48_COMP   520833		/** Maximum size per color component for 2K @ 48fps */
+#define OPJ_CINEMA_48_COMP   520833     /** Maximum size per color component for 2K @ 48fps */
 
-/* 
+/*
 ==========================================================
    enum definitions
 ==========================================================
@@ -244,9 +244,9 @@
  * Rsiz Capabilities
  * */
 typedef enum RSIZ_CAPABILITIES {
-    OPJ_STD_RSIZ = 0,		/** Standard JPEG2000 profile*/
-    OPJ_CINEMA2K = 3,		/** Profile name for a 2K image*/
-    OPJ_CINEMA4K = 4,		/** Profile name for a 4K image*/
+    OPJ_STD_RSIZ = 0,       /** Standard JPEG2000 profile*/
+    OPJ_CINEMA2K = 3,       /** Profile name for a 2K image*/
+    OPJ_CINEMA4K = 4,       /** Profile name for a 4K image*/
     OPJ_MCT = 0x8100
 } OPJ_RSIZ_CAPABILITIES;
 
@@ -255,33 +255,33 @@
  * Digital cinema operation mode
  * */
 typedef enum CINEMA_MODE {
-    OPJ_OFF = 0,			/** Not Digital Cinema*/
-    OPJ_CINEMA2K_24 = 1,	/** 2K Digital Cinema at 24 fps*/
-    OPJ_CINEMA2K_48 = 2,	/** 2K Digital Cinema at 48 fps*/
-    OPJ_CINEMA4K_24 = 3		/** 4K Digital Cinema at 24 fps*/
-}OPJ_CINEMA_MODE;
+    OPJ_OFF = 0,            /** Not Digital Cinema*/
+    OPJ_CINEMA2K_24 = 1,    /** 2K Digital Cinema at 24 fps*/
+    OPJ_CINEMA2K_48 = 2,    /** 2K Digital Cinema at 48 fps*/
+    OPJ_CINEMA4K_24 = 3     /** 4K Digital Cinema at 24 fps*/
+} OPJ_CINEMA_MODE;
 
-/** 
+/**
  * Progression order
  * */
 typedef enum PROG_ORDER {
-	OPJ_PROG_UNKNOWN = -1,	/**< place-holder */
-	OPJ_LRCP = 0,			/**< layer-resolution-component-precinct order */
-	OPJ_RLCP = 1,			/**< resolution-layer-component-precinct order */
-	OPJ_RPCL = 2,			/**< resolution-precinct-component-layer order */
-	OPJ_PCRL = 3,			/**< precinct-component-resolution-layer order */
-	OPJ_CPRL = 4			/**< component-precinct-resolution-layer order */
+    OPJ_PROG_UNKNOWN = -1,  /**< place-holder */
+    OPJ_LRCP = 0,           /**< layer-resolution-component-precinct order */
+    OPJ_RLCP = 1,           /**< resolution-layer-component-precinct order */
+    OPJ_RPCL = 2,           /**< resolution-precinct-component-layer order */
+    OPJ_PCRL = 3,           /**< precinct-component-resolution-layer order */
+    OPJ_CPRL = 4            /**< component-precinct-resolution-layer order */
 } OPJ_PROG_ORDER;
 
 /**
  * Supported image color spaces
 */
 typedef enum COLOR_SPACE {
-    OPJ_CLRSPC_UNKNOWN = -1,	/**< not supported by the library */
-    OPJ_CLRSPC_UNSPECIFIED = 0,	/**< not specified in the codestream */
-    OPJ_CLRSPC_SRGB = 1,		/**< sRGB */
-    OPJ_CLRSPC_GRAY = 2,		/**< grayscale */
-    OPJ_CLRSPC_SYCC = 3,		/**< YUV */
+    OPJ_CLRSPC_UNKNOWN = -1,    /**< not supported by the library */
+    OPJ_CLRSPC_UNSPECIFIED = 0, /**< not specified in the codestream */
+    OPJ_CLRSPC_SRGB = 1,        /**< sRGB */
+    OPJ_CLRSPC_GRAY = 2,        /**< grayscale */
+    OPJ_CLRSPC_SYCC = 3,        /**< YUV */
     OPJ_CLRSPC_EYCC = 4,        /**< e-YCC */
     OPJ_CLRSPC_CMYK = 5         /**< CMYK */
 } OPJ_COLOR_SPACE;
@@ -290,16 +290,16 @@
  * Supported codec
 */
 typedef enum CODEC_FORMAT {
-	OPJ_CODEC_UNKNOWN = -1,	/**< place-holder */
-	OPJ_CODEC_J2K  = 0,		/**< JPEG-2000 codestream : read/write */
-	OPJ_CODEC_JPT  = 1,		/**< JPT-stream (JPEG 2000, JPIP) : read only */
-    OPJ_CODEC_JP2  = 2,		/**< JP2 file format : read/write */
-    OPJ_CODEC_JPP  = 3,		/**< JPP-stream (JPEG 2000, JPIP) : to be coded */
-    OPJ_CODEC_JPX  = 4		/**< JPX file format (JPEG 2000 Part-2) : to be coded */
+    OPJ_CODEC_UNKNOWN = -1, /**< place-holder */
+    OPJ_CODEC_J2K  = 0,     /**< JPEG-2000 codestream : read/write */
+    OPJ_CODEC_JPT  = 1,     /**< JPT-stream (JPEG 2000, JPIP) : read only */
+    OPJ_CODEC_JP2  = 2,     /**< JP2 file format : read/write */
+    OPJ_CODEC_JPP  = 3,     /**< JPP-stream (JPEG 2000, JPIP) : to be coded */
+    OPJ_CODEC_JPX  = 4      /**< JPX file format (JPEG 2000 Part-2) : to be coded */
 } OPJ_CODEC_FORMAT;
 
 
-/* 
+/*
 ==========================================================
    event manager typedef definitions
 ==========================================================
@@ -308,11 +308,11 @@
 /**
  * Callback function prototype for events
  * @param msg               Event message
- * @param client_data       Client object where will be return the event message 
+ * @param client_data       Client object where will be return the event message
  * */
-typedef void (*opj_msg_callback) (const char *msg, void *client_data);
+typedef void (*opj_msg_callback)(const char *msg, void *client_data);
 
-/* 
+/*
 ==========================================================
    codec typedef definitions
 ==========================================================
@@ -320,147 +320,147 @@
 
 /**
  * Progression order changes
- * 
+ *
  */
 typedef struct opj_poc {
-	/** Resolution num start, Component num start, given by POC */
-	OPJ_UINT32 resno0, compno0;
-	/** Layer num end,Resolution num end, Component num end, given by POC */
-	OPJ_UINT32 layno1, resno1, compno1;
-	/** Layer num start,Precinct num start, Precinct num end */
-	OPJ_UINT32 layno0, precno0, precno1;
-	/** Progression order enum*/
-	OPJ_PROG_ORDER prg1,prg;
-	/** Progression order string*/
-	OPJ_CHAR progorder[5];
-	/** Tile number */
-	OPJ_UINT32 tile;
-	/** Start and end values for Tile width and height*/
-	OPJ_INT32 tx0,tx1,ty0,ty1;
-	/** Start value, initialised in pi_initialise_encode*/
-	OPJ_UINT32 layS, resS, compS, prcS;
-	/** End value, initialised in pi_initialise_encode */
-	OPJ_UINT32 layE, resE, compE, prcE;
-	/** Start and end values of Tile width and height, initialised in pi_initialise_encode*/
-	OPJ_UINT32 txS,txE,tyS,tyE,dx,dy;
-	/** Temporary values for Tile parts, initialised in pi_create_encode */
-	OPJ_UINT32 lay_t, res_t, comp_t, prc_t,tx0_t,ty0_t;
+    /** Resolution num start, Component num start, given by POC */
+    OPJ_UINT32 resno0, compno0;
+    /** Layer num end,Resolution num end, Component num end, given by POC */
+    OPJ_UINT32 layno1, resno1, compno1;
+    /** Layer num start,Precinct num start, Precinct num end */
+    OPJ_UINT32 layno0, precno0, precno1;
+    /** Progression order enum*/
+    OPJ_PROG_ORDER prg1, prg;
+    /** Progression order string*/
+    OPJ_CHAR progorder[5];
+    /** Tile number */
+    OPJ_UINT32 tile;
+    /** Start and end values for Tile width and height*/
+    OPJ_INT32 tx0, tx1, ty0, ty1;
+    /** Start value, initialised in pi_initialise_encode*/
+    OPJ_UINT32 layS, resS, compS, prcS;
+    /** End value, initialised in pi_initialise_encode */
+    OPJ_UINT32 layE, resE, compE, prcE;
+    /** Start and end values of Tile width and height, initialised in pi_initialise_encode*/
+    OPJ_UINT32 txS, txE, tyS, tyE, dx, dy;
+    /** Temporary values for Tile parts, initialised in pi_create_encode */
+    OPJ_UINT32 lay_t, res_t, comp_t, prc_t, tx0_t, ty0_t;
 } opj_poc_t;
 
 /**
  * Compression parameters
  * */
 typedef struct opj_cparameters {
-	/** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
-	OPJ_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 OPJ_LRCP) */
-	OPJ_PROG_ORDER prog_order;
-	/** progression order changes */
-	opj_poc_t POC[32];
-	/** number of progression order changes (POC), default to 0 */
-	OPJ_UINT32 numpocs;
-	/** number of layers */
-	int tcp_numlayers;
+    /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
+    OPJ_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 OPJ_LRCP) */
+    OPJ_PROG_ORDER prog_order;
+    /** progression order changes */
+    opj_poc_t POC[32];
+    /** number of progression order changes (POC), default to 0 */
+    OPJ_UINT32 numpocs;
+    /** number of layers */
+    int tcp_numlayers;
     /** rates of layers - might be subsequently limited by the max_cs_size field */
-	float 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[OPJ_J2K_MAXRLVLS];
-	/** initial precinct height */
-	int prch_init[OPJ_J2K_MAXRLVLS];
+    float 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[OPJ_J2K_MAXRLVLS];
+    /** initial precinct height */
+    int prch_init[OPJ_J2K_MAXRLVLS];
 
-	/**@name command line encoder parameters (not used inside the library) */
-	/*@{*/
-	/** input file name */
-	char infile[OPJ_PATH_LEN];
-	/** output file name */
-	char outfile[OPJ_PATH_LEN];
-	/** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
-	int index_on;
-	/** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
-	char index[OPJ_PATH_LEN];
-	/** 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 3:TIF*/
-	int decod_format;
-	/** output file format 0: J2K, 1: JP2, 2: JPT */
-	int cod_format;
-	/*@}*/
+    /**@name command line encoder parameters (not used inside the library) */
+    /*@{*/
+    /** input file name */
+    char infile[OPJ_PATH_LEN];
+    /** output file name */
+    char outfile[OPJ_PATH_LEN];
+    /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
+    int index_on;
+    /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
+    char index[OPJ_PATH_LEN];
+    /** 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 3:TIF*/
+    int decod_format;
+    /** output file format 0: J2K, 1: JP2, 2: JPT */
+    int cod_format;
+    /*@}*/
 
-/* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */
-	/**@name JPWL encoding parameters */
-	/*@{*/
-	/** enables writing of EPC in MH, thus activating JPWL */
-	OPJ_BOOL jpwl_epc_on;
-	/** error protection method for MH (0,1,16,32,37-128) */
-	int jpwl_hprot_MH;
-	/** tile number of header protection specification (>=0) */
-	int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
-	/** error protection methods for TPHs (0,1,16,32,37-128) */
-	int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS];
-	/** tile number of packet protection specification (>=0) */
-	int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS];
-	/** packet number of packet protection specification (>=0) */
-	int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS];
-	/** error protection methods for packets (0,1,16,32,37-128) */
-	int jpwl_pprot[JPWL_MAX_NO_PACKSPECS];
-	/** enables writing of ESD, (0=no/1/2 bytes) */
-	int jpwl_sens_size;
-	/** sensitivity addressing size (0=auto/2/4 bytes) */
-	int jpwl_sens_addr;
-	/** sensitivity range (0-3) */
-	int jpwl_sens_range;
-	/** sensitivity method for MH (-1=no,0-7) */
-	int jpwl_sens_MH;
-	/** tile number of sensitivity specification (>=0) */
-	int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
-	/** sensitivity methods for TPHs (-1=no,0-7) */
-	int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS];
-	/*@}*/
-/* <<UniPG */
+    /* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */
+    /**@name JPWL encoding parameters */
+    /*@{*/
+    /** enables writing of EPC in MH, thus activating JPWL */
+    OPJ_BOOL jpwl_epc_on;
+    /** error protection method for MH (0,1,16,32,37-128) */
+    int jpwl_hprot_MH;
+    /** tile number of header protection specification (>=0) */
+    int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+    /** error protection methods for TPHs (0,1,16,32,37-128) */
+    int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS];
+    /** tile number of packet protection specification (>=0) */
+    int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS];
+    /** packet number of packet protection specification (>=0) */
+    int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS];
+    /** error protection methods for packets (0,1,16,32,37-128) */
+    int jpwl_pprot[JPWL_MAX_NO_PACKSPECS];
+    /** enables writing of ESD, (0=no/1/2 bytes) */
+    int jpwl_sens_size;
+    /** sensitivity addressing size (0=auto/2/4 bytes) */
+    int jpwl_sens_addr;
+    /** sensitivity range (0-3) */
+    int jpwl_sens_range;
+    /** sensitivity method for MH (-1=no,0-7) */
+    int jpwl_sens_MH;
+    /** tile number of sensitivity specification (>=0) */
+    int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
+    /** sensitivity methods for TPHs (-1=no,0-7) */
+    int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS];
+    /*@}*/
+    /* <<UniPG */
 
     /**
      * DEPRECATED: use RSIZ, OPJ_PROFILE_* and MAX_COMP_SIZE instead
@@ -471,23 +471,23 @@
      * Maximum size (in bytes) for each component.
      * If == 0, component size limitation is not considered
      * */
-	int max_comp_size;
+    int max_comp_size;
     /**
      * DEPRECATED: use RSIZ, OPJ_PROFILE_* and OPJ_EXTENSION_* instead
      * Profile name
      * */
     OPJ_RSIZ_CAPABILITIES cp_rsiz;
-	/** Tile part generation*/
-	char tp_on;
-	/** Flag for Tile part generation*/
-	char tp_flag;
-	/** MCT (multiple component transform) */
-	char tcp_mct;
-	/** Enable JPIP indexing*/
-	OPJ_BOOL jpip_on;
-	/** Naive implementation of MCT restricted to a single reversible array based 
+    /** Tile part generation*/
+    char tp_on;
+    /** Flag for Tile part generation*/
+    char tp_flag;
+    /** MCT (multiple component transform) */
+    char tcp_mct;
+    /** Enable JPIP indexing*/
+    OPJ_BOOL jpip_on;
+    /** Naive implementation of MCT restricted to a single reversible array based
         encoding without offset concerning all the components. */
-	void * mct_data;
+    void * mct_data;
     /**
      * Maximum size (in bytes) for the whole codestream.
      * If == 0, codestream size limitation is not considered
@@ -498,72 +498,73 @@
     /** RSIZ value
         To be used to combine OPJ_PROFILE_*, OPJ_EXTENSION_* and (sub)levels values. */
     OPJ_UINT16 rsiz;
-} opj_cparameters_t;  
+} opj_cparameters_t;
 
-#define OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG	0x0001
+#define OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG  0x0001
+#define OPJ_DPARAMETERS_DUMP_FLAG 0x0002
 
 /**
  * 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 
-	*/
-	OPJ_UINT32 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 
-	*/
-	OPJ_UINT32 cp_layer;
+    /**
+    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
+    */
+    OPJ_UINT32 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
+    */
+    OPJ_UINT32 cp_layer;
 
-	/**@name command line decoder parameters (not used inside the library) */
-	/*@{*/
-	/** input file name */
-	char infile[OPJ_PATH_LEN];
-	/** output file name */
-	char outfile[OPJ_PATH_LEN];
-	/** input file format 0: J2K, 1: JP2, 2: JPT */
-	int decod_format;
-	/** output file format 0: PGX, 1: PxM, 2: BMP */
-	int cod_format;
+    /**@name command line decoder parameters (not used inside the library) */
+    /*@{*/
+    /** input file name */
+    char infile[OPJ_PATH_LEN];
+    /** output file name */
+    char outfile[OPJ_PATH_LEN];
+    /** input file format 0: J2K, 1: JP2, 2: JPT */
+    int decod_format;
+    /** output file format 0: PGX, 1: PxM, 2: BMP */
+    int cod_format;
 
-	/** Decoding area left boundary */
-	OPJ_UINT32 DA_x0;
-	/** Decoding area right boundary */
-	OPJ_UINT32 DA_x1;
-	/** Decoding area up boundary */
-	OPJ_UINT32 DA_y0;
-	/** Decoding area bottom boundary */
-	OPJ_UINT32 DA_y1;
-	/** Verbose mode */
-	OPJ_BOOL m_verbose;
+    /** Decoding area left boundary */
+    OPJ_UINT32 DA_x0;
+    /** Decoding area right boundary */
+    OPJ_UINT32 DA_x1;
+    /** Decoding area up boundary */
+    OPJ_UINT32 DA_y0;
+    /** Decoding area bottom boundary */
+    OPJ_UINT32 DA_y1;
+    /** Verbose mode */
+    OPJ_BOOL m_verbose;
 
-	/** tile number ot the decoded tile*/
-	OPJ_UINT32 tile_index;
-	/** Nb of tile to decode */
-	OPJ_UINT32 nb_tile_to_decode;
+    /** tile number ot the decoded tile*/
+    OPJ_UINT32 tile_index;
+    /** Nb of tile to decode */
+    OPJ_UINT32 nb_tile_to_decode;
 
-	/*@}*/
+    /*@}*/
 
-/* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */
-	/**@name JPWL decoding parameters */
-	/*@{*/
-	/** activates the JPWL correction capabilities */
-	OPJ_BOOL jpwl_correct;
-	/** expected number of components */
-	int jpwl_exp_comps;
-	/** maximum number of tiles */
-	int jpwl_max_tiles;
-	/*@}*/
-/* <<UniPG */
+    /* UniPG>> */ /* NOT YET USED IN THE V2 VERSION OF OPENJPEG */
+    /**@name JPWL decoding parameters */
+    /*@{*/
+    /** activates the JPWL correction capabilities */
+    OPJ_BOOL jpwl_correct;
+    /** expected number of components */
+    int jpwl_exp_comps;
+    /** maximum number of tiles */
+    int jpwl_max_tiles;
+    /*@}*/
+    /* <<UniPG */
 
-	unsigned int flags;
+    unsigned int flags;
 
 } opj_dparameters_t;
 
@@ -573,7 +574,7 @@
  * */
 typedef void * opj_codec_t;
 
-/* 
+/*
 ==========================================================
    I/O stream typedef definitions
 ==========================================================
@@ -583,41 +584,45 @@
  * Stream open flags.
  * */
 /** The stream was opened for reading. */
-#define OPJ_STREAM_READ	OPJ_TRUE
+#define OPJ_STREAM_READ OPJ_TRUE
 /** The stream was opened for writing. */
 #define OPJ_STREAM_WRITE OPJ_FALSE
 
 /*
  * Callback function prototype for read function
  */
-typedef OPJ_SIZE_T (* opj_stream_read_fn) (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) ;
+typedef OPJ_SIZE_T(* opj_stream_read_fn)(void * p_buffer, OPJ_SIZE_T p_nb_bytes,
+        void * p_user_data) ;
 
 /*
  * Callback function prototype for write function
  */
-typedef OPJ_SIZE_T (* opj_stream_write_fn) (void * p_buffer, OPJ_SIZE_T p_nb_bytes, void * p_user_data) ;
+typedef OPJ_SIZE_T(* opj_stream_write_fn)(void * p_buffer,
+        OPJ_SIZE_T p_nb_bytes, void * p_user_data) ;
 
 /*
  * Callback function prototype for skip function
  */
-typedef OPJ_OFF_T (* opj_stream_skip_fn) (OPJ_OFF_T p_nb_bytes, void * p_user_data) ;
+typedef OPJ_OFF_T(* opj_stream_skip_fn)(OPJ_OFF_T p_nb_bytes,
+                                        void * p_user_data) ;
 
 /*
  * Callback function prototype for seek function
  */
-typedef OPJ_BOOL (* opj_stream_seek_fn) (OPJ_OFF_T p_nb_bytes, void * p_user_data) ;
+typedef OPJ_BOOL(* opj_stream_seek_fn)(OPJ_OFF_T p_nb_bytes,
+                                       void * p_user_data) ;
 
 /*
  * Callback function prototype for free user data function
  */
-typedef void (* opj_stream_free_user_data_fn) (void * p_user_data) ;
+typedef void (* opj_stream_free_user_data_fn)(void * p_user_data) ;
 
 /*
  * JPEG2000 Stream.
  */
 typedef void * opj_stream_t;
 
-/* 
+/*
 ==========================================================
    image typedef definitions
 ==========================================================
@@ -627,59 +632,60 @@
  * 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 */
-	OPJ_UINT32 dx;
-	/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
-	OPJ_UINT32 dy;
-	/** data width */
-	OPJ_UINT32 w;
-	/** data height */
-	OPJ_UINT32 h;
-	/** x component offset compared to the whole image */
-	OPJ_UINT32 x0;
-	/** y component offset compared to the whole image */
-	OPJ_UINT32 y0;
-	/** precision */
-	OPJ_UINT32 prec;
-	/** image depth in bits */
-	OPJ_UINT32 bpp;
-	/** signed (1) / unsigned (0) */
-	OPJ_UINT32 sgnd;
-	/** number of decoded resolution */
-	OPJ_UINT32 resno_decoded;
-	/** number of division by 2 of the out image compared to the original size of image */
-	OPJ_UINT32 factor;
-	/** image component data */
-	OPJ_INT32 *data;
-  /** alpha channel */
-  OPJ_UINT16 alpha;
+    /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
+    OPJ_UINT32 dx;
+    /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
+    OPJ_UINT32 dy;
+    /** data width */
+    OPJ_UINT32 w;
+    /** data height */
+    OPJ_UINT32 h;
+    /** x component offset compared to the whole image */
+    OPJ_UINT32 x0;
+    /** y component offset compared to the whole image */
+    OPJ_UINT32 y0;
+    /** precision */
+    OPJ_UINT32 prec;
+    /** image depth in bits */
+    OPJ_UINT32 bpp;
+    /** signed (1) / unsigned (0) */
+    OPJ_UINT32 sgnd;
+    /** number of decoded resolution */
+    OPJ_UINT32 resno_decoded;
+    /** number of division by 2 of the out image compared to the original size of image */
+    OPJ_UINT32 factor;
+    /** image component data */
+    OPJ_INT32 *data;
+    /** alpha channel */
+    OPJ_UINT16 alpha;
 } 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 */
-	OPJ_UINT32 x0;
-	/** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */
-	OPJ_UINT32 y0;
-	/** Xsiz: width of the reference grid */
-	OPJ_UINT32 x1;
-	/** Ysiz: height of the reference grid */
-	OPJ_UINT32 y1;
-	/** number of components in the image */
-	OPJ_UINT32 numcomps;
-	/** color space: sRGB, Greyscale or YUV */
-	OPJ_COLOR_SPACE color_space;
-	/** image components */
-	opj_image_comp_t *comps;
-	/** 'restricted' ICC profile */
-	OPJ_BYTE *icc_profile_buf;
-	/** size of ICC profile */
-	OPJ_UINT32 icc_profile_len;
+    /** XOsiz: horizontal offset from the origin of the reference grid to the left side of the image area */
+    OPJ_UINT32 x0;
+    /** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */
+    OPJ_UINT32 y0;
+    /** Xsiz: width of the reference grid */
+    OPJ_UINT32 x1;
+    /** Ysiz: height of the reference grid */
+    OPJ_UINT32 y1;
+    /** number of components in the image */
+    OPJ_UINT32 numcomps;
+    /** color space: sRGB, Greyscale or YUV */
+    OPJ_COLOR_SPACE color_space;
+    /** image components */
+    opj_image_comp_t *comps;
+    /** 'restricted' ICC profile */
+    OPJ_BYTE *icc_profile_buf;
+    /** size of ICC profile */
+    OPJ_UINT32 icc_profile_len;
 
-	/** Whether to apply PCLR or not */
-	OPJ_BOOL pdfium_use_colorspace;
+
+    /** Whether to apply PCLR or not */
+    OPJ_BOOL pdfium_use_colorspace;
 } opj_image_t;
 
 
@@ -687,28 +693,28 @@
  * 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 */
-	OPJ_UINT32 dx;
-	/** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
-	OPJ_UINT32 dy;
-	/** data width */
-	OPJ_UINT32 w;
-	/** data height */
-	OPJ_UINT32 h;
-	/** x component offset compared to the whole image */
-	OPJ_UINT32 x0;
-	/** y component offset compared to the whole image */
-	OPJ_UINT32 y0;
-	/** precision */
-	OPJ_UINT32 prec;
-	/** image depth in bits */
-	OPJ_UINT32 bpp;
-	/** signed (1) / unsigned (0) */
-	OPJ_UINT32 sgnd;
+    /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
+    OPJ_UINT32 dx;
+    /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
+    OPJ_UINT32 dy;
+    /** data width */
+    OPJ_UINT32 w;
+    /** data height */
+    OPJ_UINT32 h;
+    /** x component offset compared to the whole image */
+    OPJ_UINT32 x0;
+    /** y component offset compared to the whole image */
+    OPJ_UINT32 y0;
+    /** precision */
+    OPJ_UINT32 prec;
+    /** image depth in bits */
+    OPJ_UINT32 bpp;
+    /** signed (1) / unsigned (0) */
+    OPJ_UINT32 sgnd;
 } opj_image_cmptparm_t;
 
 
-/* 
+/*
 ==========================================================
    Information on the JPEG 2000 codestream
 ==========================================================
@@ -719,14 +725,14 @@
  * Index structure : Information concerning a packet inside tile
  * */
 typedef struct opj_packet_info {
-	/** packet start position (including SOP marker if it exists) */
-	OPJ_OFF_T start_pos;
-	/** end of packet header position (including EPH marker if it exists)*/
-	OPJ_OFF_T end_ph_pos;
-	/** packet end position */
-	OPJ_OFF_T end_pos;
-	/** packet distorsion */
-	double disto;
+    /** packet start position (including SOP marker if it exists) */
+    OPJ_OFF_T start_pos;
+    /** end of packet header position (including EPH marker if it exists)*/
+    OPJ_OFF_T end_ph_pos;
+    /** packet end position */
+    OPJ_OFF_T end_pos;
+    /** packet distorsion */
+    double disto;
 } opj_packet_info_t;
 
 
@@ -735,12 +741,12 @@
  * Marker structure
  * */
 typedef struct opj_marker_info {
-	/** marker type */
-	unsigned short int type;
-	/** position in codestream */
-	OPJ_OFF_T pos;
-	/** length, marker val included */
-	int len;
+    /** marker type */
+    unsigned short int type;
+    /** position in codestream */
+    OPJ_OFF_T pos;
+    /** length, marker val included */
+    int len;
 } opj_marker_info_t;
 /* <<UniPG */
 
@@ -748,108 +754,108 @@
  * Index structure : Information concerning tile-parts
 */
 typedef struct opj_tp_info {
-	/** start position of tile part */
-	int tp_start_pos;
-	/** end position of tile part header */
-	int tp_end_header;
-	/** end position of tile part */
-	int tp_end_pos;
-	/** start packet of tile part */
-	int tp_start_pack;
-	/** number of packets of tile part */
-	int tp_numpacks;
+    /** start position of tile part */
+    int tp_start_pos;
+    /** end position of tile part header */
+    int tp_end_header;
+    /** end position of tile part */
+    int tp_end_pos;
+    /** start packet of tile part */
+    int tp_start_pack;
+    /** number of packets of tile part */
+    int tp_numpacks;
 } opj_tp_info_t;
 
 /**
  * Index structure : information regarding tiles
 */
 typedef struct opj_tile_info {
-	/** value of thresh for each layer by tile cfr. Marcela   */
-	double *thresh;
-	/** number of tile */
-	int tileno;
-	/** 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 numpix;
-	/** add fixed_quality */
-	double distotile;
-  	/** number of markers */
-	int marknum;
-	/** list of markers */
-	opj_marker_info_t *marker;
-	/** actual size of markers array */
-	int maxmarknum;
-	/** number of tile parts */
-	int num_tps;
-	/** information concerning tile parts */
-	opj_tp_info_t *tp;
+    /** value of thresh for each layer by tile cfr. Marcela   */
+    double *thresh;
+    /** number of tile */
+    int tileno;
+    /** 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 numpix;
+    /** add fixed_quality */
+    double distotile;
+    /** number of markers */
+    int marknum;
+    /** list of markers */
+    opj_marker_info_t *marker;
+    /** actual size of markers array */
+    int maxmarknum;
+    /** number of tile parts */
+    int num_tps;
+    /** information concerning tile parts */
+    opj_tp_info_t *tp;
 } opj_tile_info_t;
 
 /**
  * Index structure of the codestream
 */
 typedef struct opj_codestream_info {
-	/** maximum distortion reduction on the whole image (add for Marcela) */
-	double D_max;
-	/** packet number */
-	int packno;
-	/** 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 numcomps;
-	/** number of layer */
-	int numlayers;
-	/** number of decomposition for each component */
-	int *numdecompos;
-/* UniPG>> */
-	/** number of markers */
-	int marknum;
-	/** list of markers */
-	opj_marker_info_t *marker;
-	/** actual size of markers array */
-	int maxmarknum;
-/* <<UniPG */
-	/** main header position */
-	int main_head_start;
-	/** main header position */
-	int main_head_end;
-	/** codestream's size */
-	int codestream_size;
-	/** information regarding tiles inside image */
-	opj_tile_info_t *tile;
+    /** maximum distortion reduction on the whole image (add for Marcela) */
+    double D_max;
+    /** packet number */
+    int packno;
+    /** 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 numcomps;
+    /** number of layer */
+    int numlayers;
+    /** number of decomposition for each component */
+    int *numdecompos;
+    /* UniPG>> */
+    /** number of markers */
+    int marknum;
+    /** list of markers */
+    opj_marker_info_t *marker;
+    /** actual size of markers array */
+    int maxmarknum;
+    /* <<UniPG */
+    /** main header position */
+    int main_head_start;
+    /** main header position */
+    int main_head_end;
+    /** codestream's size */
+    int codestream_size;
+    /** information regarding tiles inside image */
+    opj_tile_info_t *tile;
 } opj_codestream_info_t;
 
 /* <----------------------------------------------------------- */
@@ -858,36 +864,35 @@
 /**
  * Tile-component coding parameters information
  */
-typedef struct opj_tccp_info
-{
-	/** component index */
-	OPJ_UINT32 compno;
-	/** coding style */
-	OPJ_UINT32 csty;
-	/** number of resolutions */
-	OPJ_UINT32 numresolutions;
-	/** code-blocks width */
-	OPJ_UINT32 cblkw;
-	/** code-blocks height */
-	OPJ_UINT32 cblkh;
-	/** code-block coding style */
-	OPJ_UINT32 cblksty;
-	/** discrete wavelet transform identifier */
-	OPJ_UINT32 qmfbid;
-	/** quantisation style */
-	OPJ_UINT32 qntsty;
-	/** stepsizes used for quantization */
-	OPJ_UINT32 stepsizes_mant[OPJ_J2K_MAXBANDS];
-	/** stepsizes used for quantization */
-	OPJ_UINT32 stepsizes_expn[OPJ_J2K_MAXBANDS];
-	/** number of guard bits */
-	OPJ_UINT32 numgbits;
-	/** Region Of Interest shift */
-	OPJ_INT32 roishift;
-	/** precinct width */
-	OPJ_UINT32 prcw[OPJ_J2K_MAXRLVLS];
-	/** precinct height */
-	OPJ_UINT32 prch[OPJ_J2K_MAXRLVLS];
+typedef struct opj_tccp_info {
+    /** component index */
+    OPJ_UINT32 compno;
+    /** coding style */
+    OPJ_UINT32 csty;
+    /** number of resolutions */
+    OPJ_UINT32 numresolutions;
+    /** code-blocks width */
+    OPJ_UINT32 cblkw;
+    /** code-blocks height */
+    OPJ_UINT32 cblkh;
+    /** code-block coding style */
+    OPJ_UINT32 cblksty;
+    /** discrete wavelet transform identifier: 0 = 9-7 irreversible, 1 = 5-3 reversible */
+    OPJ_UINT32 qmfbid;
+    /** quantisation style */
+    OPJ_UINT32 qntsty;
+    /** stepsizes used for quantization */
+    OPJ_UINT32 stepsizes_mant[OPJ_J2K_MAXBANDS];
+    /** stepsizes used for quantization */
+    OPJ_UINT32 stepsizes_expn[OPJ_J2K_MAXBANDS];
+    /** number of guard bits */
+    OPJ_UINT32 numgbits;
+    /** Region Of Interest shift */
+    OPJ_INT32 roishift;
+    /** precinct width */
+    OPJ_UINT32 prcw[OPJ_J2K_MAXRLVLS];
+    /** precinct height */
+    OPJ_UINT32 prch[OPJ_J2K_MAXRLVLS];
 }
 opj_tccp_info_t;
 
@@ -896,19 +901,19 @@
  */
 typedef struct opj_tile_v2_info {
 
-	/** number (index) of tile */
-	int tileno;
-	/** coding style */
-	OPJ_UINT32 csty;
-	/** progression order */
-	OPJ_PROG_ORDER prg;
-	/** number of layers */
-	OPJ_UINT32 numlayers;
-	/** multi-component transform identifier */
-	OPJ_UINT32 mct;
+    /** number (index) of tile */
+    int tileno;
+    /** coding style */
+    OPJ_UINT32 csty;
+    /** progression order */
+    OPJ_PROG_ORDER prg;
+    /** number of layers */
+    OPJ_UINT32 numlayers;
+    /** multi-component transform identifier */
+    OPJ_UINT32 mct;
 
-	/** information concerning tile component parameters*/
-	opj_tccp_info_t *tccp_info;
+    /** information concerning tile component parameters*/
+    opj_tccp_info_t *tccp_info;
 
 } opj_tile_info_v2_t;
 
@@ -916,28 +921,28 @@
  * Information structure about the codestream (FIXME should be expand and enhance)
  */
 typedef struct opj_codestream_info_v2 {
-	/* Tile info */
-	/** tile origin in x = XTOsiz */
-	OPJ_UINT32 tx0;
-	/** tile origin in y = YTOsiz */
-	OPJ_UINT32 ty0;
-	/** tile size in x = XTsiz */
-	OPJ_UINT32 tdx;
-	/** tile size in y = YTsiz */
-	OPJ_UINT32 tdy;
-	/** number of tiles in X */
-	OPJ_UINT32 tw;
-	/** number of tiles in Y */
-	OPJ_UINT32 th;
+    /* Tile info */
+    /** tile origin in x = XTOsiz */
+    OPJ_UINT32 tx0;
+    /** tile origin in y = YTOsiz */
+    OPJ_UINT32 ty0;
+    /** tile size in x = XTsiz */
+    OPJ_UINT32 tdx;
+    /** tile size in y = YTsiz */
+    OPJ_UINT32 tdy;
+    /** number of tiles in X */
+    OPJ_UINT32 tw;
+    /** number of tiles in Y */
+    OPJ_UINT32 th;
 
-	/** number of components*/
-	OPJ_UINT32 nbcomps;
+    /** number of components*/
+    OPJ_UINT32 nbcomps;
 
-	/** Default information regarding tiles inside image */
-	opj_tile_info_v2_t m_default_tile_info;
+    /** Default information regarding tiles inside image */
+    opj_tile_info_v2_t m_default_tile_info;
 
-	/** information regarding tiles inside image */
-	opj_tile_info_v2_t *tile_info; /* FIXME not used for the moment */
+    /** information regarding tiles inside image */
+    opj_tile_info_v2_t *tile_info; /* FIXME not used for the moment */
 
 } opj_codestream_info_v2_t;
 
@@ -946,12 +951,12 @@
  * Index structure about a tile part
  */
 typedef struct opj_tp_index {
-	/** start position */
-	OPJ_OFF_T start_pos;
-	/** end position of the header */
-	OPJ_OFF_T end_header;
-	/** end position */
-	OPJ_OFF_T end_pos;
+    /** start position */
+    OPJ_OFF_T start_pos;
+    /** end position of the header */
+    OPJ_OFF_T end_header;
+    /** end position */
+    OPJ_OFF_T end_pos;
 
 } opj_tp_index_t;
 
@@ -959,31 +964,31 @@
  * Index structure about a tile
  */
 typedef struct opj_tile_index {
-	/** tile index */
-	OPJ_UINT32 tileno;
+    /** tile index */
+    OPJ_UINT32 tileno;
 
-	/** number of tile parts */
-	OPJ_UINT32 nb_tps;
-	/** current nb of tile part (allocated)*/
-	OPJ_UINT32 current_nb_tps;
-	/** current tile-part index */
-	OPJ_UINT32 current_tpsno;
-	/** information concerning tile parts */
-	opj_tp_index_t *tp_index;
+    /** number of tile parts */
+    OPJ_UINT32 nb_tps;
+    /** current nb of tile part (allocated)*/
+    OPJ_UINT32 current_nb_tps;
+    /** current tile-part index */
+    OPJ_UINT32 current_tpsno;
+    /** information concerning tile parts */
+    opj_tp_index_t *tp_index;
 
-	/* UniPG>> */ /* NOT USED FOR THE MOMENT IN THE V2 VERSION */
-		/** number of markers */
-		OPJ_UINT32 marknum;
-		/** list of markers */
-		opj_marker_info_t *marker;
-		/** actual size of markers array */
-		OPJ_UINT32 maxmarknum;
-	/* <<UniPG */
+    /* UniPG>> */ /* NOT USED FOR THE MOMENT IN THE V2 VERSION */
+    /** number of markers */
+    OPJ_UINT32 marknum;
+    /** list of markers */
+    opj_marker_info_t *marker;
+    /** actual size of markers array */
+    OPJ_UINT32 maxmarknum;
+    /* <<UniPG */
 
-	/** packet number */
-	OPJ_UINT32 nb_packet;
-	/** information concerning packets inside tile */
-	opj_packet_info_t *packet_index;
+    /** packet number */
+    OPJ_UINT32 nb_packet;
+    /** information concerning packets inside tile */
+    opj_packet_info_t *packet_index;
 
 } opj_tile_index_t;
 
@@ -991,29 +996,29 @@
  * Index structure of the codestream (FIXME should be expand and enhance)
  */
 typedef struct opj_codestream_index {
-	/** main header start position (SOC position) */
-	OPJ_OFF_T main_head_start;
-	/** main header end position (first SOT position) */
-	OPJ_OFF_T main_head_end;
+    /** main header start position (SOC position) */
+    OPJ_OFF_T main_head_start;
+    /** main header end position (first SOT position) */
+    OPJ_OFF_T main_head_end;
 
-	/** codestream's size */
-	OPJ_UINT64 codestream_size;
+    /** codestream's size */
+    OPJ_UINT64 codestream_size;
 
-/* UniPG>> */ /* NOT USED FOR THE MOMENT IN THE V2 VERSION */
-	/** number of markers */
-	OPJ_UINT32 marknum;
-	/** list of markers */
-	opj_marker_info_t *marker;
-	/** actual size of markers array */
-	OPJ_UINT32 maxmarknum;
-/* <<UniPG */
+    /* UniPG>> */ /* NOT USED FOR THE MOMENT IN THE V2 VERSION */
+    /** number of markers */
+    OPJ_UINT32 marknum;
+    /** list of markers */
+    opj_marker_info_t *marker;
+    /** actual size of markers array */
+    OPJ_UINT32 maxmarknum;
+    /* <<UniPG */
 
-	/** */
-	OPJ_UINT32 nb_of_tiles;
-	/** */
-	opj_tile_index_t *tile_index; /* FIXME not used for the moment */
+    /** */
+    OPJ_UINT32 nb_of_tiles;
+    /** */
+    opj_tile_index_t *tile_index; /* FIXME not used for the moment */
 
-}opj_codestream_index_t;
+} opj_codestream_index_t;
 /* -----------------------------------------------------------> */
 
 /*
@@ -1027,8 +1032,8 @@
  * EXPERIMENTAL FOR THE MOMENT
  */
 typedef struct opj_jp2_metadata {
-	/** */
-	OPJ_INT32	not_used;
+    /** */
+    OPJ_INT32   not_used;
 
 } opj_jp2_metadata_t;
 
@@ -1037,8 +1042,8 @@
  * EXPERIMENTAL FOR THE MOMENT
  */
 typedef struct opj_jp2_index {
-	/** */
-	OPJ_INT32	not_used;
+    /** */
+    OPJ_INT32   not_used;
 
 } opj_jp2_index_t;
 
@@ -1048,7 +1053,7 @@
 #endif
 
 
-/* 
+/*
 ==========================================================
    openjpeg version
 ==========================================================
@@ -1057,7 +1062,7 @@
 /* Get the version of the openjpeg library*/
 OPJ_API const char * OPJ_CALLCONV opj_version(void);
 
-/* 
+/*
 ==========================================================
    image functions definitions
 ==========================================================
@@ -1071,7 +1076,8 @@
  * @param clrspc        image color space
  * @return returns      a new image structure if successful, returns NULL otherwise
  * */
-OPJ_API opj_image_t* OPJ_CALLCONV opj_image_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
+OPJ_API opj_image_t* OPJ_CALLCONV opj_image_create(OPJ_UINT32 numcmpts,
+        opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
 
 /**
  * Deallocate any resources associated with an image
@@ -1083,15 +1089,37 @@
 /**
  * Creates an image without allocating memory for the image (used in the new version of the library).
  *
- * @param	numcmpts    the number of components
- * @param	cmptparms   the components parameters
- * @param	clrspc      the image color space
+ * @param   numcmpts    the number of components
+ * @param   cmptparms   the components parameters
+ * @param   clrspc      the image color space
  *
- * @return	a new image structure if successful, NULL otherwise.
+ * @return  a new image structure if successful, NULL otherwise.
 */
-OPJ_API opj_image_t* OPJ_CALLCONV opj_image_tile_create(OPJ_UINT32 numcmpts, opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
+OPJ_API opj_image_t* OPJ_CALLCONV opj_image_tile_create(OPJ_UINT32 numcmpts,
+        opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
 
-/* 
+/**
+ * Allocator for opj_image_t->comps[].data
+ * To be paired with opj_image_data_free.
+ *
+ * @param   size    number of bytes to allocate
+ *
+ * @return  a new pointer if successful, NULL otherwise.
+ * @since 2.2.0
+*/
+OPJ_API void* OPJ_CALLCONV opj_image_data_alloc(OPJ_SIZE_T size);
+
+/**
+ * Destructor for opj_image_t->comps[].data
+ * To be paired with opj_image_data_alloc.
+ *
+ * @param   ptr    Pointer to free
+ *
+ * @since 2.2.0
+*/
+OPJ_API void OPJ_CALLCONV opj_image_data_free(void* ptr);
+
+/*
 ==========================================================
    stream functions definitions
 ==========================================================
@@ -1100,65 +1128,72 @@
 /**
  * Creates an abstract stream. This function does nothing except allocating memory and initializing the abstract stream.
  *
- * @param	p_is_input		if set to true then the stream will be an input stream, an output stream else.
+ * @param   p_is_input      if set to true then the stream will be an input stream, an output stream else.
  *
- * @return	a stream object.
+ * @return  a stream object.
 */
-OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_default_create(OPJ_BOOL p_is_input);
+OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_default_create(
+    OPJ_BOOL p_is_input);
 
 /**
  * Creates an abstract stream. This function does nothing except allocating memory and initializing the abstract stream.
  *
- * @param	p_buffer_size  FIXME DOC
- * @param	p_is_input		if set to true then the stream will be an input stream, an output stream else.
+ * @param   p_buffer_size  FIXME DOC
+ * @param   p_is_input      if set to true then the stream will be an input stream, an output stream else.
  *
- * @return	a stream object.
+ * @return  a stream object.
 */
-OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create(OPJ_SIZE_T p_buffer_size, OPJ_BOOL p_is_input);
+OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create(OPJ_SIZE_T p_buffer_size,
+        OPJ_BOOL p_is_input);
 
 /**
  * Destroys a stream created by opj_create_stream. This function does NOT close the abstract stream. If needed the user must
  * close its own implementation of the stream.
  *
- * @param	p_stream	the stream to destroy.
+ * @param   p_stream    the stream to destroy.
  */
 OPJ_API void OPJ_CALLCONV opj_stream_destroy(opj_stream_t* p_stream);
- 
+
 /**
  * Sets the given function to be used as a read function.
- * @param		p_stream	the stream to modify
- * @param		p_function	the function to use a read function.
+ * @param       p_stream    the stream to modify
+ * @param       p_function  the function to use a read function.
 */
-OPJ_API void OPJ_CALLCONV opj_stream_set_read_function(opj_stream_t* p_stream, opj_stream_read_fn p_function);
+OPJ_API void OPJ_CALLCONV opj_stream_set_read_function(opj_stream_t* p_stream,
+        opj_stream_read_fn p_function);
 
 /**
  * Sets the given function to be used as a write function.
- * @param		p_stream	the stream to modify
- * @param		p_function	the function to use a write function.
+ * @param       p_stream    the stream to modify
+ * @param       p_function  the function to use a write function.
 */
-OPJ_API void OPJ_CALLCONV opj_stream_set_write_function(opj_stream_t* p_stream, opj_stream_write_fn p_function);
+OPJ_API void OPJ_CALLCONV opj_stream_set_write_function(opj_stream_t* p_stream,
+        opj_stream_write_fn p_function);
 
 /**
  * Sets the given function to be used as a skip function.
- * @param		p_stream	the stream to modify
- * @param		p_function	the function to use a skip function.
+ * @param       p_stream    the stream to modify
+ * @param       p_function  the function to use a skip function.
 */
-OPJ_API void OPJ_CALLCONV opj_stream_set_skip_function(opj_stream_t* p_stream, opj_stream_skip_fn p_function);
+OPJ_API void OPJ_CALLCONV opj_stream_set_skip_function(opj_stream_t* p_stream,
+        opj_stream_skip_fn p_function);
 
 /**
  * Sets the given function to be used as a seek function, the stream is then seekable.
- * @param		p_stream	the stream to modify
- * @param		p_function	the function to use a skip function.
+ * @param       p_stream    the stream to modify
+ * @param       p_function  the function to use a skip function.
 */
-OPJ_API void OPJ_CALLCONV opj_stream_set_seek_function(opj_stream_t* p_stream, opj_stream_seek_fn p_function);
+OPJ_API void OPJ_CALLCONV opj_stream_set_seek_function(opj_stream_t* p_stream,
+        opj_stream_seek_fn p_function);
 
 /**
  * Sets the given data to be used as a user data for the stream.
- * @param		p_stream	the stream to modify
- * @param		p_data		the data to set.
- * @param		p_function	the function to free p_data when opj_stream_destroy() is called.
+ * @param       p_stream    the stream to modify
+ * @param       p_data      the data to set.
+ * @param       p_function  the function to free p_data when opj_stream_destroy() is called.
 */
-OPJ_API void OPJ_CALLCONV opj_stream_set_user_data (opj_stream_t* p_stream, void * p_data, opj_stream_free_user_data_fn p_function);
+OPJ_API void OPJ_CALLCONV opj_stream_set_user_data(opj_stream_t* p_stream,
+        void * p_data, opj_stream_free_user_data_fn p_function);
 
 /**
  * Sets the length of the user data for the stream.
@@ -1166,25 +1201,28 @@
  * @param p_stream    the stream to modify
  * @param data_length length of the user_data.
 */
-OPJ_API void OPJ_CALLCONV opj_stream_set_user_data_length(opj_stream_t* p_stream, OPJ_UINT64 data_length);
+OPJ_API void OPJ_CALLCONV opj_stream_set_user_data_length(
+    opj_stream_t* p_stream, OPJ_UINT64 data_length);
 
 /**
  * Create a stream from a file identified with its filename with default parameters (helper function)
  * @param fname             the filename of the file to stream
  * @param p_is_read_stream  whether the stream is a read stream (true) or not (false)
 */
-OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_default_file_stream (const char *fname, OPJ_BOOL p_is_read_stream);
- 
+OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_default_file_stream(
+    const char *fname, OPJ_BOOL p_is_read_stream);
+
 /** Create a stream from a file identified with its filename with a specific buffer size
  * @param fname             the filename of the file to stream
  * @param p_buffer_size     size of the chunk used to stream
  * @param p_is_read_stream  whether the stream is a read stream (true) or not (false)
 */
-OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_file_stream (const char *fname,
-                                                                     OPJ_SIZE_T p_buffer_size,
-                                                                     OPJ_BOOL p_is_read_stream);
- 
-/* 
+OPJ_API opj_stream_t* OPJ_CALLCONV opj_stream_create_file_stream(
+    const char *fname,
+    OPJ_SIZE_T p_buffer_size,
+    OPJ_BOOL p_is_read_stream);
+
+/*
 ==========================================================
    event manager functions definitions
 ==========================================================
@@ -1195,9 +1233,9 @@
  * @param p_callback    the callback function which will be used
  * @param p_user_data   client object where will be returned the message
 */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_info_handler(opj_codec_t * p_codec, 
-                                                   opj_msg_callback p_callback,
-                                                   void * p_user_data);
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_info_handler(opj_codec_t * p_codec,
+        opj_msg_callback p_callback,
+        void * p_user_data);
 /**
  * Set the warning handler use by openjpeg.
  * @param p_codec       the codec previously initialise
@@ -1205,19 +1243,19 @@
  * @param p_user_data   client object where will be returned the message
 */
 OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_warning_handler(opj_codec_t * p_codec,
-                                                      opj_msg_callback p_callback,
-                                                      void * p_user_data);
+        opj_msg_callback p_callback,
+        void * p_user_data);
 /**
  * Set the error handler use by openjpeg.
  * @param p_codec       the codec previously initialise
  * @param p_callback    the callback function which will be used
  * @param p_user_data   client object where will be returned the message
 */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_error_handler(opj_codec_t * p_codec, 
-                                                    opj_msg_callback p_callback,
-                                                    void * p_user_data);
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_error_handler(opj_codec_t * p_codec,
+        opj_msg_callback p_callback,
+        void * p_user_data);
 
-/* 
+/*
 ==========================================================
    codec functions definitions
 ==========================================================
@@ -1225,189 +1263,211 @@
 
 /**
  * Creates a J2K/JP2 decompression structure
- * @param format 		Decoder to select
+ * @param format        Decoder to select
  *
  * @return Returns a handle to a decompressor if successful, returns NULL otherwise
  * */
-OPJ_API opj_codec_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format);
+OPJ_API opj_codec_t* OPJ_CALLCONV opj_create_decompress(
+    OPJ_CODEC_FORMAT format);
 
 /**
  * Destroy a decompressor handle
  *
- * @param	p_codec			decompressor handle to destroy
+ * @param   p_codec         decompressor handle to destroy
  */
 OPJ_API void OPJ_CALLCONV opj_destroy_codec(opj_codec_t * p_codec);
 
 /**
  * Read after the codestream if necessary
- * @param	p_codec			the JPEG2000 codec to read.
- * @param	p_stream		the JPEG2000 stream.
+ * @param   p_codec         the JPEG2000 codec to read.
+ * @param   p_stream        the JPEG2000 stream.
  */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_end_decompress (	opj_codec_t *p_codec,
-													opj_stream_t *p_stream);
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_end_decompress(opj_codec_t *p_codec,
+        opj_stream_t *p_stream);
 
 
 /**
  * Set decoding parameters to default values
  * @param parameters Decompression parameters
  */
-OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *parameters);
+OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters(
+    opj_dparameters_t *parameters);
 
 /**
  * Setup the decoder with decompression parameters provided by the user and with the message handler
  * provided by the user.
  *
- * @param p_codec 		decompressor handler
- * @param parameters 	decompression parameters
+ * @param p_codec       decompressor handler
+ * @param parameters    decompression parameters
  *
- * @return true			if the decoder is correctly set
+ * @return true         if the decoder is correctly set
  */
 OPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_decoder(opj_codec_t *p_codec,
-												opj_dparameters_t *parameters );
+        opj_dparameters_t *parameters);
+
+/**
+ * Allocates worker threads for the compressor/decompressor.
+ *
+ * By default, only the main thread is used. If this function is not used,
+ * but the OPJ_NUM_THREADS environment variable is set, its value will be
+ * used to initialize the number of threads. The value can be either an integer
+ * number, or "ALL_CPUS". If OPJ_NUM_THREADS is set and this function is called,
+ * this function will override the behaviour of the environment variable.
+ *
+ * Note: currently only has effect on the decompressor.
+ *
+ * @param p_codec       decompressor handler
+ * @param num_threads   number of threads.
+ *
+ * @return OPJ_TRUE     if the decoder is correctly set
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_codec_set_threads(opj_codec_t *p_codec,
+        int num_threads);
 
 /**
  * Decodes an image header.
  *
- * @param	p_stream		the jpeg2000 stream.
- * @param	p_codec			the jpeg2000 codec to read.
- * @param	p_image			the image structure initialized with the characteristics of encoded image.
+ * @param   p_stream        the jpeg2000 stream.
+ * @param   p_codec         the jpeg2000 codec to read.
+ * @param   p_image         the image structure initialized with the characteristics of encoded image.
  *
- * @return true				if the main header of the codestream and the JP2 header is correctly read.
+ * @return true             if the main header of the codestream and the JP2 header is correctly read.
  */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_read_header (	opj_stream_t *p_stream,
-												opj_codec_t *p_codec,
-												opj_image_t **p_image);
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_read_header(opj_stream_t *p_stream,
+        opj_codec_t *p_codec,
+        opj_image_t **p_image);
 
 /**
  * Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.
  *
- * @param	p_codec			the jpeg2000 codec.
- * @param	p_image         the decoded image previously setted by opj_read_header
- * @param	p_start_x		the left position of the rectangle to decode (in image coordinates).
- * @param	p_end_x			the right position of the rectangle to decode (in image coordinates).
- * @param	p_start_y		the up position of the rectangle to decode (in image coordinates).
- * @param	p_end_y			the bottom position of the rectangle to decode (in image coordinates).
+ * @param   p_codec         the jpeg2000 codec.
+ * @param   p_image         the decoded image previously setted by opj_read_header
+ * @param   p_start_x       the left position of the rectangle to decode (in image coordinates).
+ * @param   p_end_x         the right position of the rectangle to decode (in image coordinates).
+ * @param   p_start_y       the up position of the rectangle to decode (in image coordinates).
+ * @param   p_end_y         the bottom position of the rectangle to decode (in image coordinates).
  *
- * @return	true			if the area could be set.
+ * @return  true            if the area could be set.
  */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_decode_area(	opj_codec_t *p_codec,
-													opj_image_t* p_image,
-													OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
-													OPJ_INT32 p_end_x, OPJ_INT32 p_end_y );
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_decode_area(opj_codec_t *p_codec,
+        opj_image_t* p_image,
+        OPJ_INT32 p_start_x, OPJ_INT32 p_start_y,
+        OPJ_INT32 p_end_x, OPJ_INT32 p_end_y);
 
 /**
  * Decode an image from a JPEG-2000 codestream
  *
- * @param p_decompressor 	decompressor handle
- * @param p_stream			Input buffer stream
- * @param p_image 			the decoded image
- * @return 					true if success, otherwise false
+ * @param p_decompressor    decompressor handle
+ * @param p_stream          Input buffer stream
+ * @param p_image           the decoded image
+ * @return                  true if success, otherwise false
  * */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_decode(   opj_codec_t *p_decompressor,
-                                            opj_stream_t *p_stream,
-                                            opj_image_t *p_image);
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_decode(opj_codec_t *p_decompressor,
+        opj_stream_t *p_stream,
+        opj_image_t *p_image);
 
 /**
  * Get the decoded tile from the codec
  *
- * @param	p_codec			the jpeg2000 codec.
- * @param	p_stream		input streamm
- * @param	p_image			output image
- * @param	tile_index		index of the tile which will be decode
+ * @param   p_codec         the jpeg2000 codec.
+ * @param   p_stream        input streamm
+ * @param   p_image         output image
+ * @param   tile_index      index of the tile which will be decode
  *
- * @return					true if success, otherwise false
+ * @return                  true if success, otherwise false
  */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_get_decoded_tile(	opj_codec_t *p_codec,
-													opj_stream_t *p_stream,
-													opj_image_t *p_image,
-													OPJ_UINT32 tile_index);
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_get_decoded_tile(opj_codec_t *p_codec,
+        opj_stream_t *p_stream,
+        opj_image_t *p_image,
+        OPJ_UINT32 tile_index);
 
 /**
  * Set the resolution factor of the decoded image
- * @param	p_codec			the jpeg2000 codec.
- * @param	res_factor		resolution factor to set
+ * @param   p_codec         the jpeg2000 codec.
+ * @param   res_factor      resolution factor to set
  *
- * @return					true if success, otherwise false
+ * @return                  true if success, otherwise false
  */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_decoded_resolution_factor(opj_codec_t *p_codec, OPJ_UINT32 res_factor);
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_decoded_resolution_factor(
+    opj_codec_t *p_codec, OPJ_UINT32 res_factor);
 
 /**
  * Writes a tile with the given data.
  *
- * @param	p_codec		        the jpeg2000 codec.
- * @param	p_tile_index		the index of the tile to write. At the moment, the tiles must be written from 0 to n-1 in sequence.
- * @param	p_data				pointer to the data to write. Data is arranged in sequence, data_comp0, then data_comp1, then ... NO INTERLEAVING should be set.
- * @param	p_data_size			this value os used to make sure the data being written is correct. The size must be equal to the sum for each component of 
+ * @param   p_codec             the jpeg2000 codec.
+ * @param   p_tile_index        the index of the tile to write. At the moment, the tiles must be written from 0 to n-1 in sequence.
+ * @param   p_data              pointer to the data to write. Data is arranged in sequence, data_comp0, then data_comp1, then ... NO INTERLEAVING should be set.
+ * @param   p_data_size         this value os used to make sure the data being written is correct. The size must be equal to the sum for each component of
  *                              tile_width * tile_height * component_size. component_size can be 1,2 or 4 bytes, depending on the precision of the given component.
- * @param	p_stream			the stream to write data to.
+ * @param   p_stream            the stream to write data to.
  *
- * @return	true if the data could be written.
+ * @return  true if the data could be written.
  */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_write_tile (	opj_codec_t *p_codec,
-												OPJ_UINT32 p_tile_index,
-												OPJ_BYTE * p_data,
-												OPJ_UINT32 p_data_size,
-												opj_stream_t *p_stream );
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_write_tile(opj_codec_t *p_codec,
+        OPJ_UINT32 p_tile_index,
+        OPJ_BYTE * p_data,
+        OPJ_UINT32 p_data_size,
+        opj_stream_t *p_stream);
 
 /**
  * Reads a tile header. This function is compulsory and allows one to know the size of the tile that will be decoded.
  * The user may need to refer to the image got by opj_read_header to understand the size being taken by the tile.
  *
- * @param	p_codec			the jpeg2000 codec.
- * @param	p_tile_index	pointer to a value that will hold the index of the tile being decoded, in case of success.
- * @param	p_data_size		pointer to a value that will hold the maximum size of the decoded data, in case of success. In case
- *							of truncated codestreams, the actual number of bytes decoded may be lower. The computation of the size is the same
- *							as depicted in opj_write_tile.
- * @param	p_tile_x0		pointer to a value that will hold the x0 pos of the tile (in the image).
- * @param	p_tile_y0		pointer to a value that will hold the y0 pos of the tile (in the image).
- * @param	p_tile_x1		pointer to a value that will hold the x1 pos of the tile (in the image).
- * @param	p_tile_y1		pointer to a value that will hold the y1 pos of the tile (in the image).
- * @param	p_nb_comps		pointer to a value that will hold the number of components in the tile.
- * @param	p_should_go_on	pointer to a boolean that will hold the fact that the decoding should go on. In case the
- *							codestream is over at the time of the call, the value will be set to false. The user should then stop
- *							the decoding.
- * @param	p_stream		the stream to decode.
- * @return	true			if the tile header could be decoded. In case the decoding should end, the returned value is still true.
- *							returning false may be the result of a shortage of memory or an internal error.
+ * @param   p_codec         the jpeg2000 codec.
+ * @param   p_tile_index    pointer to a value that will hold the index of the tile being decoded, in case of success.
+ * @param   p_data_size     pointer to a value that will hold the maximum size of the decoded data, in case of success. In case
+ *                          of truncated codestreams, the actual number of bytes decoded may be lower. The computation of the size is the same
+ *                          as depicted in opj_write_tile.
+ * @param   p_tile_x0       pointer to a value that will hold the x0 pos of the tile (in the image).
+ * @param   p_tile_y0       pointer to a value that will hold the y0 pos of the tile (in the image).
+ * @param   p_tile_x1       pointer to a value that will hold the x1 pos of the tile (in the image).
+ * @param   p_tile_y1       pointer to a value that will hold the y1 pos of the tile (in the image).
+ * @param   p_nb_comps      pointer to a value that will hold the number of components in the tile.
+ * @param   p_should_go_on  pointer to a boolean that will hold the fact that the decoding should go on. In case the
+ *                          codestream is over at the time of the call, the value will be set to false. The user should then stop
+ *                          the decoding.
+ * @param   p_stream        the stream to decode.
+ * @return  true            if the tile header could be decoded. In case the decoding should end, the returned value is still true.
+ *                          returning false may be the result of a shortage of memory or an internal error.
  */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_read_tile_header(	opj_codec_t *p_codec,
-												opj_stream_t * p_stream,
-												OPJ_UINT32 * p_tile_index,
-												OPJ_UINT32 * p_data_size,
-												OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
-												OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
-												OPJ_UINT32 * p_nb_comps,
-												OPJ_BOOL * p_should_go_on );
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_read_tile_header(opj_codec_t *p_codec,
+        opj_stream_t * p_stream,
+        OPJ_UINT32 * p_tile_index,
+        OPJ_UINT32 * p_data_size,
+        OPJ_INT32 * p_tile_x0, OPJ_INT32 * p_tile_y0,
+        OPJ_INT32 * p_tile_x1, OPJ_INT32 * p_tile_y1,
+        OPJ_UINT32 * p_nb_comps,
+        OPJ_BOOL * p_should_go_on);
 
 /**
  * Reads a tile data. This function is compulsory and allows one to decode tile data. opj_read_tile_header should be called before.
  * The user may need to refer to the image got by opj_read_header to understand the size being taken by the tile.
  *
- * @param	p_codec			the jpeg2000 codec.
- * @param	p_tile_index	the index of the tile being decoded, this should be the value set by opj_read_tile_header.
- * @param	p_data			pointer to a memory block that will hold the decoded data.
- * @param	p_data_size		size of p_data. p_data_size should be bigger or equal to the value set by opj_read_tile_header.
- * @param	p_stream		the stream to decode.
+ * @param   p_codec         the jpeg2000 codec.
+ * @param   p_tile_index    the index of the tile being decoded, this should be the value set by opj_read_tile_header.
+ * @param   p_data          pointer to a memory block that will hold the decoded data.
+ * @param   p_data_size     size of p_data. p_data_size should be bigger or equal to the value set by opj_read_tile_header.
+ * @param   p_stream        the stream to decode.
  *
- * @return	true			if the data could be decoded.
+ * @return  true            if the data could be decoded.
  */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_decode_tile_data(	opj_codec_t *p_codec,
-													OPJ_UINT32 p_tile_index,
-													OPJ_BYTE * p_data,
-													OPJ_UINT32 p_data_size,
-													opj_stream_t *p_stream );
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_decode_tile_data(opj_codec_t *p_codec,
+        OPJ_UINT32 p_tile_index,
+        OPJ_BYTE * p_data,
+        OPJ_UINT32 p_data_size,
+        opj_stream_t *p_stream);
 
 /* COMPRESSION FUNCTIONS*/
 
 /**
  * Creates a J2K/JP2 compression structure
- * @param 	format 		Coder to select
- * @return 				Returns a handle to a compressor if successful, returns NULL otherwise
+ * @param   format      Coder to select
+ * @return              Returns a handle to a compressor if successful, returns NULL otherwise
  */
 OPJ_API opj_codec_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format);
 
 /**
-Set encoding parameters to default values, that means : 
+Set encoding parameters to default values, that means :
 <ul>
 <li>Lossless
 <li>1 tile
@@ -1427,45 +1487,46 @@
 </ul>
 @param parameters Compression parameters
 */
-OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *parameters);
+OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(
+    opj_cparameters_t *parameters);
 
 /**
  * Setup the encoder parameters using the current image and using user parameters.
- * @param p_codec 		Compressor handle
- * @param parameters 	Compression parameters
- * @param image 		Input filled image
+ * @param p_codec       Compressor handle
+ * @param parameters    Compression parameters
+ * @param image         Input filled image
  */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_encoder(opj_codec_t *p_codec, 
-												opj_cparameters_t *parameters, 
-												opj_image_t *image);
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_setup_encoder(opj_codec_t *p_codec,
+        opj_cparameters_t *parameters,
+        opj_image_t *image);
 
 /**
  * Start to compress the current image.
- * @param p_codec 		Compressor handle
- * @param image 	    Input filled image
- * @param p_stream 		Input stgream
+ * @param p_codec       Compressor handle
+ * @param p_image       Input filled image
+ * @param p_stream      Input stgream
  */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_start_compress (	opj_codec_t *p_codec,
-													opj_image_t * p_image,
-													opj_stream_t *p_stream);
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_start_compress(opj_codec_t *p_codec,
+        opj_image_t * p_image,
+        opj_stream_t *p_stream);
 
 /**
  * End to compress the current image.
- * @param p_codec 		Compressor handle
- * @param p_stream 		Input stgream
+ * @param p_codec       Compressor handle
+ * @param p_stream      Input stgream
  */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_end_compress (opj_codec_t *p_codec,
-												opj_stream_t *p_stream);
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_end_compress(opj_codec_t *p_codec,
+        opj_stream_t *p_stream);
 
 /**
  * Encode an image into a JPEG-2000 codestream
- * @param p_codec 		compressor handle
- * @param p_stream 		Output buffer stream
+ * @param p_codec       compressor handle
+ * @param p_stream      Output buffer stream
  *
- * @return 				Returns true if successful, returns false otherwise
+ * @return              Returns true if successful, returns false otherwise
  */
 OPJ_API OPJ_BOOL OPJ_CALLCONV opj_encode(opj_codec_t *p_codec,
-                                         opj_stream_t *p_stream);
+        opj_stream_t *p_stream);
 /*
 ==========================================================
    codec output functions definitions
@@ -1477,60 +1538,65 @@
 Destroy Codestream information after compression or decompression
 @param cstr_info Codestream information structure
 */
-OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_v2_t **cstr_info);
+OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_v2_t
+        **cstr_info);
 
 
 /**
  * Dump the codec information into the output stream
  *
- * @param	p_codec			the jpeg2000 codec.
- * @param	info_flag		type of information dump.
- * @param	output_stream	output stream where dump the informations get from the codec.
+ * @param   p_codec         the jpeg2000 codec.
+ * @param   info_flag       type of information dump.
+ * @param   output_stream   output stream where dump the information gotten from the codec.
  *
  */
-OPJ_API void OPJ_CALLCONV opj_dump_codec(	opj_codec_t *p_codec,
-											OPJ_INT32 info_flag,
-											FILE* output_stream);
+OPJ_API void OPJ_CALLCONV opj_dump_codec(opj_codec_t *p_codec,
+        OPJ_INT32 info_flag,
+        FILE* output_stream);
 
 /**
  * Get the codestream information from the codec
  *
- * @param	p_codec			the jpeg2000 codec.
+ * @param   p_codec         the jpeg2000 codec.
  *
- * @return					a pointer to a codestream information structure.
+ * @return                  a pointer to a codestream information structure.
  *
  */
-OPJ_API opj_codestream_info_v2_t* OPJ_CALLCONV opj_get_cstr_info(opj_codec_t *p_codec);
+OPJ_API opj_codestream_info_v2_t* OPJ_CALLCONV opj_get_cstr_info(
+    opj_codec_t *p_codec);
 
 /**
  * Get the codestream index from the codec
  *
- * @param	p_codec			the jpeg2000 codec.
+ * @param   p_codec         the jpeg2000 codec.
  *
- * @return					a pointer to a codestream index structure.
+ * @return                  a pointer to a codestream index structure.
  *
  */
-OPJ_API opj_codestream_index_t * OPJ_CALLCONV opj_get_cstr_index(opj_codec_t *p_codec);
+OPJ_API opj_codestream_index_t * OPJ_CALLCONV opj_get_cstr_index(
+    opj_codec_t *p_codec);
 
-OPJ_API void OPJ_CALLCONV opj_destroy_cstr_index(opj_codestream_index_t **p_cstr_index);
+OPJ_API void OPJ_CALLCONV opj_destroy_cstr_index(opj_codestream_index_t
+        **p_cstr_index);
 
 
 /**
  * Get the JP2 file information from the codec FIXME
  *
- * @param	p_codec			the jpeg2000 codec.
+ * @param   p_codec         the jpeg2000 codec.
  *
- * @return					a pointer to a JP2 metadata structure.
+ * @return                  a pointer to a JP2 metadata structure.
  *
  */
-OPJ_API opj_jp2_metadata_t* OPJ_CALLCONV opj_get_jp2_metadata(opj_codec_t *p_codec);
+OPJ_API opj_jp2_metadata_t* OPJ_CALLCONV opj_get_jp2_metadata(
+    opj_codec_t *p_codec);
 
 /**
  * Get the JP2 file index from the codec FIXME
  *
- * @param	p_codec			the jpeg2000 codec.
+ * @param   p_codec         the jpeg2000 codec.
  *
- * @return					a pointer to a JP2 index structure.
+ * @return                  a pointer to a JP2 index structure.
  *
  */
 OPJ_API opj_jp2_index_t* OPJ_CALLCONV opj_get_jp2_index(opj_codec_t *p_codec);
@@ -1545,18 +1611,31 @@
 /**
  * Sets the MCT matrix to use.
  *
- * @param	parameters		the parameters to change.
- * @param	pEncodingMatrix	the encoding matrix.
- * @param	p_dc_shift		the dc shift coefficients to use.
- * @param	pNbComp			the number of components of the image.
+ * @param   parameters      the parameters to change.
+ * @param   pEncodingMatrix the encoding matrix.
+ * @param   p_dc_shift      the dc shift coefficients to use.
+ * @param   pNbComp         the number of components of the image.
  *
- * @return	true if the parameters could be set.
+ * @return  true if the parameters could be set.
  */
-OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_MCT( opj_cparameters_t *parameters,
-		                               	   OPJ_FLOAT32 * pEncodingMatrix,
-		                               	   OPJ_INT32 * p_dc_shift,
-		                               	   OPJ_UINT32 pNbComp);
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_set_MCT(opj_cparameters_t *parameters,
+        OPJ_FLOAT32 * pEncodingMatrix,
+        OPJ_INT32 * p_dc_shift,
+        OPJ_UINT32 pNbComp);
 
+/*
+==========================================================
+   Thread functions
+==========================================================
+*/
+
+/** Returns if the library is built with thread support.
+ * OPJ_TRUE if mutex, condition, thread, thread pool are available.
+ */
+OPJ_API OPJ_BOOL OPJ_CALLCONV opj_has_thread_support(void);
+
+/** Return the number of virtual CPUs */
+OPJ_API int OPJ_CALLCONV opj_get_num_cpus(void);
 
 
 #ifdef __cplusplus
diff --git a/third_party/libopenjpeg20/opj_clock.c b/third_party/libopenjpeg20/opj_clock.c
index 0df99ef..24f79a9 100644
--- a/third_party/libopenjpeg20/opj_clock.c
+++ b/third_party/libopenjpeg20/opj_clock.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -29,6 +29,8 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include "opj_includes.h"
+
 #ifdef _WIN32
 #include <windows.h>
 #else
@@ -36,29 +38,30 @@
 #include <sys/resource.h>
 #include <sys/times.h>
 #endif /* _WIN32 */
-#include "opj_includes.h"
 
-OPJ_FLOAT64 opj_clock(void) {
+OPJ_FLOAT64 opj_clock(void)
+{
 #ifdef _WIN32
-	/* _WIN32: use QueryPerformance (very accurate) */
-    LARGE_INTEGER freq , t ;
+    /* _WIN32: use QueryPerformance (very accurate) */
+    LARGE_INTEGER freq, t ;
     /* freq is the clock speed of the CPU */
     QueryPerformanceFrequency(&freq) ;
-	/* cout << "freq = " << ((double) freq.QuadPart) << endl; */
+    /* cout << "freq = " << ((double) freq.QuadPart) << endl; */
     /* t is the high resolution performance counter (see MSDN) */
-    QueryPerformanceCounter ( & t ) ;
-    return ( t.QuadPart /(OPJ_FLOAT64) freq.QuadPart ) ;
+    QueryPerformanceCounter(& t) ;
+    return ((OPJ_FLOAT64) t.QuadPart / (OPJ_FLOAT64) freq.QuadPart) ;
 #else
-	/* Unix or Linux: use resource usage */
+    /* Unix or Linux: use resource usage */
     struct rusage t;
     OPJ_FLOAT64 procTime;
     /* (1) Get the rusage data structure at this moment (man getrusage) */
-    getrusage(0,&t);
+    getrusage(0, &t);
     /* (2) What is the elapsed time ? - CPU time = User time + System time */
-	/* (2a) Get the seconds */
+    /* (2a) Get the seconds */
     procTime = (OPJ_FLOAT64)(t.ru_utime.tv_sec + t.ru_stime.tv_sec);
     /* (2b) More precisely! Get the microseconds part ! */
-    return ( procTime + (OPJ_FLOAT64)(t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ;
+    return (procTime + (OPJ_FLOAT64)(t.ru_utime.tv_usec + t.ru_stime.tv_usec) *
+            1e-6) ;
 #endif
 }
 
diff --git a/third_party/libopenjpeg20/opj_clock.h b/third_party/libopenjpeg20/opj_clock.h
index 6f5168b..76366f5 100644
--- a/third_party/libopenjpeg20/opj_clock.h
+++ b/third_party/libopenjpeg20/opj_clock.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -28,8 +28,8 @@
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  */
-#ifndef __OPJ_CLOCK_H
-#define __OPJ_CLOCK_H
+#ifndef OPJ_CLOCK_H
+#define OPJ_CLOCK_H
 /**
 @file opj_clock.h
 @brief Internal function for timing
@@ -55,5 +55,5 @@
 
 /*@}*/
 
-#endif /* __OPJ_CLOCK_H */
+#endif /* OPJ_CLOCK_H */
 
diff --git a/third_party/libopenjpeg20/opj_codec.h b/third_party/libopenjpeg20/opj_codec.h
index 6bd791f..2dbeac9 100644
--- a/third_party/libopenjpeg20/opj_codec.h
+++ b/third_party/libopenjpeg20/opj_codec.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -29,8 +29,8 @@
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  */
-#ifndef __OPJ_CODEC_H
-#define __OPJ_CODEC_H
+#ifndef OPJ_CODEC_H
+#define OPJ_CODEC_H
 /**
 @file opj_codec.h
 */
@@ -39,113 +39,110 @@
 /**
  * Main codec handler used for compression or decompression.
  */
-typedef struct opj_codec_private
-{
+typedef struct opj_codec_private {
     /** FIXME DOC */
-    union
-    {
+    union {
         /**
          * Decompression handler.
          */
-        struct opj_decompression
-        {
+        struct opj_decompression {
             /** Main header reading function handler */
-            OPJ_BOOL (*opj_read_header) ( struct opj_stream_private * cio,
-                                          void * p_codec,
-                                          opj_image_t **p_image,
-                                          struct opj_event_mgr * p_manager);
+            OPJ_BOOL(*opj_read_header)(struct opj_stream_private * cio,
+                                       void * p_codec,
+                                       opj_image_t **p_image,
+                                       struct opj_event_mgr * p_manager);
 
             /** Decoding function */
-            OPJ_BOOL (*opj_decode) ( void * p_codec,
-                                     struct opj_stream_private * p_cio,
-                                     opj_image_t * p_image,
-                                     struct opj_event_mgr * p_manager);
+            OPJ_BOOL(*opj_decode)(void * p_codec,
+                                  struct opj_stream_private * p_cio,
+                                  opj_image_t * p_image,
+                                  struct opj_event_mgr * p_manager);
 
             /** FIXME DOC */
-            OPJ_BOOL (*opj_read_tile_header)( void * p_codec,
-                                              OPJ_UINT32 * p_tile_index,
-                                              OPJ_UINT32 * p_data_size,
-                                              OPJ_INT32 * p_tile_x0,
-                                              OPJ_INT32 * p_tile_y0,
-                                              OPJ_INT32 * p_tile_x1,
-                                              OPJ_INT32 * p_tile_y1,
-                                              OPJ_UINT32 * p_nb_comps,
-                                              OPJ_BOOL * p_should_go_on,
-                                              struct opj_stream_private * p_cio,
-                                              struct opj_event_mgr * p_manager);
+            OPJ_BOOL(*opj_read_tile_header)(void * p_codec,
+                                            OPJ_UINT32 * p_tile_index,
+                                            OPJ_UINT32 * p_data_size,
+                                            OPJ_INT32 * p_tile_x0,
+                                            OPJ_INT32 * p_tile_y0,
+                                            OPJ_INT32 * p_tile_x1,
+                                            OPJ_INT32 * p_tile_y1,
+                                            OPJ_UINT32 * p_nb_comps,
+                                            OPJ_BOOL * p_should_go_on,
+                                            struct opj_stream_private * p_cio,
+                                            struct opj_event_mgr * p_manager);
 
             /** FIXME DOC */
-            OPJ_BOOL (*opj_decode_tile_data)( void * p_codec,
-                                              OPJ_UINT32 p_tile_index,
-                                              OPJ_BYTE * p_data,
-                                              OPJ_UINT32 p_data_size,
-                                              struct opj_stream_private * p_cio,
-                                              struct opj_event_mgr * p_manager);
+            OPJ_BOOL(*opj_decode_tile_data)(void * p_codec,
+                                            OPJ_UINT32 p_tile_index,
+                                            OPJ_BYTE * p_data,
+                                            OPJ_UINT32 p_data_size,
+                                            struct opj_stream_private * p_cio,
+                                            struct opj_event_mgr * p_manager);
 
             /** Reading function used after codestream if necessary */
-            OPJ_BOOL (* opj_end_decompress) ( void *p_codec,
-                                              struct opj_stream_private * cio,
-                                              struct opj_event_mgr * p_manager);
+            OPJ_BOOL(* opj_end_decompress)(void *p_codec,
+                                           struct opj_stream_private * cio,
+                                           struct opj_event_mgr * p_manager);
 
             /** Codec destroy function handler */
-            void (*opj_destroy) (void * p_codec);
+            void (*opj_destroy)(void * p_codec);
 
             /** Setup decoder function handler */
-            void (*opj_setup_decoder) ( void * p_codec, opj_dparameters_t * p_param);
+            void (*opj_setup_decoder)(void * p_codec, opj_dparameters_t * p_param);
 
             /** Set decode area function handler */
-            OPJ_BOOL (*opj_set_decode_area) ( void * p_codec,
-                                              opj_image_t * p_image,
-                                              OPJ_INT32 p_start_x,
-                                              OPJ_INT32 p_end_x,
-                                              OPJ_INT32 p_start_y,
-                                              OPJ_INT32 p_end_y,
-                                              struct opj_event_mgr * p_manager);
+            OPJ_BOOL(*opj_set_decode_area)(void * p_codec,
+                                           opj_image_t * p_image,
+                                           OPJ_INT32 p_start_x,
+                                           OPJ_INT32 p_end_x,
+                                           OPJ_INT32 p_start_y,
+                                           OPJ_INT32 p_end_y,
+                                           struct opj_event_mgr * p_manager);
 
             /** Get tile function */
-            OPJ_BOOL (*opj_get_decoded_tile) ( void *p_codec,
-                                               opj_stream_private_t * p_cio,
-                                               opj_image_t *p_image,
-                                               struct opj_event_mgr * p_manager,
-                                               OPJ_UINT32 tile_index);
+            OPJ_BOOL(*opj_get_decoded_tile)(void *p_codec,
+                                            opj_stream_private_t * p_cio,
+                                            opj_image_t *p_image,
+                                            struct opj_event_mgr * p_manager,
+                                            OPJ_UINT32 tile_index);
 
             /** Set the decoded resolution factor */
-            OPJ_BOOL (*opj_set_decoded_resolution_factor) ( void * p_codec,
-                                                            OPJ_UINT32 res_factor,
-                                                            opj_event_mgr_t * p_manager);
+            OPJ_BOOL(*opj_set_decoded_resolution_factor)(void * p_codec,
+                    OPJ_UINT32 res_factor,
+                    opj_event_mgr_t * p_manager);
+
         } m_decompression;
 
         /**
          * Compression handler. FIXME DOC
          */
-        struct opj_compression
-        {
-            OPJ_BOOL (* opj_start_compress) ( void *p_codec,
-                                              struct opj_stream_private * cio,
-                                              struct opj_image * p_image,
-                                              struct opj_event_mgr * p_manager);
+        struct opj_compression {
+            OPJ_BOOL(* opj_start_compress)(void *p_codec,
+                                           struct opj_stream_private * cio,
+                                           struct opj_image * p_image,
+                                           struct opj_event_mgr * p_manager);
 
-            OPJ_BOOL (* opj_encode) ( void * p_codec,
-                                      struct opj_stream_private *p_cio,
-                                      struct opj_event_mgr * p_manager);
+            OPJ_BOOL(* opj_encode)(void * p_codec,
+                                   struct opj_stream_private *p_cio,
+                                   struct opj_event_mgr * p_manager);
 
-            OPJ_BOOL (* opj_write_tile) ( void * p_codec,
-                                          OPJ_UINT32 p_tile_index,
-                                          OPJ_BYTE * p_data,
-                                          OPJ_UINT32 p_data_size,
-                                          struct opj_stream_private * p_cio,
+            OPJ_BOOL(* opj_write_tile)(void * p_codec,
+                                       OPJ_UINT32 p_tile_index,
+                                       OPJ_BYTE * p_data,
+                                       OPJ_UINT32 p_data_size,
+                                       struct opj_stream_private * p_cio,
+                                       struct opj_event_mgr * p_manager);
+
+            OPJ_BOOL(* opj_end_compress)(void * p_codec,
+                                         struct opj_stream_private * p_cio,
+                                         struct opj_event_mgr * p_manager);
+
+            void (* opj_destroy)(void * p_codec);
+
+            OPJ_BOOL(* opj_setup_encoder)(void * p_codec,
+                                          opj_cparameters_t * p_param,
+                                          struct opj_image * p_image,
                                           struct opj_event_mgr * p_manager);
-
-            OPJ_BOOL (* opj_end_compress) (	void * p_codec,
-                                            struct opj_stream_private * p_cio,
-                                            struct opj_event_mgr * p_manager);
-
-            void (* opj_destroy) (void * p_codec);
-
-            OPJ_BOOL (* opj_setup_encoder) ( void * p_codec,
-                                             opj_cparameters_t * p_param,
-                                             struct opj_image * p_image,
-                                             struct opj_event_mgr * p_manager);
         } m_compression;
     } m_codec_data;
     /** FIXME DOC*/
@@ -154,12 +151,16 @@
     opj_event_mgr_t m_event_mgr;
     /** Flag to indicate if the codec is used to decode or encode*/
     OPJ_BOOL is_decompressor;
-    void (*opj_dump_codec) (void * p_codec, OPJ_INT32 info_flag, FILE* output_stream);
+    void (*opj_dump_codec)(void * p_codec, OPJ_INT32 info_flag,
+                           FILE* output_stream);
     opj_codestream_info_v2_t* (*opj_get_codec_info)(void* p_codec);
     opj_codestream_index_t* (*opj_get_codec_index)(void* p_codec);
+
+    /** Set number of threads */
+    OPJ_BOOL(*opj_set_threads)(void * p_codec, OPJ_UINT32 num_threads);
 }
 opj_codec_private_t;
 
 
-#endif /* __OPJ_CODEC_H */
+#endif /* OPJ_CODEC_H */
 
diff --git a/third_party/libopenjpeg20/opj_common.h b/third_party/libopenjpeg20/opj_common.h
new file mode 100644
index 0000000..a051339
--- /dev/null
+++ b/third_party/libopenjpeg20/opj_common.h
@@ -0,0 +1,41 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2017, IntoPIX SA <support@intopix.com>
+ * 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_COMMMON_H
+#define OPJ_COMMMON_H
+
+/*
+ ==========================================================
+   Common constants shared among several modules
+ ==========================================================
+*/
+#define OPJ_COMMON_CBLK_DATA_EXTRA        2    /**< Margin for a fake FFFF marker */
+
+#endif /* OPJ_COMMMON_H */
diff --git a/third_party/libopenjpeg20/opj_config.h b/third_party/libopenjpeg20/opj_config.h
index 37bc9ba..efa08a1 100644
--- a/third_party/libopenjpeg20/opj_config.h
+++ b/third_party/libopenjpeg20/opj_config.h
@@ -12,5 +12,5 @@
 
 /* Version number. */
 #define OPJ_VERSION_MAJOR 2
-#define OPJ_VERSION_MINOR 1
+#define OPJ_VERSION_MINOR 2
 #define OPJ_VERSION_BUILD 0
diff --git a/third_party/libopenjpeg20/opj_config_private.h b/third_party/libopenjpeg20/opj_config_private.h
index 7d7e3ea..ecd02e7 100644
--- a/third_party/libopenjpeg20/opj_config_private.h
+++ b/third_party/libopenjpeg20/opj_config_private.h
@@ -7,7 +7,7 @@
 /* create opj_config_private.h for CMake */
 #define OPJ_HAVE_INTTYPES_H 	1
 
-#define OPJ_PACKAGE_VERSION "2.1.0"
+#define OPJ_PACKAGE_VERSION "2.2.0"
 
 /* Not used by openjp2*/
 /*#define HAVE_MEMORY_H 1*/
diff --git a/third_party/libopenjpeg20/opj_includes.h b/third_party/libopenjpeg20/opj_includes.h
index 5add091..b33e63c 100644
--- a/third_party/libopenjpeg20/opj_includes.h
+++ b/third_party/libopenjpeg20/opj_includes.h
@@ -1,11 +1,11 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -54,6 +54,7 @@
 #include <stdarg.h>
 #include <ctype.h>
 #include <assert.h>
+#include <limits.h>
 
 /*
   Use fseeko() and ftello() if they are available since they use
@@ -70,11 +71,11 @@
 #if defined(WIN32) && !defined(Windows95) && !defined(__BORLANDC__) && \
   !(defined(_MSC_VER) && _MSC_VER < 1400) && \
   !(defined(__MINGW32__) && __MSVCRT_VERSION__ < 0x800)
-  /*
-    Windows '95 and Borland C do not support _lseeki64
-    Visual Studio does not support _fseeki64 and _ftelli64 until the 2005 release.
-    Without these interfaces, files over 2GB in size are not supported for Windows.
-  */
+/*
+  Windows '95 and Borland C do not support _lseeki64
+  Visual Studio does not support _fseeki64 and _ftelli64 until the 2005 release.
+  Without these interfaces, files over 2GB in size are not supported for Windows.
+*/
 #  define OPJ_FSEEK(stream,offset,whence) _fseeki64(stream,/* __int64 */ offset,whence)
 #  define OPJ_FSTAT(fildes,stat_buff) _fstati64(fildes,/* struct _stati64 */ stat_buff)
 #  define OPJ_FTELL(stream) /* __int64 */ _ftelli64(stream)
@@ -103,69 +104,118 @@
 */
 
 /* Are restricted pointers available? (C99) */
-#if (__STDC_VERSION__ != 199901L)
-	/* Not a C99 compiler */
-	#ifdef __GNUC__
-		#define restrict __restrict__
-	#else
-		#define restrict /* restrict */
-	#endif
+#if (__STDC_VERSION__ >= 199901L)
+#define OPJ_RESTRICT restrict
+#else
+/* Not a C99 compiler */
+#if defined(__GNUC__)
+#define OPJ_RESTRICT __restrict__
+
+/*
+  vc14 (2015) outputs wrong results.
+  Need to check OPJ_RESTRICT usage (or a bug in vc14)
+    #elif defined(_MSC_VER) && (_MSC_VER >= 1400)
+        #define OPJ_RESTRICT __restrict
+*/
+#else
+#define OPJ_RESTRICT /* restrict */
+#endif
 #endif
 
+#ifdef __has_attribute
+#if __has_attribute(no_sanitize)
+#define OPJ_NOSANITIZE(kind) __attribute__((no_sanitize(kind)))
+#endif
+#endif
+#ifndef OPJ_NOSANITIZE
+#define OPJ_NOSANITIZE(kind)
+#endif
 
 
 /* MSVC before 2013 and Borland C do not have lrintf */
 #if defined(_MSC_VER)
 #include <intrin.h>
-static INLINE long opj_lrintf(float f){
+static INLINE long opj_lrintf(float f)
+{
 #ifdef _M_X64
-	return _mm_cvt_ss2si(_mm_load_ss(&f));
+    return _mm_cvt_ss2si(_mm_load_ss(&f));
 
-	/* commented out line breaks many tests */
-  /* return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f)); */
+    /* commented out line breaks many tests */
+    /* return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f)); */
 #elif defined(_M_IX86)
     int i;
-     _asm{
+    _asm{
         fld f
         fistp i
     };
- 
+
     return i;
-#else 
-	return (long)((f>0.0f) ? (f + 0.5f) : (f - 0.5f));
+#else
+    return (long)((f>0.0f) ? (f + 0.5f) : (f - 0.5f));
 #endif
 }
 #elif defined(__BORLANDC__)
-static INLINE long opj_lrintf(float f) {
+static INLINE long opj_lrintf(float f)
+{
 #ifdef _M_X64
-     return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f));
+    return (long)((f > 0.0f) ? (f + 0.5f) : (f - 0.5f));
 #else
-	int i;
+    int i;
 
-	_asm {
-		fld f
-			fistp i
-	};
+    _asm {
+        fld f
+        fistp i
+    };
 
-	return i;
+    return i;
 #endif
 }
 #else
-static INLINE long opj_lrintf(float f) {
-	return lrintf(f);
+static INLINE long opj_lrintf(float f)
+{
+    return lrintf(f);
 }
 #endif
 
 #if defined(_MSC_VER) && (_MSC_VER < 1400)
-	#define vsnprintf _vsnprintf
+#define vsnprintf _vsnprintf
 #endif
 
 /* MSVC x86 is really bad at doing int64 = int32 * int32 on its own. Use intrinsic. */
 #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__INTEL_COMPILER) && defined(_M_IX86)
-#	include <intrin.h>
-#	pragma intrinsic(__emul)
+#   include <intrin.h>
+#   pragma intrinsic(__emul)
 #endif
 
+/* Apparently Visual Studio doesn't define __SSE__ / __SSE2__ macros */
+#if defined(_M_X64)
+/* Intel 64bit support SSE and SSE2 */
+#   ifndef __SSE__
+#       define __SSE__ 1
+#   endif
+#   ifndef __SSE2__
+#       define __SSE2__ 1
+#   endif
+#endif
+
+/* For x86, test the value of the _M_IX86_FP macro. */
+/* See https://msdn.microsoft.com/en-us/library/b0084kay.aspx */
+#if defined(_M_IX86_FP)
+#   if _M_IX86_FP >= 1
+#       ifndef __SSE__
+#           define __SSE__ 1
+#       endif
+#   endif
+#   if _M_IX86_FP >= 2
+#       ifndef __SSE2__
+#           define __SSE2__ 1
+#       endif
+#   endif
+#endif
+
+/* Type to use for bit-fields in internal headers */
+typedef unsigned int OPJ_BITFIELD;
+
 #include "opj_inttypes.h"
 #include "opj_clock.h"
 #include "opj_malloc.h"
@@ -174,13 +224,15 @@
 #include "bio.h"
 #include "cio.h"
 
+#include "thread.h"
+#include "tls_keys.h"
+
 #include "image.h"
 #include "invert.h"
 #include "j2k.h"
 #include "jp2.h"
 
 #include "mqc.h"
-#include "raw.h"
 #include "bio.h"
 
 #include "pi.h"
diff --git a/third_party/libopenjpeg20/opj_intmath.h b/third_party/libopenjpeg20/opj_intmath.h
index 3f7934c..cf97c15 100644
--- a/third_party/libopenjpeg20/opj_intmath.h
+++ b/third_party/libopenjpeg20/opj_intmath.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,7 +8,7 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
@@ -34,8 +34,8 @@
  * 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
+#ifndef OPJ_INTMATH_H
+#define OPJ_INTMATH_H
 /**
 @file opj_intmath.h
 @brief Implementation of operations on integers (INT)
@@ -53,41 +53,46 @@
 Get the minimum of two integers
 @return Returns a if a < b else b
 */
-static INLINE OPJ_INT32 opj_int_min(OPJ_INT32 a, OPJ_INT32 b) {
-	return a < b ? a : b;
+static INLINE OPJ_INT32 opj_int_min(OPJ_INT32 a, OPJ_INT32 b)
+{
+    return a < b ? a : b;
 }
 
 /**
 Get the minimum of two integers
 @return Returns a if a < b else b
 */
-static INLINE OPJ_UINT32 opj_uint_min(OPJ_UINT32 a, OPJ_UINT32 b) {
-	return a < b ? a : b;
+static INLINE OPJ_UINT32 opj_uint_min(OPJ_UINT32 a, OPJ_UINT32 b)
+{
+    return a < b ? a : b;
 }
 
 /**
 Get the maximum of two integers
 @return Returns a if a > b else b
 */
-static INLINE OPJ_INT32 opj_int_max(OPJ_INT32 a, OPJ_INT32 b) {
-	return (a > b) ? a : b;
+static INLINE OPJ_INT32 opj_int_max(OPJ_INT32 a, OPJ_INT32 b)
+{
+    return (a > b) ? a : b;
 }
 
 /**
 Get the maximum of two integers
 @return Returns a if a > b else b
 */
-static INLINE OPJ_UINT32 opj_uint_max(OPJ_UINT32  a, OPJ_UINT32  b) {
-	return (a > b) ? a : b;
+static INLINE OPJ_UINT32 opj_uint_max(OPJ_UINT32  a, OPJ_UINT32  b)
+{
+    return (a > b) ? a : b;
 }
 
 /**
  Get the saturated sum of two unsigned integers
  @return Returns saturated sum of a+b
  */
-static INLINE OPJ_UINT32 opj_uint_adds(OPJ_UINT32 a, OPJ_UINT32 b) {
-	OPJ_UINT64 sum = (OPJ_UINT64)a + (OPJ_UINT64)b;
-	return (OPJ_UINT32)(-(OPJ_INT32)(sum >> 32)) | (OPJ_UINT32)sum;
+static INLINE OPJ_UINT32 opj_uint_adds(OPJ_UINT32 a, OPJ_UINT32 b)
+{
+    OPJ_UINT64 sum = (OPJ_UINT64)a + (OPJ_UINT64)b;
+    return (OPJ_UINT32)(-(OPJ_INT32)(sum >> 32)) | (OPJ_UINT32)sum;
 }
 
 /**
@@ -96,93 +101,105 @@
 <ul>
 <li>Returns a if (min < a < max)
 <li>Returns max if (a > max)
-<li>Returns min if (a < min) 
+<li>Returns min if (a < min)
 </ul>
 */
-static INLINE OPJ_INT32 opj_int_clamp(OPJ_INT32 a, OPJ_INT32 min, OPJ_INT32 max) {
-	if (a < min)
-		return min;
-	if (a > max)
-		return max;
-	return a;
+static INLINE OPJ_INT32 opj_int_clamp(OPJ_INT32 a, OPJ_INT32 min,
+                                      OPJ_INT32 max)
+{
+    if (a < min) {
+        return min;
+    }
+    if (a > max) {
+        return max;
+    }
+    return a;
 }
 /**
 @return Get absolute value of integer
 */
-static INLINE OPJ_INT32 opj_int_abs(OPJ_INT32 a) {
-	return a < 0 ? -a : a;
+static INLINE OPJ_INT32 opj_int_abs(OPJ_INT32 a)
+{
+    return a < 0 ? -a : a;
 }
 /**
 Divide an integer and round upwards
 @return Returns a divided by b
 */
-static INLINE OPJ_INT32 opj_int_ceildiv(OPJ_INT32 a, OPJ_INT32 b) {
-	assert(b);
-	return (a + b - 1) / b;
+static INLINE OPJ_INT32 opj_int_ceildiv(OPJ_INT32 a, OPJ_INT32 b)
+{
+    assert(b);
+    return (OPJ_INT32)(((OPJ_INT64)a + b - 1) / b);
 }
 
 /**
 Divide an integer and round upwards
 @return Returns a divided by b
 */
-static INLINE OPJ_UINT32  opj_uint_ceildiv(OPJ_UINT32  a, OPJ_UINT32  b) {
-	assert(b);
-	return (a + b - 1) / b;
+static INLINE OPJ_UINT32  opj_uint_ceildiv(OPJ_UINT32  a, OPJ_UINT32  b)
+{
+    assert(b);
+    return (a + b - 1) / b;
 }
 
 /**
 Divide an integer by a power of 2 and round upwards
 @return Returns a divided by 2^b
 */
-static INLINE OPJ_INT32 opj_int_ceildivpow2(OPJ_INT32 a, OPJ_INT32 b) {
-	return (OPJ_INT32)((a + ((OPJ_INT64)1 << b) - 1) >> b);
+static INLINE OPJ_INT32 opj_int_ceildivpow2(OPJ_INT32 a, OPJ_INT32 b)
+{
+    return (OPJ_INT32)((a + ((OPJ_INT64)1 << b) - 1) >> b);
 }
 
 /**
  Divide a 64bits integer by a power of 2 and round upwards
  @return Returns a divided by 2^b
  */
-static INLINE OPJ_INT32 opj_int64_ceildivpow2(OPJ_INT64 a, OPJ_INT32 b) {
-	return (OPJ_INT32)((a + ((OPJ_INT64)1 << b) - 1) >> b);
+static INLINE OPJ_INT32 opj_int64_ceildivpow2(OPJ_INT64 a, OPJ_INT32 b)
+{
+    return (OPJ_INT32)((a + ((OPJ_INT64)1 << b) - 1) >> b);
 }
 
 /**
  Divide an integer by a power of 2 and round upwards
  @return Returns a divided by 2^b
  */
-static INLINE OPJ_UINT32 opj_uint_ceildivpow2(OPJ_UINT32 a, OPJ_UINT32 b) {
-	return (OPJ_UINT32)((a + ((OPJ_UINT64)1U << b) - 1U) >> b);
+static INLINE OPJ_UINT32 opj_uint_ceildivpow2(OPJ_UINT32 a, OPJ_UINT32 b)
+{
+    return (OPJ_UINT32)((a + ((OPJ_UINT64)1U << b) - 1U) >> b);
 }
 
 /**
 Divide an integer by a power of 2 and round downwards
 @return Returns a divided by 2^b
 */
-static INLINE OPJ_INT32 opj_int_floordivpow2(OPJ_INT32 a, OPJ_INT32 b) {
-	return a >> b;
+static INLINE OPJ_INT32 opj_int_floordivpow2(OPJ_INT32 a, OPJ_INT32 b)
+{
+    return a >> b;
 }
 /**
 Get logarithm of an integer and round downwards
 @return Returns log2(a)
 */
-static INLINE OPJ_INT32 opj_int_floorlog2(OPJ_INT32 a) {
-	OPJ_INT32 l;
-	for (l = 0; a > 1; l++) {
-		a >>= 1;
-	}
-	return l;
+static INLINE OPJ_INT32 opj_int_floorlog2(OPJ_INT32 a)
+{
+    OPJ_INT32 l;
+    for (l = 0; a > 1; l++) {
+        a >>= 1;
+    }
+    return l;
 }
 /**
 Get logarithm of an integer and round downwards
 @return Returns log2(a)
 */
-static INLINE OPJ_UINT32  opj_uint_floorlog2(OPJ_UINT32  a) {
-	OPJ_UINT32  l;
-	for (l = 0; a > 1; ++l)
-	{
-		a >>= 1;
-	}
-	return l;
+static INLINE OPJ_UINT32  opj_uint_floorlog2(OPJ_UINT32  a)
+{
+    OPJ_UINT32  l;
+    for (l = 0; a > 1; ++l) {
+        a >>= 1;
+    }
+    return l;
 }
 
 /**
@@ -191,28 +208,31 @@
 @param b
 @return Returns a * b
 */
-static INLINE OPJ_INT32 opj_int_fix_mul(OPJ_INT32 a, OPJ_INT32 b) {
+static INLINE OPJ_INT32 opj_int_fix_mul(OPJ_INT32 a, OPJ_INT32 b)
+{
 #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__INTEL_COMPILER) && defined(_M_IX86)
-	OPJ_INT64 temp = __emul(a, b);
+    OPJ_INT64 temp = __emul(a, b);
 #else
-	OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
+    OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
 #endif
-	temp += 4096;
-	assert((temp >> 13) <= (OPJ_INT64)0x7FFFFFFF);
-	assert((temp >> 13) >= (-(OPJ_INT64)0x7FFFFFFF - (OPJ_INT64)1));
-	return (OPJ_INT32) (temp >> 13);
+    temp += 4096;
+    assert((temp >> 13) <= (OPJ_INT64)0x7FFFFFFF);
+    assert((temp >> 13) >= (-(OPJ_INT64)0x7FFFFFFF - (OPJ_INT64)1));
+    return (OPJ_INT32)(temp >> 13);
 }
 
-static INLINE OPJ_INT32 opj_int_fix_mul_t1(OPJ_INT32 a, OPJ_INT32 b) {
+static INLINE OPJ_INT32 opj_int_fix_mul_t1(OPJ_INT32 a, OPJ_INT32 b)
+{
 #if defined(_MSC_VER) && (_MSC_VER >= 1400) && !defined(__INTEL_COMPILER) && defined(_M_IX86)
-	OPJ_INT64 temp = __emul(a, b);
+    OPJ_INT64 temp = __emul(a, b);
 #else
-	OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
+    OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
 #endif
-	temp += 4096;
-	assert((temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) <= (OPJ_INT64)0x7FFFFFFF);
-	assert((temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) >= (-(OPJ_INT64)0x7FFFFFFF - (OPJ_INT64)1));
-	return (OPJ_INT32) (temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) ;
+    temp += 4096;
+    assert((temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) <= (OPJ_INT64)0x7FFFFFFF);
+    assert((temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) >= (-(OPJ_INT64)0x7FFFFFFF -
+            (OPJ_INT64)1));
+    return (OPJ_INT32)(temp >> (13 + 11 - T1_NMSEDEC_FRACBITS)) ;
 }
 
 /* ----------------------------------------------------------------------- */
@@ -220,4 +240,4 @@
 
 /*@}*/
 
-#endif
+#endif /* OPJ_INTMATH_H */
diff --git a/third_party/libopenjpeg20/opj_inttypes.h b/third_party/libopenjpeg20/opj_inttypes.h
index e74aed6..2c9749a 100644
--- a/third_party/libopenjpeg20/opj_inttypes.h
+++ b/third_party/libopenjpeg20/opj_inttypes.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
diff --git a/third_party/libopenjpeg20/opj_malloc.h b/third_party/libopenjpeg20/opj_malloc.h
index 517707f..79b3a64 100644
--- a/third_party/libopenjpeg20/opj_malloc.h
+++ b/third_party/libopenjpeg20/opj_malloc.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -29,8 +29,8 @@
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  */
-#ifndef __OPJ_MALLOC_H
-#define __OPJ_MALLOC_H
+#ifndef OPJ_MALLOC_H
+#define OPJ_MALLOC_H
 /**
 @file opj_malloc.h
 @brief Internal functions
@@ -63,8 +63,8 @@
 
 /**
 Allocate a memory block with elements initialized to 0
-@param num Blocks to allocate
-@param size Bytes per block to allocate
+@param numOfElements  Blocks to allocate
+@param sizeOfElements Bytes per block to allocate
 @return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
 */
 #ifdef ALLOC_PERF_OPT
@@ -85,64 +85,79 @@
 */
 /* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */
 #ifdef _WIN32
-	/* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */
-	#ifdef __GNUC__
-		#include <mm_malloc.h>
-		#define HAVE_MM_MALLOC
-	#else /* MSVC, Intel C++ */
-		#include <malloc.h>
-		#ifdef _mm_malloc
-			#define HAVE_MM_MALLOC
-		#endif
-	#endif
+  /* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */
+  #ifdef __GNUC__
+    #include <mm_malloc.h>
+    #define HAVE_MM_MALLOC
+  #else /* MSVC, Intel C++ */
+    #include <malloc.h>
+    #ifdef _mm_malloc
+      #define HAVE_MM_MALLOC
+    #endif
+  #endif
 #else /* Not _WIN32 */
-	#if defined(__sun)
-		#define HAVE_MEMALIGN
+  #if defined(__sun)
+    #define HAVE_MEMALIGN
   #elif defined(__FreeBSD__)
     #define HAVE_POSIX_MEMALIGN
-	/* Linux x86_64 and OSX always align allocations to 16 bytes */
-	#elif !defined(__amd64__) && !defined(__APPLE__) && !defined(_AIX)
-		#define HAVE_MEMALIGN
-		#include <malloc.h>			
-	#endif
+  /* Linux x86_64 and OSX always align allocations to 16 bytes */
+  #elif !defined(__amd64__) && !defined(__APPLE__) && !defined(_AIX)
+    #define HAVE_MEMALIGN
+    #include <malloc.h>
+  #endif
 #endif
 
 #define opj_aligned_malloc(size) malloc(size)
+#define opj_aligned_32_malloc(size) malloc(size)
 #define opj_aligned_free(m) free(m)
 
 #ifdef HAVE_MM_MALLOC
-	#undef opj_aligned_malloc
-	#define opj_aligned_malloc(size) _mm_malloc(size, 16)
-	#undef opj_aligned_free
-	#define opj_aligned_free(m) _mm_free(m)
+  #undef opj_aligned_malloc
+  #define opj_aligned_malloc(size) _mm_malloc((size), 16)
+  #undef opj_aligned_32_malloc
+  #define opj_aligned_32_malloc(size) _mm_malloc((size), 32)
+  #undef opj_aligned_free
+  #define opj_aligned_free(m) _mm_free(m)
 #endif
 
 #ifdef HAVE_MEMALIGN
-	extern void* memalign(size_t, size_t);
-	#undef opj_aligned_malloc
-	#define opj_aligned_malloc(size) memalign(16, (size))
-	#undef opj_aligned_free
-	#define opj_aligned_free(m) free(m)
+  extern void* memalign(size_t, size_t);
+  #undef opj_aligned_malloc
+  #define opj_aligned_malloc(size) memalign(16, (size))
+  #undef opj_aligned_32_malloc
+  #define opj_aligned_32_malloc(size) memalign(32, (size))
+  #undef opj_aligned_free
+  #define opj_aligned_free(m) free(m)
 #endif
 
 #ifdef HAVE_POSIX_MEMALIGN
-	#undef opj_aligned_malloc
-	extern int posix_memalign(void**, size_t, size_t);
+  #undef opj_aligned_malloc
+  extern int posix_memalign(void**, size_t, size_t);
 
-	static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){
-		void* mem = NULL;
-		posix_memalign(&mem, 16, size);
-		return mem;
-	}
-	#undef opj_aligned_free
-	#define opj_aligned_free(m) free(m)
+  static INLINE void* __attribute__ ((malloc)) opj_aligned_malloc(size_t size){
+    void* mem = NULL;
+    posix_memalign(&mem, 16, size);
+    return mem;
+  }
+
+  #undef opj_aligned_32_malloc
+  static INLINE void* __attribute__ ((malloc)) opj_aligned_32_malloc(size_t size){
+    void* mem = NULL;
+    posix_memalign(&mem, 32, size);
+    return mem;
+  }
+
+  #undef opj_aligned_free
+  #define opj_aligned_free(m) free(m)
 #endif
 
 #ifdef ALLOC_PERF_OPT
-	#undef opj_aligned_malloc
-	#define opj_aligned_malloc(size) opj_malloc(size)
-	#undef opj_aligned_free
-	#define opj_aligned_free(m) opj_free(m)
+  #undef opj_aligned_malloc
+  #define opj_aligned_malloc(size) opj_malloc(size)
+  #undef opj_aligned_32_malloc
+  #define opj_aligned_32_malloc(size) opj_malloc(size)
+  #undef opj_aligned_free
+  #define opj_aligned_free(m) opj_free(m)
 #endif
 
 /**
@@ -172,7 +187,7 @@
 #define opj_free(m) free(m)
 #endif
 
-#ifdef __GNUC__
+#if defined(__GNUC__) && !defined(OPJ_SKIP_POISON)
 #pragma GCC poison malloc calloc realloc free
 #endif
 
@@ -181,5 +196,5 @@
 
 /*@}*/
 
-#endif /* __OPJ_MALLOC_H */
+#endif /* OPJ_MALLOC_H */
 
diff --git a/third_party/libopenjpeg20/opj_stdint.h b/third_party/libopenjpeg20/opj_stdint.h
index b8556a1..f26c921 100644
--- a/third_party/libopenjpeg20/opj_stdint.h
+++ b/third_party/libopenjpeg20/opj_stdint.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
diff --git a/third_party/libopenjpeg20/pi.c b/third_party/libopenjpeg20/pi.c
index 6af38d0..256fe37 100644
--- a/third_party/libopenjpeg20/pi.c
+++ b/third_party/libopenjpeg20/pi.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,7 +8,7 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2006-2007, Parvatha Elangovan
@@ -36,7 +36,6 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <limits.h>
 #include "opj_includes.h"
 
 /** @defgroup PI PI - Implementation of a packet iterator */
@@ -79,68 +78,68 @@
 /**
  * Updates the coding parameters if the encoding is used with Progression order changes and final (or cinema parameters are used).
  *
- * @param	p_cp		the coding parameters to modify
- * @param	p_tileno	the tile index being concerned.
- * @param	p_tx0		X0 parameter for the tile
- * @param	p_tx1		X1 parameter for the tile
- * @param	p_ty0		Y0 parameter for the tile
- * @param	p_ty1		Y1 parameter for the tile
- * @param	p_max_prec	the maximum precision for all the bands of the tile
- * @param	p_max_res	the maximum number of resolutions for all the poc inside the tile.
- * @param	p_dx_min		the minimum dx of all the components of all the resolutions for the tile.
- * @param	p_dy_min		the minimum dy of all the components of all the resolutions for the tile.
+ * @param   p_cp        the coding parameters to modify
+ * @param   p_tileno    the tile index being concerned.
+ * @param   p_tx0       X0 parameter for the tile
+ * @param   p_tx1       X1 parameter for the tile
+ * @param   p_ty0       Y0 parameter for the tile
+ * @param   p_ty1       Y1 parameter for the tile
+ * @param   p_max_prec  the maximum precision for all the bands of the tile
+ * @param   p_max_res   the maximum number of resolutions for all the poc inside the tile.
+ * @param   p_dx_min        the minimum dx of all the components of all the resolutions for the tile.
+ * @param   p_dy_min        the minimum dy of all the components of all the resolutions for the tile.
  */
-static void opj_pi_update_encode_poc_and_final ( opj_cp_t *p_cp,
-                                                 OPJ_UINT32 p_tileno,
-                                                 OPJ_INT32 p_tx0,
-                                                 OPJ_INT32 p_tx1,
-                                                 OPJ_INT32 p_ty0,
-                                                 OPJ_INT32 p_ty1,
-                                                 OPJ_UINT32 p_max_prec,
-                                                 OPJ_UINT32 p_max_res,
-                                                 OPJ_UINT32 p_dx_min,
-                                                 OPJ_UINT32 p_dy_min);
+static void opj_pi_update_encode_poc_and_final(opj_cp_t *p_cp,
+        OPJ_UINT32 p_tileno,
+        OPJ_INT32 p_tx0,
+        OPJ_INT32 p_tx1,
+        OPJ_INT32 p_ty0,
+        OPJ_INT32 p_ty1,
+        OPJ_UINT32 p_max_prec,
+        OPJ_UINT32 p_max_res,
+        OPJ_UINT32 p_dx_min,
+        OPJ_UINT32 p_dy_min);
 
 /**
  * Updates the coding parameters if the encoding is not used with Progression order changes and final (and cinema parameters are used).
  *
- * @param	p_cp		the coding parameters to modify
- * @param	p_num_comps		the number of components
- * @param	p_tileno	the tile index being concerned.
- * @param	p_tx0		X0 parameter for the tile
- * @param	p_tx1		X1 parameter for the tile
- * @param	p_ty0		Y0 parameter for the tile
- * @param	p_ty1		Y1 parameter for the tile
- * @param	p_max_prec	the maximum precision for all the bands of the tile
- * @param	p_max_res	the maximum number of resolutions for all the poc inside the tile.
- * @param	p_dx_min		the minimum dx of all the components of all the resolutions for the tile.
- * @param	p_dy_min		the minimum dy of all the components of all the resolutions for the tile.
+ * @param   p_cp        the coding parameters to modify
+ * @param   p_num_comps     the number of components
+ * @param   p_tileno    the tile index being concerned.
+ * @param   p_tx0       X0 parameter for the tile
+ * @param   p_tx1       X1 parameter for the tile
+ * @param   p_ty0       Y0 parameter for the tile
+ * @param   p_ty1       Y1 parameter for the tile
+ * @param   p_max_prec  the maximum precision for all the bands of the tile
+ * @param   p_max_res   the maximum number of resolutions for all the poc inside the tile.
+ * @param   p_dx_min        the minimum dx of all the components of all the resolutions for the tile.
+ * @param   p_dy_min        the minimum dy of all the components of all the resolutions for the tile.
  */
-static void opj_pi_update_encode_not_poc (  opj_cp_t *p_cp,
-                                            OPJ_UINT32 p_num_comps,
-                                            OPJ_UINT32 p_tileno,
-                                            OPJ_INT32 p_tx0,
-                                            OPJ_INT32 p_tx1,
-                                            OPJ_INT32 p_ty0,
-                                            OPJ_INT32 p_ty1,
-                                            OPJ_UINT32 p_max_prec,
-                                            OPJ_UINT32 p_max_res,
-                                            OPJ_UINT32 p_dx_min,
-                                            OPJ_UINT32 p_dy_min);
+static void opj_pi_update_encode_not_poc(opj_cp_t *p_cp,
+        OPJ_UINT32 p_num_comps,
+        OPJ_UINT32 p_tileno,
+        OPJ_INT32 p_tx0,
+        OPJ_INT32 p_tx1,
+        OPJ_INT32 p_ty0,
+        OPJ_INT32 p_ty1,
+        OPJ_UINT32 p_max_prec,
+        OPJ_UINT32 p_max_res,
+        OPJ_UINT32 p_dx_min,
+        OPJ_UINT32 p_dy_min);
 /**
  * Gets the encoding parameters needed to update the coding parameters and all the pocs.
- * 
- * @param	p_image			the image being encoded.
- * @param	p_cp			the coding parameters.
- * @param	tileno			the tile index of the tile being encoded.
- * @param	p_tx0			pointer that will hold the X0 parameter for the tile
- * @param	p_tx1			pointer that will hold the X1 parameter for the tile
- * @param	p_ty0			pointer that will hold the Y0 parameter for the tile
- * @param	p_ty1			pointer that will hold the Y1 parameter for the tile
- * @param	p_max_prec		pointer that will hold the the maximum precision for all the bands of the tile
- * @param	p_max_res		pointer that will hold the the maximum number of resolutions for all the poc inside the tile.
- * @param	p_dx_min			pointer that will hold the the minimum dx of all the components of all the resolutions for the tile.
- * @param	p_dy_min			pointer that will hold the the minimum dy of all the components of all the resolutions for the tile.
+ *
+ * @param   p_image         the image being encoded.
+ * @param   p_cp            the coding parameters.
+ * @param   tileno          the tile index of the tile being encoded.
+ * @param   p_tx0           pointer that will hold the X0 parameter for the tile
+ * @param   p_tx1           pointer that will hold the X1 parameter for the tile
+ * @param   p_ty0           pointer that will hold the Y0 parameter for the tile
+ * @param   p_ty1           pointer that will hold the Y1 parameter for the tile
+ * @param   p_max_prec      pointer that will hold the maximum precision for all the bands of the tile
+ * @param   p_max_res       pointer that will hold the maximum number of resolutions for all the poc inside the tile.
+ * @param   p_dx_min            pointer that will hold the minimum dx of all the components of all the resolutions for the tile.
+ * @param   p_dy_min            pointer that will hold the minimum dy of all the components of all the resolutions for the tile.
  */
 static void opj_get_encoding_parameters(const opj_image_t *p_image,
                                         const opj_cp_t *p_cp,
@@ -152,7 +151,7 @@
                                         OPJ_UINT32 * p_dx_min,
                                         OPJ_UINT32 * p_dy_min,
                                         OPJ_UINT32 * p_max_prec,
-                                        OPJ_UINT32 * p_max_res );
+                                        OPJ_UINT32 * p_max_res);
 
 /**
  * Gets the encoding parameters needed to update the coding parameters and all the pocs.
@@ -161,65 +160,65 @@
  * to an area of size 4 * max_res. The data is stored inside this area with the following pattern :
  * dx_compi_res0 , dy_compi_res0 , w_compi_res0, h_compi_res0 , dx_compi_res1 , dy_compi_res1 , w_compi_res1, h_compi_res1 , ...
  *
- * @param	p_image			the image being encoded.
- * @param	p_cp			the coding parameters.
- * @param	tileno			the tile index of the tile being encoded.
- * @param	p_tx0			pointer that will hold the X0 parameter for the tile
- * @param	p_tx1			pointer that will hold the X1 parameter for the tile
- * @param	p_ty0			pointer that will hold the Y0 parameter for the tile
- * @param	p_ty1			pointer that will hold the Y1 parameter for the tile
- * @param	p_max_prec		pointer that will hold the the maximum precision for all the bands of the tile
- * @param	p_max_res		pointer that will hold the the maximum number of resolutions for all the poc inside the tile.
- * @param	p_dx_min		pointer that will hold the the minimum dx of all the components of all the resolutions for the tile.
- * @param	p_dy_min		pointer that will hold the the minimum dy of all the components of all the resolutions for the tile.
- * @param	p_resolutions	pointer to an area corresponding to the one described above.
+ * @param   p_image         the image being encoded.
+ * @param   p_cp            the coding parameters.
+ * @param   tileno          the tile index of the tile being encoded.
+ * @param   p_tx0           pointer that will hold the X0 parameter for the tile
+ * @param   p_tx1           pointer that will hold the X1 parameter for the tile
+ * @param   p_ty0           pointer that will hold the Y0 parameter for the tile
+ * @param   p_ty1           pointer that will hold the Y1 parameter for the tile
+ * @param   p_max_prec      pointer that will hold the maximum precision for all the bands of the tile
+ * @param   p_max_res       pointer that will hold the maximum number of resolutions for all the poc inside the tile.
+ * @param   p_dx_min        pointer that will hold the minimum dx of all the components of all the resolutions for the tile.
+ * @param   p_dy_min        pointer that will hold the minimum dy of all the components of all the resolutions for the tile.
+ * @param   p_resolutions   pointer to an area corresponding to the one described above.
  */
 static void opj_get_all_encoding_parameters(const opj_image_t *p_image,
-                                            const opj_cp_t *p_cp,
-                                            OPJ_UINT32 tileno,
-                                            OPJ_INT32 * p_tx0,
-                                            OPJ_INT32 * p_tx1,
-                                            OPJ_INT32 * p_ty0,
-                                            OPJ_INT32 * p_ty1,
-                                            OPJ_UINT32 * p_dx_min,
-                                            OPJ_UINT32 * p_dy_min,
-                                            OPJ_UINT32 * p_max_prec,
-                                            OPJ_UINT32 * p_max_res,
-                                            OPJ_UINT32 ** p_resolutions );
+        const opj_cp_t *p_cp,
+        OPJ_UINT32 tileno,
+        OPJ_INT32 * p_tx0,
+        OPJ_INT32 * p_tx1,
+        OPJ_INT32 * p_ty0,
+        OPJ_INT32 * p_ty1,
+        OPJ_UINT32 * p_dx_min,
+        OPJ_UINT32 * p_dy_min,
+        OPJ_UINT32 * p_max_prec,
+        OPJ_UINT32 * p_max_res,
+        OPJ_UINT32 ** p_resolutions);
 /**
  * Allocates memory for a packet iterator. Data and data sizes are set by this operation.
  * No other data is set. The include section of the packet  iterator is not allocated.
- * 
- * @param	p_image		the image used to initialize the packet iterator (in fact only the number of components is relevant.
- * @param	p_cp		the coding parameters.
- * @param	tileno	the index of the tile from which creating the packet iterator.
+ *
+ * @param   p_image     the image used to initialize the packet iterator (in fact only the number of components is relevant.
+ * @param   p_cp        the coding parameters.
+ * @param   tileno  the index of the tile from which creating the packet iterator.
  */
-static opj_pi_iterator_t * opj_pi_create(	const opj_image_t *p_image,
-                                            const opj_cp_t *p_cp,
-                                            OPJ_UINT32 tileno );
+static opj_pi_iterator_t * opj_pi_create(const opj_image_t *p_image,
+        const opj_cp_t *p_cp,
+        OPJ_UINT32 tileno);
 /**
  * FIXME DOC
  */
-static void opj_pi_update_decode_not_poc (opj_pi_iterator_t * p_pi,
-                                          opj_tcp_t * p_tcp,
-                                          OPJ_UINT32 p_max_precision,
-                                          OPJ_UINT32 p_max_res);
+static void opj_pi_update_decode_not_poc(opj_pi_iterator_t * p_pi,
+        opj_tcp_t * p_tcp,
+        OPJ_UINT32 p_max_precision,
+        OPJ_UINT32 p_max_res);
 /**
  * FIXME DOC
  */
-static void opj_pi_update_decode_poc (  opj_pi_iterator_t * p_pi,
-                                        opj_tcp_t * p_tcp,
-                                        OPJ_UINT32 p_max_precision,
-                                        OPJ_UINT32 p_max_res);
+static void opj_pi_update_decode_poc(opj_pi_iterator_t * p_pi,
+                                     opj_tcp_t * p_tcp,
+                                     OPJ_UINT32 p_max_precision,
+                                     OPJ_UINT32 p_max_res);
 
 /**
  * FIXME DOC
  */
-static OPJ_BOOL opj_pi_check_next_level(	OPJ_INT32 pos,
-								opj_cp_t *cp,
-								OPJ_UINT32 tileno,
-								OPJ_UINT32 pino,
-								const OPJ_CHAR *prog);
+static OPJ_BOOL opj_pi_check_next_level(OPJ_INT32 pos,
+                                        opj_cp_t *cp,
+                                        OPJ_UINT32 tileno,
+                                        OPJ_UINT32 pino,
+                                        const OPJ_CHAR *prog);
 
 /*@}*/
 
@@ -231,951 +230,1124 @@
 ==========================================================
 */
 
-static OPJ_BOOL opj_pi_next_lrcp(opj_pi_iterator_t * pi) {
-	opj_pi_comp_t *comp = NULL;
-	opj_pi_resolution_t *res = NULL;
-	OPJ_UINT32 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 = pi->poc.layno0; 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];
-				if (!pi->tp_on){
-					pi->poc.precno1 = res->pw * res->ph;
-				}
-				for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; 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 OPJ_TRUE;
-					}
-LABEL_SKIP:;
-				}
-			}
-		}
-	}
-	
-	return OPJ_FALSE;
-}
-
-static OPJ_BOOL opj_pi_next_rlcp(opj_pi_iterator_t * pi) {
-	opj_pi_comp_t *comp = NULL;
-	opj_pi_resolution_t *res = NULL;
-	OPJ_UINT32 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 = pi->poc.layno0; 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];
-				if(!pi->tp_on){
-					pi->poc.precno1 = res->pw * res->ph;
-				}
-				for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; 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 OPJ_TRUE;
-					}
-LABEL_SKIP:;
-				}
-			}
-		}
-	}
-	
-	return OPJ_FALSE;
-}
-
-static OPJ_BOOL opj_pi_next_rpcl(opj_pi_iterator_t * pi) {
-	opj_pi_comp_t *comp = NULL;
-	opj_pi_resolution_t *res = NULL;
-	OPJ_UINT32 index = 0;
-
-	if (!pi->first) {
-		goto LABEL_SKIP;
-	} else {
-		OPJ_UINT32 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++) {
-				OPJ_UINT32 dx, dy;
-				res = &comp->resolutions[resno];
-				dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
-				dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
-				pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
-				pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
-			}
-		}
-	}
-if (!pi->tp_on){
-			pi->poc.ty0 = pi->ty0;
-			pi->poc.tx0 = pi->tx0;
-			pi->poc.ty1 = pi->ty1;
-			pi->poc.tx1 = pi->tx1;
-		}
-	for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
-		for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
-			for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {
-				for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
-					OPJ_UINT32 levelno;
-					OPJ_INT32 trx0, try0;
-					OPJ_INT32  trx1, try1;
-					OPJ_UINT32  rpx, rpy;
-					OPJ_INT32  prci, prcj;
-					comp = &pi->comps[pi->compno];
-					if (pi->resno >= comp->numresolutions) {
-						continue;
-					}
-					res = &comp->resolutions[pi->resno];
-					levelno = comp->numresolutions - 1 - pi->resno;
-					OPJ_INT32 x_divisor = comp->dx << levelno;
-					OPJ_INT32 y_divisor = comp->dy << levelno;
-					if (x_divisor == 0 || y_divisor == 0) {
-						continue;
-					}
-					trx0 = opj_int_ceildiv(pi->tx0, x_divisor);
-					try0 = opj_int_ceildiv(pi->ty0, y_divisor);
-					trx1 = opj_int_ceildiv(pi->tx1, x_divisor);
-					try1 = opj_int_ceildiv(pi->ty1, y_divisor);
-					rpx = res->pdx + levelno;
-					rpy = res->pdy + levelno;
-					if (comp->dy << rpy == 0 || 1 << rpy == 0 || comp->dx << rpx == 0 || 1 << rpx == 0) {
-						continue;
-					}
-					if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
-						continue;	
-					}
-					if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
-						continue;
-					}
-					
-					if ((res->pw==0)||(res->ph==0)) continue;
-					
-					if ((trx0==trx1)||(try0==try1)) continue;
-					
-					prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, x_divisor), (OPJ_INT32)res->pdx)
-						 - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
-					prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, y_divisor), (OPJ_INT32)res->pdy)
-						 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
-					pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
-					if (pi->precno >= res->pw * res->ph) {
-						return OPJ_FALSE;
-					}
-					for (pi->layno = pi->poc.layno0; 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 OPJ_TRUE;
-						}
-LABEL_SKIP:;
-					}
-				}
-			}
-		}
-	}
-	
-	return OPJ_FALSE;
-}
-
-static OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi) {
-	opj_pi_comp_t *comp = NULL;
-	opj_pi_resolution_t *res = NULL;
-	OPJ_UINT32 index = 0;
-
-	if (!pi->first) {
-		comp = &pi->comps[pi->compno];
-		goto LABEL_SKIP;
-	} else {
-		OPJ_UINT32 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++) {
-				OPJ_UINT32 dx, dy;
-				res = &comp->resolutions[resno];
-				dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
-				dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
-				pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
-				pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
-			}
-		}
-	}
-	if (!pi->tp_on){
-			pi->poc.ty0 = pi->ty0;
-			pi->poc.tx0 = pi->tx0;
-			pi->poc.ty1 = pi->ty1;
-			pi->poc.tx1 = pi->tx1;
-		}
-	for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
-		for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)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 < opj_uint_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
-					OPJ_UINT32 levelno;
-					OPJ_INT32 trx0, try0;
-					OPJ_INT32 trx1, try1;
-					OPJ_UINT32 rpx, rpy;
-					OPJ_INT32 prci, prcj;
-					res = &comp->resolutions[pi->resno];
-					levelno = comp->numresolutions - 1 - pi->resno;
-					OPJ_INT32 x_divisor = comp->dx << levelno;
-					OPJ_INT32 y_divisor = comp->dy << levelno;
-					if (x_divisor == 0 || y_divisor == 0) {
-						continue;
-					}
-					trx0 = opj_int_ceildiv(pi->tx0, x_divisor);
-					try0 = opj_int_ceildiv(pi->ty0, y_divisor);
-					trx1 = opj_int_ceildiv(pi->tx1, x_divisor);
-					try1 = opj_int_ceildiv(pi->ty1, y_divisor);
-					rpx = res->pdx + levelno;
-					rpy = res->pdy + levelno;
-					if (comp->dy << rpy == 0 || 1 << rpy == 0 || comp->dx << rpx == 0 || 1 << rpx == 0) {
-						continue;
-					}
-					if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
-						continue;	
-					}
-					if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
-						continue;
-					}
-					
-					if ((res->pw==0)||(res->ph==0)) continue;
-					
-					if ((trx0==trx1)||(try0==try1)) continue;
-					
-					prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, x_divisor), (OPJ_INT32)res->pdx)
-						 - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
-					prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, y_divisor), (OPJ_INT32)res->pdy)
-						 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
-					pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
-					if (pi->precno >= res->pw * res->ph) {
-						return OPJ_FALSE;
-					}
-					for (pi->layno = pi->poc.layno0; 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 OPJ_TRUE;
-						}	
-LABEL_SKIP:;
-					}
-				}
-			}
-		}
-	}
-	
-	return OPJ_FALSE;
-}
-
-static OPJ_BOOL opj_pi_next_cprl(opj_pi_iterator_t * pi) {
-	opj_pi_comp_t *comp = NULL;
-	opj_pi_resolution_t *res = NULL;
-	OPJ_UINT32 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++) {
-		OPJ_UINT32 resno;
-		comp = &pi->comps[pi->compno];
-		pi->dx = 0;
-		pi->dy = 0;
-		for (resno = 0; resno < comp->numresolutions; resno++) {
-			OPJ_UINT32 dx, dy;
-			res = &comp->resolutions[resno];
-			dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
-			dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
-			pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
-			pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
-		}
-		if (!pi->tp_on){
-			pi->poc.ty0 = pi->ty0;
-			pi->poc.tx0 = pi->tx0;
-			pi->poc.ty1 = pi->ty1;
-			pi->poc.tx1 = pi->tx1;
-		}
-		for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1; pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
-			for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1; pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {
-				for (pi->resno = pi->poc.resno0; pi->resno < opj_uint_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
-					OPJ_UINT32 levelno;
-					OPJ_INT32 trx0, try0;
-					OPJ_INT32 trx1, try1;
-					OPJ_UINT32 rpx, rpy;
-					OPJ_INT32 prci, prcj;
-					res = &comp->resolutions[pi->resno];
-					levelno = comp->numresolutions - 1 - pi->resno;
-					OPJ_INT32 x_divisor = comp->dx << levelno;
-					OPJ_INT32 y_divisor = comp->dy << levelno;
-					if (x_divisor == 0 || y_divisor == 0) {
-						continue;
-					}
-					trx0 = opj_int_ceildiv(pi->tx0, x_divisor);
-					try0 = opj_int_ceildiv(pi->ty0, y_divisor);
-					trx1 = opj_int_ceildiv(pi->tx1, x_divisor);
-					try1 = opj_int_ceildiv(pi->ty1, y_divisor);
-					rpx = res->pdx + levelno;
-					rpy = res->pdy + levelno;
-					if (comp->dy << rpy == 0 || 1 << rpy == 0 || comp->dx << rpx == 0 || 1 << rpx == 0) {
-						continue;
-					}
-					if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
-						continue;	
-					}
-					if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
-						continue;
-					}
-					if ((res->pw==0)||(res->ph==0)) continue;
-					
-					if ((trx0==trx1)||(try0==try1)) continue;
-					
-					prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x, x_divisor), (OPJ_INT32)res->pdx)
-						 - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
-					prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y, y_divisor), (OPJ_INT32)res->pdy)
-						 - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
-					pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
-					if (pi->precno >= res->pw * res->ph) {
-						return OPJ_FALSE;
-					}
-					for (pi->layno = pi->poc.layno0; 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 OPJ_TRUE;
-						}
-LABEL_SKIP:;
-					}
-				}
-			}
-		}
-	}
-	
-	return OPJ_FALSE;
-}
-
-static void opj_get_encoding_parameters(	const opj_image_t *p_image,
-                                    const opj_cp_t *p_cp,
-                                    OPJ_UINT32 p_tileno,
-                                    OPJ_INT32 * p_tx0,
-                                    OPJ_INT32  * p_tx1,
-                                    OPJ_INT32  * p_ty0,
-                                    OPJ_INT32  * p_ty1,
-                                    OPJ_UINT32 * p_dx_min,
-                                    OPJ_UINT32 * p_dy_min,
-                                    OPJ_UINT32 * p_max_prec,
-                                    OPJ_UINT32 * p_max_res )
+static void opj_pi_emit_error(opj_pi_iterator_t * pi, const char* msg)
 {
-	/* loop */
-	OPJ_UINT32  compno, resno;
-	/* pointers */
-	const opj_tcp_t *l_tcp = 00;
-	const opj_tccp_t * l_tccp = 00;
-	const opj_image_comp_t * l_img_comp = 00;
-
-	/* position in x and y of tile */
-	OPJ_UINT32 p, q;
-
-	/* preconditions */
-	assert(p_cp != 00);
-	assert(p_image != 00);
-	assert(p_tileno < p_cp->tw * p_cp->th);
-
-	/* initializations */
-	l_tcp = &p_cp->tcps [p_tileno];
-	l_img_comp = p_image->comps;
-	l_tccp = l_tcp->tccps;
-
-	/* here calculation of tx0, tx1, ty0, ty1, maxprec, dx and dy */
-	p = p_tileno % p_cp->tw;
-	q = p_tileno / p_cp->tw;
-
-	/* find extent of tile */
-	*p_tx0 = opj_int_max((OPJ_INT32)(p_cp->tx0 + p * p_cp->tdx), (OPJ_INT32)p_image->x0);
-	*p_tx1 = opj_int_min((OPJ_INT32)(p_cp->tx0 + (p + 1) * p_cp->tdx), (OPJ_INT32)p_image->x1);
-	*p_ty0 = opj_int_max((OPJ_INT32)(p_cp->ty0 + q * p_cp->tdy), (OPJ_INT32)p_image->y0);
-	*p_ty1 = opj_int_min((OPJ_INT32)(p_cp->ty0 + (q + 1) * p_cp->tdy), (OPJ_INT32)p_image->y1);
-
-	/* max precision is 0 (can only grow) */
-	*p_max_prec = 0;
-	*p_max_res = 0;
-
-	/* take the largest value for dx_min and dy_min */
-	*p_dx_min = 0x7fffffff;
-	*p_dy_min  = 0x7fffffff;
-
-	for (compno = 0; compno < p_image->numcomps; ++compno) {
-		/* arithmetic variables to calculate */
-		OPJ_UINT32 l_level_no;
-		OPJ_INT32 l_rx0, l_ry0, l_rx1, l_ry1;
-		OPJ_INT32 l_px0, l_py0, l_px1, py1;
-		OPJ_UINT32 l_pdx, l_pdy;
-		OPJ_UINT32 l_pw, l_ph;
-		OPJ_UINT32 l_product;
-		OPJ_INT32 l_tcx0, l_tcy0, l_tcx1, l_tcy1;
-
-		l_tcx0 = opj_int_ceildiv(*p_tx0, (OPJ_INT32)l_img_comp->dx);
-		l_tcy0 = opj_int_ceildiv(*p_ty0, (OPJ_INT32)l_img_comp->dy);
-		l_tcx1 = opj_int_ceildiv(*p_tx1, (OPJ_INT32)l_img_comp->dx);
-		l_tcy1 = opj_int_ceildiv(*p_ty1, (OPJ_INT32)l_img_comp->dy);
-
-		if (l_tccp->numresolutions > *p_max_res) {
-			*p_max_res = l_tccp->numresolutions;
-		}
-
-		/* use custom size for precincts */
-		for (resno = 0; resno < l_tccp->numresolutions; ++resno) {
-			OPJ_UINT32 l_dx, l_dy;
-
-			/* precinct width and height */
-			l_pdx = l_tccp->prcw[resno];
-			l_pdy = l_tccp->prch[resno];
-
-			l_dx = l_img_comp->dx * (1u << (l_pdx + l_tccp->numresolutions - 1 - resno));
-			l_dy = l_img_comp->dy * (1u << (l_pdy + l_tccp->numresolutions - 1 - resno));
-
-			/* take the minimum size for dx for each comp and resolution */
-			*p_dx_min = opj_uint_min(*p_dx_min, l_dx);
-			*p_dy_min = opj_uint_min(*p_dy_min, l_dy);
-
-			/* various calculations of extents */
-			l_level_no = l_tccp->numresolutions - 1 - resno;
-
-			l_rx0 = opj_int_ceildivpow2(l_tcx0, (OPJ_INT32)l_level_no);
-			l_ry0 = opj_int_ceildivpow2(l_tcy0, (OPJ_INT32)l_level_no);
-			l_rx1 = opj_int_ceildivpow2(l_tcx1, (OPJ_INT32)l_level_no);
-			l_ry1 = opj_int_ceildivpow2(l_tcy1, (OPJ_INT32)l_level_no);
-
-			l_px0 = opj_int_floordivpow2(l_rx0, (OPJ_INT32)l_pdx) << l_pdx;
-			l_py0 = opj_int_floordivpow2(l_ry0, (OPJ_INT32)l_pdy) << l_pdy;
-			l_px1 = opj_int_ceildivpow2(l_rx1, (OPJ_INT32)l_pdx) << l_pdx;
-
-			py1 = opj_int_ceildivpow2(l_ry1, (OPJ_INT32)l_pdy) << l_pdy;
-
-			l_pw = (l_rx0==l_rx1)?0:(OPJ_UINT32)((l_px1 - l_px0) >> l_pdx);
-			l_ph = (l_ry0==l_ry1)?0:(OPJ_UINT32)((py1 - l_py0) >> l_pdy);
-
-			l_product = l_pw * l_ph;
-
-			/* update precision */
-			if (l_product > *p_max_prec) {
-				*p_max_prec = l_product;
-			}
-		}
-		++l_img_comp;
-		++l_tccp;
-	}
+    (void)pi;
+    (void)msg;
 }
 
+static OPJ_BOOL opj_pi_next_lrcp(opj_pi_iterator_t * pi)
+{
+    opj_pi_comp_t *comp = NULL;
+    opj_pi_resolution_t *res = NULL;
+    OPJ_UINT32 index = 0;
 
-static void opj_get_all_encoding_parameters(   const opj_image_t *p_image,
+    if (!pi->first) {
+        comp = &pi->comps[pi->compno];
+        res = &comp->resolutions[pi->resno];
+        goto LABEL_SKIP;
+    } else {
+        pi->first = 0;
+    }
+
+    for (pi->layno = pi->poc.layno0; 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];
+                if (!pi->tp_on) {
+                    pi->poc.precno1 = res->pw * res->ph;
+                }
+                for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
+                    index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno *
+                            pi->step_c + pi->precno * pi->step_p;
+                    /* Avoids index out of bounds access with */
+                    /* id_000098,sig_11,src_005411,op_havoc,rep_2 of */
+                    /* https://github.com/uclouvain/openjpeg/issues/938 */
+                    /* Not sure if this is the most clever fix. Perhaps */
+                    /* include should be resized when a POC arises, or */
+                    /* the POC should be rejected */
+                    if (index >= pi->include_size) {
+                        opj_pi_emit_error(pi, "Invalid access to pi->include");
+                        return OPJ_FALSE;
+                    }
+                    if (!pi->include[index]) {
+                        pi->include[index] = 1;
+                        return OPJ_TRUE;
+                    }
+LABEL_SKIP:
+                    ;
+                }
+            }
+        }
+    }
+
+    return OPJ_FALSE;
+}
+
+static OPJ_BOOL opj_pi_next_rlcp(opj_pi_iterator_t * pi)
+{
+    opj_pi_comp_t *comp = NULL;
+    opj_pi_resolution_t *res = NULL;
+    OPJ_UINT32 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 = pi->poc.layno0; 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];
+                if (!pi->tp_on) {
+                    pi->poc.precno1 = res->pw * res->ph;
+                }
+                for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
+                    index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno *
+                            pi->step_c + pi->precno * pi->step_p;
+                    if (index >= pi->include_size) {
+                        opj_pi_emit_error(pi, "Invalid access to pi->include");
+                        return OPJ_FALSE;
+                    }
+                    if (!pi->include[index]) {
+                        pi->include[index] = 1;
+                        return OPJ_TRUE;
+                    }
+LABEL_SKIP:
+                    ;
+                }
+            }
+        }
+    }
+
+    return OPJ_FALSE;
+}
+
+static OPJ_BOOL opj_pi_next_rpcl(opj_pi_iterator_t * pi)
+{
+    opj_pi_comp_t *comp = NULL;
+    opj_pi_resolution_t *res = NULL;
+    OPJ_UINT32 index = 0;
+
+    if (!pi->first) {
+        goto LABEL_SKIP;
+    } else {
+        OPJ_UINT32 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++) {
+                OPJ_UINT32 dx, dy;
+                res = &comp->resolutions[resno];
+                if (res->pdx + comp->numresolutions - 1 - resno < 32 &&
+                        comp->dx <= UINT_MAX / (1u << (res->pdx + comp->numresolutions - 1 - resno))) {
+                    dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
+                    pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
+                }
+                if (res->pdy + comp->numresolutions - 1 - resno < 32 &&
+                        comp->dy <= UINT_MAX / (1u << (res->pdy + comp->numresolutions - 1 - resno))) {
+                    dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
+                    pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
+                }
+            }
+        }
+        if (pi->dx == 0 || pi->dy == 0) {
+            return OPJ_FALSE;
+        }
+    }
+    if (!pi->tp_on) {
+        pi->poc.ty0 = pi->ty0;
+        pi->poc.tx0 = pi->tx0;
+        pi->poc.ty1 = pi->ty1;
+        pi->poc.tx1 = pi->tx1;
+    }
+    for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
+        for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1;
+                pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
+            for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1;
+                    pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {
+                for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
+                    OPJ_UINT32 levelno;
+                    OPJ_INT32 trx0, try0;
+                    OPJ_INT32  trx1, try1;
+                    OPJ_UINT32  rpx, rpy;
+                    OPJ_INT32  prci, prcj;
+                    comp = &pi->comps[pi->compno];
+                    if (pi->resno >= comp->numresolutions) {
+                        continue;
+                    }
+                    res = &comp->resolutions[pi->resno];
+                    levelno = comp->numresolutions - 1 - pi->resno;
+                    /* Avoids division by zero */
+                    /* Relates to id_000004,sig_06,src_000679,op_arith8,pos_49,val_-17 */
+                    /* of  https://github.com/uclouvain/openjpeg/issues/938 */
+                    if (levelno >= 32 ||
+                            ((comp->dx << levelno) >> levelno) != comp->dx ||
+                            ((comp->dy << levelno) >> levelno) != comp->dy) {
+                        continue;
+                    }
+                    if ((comp->dx << levelno) > INT_MAX ||
+                            (comp->dy << levelno) > INT_MAX) {
+                        continue;
+                    }
+                    trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
+                    try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
+                    trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
+                    try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
+                    rpx = res->pdx + levelno;
+                    rpy = res->pdy + levelno;
+
+                    /* To avoid divisions by zero / undefined behaviour on shift */
+                    /* in below tests */
+                    /* Fixes reading id:000026,sig:08,src:002419,op:int32,pos:60,val:+32 */
+                    /* of https://github.com/uclouvain/openjpeg/issues/938 */
+                    if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx ||
+                            rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy) {
+                        continue;
+                    }
+
+                    /* See ISO-15441. B.12.1.3 Resolution level-position-component-layer progression */
+                    if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) &&
+                            ((try0 << levelno) % (1 << rpy))))) {
+                        continue;
+                    }
+                    if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) &&
+                            ((trx0 << levelno) % (1 << rpx))))) {
+                        continue;
+                    }
+
+                    if ((res->pw == 0) || (res->ph == 0)) {
+                        continue;
+                    }
+
+                    if ((trx0 == trx1) || (try0 == try1)) {
+                        continue;
+                    }
+
+                    prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x,
+                                                (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
+                           - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
+                    prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y,
+                                                (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
+                           - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
+                    pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
+                    if (pi->precno >= res->pw * res->ph) {
+                      return OPJ_FALSE;
+                    }
+                    for (pi->layno = pi->poc.layno0; 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 (index >= pi->include_size) {
+                            opj_pi_emit_error(pi, "Invalid access to pi->include");
+                            return OPJ_FALSE;
+                        }
+                        if (!pi->include[index]) {
+                            pi->include[index] = 1;
+                            return OPJ_TRUE;
+                        }
+LABEL_SKIP:
+                        ;
+                    }
+                }
+            }
+        }
+    }
+
+    return OPJ_FALSE;
+}
+
+static OPJ_BOOL opj_pi_next_pcrl(opj_pi_iterator_t * pi)
+{
+    opj_pi_comp_t *comp = NULL;
+    opj_pi_resolution_t *res = NULL;
+    OPJ_UINT32 index = 0;
+
+    if (!pi->first) {
+        comp = &pi->comps[pi->compno];
+        goto LABEL_SKIP;
+    } else {
+        OPJ_UINT32 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++) {
+                OPJ_UINT32 dx, dy;
+                res = &comp->resolutions[resno];
+                if (res->pdx + comp->numresolutions - 1 - resno < 32 &&
+                        comp->dx <= UINT_MAX / (1u << (res->pdx + comp->numresolutions - 1 - resno))) {
+                    dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
+                    pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
+                }
+                if (res->pdy + comp->numresolutions - 1 - resno < 32 &&
+                        comp->dy <= UINT_MAX / (1u << (res->pdy + comp->numresolutions - 1 - resno))) {
+                    dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
+                    pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
+                }
+            }
+        }
+        if (pi->dx == 0 || pi->dy == 0) {
+            return OPJ_FALSE;
+        }
+    }
+    if (!pi->tp_on) {
+        pi->poc.ty0 = pi->ty0;
+        pi->poc.tx0 = pi->tx0;
+        pi->poc.ty1 = pi->ty1;
+        pi->poc.tx1 = pi->tx1;
+    }
+    for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1;
+            pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
+        for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1;
+                pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)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 < opj_uint_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
+                    OPJ_UINT32 levelno;
+                    OPJ_INT32 trx0, try0;
+                    OPJ_INT32 trx1, try1;
+                    OPJ_UINT32 rpx, rpy;
+                    OPJ_INT32 prci, prcj;
+                    res = &comp->resolutions[pi->resno];
+                    levelno = comp->numresolutions - 1 - pi->resno;
+                    /* Avoids division by zero */
+                    /* Relates to id_000004,sig_06,src_000679,op_arith8,pos_49,val_-17 */
+                    /* of  https://github.com/uclouvain/openjpeg/issues/938 */
+                    if (levelno >= 32 ||
+                            ((comp->dx << levelno) >> levelno) != comp->dx ||
+                            ((comp->dy << levelno) >> levelno) != comp->dy) {
+                        continue;
+                    }
+                    if ((comp->dx << levelno) > INT_MAX ||
+                            (comp->dy << levelno) > INT_MAX) {
+                        continue;
+                    }
+                    trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
+                    try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
+                    trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
+                    try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
+                    rpx = res->pdx + levelno;
+                    rpy = res->pdy + levelno;
+
+                    /* To avoid divisions by zero / undefined behaviour on shift */
+                    /* in below tests */
+                    /* Relates to id:000019,sig:08,src:001098,op:flip1,pos:49 */
+                    /* of https://github.com/uclouvain/openjpeg/issues/938 */
+                    if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx ||
+                            rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy) {
+                        continue;
+                    }
+
+                    /* See ISO-15441. B.12.1.4 Position-component-resolution level-layer progression */
+                    if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) &&
+                            ((try0 << levelno) % (1 << rpy))))) {
+                        continue;
+                    }
+                    if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) &&
+                            ((trx0 << levelno) % (1 << rpx))))) {
+                        continue;
+                    }
+
+                    if ((res->pw == 0) || (res->ph == 0)) {
+                        continue;
+                    }
+
+                    if ((trx0 == trx1) || (try0 == try1)) {
+                        continue;
+                    }
+
+                    prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x,
+                                                (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
+                           - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
+                    prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y,
+                                                (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
+                           - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
+                    pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
+                    if (pi->precno >= res->pw * res->ph) {
+                      return OPJ_FALSE;
+                    }
+                    for (pi->layno = pi->poc.layno0; 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 (index >= pi->include_size) {
+                            opj_pi_emit_error(pi, "Invalid access to pi->include");
+                            return OPJ_FALSE;
+                        }
+                        if (!pi->include[index]) {
+                            pi->include[index] = 1;
+                            return OPJ_TRUE;
+                        }
+LABEL_SKIP:
+                        ;
+                    }
+                }
+            }
+        }
+    }
+
+    return OPJ_FALSE;
+}
+
+static OPJ_BOOL opj_pi_next_cprl(opj_pi_iterator_t * pi)
+{
+    opj_pi_comp_t *comp = NULL;
+    opj_pi_resolution_t *res = NULL;
+    OPJ_UINT32 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++) {
+        OPJ_UINT32 resno;
+        comp = &pi->comps[pi->compno];
+        pi->dx = 0;
+        pi->dy = 0;
+        for (resno = 0; resno < comp->numresolutions; resno++) {
+            OPJ_UINT32 dx, dy;
+            res = &comp->resolutions[resno];
+            if (res->pdx + comp->numresolutions - 1 - resno < 32 &&
+                    comp->dx <= UINT_MAX / (1u << (res->pdx + comp->numresolutions - 1 - resno))) {
+                dx = comp->dx * (1u << (res->pdx + comp->numresolutions - 1 - resno));
+                pi->dx = !pi->dx ? dx : opj_uint_min(pi->dx, dx);
+            }
+            if (res->pdy + comp->numresolutions - 1 - resno < 32 &&
+                    comp->dy <= UINT_MAX / (1u << (res->pdy + comp->numresolutions - 1 - resno))) {
+                dy = comp->dy * (1u << (res->pdy + comp->numresolutions - 1 - resno));
+                pi->dy = !pi->dy ? dy : opj_uint_min(pi->dy, dy);
+            }
+        }
+        if (pi->dx == 0 || pi->dy == 0) {
+            return OPJ_FALSE;
+        }
+        if (!pi->tp_on) {
+            pi->poc.ty0 = pi->ty0;
+            pi->poc.tx0 = pi->tx0;
+            pi->poc.ty1 = pi->ty1;
+            pi->poc.tx1 = pi->tx1;
+        }
+        for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1;
+                pi->y += (OPJ_INT32)(pi->dy - (OPJ_UINT32)(pi->y % (OPJ_INT32)pi->dy))) {
+            for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1;
+                    pi->x += (OPJ_INT32)(pi->dx - (OPJ_UINT32)(pi->x % (OPJ_INT32)pi->dx))) {
+                for (pi->resno = pi->poc.resno0;
+                        pi->resno < opj_uint_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
+                    OPJ_UINT32 levelno;
+                    OPJ_INT32 trx0, try0;
+                    OPJ_INT32 trx1, try1;
+                    OPJ_UINT32 rpx, rpy;
+                    OPJ_INT32 prci, prcj;
+                    res = &comp->resolutions[pi->resno];
+                    levelno = comp->numresolutions - 1 - pi->resno;
+                    /* Avoids division by zero on id_000004,sig_06,src_000679,op_arith8,pos_49,val_-17 */
+                    /* of  https://github.com/uclouvain/openjpeg/issues/938 */
+                    if (levelno >= 32 ||
+                            ((comp->dx << levelno) >> levelno) != comp->dx ||
+                            ((comp->dy << levelno) >> levelno) != comp->dy) {
+                        continue;
+                    }
+                    if ((comp->dx << levelno) > INT_MAX ||
+                            (comp->dy << levelno) > INT_MAX) {
+                        continue;
+                    }
+                    trx0 = opj_int_ceildiv(pi->tx0, (OPJ_INT32)(comp->dx << levelno));
+                    try0 = opj_int_ceildiv(pi->ty0, (OPJ_INT32)(comp->dy << levelno));
+                    trx1 = opj_int_ceildiv(pi->tx1, (OPJ_INT32)(comp->dx << levelno));
+                    try1 = opj_int_ceildiv(pi->ty1, (OPJ_INT32)(comp->dy << levelno));
+                    rpx = res->pdx + levelno;
+                    rpy = res->pdy + levelno;
+
+                    /* To avoid divisions by zero / undefined behaviour on shift */
+                    /* in below tests */
+                    /* Fixes reading id:000019,sig:08,src:001098,op:flip1,pos:49 */
+                    /* of https://github.com/uclouvain/openjpeg/issues/938 */
+                    if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx ||
+                            rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy) {
+                        continue;
+                    }
+
+                    /* See ISO-15441. B.12.1.5 Component-position-resolution level-layer progression */
+                    if (!((pi->y % (OPJ_INT32)(comp->dy << rpy) == 0) || ((pi->y == pi->ty0) &&
+                            ((try0 << levelno) % (1 << rpy))))) {
+                        continue;
+                    }
+                    if (!((pi->x % (OPJ_INT32)(comp->dx << rpx) == 0) || ((pi->x == pi->tx0) &&
+                            ((trx0 << levelno) % (1 << rpx))))) {
+                        continue;
+                    }
+
+                    if ((res->pw == 0) || (res->ph == 0)) {
+                        continue;
+                    }
+
+                    if ((trx0 == trx1) || (try0 == try1)) {
+                        continue;
+                    }
+
+                    prci = opj_int_floordivpow2(opj_int_ceildiv(pi->x,
+                                                (OPJ_INT32)(comp->dx << levelno)), (OPJ_INT32)res->pdx)
+                           - opj_int_floordivpow2(trx0, (OPJ_INT32)res->pdx);
+                    prcj = opj_int_floordivpow2(opj_int_ceildiv(pi->y,
+                                                (OPJ_INT32)(comp->dy << levelno)), (OPJ_INT32)res->pdy)
+                           - opj_int_floordivpow2(try0, (OPJ_INT32)res->pdy);
+                    pi->precno = (OPJ_UINT32)(prci + prcj * (OPJ_INT32)res->pw);
+                    if (pi->precno >= res->pw * res->ph) {
+                      return OPJ_FALSE;
+                    }
+                    for (pi->layno = pi->poc.layno0; 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 (index >= pi->include_size) {
+                            opj_pi_emit_error(pi, "Invalid access to pi->include");
+                            return OPJ_FALSE;
+                        }
+                        if (!pi->include[index]) {
+                            pi->include[index] = 1;
+                            return OPJ_TRUE;
+                        }
+LABEL_SKIP:
+                        ;
+                    }
+                }
+            }
+        }
+    }
+
+    return OPJ_FALSE;
+}
+
+static void opj_get_encoding_parameters(const opj_image_t *p_image,
                                         const opj_cp_t *p_cp,
-                                        OPJ_UINT32 tileno,
+                                        OPJ_UINT32 p_tileno,
                                         OPJ_INT32 * p_tx0,
-                                        OPJ_INT32 * p_tx1,
-                                        OPJ_INT32 * p_ty0,
-                                        OPJ_INT32 * p_ty1,
+                                        OPJ_INT32  * p_tx1,
+                                        OPJ_INT32  * p_ty0,
+                                        OPJ_INT32  * p_ty1,
                                         OPJ_UINT32 * p_dx_min,
                                         OPJ_UINT32 * p_dy_min,
                                         OPJ_UINT32 * p_max_prec,
-                                        OPJ_UINT32 * p_max_res,
-                                        OPJ_UINT32 ** p_resolutions )
+                                        OPJ_UINT32 * p_max_res)
 {
-	/* loop*/
-	OPJ_UINT32 compno, resno;
+    /* loop */
+    OPJ_UINT32  compno, resno;
+    /* pointers */
+    const opj_tcp_t *l_tcp = 00;
+    const opj_tccp_t * l_tccp = 00;
+    const opj_image_comp_t * l_img_comp = 00;
 
-	/* pointers*/
-	const opj_tcp_t *tcp = 00;
-	const opj_tccp_t * l_tccp = 00;
-	const opj_image_comp_t * l_img_comp = 00;
+    /* position in x and y of tile */
+    OPJ_UINT32 p, q;
 
-	/* to store l_dx, l_dy, w and h for each resolution and component.*/
-	OPJ_UINT32 * lResolutionPtr;
+    /* preconditions */
+    assert(p_cp != 00);
+    assert(p_image != 00);
+    assert(p_tileno < p_cp->tw * p_cp->th);
 
-	/* position in x and y of tile*/
-	OPJ_UINT32 p, q;
+    /* initializations */
+    l_tcp = &p_cp->tcps [p_tileno];
+    l_img_comp = p_image->comps;
+    l_tccp = l_tcp->tccps;
 
-	/* non-corrected (in regard to image offset) tile offset */
-	OPJ_UINT32 l_tx0, l_ty0;
+    /* here calculation of tx0, tx1, ty0, ty1, maxprec, dx and dy */
+    p = p_tileno % p_cp->tw;
+    q = p_tileno / p_cp->tw;
 
-	/* preconditions in debug*/
-	assert(p_cp != 00);
-	assert(p_image != 00);
-	assert(tileno < p_cp->tw * p_cp->th);
+    /* find extent of tile */
+    *p_tx0 = opj_int_max((OPJ_INT32)(p_cp->tx0 + p * p_cp->tdx),
+                         (OPJ_INT32)p_image->x0);
+    *p_tx1 = opj_int_min((OPJ_INT32)(p_cp->tx0 + (p + 1) * p_cp->tdx),
+                         (OPJ_INT32)p_image->x1);
+    *p_ty0 = opj_int_max((OPJ_INT32)(p_cp->ty0 + q * p_cp->tdy),
+                         (OPJ_INT32)p_image->y0);
+    *p_ty1 = opj_int_min((OPJ_INT32)(p_cp->ty0 + (q + 1) * p_cp->tdy),
+                         (OPJ_INT32)p_image->y1);
 
-	/* initializations*/
-	tcp = &p_cp->tcps [tileno];
-	l_tccp = tcp->tccps;
-	l_img_comp = p_image->comps;
+    /* max precision is 0 (can only grow) */
+    *p_max_prec = 0;
+    *p_max_res = 0;
 
-	/* position in x and y of tile*/
-	p = tileno % p_cp->tw;
-	q = tileno / p_cp->tw;
+    /* take the largest value for dx_min and dy_min */
+    *p_dx_min = 0x7fffffff;
+    *p_dy_min  = 0x7fffffff;
 
-	/* here calculation of tx0, tx1, ty0, ty1, maxprec, l_dx and l_dy */
-	l_tx0 = p_cp->tx0 + p * p_cp->tdx; /* can't be greater than p_image->x1 so won't overflow */
-	*p_tx0 = (OPJ_INT32)opj_uint_max(l_tx0, p_image->x0);
-	*p_tx1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_tx0, p_cp->tdx), p_image->x1);
-	l_ty0 = p_cp->ty0 + q * p_cp->tdy; /* can't be greater than p_image->y1 so won't overflow */
-	*p_ty0 = (OPJ_INT32)opj_uint_max(l_ty0, p_image->y0);
-	*p_ty1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_ty0, p_cp->tdy), p_image->y1);
+    for (compno = 0; compno < p_image->numcomps; ++compno) {
+        /* arithmetic variables to calculate */
+        OPJ_UINT32 l_level_no;
+        OPJ_INT32 l_rx0, l_ry0, l_rx1, l_ry1;
+        OPJ_INT32 l_px0, l_py0, l_px1, py1;
+        OPJ_UINT32 l_pdx, l_pdy;
+        OPJ_UINT32 l_pw, l_ph;
+        OPJ_UINT32 l_product;
+        OPJ_INT32 l_tcx0, l_tcy0, l_tcx1, l_tcy1;
 
-	/* max precision and resolution is 0 (can only grow)*/
-	*p_max_prec = 0;
-	*p_max_res = 0;
+        l_tcx0 = opj_int_ceildiv(*p_tx0, (OPJ_INT32)l_img_comp->dx);
+        l_tcy0 = opj_int_ceildiv(*p_ty0, (OPJ_INT32)l_img_comp->dy);
+        l_tcx1 = opj_int_ceildiv(*p_tx1, (OPJ_INT32)l_img_comp->dx);
+        l_tcy1 = opj_int_ceildiv(*p_ty1, (OPJ_INT32)l_img_comp->dy);
 
-	/* take the largest value for dx_min and dy_min*/
-	*p_dx_min = 0x7fffffff;
-	*p_dy_min = 0x7fffffff;
+        if (l_tccp->numresolutions > *p_max_res) {
+            *p_max_res = l_tccp->numresolutions;
+        }
 
-	for (compno = 0; compno < p_image->numcomps; ++compno) {
-		/* aritmetic variables to calculate*/
-		OPJ_UINT32 l_level_no;
-		OPJ_INT32 l_rx0, l_ry0, l_rx1, l_ry1;
-		OPJ_INT32 l_px0, l_py0, l_px1, py1;
-		OPJ_UINT32 l_product;
-		OPJ_INT32 l_tcx0, l_tcy0, l_tcx1, l_tcy1;
-		OPJ_UINT32 l_pdx, l_pdy , l_pw , l_ph;
+        /* use custom size for precincts */
+        for (resno = 0; resno < l_tccp->numresolutions; ++resno) {
+            OPJ_UINT32 l_dx, l_dy;
 
-		lResolutionPtr = p_resolutions[compno];
+            /* precinct width and height */
+            l_pdx = l_tccp->prcw[resno];
+            l_pdy = l_tccp->prch[resno];
 
-		l_tcx0 = opj_int_ceildiv(*p_tx0, (OPJ_INT32)l_img_comp->dx);
-		l_tcy0 = opj_int_ceildiv(*p_ty0, (OPJ_INT32)l_img_comp->dy);
-		l_tcx1 = opj_int_ceildiv(*p_tx1, (OPJ_INT32)l_img_comp->dx);
-		l_tcy1 = opj_int_ceildiv(*p_ty1, (OPJ_INT32)l_img_comp->dy);
+            l_dx = l_img_comp->dx * (1u << (l_pdx + l_tccp->numresolutions - 1 - resno));
+            l_dy = l_img_comp->dy * (1u << (l_pdy + l_tccp->numresolutions - 1 - resno));
 
-		if (l_tccp->numresolutions > *p_max_res) {
-			*p_max_res = l_tccp->numresolutions;
-		}
+            /* take the minimum size for dx for each comp and resolution */
+            *p_dx_min = opj_uint_min(*p_dx_min, l_dx);
+            *p_dy_min = opj_uint_min(*p_dy_min, l_dy);
 
-		/* use custom size for precincts*/
-		l_level_no = l_tccp->numresolutions - 1;
-		for (resno = 0; resno < l_tccp->numresolutions; ++resno) {
-			/* precinct width and height*/
-			l_pdx = l_tccp->prcw[resno];
-			l_pdy = l_tccp->prch[resno];
-			*lResolutionPtr++ = l_pdx;
-			*lResolutionPtr++ = l_pdy;
-			/* take the minimum size for l_dx for each comp and resolution*/
-			if (l_pdx + l_level_no < 32) {
-				*p_dx_min = opj_uint_min(*p_dx_min, l_img_comp->dx * (1u << (l_pdx + l_level_no)));
-			}
-			if (l_pdy + l_level_no < 32) {
-				*p_dy_min = opj_uint_min(*p_dy_min, l_img_comp->dy * (1u << (l_pdy + l_level_no)));
-			}
+            /* various calculations of extents */
+            l_level_no = l_tccp->numresolutions - 1 - resno;
 
-			/* various calculations of extents*/
-			l_rx0 = opj_int_ceildivpow2(l_tcx0, (OPJ_INT32)l_level_no);
-			l_ry0 = opj_int_ceildivpow2(l_tcy0, (OPJ_INT32)l_level_no);
-			l_rx1 = opj_int_ceildivpow2(l_tcx1, (OPJ_INT32)l_level_no);
-			l_ry1 = opj_int_ceildivpow2(l_tcy1, (OPJ_INT32)l_level_no);
-			l_px0 = opj_int_floordivpow2(l_rx0, (OPJ_INT32)l_pdx) << l_pdx;
-			l_py0 = opj_int_floordivpow2(l_ry0, (OPJ_INT32)l_pdy) << l_pdy;
-			l_px1 = opj_int_ceildivpow2(l_rx1, (OPJ_INT32)l_pdx) << l_pdx;
-			py1 = opj_int_ceildivpow2(l_ry1, (OPJ_INT32)l_pdy) << l_pdy;
-			l_pw = (l_rx0==l_rx1)?0:(OPJ_UINT32)((l_px1 - l_px0) >> l_pdx);
-			l_ph = (l_ry0==l_ry1)?0:(OPJ_UINT32)((py1 - l_py0) >> l_pdy);
-			*lResolutionPtr++ = l_pw;
-			*lResolutionPtr++ = l_ph;
-			l_product = l_pw * l_ph;
-			
+            l_rx0 = opj_int_ceildivpow2(l_tcx0, (OPJ_INT32)l_level_no);
+            l_ry0 = opj_int_ceildivpow2(l_tcy0, (OPJ_INT32)l_level_no);
+            l_rx1 = opj_int_ceildivpow2(l_tcx1, (OPJ_INT32)l_level_no);
+            l_ry1 = opj_int_ceildivpow2(l_tcy1, (OPJ_INT32)l_level_no);
+
+            l_px0 = opj_int_floordivpow2(l_rx0, (OPJ_INT32)l_pdx) << l_pdx;
+            l_py0 = opj_int_floordivpow2(l_ry0, (OPJ_INT32)l_pdy) << l_pdy;
+            l_px1 = opj_int_ceildivpow2(l_rx1, (OPJ_INT32)l_pdx) << l_pdx;
+
+            py1 = opj_int_ceildivpow2(l_ry1, (OPJ_INT32)l_pdy) << l_pdy;
+
+            l_pw = (l_rx0 == l_rx1) ? 0 : (OPJ_UINT32)((l_px1 - l_px0) >> l_pdx);
+            l_ph = (l_ry0 == l_ry1) ? 0 : (OPJ_UINT32)((py1 - l_py0) >> l_pdy);
+
+            l_product = l_pw * l_ph;
+
+            /* update precision */
+            if (l_product > *p_max_prec) {
+                *p_max_prec = l_product;
+            }
+        }
+        ++l_img_comp;
+        ++l_tccp;
+    }
+}
+
+
+static void opj_get_all_encoding_parameters(const opj_image_t *p_image,
+        const opj_cp_t *p_cp,
+        OPJ_UINT32 tileno,
+        OPJ_INT32 * p_tx0,
+        OPJ_INT32 * p_tx1,
+        OPJ_INT32 * p_ty0,
+        OPJ_INT32 * p_ty1,
+        OPJ_UINT32 * p_dx_min,
+        OPJ_UINT32 * p_dy_min,
+        OPJ_UINT32 * p_max_prec,
+        OPJ_UINT32 * p_max_res,
+        OPJ_UINT32 ** p_resolutions)
+{
+    /* loop*/
+    OPJ_UINT32 compno, resno;
+
+    /* pointers*/
+    const opj_tcp_t *tcp = 00;
+    const opj_tccp_t * l_tccp = 00;
+    const opj_image_comp_t * l_img_comp = 00;
+
+    /* to store l_dx, l_dy, w and h for each resolution and component.*/
+    OPJ_UINT32 * lResolutionPtr;
+
+    /* position in x and y of tile*/
+    OPJ_UINT32 p, q;
+
+    /* non-corrected (in regard to image offset) tile offset */
+    OPJ_UINT32 l_tx0, l_ty0;
+
+    /* preconditions in debug*/
+    assert(p_cp != 00);
+    assert(p_image != 00);
+    assert(tileno < p_cp->tw * p_cp->th);
+
+    /* initializations*/
+    tcp = &p_cp->tcps [tileno];
+    l_tccp = tcp->tccps;
+    l_img_comp = p_image->comps;
+
+    /* position in x and y of tile*/
+    p = tileno % p_cp->tw;
+    q = tileno / p_cp->tw;
+
+    /* here calculation of tx0, tx1, ty0, ty1, maxprec, l_dx and l_dy */
+    l_tx0 = p_cp->tx0 + p *
+            p_cp->tdx; /* can't be greater than p_image->x1 so won't overflow */
+    *p_tx0 = (OPJ_INT32)opj_uint_max(l_tx0, p_image->x0);
+    *p_tx1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_tx0, p_cp->tdx), p_image->x1);
+    l_ty0 = p_cp->ty0 + q *
+            p_cp->tdy; /* can't be greater than p_image->y1 so won't overflow */
+    *p_ty0 = (OPJ_INT32)opj_uint_max(l_ty0, p_image->y0);
+    *p_ty1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_ty0, p_cp->tdy), p_image->y1);
+
+    /* max precision and resolution is 0 (can only grow)*/
+    *p_max_prec = 0;
+    *p_max_res = 0;
+
+    /* take the largest value for dx_min and dy_min*/
+    *p_dx_min = 0x7fffffff;
+    *p_dy_min = 0x7fffffff;
+
+    for (compno = 0; compno < p_image->numcomps; ++compno) {
+        /* aritmetic variables to calculate*/
+        OPJ_UINT32 l_level_no;
+        OPJ_INT32 l_rx0, l_ry0, l_rx1, l_ry1;
+        OPJ_INT32 l_px0, l_py0, l_px1, py1;
+        OPJ_UINT32 l_product;
+        OPJ_INT32 l_tcx0, l_tcy0, l_tcx1, l_tcy1;
+        OPJ_UINT32 l_pdx, l_pdy, l_pw, l_ph;
+
+        lResolutionPtr = p_resolutions[compno];
+
+        l_tcx0 = opj_int_ceildiv(*p_tx0, (OPJ_INT32)l_img_comp->dx);
+        l_tcy0 = opj_int_ceildiv(*p_ty0, (OPJ_INT32)l_img_comp->dy);
+        l_tcx1 = opj_int_ceildiv(*p_tx1, (OPJ_INT32)l_img_comp->dx);
+        l_tcy1 = opj_int_ceildiv(*p_ty1, (OPJ_INT32)l_img_comp->dy);
+
+        if (l_tccp->numresolutions > *p_max_res) {
+            *p_max_res = l_tccp->numresolutions;
+        }
+
+        /* use custom size for precincts*/
+        l_level_no = l_tccp->numresolutions;
+        for (resno = 0; resno < l_tccp->numresolutions; ++resno) {
+            OPJ_UINT32 l_dx, l_dy;
+
+            --l_level_no;
+
+            /* precinct width and height*/
+            l_pdx = l_tccp->prcw[resno];
+            l_pdy = l_tccp->prch[resno];
+            *lResolutionPtr++ = l_pdx;
+            *lResolutionPtr++ = l_pdy;
+            if (l_pdx + l_level_no < 32 &&
+                    l_img_comp->dx <= UINT_MAX / (1u << (l_pdx + l_level_no))) {
+                l_dx = l_img_comp->dx * (1u << (l_pdx + l_level_no));
+                /* take the minimum size for l_dx for each comp and resolution*/
+                *p_dx_min = (OPJ_UINT32)opj_int_min((OPJ_INT32) * p_dx_min, (OPJ_INT32)l_dx);
+            }
+            if (l_pdy + l_level_no < 32 &&
+                    l_img_comp->dy <= UINT_MAX / (1u << (l_pdy + l_level_no))) {
+                l_dy = l_img_comp->dy * (1u << (l_pdy + l_level_no));
+                *p_dy_min = (OPJ_UINT32)opj_int_min((OPJ_INT32) * p_dy_min, (OPJ_INT32)l_dy);
+            }
+
+            /* various calculations of extents*/
+            l_rx0 = opj_int_ceildivpow2(l_tcx0, (OPJ_INT32)l_level_no);
+            l_ry0 = opj_int_ceildivpow2(l_tcy0, (OPJ_INT32)l_level_no);
+            l_rx1 = opj_int_ceildivpow2(l_tcx1, (OPJ_INT32)l_level_no);
+            l_ry1 = opj_int_ceildivpow2(l_tcy1, (OPJ_INT32)l_level_no);
+            l_px0 = opj_int_floordivpow2(l_rx0, (OPJ_INT32)l_pdx) << l_pdx;
+            l_py0 = opj_int_floordivpow2(l_ry0, (OPJ_INT32)l_pdy) << l_pdy;
+            l_px1 = opj_int_ceildivpow2(l_rx1, (OPJ_INT32)l_pdx) << l_pdx;
+            py1 = opj_int_ceildivpow2(l_ry1, (OPJ_INT32)l_pdy) << l_pdy;
+            l_pw = (l_rx0 == l_rx1) ? 0 : (OPJ_UINT32)((l_px1 - l_px0) >> l_pdx);
+            l_ph = (l_ry0 == l_ry1) ? 0 : (OPJ_UINT32)((py1 - l_py0) >> l_pdy);
+            *lResolutionPtr++ = l_pw;
+            *lResolutionPtr++ = l_ph;
+            l_product = l_pw * l_ph;
+
             /* update precision*/
-			if (l_product > *p_max_prec) {
-				*p_max_prec = l_product;
-			}
+            if (l_product > *p_max_prec) {
+                *p_max_prec = l_product;
+            }
 
-			--l_level_no;
-		}
-		++l_tccp;
-		++l_img_comp;
-	}
+        }
+        ++l_tccp;
+        ++l_img_comp;
+    }
 }
 
-static opj_pi_iterator_t * opj_pi_create(	const opj_image_t *image,
-                                    const opj_cp_t *cp,
-                                    OPJ_UINT32 tileno )
+static opj_pi_iterator_t * opj_pi_create(const opj_image_t *image,
+        const opj_cp_t *cp,
+        OPJ_UINT32 tileno)
 {
-	/* loop*/
-	OPJ_UINT32 pino, compno;
-	/* number of poc in the p_pi*/
-	OPJ_UINT32 l_poc_bound;
+    /* loop*/
+    OPJ_UINT32 pino, compno;
+    /* number of poc in the p_pi*/
+    OPJ_UINT32 l_poc_bound;
 
-	/* pointers to tile coding parameters and components.*/
-	opj_pi_iterator_t *l_pi = 00;
-	opj_tcp_t *tcp = 00;
-	const opj_tccp_t *tccp = 00;
+    /* pointers to tile coding parameters and components.*/
+    opj_pi_iterator_t *l_pi = 00;
+    opj_tcp_t *tcp = 00;
+    const opj_tccp_t *tccp = 00;
 
-	/* current packet iterator being allocated*/
-	opj_pi_iterator_t *l_current_pi = 00;
+    /* current packet iterator being allocated*/
+    opj_pi_iterator_t *l_current_pi = 00;
 
-	/* preconditions in debug*/
-	assert(cp != 00);
-	assert(image != 00);
-	assert(tileno < cp->tw * cp->th);
+    /* preconditions in debug*/
+    assert(cp != 00);
+    assert(image != 00);
+    assert(tileno < cp->tw * cp->th);
 
-	/* initializations*/
-	tcp = &cp->tcps[tileno];
-	l_poc_bound = tcp->numpocs+1;
+    /* initializations*/
+    tcp = &cp->tcps[tileno];
+    l_poc_bound = tcp->numpocs + 1;
 
-	/* memory allocations*/
-	l_pi = (opj_pi_iterator_t*) opj_calloc((l_poc_bound), sizeof(opj_pi_iterator_t));
-	if (!l_pi) {
-		return NULL;
-	}
+    /* memory allocations*/
+    l_pi = (opj_pi_iterator_t*) opj_calloc((l_poc_bound),
+                                           sizeof(opj_pi_iterator_t));
+    if (!l_pi) {
+        return NULL;
+    }
 
-	l_current_pi = l_pi;
-	for (pino = 0; pino < l_poc_bound ; ++pino) {
+    l_current_pi = l_pi;
+    for (pino = 0; pino < l_poc_bound ; ++pino) {
 
-		l_current_pi->comps = (opj_pi_comp_t*) opj_calloc(image->numcomps, sizeof(opj_pi_comp_t));
-		if (! l_current_pi->comps) {
-			opj_pi_destroy(l_pi, l_poc_bound);
-			return NULL;
-		}
+        l_current_pi->comps = (opj_pi_comp_t*) opj_calloc(image->numcomps,
+                              sizeof(opj_pi_comp_t));
+        if (! l_current_pi->comps) {
+            opj_pi_destroy(l_pi, l_poc_bound);
+            return NULL;
+        }
 
-		l_current_pi->numcomps = image->numcomps;
+        l_current_pi->numcomps = image->numcomps;
 
-		for (compno = 0; compno < image->numcomps; ++compno) {
-			opj_pi_comp_t *comp = &l_current_pi->comps[compno];
+        for (compno = 0; compno < image->numcomps; ++compno) {
+            opj_pi_comp_t *comp = &l_current_pi->comps[compno];
 
-			tccp = &tcp->tccps[compno];
+            tccp = &tcp->tccps[compno];
 
-			comp->resolutions = (opj_pi_resolution_t*) opj_calloc(tccp->numresolutions, sizeof(opj_pi_resolution_t));
-			if (!comp->resolutions) {
-				opj_pi_destroy(l_pi, l_poc_bound);
-				return 00;
-			}
+            comp->resolutions = (opj_pi_resolution_t*) opj_calloc(tccp->numresolutions,
+                                sizeof(opj_pi_resolution_t));
+            if (!comp->resolutions) {
+                opj_pi_destroy(l_pi, l_poc_bound);
+                return 00;
+            }
 
-			comp->numresolutions = tccp->numresolutions;
-		}
-		++l_current_pi;
-	}
-	return l_pi;
+            comp->numresolutions = tccp->numresolutions;
+        }
+        ++l_current_pi;
+    }
+    return l_pi;
 }
 
-static void opj_pi_update_encode_poc_and_final (   opj_cp_t *p_cp,
-                                            OPJ_UINT32 p_tileno,
-                                            OPJ_INT32 p_tx0,
-                                            OPJ_INT32 p_tx1,
-                                            OPJ_INT32 p_ty0,
-                                            OPJ_INT32 p_ty1,
-                                            OPJ_UINT32 p_max_prec,
-                                            OPJ_UINT32 p_max_res,
-                                            OPJ_UINT32 p_dx_min,
-                                            OPJ_UINT32 p_dy_min)
+static void opj_pi_update_encode_poc_and_final(opj_cp_t *p_cp,
+        OPJ_UINT32 p_tileno,
+        OPJ_INT32 p_tx0,
+        OPJ_INT32 p_tx1,
+        OPJ_INT32 p_ty0,
+        OPJ_INT32 p_ty1,
+        OPJ_UINT32 p_max_prec,
+        OPJ_UINT32 p_max_res,
+        OPJ_UINT32 p_dx_min,
+        OPJ_UINT32 p_dy_min)
 {
-	/* loop*/
-	OPJ_UINT32 pino;
-	/* tile coding parameter*/
-	opj_tcp_t *l_tcp = 00;
-	/* current poc being updated*/
-	opj_poc_t * l_current_poc = 00;
+    /* loop*/
+    OPJ_UINT32 pino;
+    /* tile coding parameter*/
+    opj_tcp_t *l_tcp = 00;
+    /* current poc being updated*/
+    opj_poc_t * l_current_poc = 00;
 
-	/* number of pocs*/
-	OPJ_UINT32 l_poc_bound;
+    /* number of pocs*/
+    OPJ_UINT32 l_poc_bound;
 
     OPJ_ARG_NOT_USED(p_max_res);
 
-	/* preconditions in debug*/
-	assert(p_cp != 00);
-	assert(p_tileno < p_cp->tw * p_cp->th);
+    /* preconditions in debug*/
+    assert(p_cp != 00);
+    assert(p_tileno < p_cp->tw * p_cp->th);
 
-	/* initializations*/
-	l_tcp = &p_cp->tcps [p_tileno];
-	/* number of iterations in the loop */
-	l_poc_bound = l_tcp->numpocs+1;
+    /* initializations*/
+    l_tcp = &p_cp->tcps [p_tileno];
+    /* number of iterations in the loop */
+    l_poc_bound = l_tcp->numpocs + 1;
 
-	/* start at first element, and to make sure the compiler will not make a calculation each time in the loop
-	   store a pointer to the current element to modify rather than l_tcp->pocs[i]*/
-	l_current_poc = l_tcp->pocs;
+    /* start at first element, and to make sure the compiler will not make a calculation each time in the loop
+       store a pointer to the current element to modify rather than l_tcp->pocs[i]*/
+    l_current_poc = l_tcp->pocs;
 
-	l_current_poc->compS = l_current_poc->compno0;
-	l_current_poc->compE = l_current_poc->compno1;
-	l_current_poc->resS = l_current_poc->resno0;
-	l_current_poc->resE = l_current_poc->resno1;
-	l_current_poc->layE = l_current_poc->layno1;
+    l_current_poc->compS = l_current_poc->compno0;
+    l_current_poc->compE = l_current_poc->compno1;
+    l_current_poc->resS = l_current_poc->resno0;
+    l_current_poc->resE = l_current_poc->resno1;
+    l_current_poc->layE = l_current_poc->layno1;
 
-	/* special treatment for the first element*/
-	l_current_poc->layS = 0;
-	l_current_poc->prg  = l_current_poc->prg1;
-	l_current_poc->prcS = 0;
+    /* special treatment for the first element*/
+    l_current_poc->layS = 0;
+    l_current_poc->prg  = l_current_poc->prg1;
+    l_current_poc->prcS = 0;
 
-	l_current_poc->prcE = p_max_prec;
-	l_current_poc->txS = (OPJ_UINT32)p_tx0;
-	l_current_poc->txE = (OPJ_UINT32)p_tx1;
-	l_current_poc->tyS = (OPJ_UINT32)p_ty0;
-	l_current_poc->tyE = (OPJ_UINT32)p_ty1;
-	l_current_poc->dx = p_dx_min;
-	l_current_poc->dy = p_dy_min;
+    l_current_poc->prcE = p_max_prec;
+    l_current_poc->txS = (OPJ_UINT32)p_tx0;
+    l_current_poc->txE = (OPJ_UINT32)p_tx1;
+    l_current_poc->tyS = (OPJ_UINT32)p_ty0;
+    l_current_poc->tyE = (OPJ_UINT32)p_ty1;
+    l_current_poc->dx = p_dx_min;
+    l_current_poc->dy = p_dy_min;
 
-	++ l_current_poc;
-	for (pino = 1;pino < l_poc_bound ; ++pino) {
-		l_current_poc->compS = l_current_poc->compno0;
-		l_current_poc->compE= l_current_poc->compno1;
-		l_current_poc->resS = l_current_poc->resno0;
-		l_current_poc->resE = l_current_poc->resno1;
-		l_current_poc->layE = l_current_poc->layno1;
-		l_current_poc->prg  = l_current_poc->prg1;
-		l_current_poc->prcS = 0;
-		/* special treatment here different from the first element*/
-		l_current_poc->layS = (l_current_poc->layE > (l_current_poc-1)->layE) ? l_current_poc->layE : 0;
+    ++ l_current_poc;
+    for (pino = 1; pino < l_poc_bound ; ++pino) {
+        l_current_poc->compS = l_current_poc->compno0;
+        l_current_poc->compE = l_current_poc->compno1;
+        l_current_poc->resS = l_current_poc->resno0;
+        l_current_poc->resE = l_current_poc->resno1;
+        l_current_poc->layE = l_current_poc->layno1;
+        l_current_poc->prg  = l_current_poc->prg1;
+        l_current_poc->prcS = 0;
+        /* special treatment here different from the first element*/
+        l_current_poc->layS = (l_current_poc->layE > (l_current_poc - 1)->layE) ?
+                              l_current_poc->layE : 0;
 
-		l_current_poc->prcE = p_max_prec;
-		l_current_poc->txS = (OPJ_UINT32)p_tx0;
-		l_current_poc->txE = (OPJ_UINT32)p_tx1;
-		l_current_poc->tyS = (OPJ_UINT32)p_ty0;
-		l_current_poc->tyE = (OPJ_UINT32)p_ty1;
-		l_current_poc->dx = p_dx_min;
-		l_current_poc->dy = p_dy_min;
-		++ l_current_poc;
-	}
+        l_current_poc->prcE = p_max_prec;
+        l_current_poc->txS = (OPJ_UINT32)p_tx0;
+        l_current_poc->txE = (OPJ_UINT32)p_tx1;
+        l_current_poc->tyS = (OPJ_UINT32)p_ty0;
+        l_current_poc->tyE = (OPJ_UINT32)p_ty1;
+        l_current_poc->dx = p_dx_min;
+        l_current_poc->dy = p_dy_min;
+        ++ l_current_poc;
+    }
 }
 
-static void opj_pi_update_encode_not_poc (	opj_cp_t *p_cp,
-                                    OPJ_UINT32 p_num_comps,
-                                    OPJ_UINT32 p_tileno,
-                                    OPJ_INT32 p_tx0,
-                                    OPJ_INT32 p_tx1,
-                                    OPJ_INT32 p_ty0,
-                                    OPJ_INT32 p_ty1,
-                                    OPJ_UINT32 p_max_prec,
-                                    OPJ_UINT32 p_max_res,
-                                    OPJ_UINT32 p_dx_min,
-                                    OPJ_UINT32 p_dy_min)
+static void opj_pi_update_encode_not_poc(opj_cp_t *p_cp,
+        OPJ_UINT32 p_num_comps,
+        OPJ_UINT32 p_tileno,
+        OPJ_INT32 p_tx0,
+        OPJ_INT32 p_tx1,
+        OPJ_INT32 p_ty0,
+        OPJ_INT32 p_ty1,
+        OPJ_UINT32 p_max_prec,
+        OPJ_UINT32 p_max_res,
+        OPJ_UINT32 p_dx_min,
+        OPJ_UINT32 p_dy_min)
 {
-	/* loop*/
-	OPJ_UINT32 pino;
-	/* tile coding parameter*/
-	opj_tcp_t *l_tcp = 00;
-	/* current poc being updated*/
-	opj_poc_t * l_current_poc = 00;
-	/* number of pocs*/
-	OPJ_UINT32 l_poc_bound;
+    /* loop*/
+    OPJ_UINT32 pino;
+    /* tile coding parameter*/
+    opj_tcp_t *l_tcp = 00;
+    /* current poc being updated*/
+    opj_poc_t * l_current_poc = 00;
+    /* number of pocs*/
+    OPJ_UINT32 l_poc_bound;
 
-	/* preconditions in debug*/
-	assert(p_cp != 00);
-	assert(p_tileno < p_cp->tw * p_cp->th);
+    /* preconditions in debug*/
+    assert(p_cp != 00);
+    assert(p_tileno < p_cp->tw * p_cp->th);
 
-	/* initializations*/
-	l_tcp = &p_cp->tcps [p_tileno];
+    /* initializations*/
+    l_tcp = &p_cp->tcps [p_tileno];
 
-	/* number of iterations in the loop */
-	l_poc_bound = l_tcp->numpocs+1;
+    /* number of iterations in the loop */
+    l_poc_bound = l_tcp->numpocs + 1;
 
-	/* start at first element, and to make sure the compiler will not make a calculation each time in the loop
-	   store a pointer to the current element to modify rather than l_tcp->pocs[i]*/
-	l_current_poc = l_tcp->pocs;
+    /* start at first element, and to make sure the compiler will not make a calculation each time in the loop
+       store a pointer to the current element to modify rather than l_tcp->pocs[i]*/
+    l_current_poc = l_tcp->pocs;
 
-	for (pino = 0; pino < l_poc_bound ; ++pino) {
-		l_current_poc->compS = 0;
-		l_current_poc->compE = p_num_comps;/*p_image->numcomps;*/
-		l_current_poc->resS = 0;
-		l_current_poc->resE = p_max_res;
-		l_current_poc->layS = 0;
-		l_current_poc->layE = l_tcp->numlayers;
-		l_current_poc->prg  = l_tcp->prg;
-		l_current_poc->prcS = 0;
-		l_current_poc->prcE = p_max_prec;
-		l_current_poc->txS = (OPJ_UINT32)p_tx0;
-		l_current_poc->txE = (OPJ_UINT32)p_tx1;
-		l_current_poc->tyS = (OPJ_UINT32)p_ty0;
-		l_current_poc->tyE = (OPJ_UINT32)p_ty1;
-		l_current_poc->dx = p_dx_min;
-		l_current_poc->dy = p_dy_min;
-		++ l_current_poc;
-	}
+    for (pino = 0; pino < l_poc_bound ; ++pino) {
+        l_current_poc->compS = 0;
+        l_current_poc->compE = p_num_comps;/*p_image->numcomps;*/
+        l_current_poc->resS = 0;
+        l_current_poc->resE = p_max_res;
+        l_current_poc->layS = 0;
+        l_current_poc->layE = l_tcp->numlayers;
+        l_current_poc->prg  = l_tcp->prg;
+        l_current_poc->prcS = 0;
+        l_current_poc->prcE = p_max_prec;
+        l_current_poc->txS = (OPJ_UINT32)p_tx0;
+        l_current_poc->txE = (OPJ_UINT32)p_tx1;
+        l_current_poc->tyS = (OPJ_UINT32)p_ty0;
+        l_current_poc->tyE = (OPJ_UINT32)p_ty1;
+        l_current_poc->dx = p_dx_min;
+        l_current_poc->dy = p_dy_min;
+        ++ l_current_poc;
+    }
 }
 
-static void opj_pi_update_decode_poc (opj_pi_iterator_t * p_pi,
-                               opj_tcp_t * p_tcp,
-                               OPJ_UINT32 p_max_precision,
-                               OPJ_UINT32 p_max_res)
+static void opj_pi_update_decode_poc(opj_pi_iterator_t * p_pi,
+                                     opj_tcp_t * p_tcp,
+                                     OPJ_UINT32 p_max_precision,
+                                     OPJ_UINT32 p_max_res)
 {
-	/* loop*/
-	OPJ_UINT32 pino;
+    /* loop*/
+    OPJ_UINT32 pino;
 
-	/* encoding prameters to set*/
-	OPJ_UINT32 l_bound;
+    /* encoding prameters to set*/
+    OPJ_UINT32 l_bound;
 
-	opj_pi_iterator_t * l_current_pi = 00;
-	opj_poc_t* l_current_poc = 0;
+    opj_pi_iterator_t * l_current_pi = 00;
+    opj_poc_t* l_current_poc = 0;
 
     OPJ_ARG_NOT_USED(p_max_res);
 
-	/* preconditions in debug*/
-	assert(p_pi != 00);
-	assert(p_tcp != 00);
+    /* preconditions in debug*/
+    assert(p_pi != 00);
+    assert(p_tcp != 00);
 
-	/* initializations*/
-	l_bound = p_tcp->numpocs+1;
-	l_current_pi = p_pi;
-	l_current_poc = p_tcp->pocs;
+    /* initializations*/
+    l_bound = p_tcp->numpocs + 1;
+    l_current_pi = p_pi;
+    l_current_poc = p_tcp->pocs;
 
-	for	(pino = 0;pino<l_bound;++pino) {
-		l_current_pi->poc.prg = l_current_poc->prg; /* Progression Order #0 */
-		l_current_pi->first = 1;
+    for (pino = 0; pino < l_bound; ++pino) {
+        l_current_pi->poc.prg = l_current_poc->prg; /* Progression Order #0 */
+        l_current_pi->first = 1;
 
-		l_current_pi->poc.resno0 = l_current_poc->resno0; /* Resolution Level Index #0 (Start) */
-		l_current_pi->poc.compno0 = l_current_poc->compno0; /* Component Index #0 (Start) */
-		l_current_pi->poc.layno0 = 0;
-		l_current_pi->poc.precno0 = 0;
-		l_current_pi->poc.resno1 = l_current_poc->resno1; /* Resolution Level Index #0 (End) */
-		l_current_pi->poc.compno1 = l_current_poc->compno1; /* Component Index #0 (End) */
-		l_current_pi->poc.layno1 = opj_uint_min(l_current_poc->layno1, p_tcp->numlayers); /* Layer Index #0 (End) */
-		l_current_pi->poc.precno1 = p_max_precision;
-		++l_current_pi;
-		++l_current_poc;
-	}
+        l_current_pi->poc.resno0 =
+            l_current_poc->resno0; /* Resolution Level Index #0 (Start) */
+        l_current_pi->poc.compno0 =
+            l_current_poc->compno0; /* Component Index #0 (Start) */
+        l_current_pi->poc.layno0 = 0;
+        l_current_pi->poc.precno0 = 0;
+        l_current_pi->poc.resno1 =
+            l_current_poc->resno1; /* Resolution Level Index #0 (End) */
+        l_current_pi->poc.compno1 =
+            l_current_poc->compno1; /* Component Index #0 (End) */
+        l_current_pi->poc.layno1 = opj_uint_min(l_current_poc->layno1,
+                                                p_tcp->numlayers); /* Layer Index #0 (End) */
+        l_current_pi->poc.precno1 = p_max_precision;
+        ++l_current_pi;
+        ++l_current_poc;
+    }
 }
 
-static void opj_pi_update_decode_not_poc (opj_pi_iterator_t * p_pi,
-                                   opj_tcp_t * p_tcp,
-                                   OPJ_UINT32 p_max_precision,
-                                   OPJ_UINT32 p_max_res)
+static void opj_pi_update_decode_not_poc(opj_pi_iterator_t * p_pi,
+        opj_tcp_t * p_tcp,
+        OPJ_UINT32 p_max_precision,
+        OPJ_UINT32 p_max_res)
 {
-	/* loop*/
-	OPJ_UINT32 pino;
+    /* loop*/
+    OPJ_UINT32 pino;
 
-	/* encoding prameters to set*/
-	OPJ_UINT32 l_bound;
+    /* encoding prameters to set*/
+    OPJ_UINT32 l_bound;
 
-	opj_pi_iterator_t * l_current_pi = 00;
-	/* preconditions in debug*/
-	assert(p_tcp != 00);
-	assert(p_pi != 00);
+    opj_pi_iterator_t * l_current_pi = 00;
+    /* preconditions in debug*/
+    assert(p_tcp != 00);
+    assert(p_pi != 00);
 
-	/* initializations*/
-	l_bound = p_tcp->numpocs+1;
-	l_current_pi = p_pi;
+    /* initializations*/
+    l_bound = p_tcp->numpocs + 1;
+    l_current_pi = p_pi;
 
-	for (pino = 0;pino<l_bound;++pino) {
-		l_current_pi->poc.prg = p_tcp->prg;
-		l_current_pi->first = 1;
-		l_current_pi->poc.resno0 = 0;
-		l_current_pi->poc.compno0 = 0;
-		l_current_pi->poc.layno0 = 0;
-		l_current_pi->poc.precno0 = 0;
-		l_current_pi->poc.resno1 = p_max_res;
-		l_current_pi->poc.compno1 = l_current_pi->numcomps;
-		l_current_pi->poc.layno1 = p_tcp->numlayers;
-		l_current_pi->poc.precno1 = p_max_precision;
-		++l_current_pi;
-	}
+    for (pino = 0; pino < l_bound; ++pino) {
+        l_current_pi->poc.prg = p_tcp->prg;
+        l_current_pi->first = 1;
+        l_current_pi->poc.resno0 = 0;
+        l_current_pi->poc.compno0 = 0;
+        l_current_pi->poc.layno0 = 0;
+        l_current_pi->poc.precno0 = 0;
+        l_current_pi->poc.resno1 = p_max_res;
+        l_current_pi->poc.compno1 = l_current_pi->numcomps;
+        l_current_pi->poc.layno1 = p_tcp->numlayers;
+        l_current_pi->poc.precno1 = p_max_precision;
+        ++l_current_pi;
+    }
 }
 
 
 
-static OPJ_BOOL opj_pi_check_next_level(	OPJ_INT32 pos,
-								opj_cp_t *cp,
-								OPJ_UINT32 tileno,
-								OPJ_UINT32 pino,
-								const OPJ_CHAR *prog)
+static OPJ_BOOL opj_pi_check_next_level(OPJ_INT32 pos,
+                                        opj_cp_t *cp,
+                                        OPJ_UINT32 tileno,
+                                        OPJ_UINT32 pino,
+                                        const OPJ_CHAR *prog)
 {
-	OPJ_INT32 i;
-	opj_tcp_t *tcps =&cp->tcps[tileno];
-	opj_poc_t *tcp = &tcps->pocs[pino];
+    OPJ_INT32 i;
+    opj_tcp_t *tcps = &cp->tcps[tileno];
+    opj_poc_t *tcp = &tcps->pocs[pino];
 
-	if(pos>=0){
-		for(i=pos;pos>=0;i--){
-			switch(prog[i]){
-		    case 'R':
-			    if(tcp->res_t==tcp->resE){
-				    if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){
-					    return OPJ_TRUE;
-				    }else{
-					    return OPJ_FALSE;
-				    }
-			    }else{
-				    return OPJ_TRUE;
-			    }
-			    break;
-		    case 'C':
-			    if(tcp->comp_t==tcp->compE){
-				    if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){
-					    return OPJ_TRUE;
-				    }else{
-					    return OPJ_FALSE;
-				    }
-			    }else{
-				    return OPJ_TRUE;
-			    }
-			    break;
-		    case 'L':
-			    if(tcp->lay_t==tcp->layE){
-				    if(opj_pi_check_next_level(pos-1,cp,tileno,pino,prog)){
-					    return OPJ_TRUE;
-				    }else{
-					    return OPJ_FALSE;
-				    }
-			    }else{
-				    return OPJ_TRUE;
-			    }
-			    break;
-		    case 'P':
-			    switch(tcp->prg){
-                    case OPJ_LRCP: /* fall through */
-                    case OPJ_RLCP:
-					    if(tcp->prc_t == tcp->prcE){
-						    if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
-							    return OPJ_TRUE;
-						    }else{
-							    return OPJ_FALSE;
-						    }
-					    }else{
-						    return OPJ_TRUE;
-					    }
-					    break;
-			    default:
-				    if(tcp->tx0_t == tcp->txE){
-					    /*TY*/
-					    if(tcp->ty0_t == tcp->tyE){
-						    if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
-							    return OPJ_TRUE;
-						    }else{
-							    return OPJ_FALSE;
-						    }
-					    }else{
-						    return OPJ_TRUE;
-					    }/*TY*/
-				    }else{
-					    return OPJ_TRUE;
-				    }
-				    break;
-			    }/*end case P*/
-		    }/*end switch*/
-		}/*end for*/
-	}/*end if*/
-	return OPJ_FALSE;
+    if (pos >= 0) {
+        for (i = pos; pos >= 0; i--) {
+            switch (prog[i]) {
+            case 'R':
+                if (tcp->res_t == tcp->resE) {
+                    if (opj_pi_check_next_level(pos - 1, cp, tileno, pino, prog)) {
+                        return OPJ_TRUE;
+                    } else {
+                        return OPJ_FALSE;
+                    }
+                } else {
+                    return OPJ_TRUE;
+                }
+                break;
+            case 'C':
+                if (tcp->comp_t == tcp->compE) {
+                    if (opj_pi_check_next_level(pos - 1, cp, tileno, pino, prog)) {
+                        return OPJ_TRUE;
+                    } else {
+                        return OPJ_FALSE;
+                    }
+                } else {
+                    return OPJ_TRUE;
+                }
+                break;
+            case 'L':
+                if (tcp->lay_t == tcp->layE) {
+                    if (opj_pi_check_next_level(pos - 1, cp, tileno, pino, prog)) {
+                        return OPJ_TRUE;
+                    } else {
+                        return OPJ_FALSE;
+                    }
+                } else {
+                    return OPJ_TRUE;
+                }
+                break;
+            case 'P':
+                switch (tcp->prg) {
+                case OPJ_LRCP: /* fall through */
+                case OPJ_RLCP:
+                    if (tcp->prc_t == tcp->prcE) {
+                        if (opj_pi_check_next_level(i - 1, cp, tileno, pino, prog)) {
+                            return OPJ_TRUE;
+                        } else {
+                            return OPJ_FALSE;
+                        }
+                    } else {
+                        return OPJ_TRUE;
+                    }
+                    break;
+                default:
+                    if (tcp->tx0_t == tcp->txE) {
+                        /*TY*/
+                        if (tcp->ty0_t == tcp->tyE) {
+                            if (opj_pi_check_next_level(i - 1, cp, tileno, pino, prog)) {
+                                return OPJ_TRUE;
+                            } else {
+                                return OPJ_FALSE;
+                            }
+                        } else {
+                            return OPJ_TRUE;
+                        }/*TY*/
+                    } else {
+                        return OPJ_TRUE;
+                    }
+                    break;
+                }/*end case P*/
+            }/*end switch*/
+        }/*end for*/
+    }/*end if*/
+    return OPJ_FALSE;
 }
 
 
@@ -1185,732 +1357,739 @@
 ==========================================================
 */
 opj_pi_iterator_t *opj_pi_create_decode(opj_image_t *p_image,
-										opj_cp_t *p_cp,
-										OPJ_UINT32 p_tile_no)
+                                        opj_cp_t *p_cp,
+                                        OPJ_UINT32 p_tile_no)
 {
-	/* loop */
-	OPJ_UINT32 pino;
-	OPJ_UINT32 compno, resno;
+    OPJ_UINT32 numcomps = p_image->numcomps;
 
-	/* to store w, h, dx and dy fro all components and resolutions */
-	OPJ_UINT32 * l_tmp_data;
-	OPJ_UINT32 ** l_tmp_ptr;
+    /* loop */
+    OPJ_UINT32 pino;
+    OPJ_UINT32 compno, resno;
 
-	/* encoding prameters to set */
-	OPJ_UINT32 l_max_res;
-	OPJ_UINT32 l_max_prec;
-	OPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;
-	OPJ_UINT32 l_dx_min,l_dy_min;
-	OPJ_UINT32 l_bound;
-	OPJ_UINT32 l_step_p , l_step_c , l_step_r , l_step_l ;
-	OPJ_UINT32 l_data_stride;
+    /* to store w, h, dx and dy fro all components and resolutions */
+    OPJ_UINT32 * l_tmp_data;
+    OPJ_UINT32 ** l_tmp_ptr;
 
-	/* pointers */
-	opj_pi_iterator_t *l_pi = 00;
-	opj_tcp_t *l_tcp = 00;
-	const opj_tccp_t *l_tccp = 00;
-	opj_pi_comp_t *l_current_comp = 00;
-	opj_image_comp_t * l_img_comp = 00;
-	opj_pi_iterator_t * l_current_pi = 00;
-	OPJ_UINT32 * l_encoding_value_ptr = 00;
+    /* encoding prameters to set */
+    OPJ_UINT32 l_max_res;
+    OPJ_UINT32 l_max_prec;
+    OPJ_INT32 l_tx0, l_tx1, l_ty0, l_ty1;
+    OPJ_UINT32 l_dx_min, l_dy_min;
+    OPJ_UINT32 l_bound;
+    OPJ_UINT32 l_step_p, l_step_c, l_step_r, l_step_l ;
+    OPJ_UINT32 l_data_stride;
 
-	/* preconditions in debug */
-	assert(p_cp != 00);
-	assert(p_image != 00);
-	assert(p_tile_no < p_cp->tw * p_cp->th);
+    /* pointers */
+    opj_pi_iterator_t *l_pi = 00;
+    opj_tcp_t *l_tcp = 00;
+    const opj_tccp_t *l_tccp = 00;
+    opj_pi_comp_t *l_current_comp = 00;
+    opj_image_comp_t * l_img_comp = 00;
+    opj_pi_iterator_t * l_current_pi = 00;
+    OPJ_UINT32 * l_encoding_value_ptr = 00;
 
-	/* initializations */
-	l_tcp = &p_cp->tcps[p_tile_no];
-	l_bound = l_tcp->numpocs+1;
+    /* preconditions in debug */
+    assert(p_cp != 00);
+    assert(p_image != 00);
+    assert(p_tile_no < p_cp->tw * p_cp->th);
 
-	l_data_stride = 4 * OPJ_J2K_MAXRLVLS;
-	l_tmp_data = (OPJ_UINT32*)opj_malloc(
-		l_data_stride * p_image->numcomps * sizeof(OPJ_UINT32));
-	if
-		(! l_tmp_data)
-	{
-		return 00;
-	}
-	l_tmp_ptr = (OPJ_UINT32**)opj_malloc(
-		p_image->numcomps * sizeof(OPJ_UINT32 *));
-	if
-		(! l_tmp_ptr)
-	{
-		opj_free(l_tmp_data);
-		return 00;
-	}
+    /* initializations */
+    l_tcp = &p_cp->tcps[p_tile_no];
+    l_bound = l_tcp->numpocs + 1;
 
-	/* memory allocation for pi */
-	l_pi = opj_pi_create(p_image, p_cp, p_tile_no);
-	if (!l_pi) {
-		opj_free(l_tmp_data);
-		opj_free(l_tmp_ptr);
-		return 00;
-	}
+    l_data_stride = 4 * OPJ_J2K_MAXRLVLS;
+    l_tmp_data = (OPJ_UINT32*)opj_malloc(
+                     l_data_stride * numcomps * sizeof(OPJ_UINT32));
+    if
+    (! l_tmp_data) {
+        return 00;
+    }
+    l_tmp_ptr = (OPJ_UINT32**)opj_malloc(
+                    numcomps * sizeof(OPJ_UINT32 *));
+    if
+    (! l_tmp_ptr) {
+        opj_free(l_tmp_data);
+        return 00;
+    }
 
-	l_encoding_value_ptr = l_tmp_data;
-	/* update pointer array */
-	for
-		(compno = 0; compno < p_image->numcomps; ++compno)
-	{
-		l_tmp_ptr[compno] = l_encoding_value_ptr;
-		l_encoding_value_ptr += l_data_stride;
-	}
-	/* get encoding parameters */
-	opj_get_all_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res,l_tmp_ptr);
+    /* memory allocation for pi */
+    l_pi = opj_pi_create(p_image, p_cp, p_tile_no);
+    if (!l_pi) {
+        opj_free(l_tmp_data);
+        opj_free(l_tmp_ptr);
+        return 00;
+    }
 
-	/* step calculations */
-	l_step_p = 1;
-	l_step_c = l_max_prec * l_step_p;
-	l_step_r = p_image->numcomps * l_step_c;
-	l_step_l = l_max_res * l_step_r;
+    l_encoding_value_ptr = l_tmp_data;
+    /* update pointer array */
+    for
+    (compno = 0; compno < numcomps; ++compno) {
+        l_tmp_ptr[compno] = l_encoding_value_ptr;
+        l_encoding_value_ptr += l_data_stride;
+    }
+    /* get encoding parameters */
+    opj_get_all_encoding_parameters(p_image, p_cp, p_tile_no, &l_tx0, &l_tx1,
+                                    &l_ty0, &l_ty1, &l_dx_min, &l_dy_min, &l_max_prec, &l_max_res, l_tmp_ptr);
 
-	/* set values for first packet iterator */
-	l_current_pi = l_pi;
+    /* step calculations */
+    l_step_p = 1;
+    l_step_c = l_max_prec * l_step_p;
+    l_step_r = numcomps * l_step_c;
+    l_step_l = l_max_res * l_step_r;
 
-	/* memory allocation for include */
-	l_current_pi->include = 00;
-	if
-		(l_step_l && l_tcp->numlayers < UINT_MAX / l_step_l - 1)
-	{
-		l_current_pi->include = (OPJ_INT16*)opj_calloc((l_tcp->numlayers + 1) * l_step_l, sizeof(OPJ_INT16));
-	}
+    /* set values for first packet iterator */
+    l_current_pi = l_pi;
 
-	if
-		(!l_current_pi->include)
-	{
-		opj_free(l_tmp_data);
-		opj_free(l_tmp_ptr);
-		opj_pi_destroy(l_pi, l_bound);
-		return 00;
-	}
+    /* memory allocation for include */
+    /* prevent an integer overflow issue */
+    /* 0 < l_tcp->numlayers < 65536 c.f. opj_j2k_read_cod in j2k.c */
+    l_current_pi->include = 00;
+    if (l_step_l <= (UINT_MAX / (l_tcp->numlayers + 1U))) {
+        l_current_pi->include_size = (l_tcp->numlayers + 1U) * l_step_l;
+        l_current_pi->include = (OPJ_INT16*) opj_calloc(
+                                    l_current_pi->include_size, sizeof(OPJ_INT16));
+    }
 
-	/* special treatment for the first packet iterator */
-	l_current_comp = l_current_pi->comps;
-	l_img_comp = p_image->comps;
-	l_tccp = l_tcp->tccps;
+    if (!l_current_pi->include) {
+        opj_free(l_tmp_data);
+        opj_free(l_tmp_ptr);
+        opj_pi_destroy(l_pi, l_bound);
+        return 00;
+    }
 
-	l_current_pi->tx0 = l_tx0;
-	l_current_pi->ty0 = l_ty0;
-	l_current_pi->tx1 = l_tx1;
-	l_current_pi->ty1 = l_ty1;
+    /* special treatment for the first packet iterator */
+    l_current_comp = l_current_pi->comps;
+    l_img_comp = p_image->comps;
+    l_tccp = l_tcp->tccps;
 
-	/*l_current_pi->dx = l_img_comp->dx;*/
-	/*l_current_pi->dy = l_img_comp->dy;*/
+    l_current_pi->tx0 = l_tx0;
+    l_current_pi->ty0 = l_ty0;
+    l_current_pi->tx1 = l_tx1;
+    l_current_pi->ty1 = l_ty1;
 
-	l_current_pi->step_p = l_step_p;
-	l_current_pi->step_c = l_step_c;
-	l_current_pi->step_r = l_step_r;
-	l_current_pi->step_l = l_step_l;
+    /*l_current_pi->dx = l_img_comp->dx;*/
+    /*l_current_pi->dy = l_img_comp->dy;*/
 
-	/* allocation for components and number of components has already been calculated by opj_pi_create */
-	for
-		(compno = 0; compno < l_current_pi->numcomps; ++compno)
-	{
-		opj_pi_resolution_t *l_res = l_current_comp->resolutions;
-		l_encoding_value_ptr = l_tmp_ptr[compno];
+    l_current_pi->step_p = l_step_p;
+    l_current_pi->step_c = l_step_c;
+    l_current_pi->step_r = l_step_r;
+    l_current_pi->step_l = l_step_l;
 
-		l_current_comp->dx = l_img_comp->dx;
-		l_current_comp->dy = l_img_comp->dy;
-		/* resolutions have already been initialized */
-		for
-			(resno = 0; resno < l_current_comp->numresolutions; resno++)
-		{
-			l_res->pdx = *(l_encoding_value_ptr++);
-			l_res->pdy = *(l_encoding_value_ptr++);
-			l_res->pw =  *(l_encoding_value_ptr++);
-			l_res->ph =  *(l_encoding_value_ptr++);
-			++l_res;
-		}
-		++l_current_comp;
-		++l_img_comp;
-		++l_tccp;
-	}
-	++l_current_pi;
+    /* allocation for components and number of components has already been calculated by opj_pi_create */
+    for
+    (compno = 0; compno < numcomps; ++compno) {
+        opj_pi_resolution_t *l_res = l_current_comp->resolutions;
+        l_encoding_value_ptr = l_tmp_ptr[compno];
 
-	for (pino = 1 ; pino<l_bound ; ++pino )
-	{
-		l_current_comp = l_current_pi->comps;
-		l_img_comp = p_image->comps;
-		l_tccp = l_tcp->tccps;
+        l_current_comp->dx = l_img_comp->dx;
+        l_current_comp->dy = l_img_comp->dy;
+        /* resolutions have already been initialized */
+        for
+        (resno = 0; resno < l_current_comp->numresolutions; resno++) {
+            l_res->pdx = *(l_encoding_value_ptr++);
+            l_res->pdy = *(l_encoding_value_ptr++);
+            l_res->pw =  *(l_encoding_value_ptr++);
+            l_res->ph =  *(l_encoding_value_ptr++);
+            ++l_res;
+        }
+        ++l_current_comp;
+        ++l_img_comp;
+        ++l_tccp;
+    }
+    ++l_current_pi;
 
-		l_current_pi->tx0 = l_tx0;
-		l_current_pi->ty0 = l_ty0;
-		l_current_pi->tx1 = l_tx1;
-		l_current_pi->ty1 = l_ty1;
-		/*l_current_pi->dx = l_dx_min;*/
-		/*l_current_pi->dy = l_dy_min;*/
-		l_current_pi->step_p = l_step_p;
-		l_current_pi->step_c = l_step_c;
-		l_current_pi->step_r = l_step_r;
-		l_current_pi->step_l = l_step_l;
+    for (pino = 1 ; pino < l_bound ; ++pino) {
+        l_current_comp = l_current_pi->comps;
+        l_img_comp = p_image->comps;
+        l_tccp = l_tcp->tccps;
 
-		/* allocation for components and number of components has already been calculated by opj_pi_create */
-		for
-			(compno = 0; compno < l_current_pi->numcomps; ++compno)
-		{
-			opj_pi_resolution_t *l_res = l_current_comp->resolutions;
-			l_encoding_value_ptr = l_tmp_ptr[compno];
+        l_current_pi->tx0 = l_tx0;
+        l_current_pi->ty0 = l_ty0;
+        l_current_pi->tx1 = l_tx1;
+        l_current_pi->ty1 = l_ty1;
+        /*l_current_pi->dx = l_dx_min;*/
+        /*l_current_pi->dy = l_dy_min;*/
+        l_current_pi->step_p = l_step_p;
+        l_current_pi->step_c = l_step_c;
+        l_current_pi->step_r = l_step_r;
+        l_current_pi->step_l = l_step_l;
 
-			l_current_comp->dx = l_img_comp->dx;
-			l_current_comp->dy = l_img_comp->dy;
-			/* resolutions have already been initialized */
-			for
-				(resno = 0; resno < l_current_comp->numresolutions; resno++)
-			{
-				l_res->pdx = *(l_encoding_value_ptr++);
-				l_res->pdy = *(l_encoding_value_ptr++);
-				l_res->pw =  *(l_encoding_value_ptr++);
-				l_res->ph =  *(l_encoding_value_ptr++);
-				++l_res;
-			}
-			++l_current_comp;
-			++l_img_comp;
-			++l_tccp;
-		}
-		/* special treatment*/
-		l_current_pi->include = (l_current_pi-1)->include;
-		++l_current_pi;
-	}
-	opj_free(l_tmp_data);
-	l_tmp_data = 00;
-	opj_free(l_tmp_ptr);
-	l_tmp_ptr = 00;
-	if
-		(l_tcp->POC)
-	{
-		opj_pi_update_decode_poc (l_pi,l_tcp,l_max_prec,l_max_res);
-	}
-	else
-	{
-		opj_pi_update_decode_not_poc(l_pi,l_tcp,l_max_prec,l_max_res);
-	}
-	return l_pi;
+        /* allocation for components and number of components has already been calculated by opj_pi_create */
+        for
+        (compno = 0; compno < numcomps; ++compno) {
+            opj_pi_resolution_t *l_res = l_current_comp->resolutions;
+            l_encoding_value_ptr = l_tmp_ptr[compno];
+
+            l_current_comp->dx = l_img_comp->dx;
+            l_current_comp->dy = l_img_comp->dy;
+            /* resolutions have already been initialized */
+            for
+            (resno = 0; resno < l_current_comp->numresolutions; resno++) {
+                l_res->pdx = *(l_encoding_value_ptr++);
+                l_res->pdy = *(l_encoding_value_ptr++);
+                l_res->pw =  *(l_encoding_value_ptr++);
+                l_res->ph =  *(l_encoding_value_ptr++);
+                ++l_res;
+            }
+            ++l_current_comp;
+            ++l_img_comp;
+            ++l_tccp;
+        }
+        /* special treatment*/
+        l_current_pi->include = (l_current_pi - 1)->include;
+        l_current_pi->include_size = (l_current_pi - 1)->include_size;
+        ++l_current_pi;
+    }
+    opj_free(l_tmp_data);
+    l_tmp_data = 00;
+    opj_free(l_tmp_ptr);
+    l_tmp_ptr = 00;
+    if
+    (l_tcp->POC) {
+        opj_pi_update_decode_poc(l_pi, l_tcp, l_max_prec, l_max_res);
+    } else {
+        opj_pi_update_decode_not_poc(l_pi, l_tcp, l_max_prec, l_max_res);
+    }
+    return l_pi;
 }
 
 
 
 opj_pi_iterator_t *opj_pi_initialise_encode(const opj_image_t *p_image,
-                                            opj_cp_t *p_cp,
-                                            OPJ_UINT32 p_tile_no,
-                                            J2K_T2_MODE p_t2_mode )
+        opj_cp_t *p_cp,
+        OPJ_UINT32 p_tile_no,
+        J2K_T2_MODE p_t2_mode)
 {
-	/* loop*/
-	OPJ_UINT32 pino;
-	OPJ_UINT32 compno, resno;
+    OPJ_UINT32 numcomps = p_image->numcomps;
 
-	/* to store w, h, dx and dy fro all components and resolutions*/
-	OPJ_UINT32 * l_tmp_data;
-	OPJ_UINT32 ** l_tmp_ptr;
+    /* loop*/
+    OPJ_UINT32 pino;
+    OPJ_UINT32 compno, resno;
 
-	/* encoding prameters to set*/
-	OPJ_UINT32 l_max_res;
-	OPJ_UINT32 l_max_prec;
-	OPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;
-	OPJ_UINT32 l_dx_min,l_dy_min;
-	OPJ_UINT32 l_bound;
-	OPJ_UINT32 l_step_p , l_step_c , l_step_r , l_step_l ;
-	OPJ_UINT32 l_data_stride;
+    /* to store w, h, dx and dy fro all components and resolutions*/
+    OPJ_UINT32 * l_tmp_data;
+    OPJ_UINT32 ** l_tmp_ptr;
 
-	/* pointers*/
-	opj_pi_iterator_t *l_pi = 00;
-	opj_tcp_t *l_tcp = 00;
-	const opj_tccp_t *l_tccp = 00;
-	opj_pi_comp_t *l_current_comp = 00;
-	opj_image_comp_t * l_img_comp = 00;
-	opj_pi_iterator_t * l_current_pi = 00;
-	OPJ_UINT32 * l_encoding_value_ptr = 00;
+    /* encoding prameters to set*/
+    OPJ_UINT32 l_max_res;
+    OPJ_UINT32 l_max_prec;
+    OPJ_INT32 l_tx0, l_tx1, l_ty0, l_ty1;
+    OPJ_UINT32 l_dx_min, l_dy_min;
+    OPJ_UINT32 l_bound;
+    OPJ_UINT32 l_step_p, l_step_c, l_step_r, l_step_l ;
+    OPJ_UINT32 l_data_stride;
 
-	/* preconditions in debug*/
-	assert(p_cp != 00);
-	assert(p_image != 00);
-	assert(p_tile_no < p_cp->tw * p_cp->th);
+    /* pointers*/
+    opj_pi_iterator_t *l_pi = 00;
+    opj_tcp_t *l_tcp = 00;
+    const opj_tccp_t *l_tccp = 00;
+    opj_pi_comp_t *l_current_comp = 00;
+    opj_image_comp_t * l_img_comp = 00;
+    opj_pi_iterator_t * l_current_pi = 00;
+    OPJ_UINT32 * l_encoding_value_ptr = 00;
 
-	/* initializations*/
-	l_tcp = &p_cp->tcps[p_tile_no];
-	l_bound = l_tcp->numpocs+1;
+    /* preconditions in debug*/
+    assert(p_cp != 00);
+    assert(p_image != 00);
+    assert(p_tile_no < p_cp->tw * p_cp->th);
 
-	l_data_stride = 4 * OPJ_J2K_MAXRLVLS;
-	l_tmp_data = (OPJ_UINT32*)opj_malloc(
-		l_data_stride * p_image->numcomps * sizeof(OPJ_UINT32));
-	if (! l_tmp_data) {
-		return 00;
-	}
+    /* initializations*/
+    l_tcp = &p_cp->tcps[p_tile_no];
+    l_bound = l_tcp->numpocs + 1;
 
-	l_tmp_ptr = (OPJ_UINT32**)opj_malloc(
-		p_image->numcomps * sizeof(OPJ_UINT32 *));
-	if (! l_tmp_ptr) {
-		opj_free(l_tmp_data);
-		return 00;
-	}
+    l_data_stride = 4 * OPJ_J2K_MAXRLVLS;
+    l_tmp_data = (OPJ_UINT32*)opj_malloc(
+                     l_data_stride * numcomps * sizeof(OPJ_UINT32));
+    if (! l_tmp_data) {
+        return 00;
+    }
 
-	/* memory allocation for pi*/
-	l_pi = opj_pi_create(p_image,p_cp,p_tile_no);
-	if (!l_pi) {
-		opj_free(l_tmp_data);
-		opj_free(l_tmp_ptr);
-		return 00;
-	}
+    l_tmp_ptr = (OPJ_UINT32**)opj_malloc(
+                    numcomps * sizeof(OPJ_UINT32 *));
+    if (! l_tmp_ptr) {
+        opj_free(l_tmp_data);
+        return 00;
+    }
 
-	l_encoding_value_ptr = l_tmp_data;
-	/* update pointer array*/
-	for (compno = 0; compno < p_image->numcomps; ++compno) {
-		l_tmp_ptr[compno] = l_encoding_value_ptr;
-		l_encoding_value_ptr += l_data_stride;
-	}
+    /* memory allocation for pi*/
+    l_pi = opj_pi_create(p_image, p_cp, p_tile_no);
+    if (!l_pi) {
+        opj_free(l_tmp_data);
+        opj_free(l_tmp_ptr);
+        return 00;
+    }
 
-	/* get encoding parameters*/
-	opj_get_all_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res,l_tmp_ptr);
+    l_encoding_value_ptr = l_tmp_data;
+    /* update pointer array*/
+    for (compno = 0; compno < numcomps; ++compno) {
+        l_tmp_ptr[compno] = l_encoding_value_ptr;
+        l_encoding_value_ptr += l_data_stride;
+    }
 
-	/* step calculations*/
-	l_step_p = 1;
-	l_step_c = l_max_prec * l_step_p;
-	l_step_r = p_image->numcomps * l_step_c;
-	l_step_l = l_max_res * l_step_r;
+    /* get encoding parameters*/
+    opj_get_all_encoding_parameters(p_image, p_cp, p_tile_no, &l_tx0, &l_tx1,
+                                    &l_ty0, &l_ty1, &l_dx_min, &l_dy_min, &l_max_prec, &l_max_res, l_tmp_ptr);
 
-	/* set values for first packet iterator*/
-	l_pi->tp_on = (OPJ_BYTE)p_cp->m_specific_param.m_enc.m_tp_on;
-	l_current_pi = l_pi;
+    /* step calculations*/
+    l_step_p = 1;
+    l_step_c = l_max_prec * l_step_p;
+    l_step_r = numcomps * l_step_c;
+    l_step_l = l_max_res * l_step_r;
 
-	/* memory allocation for include*/
-	l_current_pi->include = (OPJ_INT16*) opj_calloc(l_tcp->numlayers * l_step_l, sizeof(OPJ_INT16));
-	if (!l_current_pi->include) {
-		opj_free(l_tmp_data);
-		opj_free(l_tmp_ptr);
-		opj_pi_destroy(l_pi, l_bound);
-		return 00;
-	}
+    /* set values for first packet iterator*/
+    l_pi->tp_on = (OPJ_BYTE)p_cp->m_specific_param.m_enc.m_tp_on;
+    l_current_pi = l_pi;
 
-	/* special treatment for the first packet iterator*/
-	l_current_comp = l_current_pi->comps;
-	l_img_comp = p_image->comps;
-	l_tccp = l_tcp->tccps;
-	l_current_pi->tx0 = l_tx0;
-	l_current_pi->ty0 = l_ty0;
-	l_current_pi->tx1 = l_tx1;
-	l_current_pi->ty1 = l_ty1;
-	l_current_pi->dx = l_dx_min;
-	l_current_pi->dy = l_dy_min;
-	l_current_pi->step_p = l_step_p;
-	l_current_pi->step_c = l_step_c;
-	l_current_pi->step_r = l_step_r;
-	l_current_pi->step_l = l_step_l;
+    /* memory allocation for include*/
+    l_current_pi->include_size = l_tcp->numlayers * l_step_l;
+    l_current_pi->include = (OPJ_INT16*) opj_calloc(l_current_pi->include_size,
+                            sizeof(OPJ_INT16));
+    if (!l_current_pi->include) {
+        opj_free(l_tmp_data);
+        opj_free(l_tmp_ptr);
+        opj_pi_destroy(l_pi, l_bound);
+        return 00;
+    }
 
-	/* allocation for components and number of components has already been calculated by opj_pi_create */
-	for (compno = 0; compno < l_current_pi->numcomps; ++compno) {
-		opj_pi_resolution_t *l_res = l_current_comp->resolutions;
-		l_encoding_value_ptr = l_tmp_ptr[compno];
+    /* special treatment for the first packet iterator*/
+    l_current_comp = l_current_pi->comps;
+    l_img_comp = p_image->comps;
+    l_tccp = l_tcp->tccps;
+    l_current_pi->tx0 = l_tx0;
+    l_current_pi->ty0 = l_ty0;
+    l_current_pi->tx1 = l_tx1;
+    l_current_pi->ty1 = l_ty1;
+    l_current_pi->dx = l_dx_min;
+    l_current_pi->dy = l_dy_min;
+    l_current_pi->step_p = l_step_p;
+    l_current_pi->step_c = l_step_c;
+    l_current_pi->step_r = l_step_r;
+    l_current_pi->step_l = l_step_l;
 
-		l_current_comp->dx = l_img_comp->dx;
-		l_current_comp->dy = l_img_comp->dy;
+    /* allocation for components and number of components has already been calculated by opj_pi_create */
+    for (compno = 0; compno < numcomps; ++compno) {
+        opj_pi_resolution_t *l_res = l_current_comp->resolutions;
+        l_encoding_value_ptr = l_tmp_ptr[compno];
 
-		/* resolutions have already been initialized */
-		for (resno = 0; resno < l_current_comp->numresolutions; resno++) {
-			l_res->pdx = *(l_encoding_value_ptr++);
-			l_res->pdy = *(l_encoding_value_ptr++);
-			l_res->pw =  *(l_encoding_value_ptr++);
-			l_res->ph =  *(l_encoding_value_ptr++);
-			++l_res;
-		}
+        l_current_comp->dx = l_img_comp->dx;
+        l_current_comp->dy = l_img_comp->dy;
 
-		++l_current_comp;
-		++l_img_comp;
-		++l_tccp;
-	}
-	++l_current_pi;
+        /* resolutions have already been initialized */
+        for (resno = 0; resno < l_current_comp->numresolutions; resno++) {
+            l_res->pdx = *(l_encoding_value_ptr++);
+            l_res->pdy = *(l_encoding_value_ptr++);
+            l_res->pw =  *(l_encoding_value_ptr++);
+            l_res->ph =  *(l_encoding_value_ptr++);
+            ++l_res;
+        }
 
-	for (pino = 1 ; pino<l_bound ; ++pino ) {
-		l_current_comp = l_current_pi->comps;
-		l_img_comp = p_image->comps;
-		l_tccp = l_tcp->tccps;
+        ++l_current_comp;
+        ++l_img_comp;
+        ++l_tccp;
+    }
+    ++l_current_pi;
 
-		l_current_pi->tx0 = l_tx0;
-		l_current_pi->ty0 = l_ty0;
-		l_current_pi->tx1 = l_tx1;
-		l_current_pi->ty1 = l_ty1;
-		l_current_pi->dx = l_dx_min;
-		l_current_pi->dy = l_dy_min;
-		l_current_pi->step_p = l_step_p;
-		l_current_pi->step_c = l_step_c;
-		l_current_pi->step_r = l_step_r;
-		l_current_pi->step_l = l_step_l;
+    for (pino = 1 ; pino < l_bound ; ++pino) {
+        l_current_comp = l_current_pi->comps;
+        l_img_comp = p_image->comps;
+        l_tccp = l_tcp->tccps;
 
-		/* allocation for components and number of components has already been calculated by opj_pi_create */
-		for (compno = 0; compno < l_current_pi->numcomps; ++compno) {
-			opj_pi_resolution_t *l_res = l_current_comp->resolutions;
-			l_encoding_value_ptr = l_tmp_ptr[compno];
+        l_current_pi->tx0 = l_tx0;
+        l_current_pi->ty0 = l_ty0;
+        l_current_pi->tx1 = l_tx1;
+        l_current_pi->ty1 = l_ty1;
+        l_current_pi->dx = l_dx_min;
+        l_current_pi->dy = l_dy_min;
+        l_current_pi->step_p = l_step_p;
+        l_current_pi->step_c = l_step_c;
+        l_current_pi->step_r = l_step_r;
+        l_current_pi->step_l = l_step_l;
 
-			l_current_comp->dx = l_img_comp->dx;
-			l_current_comp->dy = l_img_comp->dy;
-			/* resolutions have already been initialized */
-			for (resno = 0; resno < l_current_comp->numresolutions; resno++) {
-				l_res->pdx = *(l_encoding_value_ptr++);
-				l_res->pdy = *(l_encoding_value_ptr++);
-				l_res->pw =  *(l_encoding_value_ptr++);
-				l_res->ph =  *(l_encoding_value_ptr++);
-				++l_res;
-			}
-			++l_current_comp;
-			++l_img_comp;
-			++l_tccp;
-		}
+        /* allocation for components and number of components has already been calculated by opj_pi_create */
+        for (compno = 0; compno < numcomps; ++compno) {
+            opj_pi_resolution_t *l_res = l_current_comp->resolutions;
+            l_encoding_value_ptr = l_tmp_ptr[compno];
 
-		/* special treatment*/
-		l_current_pi->include = (l_current_pi-1)->include;
-		++l_current_pi;
-	}
+            l_current_comp->dx = l_img_comp->dx;
+            l_current_comp->dy = l_img_comp->dy;
+            /* resolutions have already been initialized */
+            for (resno = 0; resno < l_current_comp->numresolutions; resno++) {
+                l_res->pdx = *(l_encoding_value_ptr++);
+                l_res->pdy = *(l_encoding_value_ptr++);
+                l_res->pw =  *(l_encoding_value_ptr++);
+                l_res->ph =  *(l_encoding_value_ptr++);
+                ++l_res;
+            }
+            ++l_current_comp;
+            ++l_img_comp;
+            ++l_tccp;
+        }
 
-	opj_free(l_tmp_data);
-	l_tmp_data = 00;
-	opj_free(l_tmp_ptr);
-	l_tmp_ptr = 00;
+        /* special treatment*/
+        l_current_pi->include = (l_current_pi - 1)->include;
+        l_current_pi->include_size = (l_current_pi - 1)->include_size;
+        ++l_current_pi;
+    }
+
+    opj_free(l_tmp_data);
+    l_tmp_data = 00;
+    opj_free(l_tmp_ptr);
+    l_tmp_ptr = 00;
 
     if (l_tcp->POC && (OPJ_IS_CINEMA(p_cp->rsiz) || p_t2_mode == FINAL_PASS)) {
-		opj_pi_update_encode_poc_and_final(p_cp,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
-	}
-	else {
-		opj_pi_update_encode_not_poc(p_cp,p_image->numcomps,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
-	}
+        opj_pi_update_encode_poc_and_final(p_cp, p_tile_no, l_tx0, l_tx1, l_ty0, l_ty1,
+                                           l_max_prec, l_max_res, l_dx_min, l_dy_min);
+    } else {
+        opj_pi_update_encode_not_poc(p_cp, numcomps, p_tile_no, l_tx0, l_tx1,
+                                     l_ty0, l_ty1, l_max_prec, l_max_res, l_dx_min, l_dy_min);
+    }
 
-	return l_pi;
+    return l_pi;
 }
 
-void opj_pi_create_encode( 	opj_pi_iterator_t *pi,
-							opj_cp_t *cp,
-							OPJ_UINT32 tileno,
-							OPJ_UINT32 pino,
-							OPJ_UINT32 tpnum,
-							OPJ_INT32 tppos,
-							J2K_T2_MODE t2_mode)
+void opj_pi_create_encode(opj_pi_iterator_t *pi,
+                          opj_cp_t *cp,
+                          OPJ_UINT32 tileno,
+                          OPJ_UINT32 pino,
+                          OPJ_UINT32 tpnum,
+                          OPJ_INT32 tppos,
+                          J2K_T2_MODE t2_mode)
 {
-	const OPJ_CHAR *prog;
-	OPJ_INT32 i;
-	OPJ_UINT32 incr_top=1,resetX=0;
-	opj_tcp_t *tcps =&cp->tcps[tileno];
-	opj_poc_t *tcp= &tcps->pocs[pino];
+    const OPJ_CHAR *prog;
+    OPJ_INT32 i;
+    OPJ_UINT32 incr_top = 1, resetX = 0;
+    opj_tcp_t *tcps = &cp->tcps[tileno];
+    opj_poc_t *tcp = &tcps->pocs[pino];
 
-	prog = opj_j2k_convert_progression_order(tcp->prg);
+    prog = opj_j2k_convert_progression_order(tcp->prg);
 
-	pi[pino].first = 1;
-	pi[pino].poc.prg = tcp->prg;
+    pi[pino].first = 1;
+    pi[pino].poc.prg = tcp->prg;
 
-    if(!(cp->m_specific_param.m_enc.m_tp_on && ((!OPJ_IS_CINEMA(cp->rsiz) && (t2_mode == FINAL_PASS)) || OPJ_IS_CINEMA(cp->rsiz)))){
-		pi[pino].poc.resno0 = tcp->resS;
-		pi[pino].poc.resno1 = tcp->resE;
-		pi[pino].poc.compno0 = tcp->compS;
-		pi[pino].poc.compno1 = tcp->compE;
-		pi[pino].poc.layno0 = tcp->layS;
-		pi[pino].poc.layno1 = tcp->layE;
-		pi[pino].poc.precno0 = tcp->prcS;
-		pi[pino].poc.precno1 = tcp->prcE;
-		pi[pino].poc.tx0 = (OPJ_INT32)tcp->txS;
-		pi[pino].poc.ty0 = (OPJ_INT32)tcp->tyS;
-		pi[pino].poc.tx1 = (OPJ_INT32)tcp->txE;
-		pi[pino].poc.ty1 = (OPJ_INT32)tcp->tyE;
-	}else {
-		for(i=tppos+1;i<4;i++){
-			switch(prog[i]){
-			case 'R':
-				pi[pino].poc.resno0 = tcp->resS;
-				pi[pino].poc.resno1 = tcp->resE;
-				break;
-			case 'C':
-				pi[pino].poc.compno0 = tcp->compS;
-				pi[pino].poc.compno1 = tcp->compE;
-				break;
-			case 'L':
-				pi[pino].poc.layno0 = tcp->layS;
-				pi[pino].poc.layno1 = tcp->layE;
-				break;
-			case 'P':
-				switch(tcp->prg){
-				case OPJ_LRCP:
-				case OPJ_RLCP:
-					pi[pino].poc.precno0 = tcp->prcS;
-					pi[pino].poc.precno1 = tcp->prcE;
-					break;
-				default:
-					pi[pino].poc.tx0 = (OPJ_INT32)tcp->txS;
-					pi[pino].poc.ty0 = (OPJ_INT32)tcp->tyS;
-					pi[pino].poc.tx1 = (OPJ_INT32)tcp->txE;
-					pi[pino].poc.ty1 = (OPJ_INT32)tcp->tyE;
-					break;
-				}
-				break;
-			}
-		}
+    if (!(cp->m_specific_param.m_enc.m_tp_on && ((!OPJ_IS_CINEMA(cp->rsiz) &&
+            (t2_mode == FINAL_PASS)) || OPJ_IS_CINEMA(cp->rsiz)))) {
+        pi[pino].poc.resno0 = tcp->resS;
+        pi[pino].poc.resno1 = tcp->resE;
+        pi[pino].poc.compno0 = tcp->compS;
+        pi[pino].poc.compno1 = tcp->compE;
+        pi[pino].poc.layno0 = tcp->layS;
+        pi[pino].poc.layno1 = tcp->layE;
+        pi[pino].poc.precno0 = tcp->prcS;
+        pi[pino].poc.precno1 = tcp->prcE;
+        pi[pino].poc.tx0 = (OPJ_INT32)tcp->txS;
+        pi[pino].poc.ty0 = (OPJ_INT32)tcp->tyS;
+        pi[pino].poc.tx1 = (OPJ_INT32)tcp->txE;
+        pi[pino].poc.ty1 = (OPJ_INT32)tcp->tyE;
+    } else {
+        for (i = tppos + 1; i < 4; i++) {
+            switch (prog[i]) {
+            case 'R':
+                pi[pino].poc.resno0 = tcp->resS;
+                pi[pino].poc.resno1 = tcp->resE;
+                break;
+            case 'C':
+                pi[pino].poc.compno0 = tcp->compS;
+                pi[pino].poc.compno1 = tcp->compE;
+                break;
+            case 'L':
+                pi[pino].poc.layno0 = tcp->layS;
+                pi[pino].poc.layno1 = tcp->layE;
+                break;
+            case 'P':
+                switch (tcp->prg) {
+                case OPJ_LRCP:
+                case OPJ_RLCP:
+                    pi[pino].poc.precno0 = tcp->prcS;
+                    pi[pino].poc.precno1 = tcp->prcE;
+                    break;
+                default:
+                    pi[pino].poc.tx0 = (OPJ_INT32)tcp->txS;
+                    pi[pino].poc.ty0 = (OPJ_INT32)tcp->tyS;
+                    pi[pino].poc.tx1 = (OPJ_INT32)tcp->txE;
+                    pi[pino].poc.ty1 = (OPJ_INT32)tcp->tyE;
+                    break;
+                }
+                break;
+            }
+        }
 
-		if(tpnum==0){
-			for(i=tppos;i>=0;i--){
-				switch(prog[i]){
-				case 'C':
-					tcp->comp_t = tcp->compS;
-					pi[pino].poc.compno0 = tcp->comp_t;
-					pi[pino].poc.compno1 = tcp->comp_t+1;
-					tcp->comp_t+=1;
-					break;
-				case 'R':
-					tcp->res_t = tcp->resS;
-					pi[pino].poc.resno0 = tcp->res_t;
-					pi[pino].poc.resno1 = tcp->res_t+1;
-					tcp->res_t+=1;
-					break;
-				case 'L':
-					tcp->lay_t = tcp->layS;
-					pi[pino].poc.layno0 = tcp->lay_t;
-					pi[pino].poc.layno1 = tcp->lay_t+1;
-					tcp->lay_t+=1;
-					break;
-				case 'P':
-					switch(tcp->prg){
-					case OPJ_LRCP:
-					case OPJ_RLCP:
-						tcp->prc_t = tcp->prcS;
-						pi[pino].poc.precno0 = tcp->prc_t;
-						pi[pino].poc.precno1 = tcp->prc_t+1;
-						tcp->prc_t+=1;
-						break;
-					default:
-						tcp->tx0_t = tcp->txS;
-						tcp->ty0_t = tcp->tyS;
-						pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
-						pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx));
-						pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
-						pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
-						tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
-						tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
-						break;
-					}
-					break;
-				}
-			}
-			incr_top=1;
-		}else{
-			for(i=tppos;i>=0;i--){
-				switch(prog[i]){
-				case 'C':
-					pi[pino].poc.compno0 = tcp->comp_t-1;
-					pi[pino].poc.compno1 = tcp->comp_t;
-					break;
-				case 'R':
-					pi[pino].poc.resno0 = tcp->res_t-1;
-					pi[pino].poc.resno1 = tcp->res_t;
-					break;
-				case 'L':
-					pi[pino].poc.layno0 = tcp->lay_t-1;
-					pi[pino].poc.layno1 = tcp->lay_t;
-					break;
-				case 'P':
-					switch(tcp->prg){
-					case OPJ_LRCP:
-					case OPJ_RLCP:
-						pi[pino].poc.precno0 = tcp->prc_t-1;
-						pi[pino].poc.precno1 = tcp->prc_t;
-						break;
-					default:
-						pi[pino].poc.tx0 = (OPJ_INT32)(tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx));
-						pi[pino].poc.tx1 = (OPJ_INT32)tcp->tx0_t ;
-						pi[pino].poc.ty0 = (OPJ_INT32)(tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy));
-						pi[pino].poc.ty1 = (OPJ_INT32)tcp->ty0_t ;
-						break;
-					}
-					break;
-				}
-				if(incr_top==1){
-					switch(prog[i]){
-					case 'R':
-						if(tcp->res_t==tcp->resE){
-							if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
-								tcp->res_t = tcp->resS;
-								pi[pino].poc.resno0 = tcp->res_t;
-								pi[pino].poc.resno1 = tcp->res_t+1;
-								tcp->res_t+=1;
-								incr_top=1;
-							}else{
-								incr_top=0;
-							}
-						}else{
-							pi[pino].poc.resno0 = tcp->res_t;
-							pi[pino].poc.resno1 = tcp->res_t+1;
-							tcp->res_t+=1;
-							incr_top=0;
-						}
-						break;
-					case 'C':
-						if(tcp->comp_t ==tcp->compE){
-							if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
-								tcp->comp_t = tcp->compS;
-								pi[pino].poc.compno0 = tcp->comp_t;
-								pi[pino].poc.compno1 = tcp->comp_t+1;
-								tcp->comp_t+=1;
-								incr_top=1;
-							}else{
-								incr_top=0;
-							}
-						}else{
-							pi[pino].poc.compno0 = tcp->comp_t;
-							pi[pino].poc.compno1 = tcp->comp_t+1;
-							tcp->comp_t+=1;
-							incr_top=0;
-						}
-						break;
-					case 'L':
-						if(tcp->lay_t == tcp->layE){
-							if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
-								tcp->lay_t = tcp->layS;
-								pi[pino].poc.layno0 = tcp->lay_t;
-								pi[pino].poc.layno1 = tcp->lay_t+1;
-								tcp->lay_t+=1;
-								incr_top=1;
-							}else{
-								incr_top=0;
-							}
-						}else{
-							pi[pino].poc.layno0 = tcp->lay_t;
-							pi[pino].poc.layno1 = tcp->lay_t+1;
-							tcp->lay_t+=1;
-							incr_top=0;
-						}
-						break;
-					case 'P':
-						switch(tcp->prg){
-						case OPJ_LRCP:
-						case OPJ_RLCP:
-							if(tcp->prc_t == tcp->prcE){
-								if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
-									tcp->prc_t = tcp->prcS;
-									pi[pino].poc.precno0 = tcp->prc_t;
-									pi[pino].poc.precno1 = tcp->prc_t+1;
-									tcp->prc_t+=1;
-									incr_top=1;
-								}else{
-									incr_top=0;
-								}
-							}else{
-								pi[pino].poc.precno0 = tcp->prc_t;
-								pi[pino].poc.precno1 = tcp->prc_t+1;
-								tcp->prc_t+=1;
-								incr_top=0;
-							}
-							break;
-						default:
-							if(tcp->tx0_t >= tcp->txE){
-								if(tcp->ty0_t >= tcp->tyE){
-									if(opj_pi_check_next_level(i-1,cp,tileno,pino,prog)){
-										tcp->ty0_t = tcp->tyS;
-										pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
-										pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
-										tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
-										incr_top=1;resetX=1;
-									}else{
-										incr_top=0;resetX=0;
-									}
-								}else{
-									pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
-									pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
-									tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
-									incr_top=0;resetX=1;
-								}
-								if(resetX==1){
-									tcp->tx0_t = tcp->txS;
-									pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
-									pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx));
-									tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
-								}
-							}else{
-								pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
-								pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx- (tcp->tx0_t % tcp->dx));
-								tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
-								incr_top=0;
-							}
-							break;
-						}
-						break;
-					}
-				}
-			}
-		}
-	}
+        if (tpnum == 0) {
+            for (i = tppos; i >= 0; i--) {
+                switch (prog[i]) {
+                case 'C':
+                    tcp->comp_t = tcp->compS;
+                    pi[pino].poc.compno0 = tcp->comp_t;
+                    pi[pino].poc.compno1 = tcp->comp_t + 1;
+                    tcp->comp_t += 1;
+                    break;
+                case 'R':
+                    tcp->res_t = tcp->resS;
+                    pi[pino].poc.resno0 = tcp->res_t;
+                    pi[pino].poc.resno1 = tcp->res_t + 1;
+                    tcp->res_t += 1;
+                    break;
+                case 'L':
+                    tcp->lay_t = tcp->layS;
+                    pi[pino].poc.layno0 = tcp->lay_t;
+                    pi[pino].poc.layno1 = tcp->lay_t + 1;
+                    tcp->lay_t += 1;
+                    break;
+                case 'P':
+                    switch (tcp->prg) {
+                    case OPJ_LRCP:
+                    case OPJ_RLCP:
+                        tcp->prc_t = tcp->prcS;
+                        pi[pino].poc.precno0 = tcp->prc_t;
+                        pi[pino].poc.precno1 = tcp->prc_t + 1;
+                        tcp->prc_t += 1;
+                        break;
+                    default:
+                        tcp->tx0_t = tcp->txS;
+                        tcp->ty0_t = tcp->tyS;
+                        pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
+                        pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx));
+                        pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
+                        pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
+                        tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
+                        tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
+                        break;
+                    }
+                    break;
+                }
+            }
+            incr_top = 1;
+        } else {
+            for (i = tppos; i >= 0; i--) {
+                switch (prog[i]) {
+                case 'C':
+                    pi[pino].poc.compno0 = tcp->comp_t - 1;
+                    pi[pino].poc.compno1 = tcp->comp_t;
+                    break;
+                case 'R':
+                    pi[pino].poc.resno0 = tcp->res_t - 1;
+                    pi[pino].poc.resno1 = tcp->res_t;
+                    break;
+                case 'L':
+                    pi[pino].poc.layno0 = tcp->lay_t - 1;
+                    pi[pino].poc.layno1 = tcp->lay_t;
+                    break;
+                case 'P':
+                    switch (tcp->prg) {
+                    case OPJ_LRCP:
+                    case OPJ_RLCP:
+                        pi[pino].poc.precno0 = tcp->prc_t - 1;
+                        pi[pino].poc.precno1 = tcp->prc_t;
+                        break;
+                    default:
+                        pi[pino].poc.tx0 = (OPJ_INT32)(tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx));
+                        pi[pino].poc.tx1 = (OPJ_INT32)tcp->tx0_t ;
+                        pi[pino].poc.ty0 = (OPJ_INT32)(tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy));
+                        pi[pino].poc.ty1 = (OPJ_INT32)tcp->ty0_t ;
+                        break;
+                    }
+                    break;
+                }
+                if (incr_top == 1) {
+                    switch (prog[i]) {
+                    case 'R':
+                        if (tcp->res_t == tcp->resE) {
+                            if (opj_pi_check_next_level(i - 1, cp, tileno, pino, prog)) {
+                                tcp->res_t = tcp->resS;
+                                pi[pino].poc.resno0 = tcp->res_t;
+                                pi[pino].poc.resno1 = tcp->res_t + 1;
+                                tcp->res_t += 1;
+                                incr_top = 1;
+                            } else {
+                                incr_top = 0;
+                            }
+                        } else {
+                            pi[pino].poc.resno0 = tcp->res_t;
+                            pi[pino].poc.resno1 = tcp->res_t + 1;
+                            tcp->res_t += 1;
+                            incr_top = 0;
+                        }
+                        break;
+                    case 'C':
+                        if (tcp->comp_t == tcp->compE) {
+                            if (opj_pi_check_next_level(i - 1, cp, tileno, pino, prog)) {
+                                tcp->comp_t = tcp->compS;
+                                pi[pino].poc.compno0 = tcp->comp_t;
+                                pi[pino].poc.compno1 = tcp->comp_t + 1;
+                                tcp->comp_t += 1;
+                                incr_top = 1;
+                            } else {
+                                incr_top = 0;
+                            }
+                        } else {
+                            pi[pino].poc.compno0 = tcp->comp_t;
+                            pi[pino].poc.compno1 = tcp->comp_t + 1;
+                            tcp->comp_t += 1;
+                            incr_top = 0;
+                        }
+                        break;
+                    case 'L':
+                        if (tcp->lay_t == tcp->layE) {
+                            if (opj_pi_check_next_level(i - 1, cp, tileno, pino, prog)) {
+                                tcp->lay_t = tcp->layS;
+                                pi[pino].poc.layno0 = tcp->lay_t;
+                                pi[pino].poc.layno1 = tcp->lay_t + 1;
+                                tcp->lay_t += 1;
+                                incr_top = 1;
+                            } else {
+                                incr_top = 0;
+                            }
+                        } else {
+                            pi[pino].poc.layno0 = tcp->lay_t;
+                            pi[pino].poc.layno1 = tcp->lay_t + 1;
+                            tcp->lay_t += 1;
+                            incr_top = 0;
+                        }
+                        break;
+                    case 'P':
+                        switch (tcp->prg) {
+                        case OPJ_LRCP:
+                        case OPJ_RLCP:
+                            if (tcp->prc_t == tcp->prcE) {
+                                if (opj_pi_check_next_level(i - 1, cp, tileno, pino, prog)) {
+                                    tcp->prc_t = tcp->prcS;
+                                    pi[pino].poc.precno0 = tcp->prc_t;
+                                    pi[pino].poc.precno1 = tcp->prc_t + 1;
+                                    tcp->prc_t += 1;
+                                    incr_top = 1;
+                                } else {
+                                    incr_top = 0;
+                                }
+                            } else {
+                                pi[pino].poc.precno0 = tcp->prc_t;
+                                pi[pino].poc.precno1 = tcp->prc_t + 1;
+                                tcp->prc_t += 1;
+                                incr_top = 0;
+                            }
+                            break;
+                        default:
+                            if (tcp->tx0_t >= tcp->txE) {
+                                if (tcp->ty0_t >= tcp->tyE) {
+                                    if (opj_pi_check_next_level(i - 1, cp, tileno, pino, prog)) {
+                                        tcp->ty0_t = tcp->tyS;
+                                        pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
+                                        pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
+                                        tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
+                                        incr_top = 1;
+                                        resetX = 1;
+                                    } else {
+                                        incr_top = 0;
+                                        resetX = 0;
+                                    }
+                                } else {
+                                    pi[pino].poc.ty0 = (OPJ_INT32)tcp->ty0_t;
+                                    pi[pino].poc.ty1 = (OPJ_INT32)(tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy));
+                                    tcp->ty0_t = (OPJ_UINT32)pi[pino].poc.ty1;
+                                    incr_top = 0;
+                                    resetX = 1;
+                                }
+                                if (resetX == 1) {
+                                    tcp->tx0_t = tcp->txS;
+                                    pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
+                                    pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx));
+                                    tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
+                                }
+                            } else {
+                                pi[pino].poc.tx0 = (OPJ_INT32)tcp->tx0_t;
+                                pi[pino].poc.tx1 = (OPJ_INT32)(tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx));
+                                tcp->tx0_t = (OPJ_UINT32)pi[pino].poc.tx1;
+                                incr_top = 0;
+                            }
+                            break;
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+    }
 }
 
 void opj_pi_destroy(opj_pi_iterator_t *p_pi,
                     OPJ_UINT32 p_nb_elements)
 {
-	OPJ_UINT32 compno, pino;
-	opj_pi_iterator_t *l_current_pi = p_pi;
+    OPJ_UINT32 compno, pino;
+    opj_pi_iterator_t *l_current_pi = p_pi;
     if (p_pi) {
-		if (p_pi->include) {
-			opj_free(p_pi->include);
-			p_pi->include = 00;
-		}
-		for (pino = 0; pino < p_nb_elements; ++pino){
-			if(l_current_pi->comps) {
-				opj_pi_comp_t *l_current_component = l_current_pi->comps;
-                for (compno = 0; compno < l_current_pi->numcomps; compno++){
-                    if(l_current_component->resolutions) {
-						opj_free(l_current_component->resolutions);
-						l_current_component->resolutions = 00;
-					}
+        if (p_pi->include) {
+            opj_free(p_pi->include);
+            p_pi->include = 00;
+        }
+        for (pino = 0; pino < p_nb_elements; ++pino) {
+            if (l_current_pi->comps) {
+                opj_pi_comp_t *l_current_component = l_current_pi->comps;
+                for (compno = 0; compno < l_current_pi->numcomps; compno++) {
+                    if (l_current_component->resolutions) {
+                        opj_free(l_current_component->resolutions);
+                        l_current_component->resolutions = 00;
+                    }
 
-					++l_current_component;
-				}
-				opj_free(l_current_pi->comps);
-				l_current_pi->comps = 0;
-			}
-			++l_current_pi;
-		}
-		opj_free(p_pi);
-	}
+                    ++l_current_component;
+                }
+                opj_free(l_current_pi->comps);
+                l_current_pi->comps = 0;
+            }
+            ++l_current_pi;
+        }
+        opj_free(p_pi);
+    }
 }
 
 
 
-void opj_pi_update_encoding_parameters(	const opj_image_t *p_image,
-                                        opj_cp_t *p_cp,
-                                        OPJ_UINT32 p_tile_no )
+void opj_pi_update_encoding_parameters(const opj_image_t *p_image,
+                                       opj_cp_t *p_cp,
+                                       OPJ_UINT32 p_tile_no)
 {
-	/* encoding parameters to set */
-	OPJ_UINT32 l_max_res;
-	OPJ_UINT32 l_max_prec;
-	OPJ_INT32 l_tx0,l_tx1,l_ty0,l_ty1;
-	OPJ_UINT32 l_dx_min,l_dy_min;
+    /* encoding parameters to set */
+    OPJ_UINT32 l_max_res;
+    OPJ_UINT32 l_max_prec;
+    OPJ_INT32 l_tx0, l_tx1, l_ty0, l_ty1;
+    OPJ_UINT32 l_dx_min, l_dy_min;
 
-	/* pointers */
-	opj_tcp_t *l_tcp = 00;
+    /* pointers */
+    opj_tcp_t *l_tcp = 00;
 
-	/* preconditions */
-	assert(p_cp != 00);
-	assert(p_image != 00);
-	assert(p_tile_no < p_cp->tw * p_cp->th);
+    /* preconditions */
+    assert(p_cp != 00);
+    assert(p_image != 00);
+    assert(p_tile_no < p_cp->tw * p_cp->th);
 
-	l_tcp = &(p_cp->tcps[p_tile_no]);
+    l_tcp = &(p_cp->tcps[p_tile_no]);
 
-	/* get encoding parameters */
-	opj_get_encoding_parameters(p_image,p_cp,p_tile_no,&l_tx0,&l_tx1,&l_ty0,&l_ty1,&l_dx_min,&l_dy_min,&l_max_prec,&l_max_res);
+    /* get encoding parameters */
+    opj_get_encoding_parameters(p_image, p_cp, p_tile_no, &l_tx0, &l_tx1, &l_ty0,
+                                &l_ty1, &l_dx_min, &l_dy_min, &l_max_prec, &l_max_res);
 
-	if (l_tcp->POC) {
-		opj_pi_update_encode_poc_and_final(p_cp,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
-	}
-	else {
-		opj_pi_update_encode_not_poc(p_cp,p_image->numcomps,p_tile_no,l_tx0,l_tx1,l_ty0,l_ty1,l_max_prec,l_max_res,l_dx_min,l_dy_min);
-	}
+    if (l_tcp->POC) {
+        opj_pi_update_encode_poc_and_final(p_cp, p_tile_no, l_tx0, l_tx1, l_ty0, l_ty1,
+                                           l_max_prec, l_max_res, l_dx_min, l_dy_min);
+    } else {
+        opj_pi_update_encode_not_poc(p_cp, p_image->numcomps, p_tile_no, l_tx0, l_tx1,
+                                     l_ty0, l_ty1, l_max_prec, l_max_res, l_dx_min, l_dy_min);
+    }
 }
 
-OPJ_BOOL opj_pi_next(opj_pi_iterator_t * pi) {
-	switch (pi->poc.prg) {
-		case OPJ_LRCP:
-			return opj_pi_next_lrcp(pi);
-		case OPJ_RLCP:
-			return opj_pi_next_rlcp(pi);
-		case OPJ_RPCL:
-			return opj_pi_next_rpcl(pi);
-		case OPJ_PCRL:
-			return opj_pi_next_pcrl(pi);
-		case OPJ_CPRL:
-			return opj_pi_next_cprl(pi);
-		case OPJ_PROG_UNKNOWN:
-			return OPJ_FALSE;
-	}
-	
-	return OPJ_FALSE;
+OPJ_BOOL opj_pi_next(opj_pi_iterator_t * pi)
+{
+    switch (pi->poc.prg) {
+    case OPJ_LRCP:
+        return opj_pi_next_lrcp(pi);
+    case OPJ_RLCP:
+        return opj_pi_next_rlcp(pi);
+    case OPJ_RPCL:
+        return opj_pi_next_rpcl(pi);
+    case OPJ_PCRL:
+        return opj_pi_next_pcrl(pi);
+    case OPJ_CPRL:
+        return opj_pi_next_cprl(pi);
+    case OPJ_PROG_UNKNOWN:
+        return OPJ_FALSE;
+    }
+
+    return OPJ_FALSE;
 }
diff --git a/third_party/libopenjpeg20/pi.h b/third_party/libopenjpeg20/pi.h
index 265d5b1..8c0dc25 100644
--- a/third_party/libopenjpeg20/pi.h
+++ b/third_party/libopenjpeg20/pi.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,7 +8,7 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
@@ -35,8 +35,8 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef __PI_H
-#define __PI_H
+#ifndef OPJ_PI_H
+#define OPJ_PI_H
 /**
 @file pi.h
 @brief Implementation of a packet iterator (PI)
@@ -53,58 +53,60 @@
 FIXME DOC
 */
 typedef struct opj_pi_resolution {
-  OPJ_UINT32 pdx, pdy;
-  OPJ_UINT32 pw, ph;
+    OPJ_UINT32 pdx, pdy;
+    OPJ_UINT32 pw, ph;
 } opj_pi_resolution_t;
 
 /**
 FIXME DOC
 */
 typedef struct opj_pi_comp {
-  OPJ_UINT32 dx, dy;
-  /** number of resolution levels */
-  OPJ_UINT32 numresolutions;
-  opj_pi_resolution_t *resolutions;
+    OPJ_UINT32 dx, dy;
+    /** number of resolution levels */
+    OPJ_UINT32 numresolutions;
+    opj_pi_resolution_t *resolutions;
 } opj_pi_comp_t;
 
 /**
 Packet iterator
 */
 typedef struct opj_pi_iterator {
-  /** Enabling Tile part generation*/
-  OPJ_BYTE tp_on;
-  /** precise if the packet has been already used (useful for progression order change) */
-  OPJ_INT16 *include;
-  /** layer step used to localize the packet in the include vector */
-  OPJ_UINT32 step_l;
-  /** resolution step used to localize the packet in the include vector */
-  OPJ_UINT32 step_r;
-  /** component step used to localize the packet in the include vector */
-  OPJ_UINT32 step_c;
-  /** precinct step used to localize the packet in the include vector */
-  OPJ_UINT32 step_p;
-  /** component that identify the packet */
-  OPJ_UINT32 compno;
-  /** resolution that identify the packet */
-  OPJ_UINT32 resno;
-  /** precinct that identify the packet */
-  OPJ_UINT32 precno;
-  /** layer that identify the packet */
-  OPJ_UINT32 layno;
-  /** 0 if the first packet */
-  OPJ_BOOL first;
-  /** progression order change information */
-  opj_poc_t poc;
-  /** number of components in the image */
-  OPJ_UINT32 numcomps;
-  /** Components*/
-  opj_pi_comp_t *comps;
-  /** FIXME DOC*/
-  OPJ_INT32 tx0, ty0, tx1, ty1;
-  /** FIXME DOC*/
-  OPJ_INT32 x, y;
-  /** FIXME DOC*/
-  OPJ_UINT32 dx, dy;
+    /** Enabling Tile part generation*/
+    OPJ_BYTE tp_on;
+    /** precise if the packet has been already used (useful for progression order change) */
+    OPJ_INT16 *include;
+    /** Number of elements in include array */
+    OPJ_UINT32 include_size;
+    /** layer step used to localize the packet in the include vector */
+    OPJ_UINT32 step_l;
+    /** resolution step used to localize the packet in the include vector */
+    OPJ_UINT32 step_r;
+    /** component step used to localize the packet in the include vector */
+    OPJ_UINT32 step_c;
+    /** precinct step used to localize the packet in the include vector */
+    OPJ_UINT32 step_p;
+    /** component that identify the packet */
+    OPJ_UINT32 compno;
+    /** resolution that identify the packet */
+    OPJ_UINT32 resno;
+    /** precinct that identify the packet */
+    OPJ_UINT32 precno;
+    /** layer that identify the packet */
+    OPJ_UINT32 layno;
+    /** 0 if the first packet */
+    OPJ_BOOL first;
+    /** progression order change information */
+    opj_poc_t poc;
+    /** number of components in the image */
+    OPJ_UINT32 numcomps;
+    /** Components*/
+    opj_pi_comp_t *comps;
+    /** FIXME DOC*/
+    OPJ_INT32 tx0, ty0, tx1, ty1;
+    /** FIXME DOC*/
+    OPJ_INT32 x, y;
+    /** FIXME DOC*/
+    OPJ_UINT32 dx, dy;
 } opj_pi_iterator_t;
 
 /** @name Exported functions */
@@ -113,28 +115,28 @@
 /**
  * Creates a packet iterator for encoding.
  *
- * @param	image		the image being encoded.
- * @param	cp		the coding parameters.
- * @param	tileno	index of the tile being encoded.
- * @param	t2_mode	the type of pass for generating the packet iterator
+ * @param   image       the image being encoded.
+ * @param   cp      the coding parameters.
+ * @param   tileno  index of the tile being encoded.
+ * @param   t2_mode the type of pass for generating the packet iterator
  *
- * @return	a list of packet iterator that points to the first packet of the tile (not true).
+ * @return  a list of packet iterator that points to the first packet of the tile (not true).
 */
 opj_pi_iterator_t *opj_pi_initialise_encode(const opj_image_t *image,
-                                            opj_cp_t *cp,
-                                            OPJ_UINT32 tileno,
-                                            J2K_T2_MODE t2_mode);
+        opj_cp_t *cp,
+        OPJ_UINT32 tileno,
+        J2K_T2_MODE t2_mode);
 
 /**
  * Updates the encoding parameters of the codec.
  *
- * @param	p_image		the image being encoded.
- * @param	p_cp		the coding parameters.
- * @param	p_tile_no	index of the tile being encoded.
+ * @param   p_image     the image being encoded.
+ * @param   p_cp        the coding parameters.
+ * @param   p_tile_no   index of the tile being encoded.
 */
-void opj_pi_update_encoding_parameters(	const opj_image_t *p_image,
-                                        opj_cp_t *p_cp,
-                                        OPJ_UINT32 p_tile_no );
+void opj_pi_update_encoding_parameters(const opj_image_t *p_image,
+                                       opj_cp_t *p_cp,
+                                       OPJ_UINT32 p_tile_no);
 
 /**
 Modify the packet iterator for enabling tile part generation
@@ -146,13 +148,13 @@
 @param tppos The position of the tile part flag in the progression order
 @param t2_mode FIXME DOC
 */
-void opj_pi_create_encode(  opj_pi_iterator_t *pi, 
-                            opj_cp_t *cp,
-                            OPJ_UINT32 tileno, 
-                            OPJ_UINT32 pino,
-                            OPJ_UINT32 tpnum, 
-                            OPJ_INT32 tppos, 
-                            J2K_T2_MODE t2_mode);
+void opj_pi_create_encode(opj_pi_iterator_t *pi,
+                          opj_cp_t *cp,
+                          OPJ_UINT32 tileno,
+                          OPJ_UINT32 pino,
+                          OPJ_UINT32 tpnum,
+                          OPJ_INT32 tppos,
+                          J2K_T2_MODE t2_mode);
 
 /**
 Create a packet iterator for Decoder
@@ -162,14 +164,14 @@
 @return Returns a packet iterator that points to the first packet of the tile
 @see opj_pi_destroy
 */
-opj_pi_iterator_t *opj_pi_create_decode(opj_image_t * image, 
+opj_pi_iterator_t *opj_pi_create_decode(opj_image_t * image,
                                         opj_cp_t * cp,
                                         OPJ_UINT32 tileno);
 /**
  * Destroys a packet iterator array.
  *
- * @param	p_pi			the packet iterator array to destroy.
- * @param	p_nb_elements	the number of elements in the array.
+ * @param   p_pi            the packet iterator array to destroy.
+ * @param   p_nb_elements   the number of elements in the array.
  */
 void opj_pi_destroy(opj_pi_iterator_t *p_pi,
                     OPJ_UINT32 p_nb_elements);
@@ -185,4 +187,4 @@
 
 /*@}*/
 
-#endif /* __PI_H */
+#endif /* OPJ_PI_H */
diff --git a/third_party/libopenjpeg20/raw.c b/third_party/libopenjpeg20/raw.c
deleted file mode 100644
index 2498761..0000000
--- a/third_party/libopenjpeg20/raw.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
- * party and contributor rights, including patent rights, and no such rights
- * are granted under this license.
- *
- * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2014, Professor Benoit Macq
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
- * Copyright (c) 2003-2014, Antonin Descampe
- * Copyright (c) 2005, Herve 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"
-
-/* 
-==========================================================
-   local functions
-==========================================================
-*/
-
-
-/* 
-==========================================================
-   RAW encoding interface
-==========================================================
-*/
-
-opj_raw_t* opj_raw_create(void) {
-	opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t));
-	return raw;
-}
-
-void opj_raw_destroy(opj_raw_t *raw) {
-	if(raw) {
-		opj_free(raw);
-	}
-}
-
-OPJ_UINT32 opj_raw_numbytes(opj_raw_t *raw) {
-	const ptrdiff_t diff = raw->bp - raw->start;
-  assert( diff <= (ptrdiff_t)0xffffffff && diff >= 0 ); /* UINT32_MAX */
-	return (OPJ_UINT32)diff;
-}
-
-void opj_raw_init_dec(opj_raw_t *raw, OPJ_BYTE *bp, OPJ_UINT32 len) {
-	raw->start = bp;
-	raw->lenmax = len;
-	raw->len = 0;
-	raw->c = 0;
-	raw->ct = 0;
-}
-
-OPJ_UINT32 opj_raw_decode(opj_raw_t *raw) {
-	OPJ_UINT32 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;
-}
-
diff --git a/third_party/libopenjpeg20/raw.h b/third_party/libopenjpeg20/raw.h
deleted file mode 100644
index 572c666..0000000
--- a/third_party/libopenjpeg20/raw.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
- * party and contributor rights, including patent rights, and no such rights
- * are granted under this license.
- *
- * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
- * Copyright (c) 2002-2014, Professor Benoit Macq
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
- * Copyright (c) 2003-2014, Antonin Descampe
- * Copyright (c) 2005, Herve 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 __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 */
-	OPJ_BYTE c;
-	/** number of bits already read or free to write */
-	OPJ_UINT32 ct;
-	/** maximum length to decode */
-	OPJ_UINT32 lenmax;
-	/** length decoded */
-	OPJ_UINT32 len;
-	/** pointer to the current position in the buffer */
-	OPJ_BYTE *bp;
-	/** pointer to the start of the buffer */
-	OPJ_BYTE *start;
-	/** pointer to the end of the buffer */
-	OPJ_BYTE *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* opj_raw_create(void);
-/**
-Destroy a previously created RAW handle
-@param raw RAW handle to destroy
-*/
-void opj_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
-*/
-OPJ_UINT32 opj_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 opj_raw_init_dec(opj_raw_t *raw, OPJ_BYTE *bp, OPJ_UINT32 len);
-/**
-Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN
-@param raw RAW handle
-@return Returns the decoded symbol (0 or 1)
-*/
-OPJ_UINT32 opj_raw_decode(opj_raw_t *raw);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __RAW_H */
diff --git a/third_party/libopenjpeg20/t1.c b/third_party/libopenjpeg20/t1.c
index d290c38..bd1a880 100644
--- a/third_party/libopenjpeg20/t1.c
+++ b/third_party/libopenjpeg20/t1.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,10 +8,12 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
+ * Copyright (c) 2012, Carl Hetherington
+ * Copyright (c) 2017, IntoPIX SA <support@intopix.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -42,244 +44,138 @@
 /** @defgroup T1 T1 - Implementation of the tier-1 coding */
 /*@{*/
 
+#define T1_FLAGS(x, y) (t1->flags[x + 1 + ((y / 4) + 1) * (t1->w+2)])
+
+#define opj_t1_setcurctx(curctx, ctxno)  curctx = &(mqc)->ctxs[(OPJ_UINT32)(ctxno)]
+
 /** @name Local static functions */
 /*@{*/
 
-static INLINE OPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient);
-static OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f);
+static INLINE OPJ_BYTE opj_t1_getctxno_zc(opj_mqc_t *mqc, OPJ_UINT32 f);
 static INLINE OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f);
-static OPJ_BYTE opj_t1_getspb(OPJ_UINT32 f);
 static OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos);
 static OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos);
-static void opj_t1_updateflags(opj_flag_t *flagsp, OPJ_UINT32 s, OPJ_UINT32 stride);
-/**
-Encode significant pass
-*/
-static void opj_t1_enc_sigpass_step(opj_t1_t *t1,
-                                    opj_flag_t *flagsp,
-                                    OPJ_INT32 *datap,
-                                    OPJ_UINT32 orient,
-                                    OPJ_INT32 bpno,
-                                    OPJ_INT32 one,
-                                    OPJ_INT32 *nmsedec,
-                                    OPJ_BYTE type,
-                                    OPJ_UINT32 vsc);
+static INLINE void opj_t1_update_flags(opj_flag_t *flagsp, OPJ_UINT32 ci,
+                                       OPJ_UINT32 s, OPJ_UINT32 stride,
+                                       OPJ_UINT32 vsc);
+
 
 /**
 Decode significant pass
 */
-#if 0
-static void opj_t1_dec_sigpass_step(opj_t1_t *t1,
-                                    opj_flag_t *flagsp,
-                                    OPJ_INT32 *datap,
-                                    OPJ_UINT32 orient,
-                                    OPJ_INT32 oneplushalf,
-                                    OPJ_BYTE type,
-                                    OPJ_UINT32 vsc);
-#endif
 
 static INLINE void opj_t1_dec_sigpass_step_raw(
-                opj_t1_t *t1,
-                opj_flag_t *flagsp,
-                OPJ_INT32 *datap,
-                OPJ_INT32 orient,
-                OPJ_INT32 oneplushalf,
-                OPJ_INT32 vsc);
+    opj_t1_t *t1,
+    opj_flag_t *flagsp,
+    OPJ_INT32 *datap,
+    OPJ_INT32 oneplushalf,
+    OPJ_UINT32 vsc,
+    OPJ_UINT32 row);
 static INLINE void opj_t1_dec_sigpass_step_mqc(
-                opj_t1_t *t1,
-                opj_flag_t *flagsp,
-                OPJ_INT32 *datap,
-                OPJ_INT32 orient,
-                OPJ_INT32 oneplushalf);
-static INLINE void opj_t1_dec_sigpass_step_mqc_vsc(
-                opj_t1_t *t1,
-                opj_flag_t *flagsp,
-                OPJ_INT32 *datap,
-                OPJ_INT32 orient,
-                OPJ_INT32 oneplushalf,
-                OPJ_INT32 vsc);
-
+    opj_t1_t *t1,
+    opj_flag_t *flagsp,
+    OPJ_INT32 *datap,
+    OPJ_INT32 oneplushalf,
+    OPJ_UINT32 row,
+    OPJ_UINT32 flags_stride,
+    OPJ_UINT32 vsc);
 
 /**
 Encode significant pass
 */
-static void opj_t1_enc_sigpass( opj_t1_t *t1,
-                                OPJ_INT32 bpno,
-                                OPJ_UINT32 orient,
-                                OPJ_INT32 *nmsedec,
-                                OPJ_BYTE type,
-                                OPJ_UINT32 cblksty);
+static void opj_t1_enc_sigpass(opj_t1_t *t1,
+                               OPJ_INT32 bpno,
+                               OPJ_INT32 *nmsedec,
+                               OPJ_BYTE type,
+                               OPJ_UINT32 cblksty);
 
 /**
 Decode significant pass
 */
 static void opj_t1_dec_sigpass_raw(
-                opj_t1_t *t1,
-                OPJ_INT32 bpno,
-                OPJ_INT32 orient,
-                OPJ_INT32 cblksty);
-static void opj_t1_dec_sigpass_mqc(
-                opj_t1_t *t1,
-                OPJ_INT32 bpno,
-                OPJ_INT32 orient);
-static void opj_t1_dec_sigpass_mqc_vsc(
-                opj_t1_t *t1,
-                OPJ_INT32 bpno,
-                OPJ_INT32 orient);
-
-
+    opj_t1_t *t1,
+    OPJ_INT32 bpno,
+    OPJ_INT32 cblksty);
 
 /**
 Encode refinement pass
 */
-static void opj_t1_enc_refpass_step(opj_t1_t *t1,
-                                    opj_flag_t *flagsp,
-                                    OPJ_INT32 *datap,
-                                    OPJ_INT32 bpno,
-                                    OPJ_INT32 one,
-                                    OPJ_INT32 *nmsedec,
-                                    OPJ_BYTE type,
-                                    OPJ_UINT32 vsc);
-
-
-/**
-Encode refinement pass
-*/
-static void opj_t1_enc_refpass( opj_t1_t *t1,
-                                OPJ_INT32 bpno,
-                                OPJ_INT32 *nmsedec,
-                                OPJ_BYTE type,
-                                OPJ_UINT32 cblksty);
+static void opj_t1_enc_refpass(opj_t1_t *t1,
+                               OPJ_INT32 bpno,
+                               OPJ_INT32 *nmsedec,
+                               OPJ_BYTE type);
 
 /**
 Decode refinement pass
 */
 static void opj_t1_dec_refpass_raw(
-                opj_t1_t *t1,
-                OPJ_INT32 bpno,
-                OPJ_INT32 cblksty);
-static void opj_t1_dec_refpass_mqc(
-                opj_t1_t *t1,
-                OPJ_INT32 bpno);
-static void opj_t1_dec_refpass_mqc_vsc(
-                opj_t1_t *t1,
-                OPJ_INT32 bpno);
+    opj_t1_t *t1,
+    OPJ_INT32 bpno);
 
 
 /**
 Decode refinement pass
 */
-#if 0
-static void opj_t1_dec_refpass_step(opj_t1_t *t1,
-                                    opj_flag_t *flagsp,
-                                    OPJ_INT32 *datap,
-                                    OPJ_INT32 poshalf,
-                                    OPJ_INT32 neghalf,
-                                    OPJ_BYTE type,
-                                    OPJ_UINT32 vsc);
-#endif
 
 static INLINE void  opj_t1_dec_refpass_step_raw(
-                opj_t1_t *t1,
-                opj_flag_t *flagsp,
-                OPJ_INT32 *datap,
-                OPJ_INT32 poshalf,
-                OPJ_INT32 neghalf,
-                OPJ_INT32 vsc);
+    opj_t1_t *t1,
+    opj_flag_t *flagsp,
+    OPJ_INT32 *datap,
+    OPJ_INT32 poshalf,
+    OPJ_UINT32 row);
 static INLINE void opj_t1_dec_refpass_step_mqc(
-                opj_t1_t *t1,
-                opj_flag_t *flagsp,
-                OPJ_INT32 *datap,
-                OPJ_INT32 poshalf,
-                OPJ_INT32 neghalf);
-static INLINE void opj_t1_dec_refpass_step_mqc_vsc(
-                opj_t1_t *t1,
-                opj_flag_t *flagsp,
-                OPJ_INT32 *datap,
-                OPJ_INT32 poshalf,
-                OPJ_INT32 neghalf,
-                OPJ_INT32 vsc);
+    opj_t1_t *t1,
+    opj_flag_t *flagsp,
+    OPJ_INT32 *datap,
+    OPJ_INT32 poshalf,
+    OPJ_UINT32 row);
 
 
-
-/**
-Encode clean-up pass
-*/
-static void opj_t1_enc_clnpass_step(
-		opj_t1_t *t1,
-		opj_flag_t *flagsp,
-		OPJ_INT32 *datap,
-		OPJ_UINT32 orient,
-		OPJ_INT32 bpno,
-		OPJ_INT32 one,
-		OPJ_INT32 *nmsedec,
-		OPJ_UINT32 partial,
-		OPJ_UINT32 vsc);
 /**
 Decode clean-up pass
 */
-static void opj_t1_dec_clnpass_step_partial(
-		opj_t1_t *t1,
-		opj_flag_t *flagsp,
-		OPJ_INT32 *datap,
-		OPJ_INT32 orient,
-		OPJ_INT32 oneplushalf);
+
 static void opj_t1_dec_clnpass_step(
-		opj_t1_t *t1,
-		opj_flag_t *flagsp,
-		OPJ_INT32 *datap,
-		OPJ_INT32 orient,
-		OPJ_INT32 oneplushalf);
-static void opj_t1_dec_clnpass_step_vsc(
-		opj_t1_t *t1,
-		opj_flag_t *flagsp,
-		OPJ_INT32 *datap,
-		OPJ_INT32 orient,
-		OPJ_INT32 oneplushalf,
-		OPJ_INT32 partial,
-		OPJ_INT32 vsc);
+    opj_t1_t *t1,
+    opj_flag_t *flagsp,
+    OPJ_INT32 *datap,
+    OPJ_INT32 oneplushalf,
+    OPJ_UINT32 row,
+    OPJ_UINT32 vsc);
+
 /**
 Encode clean-up pass
 */
 static void opj_t1_enc_clnpass(
-		opj_t1_t *t1,
-		OPJ_INT32 bpno,
-		OPJ_UINT32 orient,
-		OPJ_INT32 *nmsedec,
-		OPJ_UINT32 cblksty);
-/**
-Decode clean-up pass
-*/
-static void opj_t1_dec_clnpass(
-		opj_t1_t *t1,
-		OPJ_INT32 bpno,
-		OPJ_INT32 orient,
-		OPJ_INT32 cblksty);
+    opj_t1_t *t1,
+    OPJ_INT32 bpno,
+    OPJ_INT32 *nmsedec,
+    OPJ_UINT32 cblksty);
 
 static OPJ_FLOAT64 opj_t1_getwmsedec(
-		OPJ_INT32 nmsedec,
-		OPJ_UINT32 compno,
-		OPJ_UINT32 level,
-		OPJ_UINT32 orient,
-		OPJ_INT32 bpno,
-		OPJ_UINT32 qmfbid,
-		OPJ_FLOAT64 stepsize,
-		OPJ_UINT32 numcomps,
-		const OPJ_FLOAT64 * mct_norms,
-		OPJ_UINT32 mct_numcomps);
+    OPJ_INT32 nmsedec,
+    OPJ_UINT32 compno,
+    OPJ_UINT32 level,
+    OPJ_UINT32 orient,
+    OPJ_INT32 bpno,
+    OPJ_UINT32 qmfbid,
+    OPJ_FLOAT64 stepsize,
+    OPJ_UINT32 numcomps,
+    const OPJ_FLOAT64 * mct_norms,
+    OPJ_UINT32 mct_numcomps);
 
-static void opj_t1_encode_cblk( opj_t1_t *t1,
-                                opj_tcd_cblk_enc_t* cblk,
-                                OPJ_UINT32 orient,
-                                OPJ_UINT32 compno,
-                                OPJ_UINT32 level,
-                                OPJ_UINT32 qmfbid,
-                                OPJ_FLOAT64 stepsize,
-                                OPJ_UINT32 cblksty,
-                                OPJ_UINT32 numcomps,
-                                opj_tcd_tile_t * tile,
-                                const OPJ_FLOAT64 * mct_norms,
-                                OPJ_UINT32 mct_numcomps);
+static void opj_t1_encode_cblk(opj_t1_t *t1,
+                               opj_tcd_cblk_enc_t* cblk,
+                               OPJ_UINT32 orient,
+                               OPJ_UINT32 compno,
+                               OPJ_UINT32 level,
+                               OPJ_UINT32 qmfbid,
+                               OPJ_FLOAT64 stepsize,
+                               OPJ_UINT32 cblksty,
+                               OPJ_UINT32 numcomps,
+                               opj_tcd_tile_t * tile,
+                               const OPJ_FLOAT64 * mct_norms,
+                               OPJ_UINT32 mct_numcomps);
 
 /**
 Decode 1 code-block
@@ -288,16 +184,22 @@
 @param orient
 @param roishift Region of interest shifting value
 @param cblksty Code-block style
+@param p_manager the event manager
+@param p_manager_mutex mutex for the event manager
+@param check_pterm whether PTERM correct termination should be checked
 */
-static OPJ_BOOL opj_t1_decode_cblk( opj_t1_t *t1,
-                                    opj_tcd_cblk_dec_t* cblk,
-                                    OPJ_UINT32 orient,
-                                    OPJ_UINT32 roishift,
-                                    OPJ_UINT32 cblksty);
+static OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
+                                   opj_tcd_cblk_dec_t* cblk,
+                                   OPJ_UINT32 orient,
+                                   OPJ_UINT32 roishift,
+                                   OPJ_UINT32 cblksty,
+                                   opj_event_mgr_t *p_manager,
+                                   opj_mutex_t* p_manager_mutex,
+                                   OPJ_BOOL check_pterm);
 
-static OPJ_BOOL opj_t1_allocate_buffers(   opj_t1_t *t1,
-                                    OPJ_UINT32 w,
-                                    OPJ_UINT32 h);
+static OPJ_BOOL opj_t1_allocate_buffers(opj_t1_t *t1,
+                                        OPJ_UINT32 w,
+                                        OPJ_UINT32 h);
 
 /*@}*/
 
@@ -305,907 +207,1356 @@
 
 /* ----------------------------------------------------------------------- */
 
-static OPJ_BYTE opj_t1_getctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient) {
-	return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
+static INLINE OPJ_BYTE opj_t1_getctxno_zc(opj_mqc_t *mqc, OPJ_UINT32 f)
+{
+    return mqc->lut_ctxno_zc_orient[(f & T1_SIGMA_NEIGHBOURS)];
 }
 
-static OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 f) {
-	return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
+static INLINE OPJ_UINT32 opj_t1_getctxtno_sc_or_spb_index(OPJ_UINT32 fX,
+        OPJ_UINT32 pfX,
+        OPJ_UINT32 nfX,
+        OPJ_UINT32 ci)
+{
+    /*
+      0 pfX T1_CHI_THIS           T1_LUT_SGN_W
+      1 tfX T1_SIGMA_1            T1_LUT_SIG_N
+      2 nfX T1_CHI_THIS           T1_LUT_SGN_E
+      3 tfX T1_SIGMA_3            T1_LUT_SIG_W
+      4  fX T1_CHI_(THIS - 1)     T1_LUT_SGN_N
+      5 tfX T1_SIGMA_5            T1_LUT_SIG_E
+      6  fX T1_CHI_(THIS + 1)     T1_LUT_SGN_S
+      7 tfX T1_SIGMA_7            T1_LUT_SIG_S
+    */
+
+    OPJ_UINT32 lu = (fX >> (ci * 3U)) & (T1_SIGMA_1 | T1_SIGMA_3 | T1_SIGMA_5 |
+                                         T1_SIGMA_7);
+
+    lu |= (pfX >> (T1_CHI_THIS_I      + (ci * 3U))) & (1U << 0);
+    lu |= (nfX >> (T1_CHI_THIS_I - 2U + (ci * 3U))) & (1U << 2);
+    if (ci == 0U) {
+        lu |= (fX >> (T1_CHI_0_I - 4U)) & (1U << 4);
+    } else {
+        lu |= (fX >> (T1_CHI_1_I - 4U + ((ci - 1U) * 3U))) & (1U << 4);
+    }
+    lu |= (fX >> (T1_CHI_2_I - 6U + (ci * 3U))) & (1U << 6);
+    return lu;
 }
 
-static OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f) {
-	OPJ_UINT32 tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG;
-	OPJ_UINT32 tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1;
-	return (tmp2);
+static INLINE OPJ_BYTE opj_t1_getctxno_sc(OPJ_UINT32 lu)
+{
+    return lut_ctxno_sc[lu];
 }
 
-static OPJ_BYTE opj_t1_getspb(OPJ_UINT32 f) {
-	return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
+static INLINE OPJ_UINT32 opj_t1_getctxno_mag(OPJ_UINT32 f)
+{
+    OPJ_UINT32 tmp = (f & T1_SIGMA_NEIGHBOURS) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG;
+    OPJ_UINT32 tmp2 = (f & T1_MU_0) ? T1_CTXNO_MAG + 2 : tmp;
+    return tmp2;
 }
 
-static OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos) {
-	if (bitpos > 0) {
-		return lut_nmsedec_sig[(x >> (bitpos)) & ((1 << T1_NMSEDEC_BITS) - 1)];
-	}
-	
-	return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
+static INLINE OPJ_BYTE opj_t1_getspb(OPJ_UINT32 lu)
+{
+    return lut_spb[lu];
 }
 
-static OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos) {
-	if (bitpos > 0) {
-		return lut_nmsedec_ref[(x >> (bitpos)) & ((1 << T1_NMSEDEC_BITS) - 1)];
-	}
+static OPJ_INT16 opj_t1_getnmsedec_sig(OPJ_UINT32 x, OPJ_UINT32 bitpos)
+{
+    if (bitpos > 0) {
+        return lut_nmsedec_sig[(x >> (bitpos)) & ((1 << T1_NMSEDEC_BITS) - 1)];
+    }
+
+    return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
+}
+
+static OPJ_INT16 opj_t1_getnmsedec_ref(OPJ_UINT32 x, OPJ_UINT32 bitpos)
+{
+    if (bitpos > 0) {
+        return lut_nmsedec_ref[(x >> (bitpos)) & ((1 << T1_NMSEDEC_BITS) - 1)];
+    }
 
     return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
 }
 
-static void opj_t1_updateflags(opj_flag_t *flagsp, OPJ_UINT32 s, OPJ_UINT32 stride) {
-	opj_flag_t *np = flagsp - stride;
-	opj_flag_t *sp = flagsp + stride;
-
-	static const opj_flag_t mod[] = {
-		T1_SIG_S, T1_SIG_S|T1_SGN_S,
-		T1_SIG_E, T1_SIG_E|T1_SGN_E,
-		T1_SIG_W, T1_SIG_W|T1_SGN_W,
-		T1_SIG_N, T1_SIG_N|T1_SGN_N
-	};
-
-	np[-1] |= T1_SIG_SE;
-	np[0]  |= mod[s];
-	np[1]  |= T1_SIG_SW;
-
-	flagsp[-1] |= mod[s+2];
-	flagsp[0]  |= T1_SIG;
-	flagsp[1]  |= mod[s+4];
-
-	sp[-1] |= T1_SIG_NE;
-	sp[0]  |= mod[s+6];
-	sp[1]  |= T1_SIG_NW;
+#define opj_t1_update_flags_macro(flags, flagsp, ci, s, stride, vsc) \
+{ \
+    /* east */ \
+    flagsp[-1] |= T1_SIGMA_5 << (3U * ci); \
+ \
+    /* mark target as significant */ \
+    flags |= ((s << T1_CHI_1_I) | T1_SIGMA_4) << (3U * ci); \
+ \
+    /* west */ \
+    flagsp[1] |= T1_SIGMA_3 << (3U * ci); \
+ \
+    /* north-west, north, north-east */ \
+    if (ci == 0U && !(vsc)) { \
+        opj_flag_t* north = flagsp - (stride); \
+        *north |= (s << T1_CHI_5_I) | T1_SIGMA_16; \
+        north[-1] |= T1_SIGMA_17; \
+        north[1] |= T1_SIGMA_15; \
+    } \
+ \
+    /* south-west, south, south-east */ \
+    if (ci == 3U) { \
+        opj_flag_t* south = flagsp + (stride); \
+        *south |= (s << T1_CHI_0_I) | T1_SIGMA_1; \
+        south[-1] |= T1_SIGMA_2; \
+        south[1] |= T1_SIGMA_0; \
+    } \
 }
 
-static void opj_t1_enc_sigpass_step(   opj_t1_t *t1,
-                                opj_flag_t *flagsp,
-                                OPJ_INT32 *datap,
-                                OPJ_UINT32 orient,
-                                OPJ_INT32 bpno,
-                                OPJ_INT32 one,
-                                OPJ_INT32 *nmsedec,
-                                OPJ_BYTE type,
-                                OPJ_UINT32 vsc
-                                )
+
+static INLINE void opj_t1_update_flags(opj_flag_t *flagsp, OPJ_UINT32 ci,
+                                       OPJ_UINT32 s, OPJ_UINT32 stride,
+                                       OPJ_UINT32 vsc)
 {
-	OPJ_INT32 v;
-    OPJ_UINT32 flag;
-	
-	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
-	
-	flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);
-	if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
-		v = opj_int_abs(*datap) & one ? 1 : 0;
-		opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));	/* ESSAI */
-		if (type == T1_TYPE_RAW) {	/* BYPASS/LAZY MODE */
-			opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);
-		} else {
-			opj_mqc_encode(mqc, (OPJ_UINT32)v);
-		}
-		if (v) {
-			v = *datap < 0 ? 1 : 0;
-			*nmsedec +=	opj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno));
-			opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));	/* ESSAI */
-			if (type == T1_TYPE_RAW) {	/* BYPASS/LAZY MODE */
-				opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);
-			} else {
-				opj_mqc_encode(mqc, (OPJ_UINT32)(v ^ opj_t1_getspb((OPJ_UINT32)flag)));
-			}
-			opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
-		}
-		*flagsp |= T1_VISIT;
-	}
+    opj_t1_update_flags_macro(*flagsp, flagsp, ci, s, stride, vsc);
 }
 
+/**
+Encode significant pass
+*/
+static INLINE void opj_t1_enc_sigpass_step(opj_t1_t *t1,
+        opj_flag_t *flagsp,
+        OPJ_INT32 *datap,
+        OPJ_INT32 bpno,
+        OPJ_INT32 one,
+        OPJ_INT32 *nmsedec,
+        OPJ_BYTE type,
+        OPJ_UINT32 ci,
+        OPJ_UINT32 vsc)
+{
+    OPJ_UINT32 v;
+
+    opj_mqc_t *mqc = &(t1->mqc);   /* MQC component */
+
+    OPJ_UINT32 const flags = *flagsp;
+
+    if ((flags & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U))) == 0U &&
+            (flags & (T1_SIGMA_NEIGHBOURS << (ci * 3U))) != 0U) {
+        OPJ_UINT32 ctxt1 = opj_t1_getctxno_zc(mqc, flags >> (ci * 3U));
+        v = opj_int_abs(*datap) & one ? 1 : 0;
+#ifdef DEBUG_ENC_SIG
+        fprintf(stderr, "   ctxt1=%d\n", ctxt1);
+#endif
+        opj_mqc_setcurctx(mqc, ctxt1);
+        if (type == T1_TYPE_RAW) {  /* BYPASS/LAZY MODE */
+            opj_mqc_bypass_enc(mqc, v);
+        } else {
+            opj_mqc_encode(mqc, v);
+        }
+        if (v) {
+            OPJ_UINT32 lu = opj_t1_getctxtno_sc_or_spb_index(
+                                *flagsp,
+                                flagsp[-1], flagsp[1],
+                                ci);
+            OPJ_UINT32 ctxt2 = opj_t1_getctxno_sc(lu);
+            v = *datap < 0 ? 1U : 0U;
+            *nmsedec += opj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap),
+                                              (OPJ_UINT32)bpno);
+#ifdef DEBUG_ENC_SIG
+            fprintf(stderr, "   ctxt2=%d\n", ctxt2);
+#endif
+            opj_mqc_setcurctx(mqc, ctxt2);
+            if (type == T1_TYPE_RAW) {  /* BYPASS/LAZY MODE */
+                opj_mqc_bypass_enc(mqc, v);
+            } else {
+                OPJ_UINT32 spb = opj_t1_getspb(lu);
+#ifdef DEBUG_ENC_SIG
+                fprintf(stderr, "   spb=%d\n", spb);
+#endif
+                opj_mqc_encode(mqc, v ^ spb);
+            }
+            opj_t1_update_flags(flagsp, ci, v, t1->w + 2, vsc);
+        }
+        *flagsp |= T1_PI_THIS << (ci * 3U);
+    }
+}
 
 static INLINE void opj_t1_dec_sigpass_step_raw(
-                opj_t1_t *t1,
-                opj_flag_t *flagsp,
-                OPJ_INT32 *datap,
-                OPJ_INT32 orient,
-                OPJ_INT32 oneplushalf,
-                OPJ_INT32 vsc)
+    opj_t1_t *t1,
+    opj_flag_t *flagsp,
+    OPJ_INT32 *datap,
+    OPJ_INT32 oneplushalf,
+    OPJ_UINT32 vsc,
+    OPJ_UINT32 ci)
 {
-        OPJ_INT32 v, flag;
-        opj_raw_t *raw = t1->raw;       /* RAW component */
-        OPJ_ARG_NOT_USED(orient);
-       
-        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
-        if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
-                        if (opj_raw_decode(raw)) {
-                                v = (OPJ_INT32)opj_raw_decode(raw);    /* ESSAI */
-                                *datap = v ? -oneplushalf : oneplushalf;
-                                opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
-                        }
-                *flagsp |= T1_VISIT;
+    OPJ_UINT32 v;
+    opj_mqc_t *mqc = &(t1->mqc);       /* RAW component */
+
+    OPJ_UINT32 const flags = *flagsp;
+
+    if ((flags & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U))) == 0U &&
+            (flags & (T1_SIGMA_NEIGHBOURS << (ci * 3U))) != 0U) {
+        if (opj_mqc_raw_decode(mqc)) {
+            v = opj_mqc_raw_decode(mqc);
+            *datap = v ? -oneplushalf : oneplushalf;
+            opj_t1_update_flags(flagsp, ci, v, t1->w + 2, vsc);
         }
-}      
+        *flagsp |= T1_PI_THIS << (ci * 3U);
+    }
+}
+
+#define opj_t1_dec_sigpass_step_mqc_macro(flags, flagsp, flags_stride, data, \
+                                          data_stride, ci, mqc, curctx, \
+                                          v, a, c, ct, oneplushalf, vsc) \
+{ \
+    if ((flags & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U))) == 0U && \
+        (flags & (T1_SIGMA_NEIGHBOURS << (ci * 3U))) != 0U) { \
+        OPJ_UINT32 ctxt1 = opj_t1_getctxno_zc(mqc, flags >> (ci * 3U)); \
+        opj_t1_setcurctx(curctx, ctxt1); \
+        opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
+        if (v) { \
+            OPJ_UINT32 lu = opj_t1_getctxtno_sc_or_spb_index( \
+                                flags, \
+                                flagsp[-1], flagsp[1], \
+                                ci); \
+            OPJ_UINT32 ctxt2 = opj_t1_getctxno_sc(lu); \
+            OPJ_UINT32 spb = opj_t1_getspb(lu); \
+            opj_t1_setcurctx(curctx, ctxt2); \
+            opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
+            v = v ^ spb; \
+            data[ci*data_stride] = v ? -oneplushalf : oneplushalf; \
+            opj_t1_update_flags_macro(flags, flagsp, ci, v, flags_stride, vsc); \
+        } \
+        flags |= T1_PI_THIS << (ci * 3U); \
+    } \
+}
 
 static INLINE void opj_t1_dec_sigpass_step_mqc(
-                opj_t1_t *t1,
-                opj_flag_t *flagsp,
-                OPJ_INT32 *datap,
-                OPJ_INT32 orient,
-                OPJ_INT32 oneplushalf)
+    opj_t1_t *t1,
+    opj_flag_t *flagsp,
+    OPJ_INT32 *datap,
+    OPJ_INT32 oneplushalf,
+    OPJ_UINT32 ci,
+    OPJ_UINT32 flags_stride,
+    OPJ_UINT32 vsc)
 {
-        OPJ_INT32 v, flag;
-       
-        opj_mqc_t *mqc = t1->mqc;       /* MQC component */
-       
-        flag = *flagsp;
-        if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
-                        opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
-                        if (opj_mqc_decode(mqc)) {
-                                opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
-                                v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
-                                *datap = v ? -oneplushalf : oneplushalf;
-                                opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
-                        }
-                *flagsp |= T1_VISIT;
-        }
-}                               /* VSC and  BYPASS by Antonin */
+    OPJ_UINT32 v;
 
-static INLINE void opj_t1_dec_sigpass_step_mqc_vsc(
-                opj_t1_t *t1,
-                opj_flag_t *flagsp,
-                OPJ_INT32 *datap,
-                OPJ_INT32 orient,
-                OPJ_INT32 oneplushalf,
-                OPJ_INT32 vsc)
-{
-        OPJ_INT32 v, flag;
-       
-        opj_mqc_t *mqc = t1->mqc;       /* MQC component */
-       
-        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
-        if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
-                opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
-                if (opj_mqc_decode(mqc)) {
-                        opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
-                        v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
-                        *datap = v ? -oneplushalf : oneplushalf;
-                        opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
-                }
-                *flagsp |= T1_VISIT;
-        }
-}                               /* VSC and  BYPASS by Antonin */
-
-
+    opj_mqc_t *mqc = &(t1->mqc);       /* MQC component */
+    opj_t1_dec_sigpass_step_mqc_macro(*flagsp, flagsp, flags_stride, datap,
+                                      0, ci, mqc, mqc->curctx,
+                                      v, mqc->a, mqc->c, mqc->ct, oneplushalf, vsc);
+}
 
 static void opj_t1_enc_sigpass(opj_t1_t *t1,
-                        OPJ_INT32 bpno,
-                        OPJ_UINT32 orient,
-                        OPJ_INT32 *nmsedec,
-                        OPJ_BYTE type,
-                        OPJ_UINT32 cblksty
-                        )
+                               OPJ_INT32 bpno,
+                               OPJ_INT32 *nmsedec,
+                               OPJ_BYTE type,
+                               OPJ_UINT32 cblksty
+                              )
 {
-	OPJ_UINT32 i, j, k, vsc; 
-    OPJ_INT32 one;
+    OPJ_UINT32 i, k;
+    OPJ_INT32 const one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
+    opj_flag_t* f = &T1_FLAGS(0, 0);
+    OPJ_UINT32 const extra = 2;
 
-	*nmsedec = 0;
-	one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
-	for (k = 0; k < t1->h; k += 4) {
-		for (i = 0; i < t1->w; ++i) {
-			for (j = k; j < k + 4 && j < t1->h; ++j) {
-				vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
-				opj_t1_enc_sigpass_step(
-						t1,
-						&t1->flags[((j+1) * t1->flags_stride) + i + 1],
-						&t1->data[(j * t1->data_stride) + i],
-						orient,
-						bpno,
-						one,
-						nmsedec,
-						type,
-						vsc);
-			}
-		}
-	}
+    *nmsedec = 0;
+#ifdef DEBUG_ENC_SIG
+    fprintf(stderr, "enc_sigpass: bpno=%d\n", bpno);
+#endif
+    for (k = 0; k < (t1->h & ~3U); k += 4) {
+#ifdef DEBUG_ENC_SIG
+        fprintf(stderr, " k=%d\n", k);
+#endif
+        for (i = 0; i < t1->w; ++i) {
+#ifdef DEBUG_ENC_SIG
+            fprintf(stderr, " i=%d\n", i);
+#endif
+            if (*f == 0U) {
+                /* Nothing to do for any of the 4 data points */
+                f++;
+                continue;
+            }
+            opj_t1_enc_sigpass_step(
+                t1,
+                f,
+                &t1->data[((k + 0) * t1->data_stride) + i],
+                bpno,
+                one,
+                nmsedec,
+                type,
+                0, cblksty & J2K_CCP_CBLKSTY_VSC);
+            opj_t1_enc_sigpass_step(
+                t1,
+                f,
+                &t1->data[((k + 1) * t1->data_stride) + i],
+                bpno,
+                one,
+                nmsedec,
+                type,
+                1, 0);
+            opj_t1_enc_sigpass_step(
+                t1,
+                f,
+                &t1->data[((k + 2) * t1->data_stride) + i],
+                bpno,
+                one,
+                nmsedec,
+                type,
+                2, 0);
+            opj_t1_enc_sigpass_step(
+                t1,
+                f,
+                &t1->data[((k + 3) * t1->data_stride) + i],
+                bpno,
+                one,
+                nmsedec,
+                type,
+                3, 0);
+            ++f;
+        }
+        f += extra;
+    }
+
+    if (k < t1->h) {
+        OPJ_UINT32 j;
+#ifdef DEBUG_ENC_SIG
+        fprintf(stderr, " k=%d\n", k);
+#endif
+        for (i = 0; i < t1->w; ++i) {
+#ifdef DEBUG_ENC_SIG
+            fprintf(stderr, " i=%d\n", i);
+#endif
+            if (*f == 0U) {
+                /* Nothing to do for any of the 4 data points */
+                f++;
+                continue;
+            }
+            for (j = k; j < t1->h; ++j) {
+                opj_t1_enc_sigpass_step(
+                    t1,
+                    f,
+                    &t1->data[(j * t1->data_stride) + i],
+                    bpno,
+                    one,
+                    nmsedec,
+                    type,
+                    j - k,
+                    (j == k && (cblksty & J2K_CCP_CBLKSTY_VSC) != 0));
+            }
+            ++f;
+        }
+    }
 }
 
 static void opj_t1_dec_sigpass_raw(
-                opj_t1_t *t1,
-                OPJ_INT32 bpno,
-                OPJ_INT32 orient,
-                OPJ_INT32 cblksty)
+    opj_t1_t *t1,
+    OPJ_INT32 bpno,
+    OPJ_INT32 cblksty)
 {
-        OPJ_INT32 one, half, oneplushalf, vsc;
-        OPJ_UINT32 i, j, k; 
-        one = 1 << bpno;
-        half = one >> 1;
-        oneplushalf = one | half;
-        for (k = 0; k < t1->h; k += 4) {
-                for (i = 0; i < t1->w; ++i) {
-                        for (j = k; j < k + 4 && j < t1->h; ++j) {
-                                vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
-                                opj_t1_dec_sigpass_step_raw(
-                                                t1,
-                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
-                                                &t1->data[(j * t1->w) + i],
-                                                orient,
-                                                oneplushalf,
-                                                vsc);
-                        }
-                }
+    OPJ_INT32 one, half, oneplushalf;
+    OPJ_UINT32 i, j, k;
+    OPJ_INT32 *data = t1->data;
+    opj_flag_t *flagsp = &T1_FLAGS(0, 0);
+    const OPJ_UINT32 l_w = t1->w;
+    one = 1 << bpno;
+    half = one >> 1;
+    oneplushalf = one | half;
+
+    for (k = 0; k < (t1->h & ~3U); k += 4, flagsp += 2, data += 3 * l_w) {
+        for (i = 0; i < l_w; ++i, ++flagsp, ++data) {
+            opj_flag_t flags = *flagsp;
+            if (flags != 0) {
+                opj_t1_dec_sigpass_step_raw(
+                    t1,
+                    flagsp,
+                    data,
+                    oneplushalf,
+                    cblksty & J2K_CCP_CBLKSTY_VSC, /* vsc */
+                    0U);
+                opj_t1_dec_sigpass_step_raw(
+                    t1,
+                    flagsp,
+                    data + l_w,
+                    oneplushalf,
+                    OPJ_FALSE, /* vsc */
+                    1U);
+                opj_t1_dec_sigpass_step_raw(
+                    t1,
+                    flagsp,
+                    data + 2 * l_w,
+                    oneplushalf,
+                    OPJ_FALSE, /* vsc */
+                    2U);
+                opj_t1_dec_sigpass_step_raw(
+                    t1,
+                    flagsp,
+                    data + 3 * l_w,
+                    oneplushalf,
+                    OPJ_FALSE, /* vsc */
+                    3U);
+            }
         }
-}                               /* VSC and  BYPASS by Antonin */
+    }
+    if (k < t1->h) {
+        for (i = 0; i < l_w; ++i, ++flagsp, ++data) {
+            for (j = 0; j < t1->h - k; ++j) {
+                opj_t1_dec_sigpass_step_raw(
+                    t1,
+                    flagsp,
+                    data + j * l_w,
+                    oneplushalf,
+                    cblksty & J2K_CCP_CBLKSTY_VSC, /* vsc */
+                    j);
+            }
+        }
+    }
+}
+
+#define opj_t1_dec_sigpass_mqc_internal(t1, bpno, vsc, w, h, flags_stride) \
+{ \
+        OPJ_INT32 one, half, oneplushalf; \
+        OPJ_UINT32 i, j, k; \
+        register OPJ_INT32 *data = t1->data; \
+        register opj_flag_t *flagsp = &t1->flags[(flags_stride) + 1]; \
+        const OPJ_UINT32 l_w = w; \
+        opj_mqc_t* mqc = &(t1->mqc); \
+        DOWNLOAD_MQC_VARIABLES(mqc, curctx, c, a, ct); \
+        register OPJ_UINT32 v; \
+        one = 1 << bpno; \
+        half = one >> 1; \
+        oneplushalf = one | half; \
+        for (k = 0; k < (h & ~3u); k += 4, data += 3*l_w, flagsp += 2) { \
+                for (i = 0; i < l_w; ++i, ++data, ++flagsp) { \
+                        opj_flag_t flags = *flagsp; \
+                        if( flags != 0 ) { \
+                            opj_t1_dec_sigpass_step_mqc_macro( \
+                                flags, flagsp, flags_stride, data, \
+                                l_w, 0, mqc, curctx, v, a, c, ct, oneplushalf, vsc); \
+                            opj_t1_dec_sigpass_step_mqc_macro( \
+                                flags, flagsp, flags_stride, data, \
+                                l_w, 1, mqc, curctx, v, a, c, ct, oneplushalf, OPJ_FALSE); \
+                            opj_t1_dec_sigpass_step_mqc_macro( \
+                                flags, flagsp, flags_stride, data, \
+                                l_w, 2, mqc, curctx, v, a, c, ct, oneplushalf, OPJ_FALSE); \
+                            opj_t1_dec_sigpass_step_mqc_macro( \
+                                flags, flagsp, flags_stride, data, \
+                                l_w, 3, mqc, curctx, v, a, c, ct, oneplushalf, OPJ_FALSE); \
+                            *flagsp = flags; \
+                        } \
+                } \
+        } \
+        UPLOAD_MQC_VARIABLES(mqc, curctx, c, a, ct); \
+        if( k < h ) { \
+            for (i = 0; i < l_w; ++i, ++data, ++flagsp) { \
+                for (j = 0; j < h - k; ++j) { \
+                        opj_t1_dec_sigpass_step_mqc(t1, flagsp, \
+                            data + j * l_w, oneplushalf, j, flags_stride, vsc); \
+                } \
+            } \
+        } \
+}
+
+static void opj_t1_dec_sigpass_mqc_64x64_novsc(
+    opj_t1_t *t1,
+    OPJ_INT32 bpno)
+{
+    opj_t1_dec_sigpass_mqc_internal(t1, bpno, OPJ_FALSE, 64, 64, 66);
+}
+
+static void opj_t1_dec_sigpass_mqc_64x64_vsc(
+    opj_t1_t *t1,
+    OPJ_INT32 bpno)
+{
+    opj_t1_dec_sigpass_mqc_internal(t1, bpno, OPJ_TRUE, 64, 64, 66);
+}
+
+static void opj_t1_dec_sigpass_mqc_generic_novsc(
+    opj_t1_t *t1,
+    OPJ_INT32 bpno)
+{
+    opj_t1_dec_sigpass_mqc_internal(t1, bpno, OPJ_FALSE, t1->w, t1->h,
+                                    t1->w + 2U);
+}
+
+static void opj_t1_dec_sigpass_mqc_generic_vsc(
+    opj_t1_t *t1,
+    OPJ_INT32 bpno)
+{
+    opj_t1_dec_sigpass_mqc_internal(t1, bpno, OPJ_TRUE, t1->w, t1->h,
+                                    t1->w + 2U);
+}
 
 static void opj_t1_dec_sigpass_mqc(
-                opj_t1_t *t1,
-                OPJ_INT32 bpno,
-                OPJ_INT32 orient)
+    opj_t1_t *t1,
+    OPJ_INT32 bpno,
+    OPJ_INT32 cblksty)
 {
-        OPJ_INT32 one, half, oneplushalf;
-        OPJ_UINT32 i, j, k;
-        OPJ_INT32 *data1 = t1->data;
-        opj_flag_t *flags1 = &t1->flags[1];
-        one = 1 << bpno;
-        half = one >> 1;
-        oneplushalf = one | half;
-        for (k = 0; k < (t1->h & ~3u); k += 4) {
-                for (i = 0; i < t1->w; ++i) {
-                        OPJ_INT32 *data2 = data1 + i;
-                        opj_flag_t *flags2 = flags1 + i;
-                        flags2 += t1->flags_stride;
-                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
-                        data2 += t1->w;
-                        flags2 += t1->flags_stride;
-                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
-                        data2 += t1->w;
-                        flags2 += t1->flags_stride;
-                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
-                        data2 += t1->w;
-                        flags2 += t1->flags_stride;
-                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
-                        data2 += t1->w;
-                }
-                data1 += t1->w << 2;
-                flags1 += t1->flags_stride << 2;
+    if (t1->w == 64 && t1->h == 64) {
+        if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+            opj_t1_dec_sigpass_mqc_64x64_vsc(t1, bpno);
+        } else {
+            opj_t1_dec_sigpass_mqc_64x64_novsc(t1, bpno);
         }
-        for (i = 0; i < t1->w; ++i) {
-                OPJ_INT32 *data2 = data1 + i;
-                opj_flag_t *flags2 = flags1 + i;
-                for (j = k; j < t1->h; ++j) {
-                        flags2 += t1->flags_stride;
-                        opj_t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
-                        data2 += t1->w;
-                }
+    } else {
+        if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+            opj_t1_dec_sigpass_mqc_generic_vsc(t1, bpno);
+        } else {
+            opj_t1_dec_sigpass_mqc_generic_novsc(t1, bpno);
         }
-}                               /* VSC and  BYPASS by Antonin */
-
-static void opj_t1_dec_sigpass_mqc_vsc(
-                opj_t1_t *t1,
-                OPJ_INT32 bpno,
-                OPJ_INT32 orient)
-{
-        OPJ_INT32 one, half, oneplushalf, vsc;
-        OPJ_UINT32 i, j, k;
-        one = 1 << bpno;
-        half = one >> 1;
-        oneplushalf = one | half;
-        for (k = 0; k < t1->h; k += 4) {
-                for (i = 0; i < t1->w; ++i) {
-                        for (j = k; j < k + 4 && j < t1->h; ++j) {
-                                vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
-                                opj_t1_dec_sigpass_step_mqc_vsc(
-                                                t1,
-                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
-                                                &t1->data[(j * t1->w) + i],
-                                                orient,
-                                                oneplushalf,
-                                                vsc);
-                        }
-                }
-        }
-}                               /* VSC and  BYPASS by Antonin */
-
-
-
-static void opj_t1_enc_refpass_step(   opj_t1_t *t1,
-                                opj_flag_t *flagsp,
-                                OPJ_INT32 *datap,
-                                OPJ_INT32 bpno,
-                                OPJ_INT32 one,
-                                OPJ_INT32 *nmsedec,
-                                OPJ_BYTE type,
-                                OPJ_UINT32 vsc)
-{
-	OPJ_INT32 v;
-	OPJ_UINT32 flag;
-	
-	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
-	
-	flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);
-	if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
-		*nmsedec += opj_t1_getnmsedec_ref((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno));
-		v = opj_int_abs(*datap) & one ? 1 : 0;
-		opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag(flag));	/* ESSAI */
-		if (type == T1_TYPE_RAW) {	/* BYPASS/LAZY MODE */
-			opj_mqc_bypass_enc(mqc, (OPJ_UINT32)v);
-		} else {
-			opj_mqc_encode(mqc, (OPJ_UINT32)v);
-		}
-		*flagsp |= T1_REFINE;
-	}
+    }
 }
 
+/**
+Encode refinement pass step
+*/
+static INLINE void opj_t1_enc_refpass_step(opj_t1_t *t1,
+        opj_flag_t *flagsp,
+        OPJ_INT32 *datap,
+        OPJ_INT32 bpno,
+        OPJ_INT32 one,
+        OPJ_INT32 *nmsedec,
+        OPJ_BYTE type,
+        OPJ_UINT32 ci)
+{
+    OPJ_UINT32 v;
+
+    opj_mqc_t *mqc = &(t1->mqc);   /* MQC component */
+
+    OPJ_UINT32 const shift_flags =
+        (*flagsp >> (ci * 3U));
+
+    if ((shift_flags & (T1_SIGMA_THIS | T1_PI_THIS)) == T1_SIGMA_THIS) {
+        OPJ_UINT32 ctxt = opj_t1_getctxno_mag(shift_flags);
+        *nmsedec += opj_t1_getnmsedec_ref((OPJ_UINT32)opj_int_abs(*datap),
+                                          (OPJ_UINT32)bpno);
+        v = opj_int_abs(*datap) & one ? 1 : 0;
+#ifdef DEBUG_ENC_REF
+        fprintf(stderr, "  ctxt=%d\n", ctxt);
+#endif
+        opj_mqc_setcurctx(mqc, ctxt);
+        if (type == T1_TYPE_RAW) {  /* BYPASS/LAZY MODE */
+            opj_mqc_bypass_enc(mqc, v);
+        } else {
+            opj_mqc_encode(mqc, v);
+        }
+        *flagsp |= T1_MU_THIS << (ci * 3U);
+    }
+}
+
+
 static INLINE void opj_t1_dec_refpass_step_raw(
-                opj_t1_t *t1,
-                opj_flag_t *flagsp,
-                OPJ_INT32 *datap,
-                OPJ_INT32 poshalf,
-                OPJ_INT32 neghalf,
-                OPJ_INT32 vsc)
+    opj_t1_t *t1,
+    opj_flag_t *flagsp,
+    OPJ_INT32 *datap,
+    OPJ_INT32 poshalf,
+    OPJ_UINT32 ci)
 {
-        OPJ_INT32 v, t, flag;
-       
-        opj_raw_t *raw = t1->raw;       /* RAW component */
-       
-        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
-        if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
-                        v = (OPJ_INT32)opj_raw_decode(raw);
-                t = v ? poshalf : neghalf;
-                *datap += *datap < 0 ? -t : t;
-                *flagsp |= T1_REFINE;
-        }
-}                               /* VSC and  BYPASS by Antonin  */
+    OPJ_UINT32 v;
+
+    opj_mqc_t *mqc = &(t1->mqc);       /* RAW component */
+
+    if ((*flagsp & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U))) ==
+            (T1_SIGMA_THIS << (ci * 3U))) {
+        v = opj_mqc_raw_decode(mqc);
+        *datap += (v ^ (*datap < 0)) ? poshalf : -poshalf;
+        *flagsp |= T1_MU_THIS << (ci * 3U);
+    }
+}
+
+#define opj_t1_dec_refpass_step_mqc_macro(flags, data, data_stride, ci, \
+                                          mqc, curctx, v, a, c, ct, poshalf) \
+{ \
+    if ((flags & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U))) == \
+            (T1_SIGMA_THIS << (ci * 3U))) { \
+        OPJ_UINT32 ctxt = opj_t1_getctxno_mag(flags >> (ci * 3U)); \
+        opj_t1_setcurctx(curctx, ctxt); \
+        opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
+        data[ci*data_stride] += (v ^ (data[ci*data_stride] < 0)) ? poshalf : -poshalf; \
+        flags |= T1_MU_THIS << (ci * 3U); \
+    } \
+}
 
 static INLINE void opj_t1_dec_refpass_step_mqc(
-                opj_t1_t *t1,
-                opj_flag_t *flagsp,
-                OPJ_INT32 *datap,
-                OPJ_INT32 poshalf,
-                OPJ_INT32 neghalf)
+    opj_t1_t *t1,
+    opj_flag_t *flagsp,
+    OPJ_INT32 *datap,
+    OPJ_INT32 poshalf,
+    OPJ_UINT32 ci)
 {
-        OPJ_INT32 v, t, flag;
-       
-        opj_mqc_t *mqc = t1->mqc;       /* MQC component */
-       
-        flag = *flagsp;
-        if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
-                opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag((OPJ_UINT32)flag));      /* ESSAI */
-                        v = opj_mqc_decode(mqc);
-                t = v ? poshalf : neghalf;
-                *datap += *datap < 0 ? -t : t;
-                *flagsp |= T1_REFINE;
-                }
-}                               /* VSC and  BYPASS by Antonin  */
+    OPJ_UINT32 v;
 
-static INLINE void opj_t1_dec_refpass_step_mqc_vsc(
-                opj_t1_t *t1,
-                opj_flag_t *flagsp,
-                OPJ_INT32 *datap,
-                OPJ_INT32 poshalf,
-                OPJ_INT32 neghalf,
-                OPJ_INT32 vsc)
-{
-        OPJ_INT32 v, t, flag;
-       
-        opj_mqc_t *mqc = t1->mqc;       /* MQC component */
-       
-        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
-        if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
-                opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag((OPJ_UINT32)flag));      /* ESSAI */
-                v = opj_mqc_decode(mqc);
-                t = v ? poshalf : neghalf;
-                *datap += *datap < 0 ? -t : t;
-                *flagsp |= T1_REFINE;
-        }
-}                               /* VSC and  BYPASS by Antonin  */
-
+    opj_mqc_t *mqc = &(t1->mqc);       /* MQC component */
+    opj_t1_dec_refpass_step_mqc_macro(*flagsp, datap, 0, ci,
+                                      mqc, mqc->curctx, v, mqc->a, mqc->c,
+                                      mqc->ct, poshalf);
+}
 
 static void opj_t1_enc_refpass(
-		opj_t1_t *t1,
-		OPJ_INT32 bpno,
-		OPJ_INT32 *nmsedec,
-		OPJ_BYTE type,
-		OPJ_UINT32 cblksty)
+    opj_t1_t *t1,
+    OPJ_INT32 bpno,
+    OPJ_INT32 *nmsedec,
+    OPJ_BYTE type)
 {
-	OPJ_UINT32 i, j, k, vsc;
-    OPJ_INT32 one;
+    OPJ_UINT32 i, k;
+    const OPJ_INT32 one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
+    opj_flag_t* f = &T1_FLAGS(0, 0);
+    const OPJ_UINT32 extra = 2U;
 
-	*nmsedec = 0;
-	one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
-	for (k = 0; k < t1->h; k += 4) {
-		for (i = 0; i < t1->w; ++i) {
-			for (j = k; j < k + 4 && j < t1->h; ++j) {
-				vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
-				opj_t1_enc_refpass_step(
-						t1,
-						&t1->flags[((j+1) * t1->flags_stride) + i + 1],
-						&t1->data[(j * t1->data_stride) + i],
-						bpno,
-						one,
-						nmsedec,
-						type,
-						vsc);
-			}
-		}
-	}
+    *nmsedec = 0;
+#ifdef DEBUG_ENC_REF
+    fprintf(stderr, "enc_refpass: bpno=%d\n", bpno);
+#endif
+    for (k = 0; k < (t1->h & ~3U); k += 4) {
+#ifdef DEBUG_ENC_REF
+        fprintf(stderr, " k=%d\n", k);
+#endif
+        for (i = 0; i < t1->w; ++i) {
+#ifdef DEBUG_ENC_REF
+            fprintf(stderr, " i=%d\n", i);
+#endif
+            if ((*f & (T1_SIGMA_4 | T1_SIGMA_7 | T1_SIGMA_10 | T1_SIGMA_13)) == 0) {
+                /* none significant */
+                f++;
+                continue;
+            }
+            if ((*f & (T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3)) ==
+                    (T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3)) {
+                /* all processed by sigpass */
+                f++;
+                continue;
+            }
+
+            opj_t1_enc_refpass_step(
+                t1,
+                f,
+                &t1->data[((k + 0) * t1->data_stride) + i],
+                bpno,
+                one,
+                nmsedec,
+                type,
+                0);
+            opj_t1_enc_refpass_step(
+                t1,
+                f,
+                &t1->data[((k + 1) * t1->data_stride) + i],
+                bpno,
+                one,
+                nmsedec,
+                type,
+                1);
+            opj_t1_enc_refpass_step(
+                t1,
+                f,
+                &t1->data[((k + 2) * t1->data_stride) + i],
+                bpno,
+                one,
+                nmsedec,
+                type,
+                2);
+            opj_t1_enc_refpass_step(
+                t1,
+                f,
+                &t1->data[((k + 3) * t1->data_stride) + i],
+                bpno,
+                one,
+                nmsedec,
+                type,
+                3);
+            ++f;
+        }
+        f += extra;
+    }
+
+    if (k < t1->h) {
+        OPJ_UINT32 j;
+#ifdef DEBUG_ENC_REF
+        fprintf(stderr, " k=%d\n", k);
+#endif
+        for (i = 0; i < t1->w; ++i) {
+#ifdef DEBUG_ENC_REF
+            fprintf(stderr, " i=%d\n", i);
+#endif
+            if ((*f & (T1_SIGMA_4 | T1_SIGMA_7 | T1_SIGMA_10 | T1_SIGMA_13)) == 0) {
+                /* none significant */
+                f++;
+                continue;
+            }
+            for (j = k; j < t1->h; ++j) {
+                opj_t1_enc_refpass_step(
+                    t1,
+                    f,
+                    &t1->data[(j * t1->data_stride) + i],
+                    bpno,
+                    one,
+                    nmsedec,
+                    type,
+                    j - k);
+            }
+            ++f;
+        }
+    }
 }
 
+
 static void opj_t1_dec_refpass_raw(
-                opj_t1_t *t1,
-                OPJ_INT32 bpno,
-                OPJ_INT32 cblksty)
+    opj_t1_t *t1,
+    OPJ_INT32 bpno)
 {
-        OPJ_INT32 one, poshalf, neghalf;
-        OPJ_UINT32 i, j, k;
-        OPJ_INT32 vsc;
-        one = 1 << bpno;
-        poshalf = one >> 1;
-        neghalf = bpno > 0 ? -poshalf : -1;
-        for (k = 0; k < t1->h; k += 4) {
-                for (i = 0; i < t1->w; ++i) {
-                        for (j = k; j < k + 4 && j < t1->h; ++j) {
-                                vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
-                                opj_t1_dec_refpass_step_raw(
-                                                t1,
-                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
-                                                &t1->data[(j * t1->w) + i],
-                                                poshalf,
-                                                neghalf,
-                                                vsc);
-                        }
-                }
+    OPJ_INT32 one, poshalf;
+    OPJ_UINT32 i, j, k;
+    OPJ_INT32 *data = t1->data;
+    opj_flag_t *flagsp = &T1_FLAGS(0, 0);
+    const OPJ_UINT32 l_w = t1->w;
+    one = 1 << bpno;
+    poshalf = one >> 1;
+    for (k = 0; k < (t1->h & ~3U); k += 4, flagsp += 2, data += 3 * l_w) {
+        for (i = 0; i < l_w; ++i, ++flagsp, ++data) {
+            opj_flag_t flags = *flagsp;
+            if (flags != 0) {
+                opj_t1_dec_refpass_step_raw(
+                    t1,
+                    flagsp,
+                    data,
+                    poshalf,
+                    0U);
+                opj_t1_dec_refpass_step_raw(
+                    t1,
+                    flagsp,
+                    data + l_w,
+                    poshalf,
+                    1U);
+                opj_t1_dec_refpass_step_raw(
+                    t1,
+                    flagsp,
+                    data + 2 * l_w,
+                    poshalf,
+                    2U);
+                opj_t1_dec_refpass_step_raw(
+                    t1,
+                    flagsp,
+                    data + 3 * l_w,
+                    poshalf,
+                    3U);
+            }
         }
-}                               /* VSC and  BYPASS by Antonin */
-
-static void opj_t1_dec_refpass_mqc(
-                opj_t1_t *t1,
-                OPJ_INT32 bpno)
-{
-        OPJ_INT32 one, poshalf, neghalf;
-        OPJ_UINT32 i, j, k;
-        OPJ_INT32 *data1 = t1->data;
-        opj_flag_t *flags1 = &t1->flags[1];
-        one = 1 << bpno;
-        poshalf = one >> 1;
-        neghalf = bpno > 0 ? -poshalf : -1;
-        for (k = 0; k < (t1->h & ~3u); k += 4) {
-                for (i = 0; i < t1->w; ++i) {
-                        OPJ_INT32 *data2 = data1 + i;
-                        opj_flag_t *flags2 = flags1 + i;
-                        flags2 += t1->flags_stride;
-                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
-                        data2 += t1->w;
-                        flags2 += t1->flags_stride;
-                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
-                        data2 += t1->w;
-                        flags2 += t1->flags_stride;
-                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
-                        data2 += t1->w;
-                        flags2 += t1->flags_stride;
-                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
-                        data2 += t1->w;
-                }
-                data1 += t1->w << 2;
-                flags1 += t1->flags_stride << 2;
+    }
+    if (k < t1->h) {
+        for (i = 0; i < l_w; ++i, ++flagsp, ++data) {
+            for (j = 0; j < t1->h - k; ++j) {
+                opj_t1_dec_refpass_step_raw(
+                    t1,
+                    flagsp,
+                    data + j * l_w,
+                    poshalf,
+                    j);
+            }
         }
-        for (i = 0; i < t1->w; ++i) {
-                OPJ_INT32 *data2 = data1 + i;
-                opj_flag_t *flags2 = flags1 + i;
-                for (j = k; j < t1->h; ++j) {
-                        flags2 += t1->flags_stride;
-                        opj_t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
-                        data2 += t1->w;
-                }
-        }
-}                               /* VSC and  BYPASS by Antonin */
-
-static void opj_t1_dec_refpass_mqc_vsc(
-                opj_t1_t *t1,
-                OPJ_INT32 bpno)
-{
-        OPJ_INT32 one, poshalf, neghalf;
-        OPJ_UINT32 i, j, k;
-        OPJ_INT32 vsc;
-        one = 1 << bpno;
-        poshalf = one >> 1;
-        neghalf = bpno > 0 ? -poshalf : -1;
-        for (k = 0; k < t1->h; k += 4) {
-                for (i = 0; i < t1->w; ++i) {
-                        for (j = k; j < k + 4 && j < t1->h; ++j) {
-                                vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0;
-                                opj_t1_dec_refpass_step_mqc_vsc(
-                                                t1,
-                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
-                                                &t1->data[(j * t1->w) + i],
-                                                poshalf,
-                                                neghalf,
-                                                vsc);
-                        }
-                }
-        }
-}                               /* VSC and  BYPASS by Antonin */
-
-
-static void opj_t1_enc_clnpass_step(
-		opj_t1_t *t1,
-		opj_flag_t *flagsp,
-		OPJ_INT32 *datap,
-		OPJ_UINT32 orient,
-		OPJ_INT32 bpno,
-		OPJ_INT32 one,
-		OPJ_INT32 *nmsedec,
-		OPJ_UINT32 partial,
-		OPJ_UINT32 vsc)
-{
-	OPJ_INT32 v;
-	OPJ_UINT32 flag;
-	
-	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
-	
-	flag = vsc ? (OPJ_UINT32)((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (OPJ_UINT32)(*flagsp);
-	if (partial) {
-		goto LABEL_PARTIAL;
-	}
-	if (!(*flagsp & (T1_SIG | T1_VISIT))) {
-		opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));
-		v = opj_int_abs(*datap) & one ? 1 : 0;
-		opj_mqc_encode(mqc, (OPJ_UINT32)v);
-		if (v) {
-LABEL_PARTIAL:
-			*nmsedec += opj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap), (OPJ_UINT32)(bpno));
-			opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));
-			v = *datap < 0 ? 1 : 0;
-			opj_mqc_encode(mqc, (OPJ_UINT32)(v ^ opj_t1_getspb((OPJ_UINT32)flag)));
-			opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
-		}
-	}
-	*flagsp &= ~T1_VISIT;
+    }
 }
 
-static void opj_t1_dec_clnpass_step_partial(
-		opj_t1_t *t1,
-		opj_flag_t *flagsp,
-		OPJ_INT32 *datap,
-		OPJ_INT32 orient,
-		OPJ_INT32 oneplushalf)
+#define opj_t1_dec_refpass_mqc_internal(t1, bpno, w, h, flags_stride) \
+{ \
+        OPJ_INT32 one, poshalf; \
+        OPJ_UINT32 i, j, k; \
+        register OPJ_INT32 *data = t1->data; \
+        register opj_flag_t *flagsp = &t1->flags[flags_stride + 1]; \
+        const OPJ_UINT32 l_w = w; \
+        opj_mqc_t* mqc = &(t1->mqc); \
+        DOWNLOAD_MQC_VARIABLES(mqc, curctx, c, a, ct); \
+        register OPJ_UINT32 v; \
+        one = 1 << bpno; \
+        poshalf = one >> 1; \
+        for (k = 0; k < (h & ~3u); k += 4, data += 3*l_w, flagsp += 2) { \
+                for (i = 0; i < l_w; ++i, ++data, ++flagsp) { \
+                        opj_flag_t flags = *flagsp; \
+                        if( flags != 0 ) { \
+                            opj_t1_dec_refpass_step_mqc_macro( \
+                                flags, data, l_w, 0, \
+                                mqc, curctx, v, a, c, ct, poshalf); \
+                            opj_t1_dec_refpass_step_mqc_macro( \
+                                flags, data, l_w, 1, \
+                                mqc, curctx, v, a, c, ct, poshalf); \
+                            opj_t1_dec_refpass_step_mqc_macro( \
+                                flags, data, l_w, 2, \
+                                mqc, curctx, v, a, c, ct, poshalf); \
+                            opj_t1_dec_refpass_step_mqc_macro( \
+                                flags, data, l_w, 3, \
+                                mqc, curctx, v, a, c, ct, poshalf); \
+                            *flagsp = flags; \
+                        } \
+                } \
+        } \
+        UPLOAD_MQC_VARIABLES(mqc, curctx, c, a, ct); \
+        if( k < h ) { \
+            for (i = 0; i < l_w; ++i, ++data, ++flagsp) { \
+                for (j = 0; j < h - k; ++j) { \
+                        opj_t1_dec_refpass_step_mqc(t1, flagsp, data + j * l_w, poshalf, j); \
+                } \
+            } \
+        } \
+}
+
+static void opj_t1_dec_refpass_mqc_64x64(
+    opj_t1_t *t1,
+    OPJ_INT32 bpno)
 {
-	OPJ_INT32 v, flag;
-	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
-	
-	OPJ_ARG_NOT_USED(orient);
-	
-	flag = *flagsp;
-	opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
-	v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
-	*datap = v ? -oneplushalf : oneplushalf;
-	opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
-	*flagsp &= ~T1_VISIT;
-}				/* VSC and  BYPASS by Antonin */
+    opj_t1_dec_refpass_mqc_internal(t1, bpno, 64, 64, 66);
+}
+
+static void opj_t1_dec_refpass_mqc_generic(
+    opj_t1_t *t1,
+    OPJ_INT32 bpno)
+{
+    opj_t1_dec_refpass_mqc_internal(t1, bpno, t1->w, t1->h, t1->w + 2U);
+}
+
+static void opj_t1_dec_refpass_mqc(
+    opj_t1_t *t1,
+    OPJ_INT32 bpno)
+{
+    if (t1->w == 64 && t1->h == 64) {
+        opj_t1_dec_refpass_mqc_64x64(t1, bpno);
+    } else {
+        opj_t1_dec_refpass_mqc_generic(t1, bpno);
+    }
+}
+
+/**
+Encode clean-up pass step
+*/
+static void opj_t1_enc_clnpass_step(
+    opj_t1_t *t1,
+    opj_flag_t *flagsp,
+    OPJ_INT32 *datap,
+    OPJ_INT32 bpno,
+    OPJ_INT32 one,
+    OPJ_INT32 *nmsedec,
+    OPJ_UINT32 agg,
+    OPJ_UINT32 runlen,
+    OPJ_UINT32 lim,
+    OPJ_UINT32 cblksty)
+{
+    OPJ_UINT32 v;
+    OPJ_UINT32 ci;
+    opj_mqc_t *mqc = &(t1->mqc);   /* MQC component */
+
+    const OPJ_UINT32 check = (T1_SIGMA_4 | T1_SIGMA_7 | T1_SIGMA_10 | T1_SIGMA_13 |
+                              T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3);
+
+    if ((*flagsp & check) == check) {
+        if (runlen == 0) {
+            *flagsp &= ~(T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3);
+        } else if (runlen == 1) {
+            *flagsp &= ~(T1_PI_1 | T1_PI_2 | T1_PI_3);
+        } else if (runlen == 2) {
+            *flagsp &= ~(T1_PI_2 | T1_PI_3);
+        } else if (runlen == 3) {
+            *flagsp &= ~(T1_PI_3);
+        }
+        return;
+    }
+
+    for (ci = runlen; ci < lim; ++ci) {
+        OPJ_UINT32 vsc;
+        opj_flag_t flags;
+
+        flags = *flagsp;
+
+        if ((agg != 0) && (ci == runlen)) {
+            goto LABEL_PARTIAL;
+        }
+
+        if (!(flags & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U)))) {
+            OPJ_UINT32 ctxt1 = opj_t1_getctxno_zc(mqc, flags >> (ci * 3U));
+#ifdef DEBUG_ENC_CLN
+            printf("   ctxt1=%d\n", ctxt1);
+#endif
+            opj_mqc_setcurctx(mqc, ctxt1);
+            v = opj_int_abs(*datap) & one ? 1 : 0;
+            opj_mqc_encode(mqc, v);
+            if (v) {
+                OPJ_UINT32 ctxt2, spb;
+                OPJ_UINT32 lu;
+LABEL_PARTIAL:
+                lu = opj_t1_getctxtno_sc_or_spb_index(
+                         *flagsp,
+                         flagsp[-1], flagsp[1],
+                         ci);
+                *nmsedec += opj_t1_getnmsedec_sig((OPJ_UINT32)opj_int_abs(*datap),
+                                                  (OPJ_UINT32)bpno);
+                ctxt2 = opj_t1_getctxno_sc(lu);
+#ifdef DEBUG_ENC_CLN
+                printf("   ctxt2=%d\n", ctxt2);
+#endif
+                opj_mqc_setcurctx(mqc, ctxt2);
+
+                v = *datap < 0 ? 1U : 0U;
+                spb = opj_t1_getspb(lu);
+#ifdef DEBUG_ENC_CLN
+                printf("   spb=%d\n", spb);
+#endif
+                opj_mqc_encode(mqc, v ^ spb);
+                vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (ci == 0)) ? 1 : 0;
+                opj_t1_update_flags(flagsp, ci, v, t1->w + 2U, vsc);
+            }
+        }
+        *flagsp &= ~(T1_PI_THIS << (3U * ci));
+        datap += t1->data_stride;
+    }
+}
+
+#define opj_t1_dec_clnpass_step_macro(check_flags, partial, \
+                                      flags, flagsp, flags_stride, data, \
+                                      data_stride, ci, mqc, curctx, \
+                                      v, a, c, ct, oneplushalf, vsc) \
+{ \
+    if ( !check_flags || !(flags & ((T1_SIGMA_THIS | T1_PI_THIS) << (ci * 3U)))) {\
+        do { \
+            if( !partial ) { \
+                OPJ_UINT32 ctxt1 = opj_t1_getctxno_zc(mqc, flags >> (ci * 3U)); \
+                opj_t1_setcurctx(curctx, ctxt1); \
+                opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
+                if( !v ) \
+                    break; \
+            } \
+            { \
+                OPJ_UINT32 lu = opj_t1_getctxtno_sc_or_spb_index( \
+                                    flags, flagsp[-1], flagsp[1], \
+                                    ci); \
+                opj_t1_setcurctx(curctx, opj_t1_getctxno_sc(lu)); \
+                opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
+                v = v ^ opj_t1_getspb(lu); \
+                data[ci*data_stride] = v ? -oneplushalf : oneplushalf; \
+                opj_t1_update_flags_macro(flags, flagsp, ci, v, flags_stride, vsc); \
+            } \
+        } while(0); \
+    } \
+}
 
 static void opj_t1_dec_clnpass_step(
-		opj_t1_t *t1,
-		opj_flag_t *flagsp,
-		OPJ_INT32 *datap,
-		OPJ_INT32 orient,
-		OPJ_INT32 oneplushalf)
+    opj_t1_t *t1,
+    opj_flag_t *flagsp,
+    OPJ_INT32 *datap,
+    OPJ_INT32 oneplushalf,
+    OPJ_UINT32 ci,
+    OPJ_UINT32 vsc)
 {
-	OPJ_INT32 v, flag;
-	
-	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
-	
-	flag = *flagsp;
-	if (!(flag & (T1_SIG | T1_VISIT))) {
-		opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
-		if (opj_mqc_decode(mqc)) {
-			opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
-			v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
-			*datap = v ? -oneplushalf : oneplushalf;
-			opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
-		}
-	}
-	*flagsp &= ~T1_VISIT;
-}				/* VSC and  BYPASS by Antonin */
+    OPJ_UINT32 v;
 
-static void opj_t1_dec_clnpass_step_vsc(
-		opj_t1_t *t1,
-		opj_flag_t *flagsp,
-		OPJ_INT32 *datap,
-		OPJ_INT32 orient,
-		OPJ_INT32 oneplushalf,
-		OPJ_INT32 partial,
-		OPJ_INT32 vsc)
-{
-	OPJ_INT32 v, flag;
-	
-	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
-	
-	flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
-	if (partial) {
-		goto LABEL_PARTIAL;
-	}
-	if (!(flag & (T1_SIG | T1_VISIT))) {
-		opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc((OPJ_UINT32)flag, (OPJ_UINT32)orient));
-		if (opj_mqc_decode(mqc)) {
-LABEL_PARTIAL:
-			opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc((OPJ_UINT32)flag));
-			v = opj_mqc_decode(mqc) ^ opj_t1_getspb((OPJ_UINT32)flag);
-			*datap = v ? -oneplushalf : oneplushalf;
-			opj_t1_updateflags(flagsp, (OPJ_UINT32)v, t1->flags_stride);
-		}
-	}
-	*flagsp &= ~T1_VISIT;
+    opj_mqc_t *mqc = &(t1->mqc);   /* MQC component */
+    opj_t1_dec_clnpass_step_macro(OPJ_TRUE, OPJ_FALSE,
+                                  *flagsp, flagsp, t1->w + 2U, datap,
+                                  0, ci, mqc, mqc->curctx,
+                                  v, mqc->a, mqc->c, mqc->ct, oneplushalf, vsc);
 }
 
 static void opj_t1_enc_clnpass(
-		opj_t1_t *t1,
-		OPJ_INT32 bpno,
-		OPJ_UINT32 orient,
-		OPJ_INT32 *nmsedec,
-		OPJ_UINT32 cblksty)
+    opj_t1_t *t1,
+    OPJ_INT32 bpno,
+    OPJ_INT32 *nmsedec,
+    OPJ_UINT32 cblksty)
 {
-	OPJ_UINT32 i, j, k;
-	OPJ_INT32 one;
-	OPJ_UINT32 agg, runlen, vsc;
-	
-	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
-	
-	*nmsedec = 0;
-	one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
-	for (k = 0; k < t1->h; k += 4) {
-		for (i = 0; i < t1->w; ++i) {
-			if (k + 3 < t1->h) {
-				if (cblksty & J2K_CCP_CBLKSTY_VSC) {
-					agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
-						|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
-						|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
-						|| (MACRO_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 = !((MACRO_t1_flags(1 + k,1 + i) | 
-						    MACRO_t1_flags(1 + k + 1,1 + i) |
-						    MACRO_t1_flags(1 + k + 2,1 + i) | 
-						     MACRO_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 (opj_int_abs(t1->data[((k + runlen)*t1->data_stride) + i]) & one)
-						break;
-				}
-				opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
-				opj_mqc_encode(mqc, runlen != 4);
-				if (runlen == 4) {
-					continue;
-				}
-				opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
-				opj_mqc_encode(mqc, runlen >> 1);
-				opj_mqc_encode(mqc, runlen & 1);
-			} else {
-				runlen = 0;
-			}
-			for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
-				vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 || j == t1->h - 1)) ? 1 : 0;
-				opj_t1_enc_clnpass_step(
-						t1,
-						&t1->flags[((j+1) * t1->flags_stride) + i + 1],
-						&t1->data[(j * t1->data_stride) + i],
-						orient,
-						bpno,
-						one,
-						nmsedec,
-						agg && (j == k + runlen),
-						vsc);
-			}
-		}
-	}
+    OPJ_UINT32 i, k;
+    const OPJ_INT32 one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
+    OPJ_UINT32 agg, runlen;
+
+    opj_mqc_t *mqc = &(t1->mqc);   /* MQC component */
+
+    *nmsedec = 0;
+#ifdef DEBUG_ENC_CLN
+    printf("enc_clnpass: bpno=%d\n", bpno);
+#endif
+    for (k = 0; k < (t1->h & ~3U); k += 4) {
+#ifdef DEBUG_ENC_CLN
+        printf(" k=%d\n", k);
+#endif
+        for (i = 0; i < t1->w; ++i) {
+#ifdef DEBUG_ENC_CLN
+            printf("  i=%d\n", i);
+#endif
+            agg = !(T1_FLAGS(i, k));
+#ifdef DEBUG_ENC_CLN
+            printf("   agg=%d\n", agg);
+#endif
+            if (agg) {
+                for (runlen = 0; runlen < 4; ++runlen) {
+                    if (opj_int_abs(t1->data[((k + runlen)*t1->data_stride) + i]) & one) {
+                        break;
+                    }
+                }
+                opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
+                opj_mqc_encode(mqc, runlen != 4);
+                if (runlen == 4) {
+                    continue;
+                }
+                opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
+                opj_mqc_encode(mqc, runlen >> 1);
+                opj_mqc_encode(mqc, runlen & 1);
+            } else {
+                runlen = 0;
+            }
+            opj_t1_enc_clnpass_step(
+                t1,
+                &T1_FLAGS(i, k),
+                &t1->data[((k + runlen) * t1->data_stride) + i],
+                bpno,
+                one,
+                nmsedec,
+                agg,
+                runlen,
+                4U,
+                cblksty);
+        }
+    }
+    if (k < t1->h) {
+        agg = 0;
+        runlen = 0;
+#ifdef DEBUG_ENC_CLN
+        printf(" k=%d\n", k);
+#endif
+        for (i = 0; i < t1->w; ++i) {
+#ifdef DEBUG_ENC_CLN
+            printf("  i=%d\n", i);
+            printf("   agg=%d\n", agg);
+#endif
+            opj_t1_enc_clnpass_step(
+                t1,
+                &T1_FLAGS(i, k),
+                &t1->data[((k + runlen) * t1->data_stride) + i],
+                bpno,
+                one,
+                nmsedec,
+                agg,
+                runlen,
+                t1->h - k,
+                cblksty);
+        }
+    }
+}
+
+#define opj_t1_dec_clnpass_internal(t1, bpno, vsc, w, h, flags_stride) \
+{ \
+    OPJ_INT32 one, half, oneplushalf; \
+    OPJ_UINT32 runlen; \
+    OPJ_UINT32 i, j, k; \
+    const OPJ_UINT32 l_w = w; \
+    opj_mqc_t* mqc = &(t1->mqc); \
+    register OPJ_INT32 *data = t1->data; \
+    register opj_flag_t *flagsp = &t1->flags[flags_stride + 1]; \
+    DOWNLOAD_MQC_VARIABLES(mqc, curctx, c, a, ct); \
+    register OPJ_UINT32 v; \
+    one = 1 << bpno; \
+    half = one >> 1; \
+    oneplushalf = one | half; \
+    for (k = 0; k < (h & ~3u); k += 4, data += 3*l_w, flagsp += 2) { \
+        for (i = 0; i < l_w; ++i, ++data, ++flagsp) { \
+            opj_flag_t flags = *flagsp; \
+            if (flags == 0) { \
+                OPJ_UINT32 partial = OPJ_TRUE; \
+                opj_t1_setcurctx(curctx, T1_CTXNO_AGG); \
+                opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
+                if (!v) { \
+                    continue; \
+                } \
+                opj_t1_setcurctx(curctx, T1_CTXNO_UNI); \
+                opj_mqc_decode_macro(runlen, mqc, curctx, a, c, ct); \
+                opj_mqc_decode_macro(v, mqc, curctx, a, c, ct); \
+                runlen = (runlen << 1) | v; \
+                switch(runlen) { \
+                    case 0: \
+                        opj_t1_dec_clnpass_step_macro(OPJ_FALSE, OPJ_TRUE,\
+                                            flags, flagsp, flags_stride, data, \
+                                            l_w, 0, mqc, curctx, \
+                                            v, a, c, ct, oneplushalf, vsc); \
+                        partial = OPJ_FALSE; \
+                        /* FALLTHRU */ \
+                    case 1: \
+                        opj_t1_dec_clnpass_step_macro(OPJ_FALSE, partial,\
+                                            flags, flagsp, flags_stride, data, \
+                                            l_w, 1, mqc, curctx, \
+                                            v, a, c, ct, oneplushalf, OPJ_FALSE); \
+                        partial = OPJ_FALSE; \
+                        /* FALLTHRU */ \
+                    case 2: \
+                        opj_t1_dec_clnpass_step_macro(OPJ_FALSE, partial,\
+                                            flags, flagsp, flags_stride, data, \
+                                            l_w, 2, mqc, curctx, \
+                                            v, a, c, ct, oneplushalf, OPJ_FALSE); \
+                        partial = OPJ_FALSE; \
+                        /* FALLTHRU */ \
+                    case 3: \
+                        opj_t1_dec_clnpass_step_macro(OPJ_FALSE, partial,\
+                                            flags, flagsp, flags_stride, data, \
+                                            l_w, 3, mqc, curctx, \
+                                            v, a, c, ct, oneplushalf, OPJ_FALSE); \
+                        break; \
+                } \
+            } else { \
+                opj_t1_dec_clnpass_step_macro(OPJ_TRUE, OPJ_FALSE, \
+                                    flags, flagsp, flags_stride, data, \
+                                    l_w, 0, mqc, curctx, \
+                                    v, a, c, ct, oneplushalf, vsc); \
+                opj_t1_dec_clnpass_step_macro(OPJ_TRUE, OPJ_FALSE, \
+                                    flags, flagsp, flags_stride, data, \
+                                    l_w, 1, mqc, curctx, \
+                                    v, a, c, ct, oneplushalf, OPJ_FALSE); \
+                opj_t1_dec_clnpass_step_macro(OPJ_TRUE, OPJ_FALSE, \
+                                    flags, flagsp, flags_stride, data, \
+                                    l_w, 2, mqc, curctx, \
+                                    v, a, c, ct, oneplushalf, OPJ_FALSE); \
+                opj_t1_dec_clnpass_step_macro(OPJ_TRUE, OPJ_FALSE, \
+                                    flags, flagsp, flags_stride, data, \
+                                    l_w, 3, mqc, curctx, \
+                                    v, a, c, ct, oneplushalf, OPJ_FALSE); \
+            } \
+            *flagsp = flags & ~(T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3); \
+        } \
+    } \
+    UPLOAD_MQC_VARIABLES(mqc, curctx, c, a, ct); \
+    if( k < h ) { \
+        for (i = 0; i < l_w; ++i, ++flagsp, ++data) { \
+            for (j = 0; j < h - k; ++j) { \
+                opj_t1_dec_clnpass_step(t1, flagsp, data + j * l_w, oneplushalf, j, vsc); \
+            } \
+            *flagsp &= ~(T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3); \
+        } \
+    } \
+}
+
+static void opj_t1_dec_clnpass_check_segsym(opj_t1_t *t1, OPJ_INT32 cblksty)
+{
+    if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) {
+        opj_mqc_t* mqc = &(t1->mqc);
+        OPJ_UINT32 v, v2;
+        opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
+        opj_mqc_decode(v, mqc);
+        opj_mqc_decode(v2, mqc);
+        v = (v << 1) | v2;
+        opj_mqc_decode(v2, mqc);
+        v = (v << 1) | v2;
+        opj_mqc_decode(v2, mqc);
+        v = (v << 1) | v2;
+        /*
+        if (v!=0xa) {
+            opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
+        }
+        */
+    }
+}
+
+static void opj_t1_dec_clnpass_64x64_novsc(
+    opj_t1_t *t1,
+    OPJ_INT32 bpno)
+{
+    opj_t1_dec_clnpass_internal(t1, bpno, OPJ_FALSE, 64, 64, 66);
+}
+
+static void opj_t1_dec_clnpass_64x64_vsc(
+    opj_t1_t *t1,
+    OPJ_INT32 bpno)
+{
+    opj_t1_dec_clnpass_internal(t1, bpno, OPJ_TRUE, 64, 64, 66);
+}
+
+static void opj_t1_dec_clnpass_generic_novsc(
+    opj_t1_t *t1,
+    OPJ_INT32 bpno)
+{
+    opj_t1_dec_clnpass_internal(t1, bpno, OPJ_FALSE, t1->w, t1->h,
+                                t1->w + 2U);
+}
+
+static void opj_t1_dec_clnpass_generic_vsc(
+    opj_t1_t *t1,
+    OPJ_INT32 bpno)
+{
+    opj_t1_dec_clnpass_internal(t1, bpno, OPJ_TRUE, t1->w, t1->h,
+                                t1->w + 2U);
 }
 
 static void opj_t1_dec_clnpass(
-		opj_t1_t *t1,
-		OPJ_INT32 bpno,
-		OPJ_INT32 orient,
-		OPJ_INT32 cblksty)
+    opj_t1_t *t1,
+    OPJ_INT32 bpno,
+    OPJ_INT32 cblksty)
 {
-	OPJ_INT32 one, half, oneplushalf, agg, runlen, vsc;
-    OPJ_UINT32 i, j, k;
-	OPJ_INT32 segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;
-	
-	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
-	
-	one = 1 << bpno;
-	half = one >> 1;
-	oneplushalf = one | half;
-	if (cblksty & J2K_CCP_CBLKSTY_VSC) {
-	for (k = 0; k < t1->h; k += 4) {
-		for (i = 0; i < t1->w; ++i) {
-			if (k + 3 < t1->h) {
-					agg = !(MACRO_t1_flags(1 + k,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
-						|| MACRO_t1_flags(1 + k + 1,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
-						|| MACRO_t1_flags(1 + k + 2,1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
-						|| (MACRO_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 = 0;
-			}
-			if (agg) {
-				opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
-				if (!opj_mqc_decode(mqc)) {
-					continue;
-				}
-				opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
-				runlen = opj_mqc_decode(mqc);
-				runlen = (runlen << 1) | opj_mqc_decode(mqc);
-			} else {
-				runlen = 0;
-			}
-			for (j = k + (OPJ_UINT32)runlen; j < k + 4 && j < t1->h; ++j) {
-					vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
-					opj_t1_dec_clnpass_step_vsc(
-						t1,
-						&t1->flags[((j+1) * t1->flags_stride) + i + 1],
-						&t1->data[(j * t1->w) + i],
-						orient,
-						oneplushalf,
-						agg && (j == k + (OPJ_UINT32)runlen),
-						vsc);
-			}
-		}
-	}
-	} else {
-		OPJ_INT32 *data1 = t1->data;
-		opj_flag_t *flags1 = &t1->flags[1];
-		for (k = 0; k < (t1->h & ~3u); k += 4) {
-			for (i = 0; i < t1->w; ++i) {
-				OPJ_INT32 *data2 = data1 + i;
-				opj_flag_t *flags2 = flags1 + i;
-				agg = !((MACRO_t1_flags(1 + k, 1 + i) |
-							MACRO_t1_flags(1 + k + 1, 1 + i) |
-							MACRO_t1_flags(1 + k + 2, 1 + i) |
-							MACRO_t1_flags(1 + k + 3, 1 + i)) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
-				if (agg) {
-					opj_mqc_setcurctx(mqc, T1_CTXNO_AGG);
-					if (!opj_mqc_decode(mqc)) {
-						continue;
-					}
-					opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
-					runlen = opj_mqc_decode(mqc);
-					runlen = (runlen << 1) | opj_mqc_decode(mqc);
-					flags2 += (OPJ_UINT32)runlen * t1->flags_stride;
-					data2 += (OPJ_UINT32)runlen * t1->w;
-					for (j = (OPJ_UINT32)runlen; j < 4 && j < t1->h; ++j) {
-						flags2 += t1->flags_stride;
-						if (agg && (j == (OPJ_UINT32)runlen)) {
-							opj_t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf);
-						} else {
-							opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
-						}
-						data2 += t1->w;
-					}
-				} else {
-					flags2 += t1->flags_stride;
-					opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
-					data2 += t1->w;
-					flags2 += t1->flags_stride;
-					opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
-					data2 += t1->w;
-					flags2 += t1->flags_stride;
-					opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
-					data2 += t1->w;
-					flags2 += t1->flags_stride;
-					opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
-					data2 += t1->w;
-				}
-			}
-			data1 += t1->w << 2;
-			flags1 += t1->flags_stride << 2;
-		}
-		for (i = 0; i < t1->w; ++i) {
-			OPJ_INT32 *data2 = data1 + i;
-			opj_flag_t *flags2 = flags1 + i;
-			for (j = k; j < t1->h; ++j) {
-				flags2 += t1->flags_stride;
-				opj_t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
-				data2 += t1->w;
-			}
-		}
-	}
-
-	if (segsym) {
-		OPJ_INT32 v = 0;
-		opj_mqc_setcurctx(mqc, T1_CTXNO_UNI);
-		v = opj_mqc_decode(mqc);
-		v = (v << 1) | opj_mqc_decode(mqc);
-		v = (v << 1) | opj_mqc_decode(mqc);
-		v = (v << 1) | opj_mqc_decode(mqc);
-		/*
-		if (v!=0xa) {
-			opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
-		} 
-		*/
-	}
-}				/* VSC and  BYPASS by Antonin */
+    if (t1->w == 64 && t1->h == 64) {
+        if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+            opj_t1_dec_clnpass_64x64_vsc(t1, bpno);
+        } else {
+            opj_t1_dec_clnpass_64x64_novsc(t1, bpno);
+        }
+    } else {
+        if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+            opj_t1_dec_clnpass_generic_vsc(t1, bpno);
+        } else {
+            opj_t1_dec_clnpass_generic_novsc(t1, bpno);
+        }
+    }
+    opj_t1_dec_clnpass_check_segsym(t1, cblksty);
+}
 
 
 /** mod fixed_quality */
 static OPJ_FLOAT64 opj_t1_getwmsedec(
-		OPJ_INT32 nmsedec,
-		OPJ_UINT32 compno,
-		OPJ_UINT32 level,
-		OPJ_UINT32 orient,
-		OPJ_INT32 bpno,
-		OPJ_UINT32 qmfbid,
-		OPJ_FLOAT64 stepsize,
-		OPJ_UINT32 numcomps,
-		const OPJ_FLOAT64 * mct_norms,
-		OPJ_UINT32 mct_numcomps)
+    OPJ_INT32 nmsedec,
+    OPJ_UINT32 compno,
+    OPJ_UINT32 level,
+    OPJ_UINT32 orient,
+    OPJ_INT32 bpno,
+    OPJ_UINT32 qmfbid,
+    OPJ_FLOAT64 stepsize,
+    OPJ_UINT32 numcomps,
+    const OPJ_FLOAT64 * mct_norms,
+    OPJ_UINT32 mct_numcomps)
 {
-	OPJ_FLOAT64 w1 = 1, w2, wmsedec;
-	OPJ_ARG_NOT_USED(numcomps);
+    OPJ_FLOAT64 w1 = 1, w2, wmsedec;
+    OPJ_ARG_NOT_USED(numcomps);
 
-	if (mct_norms && (compno < mct_numcomps)) {
-		w1 = mct_norms[compno];
-	}
+    if (mct_norms && (compno < mct_numcomps)) {
+        w1 = mct_norms[compno];
+    }
 
-	if (qmfbid == 1) {
-		w2 = opj_dwt_getnorm(level, orient);
-	} else {	/* if (qmfbid == 0) */
-		w2 = opj_dwt_getnorm_real(level, orient);
-	}
+    if (qmfbid == 1) {
+        w2 = opj_dwt_getnorm(level, orient);
+    } else {    /* if (qmfbid == 0) */
+        w2 = opj_dwt_getnorm_real(level, orient);
+    }
 
-	wmsedec = w1 * w2 * stepsize * (1 << bpno);
-	wmsedec *= wmsedec * nmsedec / 8192.0;
+    wmsedec = w1 * w2 * stepsize * (1 << bpno);
+    wmsedec *= wmsedec * nmsedec / 8192.0;
 
-	return wmsedec;
+    return wmsedec;
 }
 
 static OPJ_BOOL opj_t1_allocate_buffers(
-		opj_t1_t *t1,
-		OPJ_UINT32 w,
-		OPJ_UINT32 h)
+    opj_t1_t *t1,
+    OPJ_UINT32 w,
+    OPJ_UINT32 h)
 {
-	OPJ_UINT32 datasize=w * h;
-	OPJ_UINT32 flagssize;
+    size_t flagssize;
+    OPJ_UINT32 flags_stride;
 
-	/* encoder uses tile buffer, so no need to allocate */
-	if (!t1->encoder) {
-		if(datasize > t1->datasize){
-			opj_aligned_free(t1->data);
-			if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(OPJ_INT32) < datasize) {
-				return OPJ_FALSE;
-			}
-			t1->data = (OPJ_INT32*) opj_aligned_malloc(datasize * sizeof(OPJ_INT32));
-			if(!t1->data){
-				/* FIXME event manager error callback */
-				return OPJ_FALSE;
-			}
-			t1->datasize=datasize;
-		}
-		memset(t1->data,0,datasize * sizeof(OPJ_INT32));
-	}
-	t1->flags_stride=w+2;
-	flagssize=t1->flags_stride * (h+2);
+    /* encoder uses tile buffer, so no need to allocate */
+    if (!t1->encoder) {
+        size_t datasize;
 
-	if(flagssize > t1->flagssize){
-		opj_aligned_free(t1->flags);
-		if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(opj_flag_t) < flagssize) {
-			return OPJ_FALSE;
-		}
-		t1->flags = (opj_flag_t*) opj_aligned_malloc(flagssize * sizeof(opj_flag_t));
-		if(!t1->flags){
-			/* FIXME event manager error callback */
-			return OPJ_FALSE;
-		}
-		t1->flagssize=flagssize;
-	}
-	memset(t1->flags,0,flagssize * sizeof(opj_flag_t));
+#if (SIZE_MAX / 0xFFFFFFFFU) < 0xFFFFFFFFU /* UINT32_MAX */
+        /* Overflow check */
+        if ((w > 0U) && ((size_t)h > (SIZE_MAX / (size_t)w))) {
+            /* FIXME event manager error callback */
+            return OPJ_FALSE;
+        }
+#endif
+        datasize = (size_t)w * h;
 
-	t1->w=w;
-	t1->h=h;
+        /* Overflow check */
+        if (datasize > (SIZE_MAX / sizeof(OPJ_INT32))) {
+            /* FIXME event manager error callback */
+            return OPJ_FALSE;
+        }
 
-	return OPJ_TRUE;
+        if (datasize > (size_t)t1->datasize) {
+            opj_aligned_free(t1->data);
+            t1->data = (OPJ_INT32*) opj_aligned_malloc(datasize * sizeof(OPJ_INT32));
+            if (!t1->data) {
+                /* FIXME event manager error callback */
+                return OPJ_FALSE;
+            }
+#if SIZE_MAX > 0xFFFFFFFFU /* UINT32_MAX */
+            /* TODO remove this if t1->datasize type changes to size_t */
+            /* Overflow check */
+            if (datasize > (size_t)0xFFFFFFFFU /* UINT32_MAX */) {
+                /* FIXME event manager error callback */
+                return OPJ_FALSE;
+            }
+#endif
+            t1->datasize = (OPJ_UINT32)datasize;
+        }
+        /* memset first arg is declared to never be null by gcc */
+        if (t1->data != NULL) {
+            memset(t1->data, 0, datasize * sizeof(OPJ_INT32));
+        }
+    }
+
+    /* Overflow check */
+    if (w > (0xFFFFFFFFU /* UINT32_MAX */ - 2U)) {
+        /* FIXME event manager error callback */
+        return OPJ_FALSE;
+    }
+    flags_stride = w + 2U; /* can't be 0U */
+
+#if (SIZE_MAX - 3U) < 0xFFFFFFFFU /* UINT32_MAX */
+    /* Overflow check */
+    if (h > (0xFFFFFFFFU /* UINT32_MAX */ - 3U)) {
+        /* FIXME event manager error callback */
+        return OPJ_FALSE;
+    }
+#endif
+    flagssize = (h + 3U) / 4U + 2U;
+
+    /* Overflow check */
+    if (flagssize > (SIZE_MAX / (size_t)flags_stride)) {
+        /* FIXME event manager error callback */
+        return OPJ_FALSE;
+    }
+    flagssize *= (size_t)flags_stride;
+    {
+        /* BIG FAT XXX */
+        opj_flag_t* p;
+        OPJ_UINT32 x;
+        OPJ_UINT32 flags_height = (h + 3U) / 4U;
+
+        if (flagssize > (size_t)t1->flagssize) {
+            /* Overflow check */
+            if (flagssize > (SIZE_MAX / sizeof(opj_flag_t))) {
+                /* FIXME event manager error callback */
+                return OPJ_FALSE;
+            }
+            opj_aligned_free(t1->flags);
+            t1->flags = (opj_flag_t*) opj_aligned_malloc(flagssize * sizeof(
+                            opj_flag_t));
+            if (!t1->flags) {
+                /* FIXME event manager error callback */
+                return OPJ_FALSE;
+            }
+#if SIZE_MAX > 0xFFFFFFFFU /* UINT32_MAX */
+            /* TODO remove this if t1->flagssize type changes to size_t */
+            /* Overflow check */
+            if (flagssize > (size_t)0xFFFFFFFFU /* UINT32_MAX */) {
+                /* FIXME event manager error callback */
+                return OPJ_FALSE;
+            }
+#endif
+        }
+        t1->flagssize = (OPJ_UINT32)flagssize;
+
+        memset(t1->flags, 0, flagssize * sizeof(opj_flag_t));
+
+        p = &t1->flags[0];
+        for (x = 0; x < flags_stride; ++x) {
+            /* magic value to hopefully stop any passes being interested in this entry */
+            *p++ = (T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3);
+        }
+
+        p = &t1->flags[((flags_height + 1) * flags_stride)];
+        for (x = 0; x < flags_stride; ++x) {
+            /* magic value to hopefully stop any passes being interested in this entry */
+            *p++ = (T1_PI_0 | T1_PI_1 | T1_PI_2 | T1_PI_3);
+        }
+
+        if (h % 4) {
+            OPJ_UINT32 v = 0;
+            p = &t1->flags[((flags_height) * flags_stride)];
+            if (h % 4 == 1) {
+                v |= T1_PI_1 | T1_PI_2 | T1_PI_3;
+            } else if (h % 4 == 2) {
+                v |= T1_PI_2 | T1_PI_3;
+            } else if (h % 4 == 3) {
+                v |= T1_PI_3;
+            }
+            for (x = 0; x < flags_stride; ++x) {
+                *p++ = v;
+            }
+        }
+    }
+
+    t1->w = w;
+    t1->h = h;
+
+    return OPJ_TRUE;
 }
 
 /* ----------------------------------------------------------------------- */
@@ -1218,28 +1569,16 @@
 */
 opj_t1_t* opj_t1_create(OPJ_BOOL isEncoder)
 {
-	opj_t1_t *l_t1 = 00;
+    opj_t1_t *l_t1 = 00;
 
-	l_t1 = (opj_t1_t*) opj_calloc(1,sizeof(opj_t1_t));
-	if (!l_t1) {
-		return 00;
-	}
+    l_t1 = (opj_t1_t*) opj_calloc(1, sizeof(opj_t1_t));
+    if (!l_t1) {
+        return 00;
+    }
 
-	/* create MQC and RAW handles */
-	l_t1->mqc = opj_mqc_create();
-	if (! l_t1->mqc) {
-		opj_t1_destroy(l_t1);
-		return 00;
-	}
+    l_t1->encoder = isEncoder;
 
-	l_t1->raw = opj_raw_create();
-	if (! l_t1->raw) {
-		opj_t1_destroy(l_t1);
-		return 00;
-	}
-	l_t1->encoder = isEncoder;
-
-	return l_t1;
+    return l_t1;
 }
 
 
@@ -1250,524 +1589,696 @@
 */
 void opj_t1_destroy(opj_t1_t *p_t1)
 {
-	if (! p_t1) {
-		return;
-	}
+    if (! p_t1) {
+        return;
+    }
 
-	/* destroy MQC and RAW handles */
-	opj_mqc_destroy(p_t1->mqc);
-	p_t1->mqc = 00;
-	opj_raw_destroy(p_t1->raw);
-	p_t1->raw = 00;
-	
-	/* encoder uses tile buffer, so no need to free */
-	if (!p_t1->encoder && p_t1->data) {
-		opj_aligned_free(p_t1->data);
-		p_t1->data = 00;
-	}
+    /* encoder uses tile buffer, so no need to free */
+    if (!p_t1->encoder && p_t1->data) {
+        opj_aligned_free(p_t1->data);
+        p_t1->data = 00;
+    }
 
-	if (p_t1->flags) {
-		opj_aligned_free(p_t1->flags);
-		p_t1->flags = 00;
-	}
+    if (p_t1->flags) {
+        opj_aligned_free(p_t1->flags);
+        p_t1->flags = 00;
+    }
 
-	opj_free(p_t1);
+    opj_free(p_t1->cblkdatabuffer);
+
+    opj_free(p_t1);
 }
 
-OPJ_BOOL opj_t1_decode_cblks(   opj_t1_t* t1,
-                            opj_tcd_tilecomp_t* tilec,
-                            opj_tccp_t* tccp
-                            )
+typedef struct {
+    OPJ_UINT32 resno;
+    opj_tcd_cblk_dec_t* cblk;
+    opj_tcd_band_t* band;
+    opj_tcd_tilecomp_t* tilec;
+    opj_tccp_t* tccp;
+    OPJ_BOOL mustuse_cblkdatabuffer;
+    volatile OPJ_BOOL* pret;
+    opj_event_mgr_t *p_manager;
+    opj_mutex_t* p_manager_mutex;
+    OPJ_BOOL check_pterm;
+} opj_t1_cblk_decode_processing_job_t;
+
+static void opj_t1_destroy_wrapper(void* t1)
 {
-	OPJ_UINT32 resno, bandno, precno, cblkno;
-	OPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
+    opj_t1_destroy((opj_t1_t*) t1);
+}
 
-	for (resno = 0; resno < tilec->minimum_num_resolutions; ++resno) {
-		opj_tcd_resolution_t* res = &tilec->resolutions[resno];
+static void opj_t1_clbl_decode_processor(void* user_data, opj_tls_t* tls)
+{
+    opj_tcd_cblk_dec_t* cblk;
+    opj_tcd_band_t* band;
+    opj_tcd_tilecomp_t* tilec;
+    opj_tccp_t* tccp;
+    OPJ_INT32* OPJ_RESTRICT datap;
+    OPJ_UINT32 cblk_w, cblk_h;
+    OPJ_INT32 x, y;
+    OPJ_UINT32 i, j;
+    opj_t1_cblk_decode_processing_job_t* job;
+    opj_t1_t* t1;
+    OPJ_UINT32 resno;
+    OPJ_UINT32 tile_w;
 
-		for (bandno = 0; bandno < res->numbands; ++bandno) {
-			opj_tcd_band_t* restrict band = &res->bands[bandno];
+    job = (opj_t1_cblk_decode_processing_job_t*) user_data;
+    resno = job->resno;
+    cblk = job->cblk;
+    band = job->band;
+    tilec = job->tilec;
+    tccp = job->tccp;
+    tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
 
-			for (precno = 0; precno < res->pw * res->ph; ++precno) {
-				opj_tcd_precinct_t* precinct = &band->precincts[precno];
+    if (!*(job->pret)) {
+        opj_free(job);
+        return;
+    }
 
-				for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
-					opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
-					OPJ_INT32* restrict datap;
-					OPJ_UINT32 cblk_w, cblk_h;
-					OPJ_INT32 x, y;
-					OPJ_UINT32 i, j;
+    t1 = (opj_t1_t*) opj_tls_get(tls, OPJ_TLS_KEY_T1);
+    if (t1 == NULL) {
+        t1 = opj_t1_create(OPJ_FALSE);
+        opj_tls_set(tls, OPJ_TLS_KEY_T1, t1, opj_t1_destroy_wrapper);
+    }
+    t1->mustuse_cblkdatabuffer = job->mustuse_cblkdatabuffer;
 
-                    if (OPJ_FALSE == opj_t1_decode_cblk(
-                                            t1,
-                                            cblk,
-                                            band->bandno,
-                                            (OPJ_UINT32)tccp->roishift,
-                                            tccp->cblksty)) {
-                            return OPJ_FALSE;
+    if (OPJ_FALSE == opj_t1_decode_cblk(
+                t1,
+                cblk,
+                band->bandno,
+                (OPJ_UINT32)tccp->roishift,
+                tccp->cblksty,
+                job->p_manager,
+                job->p_manager_mutex,
+                job->check_pterm)) {
+        *(job->pret) = OPJ_FALSE;
+        opj_free(job);
+        return;
+    }
+
+    x = cblk->x0 - band->x0;
+    y = cblk->y0 - band->y0;
+    if (band->bandno & 1) {
+        opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
+        x += pres->x1 - pres->x0;
+    }
+    if (band->bandno & 2) {
+        opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
+        y += pres->y1 - pres->y0;
+    }
+
+    datap = t1->data;
+    cblk_w = t1->w;
+    cblk_h = t1->h;
+
+    if (tccp->roishift) {
+        if (tccp->roishift >= 31) {
+            for (j = 0; j < cblk_h; ++j) {
+                for (i = 0; i < cblk_w; ++i) {
+                    datap[(j * cblk_w) + i] = 0;
+                }
+            }
+        } else {
+            OPJ_INT32 thresh = 1 << tccp->roishift;
+            for (j = 0; j < cblk_h; ++j) {
+                for (i = 0; i < cblk_w; ++i) {
+                    OPJ_INT32 val = datap[(j * cblk_w) + i];
+                    OPJ_INT32 mag = abs(val);
+                    if (mag >= thresh) {
+                        mag >>= tccp->roishift;
+                        datap[(j * cblk_w) + i] = val < 0 ? -mag : mag;
                     }
+                }
+            }
+        }
+    }
+    if (tccp->qmfbid == 1) {
+        OPJ_INT32* OPJ_RESTRICT tiledp = &tilec->data[(OPJ_UINT32)y * tile_w +
+                                                       (OPJ_UINT32)x];
+        for (j = 0; j < cblk_h; ++j) {
+            i = 0;
+            for (; i < (cblk_w & ~(OPJ_UINT32)3U); i += 4U) {
+                OPJ_INT32 tmp0 = datap[(j * cblk_w) + i + 0U];
+                OPJ_INT32 tmp1 = datap[(j * cblk_w) + i + 1U];
+                OPJ_INT32 tmp2 = datap[(j * cblk_w) + i + 2U];
+                OPJ_INT32 tmp3 = datap[(j * cblk_w) + i + 3U];
+                ((OPJ_INT32*)tiledp)[(j * tile_w) + i + 0U] = tmp0 / 2;
+                ((OPJ_INT32*)tiledp)[(j * tile_w) + i + 1U] = tmp1 / 2;
+                ((OPJ_INT32*)tiledp)[(j * tile_w) + i + 2U] = tmp2 / 2;
+                ((OPJ_INT32*)tiledp)[(j * tile_w) + i + 3U] = tmp3 / 2;
+            }
+            for (; i < cblk_w; ++i) {
+                OPJ_INT32 tmp = datap[(j * cblk_w) + i];
+                ((OPJ_INT32*)tiledp)[(j * tile_w) + i] = tmp / 2;
+            }
+        }
+    } else {        /* if (tccp->qmfbid == 0) */
+        OPJ_FLOAT32* OPJ_RESTRICT tiledp = (OPJ_FLOAT32*) &tilec->data[(OPJ_UINT32)y *
+                                                         tile_w + (OPJ_UINT32)x];
+        for (j = 0; j < cblk_h; ++j) {
+            OPJ_FLOAT32* OPJ_RESTRICT tiledp2 = tiledp;
+            for (i = 0; i < cblk_w; ++i) {
+                OPJ_FLOAT32 tmp = (OPJ_FLOAT32) * datap * band->stepsize;
+                *tiledp2 = tmp;
+                datap++;
+                tiledp2++;
+            }
+            tiledp += tile_w;
+        }
+    }
 
-					x = cblk->x0 - band->x0;
-					y = cblk->y0 - band->y0;
-					if (band->bandno & 1) {
-						opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
-						x += pres->x1 - pres->x0;
-					}
-					if (band->bandno & 2) {
-						opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
-						y += pres->y1 - pres->y0;
-					}
+    opj_free(job);
+}
 
-					datap=t1->data;
-					cblk_w = t1->w;
-					cblk_h = t1->h;
 
-					if (tccp->roishift) {
-						OPJ_INT32 thresh = 1 << tccp->roishift;
-						for (j = 0; j < cblk_h; ++j) {
-							for (i = 0; i < cblk_w; ++i) {
-								OPJ_INT32 val = datap[(j * cblk_w) + i];
-								OPJ_INT32 mag = abs(val);
-								if (mag >= thresh) {
-									mag >>= tccp->roishift;
-									datap[(j * cblk_w) + i] = val < 0 ? -mag : mag;
-								}
-							}
-						}
-					}
-					if (tccp->qmfbid == 1) {
-                        OPJ_INT32* restrict tiledp = &tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
-						for (j = 0; j < cblk_h; ++j) {
-							for (i = 0; i < cblk_w; ++i) {
-								OPJ_INT32 tmp = datap[(j * cblk_w) + i];
-								((OPJ_INT32*)tiledp)[(j * tile_w) + i] = tmp/2;
-							}
-						}
-					} else {		/* if (tccp->qmfbid == 0) */
-                        OPJ_FLOAT32* restrict tiledp = (OPJ_FLOAT32*) &tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
-						for (j = 0; j < cblk_h; ++j) {
-                            OPJ_FLOAT32* restrict tiledp2 = tiledp;
-							for (i = 0; i < cblk_w; ++i) {
-                                OPJ_FLOAT32 tmp = (OPJ_FLOAT32)*datap * band->stepsize;
-                                *tiledp2 = tmp;
-                                datap++;
-                                tiledp2++;
-							}
-                            tiledp += tile_w;
-						}
-					}
-				} /* cblkno */
-			} /* precno */
-		} /* bandno */
-	} /* resno */
-        return OPJ_TRUE;
+void opj_t1_decode_cblks(opj_thread_pool_t* tp,
+                         volatile OPJ_BOOL* pret,
+                         opj_tcd_tilecomp_t* tilec,
+                         opj_tccp_t* tccp,
+                         opj_event_mgr_t *p_manager,
+                         opj_mutex_t* p_manager_mutex,
+                         OPJ_BOOL check_pterm
+                        )
+{
+    OPJ_UINT32 resno, bandno, precno, cblkno;
+
+    for (resno = 0; resno < tilec->minimum_num_resolutions; ++resno) {
+        opj_tcd_resolution_t* res = &tilec->resolutions[resno];
+
+        for (bandno = 0; bandno < res->numbands; ++bandno) {
+            opj_tcd_band_t* OPJ_RESTRICT band = &res->bands[bandno];
+
+            for (precno = 0; precno < res->pw * res->ph; ++precno) {
+                opj_tcd_precinct_t* precinct = &band->precincts[precno];
+
+                for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
+                    opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
+                    opj_t1_cblk_decode_processing_job_t* job;
+
+                    job = (opj_t1_cblk_decode_processing_job_t*) opj_calloc(1,
+                            sizeof(opj_t1_cblk_decode_processing_job_t));
+                    if (!job) {
+                        *pret = OPJ_FALSE;
+                        return;
+                    }
+                    job->resno = resno;
+                    job->cblk = cblk;
+                    job->band = band;
+                    job->tilec = tilec;
+                    job->tccp = tccp;
+                    job->pret = pret;
+                    job->p_manager_mutex = p_manager_mutex;
+                    job->p_manager = p_manager;
+                    job->check_pterm = check_pterm;
+                    job->mustuse_cblkdatabuffer = opj_thread_pool_get_thread_count(tp) > 1;
+                    opj_thread_pool_submit_job(tp, opj_t1_clbl_decode_processor, job);
+                    if (!(*pret)) {
+                        return;
+                    }
+                } /* cblkno */
+            } /* precno */
+        } /* bandno */
+    } /* resno */
+
+    return;
 }
 
 
 static OPJ_BOOL opj_t1_decode_cblk(opj_t1_t *t1,
-                            opj_tcd_cblk_dec_t* cblk,
-                            OPJ_UINT32 orient,
-                            OPJ_UINT32 roishift,
-                            OPJ_UINT32 cblksty)
+                                   opj_tcd_cblk_dec_t* cblk,
+                                   OPJ_UINT32 orient,
+                                   OPJ_UINT32 roishift,
+                                   OPJ_UINT32 cblksty,
+                                   opj_event_mgr_t *p_manager,
+                                   opj_mutex_t* p_manager_mutex,
+                                   OPJ_BOOL check_pterm)
 {
-	opj_raw_t *raw = t1->raw;	/* RAW component */
-	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+    opj_mqc_t *mqc = &(t1->mqc);   /* MQC component */
 
-	OPJ_INT32 bpno_plus_one;
-	OPJ_UINT32 passtype;
-	OPJ_UINT32 segno, passno;
-	OPJ_BYTE type = T1_TYPE_MQ; /* BYPASS mode */
+    OPJ_INT32 bpno_plus_one;
+    OPJ_UINT32 passtype;
+    OPJ_UINT32 segno, passno;
+    OPJ_BYTE* cblkdata = NULL;
+    OPJ_UINT32 cblkdataindex = 0;
+    OPJ_BYTE type = T1_TYPE_MQ; /* BYPASS mode */
 
-	if(!opj_t1_allocate_buffers(
-				t1,
-				(OPJ_UINT32)(cblk->x1 - cblk->x0),
-				(OPJ_UINT32)(cblk->y1 - cblk->y0)))
-	{
-		return OPJ_FALSE;
-	}
+    mqc->lut_ctxno_zc_orient = lut_ctxno_zc + (orient << 9);
 
-	bpno_plus_one = (OPJ_INT32)(roishift + cblk->numbps);
-    if (bpno_plus_one > 30) {
+    if (!opj_t1_allocate_buffers(
+                t1,
+                (OPJ_UINT32)(cblk->x1 - cblk->x0),
+                (OPJ_UINT32)(cblk->y1 - cblk->y0))) {
         return OPJ_FALSE;
     }
-	passtype = 2;
 
-	opj_mqc_resetstates(mqc);
-	opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
-	opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
-	opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+    bpno_plus_one = (OPJ_INT32)(roishift + cblk->numbps);
+    if (bpno_plus_one >= 31) {
+        if (p_manager_mutex) {
+            opj_mutex_lock(p_manager_mutex);
+        }
+        opj_event_msg(p_manager, EVT_WARNING,
+                      "opj_t1_decode_cblk(): unsupported bpno_plus_one = %d >= 31\n",
+                      bpno_plus_one);
+        if (p_manager_mutex) {
+            opj_mutex_unlock(p_manager_mutex);
+        }
+        return OPJ_FALSE;
+    }
+    passtype = 2;
 
-	for (segno = 0; segno < cblk->real_num_segs; ++segno) {
-		opj_tcd_seg_t *seg = &cblk->segs[segno];
+    opj_mqc_resetstates(mqc);
+    opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+    opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+    opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
 
-		/* BYPASS mode */
-		type = ((bpno_plus_one <= ((OPJ_INT32) (cblk->numbps)) - 4) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
-		/* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */
-		if(seg->data == 00){
-			continue;
-		}
-		if (type == T1_TYPE_RAW) {
-			opj_raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len);
-		} else {
-            if (OPJ_FALSE == opj_mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len)) {
-                    return OPJ_FALSE;
+    /* Even if we have a single chunk, in multi-threaded decoding */
+    /* the insertion of our synthetic marker might potentially override */
+    /* valid codestream of other codeblocks decoded in parallel. */
+    if (cblk->numchunks > 1 || t1->mustuse_cblkdatabuffer) {
+        OPJ_UINT32 i;
+        OPJ_UINT32 cblk_len;
+
+        /* Compute whole codeblock length from chunk lengths */
+        cblk_len = 0;
+        for (i = 0; i < cblk->numchunks; i++) {
+            cblk_len += cblk->chunks[i].len;
+        }
+
+        /* Allocate temporary memory if needed */
+        if (cblk_len + OPJ_COMMON_CBLK_DATA_EXTRA > t1->cblkdatabuffersize) {
+            cblkdata = (OPJ_BYTE*)opj_realloc(t1->cblkdatabuffer,
+                                              cblk_len + OPJ_COMMON_CBLK_DATA_EXTRA);
+            if (cblkdata == NULL) {
+                return OPJ_FALSE;
             }
-		}
+            t1->cblkdatabuffer = cblkdata;
+            memset(t1->cblkdatabuffer + cblk_len, 0, OPJ_COMMON_CBLK_DATA_EXTRA);
+            t1->cblkdatabuffersize = cblk_len + OPJ_COMMON_CBLK_DATA_EXTRA;
+        }
 
-		for (passno = 0; (passno < seg->real_num_passes) && (bpno_plus_one >= 1); ++passno) {
+        /* Concatenate all chunks */
+        cblkdata = t1->cblkdatabuffer;
+        cblk_len = 0;
+        for (i = 0; i < cblk->numchunks; i++) {
+            memcpy(cblkdata + cblk_len, cblk->chunks[i].data, cblk->chunks[i].len);
+            cblk_len += cblk->chunks[i].len;
+        }
+    } else if (cblk->numchunks == 1) {
+        cblkdata = cblk->chunks[0].data;
+    }
+
+    for (segno = 0; segno < cblk->real_num_segs; ++segno) {
+        opj_tcd_seg_t *seg = &cblk->segs[segno];
+
+        /* BYPASS mode */
+        type = ((bpno_plus_one <= ((OPJ_INT32)(cblk->numbps)) - 4) && (passtype < 2) &&
+                (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
+
+        if (type == T1_TYPE_RAW) {
+            opj_mqc_raw_init_dec(mqc, cblkdata + cblkdataindex, seg->len,
+                                 OPJ_COMMON_CBLK_DATA_EXTRA);
+        } else {
+            opj_mqc_init_dec(mqc, cblkdata + cblkdataindex, seg->len,
+                             OPJ_COMMON_CBLK_DATA_EXTRA);
+        }
+        cblkdataindex += seg->len;
+
+        for (passno = 0; (passno < seg->real_num_passes) &&
+                (bpno_plus_one >= 1); ++passno) {
             switch (passtype) {
-                case 0:
-                    if (type == T1_TYPE_RAW) {
-                        opj_t1_dec_sigpass_raw(t1, bpno_plus_one, (OPJ_INT32)orient, (OPJ_INT32)cblksty);
-                    } else {
-                        if (cblksty & J2K_CCP_CBLKSTY_VSC) {
-                            opj_t1_dec_sigpass_mqc_vsc(t1, bpno_plus_one, (OPJ_INT32)orient);
-                        } else {
-                            opj_t1_dec_sigpass_mqc(t1, bpno_plus_one, (OPJ_INT32)orient);
-                        }
-                    }
-                    break;
-                case 1:
-                    if (type == T1_TYPE_RAW) {
-                            opj_t1_dec_refpass_raw(t1, bpno_plus_one, (OPJ_INT32)cblksty);
-                    } else {
-                        if (cblksty & J2K_CCP_CBLKSTY_VSC) {
-                            opj_t1_dec_refpass_mqc_vsc(t1, bpno_plus_one);
-                        } else {
-                            opj_t1_dec_refpass_mqc(t1, bpno_plus_one);
-                        }
-                    }
-                    break;
-                case 2:
-                    opj_t1_dec_clnpass(t1, bpno_plus_one, (OPJ_INT32)orient, (OPJ_INT32)cblksty);
-                    break;
+            case 0:
+                if (type == T1_TYPE_RAW) {
+                    opj_t1_dec_sigpass_raw(t1, bpno_plus_one, (OPJ_INT32)cblksty);
+                } else {
+                    opj_t1_dec_sigpass_mqc(t1, bpno_plus_one, (OPJ_INT32)cblksty);
+                }
+                break;
+            case 1:
+                if (type == T1_TYPE_RAW) {
+                    opj_t1_dec_refpass_raw(t1, bpno_plus_one);
+                } else {
+                    opj_t1_dec_refpass_mqc(t1, bpno_plus_one);
+                }
+                break;
+            case 2:
+                opj_t1_dec_clnpass(t1, bpno_plus_one, (OPJ_INT32)cblksty);
+                break;
             }
 
-			if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
-				opj_mqc_resetstates(mqc);
-				opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
-				opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
-				opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
-			}
-			if (++passtype == 3) {
-				passtype = 0;
-				bpno_plus_one--;
-			}
-		}
-	}
+            if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
+                opj_mqc_resetstates(mqc);
+                opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+                opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+                opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+            }
+            if (++passtype == 3) {
+                passtype = 0;
+                bpno_plus_one--;
+            }
+        }
+
+        opq_mqc_finish_dec(mqc);
+    }
+
+    if (check_pterm) {
+        if (mqc->bp + 2 < mqc->end) {
+            if (p_manager_mutex) {
+                opj_mutex_lock(p_manager_mutex);
+            }
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "PTERM check failure: %d remaining bytes in code block (%d used / %d)\n",
+                          (int)(mqc->end - mqc->bp) - 2,
+                          (int)(mqc->bp - mqc->start),
+                          (int)(mqc->end - mqc->start));
+            if (p_manager_mutex) {
+                opj_mutex_unlock(p_manager_mutex);
+            }
+        } else if (mqc->end_of_byte_stream_counter > 2) {
+            if (p_manager_mutex) {
+                opj_mutex_lock(p_manager_mutex);
+            }
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "PTERM check failure: %d synthetized 0xFF markers read\n",
+                          mqc->end_of_byte_stream_counter);
+            if (p_manager_mutex) {
+                opj_mutex_unlock(p_manager_mutex);
+            }
+        }
+    }
+
     return OPJ_TRUE;
 }
 
 
 
 
-OPJ_BOOL opj_t1_encode_cblks(   opj_t1_t *t1,
-                                opj_tcd_tile_t *tile,
-                                opj_tcp_t *tcp,
-                                const OPJ_FLOAT64 * mct_norms,
-                                OPJ_UINT32 mct_numcomps
-                                )
+OPJ_BOOL opj_t1_encode_cblks(opj_t1_t *t1,
+                             opj_tcd_tile_t *tile,
+                             opj_tcp_t *tcp,
+                             const OPJ_FLOAT64 * mct_norms,
+                             OPJ_UINT32 mct_numcomps
+                            )
 {
-	OPJ_UINT32 compno, resno, bandno, precno, cblkno;
+    OPJ_UINT32 compno, resno, bandno, precno, cblkno;
 
-	tile->distotile = 0;		/* fixed_quality */
+    tile->distotile = 0;        /* fixed_quality */
 
-	for (compno = 0; compno < tile->numcomps; ++compno) {
-		opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
-		opj_tccp_t* tccp = &tcp->tccps[compno];
-		OPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
+    for (compno = 0; compno < tile->numcomps; ++compno) {
+        opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
+        opj_tccp_t* tccp = &tcp->tccps[compno];
+        OPJ_UINT32 tile_w = (OPJ_UINT32)(tilec->x1 - tilec->x0);
 
-		for (resno = 0; resno < tilec->numresolutions; ++resno) {
-			opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+        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* restrict band = &res->bands[bandno];
-                OPJ_INT32 bandconst = 8192 * 8192 / ((OPJ_INT32) floor(band->stepsize * 8192));
+            for (bandno = 0; bandno < res->numbands; ++bandno) {
+                opj_tcd_band_t* OPJ_RESTRICT band = &res->bands[bandno];
+                OPJ_INT32 bandconst;
 
-				for (precno = 0; precno < res->pw * res->ph; ++precno) {
-					opj_tcd_precinct_t *prc = &band->precincts[precno];
+                /* Skip empty bands */
+                if (opj_tcd_is_band_empty(band)) {
+                    continue;
+                }
 
-					for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {
-						opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
-						OPJ_INT32* restrict tiledp;
-						OPJ_UINT32 cblk_w;
-						OPJ_UINT32 cblk_h;
-						OPJ_UINT32 i, j, tileIndex=0, tileLineAdvance;
+                bandconst = 8192 * 8192 / ((OPJ_INT32) floor(band->stepsize * 8192));
+                for (precno = 0; precno < res->pw * res->ph; ++precno) {
+                    opj_tcd_precinct_t *prc = &band->precincts[precno];
 
-						OPJ_INT32 x = cblk->x0 - band->x0;
-						OPJ_INT32 y = cblk->y0 - band->y0;
-						if (band->bandno & 1) {
-							opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
-							x += pres->x1 - pres->x0;
-						}
-						if (band->bandno & 2) {
-							opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
-							y += pres->y1 - pres->y0;
-						}
+                    for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {
+                        opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
+                        OPJ_INT32* OPJ_RESTRICT tiledp;
+                        OPJ_UINT32 cblk_w;
+                        OPJ_UINT32 cblk_h;
+                        OPJ_UINT32 i, j, tileIndex = 0, tileLineAdvance;
 
-						if(!opj_t1_allocate_buffers(
-									t1,
-									(OPJ_UINT32)(cblk->x1 - cblk->x0),
-									(OPJ_UINT32)(cblk->y1 - cblk->y0)))
-						{
-							return OPJ_FALSE;
-						}
+                        OPJ_INT32 x = cblk->x0 - band->x0;
+                        OPJ_INT32 y = cblk->y0 - band->y0;
+                        if (band->bandno & 1) {
+                            opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
+                            x += pres->x1 - pres->x0;
+                        }
+                        if (band->bandno & 2) {
+                            opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
+                            y += pres->y1 - pres->y0;
+                        }
 
-						cblk_w = t1->w;
-						cblk_h = t1->h;
-						tileLineAdvance = tile_w - cblk_w;
+                        if (!opj_t1_allocate_buffers(
+                                    t1,
+                                    (OPJ_UINT32)(cblk->x1 - cblk->x0),
+                                    (OPJ_UINT32)(cblk->y1 - cblk->y0))) {
+                            return OPJ_FALSE;
+                        }
 
-						tiledp=&tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
-						t1->data = tiledp;
-						t1->data_stride = tile_w;
-						if (tccp->qmfbid == 1) {
-							for (j = 0; j < cblk_h; ++j) {
-								for (i = 0; i < cblk_w; ++i) {
-									tiledp[tileIndex] <<= T1_NMSEDEC_FRACBITS;
-									tileIndex++;
-								}
-								tileIndex += tileLineAdvance;
-							}
-						} else {		/* if (tccp->qmfbid == 0) */
-							for (j = 0; j < cblk_h; ++j) {
-								for (i = 0; i < cblk_w; ++i) {
-									OPJ_INT32 tmp = tiledp[tileIndex];
-									tiledp[tileIndex] =
-										opj_int_fix_mul_t1(
-										tmp,
-										bandconst);
-									tileIndex++;
-								}
-								tileIndex += tileLineAdvance;
-							}
-						}
+                        cblk_w = t1->w;
+                        cblk_h = t1->h;
+                        tileLineAdvance = tile_w - cblk_w;
 
-						opj_t1_encode_cblk(
-								t1,
-								cblk,
-								band->bandno,
-								compno,
-								tilec->numresolutions - 1 - resno,
-								tccp->qmfbid,
-								band->stepsize,
-								tccp->cblksty,
-								tile->numcomps,
-								tile,
-								mct_norms,
-								mct_numcomps);
+                        tiledp = &tilec->data[(OPJ_UINT32)y * tile_w + (OPJ_UINT32)x];
+                        t1->data = tiledp;
+                        t1->data_stride = tile_w;
+                        if (tccp->qmfbid == 1) {
+                            for (j = 0; j < cblk_h; ++j) {
+                                for (i = 0; i < cblk_w; ++i) {
+                                    tiledp[tileIndex] *= (1 << T1_NMSEDEC_FRACBITS);
+                                    tileIndex++;
+                                }
+                                tileIndex += tileLineAdvance;
+                            }
+                        } else {        /* if (tccp->qmfbid == 0) */
+                            for (j = 0; j < cblk_h; ++j) {
+                                for (i = 0; i < cblk_w; ++i) {
+                                    OPJ_INT32 tmp = tiledp[tileIndex];
+                                    tiledp[tileIndex] =
+                                        opj_int_fix_mul_t1(
+                                            tmp,
+                                            bandconst);
+                                    tileIndex++;
+                                }
+                                tileIndex += tileLineAdvance;
+                            }
+                        }
 
-					} /* cblkno */
-				} /* precno */
-			} /* bandno */
-		} /* resno  */
-	} /* compno  */
-	return OPJ_TRUE;
+                        opj_t1_encode_cblk(
+                            t1,
+                            cblk,
+                            band->bandno,
+                            compno,
+                            tilec->numresolutions - 1 - resno,
+                            tccp->qmfbid,
+                            band->stepsize,
+                            tccp->cblksty,
+                            tile->numcomps,
+                            tile,
+                            mct_norms,
+                            mct_numcomps);
+
+                    } /* cblkno */
+                } /* precno */
+            } /* bandno */
+        } /* resno  */
+    } /* compno  */
+    return OPJ_TRUE;
 }
 
+/* Returns whether the pass (bpno, passtype) is terminated */
+static int opj_t1_enc_is_term_pass(opj_tcd_cblk_enc_t* cblk,
+                                   OPJ_UINT32 cblksty,
+                                   OPJ_INT32 bpno,
+                                   OPJ_UINT32 passtype)
+{
+    /* Is it the last cleanup pass ? */
+    if (passtype == 2 && bpno == 0) {
+        return OPJ_TRUE;
+    }
+
+    if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {
+        return OPJ_TRUE;
+    }
+
+    if ((cblksty & J2K_CCP_CBLKSTY_LAZY)) {
+        /* For bypass arithmetic bypass, terminate the 4th cleanup pass */
+        if ((bpno == ((OPJ_INT32)cblk->numbps - 4)) && (passtype == 2)) {
+            return OPJ_TRUE;
+        }
+        /* and beyond terminate all the magnitude refinement passes (in raw) */
+        /* and cleanup passes (in MQC) */
+        if ((bpno < ((OPJ_INT32)(cblk->numbps) - 4)) && (passtype > 0)) {
+            return OPJ_TRUE;
+        }
+    }
+
+    return OPJ_FALSE;
+}
+
+
 /** mod fixed_quality */
 static void opj_t1_encode_cblk(opj_t1_t *t1,
-                        opj_tcd_cblk_enc_t* cblk,
-                        OPJ_UINT32 orient,
-                        OPJ_UINT32 compno,
-                        OPJ_UINT32 level,
-                        OPJ_UINT32 qmfbid,
-                        OPJ_FLOAT64 stepsize,
-                        OPJ_UINT32 cblksty,
-                        OPJ_UINT32 numcomps,
-                        opj_tcd_tile_t * tile,
-                        const OPJ_FLOAT64 * mct_norms,
-                        OPJ_UINT32 mct_numcomps)
+                               opj_tcd_cblk_enc_t* cblk,
+                               OPJ_UINT32 orient,
+                               OPJ_UINT32 compno,
+                               OPJ_UINT32 level,
+                               OPJ_UINT32 qmfbid,
+                               OPJ_FLOAT64 stepsize,
+                               OPJ_UINT32 cblksty,
+                               OPJ_UINT32 numcomps,
+                               opj_tcd_tile_t * tile,
+                               const OPJ_FLOAT64 * mct_norms,
+                               OPJ_UINT32 mct_numcomps)
 {
-	OPJ_FLOAT64 cumwmsedec = 0.0;
+    OPJ_FLOAT64 cumwmsedec = 0.0;
 
-	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
+    opj_mqc_t *mqc = &(t1->mqc);   /* MQC component */
 
-	OPJ_UINT32 passno;
-	OPJ_INT32 bpno;
-	OPJ_UINT32 passtype;
-	OPJ_INT32 nmsedec = 0;
-	OPJ_INT32 max;
-	OPJ_UINT32 i, j;
-	OPJ_BYTE type = T1_TYPE_MQ;
-	OPJ_FLOAT64 tempwmsedec;
+    OPJ_UINT32 passno;
+    OPJ_INT32 bpno;
+    OPJ_UINT32 passtype;
+    OPJ_INT32 nmsedec = 0;
+    OPJ_INT32 max;
+    OPJ_UINT32 i, j;
+    OPJ_BYTE type = T1_TYPE_MQ;
+    OPJ_FLOAT64 tempwmsedec;
 
-	max = 0;
-	for (i = 0; i < t1->w; ++i) {
-		for (j = 0; j < t1->h; ++j) {
-			OPJ_INT32 tmp = abs(t1->data[i + j*t1->data_stride]);
-			max = opj_int_max(max, tmp);
-		}
-	}
+#ifdef EXTRA_DEBUG
+    printf("encode_cblk(x=%d,y=%d,x1=%d,y1=%d,orient=%d,compno=%d,level=%d\n",
+           cblk->x0, cblk->y0, cblk->x1, cblk->y1, orient, compno, level);
+#endif
 
-	cblk->numbps = max ? (OPJ_UINT32)((opj_int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS) : 0;
+    mqc->lut_ctxno_zc_orient = lut_ctxno_zc + (orient << 9);
 
-	bpno = (OPJ_INT32)(cblk->numbps - 1);
-	passtype = 2;
+    max = 0;
+    for (i = 0; i < t1->w; ++i) {
+        for (j = 0; j < t1->h; ++j) {
+            OPJ_INT32 tmp = abs(t1->data[i + j * t1->data_stride]);
+            max = opj_int_max(max, tmp);
+        }
+    }
 
-	opj_mqc_resetstates(mqc);
-	opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
-	opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
-	opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
-	opj_mqc_init_enc(mqc, cblk->data);
+    cblk->numbps = max ? (OPJ_UINT32)((opj_int_floorlog2(max) + 1) -
+                                      T1_NMSEDEC_FRACBITS) : 0;
 
-	for (passno = 0; bpno >= 0; ++passno) {
-		opj_tcd_pass_t *pass = &cblk->passes[passno];
-		OPJ_UINT32 correction = 3;
-		type = ((bpno < ((OPJ_INT32) (cblk->numbps) - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
+    bpno = (OPJ_INT32)(cblk->numbps - 1);
+    passtype = 2;
 
-		switch (passtype) {
-			case 0:
-				opj_t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty);
-				break;
-			case 1:
-				opj_t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty);
-				break;
-			case 2:
-				opj_t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty);
-				/* code switch SEGMARK (i.e. SEGSYM) */
-				if (cblksty & J2K_CCP_CBLKSTY_SEGSYM)
-					opj_mqc_segmark_enc(mqc);
-				break;
-		}
+    opj_mqc_resetstates(mqc);
+    opj_mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
+    opj_mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
+    opj_mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
+    opj_mqc_init_enc(mqc, cblk->data);
 
-		/* fixed_quality */
-		tempwmsedec = opj_t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps,mct_norms, mct_numcomps) ;
-		cumwmsedec += tempwmsedec;
-		tile->distotile += tempwmsedec;
+    for (passno = 0; bpno >= 0; ++passno) {
+        opj_tcd_pass_t *pass = &cblk->passes[passno];
+        type = ((bpno < ((OPJ_INT32)(cblk->numbps) - 4)) && (passtype < 2) &&
+                (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
 
-		/* Code switch "RESTART" (i.e. TERMALL) */
-		if ((cblksty & J2K_CCP_CBLKSTY_TERMALL)	&& !((passtype == 2) && (bpno - 1 < 0))) {
-			if (type == T1_TYPE_RAW) {
-				opj_mqc_flush(mqc);
-				correction = 1;
-				/* correction = mqc_bypass_flush_enc(); */
-			} else {			/* correction = mqc_restart_enc(); */
-				opj_mqc_flush(mqc);
-				correction = 1;
-			}
-			pass->term = 1;
-		} else {
-			if (((bpno < ((OPJ_INT32) (cblk->numbps) - 4) && (passtype > 0))
-				|| ((bpno == ((OPJ_INT32)cblk->numbps - 4)) && (passtype == 2))) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) {
-				if (type == T1_TYPE_RAW) {
-					opj_mqc_flush(mqc);
-					correction = 1;
-					/* correction = mqc_bypass_flush_enc(); */
-				} else {		/* correction = mqc_restart_enc(); */
-					opj_mqc_flush(mqc);
-					correction = 1;
-				}
-				pass->term = 1;
-			} else {
-				pass->term = 0;
-			}
-		}
+        /* If the previous pass was terminating, we need to reset the encoder */
+        if (passno > 0 && cblk->passes[passno - 1].term) {
+            if (type == T1_TYPE_RAW) {
+                opj_mqc_bypass_init_enc(mqc);
+            } else {
+                opj_mqc_restart_init_enc(mqc);
+            }
+        }
 
-		if (++passtype == 3) {
-			passtype = 0;
-			bpno--;
-		}
+        switch (passtype) {
+        case 0:
+            opj_t1_enc_sigpass(t1, bpno, &nmsedec, type, cblksty);
+            break;
+        case 1:
+            opj_t1_enc_refpass(t1, bpno, &nmsedec, type);
+            break;
+        case 2:
+            opj_t1_enc_clnpass(t1, bpno, &nmsedec, cblksty);
+            /* code switch SEGMARK (i.e. SEGSYM) */
+            if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) {
+                opj_mqc_segmark_enc(mqc);
+            }
+            break;
+        }
 
-		if (pass->term && bpno > 0) {
-			type = ((bpno < ((OPJ_INT32) (cblk->numbps) - 4)) && (passtype < 2) && (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
-			if (type == T1_TYPE_RAW)
-				opj_mqc_bypass_init_enc(mqc);
-			else
-				opj_mqc_restart_init_enc(mqc);
-		}
+        /* fixed_quality */
+        tempwmsedec = opj_t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid,
+                                        stepsize, numcomps, mct_norms, mct_numcomps) ;
+        cumwmsedec += tempwmsedec;
+        tile->distotile += tempwmsedec;
+        pass->distortiondec = cumwmsedec;
 
-		pass->distortiondec = cumwmsedec;
-		pass->rate = opj_mqc_numbytes(mqc) + correction;	/* FIXME */
+        if (opj_t1_enc_is_term_pass(cblk, cblksty, bpno, passtype)) {
+            /* If it is a terminated pass, terminate it */
+            if (type == T1_TYPE_RAW) {
+                opj_mqc_bypass_flush_enc(mqc, cblksty & J2K_CCP_CBLKSTY_PTERM);
+            } else {
+                if (cblksty & J2K_CCP_CBLKSTY_PTERM) {
+                    opj_mqc_erterm_enc(mqc);
+                } else {
+                    opj_mqc_flush(mqc);
+                }
+            }
+            pass->term = 1;
+            pass->rate = opj_mqc_numbytes(mqc);
+        } else {
+            /* Non terminated pass */
+            OPJ_UINT32 rate_extra_bytes;
+            if (type == T1_TYPE_RAW) {
+                rate_extra_bytes = opj_mqc_bypass_get_extra_bytes(
+                                       mqc, (cblksty & J2K_CCP_CBLKSTY_PTERM));
+            } else {
+                rate_extra_bytes = 3;
+            }
+            pass->term = 0;
+            pass->rate = opj_mqc_numbytes(mqc) + rate_extra_bytes;
+        }
 
-		/* Code-switch "RESET" */
-		if (cblksty & J2K_CCP_CBLKSTY_RESET)
-			opj_mqc_reset_enc(mqc);
-	}
+        if (++passtype == 3) {
+            passtype = 0;
+            bpno--;
+        }
 
-	/* Code switch "ERTERM" (i.e. PTERM) */
-	if (cblksty & J2K_CCP_CBLKSTY_PTERM)
-		opj_mqc_erterm_enc(mqc);
-	else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY))
-		opj_mqc_flush(mqc);
+        /* Code-switch "RESET" */
+        if (cblksty & J2K_CCP_CBLKSTY_RESET) {
+            opj_mqc_reset_enc(mqc);
+        }
+    }
 
-	cblk->totalpasses = passno;
+    cblk->totalpasses = passno;
 
-	for (passno = 0; passno<cblk->totalpasses; passno++) {
-		opj_tcd_pass_t *pass = &cblk->passes[passno];
-		if (pass->rate > opj_mqc_numbytes(mqc))
-			pass->rate = opj_mqc_numbytes(mqc);
-		/*Preventing generation of FF as last data byte of a pass*/
-		if((pass->rate>1) && (cblk->data[pass->rate - 1] == 0xFF)){
-			pass->rate--;
-		}
-		pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
-	}
+    if (cblk->totalpasses) {
+        /* Make sure that pass rates are increasing */
+        OPJ_UINT32 last_pass_rate = opj_mqc_numbytes(mqc);
+        for (passno = cblk->totalpasses; passno > 0;) {
+            opj_tcd_pass_t *pass = &cblk->passes[--passno];
+            if (pass->rate > last_pass_rate) {
+                pass->rate = last_pass_rate;
+            } else {
+                last_pass_rate = pass->rate;
+            }
+        }
+    }
+
+    for (passno = 0; passno < cblk->totalpasses; passno++) {
+        opj_tcd_pass_t *pass = &cblk->passes[passno];
+
+        /* Prevent generation of FF as last data byte of a pass*/
+        /* For terminating passes, the flushing procedure ensured this already */
+        assert(pass->rate > 0);
+        if (cblk->data[pass->rate - 1] == 0xFF) {
+            pass->rate--;
+        }
+        pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
+    }
+
+#ifdef EXTRA_DEBUG
+    printf(" len=%d\n", (cblk->totalpasses) ? opj_mqc_numbytes(mqc) : 0);
+
+    /* Check that there not 0xff >=0x90 sequences */
+    if (cblk->totalpasses) {
+        OPJ_UINT32 i;
+        OPJ_UINT32 len = opj_mqc_numbytes(mqc);
+        for (i = 1; i < len; ++i) {
+            if (cblk->data[i - 1] == 0xff && cblk->data[i] >= 0x90) {
+                printf("0xff %02x at offset %d\n", cblk->data[i], i - 1);
+                abort();
+            }
+        }
+    }
+#endif
 }
-
-#if 0
-static void opj_t1_dec_refpass_step(   opj_t1_t *t1,
-                                opj_flag_t *flagsp,
-                                OPJ_INT32 *datap,
-                                OPJ_INT32 poshalf,
-                                OPJ_INT32 neghalf,
-                                OPJ_BYTE type,
-                                OPJ_UINT32 vsc)
-{
-	OPJ_INT32  t;
-	OPJ_UINT32 v,flag;
-
-	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
-	opj_raw_t *raw = t1->raw;	/* RAW component */
-
-	flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
-	if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
-		opj_mqc_setcurctx(mqc, opj_t1_getctxno_mag(flag));	/* ESSAI */
-		if (type == T1_TYPE_RAW) {
-			v = opj_raw_decode(raw);
-		} else {
-			v = opj_mqc_decode(mqc);
-		}
-		t = v ? poshalf : neghalf;
-		*datap += *datap < 0 ? -t : t;
-		*flagsp |= T1_REFINE;
-	}
-}				/* VSC and  BYPASS by Antonin  */
-#endif
-
-
-
-#if 0
-static void opj_t1_dec_sigpass_step(   opj_t1_t *t1,
-                                opj_flag_t *flagsp,
-                                OPJ_INT32 *datap,
-                                OPJ_UINT32 orient,
-                                OPJ_INT32 oneplushalf,
-                                OPJ_BYTE type,
-                                OPJ_UINT32 vsc)
-{
-	OPJ_UINT32 v, flag;
-
-	opj_raw_t *raw = t1->raw;	/* RAW component */
-	opj_mqc_t *mqc = t1->mqc;	/* MQC component */
-
-	flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
-	if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
-		if (type == T1_TYPE_RAW) {
-			if (opj_raw_decode(raw)) {
-				v = opj_raw_decode(raw);	/* ESSAI */
-				*datap = v ? -oneplushalf : oneplushalf;
-				opj_t1_updateflags(flagsp, v, t1->flags_stride);
-			}
-		} else {
-			opj_mqc_setcurctx(mqc, opj_t1_getctxno_zc(flag, orient));
-			if (opj_mqc_decode(mqc)) {
-				opj_mqc_setcurctx(mqc, opj_t1_getctxno_sc(flag));
-				v = opj_mqc_decode(mqc) ^ opj_t1_getspb(flag);
-				*datap = v ? -oneplushalf : oneplushalf;
-				opj_t1_updateflags(flagsp, v, t1->flags_stride);
-			}
-		}
-		*flagsp |= T1_VISIT;
-	}
-}				/* VSC and  BYPASS by Antonin */
-#endif
diff --git a/third_party/libopenjpeg20/t1.h b/third_party/libopenjpeg20/t1.h
index 3bc0ad9..5aa6a07 100644
--- a/third_party/libopenjpeg20/t1.h
+++ b/third_party/libopenjpeg20/t1.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,9 +8,11 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2012, Carl Hetherington
+ * Copyright (c) 2017, IntoPIX SA <support@intopix.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -34,8 +36,8 @@
  * 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
+#ifndef OPJ_T1_H
+#define OPJ_T1_H
 /**
 @file t1.h
 @brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1)
@@ -50,72 +52,164 @@
 /* ----------------------------------------------------------------------- */
 #define T1_NMSEDEC_BITS 7
 
-#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_ZC 9
-#define T1_NUMCTXS_SC 5
+#define T1_NUMCTXS_ZC  9
+#define T1_NUMCTXS_SC  5
 #define T1_NUMCTXS_MAG 3
 #define T1_NUMCTXS_AGG 1
 #define T1_NUMCTXS_UNI 1
 
-#define T1_CTXNO_ZC 0
-#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
+#define T1_CTXNO_ZC  0
+#define T1_CTXNO_SC  (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
 #define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC)
 #define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG)
 #define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG)
-#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)
+#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)*/
+#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)*/
+
+/* BEGINNING of flags that apply to opj_flag_t */
+/** We hold the state of individual data points for the T1 encoder using
+ *  a single 32-bit flags word to hold the state of 4 data points.  This corresponds
+ *  to the 4-point-high columns that the data is processed in.
+ *
+ *  These \#defines declare the layout of a 32-bit flags word.
+ *
+ *  This is currently done for encoding only.
+ *  The values must NOT be changed, otherwise this is going to break a lot of
+ *  assumptions.
+ */
+
+/* SIGMA: significance state (3 cols x 6 rows)
+ * CHI:   state for negative sample value (1 col x 6 rows)
+ * MU:    state for visited in refinement pass (1 col x 4 rows)
+ * PI:    state for visited in significance pass (1 col * 4 rows)
+ */
+
+#define T1_SIGMA_0  (1U << 0)
+#define T1_SIGMA_1  (1U << 1)
+#define T1_SIGMA_2  (1U << 2)
+#define T1_SIGMA_3  (1U << 3)
+#define T1_SIGMA_4  (1U << 4)
+#define T1_SIGMA_5  (1U << 5)
+#define T1_SIGMA_6  (1U << 6)
+#define T1_SIGMA_7  (1U << 7)
+#define T1_SIGMA_8  (1U << 8)
+#define T1_SIGMA_9  (1U << 9)
+#define T1_SIGMA_10 (1U << 10)
+#define T1_SIGMA_11 (1U << 11)
+#define T1_SIGMA_12 (1U << 12)
+#define T1_SIGMA_13 (1U << 13)
+#define T1_SIGMA_14 (1U << 14)
+#define T1_SIGMA_15 (1U << 15)
+#define T1_SIGMA_16 (1U << 16)
+#define T1_SIGMA_17 (1U << 17)
+
+#define T1_CHI_0    (1U << 18)
+#define T1_CHI_0_I  18
+#define T1_CHI_1    (1U << 19)
+#define T1_CHI_1_I  19
+#define T1_MU_0     (1U << 20)
+#define T1_PI_0     (1U << 21)
+#define T1_CHI_2    (1U << 22)
+#define T1_CHI_2_I  22
+#define T1_MU_1     (1U << 23)
+#define T1_PI_1     (1U << 24)
+#define T1_CHI_3    (1U << 25)
+#define T1_MU_2     (1U << 26)
+#define T1_PI_2     (1U << 27)
+#define T1_CHI_4    (1U << 28)
+#define T1_MU_3     (1U << 29)
+#define T1_PI_3     (1U << 30)
+#define T1_CHI_5    (1U << 31)
+#define T1_CHI_5_I  31
+
+/** As an example, the bits T1_SIGMA_3, T1_SIGMA_4 and T1_SIGMA_5
+ *  indicate the significance state of the west neighbour of data point zero
+ *  of our four, the point itself, and its east neighbour respectively.
+ *  Many of the bits are arranged so that given a flags word, you can
+ *  look at the values for the data point 0, then shift the flags
+ *  word right by 3 bits and look at the same bit positions to see the
+ *  values for data point 1.
+ *
+ *  The \#defines below help a bit with this; say you have a flags word
+ *  f, you can do things like
+ *
+ *  (f & T1_SIGMA_THIS)
+ *
+ *  to see the significance bit of data point 0, then do
+ *
+ *  ((f >> 3) & T1_SIGMA_THIS)
+ *
+ *  to see the significance bit of data point 1.
+ */
+
+#define T1_SIGMA_NW   T1_SIGMA_0
+#define T1_SIGMA_N    T1_SIGMA_1
+#define T1_SIGMA_NE   T1_SIGMA_2
+#define T1_SIGMA_W    T1_SIGMA_3
+#define T1_SIGMA_THIS T1_SIGMA_4
+#define T1_SIGMA_E    T1_SIGMA_5
+#define T1_SIGMA_SW   T1_SIGMA_6
+#define T1_SIGMA_S    T1_SIGMA_7
+#define T1_SIGMA_SE   T1_SIGMA_8
+#define T1_SIGMA_NEIGHBOURS (T1_SIGMA_NW | T1_SIGMA_N | T1_SIGMA_NE | T1_SIGMA_W | T1_SIGMA_E | T1_SIGMA_SW | T1_SIGMA_S | T1_SIGMA_SE)
+
+#define T1_CHI_THIS   T1_CHI_1
+#define T1_CHI_THIS_I T1_CHI_1_I
+#define T1_MU_THIS    T1_MU_0
+#define T1_PI_THIS    T1_PI_0
+#define T1_CHI_S      T1_CHI_2
+
+#define T1_LUT_SGN_W (1U << 0)
+#define T1_LUT_SIG_N (1U << 1)
+#define T1_LUT_SGN_E (1U << 2)
+#define T1_LUT_SIG_W (1U << 3)
+#define T1_LUT_SGN_N (1U << 4)
+#define T1_LUT_SIG_E (1U << 5)
+#define T1_LUT_SGN_S (1U << 6)
+#define T1_LUT_SIG_S (1U << 7)
+/* END of flags that apply to opj_flag_t */
 
 /* ----------------------------------------------------------------------- */
 
-typedef OPJ_INT16 opj_flag_t;
+/** Flags for 4 consecutive rows of a column */
+typedef OPJ_UINT32 opj_flag_t;
 
 /**
 Tier-1 coding (coding of code-block coefficients)
 */
 typedef struct opj_t1 {
 
-	/** MQC component */
-	opj_mqc_t *mqc;
-	/** RAW component */
-	opj_raw_t *raw;
+    /** MQC component */
+    opj_mqc_t mqc;
 
-	OPJ_INT32  *data;
-	opj_flag_t *flags;
-	OPJ_UINT32 w;
-	OPJ_UINT32 h;
-	OPJ_UINT32 datasize;
-	OPJ_UINT32 flagssize;
-	OPJ_UINT32 flags_stride;
-	OPJ_UINT32 data_stride;
-	OPJ_BOOL   encoder;
+    OPJ_INT32  *data;
+    /** Flags used by decoder and encoder.
+     * Such that flags[1+0] is for state of col=0,row=0..3,
+       flags[1+1] for col=1, row=0..3, flags[1+flags_stride] for col=0,row=4..7, ...
+       This array avoids too much cache trashing when processing by 4 vertical samples
+       as done in the various decoding steps. */
+    opj_flag_t *flags;
+
+    OPJ_UINT32 w;
+    OPJ_UINT32 h;
+    OPJ_UINT32 datasize;
+    OPJ_UINT32 flagssize;
+    OPJ_UINT32 data_stride;
+    OPJ_BOOL   encoder;
+
+    /* Thre 3 variables below are only used by the decoder */
+    /* set to TRUE in multithreaded context */
+    OPJ_BOOL     mustuse_cblkdatabuffer;
+    /* Temporary buffer to concatenate all chunks of a codebock */
+    OPJ_BYTE    *cblkdatabuffer;
+    /* Maximum size available in cblkdatabuffer */
+    OPJ_UINT32   cblkdatabuffersize;
 } opj_t1_t;
 
-#define MACRO_t1_flags(x,y) t1->flags[((x)*(t1->flags_stride))+(y)]
-
 /** @name Exported functions */
 /*@{*/
 /* ----------------------------------------------------------------------- */
@@ -128,21 +222,29 @@
 @param mct_norms  FIXME DOC
 @param mct_numcomps Number of components used for MCT
 */
-OPJ_BOOL opj_t1_encode_cblks(   opj_t1_t *t1,
-                                opj_tcd_tile_t *tile,
-                                opj_tcp_t *tcp,
-                                const OPJ_FLOAT64 * mct_norms,
-                                OPJ_UINT32 mct_numcomps);
+OPJ_BOOL opj_t1_encode_cblks(opj_t1_t *t1,
+                             opj_tcd_tile_t *tile,
+                             opj_tcp_t *tcp,
+                             const OPJ_FLOAT64 * mct_norms,
+                             OPJ_UINT32 mct_numcomps);
 
 /**
 Decode the code-blocks of a tile
-@param t1 T1 handle
+@param tp Thread pool
+@param pret Pointer to return value
 @param tilec The tile to decode
 @param tccp Tile coding parameters
+@param p_manager the event manager
+@param p_manager_mutex mutex for the event manager
+@param check_pterm whether PTERM correct termination should be checked
 */
-OPJ_BOOL opj_t1_decode_cblks(   opj_t1_t* t1,
-                                opj_tcd_tilecomp_t* tilec,
-                                opj_tccp_t* tccp);
+void opj_t1_decode_cblks(opj_thread_pool_t* tp,
+                         volatile OPJ_BOOL* pret,
+                         opj_tcd_tilecomp_t* tilec,
+                         opj_tccp_t* tccp,
+                         opj_event_mgr_t *p_manager,
+                         opj_mutex_t* p_manager_mutex,
+                         OPJ_BOOL check_pterm);
 
 
 
@@ -164,4 +266,4 @@
 
 /*@}*/
 
-#endif /* __T1_H */
+#endif /* OPJ_T1_H */
diff --git a/third_party/libopenjpeg20/t1_generate_luts.c b/third_party/libopenjpeg20/t1_generate_luts.c
index 1997d39..9ad6f20 100644
--- a/third_party/libopenjpeg20/t1_generate_luts.c
+++ b/third_party/libopenjpeg20/t1_generate_luts.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,10 +8,11 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
+ * Copyright (c) 2012, Carl Hetherington
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -38,245 +39,273 @@
 
 #include "opj_includes.h"
 
-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);
+static int t1_init_ctxno_zc(OPJ_UINT32 f, OPJ_UINT32 orient)
+{
+    int h, v, d, n, t, hv;
+    n = 0;
+    h = ((f & T1_SIGMA_3) != 0) + ((f & T1_SIGMA_5) != 0);
+    v = ((f & T1_SIGMA_1) != 0) + ((f & T1_SIGMA_7) != 0);
+    d = ((f & T1_SIGMA_0) != 0) + ((f & T1_SIGMA_2) != 0) + ((
+                f & T1_SIGMA_8) != 0) + ((f & T1_SIGMA_6) != 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;
-	}
+    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);
+    return (T1_CTXNO_ZC + n);
 }
 
-static int t1_init_ctxno_sc(int f) {
-	int hc, vc, n;
-	n = 0;
+static int t1_init_ctxno_sc(OPJ_UINT32 f)
+{
+    int hc, vc, n;
+    n = 0;
 
-	hc = opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
-				T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
-			1) - opj_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);
+    hc = opj_int_min(((f & (T1_LUT_SIG_E | T1_LUT_SGN_E)) ==
+                      T1_LUT_SIG_E) + ((f & (T1_LUT_SIG_W | T1_LUT_SGN_W)) == T1_LUT_SIG_W),
+                     1) - opj_int_min(((f & (T1_LUT_SIG_E | T1_LUT_SGN_E)) ==
+                                       (T1_LUT_SIG_E | T1_LUT_SGN_E)) +
+                                      ((f & (T1_LUT_SIG_W | T1_LUT_SGN_W)) ==
+                                       (T1_LUT_SIG_W | T1_LUT_SGN_W)), 1);
 
-	vc = opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
-				T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
-			1) - opj_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);
+    vc = opj_int_min(((f & (T1_LUT_SIG_N | T1_LUT_SGN_N)) ==
+                      T1_LUT_SIG_N) + ((f & (T1_LUT_SIG_S | T1_LUT_SGN_S)) == T1_LUT_SIG_S),
+                     1) - opj_int_min(((f & (T1_LUT_SIG_N | T1_LUT_SGN_N)) ==
+                                       (T1_LUT_SIG_N | T1_LUT_SGN_N)) +
+                                      ((f & (T1_LUT_SIG_S | T1_LUT_SGN_S)) ==
+                                       (T1_LUT_SIG_S | T1_LUT_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;
-	}
+    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);
+    return (T1_CTXNO_SC + n);
 }
 
-static int t1_init_spb(int f) {
-	int hc, vc, n;
+static int t1_init_spb(OPJ_UINT32 f)
+{
+    int hc, vc, n;
 
-	hc = opj_int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
-				T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
-			1) - opj_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);
+    hc = opj_int_min(((f & (T1_LUT_SIG_E | T1_LUT_SGN_E)) ==
+                      T1_LUT_SIG_E) + ((f & (T1_LUT_SIG_W | T1_LUT_SGN_W)) == T1_LUT_SIG_W),
+                     1) - opj_int_min(((f & (T1_LUT_SIG_E | T1_LUT_SGN_E)) ==
+                                       (T1_LUT_SIG_E | T1_LUT_SGN_E)) +
+                                      ((f & (T1_LUT_SIG_W | T1_LUT_SGN_W)) ==
+                                       (T1_LUT_SIG_W | T1_LUT_SGN_W)), 1);
 
-	vc = opj_int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
-				T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
-			1) - opj_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);
+    vc = opj_int_min(((f & (T1_LUT_SIG_N | T1_LUT_SGN_N)) ==
+                      T1_LUT_SIG_N) + ((f & (T1_LUT_SIG_S | T1_LUT_SGN_S)) == T1_LUT_SIG_S),
+                     1) - opj_int_min(((f & (T1_LUT_SIG_N | T1_LUT_SGN_N)) ==
+                                       (T1_LUT_SIG_N | T1_LUT_SGN_N)) +
+                                      ((f & (T1_LUT_SIG_S | T1_LUT_SGN_S)) ==
+                                       (T1_LUT_SIG_S | T1_LUT_SGN_S)), 1);
 
-	if (!hc && !vc)
-		n = 0;
-	else
-		n = (!(hc > 0 || (!hc && vc > 0)));
+    if (!hc && !vc) {
+        n = 0;
+    } else {
+        n = (!(hc > 0 || (!hc && vc > 0)));
+    }
 
-	return n;
+    return n;
 }
 
-static void dump_array16(int array[],int size){
-	int i;
-	--size;
-	for (i = 0; i < size; ++i) {
-		printf("0x%04x, ", array[i]);
-		if(!((i+1)&0x7))
-			printf("\n  ");
-	}
-	printf("0x%04x\n};\n\n", array[size]);
+static void dump_array16(int array[], int size)
+{
+    int i;
+    --size;
+    for (i = 0; i < size; ++i) {
+        printf("0x%04x,", array[i]);
+        if (!((i + 1) & 0x7)) {
+            printf("\n    ");
+        } else {
+            printf(" ");
+        }
+    }
+    printf("0x%04x\n};\n\n", array[size]);
 }
 
 int main(int argc, char **argv)
 {
-	int i, j;
-	double u, v, t;
+    unsigned int i, j;
+    double u, v, t;
 
-	int lut_ctxno_zc[1024];
-	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];
-  (void)argc; (void)argv;
+    int lut_ctxno_zc[2048];
+    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];
+    (void)argc;
+    (void)argv;
 
-	printf("/* This file was automatically generated by t1_generate_luts.c */\n\n");
+    printf("/* This file was automatically generated by t1_generate_luts.c */\n\n");
 
-	/* lut_ctxno_zc */
-	for (j = 0; j < 4; ++j) {
-		for (i = 0; i < 256; ++i) {
-			int orient = j;
-			if (orient == 2) {
-				orient = 1;
-			} else if (orient == 1) {
-				orient = 2;
-			}
-			lut_ctxno_zc[(orient << 8) | i] = t1_init_ctxno_zc(i, j);
-		}
-	}
+    /* lut_ctxno_zc */
+    for (j = 0; j < 4; ++j) {
+        for (i = 0; i < 512; ++i) {
+            OPJ_UINT32 orient = j;
+            if (orient == 2) {
+                orient = 1;
+            } else if (orient == 1) {
+                orient = 2;
+            }
+            lut_ctxno_zc[(orient << 9) | i] = t1_init_ctxno_zc(i, j);
+        }
+    }
 
-	printf("static OPJ_BYTE lut_ctxno_zc[1024] = {\n  ");
-	for (i = 0; i < 1023; ++i) {
-		printf("%i, ", lut_ctxno_zc[i]);
-		if(!((i+1)&0x1f))
-			printf("\n  ");
-	}
-	printf("%i\n};\n\n", lut_ctxno_zc[1023]);
+    printf("static const OPJ_BYTE lut_ctxno_zc[2048] = {\n    ");
+    for (i = 0; i < 2047; ++i) {
+        printf("%i,", lut_ctxno_zc[i]);
+        if (!((i + 1) & 0x1f)) {
+            printf("\n    ");
+        } else {
+            printf(" ");
+        }
+    }
+    printf("%i\n};\n\n", lut_ctxno_zc[2047]);
 
-	/* lut_ctxno_sc */
-	printf("static OPJ_BYTE lut_ctxno_sc[256] = {\n  ");
-	for (i = 0; i < 255; ++i) {
-		printf("0x%x, ", t1_init_ctxno_sc(i << 4));
-		if(!((i+1)&0xf))
-			printf("\n  ");
-	}
-	printf("0x%x\n};\n\n", t1_init_ctxno_sc(255 << 4));
+    /* lut_ctxno_sc */
+    printf("static const OPJ_BYTE lut_ctxno_sc[256] = {\n    ");
+    for (i = 0; i < 255; ++i) {
+        printf("0x%x,", t1_init_ctxno_sc(i));
+        if (!((i + 1) & 0xf)) {
+            printf("\n    ");
+        } else {
+            printf(" ");
+        }
+    }
+    printf("0x%x\n};\n\n", t1_init_ctxno_sc(255));
 
-	/* lut_spb */
-	printf("static OPJ_BYTE lut_spb[256] = {\n  ");
-	for (i = 0; i < 255; ++i) {
-		printf("%i, ", t1_init_spb(i << 4));
-		if(!((i+1)&0x1f))
-			printf("\n  ");
-	}
-	printf("%i\n};\n\n", t1_init_spb(255 << 4));
+    /* lut_spb */
+    printf("static const OPJ_BYTE lut_spb[256] = {\n    ");
+    for (i = 0; i < 255; ++i) {
+        printf("%i,", t1_init_spb(i));
+        if (!((i + 1) & 0x1f)) {
+            printf("\n    ");
+        } else {
+            printf(" ");
+        }
+    }
+    printf("%i\n};\n\n", t1_init_spb(255));
 
-	/* 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;
-		lut_nmsedec_sig[i] = 
-			opj_int_max(0, 
-					(int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
-		lut_nmsedec_sig0[i] =
-			opj_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;
-		}
-		lut_nmsedec_ref[i] =
-			opj_int_max(0,
-					(int) (floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
-		lut_nmsedec_ref0[i] =
-			opj_int_max(0,
-					(int) (floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2, T1_NMSEDEC_FRACBITS) * 8192.0));
-	}
+    /* FIXME FIXME FIXME */
+    /* fprintf(stdout,"nmsedec luts:\n"); */
+    for (i = 0U; i < (1U << T1_NMSEDEC_BITS); ++i) {
+        t = i / pow(2, T1_NMSEDEC_FRACBITS);
+        u = t;
+        v = t - 1.5;
+        lut_nmsedec_sig[i] =
+            opj_int_max(0,
+                        (int)(floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2,
+                                T1_NMSEDEC_FRACBITS) * 8192.0));
+        lut_nmsedec_sig0[i] =
+            opj_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;
+        }
+        lut_nmsedec_ref[i] =
+            opj_int_max(0,
+                        (int)(floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2,
+                                T1_NMSEDEC_FRACBITS) * 8192.0));
+        lut_nmsedec_ref0[i] =
+            opj_int_max(0,
+                        (int)(floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2,
+                                T1_NMSEDEC_FRACBITS) * 8192.0));
+    }
 
-	printf("static OPJ_INT16 lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {\n  ");
-	dump_array16(lut_nmsedec_sig, 1 << T1_NMSEDEC_BITS);
+    printf("static const OPJ_INT16 lut_nmsedec_sig[1U << T1_NMSEDEC_BITS] = {\n    ");
+    dump_array16(lut_nmsedec_sig, 1U << T1_NMSEDEC_BITS);
 
-	printf("static OPJ_INT16 lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {\n  ");
-	dump_array16(lut_nmsedec_sig0, 1 << T1_NMSEDEC_BITS);
+    printf("static const OPJ_INT16 lut_nmsedec_sig0[1U << T1_NMSEDEC_BITS] = {\n    ");
+    dump_array16(lut_nmsedec_sig0, 1U << T1_NMSEDEC_BITS);
 
-	printf("static OPJ_INT16 lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {\n  ");
-	dump_array16(lut_nmsedec_ref, 1 << T1_NMSEDEC_BITS);
+    printf("static const OPJ_INT16 lut_nmsedec_ref[1U << T1_NMSEDEC_BITS] = {\n    ");
+    dump_array16(lut_nmsedec_ref, 1U << T1_NMSEDEC_BITS);
 
-	printf("static OPJ_INT16 lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {\n  ");
-	dump_array16(lut_nmsedec_ref0, 1 << T1_NMSEDEC_BITS);
+    printf("static const OPJ_INT16 lut_nmsedec_ref0[1U << T1_NMSEDEC_BITS] = {\n    ");
+    dump_array16(lut_nmsedec_ref0, 1U << T1_NMSEDEC_BITS);
 
-	return 0;
+    return 0;
 }
diff --git a/third_party/libopenjpeg20/t1_luts.h b/third_party/libopenjpeg20/t1_luts.h
index 37776b6..1a5e784 100644
--- a/third_party/libopenjpeg20/t1_luts.h
+++ b/third_party/libopenjpeg20/t1_luts.h
@@ -1,143 +1,175 @@
 /* This file was automatically generated by t1_generate_luts.c */
 
-static OPJ_BYTE lut_ctxno_zc[1024] = {
-  0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
-  5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
-  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
-  5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
-  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
-  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
-  0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
-  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
-  5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
-  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
-  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
-  0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
-  5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
-  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
-  5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
-  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
-  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
-  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
-  0, 3, 3, 6, 3, 6, 6, 8, 3, 6, 6, 8, 6, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 
-  1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 
-  1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 
-  2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 
-  1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 
-  2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 
-  2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 
-  2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8
+static const OPJ_BYTE lut_ctxno_zc[2048] = {
+    0, 1, 3, 3, 1, 2, 3, 3, 5, 6, 7, 7, 6, 6, 7, 7, 0, 1, 3, 3, 1, 2, 3, 3, 5, 6, 7, 7, 6, 6, 7, 7,
+    5, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 5, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    1, 2, 3, 3, 2, 2, 3, 3, 6, 6, 7, 7, 6, 6, 7, 7, 1, 2, 3, 3, 2, 2, 3, 3, 6, 6, 7, 7, 6, 6, 7, 7,
+    6, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    1, 2, 3, 3, 2, 2, 3, 3, 6, 6, 7, 7, 6, 6, 7, 7, 1, 2, 3, 3, 2, 2, 3, 3, 6, 6, 7, 7, 6, 6, 7, 7,
+    6, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    2, 2, 3, 3, 2, 2, 3, 3, 6, 6, 7, 7, 6, 6, 7, 7, 2, 2, 3, 3, 2, 2, 3, 3, 6, 6, 7, 7, 6, 6, 7, 7,
+    6, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    0, 1, 5, 6, 1, 2, 6, 6, 3, 3, 7, 7, 3, 3, 7, 7, 0, 1, 5, 6, 1, 2, 6, 6, 3, 3, 7, 7, 3, 3, 7, 7,
+    3, 3, 7, 7, 3, 3, 7, 7, 4, 4, 7, 7, 4, 4, 7, 7, 3, 3, 7, 7, 3, 3, 7, 7, 4, 4, 7, 7, 4, 4, 7, 7,
+    1, 2, 6, 6, 2, 2, 6, 6, 3, 3, 7, 7, 3, 3, 7, 7, 1, 2, 6, 6, 2, 2, 6, 6, 3, 3, 7, 7, 3, 3, 7, 7,
+    3, 3, 7, 7, 3, 3, 7, 7, 4, 4, 7, 7, 4, 4, 7, 7, 3, 3, 7, 7, 3, 3, 7, 7, 4, 4, 7, 7, 4, 4, 7, 7,
+    5, 6, 8, 8, 6, 6, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 5, 6, 8, 8, 6, 6, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8,
+    7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8,
+    6, 6, 8, 8, 6, 6, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 6, 6, 8, 8, 6, 6, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8,
+    7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8,
+    1, 2, 6, 6, 2, 2, 6, 6, 3, 3, 7, 7, 3, 3, 7, 7, 1, 2, 6, 6, 2, 2, 6, 6, 3, 3, 7, 7, 3, 3, 7, 7,
+    3, 3, 7, 7, 3, 3, 7, 7, 4, 4, 7, 7, 4, 4, 7, 7, 3, 3, 7, 7, 3, 3, 7, 7, 4, 4, 7, 7, 4, 4, 7, 7,
+    2, 2, 6, 6, 2, 2, 6, 6, 3, 3, 7, 7, 3, 3, 7, 7, 2, 2, 6, 6, 2, 2, 6, 6, 3, 3, 7, 7, 3, 3, 7, 7,
+    3, 3, 7, 7, 3, 3, 7, 7, 4, 4, 7, 7, 4, 4, 7, 7, 3, 3, 7, 7, 3, 3, 7, 7, 4, 4, 7, 7, 4, 4, 7, 7,
+    6, 6, 8, 8, 6, 6, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 6, 6, 8, 8, 6, 6, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8,
+    7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8,
+    6, 6, 8, 8, 6, 6, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 6, 6, 8, 8, 6, 6, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8,
+    7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8, 7, 7, 8, 8,
+    0, 1, 3, 3, 1, 2, 3, 3, 5, 6, 7, 7, 6, 6, 7, 7, 0, 1, 3, 3, 1, 2, 3, 3, 5, 6, 7, 7, 6, 6, 7, 7,
+    5, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 5, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    1, 2, 3, 3, 2, 2, 3, 3, 6, 6, 7, 7, 6, 6, 7, 7, 1, 2, 3, 3, 2, 2, 3, 3, 6, 6, 7, 7, 6, 6, 7, 7,
+    6, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    1, 2, 3, 3, 2, 2, 3, 3, 6, 6, 7, 7, 6, 6, 7, 7, 1, 2, 3, 3, 2, 2, 3, 3, 6, 6, 7, 7, 6, 6, 7, 7,
+    6, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    2, 2, 3, 3, 2, 2, 3, 3, 6, 6, 7, 7, 6, 6, 7, 7, 2, 2, 3, 3, 2, 2, 3, 3, 6, 6, 7, 7, 6, 6, 7, 7,
+    6, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 7, 7, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 4, 4, 3, 3, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7,
+    7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
+    0, 3, 1, 4, 3, 6, 4, 7, 1, 4, 2, 5, 4, 7, 5, 7, 0, 3, 1, 4, 3, 6, 4, 7, 1, 4, 2, 5, 4, 7, 5, 7,
+    1, 4, 2, 5, 4, 7, 5, 7, 2, 5, 2, 5, 5, 7, 5, 7, 1, 4, 2, 5, 4, 7, 5, 7, 2, 5, 2, 5, 5, 7, 5, 7,
+    3, 6, 4, 7, 6, 8, 7, 8, 4, 7, 5, 7, 7, 8, 7, 8, 3, 6, 4, 7, 6, 8, 7, 8, 4, 7, 5, 7, 7, 8, 7, 8,
+    4, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8, 4, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8,
+    1, 4, 2, 5, 4, 7, 5, 7, 2, 5, 2, 5, 5, 7, 5, 7, 1, 4, 2, 5, 4, 7, 5, 7, 2, 5, 2, 5, 5, 7, 5, 7,
+    2, 5, 2, 5, 5, 7, 5, 7, 2, 5, 2, 5, 5, 7, 5, 7, 2, 5, 2, 5, 5, 7, 5, 7, 2, 5, 2, 5, 5, 7, 5, 7,
+    4, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8, 4, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8,
+    5, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8,
+    3, 6, 4, 7, 6, 8, 7, 8, 4, 7, 5, 7, 7, 8, 7, 8, 3, 6, 4, 7, 6, 8, 7, 8, 4, 7, 5, 7, 7, 8, 7, 8,
+    4, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8, 4, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8,
+    6, 8, 7, 8, 8, 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8, 6, 8, 7, 8, 8, 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8,
+    7, 8, 7, 8, 8, 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8,
+    4, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8, 4, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8,
+    5, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8, 5, 7, 5, 7, 7, 8, 7, 8,
+    7, 8, 7, 8, 8, 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8,
+    7, 8, 7, 8, 8, 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8
 };
 
-static OPJ_BYTE lut_ctxno_sc[256] = {
-  0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd, 
-  0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, 
-  0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, 
-  0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, 
-  0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, 
-  0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, 
-  0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, 
-  0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, 
-  0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa, 
-  0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9, 
-  0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb, 
-  0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc, 
-  0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9, 
-  0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa, 
-  0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc, 
-  0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd
+static const OPJ_BYTE lut_ctxno_sc[256] = {
+    0x9, 0x9, 0xa, 0xa, 0x9, 0x9, 0xa, 0xa, 0xc, 0xc, 0xd, 0xb, 0xc, 0xc, 0xd, 0xb,
+    0x9, 0x9, 0xa, 0xa, 0x9, 0x9, 0xa, 0xa, 0xc, 0xc, 0xb, 0xd, 0xc, 0xc, 0xb, 0xd,
+    0xc, 0xc, 0xd, 0xd, 0xc, 0xc, 0xb, 0xb, 0xc, 0x9, 0xd, 0xa, 0x9, 0xc, 0xa, 0xb,
+    0xc, 0xc, 0xb, 0xb, 0xc, 0xc, 0xd, 0xd, 0xc, 0x9, 0xb, 0xa, 0x9, 0xc, 0xa, 0xd,
+    0x9, 0x9, 0xa, 0xa, 0x9, 0x9, 0xa, 0xa, 0xc, 0xc, 0xd, 0xb, 0xc, 0xc, 0xd, 0xb,
+    0x9, 0x9, 0xa, 0xa, 0x9, 0x9, 0xa, 0xa, 0xc, 0xc, 0xb, 0xd, 0xc, 0xc, 0xb, 0xd,
+    0xc, 0xc, 0xd, 0xd, 0xc, 0xc, 0xb, 0xb, 0xc, 0x9, 0xd, 0xa, 0x9, 0xc, 0xa, 0xb,
+    0xc, 0xc, 0xb, 0xb, 0xc, 0xc, 0xd, 0xd, 0xc, 0x9, 0xb, 0xa, 0x9, 0xc, 0xa, 0xd,
+    0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xd, 0xb, 0xd, 0xb, 0xd, 0xb, 0xd, 0xb,
+    0xa, 0xa, 0x9, 0x9, 0xa, 0xa, 0x9, 0x9, 0xd, 0xb, 0xc, 0xc, 0xd, 0xb, 0xc, 0xc,
+    0xd, 0xd, 0xd, 0xd, 0xb, 0xb, 0xb, 0xb, 0xd, 0xa, 0xd, 0xa, 0xa, 0xb, 0xa, 0xb,
+    0xd, 0xd, 0xc, 0xc, 0xb, 0xb, 0xc, 0xc, 0xd, 0xa, 0xc, 0x9, 0xa, 0xb, 0x9, 0xc,
+    0xa, 0xa, 0x9, 0x9, 0xa, 0xa, 0x9, 0x9, 0xb, 0xd, 0xc, 0xc, 0xb, 0xd, 0xc, 0xc,
+    0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xb, 0xd, 0xb, 0xd, 0xb, 0xd, 0xb, 0xd,
+    0xb, 0xb, 0xc, 0xc, 0xd, 0xd, 0xc, 0xc, 0xb, 0xa, 0xc, 0x9, 0xa, 0xd, 0x9, 0xc,
+    0xb, 0xb, 0xb, 0xb, 0xd, 0xd, 0xd, 0xd, 0xb, 0xa, 0xb, 0xa, 0xa, 0xd, 0xa, 0xd
 };
 
-static OPJ_BYTE lut_spb[256] = {
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 
-  0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-  0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 
-  0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 
-  0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
-  0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 
-  0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+static const OPJ_BYTE lut_spb[256] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+    0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+    0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1,
+    0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1,
+    1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1,
+    0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1
 };
 
-static OPJ_INT16 lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {
-  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
-  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
-  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
-  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
-  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
-  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
-  0x0000, 0x0180, 0x0300, 0x0480, 0x0600, 0x0780, 0x0900, 0x0a80, 
-  0x0c00, 0x0d80, 0x0f00, 0x1080, 0x1200, 0x1380, 0x1500, 0x1680, 
-  0x1800, 0x1980, 0x1b00, 0x1c80, 0x1e00, 0x1f80, 0x2100, 0x2280, 
-  0x2400, 0x2580, 0x2700, 0x2880, 0x2a00, 0x2b80, 0x2d00, 0x2e80, 
-  0x3000, 0x3180, 0x3300, 0x3480, 0x3600, 0x3780, 0x3900, 0x3a80, 
-  0x3c00, 0x3d80, 0x3f00, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, 
-  0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5100, 0x5280, 
-  0x5400, 0x5580, 0x5700, 0x5880, 0x5a00, 0x5b80, 0x5d00, 0x5e80, 
-  0x6000, 0x6180, 0x6300, 0x6480, 0x6600, 0x6780, 0x6900, 0x6a80, 
-  0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680
+static const OPJ_INT16 lut_nmsedec_sig[1U << T1_NMSEDEC_BITS] = {
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0180, 0x0300, 0x0480, 0x0600, 0x0780, 0x0900, 0x0a80,
+    0x0c00, 0x0d80, 0x0f00, 0x1080, 0x1200, 0x1380, 0x1500, 0x1680,
+    0x1800, 0x1980, 0x1b00, 0x1c80, 0x1e00, 0x1f80, 0x2100, 0x2280,
+    0x2400, 0x2580, 0x2700, 0x2880, 0x2a00, 0x2b80, 0x2d00, 0x2e80,
+    0x3000, 0x3180, 0x3300, 0x3480, 0x3600, 0x3780, 0x3900, 0x3a80,
+    0x3c00, 0x3d80, 0x3f00, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680,
+    0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5100, 0x5280,
+    0x5400, 0x5580, 0x5700, 0x5880, 0x5a00, 0x5b80, 0x5d00, 0x5e80,
+    0x6000, 0x6180, 0x6300, 0x6480, 0x6600, 0x6780, 0x6900, 0x6a80,
+    0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680
 };
 
-static OPJ_INT16 lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {
-  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, 
-  0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, 
-  0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, 
-  0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, 
-  0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, 
-  0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, 
-  0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, 
-  0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00, 
-  0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2680, 0x2780, 
-  0x2880, 0x2980, 0x2b00, 0x2c00, 0x2d00, 0x2e80, 0x2f80, 0x3100, 
-  0x3200, 0x3380, 0x3480, 0x3600, 0x3700, 0x3880, 0x3a00, 0x3b00, 
-  0x3c80, 0x3e00, 0x3f80, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680, 
-  0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5180, 0x5300, 
-  0x5480, 0x5600, 0x5800, 0x5980, 0x5b00, 0x5d00, 0x5e80, 0x6080, 
-  0x6200, 0x6400, 0x6580, 0x6780, 0x6900, 0x6b00, 0x6d00, 0x6e80, 
-  0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00
+static const OPJ_INT16 lut_nmsedec_sig0[1U << T1_NMSEDEC_BITS] = {
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080,
+    0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200,
+    0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400,
+    0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
+    0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00,
+    0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180,
+    0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780,
+    0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00,
+    0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2680, 0x2780,
+    0x2880, 0x2980, 0x2b00, 0x2c00, 0x2d00, 0x2e80, 0x2f80, 0x3100,
+    0x3200, 0x3380, 0x3480, 0x3600, 0x3700, 0x3880, 0x3a00, 0x3b00,
+    0x3c80, 0x3e00, 0x3f80, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680,
+    0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5180, 0x5300,
+    0x5480, 0x5600, 0x5800, 0x5980, 0x5b00, 0x5d00, 0x5e80, 0x6080,
+    0x6200, 0x6400, 0x6580, 0x6780, 0x6900, 0x6b00, 0x6d00, 0x6e80,
+    0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00
 };
 
-static OPJ_INT16 lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {
-  0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480, 
-  0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080, 
-  0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80, 
-  0x0c00, 0x0b80, 0x0b00, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, 
-  0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0500, 0x0480, 
-  0x0400, 0x0380, 0x0300, 0x0280, 0x0200, 0x0180, 0x0100, 0x0080, 
-  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
-  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
-  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
-  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
-  0x0000, 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380, 
-  0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, 
-  0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b00, 0x0b80, 
-  0x0c00, 0x0c80, 0x0d00, 0x0d80, 0x0e00, 0x0e80, 0x0f00, 0x0f80, 
-  0x1000, 0x1080, 0x1100, 0x1180, 0x1200, 0x1280, 0x1300, 0x1380, 
-  0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780
+static const OPJ_INT16 lut_nmsedec_ref[1U << T1_NMSEDEC_BITS] = {
+    0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480,
+    0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080,
+    0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80,
+    0x0c00, 0x0b80, 0x0b00, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880,
+    0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0500, 0x0480,
+    0x0400, 0x0380, 0x0300, 0x0280, 0x0200, 0x0180, 0x0100, 0x0080,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380,
+    0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
+    0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b00, 0x0b80,
+    0x0c00, 0x0c80, 0x0d00, 0x0d80, 0x0e00, 0x0e80, 0x0f00, 0x0f80,
+    0x1000, 0x1080, 0x1100, 0x1180, 0x1200, 0x1280, 0x1300, 0x1380,
+    0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780
 };
 
-static OPJ_INT16 lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {
-  0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980, 
-  0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300, 
-  0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00, 
-  0x0c80, 0x0c00, 0x0b80, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880, 
-  0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0580, 0x0500, 
-  0x0480, 0x0400, 0x0400, 0x0380, 0x0300, 0x0300, 0x0280, 0x0280, 
-  0x0200, 0x0200, 0x0180, 0x0180, 0x0100, 0x0100, 0x0100, 0x0080, 
-  0x0080, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
-  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080, 
-  0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200, 
-  0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400, 
-  0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780, 
-  0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00, 
-  0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180, 
-  0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780, 
-  0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00
+static const OPJ_INT16 lut_nmsedec_ref0[1U << T1_NMSEDEC_BITS] = {
+    0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980,
+    0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300,
+    0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00,
+    0x0c80, 0x0c00, 0x0b80, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880,
+    0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0580, 0x0500,
+    0x0480, 0x0400, 0x0400, 0x0380, 0x0300, 0x0300, 0x0280, 0x0280,
+    0x0200, 0x0200, 0x0180, 0x0180, 0x0100, 0x0100, 0x0100, 0x0080,
+    0x0080, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080,
+    0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200,
+    0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400,
+    0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
+    0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00,
+    0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180,
+    0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780,
+    0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00
 };
 
diff --git a/third_party/libopenjpeg20/t2.c b/third_party/libopenjpeg20/t2.c
index 5af1a69..c8cfcc2 100644
--- a/third_party/libopenjpeg20/t2.c
+++ b/third_party/libopenjpeg20/t2.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,10 +8,10 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -38,6 +38,8 @@
  */
 
 #include "opj_includes.h"
+#include "opj_common.h"
+
 
 /** @defgroup T2 T2 - Implementation of a tier-2 coding */
 /*@{*/
@@ -47,7 +49,7 @@
 
 static void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n);
 
-static OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio); 
+static OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio);
 /**
 Variable length code for signalling delta Zil (truncation point)
 @param bio  Bit Input/Output component
@@ -68,14 +70,14 @@
 @param cstr_info Codestream information structure
 @return
 */
-static OPJ_BOOL opj_t2_encode_packet(   OPJ_UINT32 tileno,
-                                        opj_tcd_tile_t *tile,
-                                        opj_tcp_t *tcp,
-                                        opj_pi_iterator_t *pi,
-                                        OPJ_BYTE *dest,
-                                        OPJ_UINT32 * p_data_written,
-                                        OPJ_UINT32 len,
-                                        opj_codestream_info_t *cstr_info);
+static OPJ_BOOL opj_t2_encode_packet(OPJ_UINT32 tileno,
+                                     opj_tcd_tile_t *tile,
+                                     opj_tcp_t *tcp,
+                                     opj_pi_iterator_t *pi,
+                                     OPJ_BYTE *dest,
+                                     OPJ_UINT32 * p_data_written,
+                                     OPJ_UINT32 len,
+                                     opj_codestream_info_t *cstr_info);
 
 /**
 Decode a packet of a tile from a source buffer
@@ -87,39 +89,40 @@
 @param data_read   FIXME DOC
 @param max_length  FIXME DOC
 @param pack_info Packet information
+@param p_manager the user event manager
 
 @return  FIXME DOC
 */
-static OPJ_BOOL opj_t2_decode_packet(   opj_t2_t* t2,
-                                        opj_tcd_tile_t *tile,
-                                        opj_tcp_t *tcp,
-                                        opj_pi_iterator_t *pi,
-                                        OPJ_BYTE *src,
-                                        OPJ_UINT32 * data_read,
-                                        OPJ_UINT32 max_length,
-                                        opj_packet_info_t *pack_info,
-                                        opj_event_mgr_t *p_manager);
+static OPJ_BOOL opj_t2_decode_packet(opj_t2_t* t2,
+                                     opj_tcd_tile_t *tile,
+                                     opj_tcp_t *tcp,
+                                     opj_pi_iterator_t *pi,
+                                     OPJ_BYTE *src,
+                                     OPJ_UINT32 * data_read,
+                                     OPJ_UINT32 max_length,
+                                     opj_packet_info_t *pack_info,
+                                     opj_event_mgr_t *p_manager);
 
-static OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2,
-                                    opj_tcd_tile_t *p_tile,
-                                    opj_tcp_t *p_tcp,
-                                    opj_pi_iterator_t *p_pi,
-                                    OPJ_BYTE *p_src,
-                                    OPJ_UINT32 * p_data_read,
-                                    OPJ_UINT32 p_max_length,
-                                    opj_packet_info_t *p_pack_info,
-                                    opj_event_mgr_t *p_manager);
+static OPJ_BOOL opj_t2_skip_packet(opj_t2_t* p_t2,
+                                   opj_tcd_tile_t *p_tile,
+                                   opj_tcp_t *p_tcp,
+                                   opj_pi_iterator_t *p_pi,
+                                   OPJ_BYTE *p_src,
+                                   OPJ_UINT32 * p_data_read,
+                                   OPJ_UINT32 p_max_length,
+                                   opj_packet_info_t *p_pack_info,
+                                   opj_event_mgr_t *p_manager);
 
-static OPJ_BOOL opj_t2_read_packet_header(  opj_t2_t* p_t2,
-                                            opj_tcd_tile_t *p_tile,
-                                            opj_tcp_t *p_tcp,
-                                            opj_pi_iterator_t *p_pi,
-                                            OPJ_BOOL * p_is_data_present,
-                                            OPJ_BYTE *p_src_data,
-                                            OPJ_UINT32 * p_data_read,
-                                            OPJ_UINT32 p_max_length,
-                                            opj_packet_info_t *p_pack_info,
-                                            opj_event_mgr_t *p_manager);
+static OPJ_BOOL opj_t2_read_packet_header(opj_t2_t* p_t2,
+        opj_tcd_tile_t *p_tile,
+        opj_tcp_t *p_tcp,
+        opj_pi_iterator_t *p_pi,
+        OPJ_BOOL * p_is_data_present,
+        OPJ_BYTE *p_src_data,
+        OPJ_UINT32 * p_data_read,
+        OPJ_UINT32 p_max_length,
+        opj_packet_info_t *p_pack_info,
+        opj_event_mgr_t *p_manager);
 
 static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
                                         opj_tcd_tile_t *p_tile,
@@ -144,10 +147,10 @@
 @param cblksty
 @param first
 */
-static OPJ_BOOL opj_t2_init_seg(    opj_tcd_cblk_dec_t* cblk,
-                                    OPJ_UINT32 index,
-                                    OPJ_UINT32 cblksty,
-                                    OPJ_UINT32 first);
+static OPJ_BOOL opj_t2_init_seg(opj_tcd_cblk_dec_t* cblk,
+                                OPJ_UINT32 index,
+                                OPJ_UINT32 cblksty,
+                                OPJ_UINT32 first);
 
 /*@}*/
 
@@ -156,179 +159,192 @@
 /* ----------------------------------------------------------------------- */
 
 /* #define RESTART 0x04 */
-static void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n) {
-        while (--n >= 0) {
-                opj_bio_write(bio, 1, 1);
-        }
-        opj_bio_write(bio, 0, 1);
+static void opj_t2_putcommacode(opj_bio_t *bio, OPJ_INT32 n)
+{
+    while (--n >= 0) {
+        opj_bio_write(bio, 1, 1);
+    }
+    opj_bio_write(bio, 0, 1);
 }
 
 static OPJ_UINT32 opj_t2_getcommacode(opj_bio_t *bio)
 {
     OPJ_UINT32 n = 0;
     while (opj_bio_read(bio, 1)) {
-	    ++n;
+        ++n;
     }
     return n;
 }
 
-static void opj_t2_putnumpasses(opj_bio_t *bio, OPJ_UINT32 n) {
-        if (n == 1) {
-                opj_bio_write(bio, 0, 1);
-        } else if (n == 2) {
-                opj_bio_write(bio, 2, 2);
-        } else if (n <= 5) {
-                opj_bio_write(bio, 0xc | (n - 3), 4);
-        } else if (n <= 36) {
-                opj_bio_write(bio, 0x1e0 | (n - 6), 9);
-        } else if (n <= 164) {
-                opj_bio_write(bio, 0xff80 | (n - 37), 16);
-        }
+static void opj_t2_putnumpasses(opj_bio_t *bio, OPJ_UINT32 n)
+{
+    if (n == 1) {
+        opj_bio_write(bio, 0, 1);
+    } else if (n == 2) {
+        opj_bio_write(bio, 2, 2);
+    } else if (n <= 5) {
+        opj_bio_write(bio, 0xc | (n - 3), 4);
+    } else if (n <= 36) {
+        opj_bio_write(bio, 0x1e0 | (n - 6), 9);
+    } else if (n <= 164) {
+        opj_bio_write(bio, 0xff80 | (n - 37), 16);
+    }
 }
 
-static OPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio) {
-        OPJ_UINT32 n;
-        if (!opj_bio_read(bio, 1))
-                return 1;
-        if (!opj_bio_read(bio, 1))
-                return 2;
-        if ((n = opj_bio_read(bio, 2)) != 3)
-                return (3 + n);
-        if ((n = opj_bio_read(bio, 5)) != 31)
-                return (6 + n);
-        return (37 + opj_bio_read(bio, 7));
+static OPJ_UINT32 opj_t2_getnumpasses(opj_bio_t *bio)
+{
+    OPJ_UINT32 n;
+    if (!opj_bio_read(bio, 1)) {
+        return 1;
+    }
+    if (!opj_bio_read(bio, 1)) {
+        return 2;
+    }
+    if ((n = opj_bio_read(bio, 2)) != 3) {
+        return (3 + n);
+    }
+    if ((n = opj_bio_read(bio, 5)) != 31) {
+        return (6 + n);
+    }
+    return (37 + opj_bio_read(bio, 7));
 }
 
 /* ----------------------------------------------------------------------- */
 
-OPJ_BOOL opj_t2_encode_packets( opj_t2_t* p_t2,
-                                OPJ_UINT32 p_tile_no,
-                                opj_tcd_tile_t *p_tile,
-                                OPJ_UINT32 p_maxlayers,
-                                OPJ_BYTE *p_dest,
-                                OPJ_UINT32 * p_data_written,
-                                OPJ_UINT32 p_max_len,
-                                opj_codestream_info_t *cstr_info,
-                                OPJ_UINT32 p_tp_num,
-                                OPJ_INT32 p_tp_pos,
-                                OPJ_UINT32 p_pino,
-                                J2K_T2_MODE p_t2_mode)
+OPJ_BOOL opj_t2_encode_packets(opj_t2_t* p_t2,
+                               OPJ_UINT32 p_tile_no,
+                               opj_tcd_tile_t *p_tile,
+                               OPJ_UINT32 p_maxlayers,
+                               OPJ_BYTE *p_dest,
+                               OPJ_UINT32 * p_data_written,
+                               OPJ_UINT32 p_max_len,
+                               opj_codestream_info_t *cstr_info,
+                               OPJ_UINT32 p_tp_num,
+                               OPJ_INT32 p_tp_pos,
+                               OPJ_UINT32 p_pino,
+                               J2K_T2_MODE p_t2_mode)
 {
-        OPJ_BYTE *l_current_data = p_dest;
-        OPJ_UINT32 l_nb_bytes = 0;
-        OPJ_UINT32 compno;
-        OPJ_UINT32 poc;
-        opj_pi_iterator_t *l_pi = 00;
-        opj_pi_iterator_t *l_current_pi = 00;
-        opj_image_t *l_image = p_t2->image;
-        opj_cp_t *l_cp = p_t2->cp;
-        opj_tcp_t *l_tcp = &l_cp->tcps[p_tile_no];
-        OPJ_UINT32 pocno = (l_cp->rsiz == OPJ_PROFILE_CINEMA_4K)? 2: 1;
-        OPJ_UINT32 l_max_comp = l_cp->m_specific_param.m_enc.m_max_comp_size > 0 ? l_image->numcomps : 1;
-        OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
+    OPJ_BYTE *l_current_data = p_dest;
+    OPJ_UINT32 l_nb_bytes = 0;
+    OPJ_UINT32 compno;
+    OPJ_UINT32 poc;
+    opj_pi_iterator_t *l_pi = 00;
+    opj_pi_iterator_t *l_current_pi = 00;
+    opj_image_t *l_image = p_t2->image;
+    opj_cp_t *l_cp = p_t2->cp;
+    opj_tcp_t *l_tcp = &l_cp->tcps[p_tile_no];
+    OPJ_UINT32 pocno = (l_cp->rsiz == OPJ_PROFILE_CINEMA_4K) ? 2 : 1;
+    OPJ_UINT32 l_max_comp = l_cp->m_specific_param.m_enc.m_max_comp_size > 0 ?
+                            l_image->numcomps : 1;
+    OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
 
-        l_pi = opj_pi_initialise_encode(l_image, l_cp, p_tile_no, p_t2_mode);
-        if (!l_pi) {
-                return OPJ_FALSE;
-        }
+    l_pi = opj_pi_initialise_encode(l_image, l_cp, p_tile_no, p_t2_mode);
+    if (!l_pi) {
+        return OPJ_FALSE;
+    }
 
-        * p_data_written = 0;
+    * p_data_written = 0;
 
-        if (p_t2_mode == THRESH_CALC ){ /* Calculating threshold */
-                l_current_pi = l_pi;
+    if (p_t2_mode == THRESH_CALC) { /* Calculating threshold */
+        l_current_pi = l_pi;
 
-                for     (compno = 0; compno < l_max_comp; ++compno) {
-                        OPJ_UINT32 l_comp_len = 0;
-                        l_current_pi = l_pi;
+        for (compno = 0; compno < l_max_comp; ++compno) {
+            OPJ_UINT32 l_comp_len = 0;
+            l_current_pi = l_pi;
 
-                        for (poc = 0; poc < pocno ; ++poc) {
-                                OPJ_UINT32 l_tp_num = compno;
+            for (poc = 0; poc < pocno ; ++poc) {
+                OPJ_UINT32 l_tp_num = compno;
 
-                                /* TODO MSD : check why this function cannot fail (cf. v1) */
-                                opj_pi_create_encode(l_pi, l_cp,p_tile_no,poc,l_tp_num,p_tp_pos,p_t2_mode);
+                /* TODO MSD : check why this function cannot fail (cf. v1) */
+                opj_pi_create_encode(l_pi, l_cp, p_tile_no, poc, l_tp_num, p_tp_pos, p_t2_mode);
 
-                                if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
-                                    /* TODO ADE : add an error */
-                                    opj_pi_destroy(l_pi, l_nb_pocs);
-                                    return OPJ_FALSE;
-                                }
-                                while (opj_pi_next(l_current_pi)) {
-                                        if (l_current_pi->layno < p_maxlayers) {
-                                                l_nb_bytes = 0;
-
-                                                if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {
-                                                        opj_pi_destroy(l_pi, l_nb_pocs);
-                                                        return OPJ_FALSE;
-                                                }
-
-                                                l_comp_len += l_nb_bytes;
-                                                l_current_data += l_nb_bytes;
-                                                p_max_len -= l_nb_bytes;
-
-                                                * p_data_written += l_nb_bytes;
-                                        }
-                                }
-
-                                if (l_cp->m_specific_param.m_enc.m_max_comp_size) {
-                                        if (l_comp_len > l_cp->m_specific_param.m_enc.m_max_comp_size) {
-                                                opj_pi_destroy(l_pi, l_nb_pocs);
-                                                return OPJ_FALSE;
-                                        }
-                                }
-
-                                ++l_current_pi;
-                        }
-                }
-        }
-        else {  /* t2_mode == FINAL_PASS  */
-                opj_pi_create_encode(l_pi, l_cp,p_tile_no,p_pino,p_tp_num,p_tp_pos,p_t2_mode);
-
-                l_current_pi = &l_pi[p_pino];
                 if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
                     /* TODO ADE : add an error */
                     opj_pi_destroy(l_pi, l_nb_pocs);
                     return OPJ_FALSE;
                 }
                 while (opj_pi_next(l_current_pi)) {
-                        if (l_current_pi->layno < p_maxlayers) {
-                                l_nb_bytes=0;
+                    if (l_current_pi->layno < p_maxlayers) {
+                        l_nb_bytes = 0;
 
-                                if (! opj_t2_encode_packet(p_tile_no,p_tile, l_tcp, l_current_pi, l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {
-                                        opj_pi_destroy(l_pi, l_nb_pocs);
-                                        return OPJ_FALSE;
-                                }
-
-                                l_current_data += l_nb_bytes;
-                                p_max_len -= l_nb_bytes;
-
-                                * p_data_written += l_nb_bytes;
-
-                                /* INDEX >> */
-                                if(cstr_info) {
-                                        if(cstr_info->index_write) {
-                                                opj_tile_info_t *info_TL = &cstr_info->tile[p_tile_no];
-                                                opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
-                                                if (!cstr_info->packno) {
-                                                        info_PK->start_pos = info_TL->end_header + 1;
-                                                } else {
-                                                        info_PK->start_pos = ((l_cp->m_specific_param.m_enc.m_tp_on | l_tcp->POC)&& info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno - 1].end_pos + 1;
-                                                }
-                                                info_PK->end_pos = info_PK->start_pos + l_nb_bytes - 1;
-                                                info_PK->end_ph_pos += info_PK->start_pos - 1;  /* End of packet header which now only represents the distance
-                                                                                                                                                                                                                                                   to start of packet is incremented by value of start of packet*/
-                                        }
-
-                                        cstr_info->packno++;
-                                }
-                                /* << INDEX */
-                                ++p_tile->packno;
+                        if (! opj_t2_encode_packet(p_tile_no, p_tile, l_tcp, l_current_pi,
+                                                   l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {
+                            opj_pi_destroy(l_pi, l_nb_pocs);
+                            return OPJ_FALSE;
                         }
+
+                        l_comp_len += l_nb_bytes;
+                        l_current_data += l_nb_bytes;
+                        p_max_len -= l_nb_bytes;
+
+                        * p_data_written += l_nb_bytes;
+                    }
                 }
+
+                if (l_cp->m_specific_param.m_enc.m_max_comp_size) {
+                    if (l_comp_len > l_cp->m_specific_param.m_enc.m_max_comp_size) {
+                        opj_pi_destroy(l_pi, l_nb_pocs);
+                        return OPJ_FALSE;
+                    }
+                }
+
+                ++l_current_pi;
+            }
         }
+    } else { /* t2_mode == FINAL_PASS  */
+        opj_pi_create_encode(l_pi, l_cp, p_tile_no, p_pino, p_tp_num, p_tp_pos,
+                             p_t2_mode);
 
-        opj_pi_destroy(l_pi, l_nb_pocs);
+        l_current_pi = &l_pi[p_pino];
+        if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
+            /* TODO ADE : add an error */
+            opj_pi_destroy(l_pi, l_nb_pocs);
+            return OPJ_FALSE;
+        }
+        while (opj_pi_next(l_current_pi)) {
+            if (l_current_pi->layno < p_maxlayers) {
+                l_nb_bytes = 0;
 
-        return OPJ_TRUE;
+                if (! opj_t2_encode_packet(p_tile_no, p_tile, l_tcp, l_current_pi,
+                                           l_current_data, &l_nb_bytes, p_max_len, cstr_info)) {
+                    opj_pi_destroy(l_pi, l_nb_pocs);
+                    return OPJ_FALSE;
+                }
+
+                l_current_data += l_nb_bytes;
+                p_max_len -= l_nb_bytes;
+
+                * p_data_written += l_nb_bytes;
+
+                /* INDEX >> */
+                if (cstr_info) {
+                    if (cstr_info->index_write) {
+                        opj_tile_info_t *info_TL = &cstr_info->tile[p_tile_no];
+                        opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
+                        if (!cstr_info->packno) {
+                            info_PK->start_pos = info_TL->end_header + 1;
+                        } else {
+                            info_PK->start_pos = ((l_cp->m_specific_param.m_enc.m_tp_on | l_tcp->POC) &&
+                                                  info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno -
+                                                                            1].end_pos + 1;
+                        }
+                        info_PK->end_pos = info_PK->start_pos + l_nb_bytes - 1;
+                        info_PK->end_ph_pos += info_PK->start_pos -
+                                               1;  /* End of packet header which now only represents the distance
+                                                                                                                                                                                                                                                   to start of packet is incremented by value of start of packet*/
+                    }
+
+                    cstr_info->packno++;
+                }
+                /* << INDEX */
+                ++p_tile->packno;
+            }
+        }
+    }
+
+    opj_pi_destroy(l_pi, l_nb_pocs);
+
+    return OPJ_TRUE;
 }
 
 /* see issue 80 */
@@ -338,154 +354,167 @@
 /* issue 290 */
 static void opj_null_jas_fprintf(FILE* file, const char * format, ...)
 {
-  (void)file;
-  (void)format;
+    (void)file;
+    (void)format;
 }
 #define JAS_FPRINTF opj_null_jas_fprintf
 #endif
 
-OPJ_BOOL opj_t2_decode_packets( opj_t2_t *p_t2,
-                                OPJ_UINT32 p_tile_no,
-                                opj_tcd_tile_t *p_tile,
-                                OPJ_BYTE *p_src,
-                                OPJ_UINT32 * p_data_read,
-                                OPJ_UINT32 p_max_len,
-                                opj_codestream_index_t *p_cstr_index,
-                                opj_event_mgr_t *p_manager)
+OPJ_BOOL opj_t2_decode_packets(opj_t2_t *p_t2,
+                               OPJ_UINT32 p_tile_no,
+                               opj_tcd_tile_t *p_tile,
+                               OPJ_BYTE *p_src,
+                               OPJ_UINT32 * p_data_read,
+                               OPJ_UINT32 p_max_len,
+                               opj_codestream_index_t *p_cstr_index,
+                               opj_event_mgr_t *p_manager)
 {
-        OPJ_BYTE *l_current_data = p_src;
-        opj_pi_iterator_t *l_pi = 00;
-        OPJ_UINT32 pino;
-        opj_image_t *l_image = p_t2->image;
-        opj_cp_t *l_cp = p_t2->cp;
-        opj_tcp_t *l_tcp = &(p_t2->cp->tcps[p_tile_no]);
-        OPJ_UINT32 l_nb_bytes_read;
-        OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
-        opj_pi_iterator_t *l_current_pi = 00;
+    OPJ_BYTE *l_current_data = p_src;
+    opj_pi_iterator_t *l_pi = 00;
+    OPJ_UINT32 pino;
+    opj_image_t *l_image = p_t2->image;
+    opj_cp_t *l_cp = p_t2->cp;
+    opj_tcp_t *l_tcp = &(p_t2->cp->tcps[p_tile_no]);
+    OPJ_UINT32 l_nb_bytes_read;
+    OPJ_UINT32 l_nb_pocs = l_tcp->numpocs + 1;
+    opj_pi_iterator_t *l_current_pi = 00;
 #ifdef TODO_MSD
-        OPJ_UINT32 curtp = 0;
-        OPJ_UINT32 tp_start_packno;
-#endif 
-        opj_packet_info_t *l_pack_info = 00;
-        opj_image_comp_t* l_img_comp = 00;
+    OPJ_UINT32 curtp = 0;
+    OPJ_UINT32 tp_start_packno;
+#endif
+    opj_packet_info_t *l_pack_info = 00;
+    opj_image_comp_t* l_img_comp = 00;
 
-        OPJ_ARG_NOT_USED(p_cstr_index);
+    OPJ_ARG_NOT_USED(p_cstr_index);
 
 #ifdef TODO_MSD
-        if (p_cstr_index) {
-                l_pack_info = p_cstr_index->tile_index[p_tile_no].packet;
-        }
+    if (p_cstr_index) {
+        l_pack_info = p_cstr_index->tile_index[p_tile_no].packet;
+    }
 #endif
 
-        /* create a packet iterator */
-        l_pi = opj_pi_create_decode(l_image, l_cp, p_tile_no);
-        if (!l_pi) {
-                return OPJ_FALSE;
+    /* create a packet iterator */
+    l_pi = opj_pi_create_decode(l_image, l_cp, p_tile_no);
+    if (!l_pi) {
+        return OPJ_FALSE;
+    }
+
+
+    l_current_pi = l_pi;
+
+    for (pino = 0; pino <= l_tcp->numpocs; ++pino) {
+
+        /* if the resolution needed is too low, one dim of the tilec could be equal to zero
+         * and no packets are used to decode this resolution and
+         * l_current_pi->resno is always >= p_tile->comps[l_current_pi->compno].minimum_num_resolutions
+         * and no l_img_comp->resno_decoded are computed
+         */
+        OPJ_BOOL* first_pass_failed = NULL;
+
+        if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
+            /* TODO ADE : add an error */
+            opj_pi_destroy(l_pi, l_nb_pocs);
+            return OPJ_FALSE;
         }
 
+        first_pass_failed = (OPJ_BOOL*)opj_malloc(l_image->numcomps * sizeof(OPJ_BOOL));
+        if (!first_pass_failed) {
+            opj_pi_destroy(l_pi, l_nb_pocs);
+            return OPJ_FALSE;
+        }
+        memset(first_pass_failed, OPJ_TRUE, l_image->numcomps * sizeof(OPJ_BOOL));
 
-        l_current_pi = l_pi;
+        while (opj_pi_next(l_current_pi)) {
+            JAS_FPRINTF(stderr,
+                        "packet offset=00000166 prg=%d cmptno=%02d rlvlno=%02d prcno=%03d lyrno=%02d\n\n",
+                        l_current_pi->poc.prg1, l_current_pi->compno, l_current_pi->resno,
+                        l_current_pi->precno, l_current_pi->layno);
 
-        for     (pino = 0; pino <= l_tcp->numpocs; ++pino) {
+            if (l_tcp->num_layers_to_decode > l_current_pi->layno
+                    && l_current_pi->resno <
+                    p_tile->comps[l_current_pi->compno].minimum_num_resolutions) {
+                l_nb_bytes_read = 0;
 
-                /* if the resolution needed is too low, one dim of the tilec could be equal to zero
-                 * and no packets are used to decode this resolution and
-                 * l_current_pi->resno is always >= p_tile->comps[l_current_pi->compno].minimum_num_resolutions
-                 * and no l_img_comp->resno_decoded are computed
-                 */
-                OPJ_BOOL* first_pass_failed = NULL;
-					
-                if (l_current_pi->poc.prg == OPJ_PROG_UNKNOWN) {
-                    /* TODO ADE : add an error */
+                first_pass_failed[l_current_pi->compno] = OPJ_FALSE;
+
+                if (! opj_t2_decode_packet(p_t2, p_tile, l_tcp, l_current_pi, l_current_data,
+                                           &l_nb_bytes_read, p_max_len, l_pack_info, p_manager)) {
                     opj_pi_destroy(l_pi, l_nb_pocs);
+                    opj_free(first_pass_failed);
                     return OPJ_FALSE;
                 }
-					
-                first_pass_failed = (OPJ_BOOL*)opj_malloc(l_image->numcomps * sizeof(OPJ_BOOL));
-                if (!first_pass_failed)
-                {
-                    opj_pi_destroy(l_pi,l_nb_pocs);
+
+                l_img_comp = &(l_image->comps[l_current_pi->compno]);
+                l_img_comp->resno_decoded = opj_uint_max(l_current_pi->resno,
+                                            l_img_comp->resno_decoded);
+            } else {
+                l_nb_bytes_read = 0;
+                if (! opj_t2_skip_packet(p_t2, p_tile, l_tcp, l_current_pi, l_current_data,
+                                         &l_nb_bytes_read, p_max_len, l_pack_info, p_manager)) {
+                    opj_pi_destroy(l_pi, l_nb_pocs);
+                    opj_free(first_pass_failed);
                     return OPJ_FALSE;
                 }
-                memset(first_pass_failed, OPJ_TRUE, l_image->numcomps * sizeof(OPJ_BOOL));
+            }
 
-                while (opj_pi_next(l_current_pi)) {
-                  JAS_FPRINTF( stderr, "packet offset=00000166 prg=%d cmptno=%02d rlvlno=%02d prcno=%03d lyrno=%02d\n\n",
-                    l_current_pi->poc.prg1, l_current_pi->compno, l_current_pi->resno, l_current_pi->precno, l_current_pi->layno );
-
-                        if (l_tcp->num_layers_to_decode > l_current_pi->layno
-                                        && l_current_pi->resno < p_tile->comps[l_current_pi->compno].minimum_num_resolutions) {
-                                l_nb_bytes_read = 0;
-
-                                first_pass_failed[l_current_pi->compno] = OPJ_FALSE;
-
-                                if (! opj_t2_decode_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info, p_manager)) {
-                                        opj_pi_destroy(l_pi,l_nb_pocs);
-                                        opj_free(first_pass_failed);
-                                        return OPJ_FALSE;
-                                }
-
-                                l_img_comp = &(l_image->comps[l_current_pi->compno]);
-                                l_img_comp->resno_decoded = opj_uint_max(l_current_pi->resno, l_img_comp->resno_decoded);
-                        }
-                        else {
-                                l_nb_bytes_read = 0;
-                                if (! opj_t2_skip_packet(p_t2,p_tile,l_tcp,l_current_pi,l_current_data,&l_nb_bytes_read,p_max_len,l_pack_info, p_manager)) {
-                                        opj_pi_destroy(l_pi,l_nb_pocs);
-                                        opj_free(first_pass_failed);
-                                        return OPJ_FALSE;
-                                }
-                        }
-
-                        if (first_pass_failed[l_current_pi->compno]) {
-                                l_img_comp = &(l_image->comps[l_current_pi->compno]);
-                                if (l_img_comp->resno_decoded == 0)
-                                        l_img_comp->resno_decoded = p_tile->comps[l_current_pi->compno].minimum_num_resolutions - 1;
-                        }
-
-                        l_current_data += l_nb_bytes_read;
-                        p_max_len -= l_nb_bytes_read;
-
-                        /* INDEX >> */
-#ifdef TODO_MSD
-                        if(p_cstr_info) {
-                                opj_tile_info_v2_t *info_TL = &p_cstr_info->tile[p_tile_no];
-                                opj_packet_info_t *info_PK = &info_TL->packet[p_cstr_info->packno];
-                                tp_start_packno = 0;
-                                if (!p_cstr_info->packno) {
-                                        info_PK->start_pos = info_TL->end_header + 1;
-                                } else if (info_TL->packet[p_cstr_info->packno-1].end_pos >= (OPJ_INT32)p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_pos){ /* New tile part */
-                                        info_TL->tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; /* Number of packets in previous tile-part */
-                                        tp_start_packno = p_cstr_info->packno;
-                                        curtp++;
-                                        info_PK->start_pos = p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_header+1;
-                                } else {
-                                        info_PK->start_pos = (l_cp->m_specific_param.m_enc.m_tp_on && info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[p_cstr_info->packno - 1].end_pos + 1;
-                                }
-                                info_PK->end_pos = info_PK->start_pos + l_nb_bytes_read - 1;
-                                info_PK->end_ph_pos += info_PK->start_pos - 1;  /* End of packet header which now only represents the distance */
-                                ++p_cstr_info->packno;
-                        }
-#endif
-                        /* << INDEX */
+            if (first_pass_failed[l_current_pi->compno]) {
+                l_img_comp = &(l_image->comps[l_current_pi->compno]);
+                if (l_img_comp->resno_decoded == 0) {
+                    l_img_comp->resno_decoded =
+                        p_tile->comps[l_current_pi->compno].minimum_num_resolutions - 1;
                 }
-                ++l_current_pi;
+            }
 
-                opj_free(first_pass_failed);
-        }
-        /* INDEX >> */
+            l_current_data += l_nb_bytes_read;
+            p_max_len -= l_nb_bytes_read;
+
+            /* INDEX >> */
 #ifdef TODO_MSD
-        if
-                (p_cstr_info) {
-                p_cstr_info->tile[p_tile_no].tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; /* Number of packets in last tile-part */
-        }
+            if (p_cstr_info) {
+                opj_tile_info_v2_t *info_TL = &p_cstr_info->tile[p_tile_no];
+                opj_packet_info_t *info_PK = &info_TL->packet[p_cstr_info->packno];
+                tp_start_packno = 0;
+                if (!p_cstr_info->packno) {
+                    info_PK->start_pos = info_TL->end_header + 1;
+                } else if (info_TL->packet[p_cstr_info->packno - 1].end_pos >=
+                           (OPJ_INT32)
+                           p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_pos) { /* New tile part */
+                    info_TL->tp[curtp].tp_numpacks = p_cstr_info->packno -
+                                                     tp_start_packno; /* Number of packets in previous tile-part */
+                    tp_start_packno = p_cstr_info->packno;
+                    curtp++;
+                    info_PK->start_pos = p_cstr_info->tile[p_tile_no].tp[curtp].tp_end_header + 1;
+                } else {
+                    info_PK->start_pos = (l_cp->m_specific_param.m_enc.m_tp_on &&
+                                          info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[p_cstr_info->packno -
+                                                                      1].end_pos + 1;
+                }
+                info_PK->end_pos = info_PK->start_pos + l_nb_bytes_read - 1;
+                info_PK->end_ph_pos += info_PK->start_pos -
+                                       1;  /* End of packet header which now only represents the distance */
+                ++p_cstr_info->packno;
+            }
 #endif
-        /* << INDEX */
+            /* << INDEX */
+        }
+        ++l_current_pi;
 
-        /* don't forget to release pi */
-        opj_pi_destroy(l_pi,l_nb_pocs);
-        *p_data_read = (OPJ_UINT32)(l_current_data - p_src);
-        return OPJ_TRUE;
+        opj_free(first_pass_failed);
+    }
+    /* INDEX >> */
+#ifdef TODO_MSD
+    if
+    (p_cstr_info) {
+        p_cstr_info->tile[p_tile_no].tp[curtp].tp_numpacks = p_cstr_info->packno -
+                tp_start_packno; /* Number of packets in last tile-part */
+    }
+#endif
+    /* << INDEX */
+
+    /* don't forget to release pi */
+    opj_pi_destroy(l_pi, l_nb_pocs);
+    *p_data_read = (OPJ_UINT32)(l_current_data - p_src);
+    return OPJ_TRUE;
 }
 
 /* ----------------------------------------------------------------------- */
@@ -499,883 +528,959 @@
 */
 opj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp)
 {
-        /* create the t2 structure */
-        opj_t2_t *l_t2 = (opj_t2_t*)opj_calloc(1,sizeof(opj_t2_t));
-        if (!l_t2) {
-                return NULL;
-        }
+    /* create the t2 structure */
+    opj_t2_t *l_t2 = (opj_t2_t*)opj_calloc(1, sizeof(opj_t2_t));
+    if (!l_t2) {
+        return NULL;
+    }
 
-        l_t2->image = p_image;
-        l_t2->cp = p_cp;
+    l_t2->image = p_image;
+    l_t2->cp = p_cp;
 
-        return l_t2;
+    return l_t2;
 }
 
-void opj_t2_destroy(opj_t2_t *t2) {
-        if(t2) {
-                opj_free(t2);
-        }
-}
-
-static OPJ_BOOL opj_t2_decode_packet(  opj_t2_t* p_t2,
-                                opj_tcd_tile_t *p_tile,
-                                opj_tcp_t *p_tcp,
-                                opj_pi_iterator_t *p_pi,
-                                OPJ_BYTE *p_src,
-                                OPJ_UINT32 * p_data_read,
-                                OPJ_UINT32 p_max_length,
-                                opj_packet_info_t *p_pack_info,
-                                opj_event_mgr_t *p_manager)
+void opj_t2_destroy(opj_t2_t *t2)
 {
-        OPJ_BOOL l_read_data;
-        OPJ_UINT32 l_nb_bytes_read = 0;
-        OPJ_UINT32 l_nb_total_bytes_read = 0;
+    if (t2) {
+        opj_free(t2);
+    }
+}
 
-        *p_data_read = 0;
+static OPJ_BOOL opj_t2_decode_packet(opj_t2_t* p_t2,
+                                     opj_tcd_tile_t *p_tile,
+                                     opj_tcp_t *p_tcp,
+                                     opj_pi_iterator_t *p_pi,
+                                     OPJ_BYTE *p_src,
+                                     OPJ_UINT32 * p_data_read,
+                                     OPJ_UINT32 p_max_length,
+                                     opj_packet_info_t *p_pack_info,
+                                     opj_event_mgr_t *p_manager)
+{
+    OPJ_BOOL l_read_data;
+    OPJ_UINT32 l_nb_bytes_read = 0;
+    OPJ_UINT32 l_nb_total_bytes_read = 0;
 
-        if (! opj_t2_read_packet_header(p_t2,p_tile,p_tcp,p_pi,&l_read_data,p_src,&l_nb_bytes_read,p_max_length,p_pack_info, p_manager)) {
-                return OPJ_FALSE;
+    *p_data_read = 0;
+
+    if (! opj_t2_read_packet_header(p_t2, p_tile, p_tcp, p_pi, &l_read_data, p_src,
+                                    &l_nb_bytes_read, p_max_length, p_pack_info, p_manager)) {
+        return OPJ_FALSE;
+    }
+
+    p_src += l_nb_bytes_read;
+    l_nb_total_bytes_read += l_nb_bytes_read;
+    p_max_length -= l_nb_bytes_read;
+
+    /* we should read data for the packet */
+    if (l_read_data) {
+        l_nb_bytes_read = 0;
+
+        if (! opj_t2_read_packet_data(p_t2, p_tile, p_pi, p_src, &l_nb_bytes_read,
+                                      p_max_length, p_pack_info, p_manager)) {
+            return OPJ_FALSE;
         }
 
-        p_src += l_nb_bytes_read;
         l_nb_total_bytes_read += l_nb_bytes_read;
-        p_max_length -= l_nb_bytes_read;
+    }
 
-        /* we should read data for the packet */
-        if (l_read_data) {
-                l_nb_bytes_read = 0;
+    *p_data_read = l_nb_total_bytes_read;
 
-                if (! opj_t2_read_packet_data(p_t2,p_tile,p_pi,p_src,&l_nb_bytes_read,p_max_length,p_pack_info, p_manager)) {
-                        return OPJ_FALSE;
-                }
-
-                l_nb_total_bytes_read += l_nb_bytes_read;
-        }
-
-        *p_data_read = l_nb_total_bytes_read;
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_t2_encode_packet(  OPJ_UINT32 tileno,
-                                opj_tcd_tile_t * tile,
-                                opj_tcp_t * tcp,
-                                opj_pi_iterator_t *pi,
-                                OPJ_BYTE *dest,
-                                OPJ_UINT32 * p_data_written,
-                                OPJ_UINT32 length,
-                                opj_codestream_info_t *cstr_info)
+static OPJ_BOOL opj_t2_encode_packet(OPJ_UINT32 tileno,
+                                     opj_tcd_tile_t * tile,
+                                     opj_tcp_t * tcp,
+                                     opj_pi_iterator_t *pi,
+                                     OPJ_BYTE *dest,
+                                     OPJ_UINT32 * p_data_written,
+                                     OPJ_UINT32 length,
+                                     opj_codestream_info_t *cstr_info)
 {
-        OPJ_UINT32 bandno, cblkno;
-        OPJ_BYTE* c = dest;
-        OPJ_UINT32 l_nb_bytes;
-        OPJ_UINT32 compno = pi->compno;     /* component value */
-        OPJ_UINT32 resno  = pi->resno;      /* resolution level value */
-        OPJ_UINT32 precno = pi->precno;     /* precinct value */
-        OPJ_UINT32 layno  = pi->layno;      /* quality layer value */
-        OPJ_UINT32 l_nb_blocks;
-        opj_tcd_band_t *band = 00;
-        opj_tcd_cblk_enc_t* cblk = 00;
-        opj_tcd_pass_t *pass = 00;
+    OPJ_UINT32 bandno, cblkno;
+    OPJ_BYTE* c = dest;
+    OPJ_UINT32 l_nb_bytes;
+    OPJ_UINT32 compno = pi->compno;     /* component value */
+    OPJ_UINT32 resno  = pi->resno;      /* resolution level value */
+    OPJ_UINT32 precno = pi->precno;     /* precinct value */
+    OPJ_UINT32 layno  = pi->layno;      /* quality layer value */
+    OPJ_UINT32 l_nb_blocks;
+    opj_tcd_band_t *band = 00;
+    opj_tcd_cblk_enc_t* cblk = 00;
+    opj_tcd_pass_t *pass = 00;
 
-        opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-        opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+    opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+    opj_tcd_resolution_t *res = &tilec->resolutions[resno];
 
-        opj_bio_t *bio = 00;    /* BIO component */
+    opj_bio_t *bio = 00;    /* BIO component */
+    OPJ_BOOL packet_empty = OPJ_TRUE;
 
-        /* <SOP 0xff91> */
-        if (tcp->csty & J2K_CP_CSTY_SOP) {
-                c[0] = 255;
-                c[1] = 145;
-                c[2] = 0;
-                c[3] = 4;
+    /* <SOP 0xff91> */
+    if (tcp->csty & J2K_CP_CSTY_SOP) {
+        c[0] = 255;
+        c[1] = 145;
+        c[2] = 0;
+        c[3] = 4;
 #if 0
-                c[4] = (tile->packno % 65536) / 256;
-                c[5] = (tile->packno % 65536) % 256;
+        c[4] = (tile->packno % 65536) / 256;
+        c[5] = (tile->packno % 65536) % 256;
 #else
-                c[4] = (tile->packno >> 8) & 0xff; /* packno is uint32_t */
-                c[5] = tile->packno & 0xff;
+        c[4] = (tile->packno >> 8) & 0xff; /* packno is uint32_t */
+        c[5] = tile->packno & 0xff;
 #endif
-                c += 6;
-                length -= 6;
-        }
-        /* </SOP> */
+        c += 6;
+        length -= 6;
+    }
+    /* </SOP> */
 
-        if (!layno) {
-                band = res->bands;
-
-                for(bandno = 0; bandno < res->numbands; ++bandno) {
-                        opj_tcd_precinct_t *prc = &band->precincts[precno];
-
-                        opj_tgt_reset(prc->incltree);
-                        opj_tgt_reset(prc->imsbtree);
-
-                        l_nb_blocks = prc->cw * prc->ch;
-                        for     (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
-                                cblk = &prc->cblks.enc[cblkno];
-
-                                cblk->numpasses = 0;
-                                opj_tgt_setvalue(prc->imsbtree, cblkno, band->numbps - (OPJ_INT32)cblk->numbps);
-                        }
-                        ++band;
-                }
-        }
-
-        bio = opj_bio_create();
-        if (!bio) {
-                /* FIXME event manager error callback */
-                return OPJ_FALSE;
-        }
-        opj_bio_init_enc(bio, c, length);
-        opj_bio_write(bio, 1, 1);           /* Empty header bit */
-
-        /* Writing Packet header */
+    if (!layno) {
         band = res->bands;
-        for (bandno = 0; bandno < res->numbands; ++bandno)      {
-                opj_tcd_precinct_t *prc = &band->precincts[precno];
 
-                l_nb_blocks = prc->cw * prc->ch;
-                cblk = prc->cblks.enc;
+        for (bandno = 0; bandno < res->numbands; ++bandno, ++band) {
+            opj_tcd_precinct_t *prc;
 
-                for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
-                        opj_tcd_layer_t *layer = &cblk->layers[layno];
+            /* Skip empty bands */
+            if (opj_tcd_is_band_empty(band)) {
+                continue;
+            }
 
-                        if (!cblk->numpasses && layer->numpasses) {
-                                opj_tgt_setvalue(prc->incltree, cblkno, (OPJ_INT32)layno);
-                        }
+            prc = &band->precincts[precno];
+            opj_tgt_reset(prc->incltree);
+            opj_tgt_reset(prc->imsbtree);
 
-                        ++cblk;
-                }
+            l_nb_blocks = prc->cw * prc->ch;
+            for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
+                cblk = &prc->cblks.enc[cblkno];
 
-                cblk = prc->cblks.enc;
-                for (cblkno = 0; cblkno < l_nb_blocks; cblkno++) {
-                        opj_tcd_layer_t *layer = &cblk->layers[layno];
-                        OPJ_UINT32 increment = 0;
-                        OPJ_UINT32 nump = 0;
-                        OPJ_UINT32 len = 0, passno;
-                        OPJ_UINT32 l_nb_passes;
+                cblk->numpasses = 0;
+                opj_tgt_setvalue(prc->imsbtree, cblkno, band->numbps - (OPJ_INT32)cblk->numbps);
+            }
+        }
+    }
 
-                        /* cblk inclusion bits */
-                        if (!cblk->numpasses) {
-                                opj_tgt_encode(bio, prc->incltree, cblkno, (OPJ_INT32)(layno + 1));
-                        } else {
-                                opj_bio_write(bio, layer->numpasses != 0, 1);
-                        }
+    bio = opj_bio_create();
+    if (!bio) {
+        /* FIXME event manager error callback */
+        return OPJ_FALSE;
+    }
+    opj_bio_init_enc(bio, c, length);
 
-                        /* if cblk not included, go to the next cblk  */
-                        if (!layer->numpasses) {
-                                ++cblk;
-                                continue;
-                        }
-
-                        /* if first instance of cblk --> zero bit-planes information */
-                        if (!cblk->numpasses) {
-                                cblk->numlenbits = 3;
-                                opj_tgt_encode(bio, prc->imsbtree, cblkno, 999);
-                        }
-
-                        /* number of coding passes included */
-                        opj_t2_putnumpasses(bio, layer->numpasses);
-                        l_nb_passes = cblk->numpasses + layer->numpasses;
-                        pass = cblk->passes +  cblk->numpasses;
-
-                        /* computation of the increase of the length indicator and insertion in the header     */
-                        for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
-                                ++nump;
-                                len += pass->len;
-
-                                if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
-                                  increment = (OPJ_UINT32)opj_int_max((OPJ_INT32)increment, opj_int_floorlog2((OPJ_INT32)len) + 1
-                                    - ((OPJ_INT32)cblk->numlenbits + opj_int_floorlog2((OPJ_INT32)nump)));
-                                        len = 0;
-                                        nump = 0;
-                                }
-
-                                ++pass;
-                        }
-                        opj_t2_putcommacode(bio, (OPJ_INT32)increment);
-
-                        /* computation of the new Length indicator */
-                        cblk->numlenbits += increment;
-
-                        pass = cblk->passes +  cblk->numpasses;
-                        /* insertion of the codeword segment length */
-                        for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
-                                nump++;
-                                len += pass->len;
-
-                                if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
-                                        opj_bio_write(bio, (OPJ_UINT32)len, cblk->numlenbits + (OPJ_UINT32)opj_int_floorlog2((OPJ_INT32)nump));
-                                        len = 0;
-                                        nump = 0;
-                                }
-                                ++pass;
-                        }
-
-                        ++cblk;
-                }
-
-                ++band;
+    /* Check if the packet is empty */
+    /* Note: we could also skip that step and always write a packet header */
+    band = res->bands;
+    for (bandno = 0; bandno < res->numbands; ++bandno, ++band) {
+        opj_tcd_precinct_t *prc;
+        /* Skip empty bands */
+        if (opj_tcd_is_band_empty(band)) {
+            continue;
         }
 
-        if (!opj_bio_flush(bio)) {
-                opj_bio_destroy(bio);
-                return OPJ_FALSE;               /* modified to eliminate longjmp !! */
+        prc = &band->precincts[precno];
+        l_nb_blocks = prc->cw * prc->ch;
+        cblk = prc->cblks.enc;
+        for (cblkno = 0; cblkno < l_nb_blocks; cblkno++, ++cblk) {
+            opj_tcd_layer_t *layer = &cblk->layers[layno];
+
+            /* if cblk not included, go to the next cblk  */
+            if (!layer->numpasses) {
+                continue;
+            }
+            packet_empty = OPJ_FALSE;
+            break;
+        }
+        if (!packet_empty) {
+            break;
+        }
+    }
+
+    opj_bio_write(bio, packet_empty ? 0 : 1, 1);           /* Empty header bit */
+
+
+    /* Writing Packet header */
+    band = res->bands;
+    for (bandno = 0; !packet_empty &&
+            bandno < res->numbands; ++bandno, ++band)      {
+        opj_tcd_precinct_t *prc;
+
+        /* Skip empty bands */
+        if (opj_tcd_is_band_empty(band)) {
+            continue;
         }
 
-        l_nb_bytes = (OPJ_UINT32)opj_bio_numbytes(bio);
-        c += l_nb_bytes;
-        length -= l_nb_bytes;
+        prc = &band->precincts[precno];
+        l_nb_blocks = prc->cw * prc->ch;
+        cblk = prc->cblks.enc;
 
+        for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
+            opj_tcd_layer_t *layer = &cblk->layers[layno];
+
+            if (!cblk->numpasses && layer->numpasses) {
+                opj_tgt_setvalue(prc->incltree, cblkno, (OPJ_INT32)layno);
+            }
+
+            ++cblk;
+        }
+
+        cblk = prc->cblks.enc;
+        for (cblkno = 0; cblkno < l_nb_blocks; cblkno++) {
+            opj_tcd_layer_t *layer = &cblk->layers[layno];
+            OPJ_UINT32 increment = 0;
+            OPJ_UINT32 nump = 0;
+            OPJ_UINT32 len = 0, passno;
+            OPJ_UINT32 l_nb_passes;
+
+            /* cblk inclusion bits */
+            if (!cblk->numpasses) {
+                opj_tgt_encode(bio, prc->incltree, cblkno, (OPJ_INT32)(layno + 1));
+            } else {
+                opj_bio_write(bio, layer->numpasses != 0, 1);
+            }
+
+            /* if cblk not included, go to the next cblk  */
+            if (!layer->numpasses) {
+                ++cblk;
+                continue;
+            }
+
+            /* if first instance of cblk --> zero bit-planes information */
+            if (!cblk->numpasses) {
+                cblk->numlenbits = 3;
+                opj_tgt_encode(bio, prc->imsbtree, cblkno, 999);
+            }
+
+            /* number of coding passes included */
+            opj_t2_putnumpasses(bio, layer->numpasses);
+            l_nb_passes = cblk->numpasses + layer->numpasses;
+            pass = cblk->passes +  cblk->numpasses;
+
+            /* computation of the increase of the length indicator and insertion in the header     */
+            for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
+                ++nump;
+                len += pass->len;
+
+                if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
+                    increment = (OPJ_UINT32)opj_int_max((OPJ_INT32)increment,
+                                                        opj_int_floorlog2((OPJ_INT32)len) + 1
+                                                        - ((OPJ_INT32)cblk->numlenbits + opj_int_floorlog2((OPJ_INT32)nump)));
+                    len = 0;
+                    nump = 0;
+                }
+
+                ++pass;
+            }
+            opj_t2_putcommacode(bio, (OPJ_INT32)increment);
+
+            /* computation of the new Length indicator */
+            cblk->numlenbits += increment;
+
+            pass = cblk->passes +  cblk->numpasses;
+            /* insertion of the codeword segment length */
+            for (passno = cblk->numpasses; passno < l_nb_passes; ++passno) {
+                nump++;
+                len += pass->len;
+
+                if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
+                    opj_bio_write(bio, (OPJ_UINT32)len,
+                                  cblk->numlenbits + (OPJ_UINT32)opj_int_floorlog2((OPJ_INT32)nump));
+                    len = 0;
+                    nump = 0;
+                }
+                ++pass;
+            }
+
+            ++cblk;
+        }
+    }
+
+    if (!opj_bio_flush(bio)) {
         opj_bio_destroy(bio);
+        return OPJ_FALSE;               /* modified to eliminate longjmp !! */
+    }
 
-        /* <EPH 0xff92> */
-        if (tcp->csty & J2K_CP_CSTY_EPH) {
-                c[0] = 255;
-                c[1] = 146;
-                c += 2;
-                length -= 2;
+    l_nb_bytes = (OPJ_UINT32)opj_bio_numbytes(bio);
+    c += l_nb_bytes;
+    length -= l_nb_bytes;
+
+    opj_bio_destroy(bio);
+
+    /* <EPH 0xff92> */
+    if (tcp->csty & J2K_CP_CSTY_EPH) {
+        c[0] = 255;
+        c[1] = 146;
+        c += 2;
+        length -= 2;
+    }
+    /* </EPH> */
+
+    /* << INDEX */
+    /* End of packet header position. Currently only represents the distance to start of packet
+       Will be updated later by incrementing with packet start value*/
+    if (cstr_info && cstr_info->index_write) {
+        opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
+        info_PK->end_ph_pos = (OPJ_INT32)(c - dest);
+    }
+    /* INDEX >> */
+
+    /* Writing the packet body */
+    band = res->bands;
+    for (bandno = 0; !packet_empty && bandno < res->numbands; bandno++, ++band) {
+        opj_tcd_precinct_t *prc;
+
+        /* Skip empty bands */
+        if (opj_tcd_is_band_empty(band)) {
+            continue;
         }
-        /* </EPH> */
 
-        /* << INDEX */
-        /* End of packet header position. Currently only represents the distance to start of packet
-           Will be updated later by incrementing with packet start value*/
-        if(cstr_info && cstr_info->index_write) {
+        prc = &band->precincts[precno];
+        l_nb_blocks = prc->cw * prc->ch;
+        cblk = prc->cblks.enc;
+
+        for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
+            opj_tcd_layer_t *layer = &cblk->layers[layno];
+
+            if (!layer->numpasses) {
+                ++cblk;
+                continue;
+            }
+
+            if (layer->len > length) {
+                return OPJ_FALSE;
+            }
+
+            memcpy(c, layer->data, layer->len);
+            cblk->numpasses += layer->numpasses;
+            c += layer->len;
+            length -= layer->len;
+
+            /* << INDEX */
+            if (cstr_info && cstr_info->index_write) {
                 opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
-                info_PK->end_ph_pos = (OPJ_INT32)(c - dest);
-        }
-        /* INDEX >> */
-
-        /* Writing the packet body */
-        band = res->bands;
-        for (bandno = 0; bandno < res->numbands; bandno++) {
-                opj_tcd_precinct_t *prc = &band->precincts[precno];
-
-                l_nb_blocks = prc->cw * prc->ch;
-                cblk = prc->cblks.enc;
-
-                for (cblkno = 0; cblkno < l_nb_blocks; ++cblkno) {
-                        opj_tcd_layer_t *layer = &cblk->layers[layno];
-
-                        if (!layer->numpasses) {
-                                ++cblk;
-                                continue;
-                        }
-
-                        if (layer->len > length) {
-                                return OPJ_FALSE;
-                        }
-
-                        memcpy(c, layer->data, layer->len);
-                        cblk->numpasses += layer->numpasses;
-                        c += layer->len;
-                        length -= layer->len;
-
-                        /* << INDEX */
-                        if(cstr_info && cstr_info->index_write) {
-                                opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
-                                info_PK->disto += layer->disto;
-                                if (cstr_info->D_max < info_PK->disto) {
-                                        cstr_info->D_max = info_PK->disto;
-                                }
-                        }
-
-                        ++cblk;
-                        /* INDEX >> */
+                info_PK->disto += layer->disto;
+                if (cstr_info->D_max < info_PK->disto) {
+                    cstr_info->D_max = info_PK->disto;
                 }
-                ++band;
+            }
+
+            ++cblk;
+            /* INDEX >> */
         }
+    }
 
-        assert( c >= dest );
-        * p_data_written += (OPJ_UINT32)(c - dest);
+    assert(c >= dest);
+    * p_data_written += (OPJ_UINT32)(c - dest);
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_t2_skip_packet( opj_t2_t* p_t2,
-                                    opj_tcd_tile_t *p_tile,
-                                    opj_tcp_t *p_tcp,
-                                    opj_pi_iterator_t *p_pi,
-                                    OPJ_BYTE *p_src,
-                                    OPJ_UINT32 * p_data_read,
-                                    OPJ_UINT32 p_max_length,
-                                    opj_packet_info_t *p_pack_info,
-                                    opj_event_mgr_t *p_manager)
+static OPJ_BOOL opj_t2_skip_packet(opj_t2_t* p_t2,
+                                   opj_tcd_tile_t *p_tile,
+                                   opj_tcp_t *p_tcp,
+                                   opj_pi_iterator_t *p_pi,
+                                   OPJ_BYTE *p_src,
+                                   OPJ_UINT32 * p_data_read,
+                                   OPJ_UINT32 p_max_length,
+                                   opj_packet_info_t *p_pack_info,
+                                   opj_event_mgr_t *p_manager)
 {
-        OPJ_BOOL l_read_data;
-        OPJ_UINT32 l_nb_bytes_read = 0;
-        OPJ_UINT32 l_nb_total_bytes_read = 0;
+    OPJ_BOOL l_read_data;
+    OPJ_UINT32 l_nb_bytes_read = 0;
+    OPJ_UINT32 l_nb_total_bytes_read = 0;
 
-        *p_data_read = 0;
+    *p_data_read = 0;
 
-        if (! opj_t2_read_packet_header(p_t2,p_tile,p_tcp,p_pi,&l_read_data,p_src,&l_nb_bytes_read,p_max_length,p_pack_info, p_manager)) {
-                return OPJ_FALSE;
+    if (! opj_t2_read_packet_header(p_t2, p_tile, p_tcp, p_pi, &l_read_data, p_src,
+                                    &l_nb_bytes_read, p_max_length, p_pack_info, p_manager)) {
+        return OPJ_FALSE;
+    }
+
+    p_src += l_nb_bytes_read;
+    l_nb_total_bytes_read += l_nb_bytes_read;
+    p_max_length -= l_nb_bytes_read;
+
+    /* we should read data for the packet */
+    if (l_read_data) {
+        l_nb_bytes_read = 0;
+
+        if (! opj_t2_skip_packet_data(p_t2, p_tile, p_pi, &l_nb_bytes_read,
+                                      p_max_length, p_pack_info, p_manager)) {
+            return OPJ_FALSE;
         }
 
-        p_src += l_nb_bytes_read;
         l_nb_total_bytes_read += l_nb_bytes_read;
-        p_max_length -= l_nb_bytes_read;
+    }
+    *p_data_read = l_nb_total_bytes_read;
 
-        /* we should read data for the packet */
-        if (l_read_data) {
-                l_nb_bytes_read = 0;
-
-                if (! opj_t2_skip_packet_data(p_t2,p_tile,p_pi,&l_nb_bytes_read,p_max_length,p_pack_info, p_manager)) {
-                        return OPJ_FALSE;
-                }
-
-                l_nb_total_bytes_read += l_nb_bytes_read;
-        }
-        *p_data_read = l_nb_total_bytes_read;
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 
-static OPJ_BOOL opj_t2_read_packet_header( opj_t2_t* p_t2,
-                                    opj_tcd_tile_t *p_tile,
-                                    opj_tcp_t *p_tcp,
-                                    opj_pi_iterator_t *p_pi,
-                                    OPJ_BOOL * p_is_data_present,
-                                    OPJ_BYTE *p_src_data,
-                                    OPJ_UINT32 * p_data_read,
-                                    OPJ_UINT32 p_max_length,
-                                    opj_packet_info_t *p_pack_info,
-                                    opj_event_mgr_t *p_manager)
+static OPJ_BOOL opj_t2_read_packet_header(opj_t2_t* p_t2,
+        opj_tcd_tile_t *p_tile,
+        opj_tcp_t *p_tcp,
+        opj_pi_iterator_t *p_pi,
+        OPJ_BOOL * p_is_data_present,
+        OPJ_BYTE *p_src_data,
+        OPJ_UINT32 * p_data_read,
+        OPJ_UINT32 p_max_length,
+        opj_packet_info_t *p_pack_info,
+        opj_event_mgr_t *p_manager)
 
 {
-        /* loop */
-        OPJ_UINT32 bandno, cblkno;
-        OPJ_UINT32 l_nb_code_blocks;
-        OPJ_UINT32 l_remaining_length;
-        OPJ_UINT32 l_header_length;
-        OPJ_UINT32 * l_modified_length_ptr = 00;
-        OPJ_BYTE *l_current_data = p_src_data;
-        opj_cp_t *l_cp = p_t2->cp;
-        opj_bio_t *l_bio = 00;  /* BIO component */
-        opj_tcd_band_t *l_band = 00;
-        opj_tcd_cblk_dec_t* l_cblk = 00;
-        opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
+    /* loop */
+    OPJ_UINT32 bandno, cblkno;
+    OPJ_UINT32 l_nb_code_blocks;
+    OPJ_UINT32 l_remaining_length;
+    OPJ_UINT32 l_header_length;
+    OPJ_UINT32 * l_modified_length_ptr = 00;
+    OPJ_BYTE *l_current_data = p_src_data;
+    opj_cp_t *l_cp = p_t2->cp;
+    opj_bio_t *l_bio = 00;  /* BIO component */
+    opj_tcd_band_t *l_band = 00;
+    opj_tcd_cblk_dec_t* l_cblk = 00;
+    opj_tcd_resolution_t* l_res =
+        &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
 
-        OPJ_BYTE *l_header_data = 00;
-        OPJ_BYTE **l_header_data_start = 00;
+    OPJ_BYTE *l_header_data = 00;
+    OPJ_BYTE **l_header_data_start = 00;
 
-        OPJ_UINT32 l_present;
+    OPJ_UINT32 l_present;
 
-        if (p_pi->layno == 0) {
-                l_band = l_res->bands;
-
-                /* reset tagtrees */
-                for (bandno = 0; bandno < l_res->numbands; ++bandno) {
-                        opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
-
-                        if ( ! ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) ) {
-                                opj_tgt_reset(l_prc->incltree);
-                                opj_tgt_reset(l_prc->imsbtree);
-                                l_cblk = l_prc->cblks.dec;
-
-                                l_nb_code_blocks = l_prc->cw * l_prc->ch;
-                                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
-                                        l_cblk->numsegs = 0;
-                                        l_cblk->real_num_segs = 0;
-                                        ++l_cblk;
-                                }
-                        }
-
-                        ++l_band;
-                }
-        }
-
-        /* SOP markers */
-
-        if (p_tcp->csty & J2K_CP_CSTY_SOP) {
-                if (p_max_length < 6) {
-												opj_event_msg(p_manager, EVT_WARNING, "Not enough space for expected SOP marker\n");
-                } else if ((*l_current_data) != 0xff || (*(l_current_data + 1) != 0x91)) {
-                        opj_event_msg(p_manager, EVT_WARNING, "Expected SOP marker\n");
-                } else {
-                        l_current_data += 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
-        */
-
-        l_bio = opj_bio_create();
-        if (! l_bio) {
-                return OPJ_FALSE;
-        }
-
-        if (l_cp->ppm == 1) { /* PPM */
-                l_header_data_start = &l_cp->ppm_data;
-                l_header_data = *l_header_data_start;
-                l_modified_length_ptr = &(l_cp->ppm_len);
-
-        }
-        else if (p_tcp->ppt == 1) { /* PPT */
-                l_header_data_start = &(p_tcp->ppt_data);
-                l_header_data = *l_header_data_start;
-                l_modified_length_ptr = &(p_tcp->ppt_len);
-        }
-        else {  /* Normal Case */
-                l_header_data_start = &(l_current_data);
-                l_header_data = *l_header_data_start;
-                l_remaining_length = (OPJ_UINT32)(p_src_data+p_max_length-l_header_data);
-                l_modified_length_ptr = &(l_remaining_length);
-        }
-
-        opj_bio_init_dec(l_bio, l_header_data,*l_modified_length_ptr);
-
-        l_present = opj_bio_read(l_bio, 1);
-        JAS_FPRINTF(stderr, "present=%d \n", l_present );
-        if (!l_present) {
-            /* TODO MSD: no test to control the output of this function*/
-                opj_bio_inalign(l_bio);
-                l_header_data += opj_bio_numbytes(l_bio);
-                opj_bio_destroy(l_bio);
-
-                /* EPH markers */
-                if (p_tcp->csty & J2K_CP_CSTY_EPH) {
-                        if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data - *l_header_data_start)) < 2U) {
-                                opj_event_msg(p_manager, EVT_WARNING, "Not enough space for expected EPH marker\n");
-                        } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
-                                opj_event_msg(p_manager, EVT_WARNING, "Expected EPH marker\n");
-                        } else {
-                                l_header_data += 2;
-                        }
-                }
-
-                l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
-                *l_modified_length_ptr -= l_header_length;
-                *l_header_data_start += l_header_length;
-
-                /* << INDEX */
-                /* End of packet header position. Currently only represents the distance to start of packet
-                   Will be updated later by incrementing with packet start value */
-                if (p_pack_info) {
-                        p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
-                }
-                /* INDEX >> */
-
-                * p_is_data_present = OPJ_FALSE;
-                *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
-                return OPJ_TRUE;
-        }
-
+    if (p_pi->layno == 0) {
         l_band = l_res->bands;
-        for (bandno = 0; bandno < l_res->numbands; ++bandno) {
-                opj_tcd_precinct_t *l_prc = &(l_band->precincts[p_pi->precno]);
 
-                if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
-                        ++l_band;
-                        continue;
+        /* reset tagtrees */
+        for (bandno = 0; bandno < l_res->numbands; ++bandno) {
+            if (!opj_tcd_is_band_empty(l_band)) {
+                opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
+                if (!(p_pi->precno < (l_band->precincts_data_size / sizeof(
+                                          opj_tcd_precinct_t)))) {
+                    opj_event_msg(p_manager, EVT_ERROR, "Invalid precinct\n");
+                    return OPJ_FALSE;
                 }
 
+
+                opj_tgt_reset(l_prc->incltree);
+                opj_tgt_reset(l_prc->imsbtree);
+                l_cblk = l_prc->cblks.dec;
+
                 l_nb_code_blocks = l_prc->cw * l_prc->ch;
-                l_cblk = l_prc->cblks.dec;
-                for (cblkno = 0; cblkno < l_nb_code_blocks; cblkno++) {
-                        OPJ_UINT32 l_included,l_increment, l_segno;
-                        OPJ_INT32 n;
-
-                        /* if cblk not yet included before --> inclusion tagtree */
-                        if (!l_cblk->numsegs) {
-                                l_included = opj_tgt_decode(l_bio, l_prc->incltree, cblkno, (OPJ_INT32)(p_pi->layno + 1));
-                                /* else one bit */
-                        }
-                        else {
-                                l_included = opj_bio_read(l_bio, 1);
-                        }
-
-                        /* if cblk not included */
-                        if (!l_included) {
-                                l_cblk->numnewpasses = 0;
-                                ++l_cblk;
-                                JAS_FPRINTF(stderr, "included=%d \n", l_included);
-                                continue;
-                        }
-
-                        /* if cblk not yet included --> zero-bitplane tagtree */
-                        if (!l_cblk->numsegs) {
-                                OPJ_UINT32 i = 0;
-
-                                while (!opj_tgt_decode(l_bio, l_prc->imsbtree, cblkno, (OPJ_INT32)i)) {
-                                        ++i;
-                                }
-
-                                l_cblk->numbps = (OPJ_UINT32)l_band->numbps + 1 - i;
-                                l_cblk->numlenbits = 3;
-                        }
-
-                        /* number of coding passes */
-                        l_cblk->numnewpasses = opj_t2_getnumpasses(l_bio);
-                        l_increment = opj_t2_getcommacode(l_bio);
-
-                        /* length indicator increment */
-                        l_cblk->numlenbits += l_increment;
-                        l_segno = 0;
-
-                        if (!l_cblk->numsegs) {
-                                if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 1)) {
-                                        opj_bio_destroy(l_bio);
-                                        return OPJ_FALSE;
-                                }
-                        }
-                        else {
-                                l_segno = l_cblk->numsegs - 1;
-                                if (l_cblk->segs[l_segno].numpasses == l_cblk->segs[l_segno].maxpasses) {
-                                        ++l_segno;
-                                        if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
-                                                opj_bio_destroy(l_bio);
-                                                return OPJ_FALSE;
-                                        }
-                                }
-                        }
-                        n = (OPJ_INT32)l_cblk->numnewpasses;
-
-                        do {
-                                l_cblk->segs[l_segno].numnewpasses = (OPJ_UINT32)opj_int_min((OPJ_INT32)(l_cblk->segs[l_segno].maxpasses - l_cblk->segs[l_segno].numpasses), n);
-                                l_cblk->segs[l_segno].newlen = opj_bio_read(l_bio, l_cblk->numlenbits + opj_uint_floorlog2(l_cblk->segs[l_segno].numnewpasses));
-                                        JAS_FPRINTF(stderr, "included=%d numnewpasses=%d increment=%d len=%d \n", l_included, l_cblk->segs[l_segno].numnewpasses, l_increment, l_cblk->segs[l_segno].newlen );
-
-                                n -= (OPJ_INT32)l_cblk->segs[l_segno].numnewpasses;
-                                if (n > 0) {
-                                        ++l_segno;
-
-                                        if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
-                                                opj_bio_destroy(l_bio);
-                                                return OPJ_FALSE;
-                                        }
-                                }
-                        } while (n > 0);
-
-                        ++l_cblk;
+                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+                    l_cblk->numsegs = 0;
+                    l_cblk->real_num_segs = 0;
+                    ++l_cblk;
                 }
+            }
 
-                ++l_band;
+            ++l_band;
+        }
+    }
+
+    /* SOP markers */
+
+    if (p_tcp->csty & J2K_CP_CSTY_SOP) {
+        if (p_max_length < 6) {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "Not enough space for expected SOP marker\n");
+        } else if ((*l_current_data) != 0xff || (*(l_current_data + 1) != 0x91)) {
+            opj_event_msg(p_manager, EVT_WARNING, "Expected SOP marker\n");
+        } else {
+            l_current_data += 6;
         }
 
-        if (!opj_bio_inalign(l_bio)) {
-                opj_bio_destroy(l_bio);
-                return OPJ_FALSE;
-        }
+        /** 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
+    */
+
+    l_bio = opj_bio_create();
+    if (! l_bio) {
+        return OPJ_FALSE;
+    }
+
+    if (l_cp->ppm == 1) { /* PPM */
+        l_header_data_start = &l_cp->ppm_data;
+        l_header_data = *l_header_data_start;
+        l_modified_length_ptr = &(l_cp->ppm_len);
+
+    } else if (p_tcp->ppt == 1) { /* PPT */
+        l_header_data_start = &(p_tcp->ppt_data);
+        l_header_data = *l_header_data_start;
+        l_modified_length_ptr = &(p_tcp->ppt_len);
+    } else { /* Normal Case */
+        l_header_data_start = &(l_current_data);
+        l_header_data = *l_header_data_start;
+        l_remaining_length = (OPJ_UINT32)(p_src_data + p_max_length - l_header_data);
+        l_modified_length_ptr = &(l_remaining_length);
+    }
+
+    opj_bio_init_dec(l_bio, l_header_data, *l_modified_length_ptr);
+
+    l_present = opj_bio_read(l_bio, 1);
+    JAS_FPRINTF(stderr, "present=%d \n", l_present);
+    if (!l_present) {
+        /* TODO MSD: no test to control the output of this function*/
+        opj_bio_inalign(l_bio);
         l_header_data += opj_bio_numbytes(l_bio);
         opj_bio_destroy(l_bio);
 
         /* EPH markers */
         if (p_tcp->csty & J2K_CP_CSTY_EPH) {
-                if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data - *l_header_data_start)) < 2U) {
-                        opj_event_msg(p_manager, EVT_WARNING, "Not enough space for expected EPH marker\n");
-                } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
-                        opj_event_msg(p_manager, EVT_WARNING, "Expected EPH marker\n");
-                } else {
-                        l_header_data += 2;
-                }
+            if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data -
+                    *l_header_data_start)) < 2U) {
+                opj_event_msg(p_manager, EVT_WARNING,
+                              "Not enough space for expected EPH marker\n");
+            } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
+                opj_event_msg(p_manager, EVT_WARNING, "Expected EPH marker\n");
+            } else {
+                l_header_data += 2;
+            }
         }
 
         l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
-        JAS_FPRINTF( stderr, "hdrlen=%d \n", l_header_length );
-        JAS_FPRINTF( stderr, "packet body\n");
         *l_modified_length_ptr -= l_header_length;
         *l_header_data_start += l_header_length;
 
         /* << INDEX */
         /* End of packet header position. Currently only represents the distance to start of packet
-         Will be updated later by incrementing with packet start value */
+           Will be updated later by incrementing with packet start value */
         if (p_pack_info) {
-                p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
+            p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
         }
         /* INDEX >> */
 
-        *p_is_data_present = OPJ_TRUE;
+        * p_is_data_present = OPJ_FALSE;
         *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
-
         return OPJ_TRUE;
-}
+    }
 
-static OPJ_BOOL opj_t2_read_packet_data(   opj_t2_t* p_t2,
-                                    opj_tcd_tile_t *p_tile,
-                                    opj_pi_iterator_t *p_pi,
-                                    OPJ_BYTE *p_src_data,
-                                    OPJ_UINT32 * p_data_read,
-                                    OPJ_UINT32 p_max_length,
-                                    opj_packet_info_t *pack_info,
-                                    opj_event_mgr_t* p_manager)
-{
-        OPJ_UINT32 bandno, cblkno;
-        OPJ_UINT32 l_nb_code_blocks;
-        OPJ_BYTE *l_current_data = p_src_data;
-        opj_tcd_band_t *l_band = 00;
-        opj_tcd_cblk_dec_t* l_cblk = 00;
-        opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
+    l_band = l_res->bands;
+    for (bandno = 0; bandno < l_res->numbands; ++bandno, ++l_band) {
+        opj_tcd_precinct_t *l_prc = &(l_band->precincts[p_pi->precno]);
 
-        OPJ_ARG_NOT_USED(p_t2);
-        OPJ_ARG_NOT_USED(pack_info);
-
-        l_band = l_res->bands;
-        for (bandno = 0; bandno < l_res->numbands; ++bandno) {
-                opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
-
-                if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
-                        ++l_band;
-                        continue;
-                }
-
-                l_nb_code_blocks = l_prc->cw * l_prc->ch;
-                l_cblk = l_prc->cblks.dec;
-
-                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
-                        opj_tcd_seg_t *l_seg = 00;
-
-                        if (!l_cblk->numnewpasses) {
-                                /* nothing to do */
-                                ++l_cblk;
-                                continue;
-                        }
-
-                        if (!l_cblk->numsegs) {
-                                l_seg = l_cblk->segs;
-                                ++l_cblk->numsegs;
-                                l_cblk->data_current_size = 0;
-                        }
-                        else {
-                                l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
-
-                                if (l_seg->numpasses == l_seg->maxpasses) {
-                                        ++l_seg;
-                                        ++l_cblk->numsegs;
-                                }
-                        }
-
-                        do {
-                                /* Check possible overflow (on l_current_data only, assumes input args already checked) then size */
-                                if ((((OPJ_SIZE_T)l_current_data + (OPJ_SIZE_T)l_seg->newlen) < (OPJ_SIZE_T)l_current_data) || (l_current_data + l_seg->newlen > p_src_data + p_max_length)) {
-                                        opj_event_msg(p_manager, EVT_ERROR, "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
-																								l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
-                                        return OPJ_FALSE;
-                                }
-
-#ifdef USE_JPWL
-                        /* we need here a j2k handle to verify if making a check to
-                        the validity of cblocks parameters is selected from user (-W) */
-
-                                /* let's check that we are not exceeding */
-                                if ((l_cblk->len + l_seg->newlen) > 8192) {
-                                        opj_event_msg(p_manager, EVT_WARNING,
-                                                "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
-                                                l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
-                                        if (!JPWL_ASSUME) {
-                                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
-                                                return OPJ_FALSE;
-                                        }
-                                        l_seg->newlen = 8192 - l_cblk->len;
-                                        opj_event_msg(p_manager, EVT_WARNING, "      - truncating segment to %d\n", l_seg->newlen);
-                                        break;
-                                };
-
-#endif /* USE_JPWL */
-                                /* Check possible overflow on size */
-                                if ((l_cblk->data_current_size + l_seg->newlen) < l_cblk->data_current_size) {
-                                        opj_event_msg(p_manager, EVT_ERROR, "read: segment too long (%d) with current size (%d > %d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
-                                                l_seg->newlen, l_cblk->data_current_size, 0xFFFFFFFF - l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
-                                        return OPJ_FALSE;
-                                }
-                                /* Check if the cblk->data have allocated enough memory */
-                                if ((l_cblk->data_current_size + l_seg->newlen) > l_cblk->data_max_size) {
-                                    OPJ_BYTE* new_cblk_data = (OPJ_BYTE*) opj_realloc(l_cblk->data, l_cblk->data_current_size + l_seg->newlen);
-                                    if(! new_cblk_data) {
-                                        opj_free(l_cblk->data);
-                                        l_cblk->data = NULL;
-                                        l_cblk->data_max_size = 0;
-                                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to realloc code block cata!\n"); */
-                                        return OPJ_FALSE;
-                                    }
-                                    l_cblk->data_max_size = l_cblk->data_current_size + l_seg->newlen;
-                                    l_cblk->data = new_cblk_data;
-                                }
-                               
-                                memcpy(l_cblk->data + l_cblk->data_current_size, l_current_data, l_seg->newlen);
-
-                                if (l_seg->numpasses == 0) {
-                                        l_seg->data = &l_cblk->data;
-                                        l_seg->dataindex = l_cblk->data_current_size;
-                                }
-
-                                l_current_data += l_seg->newlen;
-                                l_seg->numpasses += l_seg->numnewpasses;
-                                l_cblk->numnewpasses -= l_seg->numnewpasses;
-
-                                l_seg->real_num_passes = l_seg->numpasses;
-                                l_cblk->data_current_size += l_seg->newlen;
-                                l_seg->len += l_seg->newlen;
-
-                                if (l_cblk->numnewpasses > 0) {
-                                        ++l_seg;
-                                        ++l_cblk->numsegs;
-                                }
-                        } while (l_cblk->numnewpasses > 0);
-
-                        l_cblk->real_num_segs = l_cblk->numsegs;
-                        ++l_cblk;
-                } /* next code_block */
-
-                ++l_band;
+        if (opj_tcd_is_band_empty(l_band)) {
+            continue;
         }
 
-        *(p_data_read) = (OPJ_UINT32)(l_current_data - p_src_data);
+        l_nb_code_blocks = l_prc->cw * l_prc->ch;
+        l_cblk = l_prc->cblks.dec;
+        for (cblkno = 0; cblkno < l_nb_code_blocks; cblkno++) {
+            OPJ_UINT32 l_included, l_increment, l_segno;
+            OPJ_INT32 n;
 
+            /* if cblk not yet included before --> inclusion tagtree */
+            if (!l_cblk->numsegs) {
+                l_included = opj_tgt_decode(l_bio, l_prc->incltree, cblkno,
+                                            (OPJ_INT32)(p_pi->layno + 1));
+                /* else one bit */
+            } else {
+                l_included = opj_bio_read(l_bio, 1);
+            }
 
-        return OPJ_TRUE;
-}
+            /* if cblk not included */
+            if (!l_included) {
+                l_cblk->numnewpasses = 0;
+                ++l_cblk;
+                JAS_FPRINTF(stderr, "included=%d \n", l_included);
+                continue;
+            }
 
-static OPJ_BOOL opj_t2_skip_packet_data(   opj_t2_t* p_t2,
-                                    opj_tcd_tile_t *p_tile,
-                                    opj_pi_iterator_t *p_pi,
-                                    OPJ_UINT32 * p_data_read,
-                                    OPJ_UINT32 p_max_length,
-                                    opj_packet_info_t *pack_info,
-                                    opj_event_mgr_t *p_manager)
-{
-        OPJ_UINT32 bandno, cblkno;
-        OPJ_UINT32 l_nb_code_blocks;
-        opj_tcd_band_t *l_band = 00;
-        opj_tcd_cblk_dec_t* l_cblk = 00;
-        opj_tcd_resolution_t* l_res = &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
+            /* if cblk not yet included --> zero-bitplane tagtree */
+            if (!l_cblk->numsegs) {
+                OPJ_UINT32 i = 0;
 
-        OPJ_ARG_NOT_USED(p_t2);
-        OPJ_ARG_NOT_USED(pack_info);
-
-        *p_data_read = 0;
-        l_band = l_res->bands;
-
-        for (bandno = 0; bandno < l_res->numbands; ++bandno) {
-                opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
-
-                if ((l_band->x1-l_band->x0 == 0)||(l_band->y1-l_band->y0 == 0)) {
-                        ++l_band;
-                        continue;
+                while (!opj_tgt_decode(l_bio, l_prc->imsbtree, cblkno, (OPJ_INT32)i)) {
+                    ++i;
                 }
 
-                l_nb_code_blocks = l_prc->cw * l_prc->ch;
-                l_cblk = l_prc->cblks.dec;
+                l_cblk->numbps = (OPJ_UINT32)l_band->numbps + 1 - i;
+                l_cblk->numlenbits = 3;
+            }
 
-                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
-                        opj_tcd_seg_t *l_seg = 00;
+            /* number of coding passes */
+            l_cblk->numnewpasses = opj_t2_getnumpasses(l_bio);
+            l_increment = opj_t2_getcommacode(l_bio);
 
-                        if (!l_cblk->numnewpasses) {
-                                /* nothing to do */
-                                ++l_cblk;
-                                continue;
-                        }
+            /* length indicator increment */
+            l_cblk->numlenbits += l_increment;
+            l_segno = 0;
 
-                        if (!l_cblk->numsegs) {
-                                l_seg = l_cblk->segs;
-                                ++l_cblk->numsegs;
-                                l_cblk->data_current_size = 0;
-                        }
-                        else {
-                                l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
-
-                                if (l_seg->numpasses == l_seg->maxpasses) {
-                                        ++l_seg;
-                                        ++l_cblk->numsegs;
-                                }
-                        }
-
-                        do {
-                                /* Check possible overflow then size */
-                                if (((*p_data_read + l_seg->newlen) < (*p_data_read)) || ((*p_data_read + l_seg->newlen) > p_max_length)) {
-                                        opj_event_msg(p_manager, EVT_ERROR, "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
-                                                l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
-                                        return OPJ_FALSE;
-                                }
-
-#ifdef USE_JPWL
-                        /* we need here a j2k handle to verify if making a check to
-                        the validity of cblocks parameters is selected from user (-W) */
-
-                                /* let's check that we are not exceeding */
-                                if ((l_cblk->len + l_seg->newlen) > 8192) {
-                                        opj_event_msg(p_manager, EVT_WARNING,
-                                                "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
-                                                l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
-                                        if (!JPWL_ASSUME) {
-                                                opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
-                                                return -999;
-                                        }
-                                        l_seg->newlen = 8192 - l_cblk->len;
-                                        opj_event_msg(p_manager, EVT_WARNING, "      - truncating segment to %d\n", l_seg->newlen);
-                                        break;
-                                };
-
-#endif /* USE_JPWL */
-                                        JAS_FPRINTF(stderr, "p_data_read (%d) newlen (%d) \n", *p_data_read, l_seg->newlen );
-                                *(p_data_read) += l_seg->newlen;
-
-                                l_seg->numpasses += l_seg->numnewpasses;
-                                l_cblk->numnewpasses -= l_seg->numnewpasses;
-                                if (l_cblk->numnewpasses > 0)
-                                {
-                                        ++l_seg;
-                                        ++l_cblk->numsegs;
-                                }
-                        } while (l_cblk->numnewpasses > 0);
-
-                        ++l_cblk;
+            if (!l_cblk->numsegs) {
+                if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 1)) {
+                    opj_bio_destroy(l_bio);
+                    return OPJ_FALSE;
                 }
-
-                ++l_band;
-        }
-
-        return OPJ_TRUE;
-}
-
-
-OPJ_BOOL opj_t2_init_seg(   opj_tcd_cblk_dec_t* cblk,
-                            OPJ_UINT32 index, 
-                            OPJ_UINT32 cblksty, 
-                            OPJ_UINT32 first)
-{
-        opj_tcd_seg_t* seg = 00;
-        OPJ_UINT32 l_nb_segs = index + 1;
-
-        if (l_nb_segs > cblk->m_current_max_segs) {
-                opj_tcd_seg_t* new_segs;
-                cblk->m_current_max_segs += OPJ_J2K_DEFAULT_NB_SEGS;
-
-                new_segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs, cblk->m_current_max_segs * sizeof(opj_tcd_seg_t));
-                if(! new_segs) {
-                        opj_free(cblk->segs);
-                        cblk->segs = NULL;
-                        cblk->m_current_max_segs = 0;
-                        /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to initialize segment %d\n", l_nb_segs); */
+            } else {
+                l_segno = l_cblk->numsegs - 1;
+                if (l_cblk->segs[l_segno].numpasses == l_cblk->segs[l_segno].maxpasses) {
+                    ++l_segno;
+                    if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
+                        opj_bio_destroy(l_bio);
                         return OPJ_FALSE;
+                    }
                 }
-                cblk->segs = new_segs;
-        }
+            }
+            n = (OPJ_INT32)l_cblk->numnewpasses;
 
-        seg = &cblk->segs[index];
-        memset(seg,0,sizeof(opj_tcd_seg_t));
-
-        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;
+            do {
+                OPJ_UINT32 bit_number;
+                l_cblk->segs[l_segno].numnewpasses = (OPJ_UINT32)opj_int_min((OPJ_INT32)(
+                        l_cblk->segs[l_segno].maxpasses - l_cblk->segs[l_segno].numpasses), n);
+                bit_number = l_cblk->numlenbits + opj_uint_floorlog2(
+                                 l_cblk->segs[l_segno].numnewpasses);
+                if (bit_number > 32) {
+                    opj_event_msg(p_manager, EVT_ERROR,
+                                  "Invalid bit number %d in opj_t2_read_packet_header()\n",
+                                  bit_number);
+                    opj_bio_destroy(l_bio);
+                    return OPJ_FALSE;
                 }
+                l_cblk->segs[l_segno].newlen = opj_bio_read(l_bio, bit_number);
+                JAS_FPRINTF(stderr, "included=%d numnewpasses=%d increment=%d len=%d \n",
+                            l_included, l_cblk->segs[l_segno].numnewpasses, l_increment,
+                            l_cblk->segs[l_segno].newlen);
+
+                n -= (OPJ_INT32)l_cblk->segs[l_segno].numnewpasses;
+                if (n > 0) {
+                    ++l_segno;
+
+                    if (! opj_t2_init_seg(l_cblk, l_segno, p_tcp->tccps[p_pi->compno].cblksty, 0)) {
+                        opj_bio_destroy(l_bio);
+                        return OPJ_FALSE;
+                    }
+                }
+            } while (n > 0);
+
+            ++l_cblk;
+        }
+    }
+
+    if (!opj_bio_inalign(l_bio)) {
+        opj_bio_destroy(l_bio);
+        return OPJ_FALSE;
+    }
+
+    l_header_data += opj_bio_numbytes(l_bio);
+    opj_bio_destroy(l_bio);
+
+    /* EPH markers */
+    if (p_tcp->csty & J2K_CP_CSTY_EPH) {
+        if ((*l_modified_length_ptr - (OPJ_UINT32)(l_header_data -
+                *l_header_data_start)) < 2U) {
+            opj_event_msg(p_manager, EVT_WARNING,
+                          "Not enough space for expected EPH marker\n");
+        } else if ((*l_header_data) != 0xff || (*(l_header_data + 1) != 0x92)) {
+            opj_event_msg(p_manager, EVT_WARNING, "Expected EPH marker\n");
         } else {
-                seg->maxpasses = 109;
+            l_header_data += 2;
+        }
+    }
+
+    l_header_length = (OPJ_UINT32)(l_header_data - *l_header_data_start);
+    JAS_FPRINTF(stderr, "hdrlen=%d \n", l_header_length);
+    JAS_FPRINTF(stderr, "packet body\n");
+    *l_modified_length_ptr -= l_header_length;
+    *l_header_data_start += l_header_length;
+
+    /* << INDEX */
+    /* End of packet header position. Currently only represents the distance to start of packet
+     Will be updated later by incrementing with packet start value */
+    if (p_pack_info) {
+        p_pack_info->end_ph_pos = (OPJ_INT32)(l_current_data - p_src_data);
+    }
+    /* INDEX >> */
+
+    *p_is_data_present = OPJ_TRUE;
+    *p_data_read = (OPJ_UINT32)(l_current_data - p_src_data);
+
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_t2_read_packet_data(opj_t2_t* p_t2,
+                                        opj_tcd_tile_t *p_tile,
+                                        opj_pi_iterator_t *p_pi,
+                                        OPJ_BYTE *p_src_data,
+                                        OPJ_UINT32 * p_data_read,
+                                        OPJ_UINT32 p_max_length,
+                                        opj_packet_info_t *pack_info,
+                                        opj_event_mgr_t* p_manager)
+{
+    OPJ_UINT32 bandno, cblkno;
+    OPJ_UINT32 l_nb_code_blocks;
+    OPJ_BYTE *l_current_data = p_src_data;
+    opj_tcd_band_t *l_band = 00;
+    opj_tcd_cblk_dec_t* l_cblk = 00;
+    opj_tcd_resolution_t* l_res =
+        &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
+
+    OPJ_ARG_NOT_USED(p_t2);
+    OPJ_ARG_NOT_USED(pack_info);
+
+    l_band = l_res->bands;
+    for (bandno = 0; bandno < l_res->numbands; ++bandno) {
+        opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
+
+        if ((l_band->x1 - l_band->x0 == 0) || (l_band->y1 - l_band->y0 == 0)) {
+            ++l_band;
+            continue;
         }
 
-        return OPJ_TRUE;
+        l_nb_code_blocks = l_prc->cw * l_prc->ch;
+        l_cblk = l_prc->cblks.dec;
+
+        for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+            opj_tcd_seg_t *l_seg = 00;
+
+            if (!l_cblk->numnewpasses) {
+                /* nothing to do */
+                ++l_cblk;
+                continue;
+            }
+
+            if (!l_cblk->numsegs) {
+                l_seg = l_cblk->segs;
+                ++l_cblk->numsegs;
+            } else {
+                l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
+
+                if (l_seg->numpasses == l_seg->maxpasses) {
+                    ++l_seg;
+                    ++l_cblk->numsegs;
+                }
+            }
+
+            do {
+                /* Check possible overflow (on l_current_data only, assumes input args already checked) then size */
+                if ((((OPJ_SIZE_T)l_current_data + (OPJ_SIZE_T)l_seg->newlen) <
+                        (OPJ_SIZE_T)l_current_data) ||
+                        (l_current_data + l_seg->newlen > p_src_data + p_max_length)) {
+                    opj_event_msg(p_manager, EVT_ERROR,
+                                  "read: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
+                                  l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno,
+                                  p_pi->compno);
+                    return OPJ_FALSE;
+                }
+
+#ifdef USE_JPWL
+                /* we need here a j2k handle to verify if making a check to
+                the validity of cblocks parameters is selected from user (-W) */
+
+                /* let's check that we are not exceeding */
+                if ((l_cblk->len + l_seg->newlen) > 8192) {
+                    opj_event_msg(p_manager, EVT_WARNING,
+                                  "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
+                                  l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
+                    if (!JPWL_ASSUME) {
+                        opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                        return OPJ_FALSE;
+                    }
+                    l_seg->newlen = 8192 - l_cblk->len;
+                    opj_event_msg(p_manager, EVT_WARNING, "      - truncating segment to %d\n",
+                                  l_seg->newlen);
+                    break;
+                };
+
+#endif /* USE_JPWL */
+
+                if (l_cblk->numchunks == l_cblk->numchunksalloc) {
+                    OPJ_UINT32 l_numchunksalloc = l_cblk->numchunksalloc * 2 + 1;
+                    opj_tcd_seg_data_chunk_t* l_chunks =
+                        (opj_tcd_seg_data_chunk_t*)opj_realloc(l_cblk->chunks,
+                                l_numchunksalloc * sizeof(opj_tcd_seg_data_chunk_t));
+                    if (l_chunks == NULL) {
+                        opj_event_msg(p_manager, EVT_ERROR,
+                                      "cannot allocate opj_tcd_seg_data_chunk_t* array");
+                        return OPJ_FALSE;
+                    }
+                    l_cblk->chunks = l_chunks;
+                    l_cblk->numchunksalloc = l_numchunksalloc;
+                }
+
+                l_cblk->chunks[l_cblk->numchunks].data = l_current_data;
+                l_cblk->chunks[l_cblk->numchunks].len = l_seg->newlen;
+                l_cblk->numchunks ++;
+
+                l_current_data += l_seg->newlen;
+                l_seg->len += l_seg->newlen;
+                l_seg->numpasses += l_seg->numnewpasses;
+                l_cblk->numnewpasses -= l_seg->numnewpasses;
+
+                l_seg->real_num_passes = l_seg->numpasses;
+
+                if (l_cblk->numnewpasses > 0) {
+                    ++l_seg;
+                    ++l_cblk->numsegs;
+                }
+            } while (l_cblk->numnewpasses > 0);
+
+            l_cblk->real_num_segs = l_cblk->numsegs;
+            ++l_cblk;
+        } /* next code_block */
+
+        ++l_band;
+    }
+
+    *(p_data_read) = (OPJ_UINT32)(l_current_data - p_src_data);
+
+
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_t2_skip_packet_data(opj_t2_t* p_t2,
+                                        opj_tcd_tile_t *p_tile,
+                                        opj_pi_iterator_t *p_pi,
+                                        OPJ_UINT32 * p_data_read,
+                                        OPJ_UINT32 p_max_length,
+                                        opj_packet_info_t *pack_info,
+                                        opj_event_mgr_t *p_manager)
+{
+    OPJ_UINT32 bandno, cblkno;
+    OPJ_UINT32 l_nb_code_blocks;
+    opj_tcd_band_t *l_band = 00;
+    opj_tcd_cblk_dec_t* l_cblk = 00;
+    opj_tcd_resolution_t* l_res =
+        &p_tile->comps[p_pi->compno].resolutions[p_pi->resno];
+
+    OPJ_ARG_NOT_USED(p_t2);
+    OPJ_ARG_NOT_USED(pack_info);
+
+    *p_data_read = 0;
+    l_band = l_res->bands;
+
+    for (bandno = 0; bandno < l_res->numbands; ++bandno) {
+        opj_tcd_precinct_t *l_prc = &l_band->precincts[p_pi->precno];
+
+        if ((l_band->x1 - l_band->x0 == 0) || (l_band->y1 - l_band->y0 == 0)) {
+            ++l_band;
+            continue;
+        }
+
+        l_nb_code_blocks = l_prc->cw * l_prc->ch;
+        l_cblk = l_prc->cblks.dec;
+
+        for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+            opj_tcd_seg_t *l_seg = 00;
+
+            if (!l_cblk->numnewpasses) {
+                /* nothing to do */
+                ++l_cblk;
+                continue;
+            }
+
+            if (!l_cblk->numsegs) {
+                l_seg = l_cblk->segs;
+                ++l_cblk->numsegs;
+            } else {
+                l_seg = &l_cblk->segs[l_cblk->numsegs - 1];
+
+                if (l_seg->numpasses == l_seg->maxpasses) {
+                    ++l_seg;
+                    ++l_cblk->numsegs;
+                }
+            }
+
+            do {
+                /* Check possible overflow then size */
+                if (((*p_data_read + l_seg->newlen) < (*p_data_read)) ||
+                        ((*p_data_read + l_seg->newlen) > p_max_length)) {
+                    opj_event_msg(p_manager, EVT_ERROR,
+                                  "skip: segment too long (%d) with max (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
+                                  l_seg->newlen, p_max_length, cblkno, p_pi->precno, bandno, p_pi->resno,
+                                  p_pi->compno);
+                    return OPJ_FALSE;
+                }
+
+#ifdef USE_JPWL
+                /* we need here a j2k handle to verify if making a check to
+                the validity of cblocks parameters is selected from user (-W) */
+
+                /* let's check that we are not exceeding */
+                if ((l_cblk->len + l_seg->newlen) > 8192) {
+                    opj_event_msg(p_manager, EVT_WARNING,
+                                  "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
+                                  l_seg->newlen, cblkno, p_pi->precno, bandno, p_pi->resno, p_pi->compno);
+                    if (!JPWL_ASSUME) {
+                        opj_event_msg(p_manager, EVT_ERROR, "JPWL: giving up\n");
+                        return -999;
+                    }
+                    l_seg->newlen = 8192 - l_cblk->len;
+                    opj_event_msg(p_manager, EVT_WARNING, "      - truncating segment to %d\n",
+                                  l_seg->newlen);
+                    break;
+                };
+
+#endif /* USE_JPWL */
+                JAS_FPRINTF(stderr, "p_data_read (%d) newlen (%d) \n", *p_data_read,
+                            l_seg->newlen);
+                *(p_data_read) += l_seg->newlen;
+
+                l_seg->numpasses += l_seg->numnewpasses;
+                l_cblk->numnewpasses -= l_seg->numnewpasses;
+                if (l_cblk->numnewpasses > 0) {
+                    ++l_seg;
+                    ++l_cblk->numsegs;
+                }
+            } while (l_cblk->numnewpasses > 0);
+
+            ++l_cblk;
+        }
+
+        ++l_band;
+    }
+
+    return OPJ_TRUE;
+}
+
+
+static OPJ_BOOL opj_t2_init_seg(opj_tcd_cblk_dec_t* cblk,
+                                OPJ_UINT32 index,
+                                OPJ_UINT32 cblksty,
+                                OPJ_UINT32 first)
+{
+    opj_tcd_seg_t* seg = 00;
+    OPJ_UINT32 l_nb_segs = index + 1;
+
+    if (l_nb_segs > cblk->m_current_max_segs) {
+        opj_tcd_seg_t* new_segs;
+        OPJ_UINT32 l_m_current_max_segs = cblk->m_current_max_segs +
+                                          OPJ_J2K_DEFAULT_NB_SEGS;
+
+        new_segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs,
+                                                l_m_current_max_segs * sizeof(opj_tcd_seg_t));
+        if (! new_segs) {
+            /* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to initialize segment %d\n", l_nb_segs); */
+            return OPJ_FALSE;
+        }
+        cblk->segs = new_segs;
+        memset(new_segs + cblk->m_current_max_segs,
+               0, OPJ_J2K_DEFAULT_NB_SEGS * sizeof(opj_tcd_seg_t));
+        cblk->m_current_max_segs = l_m_current_max_segs;
+    }
+
+    seg = &cblk->segs[index];
+    opj_tcd_reinit_segment(seg);
+
+    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 {
+        /* See paragraph "B.10.6 Number of coding passes" of the standard.
+         * Probably that 109 must be interpreted a (Mb-1)*3 + 1 with Mb=37,
+         * Mb being the maximum number of bit-planes available for the
+         * representation of coefficients in the sub-band */
+        seg->maxpasses = 109;
+    }
+
+    return OPJ_TRUE;
 }
diff --git a/third_party/libopenjpeg20/t2.h b/third_party/libopenjpeg20/t2.h
index 3b652ee..4013b9d 100644
--- a/third_party/libopenjpeg20/t2.h
+++ b/third_party/libopenjpeg20/t2.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,10 +8,10 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -36,8 +36,8 @@
  * 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
+#ifndef OPJ_T2_H
+#define OPJ_T2_H
 /**
 @file t2.h
 @brief Implementation of a tier-2 coding (packetization of code-block data) (T2)
@@ -52,10 +52,10 @@
 */
 typedef struct opj_t2 {
 
-	/** 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;
+    /** 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 */
@@ -77,18 +77,18 @@
 @param pino             FIXME DOC
 @param t2_mode          If == 0 In Threshold calculation ,If == 1 Final pass
 */
-OPJ_BOOL opj_t2_encode_packets(	opj_t2_t* t2,
-								OPJ_UINT32 tileno,
-								opj_tcd_tile_t *tile,
-								OPJ_UINT32 maxlayers,
-								OPJ_BYTE *dest,
-								OPJ_UINT32 * p_data_written,
-								OPJ_UINT32 len,
-								opj_codestream_info_t *cstr_info,
-								OPJ_UINT32 tpnum,
-								OPJ_INT32 tppos,
-								OPJ_UINT32 pino,
-								J2K_T2_MODE t2_mode);
+OPJ_BOOL opj_t2_encode_packets(opj_t2_t* t2,
+                               OPJ_UINT32 tileno,
+                               opj_tcd_tile_t *tile,
+                               OPJ_UINT32 maxlayers,
+                               OPJ_BYTE *dest,
+                               OPJ_UINT32 * p_data_written,
+                               OPJ_UINT32 len,
+                               opj_codestream_info_t *cstr_info,
+                               OPJ_UINT32 tpnum,
+                               OPJ_INT32 tppos,
+                               OPJ_UINT32 pino,
+                               J2K_T2_MODE t2_mode);
 
 /**
 Decode the packets of a tile from a source buffer
@@ -99,24 +99,25 @@
 @param p_data_read the source buffer
 @param len length of the source buffer
 @param cstr_info   FIXME DOC
+@param p_manager the user event manager
 
 @return FIXME DOC
  */
-OPJ_BOOL opj_t2_decode_packets(	opj_t2_t *t2,
-                                OPJ_UINT32 tileno,
-                                opj_tcd_tile_t *tile,
-                                OPJ_BYTE *src,
-                                OPJ_UINT32 * p_data_read,
-                                OPJ_UINT32 len,
-                                opj_codestream_index_t *cstr_info,
-                                opj_event_mgr_t *p_manager);
+OPJ_BOOL opj_t2_decode_packets(opj_t2_t *t2,
+                               OPJ_UINT32 tileno,
+                               opj_tcd_tile_t *tile,
+                               OPJ_BYTE *src,
+                               OPJ_UINT32 * p_data_read,
+                               OPJ_UINT32 len,
+                               opj_codestream_index_t *cstr_info,
+                               opj_event_mgr_t *p_manager);
 
 /**
  * Creates a Tier 2 handle
  *
- * @param	p_image		Source or destination image
- * @param	p_cp		Image coding parameters.
- * @return		a new T2 handle if successful, NULL otherwise.
+ * @param   p_image     Source or destination image
+ * @param   p_cp        Image coding parameters.
+ * @return      a new T2 handle if successful, NULL otherwise.
 */
 opj_t2_t* opj_t2_create(opj_image_t *p_image, opj_cp_t *p_cp);
 
@@ -131,4 +132,4 @@
 
 /*@}*/
 
-#endif /* __T2_H */
+#endif /* OPJ_T2_H */
diff --git a/third_party/libopenjpeg20/tcd.c b/third_party/libopenjpeg20/tcd.c
index 06eee4e..35d15e3 100644
--- a/third_party/libopenjpeg20/tcd.c
+++ b/third_party/libopenjpeg20/tcd.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,11 +8,11 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2006-2007, Parvatha Elangovan
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -39,100 +39,108 @@
  */
 
 #include "opj_includes.h"
+#include "opj_common.h"
 
 /* ----------------------------------------------------------------------- */
 
 /* TODO MSD: */
-#ifdef TODO_MSD 
-void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) {
-        int tileno, compno, resno, bandno, precno;/*, cblkno;*/
+#ifdef TODO_MSD
+void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img)
+{
+    int tileno, compno, resno, bandno, precno;/*, cblkno;*/
 
-        fprintf(fd, "image {\n");
-        fprintf(fd, "  tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n", 
-                img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0, tcd->image->y1);
+    fprintf(fd, "image {\n");
+    fprintf(fd, "  tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n",
+            img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0,
+            tcd->image->y1);
 
-        for (tileno = 0; tileno < img->th * img->tw; tileno++) {
-                opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno];
-                fprintf(fd, "  tile {\n");
-                fprintf(fd, "    x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n",
-                        tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps);
-                for (compno = 0; compno < tile->numcomps; compno++) {
-                        opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-                        fprintf(fd, "    tilec {\n");
+    for (tileno = 0; tileno < img->th * img->tw; tileno++) {
+        opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno];
+        fprintf(fd, "  tile {\n");
+        fprintf(fd, "    x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n",
+                tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps);
+        for (compno = 0; compno < tile->numcomps; compno++) {
+            opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
+            fprintf(fd, "    tilec {\n");
+            fprintf(fd,
+                    "      x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n",
+                    tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions);
+            for (resno = 0; resno < tilec->numresolutions; resno++) {
+                opj_tcd_resolution_t *res = &tilec->resolutions[resno];
+                fprintf(fd, "\n   res {\n");
+                fprintf(fd,
+                        "          x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n",
+                        res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands);
+                for (bandno = 0; bandno < res->numbands; bandno++) {
+                    opj_tcd_band_t *band = &res->bands[bandno];
+                    fprintf(fd, "        band {\n");
+                    fprintf(fd,
+                            "          x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n",
+                            band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps);
+                    for (precno = 0; precno < res->pw * res->ph; precno++) {
+                        opj_tcd_precinct_t *prec = &band->precincts[precno];
+                        fprintf(fd, "          prec {\n");
                         fprintf(fd,
-                                "      x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n",
-                                tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions);
-                        for (resno = 0; resno < tilec->numresolutions; resno++) {
-                                opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-                                fprintf(fd, "\n   res {\n");
+                                "            x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n",
+                                prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch);
+                        /*
+                        for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) {
+                                opj_tcd_cblk_t *cblk = &prec->cblks[cblkno];
+                                fprintf(fd, "            cblk {\n");
                                 fprintf(fd,
-                                        "          x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n",
-                                        res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands);
-                                for (bandno = 0; bandno < res->numbands; bandno++) {
-                                        opj_tcd_band_t *band = &res->bands[bandno];
-                                        fprintf(fd, "        band {\n");
-                                        fprintf(fd,
-                                                "          x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n",
-                                                band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps);
-                                        for (precno = 0; precno < res->pw * res->ph; precno++) {
-                                                opj_tcd_precinct_t *prec = &band->precincts[precno];
-                                                fprintf(fd, "          prec {\n");
-                                                fprintf(fd,
-                                                        "            x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n",
-                                                        prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch);
-                                                /*
-                                                for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) {
-                                                        opj_tcd_cblk_t *cblk = &prec->cblks[cblkno];
-                                                        fprintf(fd, "            cblk {\n");
-                                                        fprintf(fd,
-                                                                "              x0=%d, y0=%d, x1=%d, y1=%d\n",
-                                                                cblk->x0, cblk->y0, cblk->x1, cblk->y1);
-                                                        fprintf(fd, "            }\n");
-                                                }
-                                                */
-                                                fprintf(fd, "          }\n");
-                                        }
-                                        fprintf(fd, "        }\n");
-                                }
-                                fprintf(fd, "      }\n");
+                                        "              x0=%d, y0=%d, x1=%d, y1=%d\n",
+                                        cblk->x0, cblk->y0, cblk->x1, cblk->y1);
+                                fprintf(fd, "            }\n");
                         }
-                        fprintf(fd, "    }\n");
+                        */
+                        fprintf(fd, "          }\n");
+                    }
+                    fprintf(fd, "        }\n");
                 }
-                fprintf(fd, "  }\n");
+                fprintf(fd, "      }\n");
+            }
+            fprintf(fd, "    }\n");
         }
-        fprintf(fd, "}\n");
+        fprintf(fd, "  }\n");
+    }
+    fprintf(fd, "}\n");
 }
 #endif
 
 /**
  * Initializes tile coding/decoding
  */
-static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no, OPJ_BOOL isEncoder, OPJ_FLOAT32 fraction, OPJ_SIZE_T sizeof_block, opj_event_mgr_t* manager);
+static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
+        OPJ_BOOL isEncoder, OPJ_FLOAT32 fraction, OPJ_SIZE_T sizeof_block,
+        opj_event_mgr_t* manager);
 
 /**
 * Allocates memory for a decoding code block.
 */
-static OPJ_BOOL opj_tcd_code_block_dec_allocate (opj_tcd_cblk_dec_t * p_code_block);
+static OPJ_BOOL opj_tcd_code_block_dec_allocate(opj_tcd_cblk_dec_t *
+        p_code_block);
 
 /**
  * Deallocates the decoding data of the given precinct.
  */
-static void opj_tcd_code_block_dec_deallocate (opj_tcd_precinct_t * p_precinct);
+static void opj_tcd_code_block_dec_deallocate(opj_tcd_precinct_t * p_precinct);
 
 /**
  * Allocates memory for an encoding code block (but not data).
  */
-static OPJ_BOOL opj_tcd_code_block_enc_allocate (opj_tcd_cblk_enc_t * p_code_block);
+static OPJ_BOOL opj_tcd_code_block_enc_allocate(opj_tcd_cblk_enc_t *
+        p_code_block);
 
 /**
  * Allocates data for an encoding code block
  */
-static OPJ_BOOL opj_tcd_code_block_enc_allocate_data (opj_tcd_cblk_enc_t * p_code_block);
+static OPJ_BOOL opj_tcd_code_block_enc_allocate_data(opj_tcd_cblk_enc_t *
+        p_code_block);
 
 /**
  * Deallocates the encoding data of the given precinct.
  */
-static void opj_tcd_code_block_enc_deallocate (opj_tcd_precinct_t * p_precinct);
+static void opj_tcd_code_block_enc_deallocate(opj_tcd_precinct_t * p_precinct);
 
 
 /**
@@ -142,40 +150,42 @@
 static void opj_tcd_free_tile(opj_tcd_t *tcd);
 
 
-static OPJ_BOOL opj_tcd_t2_decode ( opj_tcd_t *p_tcd,
-                                    OPJ_BYTE * p_src_data,
-                                    OPJ_UINT32 * p_data_read,
-                                    OPJ_UINT32 p_max_src_size,
-                                    opj_codestream_index_t *p_cstr_index,
-                                    opj_event_mgr_t *p_manager);
+static OPJ_BOOL opj_tcd_t2_decode(opj_tcd_t *p_tcd,
+                                  OPJ_BYTE * p_src_data,
+                                  OPJ_UINT32 * p_data_read,
+                                  OPJ_UINT32 p_max_src_size,
+                                  opj_codestream_index_t *p_cstr_index,
+                                  opj_event_mgr_t *p_manager);
 
-static OPJ_BOOL opj_tcd_t1_decode (opj_tcd_t *p_tcd);
+static OPJ_BOOL opj_tcd_t1_decode(opj_tcd_t *p_tcd,
+                                  opj_event_mgr_t *p_manager);
 
-static OPJ_BOOL opj_tcd_dwt_decode (opj_tcd_t *p_tcd);
+static OPJ_BOOL opj_tcd_dwt_decode(opj_tcd_t *p_tcd);
 
-static OPJ_BOOL opj_tcd_mct_decode (opj_tcd_t *p_tcd, opj_event_mgr_t *p_manager);
+static OPJ_BOOL opj_tcd_mct_decode(opj_tcd_t *p_tcd,
+                                   opj_event_mgr_t *p_manager);
 
-static OPJ_BOOL opj_tcd_dc_level_shift_decode (opj_tcd_t *p_tcd);
+static OPJ_BOOL opj_tcd_dc_level_shift_decode(opj_tcd_t *p_tcd);
 
 
-static OPJ_BOOL opj_tcd_dc_level_shift_encode ( opj_tcd_t *p_tcd );
+static OPJ_BOOL opj_tcd_dc_level_shift_encode(opj_tcd_t *p_tcd);
 
-static OPJ_BOOL opj_tcd_mct_encode ( opj_tcd_t *p_tcd );
+static OPJ_BOOL opj_tcd_mct_encode(opj_tcd_t *p_tcd);
 
-static OPJ_BOOL opj_tcd_dwt_encode ( opj_tcd_t *p_tcd );
+static OPJ_BOOL opj_tcd_dwt_encode(opj_tcd_t *p_tcd);
 
-static OPJ_BOOL opj_tcd_t1_encode ( opj_tcd_t *p_tcd );
+static OPJ_BOOL opj_tcd_t1_encode(opj_tcd_t *p_tcd);
 
-static OPJ_BOOL opj_tcd_t2_encode (     opj_tcd_t *p_tcd,
-                                                                    OPJ_BYTE * p_dest_data,
-                                                                    OPJ_UINT32 * p_data_written,
-                                                                    OPJ_UINT32 p_max_dest_size,
-                                                                    opj_codestream_info_t *p_cstr_info );
+static OPJ_BOOL opj_tcd_t2_encode(opj_tcd_t *p_tcd,
+                                  OPJ_BYTE * p_dest_data,
+                                  OPJ_UINT32 * p_data_written,
+                                  OPJ_UINT32 p_max_dest_size,
+                                  opj_codestream_info_t *p_cstr_info);
 
-static OPJ_BOOL opj_tcd_rate_allocate_encode(   opj_tcd_t *p_tcd,
-                                                                                        OPJ_BYTE * p_dest_data,
-                                                                                        OPJ_UINT32 p_max_dest_size,
-                                                                                        opj_codestream_info_t *p_cstr_info );
+static OPJ_BOOL opj_tcd_rate_allocate_encode(opj_tcd_t *p_tcd,
+        OPJ_BYTE * p_dest_data,
+        OPJ_UINT32 p_max_dest_size,
+        opj_codestream_info_t *p_cstr_info);
 
 /* ----------------------------------------------------------------------- */
 
@@ -184,1307 +194,1400 @@
 */
 opj_tcd_t* opj_tcd_create(OPJ_BOOL p_is_decoder)
 {
-        opj_tcd_t *l_tcd = 00;
+    opj_tcd_t *l_tcd = 00;
 
-        /* create the tcd structure */
-        l_tcd = (opj_tcd_t*) opj_calloc(1,sizeof(opj_tcd_t));
-        if (!l_tcd) {
-                return 00;
-        }
+    /* create the tcd structure */
+    l_tcd = (opj_tcd_t*) opj_calloc(1, sizeof(opj_tcd_t));
+    if (!l_tcd) {
+        return 00;
+    }
 
-        l_tcd->m_is_decoder = p_is_decoder ? 1 : 0;
+    l_tcd->m_is_decoder = p_is_decoder ? 1 : 0;
 
-        l_tcd->tcd_image = (opj_tcd_image_t*)opj_calloc(1,sizeof(opj_tcd_image_t));
-        if (!l_tcd->tcd_image) {
-                opj_free(l_tcd);
-                return 00;
-        }
+    l_tcd->tcd_image = (opj_tcd_image_t*)opj_calloc(1, sizeof(opj_tcd_image_t));
+    if (!l_tcd->tcd_image) {
+        opj_free(l_tcd);
+        return 00;
+    }
 
-        return l_tcd;
+    return l_tcd;
 }
 
 
 /* ----------------------------------------------------------------------- */
 
-void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd) {
-        OPJ_UINT32 layno;
-
-        for (layno = 0; layno < tcd->tcp->numlayers; layno++) {
-                opj_tcd_makelayer_fixed(tcd, layno, 1);
-        }
-}
-
-
-void opj_tcd_makelayer( opj_tcd_t *tcd,
-                                                OPJ_UINT32 layno,
-                                                OPJ_FLOAT64 thresh,
-                                                OPJ_UINT32 final)
+void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd)
 {
-        OPJ_UINT32 compno, resno, bandno, precno, cblkno;
-        OPJ_UINT32 passno;
+    OPJ_UINT32 layno;
 
-        opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;
-
-        tcd_tile->distolayer[layno] = 0;        /* fixed_quality */
-
-        for (compno = 0; compno < tcd_tile->numcomps; compno++) {
-                opj_tcd_tilecomp_t *tilec = &tcd_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_enc_t *cblk = &prc->cblks.enc[cblkno];
-                                                opj_tcd_layer_t *layer = &cblk->layers[layno];
-                                                OPJ_UINT32 n;
-
-                                                if (layno == 0) {
-                                                        cblk->numpassesinlayers = 0;
-                                                }
-
-                                                n = cblk->numpassesinlayers;
-
-                                                for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) {
-                                                        OPJ_UINT32 dr;
-                                                        OPJ_FLOAT64 dd;
-                                                        opj_tcd_pass_t *pass = &cblk->passes[passno];
-
-                                                        if (n == 0) {
-                                                                dr = pass->rate;
-                                                                dd = pass->distortiondec;
-                                                        } else {
-                                                                dr = pass->rate - cblk->passes[n - 1].rate;
-                                                                dd = pass->distortiondec - cblk->passes[n - 1].distortiondec;
-                                                        }
-
-                                                        if (!dr) {
-                                                                if (dd != 0)
-                                                                        n = passno + 1;
-                                                                continue;
-                                                        }
-                                                        if (thresh - (dd / dr) < DBL_EPSILON) /* do not rely on float equality, check with DBL_EPSILON margin */
-                                                                n = passno + 1;
-                                                }
-
-                                                layer->numpasses = n - cblk->numpassesinlayers;
-
-                                                if (!layer->numpasses) {
-                                                        layer->disto = 0;
-                                                        continue;
-                                                }
-
-                                                if (cblk->numpassesinlayers == 0) {
-                                                        layer->len = cblk->passes[n - 1].rate;
-                                                        layer->data = cblk->data;
-                                                        layer->disto = cblk->passes[n - 1].distortiondec;
-                                                } else {
-                                                        layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;
-                                                        layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
-                                                        layer->disto = cblk->passes[n - 1].distortiondec - cblk->passes[cblk->numpassesinlayers - 1].distortiondec;
-                                                }
-
-                                                tcd_tile->distolayer[layno] += layer->disto;    /* fixed_quality */
-
-                                                if (final)
-                                                        cblk->numpassesinlayers = n;
-                                        }
-                                }
-                        }
-                }
-        }
+    for (layno = 0; layno < tcd->tcp->numlayers; layno++) {
+        opj_tcd_makelayer_fixed(tcd, layno, 1);
+    }
 }
 
-void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final) {
-        OPJ_UINT32 compno, resno, bandno, precno, cblkno;
-        OPJ_INT32 value;                        /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */
-        OPJ_INT32 matrice[10][10][3];
-        OPJ_UINT32 i, j, k;
 
-        opj_cp_t *cp = tcd->cp;
-        opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;
-        opj_tcp_t *tcd_tcp = tcd->tcp;
-
-        for (compno = 0; compno < tcd_tile->numcomps; compno++) {
-                opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
-
-                for (i = 0; i < tcd_tcp->numlayers; i++) {
-                        for (j = 0; j < tilec->numresolutions; j++) {
-                                for (k = 0; k < 3; k++) {
-                                        matrice[i][j][k] =
-                                                (OPJ_INT32) ((OPJ_FLOAT32)cp->m_specific_param.m_enc.m_matrice[i * tilec->numresolutions * 3 + j * 3 + k]
-                                                * (OPJ_FLOAT32) (tcd->image->comps[compno].prec / 16.0));
-                                }
-                        }
-                }
-
-                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_enc_t *cblk = &prc->cblks.enc[cblkno];
-                                                opj_tcd_layer_t *layer = &cblk->layers[layno];
-                                                OPJ_UINT32 n;
-                                                OPJ_INT32 imsb = (OPJ_INT32)(tcd->image->comps[compno].prec - cblk->numbps); /* number of bit-plan equal to zero */
-
-                                                /* Correction of the matrix of coefficient to include the IMSB information */
-                                                if (layno == 0) {
-                                                        value = matrice[layno][resno][bandno];
-                                                        if (imsb >= value) {
-                                                                value = 0;
-                                                        } else {
-                                                                value -= imsb;
-                                                        }
-                                                } else {
-                                                        value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno];
-                                                        if (imsb >= matrice[layno - 1][resno][bandno]) {
-                                                                value -= (imsb - matrice[layno - 1][resno][bandno]);
-                                                                if (value < 0) {
-                                                                        value = 0;
-                                                                }
-                                                        }
-                                                }
-
-                                                if (layno == 0) {
-                                                        cblk->numpassesinlayers = 0;
-                                                }
-
-                                                n = cblk->numpassesinlayers;
-                                                if (cblk->numpassesinlayers == 0) {
-                                                        if (value != 0) {
-                                                                n = 3 * (OPJ_UINT32)value - 2 + cblk->numpassesinlayers;
-                                                        } else {
-                                                                n = cblk->numpassesinlayers;
-                                                        }
-                                                } else {
-                                                        n = 3 * (OPJ_UINT32)value + cblk->numpassesinlayers;
-                                                }
-
-                                                layer->numpasses = n - cblk->numpassesinlayers;
-
-                                                if (!layer->numpasses)
-                                                        continue;
-
-                                                if (cblk->numpassesinlayers == 0) {
-                                                        layer->len = cblk->passes[n - 1].rate;
-                                                        layer->data = cblk->data;
-                                                } else {
-                                                        layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers - 1].rate;
-                                                        layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
-                                                }
-
-                                                if (final)
-                                                        cblk->numpassesinlayers = n;
-                                        }
-                                }
-                        }
-                }
-        }
-}
-
-OPJ_BOOL opj_tcd_rateallocate(  opj_tcd_t *tcd,
-                                                                OPJ_BYTE *dest,
-                                                                OPJ_UINT32 * p_data_written,
-                                                                OPJ_UINT32 len,
-                                                                opj_codestream_info_t *cstr_info)
+void opj_tcd_makelayer(opj_tcd_t *tcd,
+                       OPJ_UINT32 layno,
+                       OPJ_FLOAT64 thresh,
+                       OPJ_UINT32 final)
 {
-        OPJ_UINT32 compno, resno, bandno, precno, cblkno, layno;
-        OPJ_UINT32 passno;
-        OPJ_FLOAT64 min, max;
-        OPJ_FLOAT64 cumdisto[100];      /* fixed_quality */
-        const OPJ_FLOAT64 K = 1;                /* 1.1; fixed_quality */
-        OPJ_FLOAT64 maxSE = 0;
+    OPJ_UINT32 compno, resno, bandno, precno, cblkno;
+    OPJ_UINT32 passno;
 
-        opj_cp_t *cp = tcd->cp;
-        opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;
-        opj_tcp_t *tcd_tcp = tcd->tcp;
+    opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;
 
-        min = DBL_MAX;
-        max = 0;
+    tcd_tile->distolayer[layno] = 0;        /* fixed_quality */
 
-        tcd_tile->numpix = 0;           /* fixed_quality */
+    for (compno = 0; compno < tcd_tile->numcomps; compno++) {
+        opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
 
-        for (compno = 0; compno < tcd_tile->numcomps; compno++) {
-                opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
-                tilec->numpix = 0;
+        for (resno = 0; resno < tilec->numresolutions; resno++) {
+            opj_tcd_resolution_t *res = &tilec->resolutions[resno];
 
-                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 (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_enc_t *cblk = &prc->cblks.enc[cblkno];
-
-                                                for (passno = 0; passno < cblk->totalpasses; passno++) {
-                                                        opj_tcd_pass_t *pass = &cblk->passes[passno];
-                                                        OPJ_INT32 dr;
-                                                        OPJ_FLOAT64 dd, rdslope;
-
-                                                        if (passno == 0) {
-                                                                dr = (OPJ_INT32)pass->rate;
-                                                                dd = pass->distortiondec;
-                                                        } else {
-                                                                dr = (OPJ_INT32)(pass->rate - cblk->passes[passno - 1].rate);
-                                                                dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec;
-                                                        }
-
-                                                        if (dr == 0) {
-                                                                continue;
-                                                        }
-
-                                                        rdslope = dd / dr;
-                                                        if (rdslope < min) {
-                                                                min = rdslope;
-                                                        }
-
-                                                        if (rdslope > max) {
-                                                                max = rdslope;
-                                                        }
-                                                } /* passno */
-
-                                                /* fixed_quality */
-                                                tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
-                                                tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
-                                        } /* cbklno */
-                                } /* precno */
-                        } /* bandno */
-                } /* resno */
-
-                maxSE += (((OPJ_FLOAT64)(1 << tcd->image->comps[compno].prec) - 1.0)
-                        * ((OPJ_FLOAT64)(1 << tcd->image->comps[compno].prec) -1.0))
-                        * ((OPJ_FLOAT64)(tilec->numpix));
-        } /* compno */
-
-        /* index file */
-        if(cstr_info) {
-                opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno];
-                tile_info->numpix = tcd_tile->numpix;
-                tile_info->distotile = tcd_tile->distotile;
-                tile_info->thresh = (OPJ_FLOAT64 *) opj_malloc(tcd_tcp->numlayers * sizeof(OPJ_FLOAT64));
-                if (!tile_info->thresh) {
-                        /* FIXME event manager error callback */
-                        return OPJ_FALSE;
+                /* Skip empty bands */
+                if (opj_tcd_is_band_empty(band)) {
+                    continue;
                 }
+
+                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_enc_t *cblk = &prc->cblks.enc[cblkno];
+                        opj_tcd_layer_t *layer = &cblk->layers[layno];
+                        OPJ_UINT32 n;
+
+                        if (layno == 0) {
+                            cblk->numpassesinlayers = 0;
+                        }
+
+                        n = cblk->numpassesinlayers;
+
+                        for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) {
+                            OPJ_UINT32 dr;
+                            OPJ_FLOAT64 dd;
+                            opj_tcd_pass_t *pass = &cblk->passes[passno];
+
+                            if (n == 0) {
+                                dr = pass->rate;
+                                dd = pass->distortiondec;
+                            } else {
+                                dr = pass->rate - cblk->passes[n - 1].rate;
+                                dd = pass->distortiondec - cblk->passes[n - 1].distortiondec;
+                            }
+
+                            if (!dr) {
+                                if (dd != 0) {
+                                    n = passno + 1;
+                                }
+                                continue;
+                            }
+                            if (thresh - (dd / dr) <
+                                    DBL_EPSILON) { /* do not rely on float equality, check with DBL_EPSILON margin */
+                                n = passno + 1;
+                            }
+                        }
+
+                        layer->numpasses = n - cblk->numpassesinlayers;
+
+                        if (!layer->numpasses) {
+                            layer->disto = 0;
+                            continue;
+                        }
+
+                        if (cblk->numpassesinlayers == 0) {
+                            layer->len = cblk->passes[n - 1].rate;
+                            layer->data = cblk->data;
+                            layer->disto = cblk->passes[n - 1].distortiondec;
+                        } else {
+                            layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers -
+                                         1].rate;
+                            layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
+                            layer->disto = cblk->passes[n - 1].distortiondec -
+                                           cblk->passes[cblk->numpassesinlayers - 1].distortiondec;
+                        }
+
+                        tcd_tile->distolayer[layno] += layer->disto;    /* fixed_quality */
+
+                        if (final) {
+                            cblk->numpassesinlayers = n;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno,
+                             OPJ_UINT32 final)
+{
+    OPJ_UINT32 compno, resno, bandno, precno, cblkno;
+    OPJ_INT32 value;                        /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */
+    OPJ_INT32 matrice[10][10][3];
+    OPJ_UINT32 i, j, k;
+
+    opj_cp_t *cp = tcd->cp;
+    opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;
+    opj_tcp_t *tcd_tcp = tcd->tcp;
+
+    for (compno = 0; compno < tcd_tile->numcomps; compno++) {
+        opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
+
+        for (i = 0; i < tcd_tcp->numlayers; i++) {
+            for (j = 0; j < tilec->numresolutions; j++) {
+                for (k = 0; k < 3; k++) {
+                    matrice[i][j][k] =
+                        (OPJ_INT32)((OPJ_FLOAT32)cp->m_specific_param.m_enc.m_matrice[i *
+                                      tilec->numresolutions * 3 + j * 3 + k]
+                                    * (OPJ_FLOAT32)(tcd->image->comps[compno].prec / 16.0));
+                }
+            }
         }
 
-        for (layno = 0; layno < tcd_tcp->numlayers; layno++) {
-                OPJ_FLOAT64 lo = min;
-                OPJ_FLOAT64 hi = max;
-                OPJ_BOOL success = OPJ_FALSE;
-                OPJ_UINT32 maxlen = tcd_tcp->rates[layno] ? opj_uint_min(((OPJ_UINT32) ceil(tcd_tcp->rates[layno])), len) : len;
-                OPJ_FLOAT64 goodthresh = 0;
-                OPJ_FLOAT64 stable_thresh = 0;
-                OPJ_UINT32 i;
-                OPJ_FLOAT64 distotarget;                /* fixed_quality */
+        for (resno = 0; resno < tilec->numresolutions; resno++) {
+            opj_tcd_resolution_t *res = &tilec->resolutions[resno];
 
-                /* fixed_quality */
-                distotarget = tcd_tile->distotile - ((K * maxSE) / pow((OPJ_FLOAT32)10, tcd_tcp->distoratio[layno] / 10));
+            for (bandno = 0; bandno < res->numbands; bandno++) {
+                opj_tcd_band_t *band = &res->bands[bandno];
 
-                /* Don't try to find an optimal threshold but rather take everything not included yet, if
-                  -r xx,yy,zz,0   (disto_alloc == 1 and rates == 0)
-                  -q xx,yy,zz,0   (fixed_quality == 1 and distoratio == 0)
-                  ==> possible to have some lossy layers and the last layer for sure lossless */
-                if ( ((cp->m_specific_param.m_enc.m_disto_alloc==1) && (tcd_tcp->rates[layno]>0)) || ((cp->m_specific_param.m_enc.m_fixed_quality==1) && (tcd_tcp->distoratio[layno]>0))) {
-                        opj_t2_t*t2 = opj_t2_create(tcd->image, cp);
-                        OPJ_FLOAT64 thresh = 0;
+                /* Skip empty bands */
+                if (opj_tcd_is_band_empty(band)) {
+                    continue;
+                }
 
-                        if (t2 == 00) {
-                                return OPJ_FALSE;
-                        }
+                for (precno = 0; precno < res->pw * res->ph; precno++) {
+                    opj_tcd_precinct_t *prc = &band->precincts[precno];
 
-                        for     (i = 0; i < 128; ++i) {
-                                OPJ_FLOAT64 distoachieved = 0;  /* fixed_quality */
+                    for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+                        opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
+                        opj_tcd_layer_t *layer = &cblk->layers[layno];
+                        OPJ_UINT32 n;
+                        OPJ_INT32 imsb = (OPJ_INT32)(tcd->image->comps[compno].prec -
+                                                     cblk->numbps); /* number of bit-plan equal to zero */
 
-                                thresh = (lo + hi) / 2;
-
-                                opj_tcd_makelayer(tcd, layno, thresh, 0);
-
-                                if (cp->m_specific_param.m_enc.m_fixed_quality) {       /* fixed_quality */
-                                        if(OPJ_IS_CINEMA(cp->rsiz)){
-                                                if (! opj_t2_encode_packets(t2,tcd->tcd_tileno, tcd_tile, layno + 1, dest, p_data_written, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC)) {
-
-                                                        lo = thresh;
-                                                        continue;
-                                                }
-                                                else {
-                                                        distoachieved = layno == 0 ?
-                                                                        tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno];
-
-                                                        if (distoachieved < distotarget) {
-                                                                hi=thresh;
-                                                                stable_thresh = thresh;
-                                                                continue;
-                                                        }else{
-                                                                lo=thresh;
-                                                        }
-                                                }
-                                        }else{
-                                                distoachieved = (layno == 0) ?
-                                                                tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
-
-                                                if (distoachieved < distotarget) {
-                                                        hi = thresh;
-                                                        stable_thresh = thresh;
-                                                        continue;
-                                                }
-                                                lo = thresh;
-                                        }
-                                } else {
-                                        if (! opj_t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest,p_data_written, maxlen, cstr_info,tcd->cur_tp_num,tcd->tp_pos,tcd->cur_pino,THRESH_CALC))
-                                        {
-                                                /* TODO: what to do with l ??? seek / tell ??? */
-                                                /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */
-                                                lo = thresh;
-                                                continue;
-                                        }
-
-                                        hi = thresh;
-                                        stable_thresh = thresh;
+                        /* Correction of the matrix of coefficient to include the IMSB information */
+                        if (layno == 0) {
+                            value = matrice[layno][resno][bandno];
+                            if (imsb >= value) {
+                                value = 0;
+                            } else {
+                                value -= imsb;
+                            }
+                        } else {
+                            value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno];
+                            if (imsb >= matrice[layno - 1][resno][bandno]) {
+                                value -= (imsb - matrice[layno - 1][resno][bandno]);
+                                if (value < 0) {
+                                    value = 0;
                                 }
+                            }
                         }
 
-                        success = OPJ_TRUE;
-                        goodthresh = stable_thresh == 0? thresh : stable_thresh;
+                        if (layno == 0) {
+                            cblk->numpassesinlayers = 0;
+                        }
 
-                        opj_t2_destroy(t2);
+                        n = cblk->numpassesinlayers;
+                        if (cblk->numpassesinlayers == 0) {
+                            if (value != 0) {
+                                n = 3 * (OPJ_UINT32)value - 2 + cblk->numpassesinlayers;
+                            } else {
+                                n = cblk->numpassesinlayers;
+                            }
+                        } else {
+                            n = 3 * (OPJ_UINT32)value + cblk->numpassesinlayers;
+                        }
+
+                        layer->numpasses = n - cblk->numpassesinlayers;
+
+                        if (!layer->numpasses) {
+                            continue;
+                        }
+
+                        if (cblk->numpassesinlayers == 0) {
+                            layer->len = cblk->passes[n - 1].rate;
+                            layer->data = cblk->data;
+                        } else {
+                            layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers -
+                                         1].rate;
+                            layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
+                        }
+
+                        if (final) {
+                            cblk->numpassesinlayers = n;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+OPJ_BOOL opj_tcd_rateallocate(opj_tcd_t *tcd,
+                              OPJ_BYTE *dest,
+                              OPJ_UINT32 * p_data_written,
+                              OPJ_UINT32 len,
+                              opj_codestream_info_t *cstr_info)
+{
+    OPJ_UINT32 compno, resno, bandno, precno, cblkno, layno;
+    OPJ_UINT32 passno;
+    OPJ_FLOAT64 min, max;
+    OPJ_FLOAT64 cumdisto[100];      /* fixed_quality */
+    const OPJ_FLOAT64 K = 1;                /* 1.1; fixed_quality */
+    OPJ_FLOAT64 maxSE = 0;
+
+    opj_cp_t *cp = tcd->cp;
+    opj_tcd_tile_t *tcd_tile = tcd->tcd_image->tiles;
+    opj_tcp_t *tcd_tcp = tcd->tcp;
+
+    min = DBL_MAX;
+    max = 0;
+
+    tcd_tile->numpix = 0;           /* fixed_quality */
+
+    for (compno = 0; compno < tcd_tile->numcomps; compno++) {
+        opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
+        tilec->numpix = 0;
+
+        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];
+
+                /* Skip empty bands */
+                if (opj_tcd_is_band_empty(band)) {
+                    continue;
+                }
+
+                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_enc_t *cblk = &prc->cblks.enc[cblkno];
+
+                        for (passno = 0; passno < cblk->totalpasses; passno++) {
+                            opj_tcd_pass_t *pass = &cblk->passes[passno];
+                            OPJ_INT32 dr;
+                            OPJ_FLOAT64 dd, rdslope;
+
+                            if (passno == 0) {
+                                dr = (OPJ_INT32)pass->rate;
+                                dd = pass->distortiondec;
+                            } else {
+                                dr = (OPJ_INT32)(pass->rate - cblk->passes[passno - 1].rate);
+                                dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec;
+                            }
+
+                            if (dr == 0) {
+                                continue;
+                            }
+
+                            rdslope = dd / dr;
+                            if (rdslope < min) {
+                                min = rdslope;
+                            }
+
+                            if (rdslope > max) {
+                                max = rdslope;
+                            }
+                        } /* passno */
+
+                        /* fixed_quality */
+                        tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
+                        tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
+                    } /* cbklno */
+                } /* precno */
+            } /* bandno */
+        } /* resno */
+
+        maxSE += (((OPJ_FLOAT64)(1 << tcd->image->comps[compno].prec) - 1.0)
+                  * ((OPJ_FLOAT64)(1 << tcd->image->comps[compno].prec) - 1.0))
+                 * ((OPJ_FLOAT64)(tilec->numpix));
+    } /* compno */
+
+    /* index file */
+    if (cstr_info) {
+        opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno];
+        tile_info->numpix = tcd_tile->numpix;
+        tile_info->distotile = tcd_tile->distotile;
+        tile_info->thresh = (OPJ_FLOAT64 *) opj_malloc(tcd_tcp->numlayers * sizeof(
+                                OPJ_FLOAT64));
+        if (!tile_info->thresh) {
+            /* FIXME event manager error callback */
+            return OPJ_FALSE;
+        }
+    }
+
+    for (layno = 0; layno < tcd_tcp->numlayers; layno++) {
+        OPJ_FLOAT64 lo = min;
+        OPJ_FLOAT64 hi = max;
+        OPJ_UINT32 maxlen = tcd_tcp->rates[layno] > 0.0f ? opj_uint_min(((
+                                OPJ_UINT32) ceil(tcd_tcp->rates[layno])), len) : len;
+        OPJ_FLOAT64 goodthresh = 0;
+        OPJ_FLOAT64 stable_thresh = 0;
+        OPJ_UINT32 i;
+        OPJ_FLOAT64 distotarget;                /* fixed_quality */
+
+        /* fixed_quality */
+        distotarget = tcd_tile->distotile - ((K * maxSE) / pow((OPJ_FLOAT32)10,
+                                             tcd_tcp->distoratio[layno] / 10));
+
+        /* Don't try to find an optimal threshold but rather take everything not included yet, if
+          -r xx,yy,zz,0   (disto_alloc == 1 and rates == 0)
+          -q xx,yy,zz,0   (fixed_quality == 1 and distoratio == 0)
+          ==> possible to have some lossy layers and the last layer for sure lossless */
+        if (((cp->m_specific_param.m_enc.m_disto_alloc == 1) &&
+                (tcd_tcp->rates[layno] > 0.0f)) ||
+                ((cp->m_specific_param.m_enc.m_fixed_quality == 1) &&
+                 (tcd_tcp->distoratio[layno] > 0.0))) {
+            opj_t2_t*t2 = opj_t2_create(tcd->image, cp);
+            OPJ_FLOAT64 thresh = 0;
+
+            if (t2 == 00) {
+                return OPJ_FALSE;
+            }
+
+            for (i = 0; i < 128; ++i) {
+                OPJ_FLOAT64 distoachieved = 0;  /* fixed_quality */
+
+                thresh = (lo + hi) / 2;
+
+                opj_tcd_makelayer(tcd, layno, thresh, 0);
+
+                if (cp->m_specific_param.m_enc.m_fixed_quality) {       /* fixed_quality */
+                    if (OPJ_IS_CINEMA(cp->rsiz)) {
+                        if (! opj_t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest,
+                                                    p_data_written, maxlen, cstr_info, tcd->cur_tp_num, tcd->tp_pos, tcd->cur_pino,
+                                                    THRESH_CALC)) {
+
+                            lo = thresh;
+                            continue;
+                        } else {
+                            distoachieved = layno == 0 ?
+                                            tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno];
+
+                            if (distoachieved < distotarget) {
+                                hi = thresh;
+                                stable_thresh = thresh;
+                                continue;
+                            } else {
+                                lo = thresh;
+                            }
+                        }
+                    } else {
+                        distoachieved = (layno == 0) ?
+                                        tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
+
+                        if (distoachieved < distotarget) {
+                            hi = thresh;
+                            stable_thresh = thresh;
+                            continue;
+                        }
+                        lo = thresh;
+                    }
                 } else {
-                        success = OPJ_TRUE;
-                        goodthresh = min;
+                    if (! opj_t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest,
+                                                p_data_written, maxlen, cstr_info, tcd->cur_tp_num, tcd->tp_pos, tcd->cur_pino,
+                                                THRESH_CALC)) {
+                        /* TODO: what to do with l ??? seek / tell ??? */
+                        /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */
+                        lo = thresh;
+                        continue;
+                    }
+
+                    hi = thresh;
+                    stable_thresh = thresh;
                 }
+            }
 
-                if (!success) {
-                        return OPJ_FALSE;
-                }
+            goodthresh = stable_thresh == 0 ? thresh : stable_thresh;
 
-                if(cstr_info) { /* Threshold for Marcela Index */
-                        cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh;
-                }
-
-                opj_tcd_makelayer(tcd, layno, goodthresh, 1);
-
-                /* fixed_quality */
-                cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
+            opj_t2_destroy(t2);
+        } else {
+            goodthresh = min;
         }
 
-        return OPJ_TRUE;
+        if (cstr_info) { /* Threshold for Marcela Index */
+            cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh;
+        }
+
+        opj_tcd_makelayer(tcd, layno, goodthresh, 1);
+
+        /* fixed_quality */
+        cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] :
+                          (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
+    }
+
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_tcd_init( opj_tcd_t *p_tcd,
-                                           opj_image_t * p_image,
-                                           opj_cp_t * p_cp )
+OPJ_BOOL opj_tcd_init(opj_tcd_t *p_tcd,
+                      opj_image_t * p_image,
+                      opj_cp_t * p_cp,
+                      opj_thread_pool_t* p_tp)
 {
-        p_tcd->image = p_image;
-        p_tcd->cp = p_cp;
+    p_tcd->image = p_image;
+    p_tcd->cp = p_cp;
 
-        p_tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_calloc(1,sizeof(opj_tcd_tile_t));
-        if (! p_tcd->tcd_image->tiles) {
-                return OPJ_FALSE;
-        }
+    p_tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_calloc(1,
+                              sizeof(opj_tcd_tile_t));
+    if (! p_tcd->tcd_image->tiles) {
+        return OPJ_FALSE;
+    }
 
-        p_tcd->tcd_image->tiles->comps = (opj_tcd_tilecomp_t *) opj_calloc(p_image->numcomps,sizeof(opj_tcd_tilecomp_t));
-        if (! p_tcd->tcd_image->tiles->comps ) {
-                return OPJ_FALSE;
-        }
+    p_tcd->tcd_image->tiles->comps = (opj_tcd_tilecomp_t *) opj_calloc(
+                                         p_image->numcomps, sizeof(opj_tcd_tilecomp_t));
+    if (! p_tcd->tcd_image->tiles->comps) {
+        return OPJ_FALSE;
+    }
 
-        p_tcd->tcd_image->tiles->numcomps = p_image->numcomps;
-        p_tcd->tp_pos = p_cp->m_specific_param.m_enc.m_tp_pos;
+    p_tcd->tcd_image->tiles->numcomps = p_image->numcomps;
+    p_tcd->tp_pos = p_cp->m_specific_param.m_enc.m_tp_pos;
+    p_tcd->thread_pool = p_tp;
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 /**
 Destroy a previously created TCD handle
 */
-void opj_tcd_destroy(opj_tcd_t *tcd) {
-        if (tcd) {
-                opj_tcd_free_tile(tcd);
+void opj_tcd_destroy(opj_tcd_t *tcd)
+{
+    if (tcd) {
+        opj_tcd_free_tile(tcd);
 
-                if (tcd->tcd_image) {
-                        opj_free(tcd->tcd_image);
-                        tcd->tcd_image = 00;
-                }
-                opj_free(tcd);
+        if (tcd->tcd_image) {
+            opj_free(tcd->tcd_image);
+            tcd->tcd_image = 00;
         }
+        opj_free(tcd);
+    }
 }
 
 OPJ_BOOL opj_alloc_tile_component_data(opj_tcd_tilecomp_t *l_tilec)
 {
-	if ((l_tilec->data == 00) || ((l_tilec->data_size_needed > l_tilec->data_size) && (l_tilec->ownsData == OPJ_FALSE))) {
-		l_tilec->data = (OPJ_INT32 *) opj_malloc(l_tilec->data_size_needed);
-		if (! l_tilec->data ) {
-			return OPJ_FALSE;
-		}
-		/*fprintf(stderr, "tAllocate data of tilec (int): %d x OPJ_UINT32n",l_data_size);*/
-		l_tilec->data_size = l_tilec->data_size_needed;
-		l_tilec->ownsData = OPJ_TRUE;
-	}
-	else if (l_tilec->data_size_needed > l_tilec->data_size) {
-		OPJ_INT32 * new_data = (OPJ_INT32 *) opj_realloc(l_tilec->data, l_tilec->data_size_needed);
-		/* opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle tile datan"); */
-		/* fprintf(stderr, "Not enough memory to handle tile data"); */
-		if (! new_data) {
-			opj_free(l_tilec->data);
-			l_tilec->data = NULL;
-			l_tilec->data_size = 0;
-			l_tilec->data_size_needed = 0;
-			l_tilec->ownsData = OPJ_FALSE;
-			return OPJ_FALSE;
-		}
-		l_tilec->data = new_data;
-		/*fprintf(stderr, "tReallocate data of tilec (int): from %d to %d x OPJ_UINT32n", l_tilec->data_size, l_data_size);*/
-		l_tilec->data_size = l_tilec->data_size_needed;
-		l_tilec->ownsData = OPJ_TRUE;
-	}
-	return OPJ_TRUE;
+    if ((l_tilec->data == 00) ||
+            ((l_tilec->data_size_needed > l_tilec->data_size) &&
+             (l_tilec->ownsData == OPJ_FALSE))) {
+        l_tilec->data = (OPJ_INT32 *) opj_image_data_alloc(l_tilec->data_size_needed);
+        if (! l_tilec->data) {
+            return OPJ_FALSE;
+        }
+        /*fprintf(stderr, "tAllocate data of tilec (int): %d x OPJ_UINT32n",l_data_size);*/
+        l_tilec->data_size = l_tilec->data_size_needed;
+        l_tilec->ownsData = OPJ_TRUE;
+    } else if (l_tilec->data_size_needed > l_tilec->data_size) {
+        /* We don't need to keep old data */
+        opj_image_data_free(l_tilec->data);
+        l_tilec->data = (OPJ_INT32 *) opj_image_data_alloc(l_tilec->data_size_needed);
+        if (! l_tilec->data) {
+            l_tilec->data_size = 0;
+            l_tilec->data_size_needed = 0;
+            l_tilec->ownsData = OPJ_FALSE;
+            return OPJ_FALSE;
+        }
+        /*fprintf(stderr, "tReallocate data of tilec (int): from %d to %d x OPJ_UINT32n", l_tilec->data_size, l_data_size);*/
+        l_tilec->data_size = l_tilec->data_size_needed;
+        l_tilec->ownsData = OPJ_TRUE;
+    }
+    return OPJ_TRUE;
 }
 
 /* ----------------------------------------------------------------------- */
 
-static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no, OPJ_BOOL isEncoder, OPJ_FLOAT32 fraction, OPJ_SIZE_T sizeof_block, opj_event_mgr_t* manager)
+static INLINE OPJ_BOOL opj_tcd_init_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
+        OPJ_BOOL isEncoder, OPJ_FLOAT32 fraction, OPJ_SIZE_T sizeof_block,
+        opj_event_mgr_t* manager)
 {
-	OPJ_UINT32 (*l_gain_ptr)(OPJ_UINT32) = 00;
-	OPJ_UINT32 compno, resno, bandno, precno, cblkno;
-	opj_tcp_t * l_tcp = 00;
-	opj_cp_t * l_cp = 00;
-	opj_tcd_tile_t * l_tile = 00;
-	opj_tccp_t *l_tccp = 00;
-	opj_tcd_tilecomp_t *l_tilec = 00;
-	opj_image_comp_t * l_image_comp = 00;
-	opj_tcd_resolution_t *l_res = 00;
-	opj_tcd_band_t *l_band = 00;
-	opj_stepsize_t * l_step_size = 00;
-	opj_tcd_precinct_t *l_current_precinct = 00;
-	opj_image_t *l_image = 00;
-	OPJ_UINT32 p,q;
-	OPJ_UINT32 l_level_no;
-	OPJ_UINT32 l_pdx, l_pdy;
-	OPJ_UINT32 l_gain;
-	OPJ_INT32 l_x0b, l_y0b;
-	OPJ_UINT32 l_tx0, l_ty0;
-	/* extent of precincts , top left, bottom right**/
-	OPJ_INT32 l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end, l_br_prc_y_end;
-	/* number of precinct for a resolution */
-	OPJ_UINT32 l_nb_precincts;
-	/* room needed to store l_nb_precinct precinct for a resolution */
-	OPJ_UINT32 l_nb_precinct_size;
-	/* number of code blocks for a precinct*/
-	OPJ_UINT32 l_nb_code_blocks;
-	/* room needed to store l_nb_code_blocks code blocks for a precinct*/
-	OPJ_UINT32 l_nb_code_blocks_size;
-	/* size of data for a tile */
-	OPJ_UINT32 l_data_size;
-	
-	l_cp = p_tcd->cp;
-	l_tcp = &(l_cp->tcps[p_tile_no]);
-	l_tile = p_tcd->tcd_image->tiles;
-	l_tccp = l_tcp->tccps;
-	l_tilec = l_tile->comps;
-	l_image = p_tcd->image;
-	l_image_comp = p_tcd->image->comps;
-	
-	p = p_tile_no % l_cp->tw;       /* tile coordinates */
-	q = p_tile_no / l_cp->tw;
-	/*fprintf(stderr, "Tile coordinate = %d,%d\n", p, q);*/
-	
-	/* 4 borders of the tile rescale on the image if necessary */
-	l_tx0 = l_cp->tx0 + p * l_cp->tdx; /* can't be greater than l_image->x1 so won't overflow */
-	l_tile->x0 = (OPJ_INT32)opj_uint_max(l_tx0, l_image->x0);
-	l_tile->x1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_tx0, l_cp->tdx), l_image->x1);
-	if (l_tile->x0 < 0 || l_tile->x1 < 0) {
-		return OPJ_FALSE;
-	}
+    OPJ_UINT32(*l_gain_ptr)(OPJ_UINT32) = 00;
+    OPJ_UINT32 compno, resno, bandno, precno, cblkno;
+    opj_tcp_t * l_tcp = 00;
+    opj_cp_t * l_cp = 00;
+    opj_tcd_tile_t * l_tile = 00;
+    opj_tccp_t *l_tccp = 00;
+    opj_tcd_tilecomp_t *l_tilec = 00;
+    opj_image_comp_t * l_image_comp = 00;
+    opj_tcd_resolution_t *l_res = 00;
+    opj_tcd_band_t *l_band = 00;
+    opj_stepsize_t * l_step_size = 00;
+    opj_tcd_precinct_t *l_current_precinct = 00;
+    opj_image_t *l_image = 00;
+    OPJ_UINT32 p, q;
+    OPJ_UINT32 l_level_no;
+    OPJ_UINT32 l_pdx, l_pdy;
+    OPJ_UINT32 l_gain;
+    OPJ_INT32 l_x0b, l_y0b;
+    OPJ_UINT32 l_tx0, l_ty0;
+    /* extent of precincts , top left, bottom right**/
+    OPJ_INT32 l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end, l_br_prc_y_end;
+    /* number of precinct for a resolution */
+    OPJ_UINT32 l_nb_precincts;
+    /* room needed to store l_nb_precinct precinct for a resolution */
+    OPJ_UINT32 l_nb_precinct_size;
+    /* number of code blocks for a precinct*/
+    OPJ_UINT32 l_nb_code_blocks;
+    /* room needed to store l_nb_code_blocks code blocks for a precinct*/
+    OPJ_UINT32 l_nb_code_blocks_size;
+    /* size of data for a tile */
+    OPJ_UINT32 l_data_size;
 
-	l_ty0 = l_cp->ty0 + q * l_cp->tdy; /* can't be greater than l_image->y1 so won't overflow */
-	l_tile->y0 = (OPJ_INT32)opj_uint_max(l_ty0, l_image->y0);
-	l_tile->y1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_ty0, l_cp->tdy), l_image->y1);
-	if (l_tile->y0 < 0 || l_tile->y1 < 0) {
-		return OPJ_FALSE;
-	}
+    l_cp = p_tcd->cp;
+    l_tcp = &(l_cp->tcps[p_tile_no]);
+    l_tile = p_tcd->tcd_image->tiles;
+    l_tccp = l_tcp->tccps;
+    l_tilec = l_tile->comps;
+    l_image = p_tcd->image;
+    l_image_comp = p_tcd->image->comps;
 
-	/* testcase 1888.pdf.asan.35.988 */
-	if (l_tccp->numresolutions == 0) {
-		opj_event_msg(manager, EVT_ERROR, "tiles require at least one resolution\n");
-		return OPJ_FALSE;
-	}
-	/*fprintf(stderr, "Tile border = %d,%d,%d,%d\n", l_tile->x0, l_tile->y0,l_tile->x1,l_tile->y1);*/
-	
-	/*tile->numcomps = image->numcomps; */
-	for (compno = 0; compno < l_tile->numcomps; ++compno) {
-		/*fprintf(stderr, "compno = %d/%d\n", compno, l_tile->numcomps);*/
-		l_image_comp->resno_decoded = 0;
-		/* border of each l_tile component (global) */
-		l_tilec->x0 = opj_int_ceildiv(l_tile->x0, (OPJ_INT32)l_image_comp->dx);
-		l_tilec->y0 = opj_int_ceildiv(l_tile->y0, (OPJ_INT32)l_image_comp->dy);
-		l_tilec->x1 = opj_int_ceildiv(l_tile->x1, (OPJ_INT32)l_image_comp->dx);
-		l_tilec->y1 = opj_int_ceildiv(l_tile->y1, (OPJ_INT32)l_image_comp->dy);
-		/*fprintf(stderr, "\tTile compo border = %d,%d,%d,%d\n", l_tilec->x0, l_tilec->y0,l_tilec->x1,l_tilec->y1);*/
-		if (l_tilec->x0 >= l_tilec->x1 || l_tilec->y0 >= l_tilec->y1) {
-			opj_event_msg(manager, EVT_ERROR, "Invalid tile data\n");
-			return OPJ_FALSE;
-		}
-		/* compute l_data_size with overflow check */
-		l_data_size = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
-		if ((((OPJ_UINT32)-1) / l_data_size) < (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0)) {
-			opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile data\n");
-			return OPJ_FALSE;
-		}
-		l_data_size = l_data_size * (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);
-		
-		if ((((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(OPJ_UINT32)) < l_data_size) {
-			opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile data\n");
-			return OPJ_FALSE;
-		}
-		l_data_size = l_data_size * (OPJ_UINT32)sizeof(OPJ_UINT32);
-		l_tilec->numresolutions = l_tccp->numresolutions;
-		if (l_tccp->numresolutions < l_cp->m_specific_param.m_dec.m_reduce) {
-			l_tilec->minimum_num_resolutions = 1;
-		}
-		else {
-			l_tilec->minimum_num_resolutions = l_tccp->numresolutions - l_cp->m_specific_param.m_dec.m_reduce;
-		}
-		
-		l_tilec->data_size_needed = l_data_size;
-		if (p_tcd->m_is_decoder && !opj_alloc_tile_component_data(l_tilec)) {
-			opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile data\n");
-			return OPJ_FALSE;
-		}
-		
-		l_data_size = l_tilec->numresolutions * (OPJ_UINT32)sizeof(opj_tcd_resolution_t);
-		
-		if (l_tilec->resolutions == 00) {
-			l_tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(l_data_size);
-			if (! l_tilec->resolutions ) {
-				return OPJ_FALSE;
-			}
-			/*fprintf(stderr, "\tAllocate resolutions of tilec (opj_tcd_resolution_t): %d\n",l_data_size);*/
-			l_tilec->resolutions_size = l_data_size;
-			memset(l_tilec->resolutions,0,l_data_size);
-		}
-		else if (l_data_size > l_tilec->resolutions_size) {
-			opj_tcd_resolution_t* new_resolutions = (opj_tcd_resolution_t *) opj_realloc(l_tilec->resolutions, l_data_size);
-			if (! new_resolutions) {
-				opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile resolutions\n");
-				opj_free(l_tilec->resolutions);
-				l_tilec->resolutions = NULL;
-				l_tilec->resolutions_size = 0;
-				return OPJ_FALSE;
-			}
-			l_tilec->resolutions = new_resolutions;
-			/*fprintf(stderr, "\tReallocate data of tilec (int): from %d to %d x OPJ_UINT32\n", l_tilec->resolutions_size, l_data_size);*/
-			memset(((OPJ_BYTE*) l_tilec->resolutions)+l_tilec->resolutions_size,0,l_data_size - l_tilec->resolutions_size);
-			l_tilec->resolutions_size = l_data_size;
-		}
-		
-		l_level_no = l_tilec->numresolutions - 1;
-		l_res = l_tilec->resolutions;
-		l_step_size = l_tccp->stepsizes;
-		if (l_tccp->qmfbid == 0) {
-			l_gain_ptr = &opj_dwt_getgain_real;
-		}
-		else {
-			l_gain_ptr  = &opj_dwt_getgain;
-		}
-		/*fprintf(stderr, "\tlevel_no=%d\n",l_level_no);*/
-		
-		for (resno = 0; resno < l_tilec->numresolutions; ++resno) {
-			/*fprintf(stderr, "\t\tresno = %d/%d\n", resno, l_tilec->numresolutions);*/
-			OPJ_INT32 tlcbgxstart, tlcbgystart /*, brcbgxend, brcbgyend*/;
-			OPJ_UINT32 cbgwidthexpn, cbgheightexpn;
-			OPJ_UINT32 cblkwidthexpn, cblkheightexpn;
-			
-			/* border for each resolution level (global) */
-			l_res->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no);
-			l_res->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no);
-			l_res->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no);
-			l_res->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no);
-			/*fprintf(stderr, "\t\t\tres_x0= %d, res_y0 =%d, res_x1=%d, res_y1=%d\n", l_res->x0, l_res->y0, l_res->x1, l_res->y1);*/
-			/* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
-			l_pdx = l_tccp->prcw[resno];
-			l_pdy = l_tccp->prch[resno];
-			/*fprintf(stderr, "\t\t\tpdx=%d, pdy=%d\n", l_pdx, l_pdy);*/
-			/* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */
-			l_tl_prc_x_start = opj_int_floordivpow2(l_res->x0, (OPJ_INT32)l_pdx) << l_pdx;
-			l_tl_prc_y_start = opj_int_floordivpow2(l_res->y0, (OPJ_INT32)l_pdy) << l_pdy;
-			l_br_prc_x_end = opj_int_ceildivpow2(l_res->x1, (OPJ_INT32)l_pdx) << l_pdx;
-			l_br_prc_y_end = opj_int_ceildivpow2(l_res->y1, (OPJ_INT32)l_pdy) << l_pdy;
-			/*fprintf(stderr, "\t\t\tprc_x_start=%d, prc_y_start=%d, br_prc_x_end=%d, br_prc_y_end=%d \n", l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end ,l_br_prc_y_end );*/
-			
-			l_res->pw = (l_res->x0 == l_res->x1) ? 0 : (OPJ_UINT32)((l_br_prc_x_end - l_tl_prc_x_start) >> l_pdx);
-			l_res->ph = (l_res->y0 == l_res->y1) ? 0 : (OPJ_UINT32)((l_br_prc_y_end - l_tl_prc_y_start) >> l_pdy);
-			/*fprintf(stderr, "\t\t\tres_pw=%d, res_ph=%d\n", l_res->pw, l_res->ph );*/
-			
-			if (l_res->pw && ((OPJ_UINT32)-1) / l_res->pw < l_res->ph) {
-				return OPJ_FALSE;
-			}
-			l_nb_precincts = l_res->pw * l_res->ph;
+    p = p_tile_no % l_cp->tw;       /* tile coordinates */
+    q = p_tile_no / l_cp->tw;
+    /*fprintf(stderr, "Tile coordinate = %d,%d\n", p, q);*/
 
-			if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof(opj_tcd_precinct_t) < l_nb_precincts) {
-				return OPJ_FALSE;
-			}
-			l_nb_precinct_size = l_nb_precincts * (OPJ_UINT32)sizeof(opj_tcd_precinct_t);
-			if (resno == 0) {
-				tlcbgxstart = l_tl_prc_x_start;
-				tlcbgystart = l_tl_prc_y_start;
-				/*brcbgxend = l_br_prc_x_end;*/
-				/* brcbgyend = l_br_prc_y_end;*/
-				cbgwidthexpn = l_pdx;
-				cbgheightexpn = l_pdy;
-				l_res->numbands = 1;
-			}
-			else {
-				tlcbgxstart = opj_int_ceildivpow2(l_tl_prc_x_start, 1);
-				tlcbgystart = opj_int_ceildivpow2(l_tl_prc_y_start, 1);
-				/*brcbgxend = opj_int_ceildivpow2(l_br_prc_x_end, 1);*/
-				/*brcbgyend = opj_int_ceildivpow2(l_br_prc_y_end, 1);*/
-				cbgwidthexpn = l_pdx - 1;
-				cbgheightexpn = l_pdy - 1;
-				l_res->numbands = 3;
-			}
-			
-			cblkwidthexpn = opj_uint_min(l_tccp->cblkw, cbgwidthexpn);
-			cblkheightexpn = opj_uint_min(l_tccp->cblkh, cbgheightexpn);
-			l_band = l_res->bands;
-			
-			for (bandno = 0; bandno < l_res->numbands; ++bandno) {
-				OPJ_INT32 numbps;
-				/*fprintf(stderr, "\t\t\tband_no=%d/%d\n", bandno, l_res->numbands );*/
-				
-				if (resno == 0) {
-					l_band->bandno = 0 ;
-					l_band->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no);
-					l_band->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no);
-					l_band->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no);
-					l_band->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no);
-				}
-				else {
-					l_band->bandno = bandno + 1;
-					/* x0b = 1 if bandno = 1 or 3 */
-					l_x0b = l_band->bandno&1;
-					/* y0b = 1 if bandno = 2 or 3 */
-					l_y0b = (OPJ_INT32)((l_band->bandno)>>1);
-					/* l_band border (global) */
-					l_band->x0 = opj_int64_ceildivpow2(l_tilec->x0 - ((OPJ_INT64)l_x0b << l_level_no), (OPJ_INT32)(l_level_no + 1));
-					l_band->y0 = opj_int64_ceildivpow2(l_tilec->y0 - ((OPJ_INT64)l_y0b << l_level_no), (OPJ_INT32)(l_level_no + 1));
-					l_band->x1 = opj_int64_ceildivpow2(l_tilec->x1 - ((OPJ_INT64)l_x0b << l_level_no), (OPJ_INT32)(l_level_no + 1));
-					l_band->y1 = opj_int64_ceildivpow2(l_tilec->y1 - ((OPJ_INT64)l_y0b << l_level_no), (OPJ_INT32)(l_level_no + 1));
-				}
-				
-				/** avoid an if with storing function pointer */
-				l_gain = (*l_gain_ptr) (l_band->bandno);
-				numbps = (OPJ_INT32)(l_image_comp->prec + l_gain);
-				l_band->stepsize = (OPJ_FLOAT32)(((1.0 + l_step_size->mant / 2048.0) * pow(2.0, (OPJ_INT32) (numbps - l_step_size->expn)))) * fraction;
-				l_band->numbps = l_step_size->expn + (OPJ_INT32)l_tccp->numgbits - 1;      /* WHY -1 ? */
-				
-				if (! l_band->precincts) {
-					l_band->precincts = (opj_tcd_precinct_t *) opj_malloc( /*3 * */ l_nb_precinct_size);
-					if (! l_band->precincts) {
-						return OPJ_FALSE;
-					}
-					/*fprintf(stderr, "\t\t\t\tAllocate precincts of a band (opj_tcd_precinct_t): %d\n",l_nb_precinct_size);     */
-					memset(l_band->precincts,0,l_nb_precinct_size);
-					l_band->precincts_data_size = l_nb_precinct_size;
-				}
-				else if (l_band->precincts_data_size < l_nb_precinct_size) {
-					
-					opj_tcd_precinct_t * new_precincts = (opj_tcd_precinct_t *) opj_realloc(l_band->precincts,/*3 * */ l_nb_precinct_size);
-					if (! new_precincts) {
-						opj_event_msg(manager, EVT_ERROR, "Not enough memory to handle band precints\n");
-						opj_free(l_band->precincts);
-						l_band->precincts = NULL;
-						l_band->precincts_data_size = 0;
-						return OPJ_FALSE;
-					}
-					l_band->precincts = new_precincts;
-					/*fprintf(stderr, "\t\t\t\tReallocate precincts of a band (opj_tcd_precinct_t): from %d to %d\n",l_band->precincts_data_size, l_nb_precinct_size);*/
-					memset(((OPJ_BYTE *) l_band->precincts) + l_band->precincts_data_size,0,l_nb_precinct_size - l_band->precincts_data_size);
-					l_band->precincts_data_size = l_nb_precinct_size;
-				}
-				
-				l_current_precinct = l_band->precincts;
-				for (precno = 0; precno < l_nb_precincts; ++precno) {
-					OPJ_INT32 tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
-					OPJ_INT32 cbgxstart = tlcbgxstart + (OPJ_INT32)(precno % l_res->pw) * (1 << cbgwidthexpn);
-					OPJ_INT32 cbgystart = tlcbgystart + (OPJ_INT32)(precno / l_res->pw) * (1 << cbgheightexpn);
-					OPJ_INT32 cbgxend = cbgxstart + (1 << cbgwidthexpn);
-					OPJ_INT32 cbgyend = cbgystart + (1 << cbgheightexpn);
-					/*fprintf(stderr, "\t precno=%d; bandno=%d, resno=%d; compno=%d\n", precno, bandno , resno, compno);*/
-					/*fprintf(stderr, "\t tlcbgxstart(=%d) + (precno(=%d) percent res->pw(=%d)) * (1 << cbgwidthexpn(=%d)) \n",tlcbgxstart,precno,l_res->pw,cbgwidthexpn);*/
-					
-					/* precinct size (global) */
-					/*fprintf(stderr, "\t cbgxstart=%d, l_band->x0 = %d \n",cbgxstart, l_band->x0);*/
-					
-					l_current_precinct->x0 = opj_int_max(cbgxstart, l_band->x0);
-					l_current_precinct->y0 = opj_int_max(cbgystart, l_band->y0);
-					l_current_precinct->x1 = opj_int_min(cbgxend, l_band->x1);
-					l_current_precinct->y1 = opj_int_min(cbgyend, l_band->y1);
-					/*fprintf(stderr, "\t prc_x0=%d; prc_y0=%d, prc_x1=%d; prc_y1=%d\n",l_current_precinct->x0, l_current_precinct->y0 ,l_current_precinct->x1, l_current_precinct->y1);*/
-					
-					tlcblkxstart = opj_int_floordivpow2(l_current_precinct->x0, (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn;
-					/*fprintf(stderr, "\t tlcblkxstart =%d\n",tlcblkxstart );*/
-					tlcblkystart = opj_int_floordivpow2(l_current_precinct->y0, (OPJ_INT32)cblkheightexpn) << cblkheightexpn;
-					/*fprintf(stderr, "\t tlcblkystart =%d\n",tlcblkystart );*/
-					brcblkxend = opj_int_ceildivpow2(l_current_precinct->x1, (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn;
-					/*fprintf(stderr, "\t brcblkxend =%d\n",brcblkxend );*/
-					brcblkyend = opj_int_ceildivpow2(l_current_precinct->y1, (OPJ_INT32)cblkheightexpn) << cblkheightexpn;
-					/*fprintf(stderr, "\t brcblkyend =%d\n",brcblkyend );*/
-					l_current_precinct->cw = (OPJ_UINT32)((brcblkxend - tlcblkxstart) >> cblkwidthexpn);
-					l_current_precinct->ch = (OPJ_UINT32)((brcblkyend - tlcblkystart) >> cblkheightexpn);
-					
-					if (l_current_precinct->cw && ((OPJ_UINT32)-1) / l_current_precinct->cw < l_current_precinct->ch) {
-						return OPJ_FALSE;
-					}
-					l_nb_code_blocks = l_current_precinct->cw * l_current_precinct->ch;
-					/*fprintf(stderr, "\t\t\t\t precinct_cw = %d x recinct_ch = %d\n",l_current_precinct->cw, l_current_precinct->ch);      */
-					
-					if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof_block < l_nb_code_blocks) {
-						return OPJ_FALSE;
-					}
-					l_nb_code_blocks_size = l_nb_code_blocks * (OPJ_UINT32)sizeof_block;
-					
-					if (! l_current_precinct->cblks.blocks) {
-						l_current_precinct->cblks.blocks = opj_malloc(l_nb_code_blocks_size);
-						if (! l_current_precinct->cblks.blocks ) {
-							return OPJ_FALSE;
-						}
-						/*fprintf(stderr, "\t\t\t\tAllocate cblks of a precinct (opj_tcd_cblk_dec_t): %d\n",l_nb_code_blocks_size);*/
-						
-						memset(l_current_precinct->cblks.blocks,0,l_nb_code_blocks_size);
-						
-						l_current_precinct->block_size = l_nb_code_blocks_size;
-					}
-					else if (l_nb_code_blocks_size > l_current_precinct->block_size) {
-						void *new_blocks = opj_realloc(l_current_precinct->cblks.blocks, l_nb_code_blocks_size);
-						if (! new_blocks) {
-							opj_free(l_current_precinct->cblks.blocks);
-							l_current_precinct->cblks.blocks = NULL;
-							l_current_precinct->block_size = 0;
-							opj_event_msg(manager, EVT_ERROR, "Not enough memory for current precinct codeblock element\n");
-							return OPJ_FALSE;
-						}
-						l_current_precinct->cblks.blocks = new_blocks;
-						/*fprintf(stderr, "\t\t\t\tReallocate cblks of a precinct (opj_tcd_cblk_dec_t): from %d to %d\n",l_current_precinct->block_size, l_nb_code_blocks_size);     */
-						
-						memset(((OPJ_BYTE *) l_current_precinct->cblks.blocks) + l_current_precinct->block_size
-									 ,0
-									 ,l_nb_code_blocks_size - l_current_precinct->block_size);
-						
-						l_current_precinct->block_size = l_nb_code_blocks_size;
-					}
-					
-					if (! l_current_precinct->incltree) {
-						l_current_precinct->incltree = opj_tgt_create(l_current_precinct->cw, l_current_precinct->ch, manager);
-					}
-					else{
-						l_current_precinct->incltree = opj_tgt_init(l_current_precinct->incltree, l_current_precinct->cw, l_current_precinct->ch, manager);
-					}
+    /* 4 borders of the tile rescale on the image if necessary */
+    l_tx0 = l_cp->tx0 + p *
+            l_cp->tdx; /* can't be greater than l_image->x1 so won't overflow */
+    l_tile->x0 = (OPJ_INT32)opj_uint_max(l_tx0, l_image->x0);
+    l_tile->x1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_tx0, l_cp->tdx),
+                                         l_image->x1);
+    /* all those OPJ_UINT32 are casted to OPJ_INT32, let's do some sanity check */
+    if ((l_tile->x0 < 0) || (l_tile->x1 <= l_tile->x0)) {
+        opj_event_msg(manager, EVT_ERROR, "Tile X coordinates are not supported\n");
+        return OPJ_FALSE;
+    }
+    l_ty0 = l_cp->ty0 + q *
+            l_cp->tdy; /* can't be greater than l_image->y1 so won't overflow */
+    l_tile->y0 = (OPJ_INT32)opj_uint_max(l_ty0, l_image->y0);
+    l_tile->y1 = (OPJ_INT32)opj_uint_min(opj_uint_adds(l_ty0, l_cp->tdy),
+                                         l_image->y1);
+    /* all those OPJ_UINT32 are casted to OPJ_INT32, let's do some sanity check */
+    if ((l_tile->y0 < 0) || (l_tile->y1 <= l_tile->y0)) {
+        opj_event_msg(manager, EVT_ERROR, "Tile Y coordinates are not supported\n");
+        return OPJ_FALSE;
+    }
 
-					if (! l_current_precinct->incltree)     {
-						opj_event_msg(manager, EVT_WARNING, "No incltree created.\n");
-						/*return OPJ_FALSE;*/
-					}
 
-					if (! l_current_precinct->imsbtree) {
-						l_current_precinct->imsbtree = opj_tgt_create(l_current_precinct->cw, l_current_precinct->ch, manager);
-					}
-					else {
-						l_current_precinct->imsbtree = opj_tgt_init(l_current_precinct->imsbtree, l_current_precinct->cw, l_current_precinct->ch, manager);
-					}
+    /* testcase 1888.pdf.asan.35.988 */
+    if (l_tccp->numresolutions == 0) {
+        opj_event_msg(manager, EVT_ERROR, "tiles require at least one resolution\n");
+        return OPJ_FALSE;
+    }
+    /*fprintf(stderr, "Tile border = %d,%d,%d,%d\n", l_tile->x0, l_tile->y0,l_tile->x1,l_tile->y1);*/
 
-					if (! l_current_precinct->imsbtree) {
-						opj_event_msg(manager, EVT_WARNING, "No imsbtree created.\n");
-						/*return OPJ_FALSE;*/
-					}
+    /*tile->numcomps = image->numcomps; */
+    for (compno = 0; compno < l_tile->numcomps; ++compno) {
+        /*fprintf(stderr, "compno = %d/%d\n", compno, l_tile->numcomps);*/
+        l_image_comp->resno_decoded = 0;
+        /* border of each l_tile component (global) */
+        l_tilec->x0 = opj_int_ceildiv(l_tile->x0, (OPJ_INT32)l_image_comp->dx);
+        l_tilec->y0 = opj_int_ceildiv(l_tile->y0, (OPJ_INT32)l_image_comp->dy);
+        l_tilec->x1 = opj_int_ceildiv(l_tile->x1, (OPJ_INT32)l_image_comp->dx);
+        l_tilec->y1 = opj_int_ceildiv(l_tile->y1, (OPJ_INT32)l_image_comp->dy);
+        /*fprintf(stderr, "\tTile compo border = %d,%d,%d,%d\n", l_tilec->x0, l_tilec->y0,l_tilec->x1,l_tilec->y1);*/
+        if (l_tilec->x0 >= l_tilec->x1 || l_tilec->y0 >= l_tilec->y1) {
+            opj_event_msg(manager, EVT_ERROR, "Invalid tile data\n");
+            return OPJ_FALSE;
+        }
+        /* compute l_data_size with overflow check */
+        l_data_size = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0);
+        /* issue 733, l_data_size == 0U, probably something wrong should be checked before getting here */
+        if ((l_data_size > 0U) &&
+                ((((OPJ_UINT32) - 1) / l_data_size) < (OPJ_UINT32)(l_tilec->y1 -
+                        l_tilec->y0))) {
+            opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile data\n");
+            return OPJ_FALSE;
+        }
+        l_data_size = l_data_size * (OPJ_UINT32)(l_tilec->y1 - l_tilec->y0);
 
-					for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
-						OPJ_INT32 cblkxstart = tlcblkxstart + (OPJ_INT32)(cblkno % l_current_precinct->cw) * (1 << cblkwidthexpn);
-						OPJ_INT32 cblkystart = tlcblkystart + (OPJ_INT32)(cblkno / l_current_precinct->cw) * (1 << cblkheightexpn);
-						OPJ_INT32 cblkxend = cblkxstart + (1 << cblkwidthexpn);
-						OPJ_INT32 cblkyend = cblkystart + (1 << cblkheightexpn);
-						
-						if (isEncoder) {
-							opj_tcd_cblk_enc_t* l_code_block = l_current_precinct->cblks.enc + cblkno;
-							
-							if (! opj_tcd_code_block_enc_allocate(l_code_block)) {
-								return OPJ_FALSE;
-							}
-							/* code-block size (global) */
-							l_code_block->x0 = opj_int_max(cblkxstart, l_current_precinct->x0);
-							l_code_block->y0 = opj_int_max(cblkystart, l_current_precinct->y0);
-							l_code_block->x1 = opj_int_min(cblkxend, l_current_precinct->x1);
-							l_code_block->y1 = opj_int_min(cblkyend, l_current_precinct->y1);
-							
-							if (! opj_tcd_code_block_enc_allocate_data(l_code_block)) {
-								return OPJ_FALSE;
-							}
-						} else {
-							opj_tcd_cblk_dec_t* l_code_block = l_current_precinct->cblks.dec + cblkno;
-							
-							if (! opj_tcd_code_block_dec_allocate(l_code_block)) {
-								return OPJ_FALSE;
-							}
-							/* code-block size (global) */
-							l_code_block->x0 = opj_int_max(cblkxstart, l_current_precinct->x0);
-							l_code_block->y0 = opj_int_max(cblkystart, l_current_precinct->y0);
-							l_code_block->x1 = opj_int_min(cblkxend, l_current_precinct->x1);
-							l_code_block->y1 = opj_int_min(cblkyend, l_current_precinct->y1);
-						}
-					}
-					++l_current_precinct;
-				} /* precno */
-				++l_band;
-				++l_step_size;
-			} /* bandno */
-			++l_res;
-			--l_level_no;
-		} /* resno */
-		++l_tccp;
-		++l_tilec;
-		++l_image_comp;
-	} /* compno */
-	return OPJ_TRUE;
+        if ((((OPJ_UINT32) - 1) / (OPJ_UINT32)sizeof(OPJ_UINT32)) < l_data_size) {
+            opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile data\n");
+            return OPJ_FALSE;
+        }
+        l_data_size = l_data_size * (OPJ_UINT32)sizeof(OPJ_UINT32);
+        l_tilec->numresolutions = l_tccp->numresolutions;
+        if (l_tccp->numresolutions < l_cp->m_specific_param.m_dec.m_reduce) {
+            l_tilec->minimum_num_resolutions = 1;
+        } else {
+            l_tilec->minimum_num_resolutions = l_tccp->numresolutions -
+                                               l_cp->m_specific_param.m_dec.m_reduce;
+        }
+
+        l_tilec->data_size_needed = l_data_size;
+        if (p_tcd->m_is_decoder && !opj_alloc_tile_component_data(l_tilec)) {
+            opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile data\n");
+            return OPJ_FALSE;
+        }
+
+        l_data_size = l_tilec->numresolutions * (OPJ_UINT32)sizeof(
+                          opj_tcd_resolution_t);
+
+        if (l_tilec->resolutions == 00) {
+            l_tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(l_data_size);
+            if (! l_tilec->resolutions) {
+                return OPJ_FALSE;
+            }
+            /*fprintf(stderr, "\tAllocate resolutions of tilec (opj_tcd_resolution_t): %d\n",l_data_size);*/
+            l_tilec->resolutions_size = l_data_size;
+            memset(l_tilec->resolutions, 0, l_data_size);
+        } else if (l_data_size > l_tilec->resolutions_size) {
+            opj_tcd_resolution_t* new_resolutions = (opj_tcd_resolution_t *) opj_realloc(
+                    l_tilec->resolutions, l_data_size);
+            if (! new_resolutions) {
+                opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile resolutions\n");
+                opj_free(l_tilec->resolutions);
+                l_tilec->resolutions = NULL;
+                l_tilec->resolutions_size = 0;
+                return OPJ_FALSE;
+            }
+            l_tilec->resolutions = new_resolutions;
+            /*fprintf(stderr, "\tReallocate data of tilec (int): from %d to %d x OPJ_UINT32\n", l_tilec->resolutions_size, l_data_size);*/
+            memset(((OPJ_BYTE*) l_tilec->resolutions) + l_tilec->resolutions_size, 0,
+                   l_data_size - l_tilec->resolutions_size);
+            l_tilec->resolutions_size = l_data_size;
+        }
+
+        l_level_no = l_tilec->numresolutions;
+        l_res = l_tilec->resolutions;
+        l_step_size = l_tccp->stepsizes;
+        if (l_tccp->qmfbid == 0) {
+            l_gain_ptr = &opj_dwt_getgain_real;
+        } else {
+            l_gain_ptr  = &opj_dwt_getgain;
+        }
+        /*fprintf(stderr, "\tlevel_no=%d\n",l_level_no);*/
+
+        for (resno = 0; resno < l_tilec->numresolutions; ++resno) {
+            /*fprintf(stderr, "\t\tresno = %d/%d\n", resno, l_tilec->numresolutions);*/
+            OPJ_INT32 tlcbgxstart, tlcbgystart /*, brcbgxend, brcbgyend*/;
+            OPJ_UINT32 cbgwidthexpn, cbgheightexpn;
+            OPJ_UINT32 cblkwidthexpn, cblkheightexpn;
+
+            --l_level_no;
+
+            /* border for each resolution level (global) */
+            l_res->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no);
+            l_res->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no);
+            l_res->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no);
+            l_res->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no);
+            /*fprintf(stderr, "\t\t\tres_x0= %d, res_y0 =%d, res_x1=%d, res_y1=%d\n", l_res->x0, l_res->y0, l_res->x1, l_res->y1);*/
+            /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
+            l_pdx = l_tccp->prcw[resno];
+            l_pdy = l_tccp->prch[resno];
+            /*fprintf(stderr, "\t\t\tpdx=%d, pdy=%d\n", l_pdx, l_pdy);*/
+            /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000)  */
+            l_tl_prc_x_start = opj_int_floordivpow2(l_res->x0, (OPJ_INT32)l_pdx) << l_pdx;
+            l_tl_prc_y_start = opj_int_floordivpow2(l_res->y0, (OPJ_INT32)l_pdy) << l_pdy;
+            l_br_prc_x_end = opj_int_ceildivpow2(l_res->x1, (OPJ_INT32)l_pdx) << l_pdx;
+            l_br_prc_y_end = opj_int_ceildivpow2(l_res->y1, (OPJ_INT32)l_pdy) << l_pdy;
+            /*fprintf(stderr, "\t\t\tprc_x_start=%d, prc_y_start=%d, br_prc_x_end=%d, br_prc_y_end=%d \n", l_tl_prc_x_start, l_tl_prc_y_start, l_br_prc_x_end ,l_br_prc_y_end );*/
+
+            l_res->pw = (l_res->x0 == l_res->x1) ? 0U : (OPJ_UINT32)((
+                            l_br_prc_x_end - l_tl_prc_x_start) >> l_pdx);
+            l_res->ph = (l_res->y0 == l_res->y1) ? 0U : (OPJ_UINT32)((
+                            l_br_prc_y_end - l_tl_prc_y_start) >> l_pdy);
+            /*fprintf(stderr, "\t\t\tres_pw=%d, res_ph=%d\n", l_res->pw, l_res->ph );*/
+
+            if ((l_res->pw != 0U) && ((((OPJ_UINT32) - 1) / l_res->pw) < l_res->ph)) {
+                opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile data\n");
+                return OPJ_FALSE;
+            }
+            l_nb_precincts = l_res->pw * l_res->ph;
+
+            if ((((OPJ_UINT32) - 1) / (OPJ_UINT32)sizeof(opj_tcd_precinct_t)) <
+                    l_nb_precincts) {
+                opj_event_msg(manager, EVT_ERROR, "Not enough memory for tile data\n");
+                return OPJ_FALSE;
+            }
+            l_nb_precinct_size = l_nb_precincts * (OPJ_UINT32)sizeof(opj_tcd_precinct_t);
+
+            if (resno == 0) {
+                tlcbgxstart = l_tl_prc_x_start;
+                tlcbgystart = l_tl_prc_y_start;
+                /*brcbgxend = l_br_prc_x_end;*/
+                /* brcbgyend = l_br_prc_y_end;*/
+                cbgwidthexpn = l_pdx;
+                cbgheightexpn = l_pdy;
+                l_res->numbands = 1;
+            } else {
+                tlcbgxstart = opj_int_ceildivpow2(l_tl_prc_x_start, 1);
+                tlcbgystart = opj_int_ceildivpow2(l_tl_prc_y_start, 1);
+                /*brcbgxend = opj_int_ceildivpow2(l_br_prc_x_end, 1);*/
+                /*brcbgyend = opj_int_ceildivpow2(l_br_prc_y_end, 1);*/
+                cbgwidthexpn = l_pdx - 1;
+                cbgheightexpn = l_pdy - 1;
+                l_res->numbands = 3;
+            }
+
+            cblkwidthexpn = opj_uint_min(l_tccp->cblkw, cbgwidthexpn);
+            cblkheightexpn = opj_uint_min(l_tccp->cblkh, cbgheightexpn);
+            l_band = l_res->bands;
+
+            for (bandno = 0; bandno < l_res->numbands; ++bandno, ++l_band, ++l_step_size) {
+                OPJ_INT32 numbps;
+                /*fprintf(stderr, "\t\t\tband_no=%d/%d\n", bandno, l_res->numbands );*/
+
+                if (resno == 0) {
+                    l_band->bandno = 0 ;
+                    l_band->x0 = opj_int_ceildivpow2(l_tilec->x0, (OPJ_INT32)l_level_no);
+                    l_band->y0 = opj_int_ceildivpow2(l_tilec->y0, (OPJ_INT32)l_level_no);
+                    l_band->x1 = opj_int_ceildivpow2(l_tilec->x1, (OPJ_INT32)l_level_no);
+                    l_band->y1 = opj_int_ceildivpow2(l_tilec->y1, (OPJ_INT32)l_level_no);
+                } else {
+                    l_band->bandno = bandno + 1;
+                    /* x0b = 1 if bandno = 1 or 3 */
+                    l_x0b = l_band->bandno & 1;
+                    /* y0b = 1 if bandno = 2 or 3 */
+                    l_y0b = (OPJ_INT32)((l_band->bandno) >> 1);
+                    /* l_band border (global) */
+                    l_band->x0 = opj_int64_ceildivpow2(l_tilec->x0 - ((OPJ_INT64)l_x0b <<
+                                                       l_level_no), (OPJ_INT32)(l_level_no + 1));
+                    l_band->y0 = opj_int64_ceildivpow2(l_tilec->y0 - ((OPJ_INT64)l_y0b <<
+                                                       l_level_no), (OPJ_INT32)(l_level_no + 1));
+                    l_band->x1 = opj_int64_ceildivpow2(l_tilec->x1 - ((OPJ_INT64)l_x0b <<
+                                                       l_level_no), (OPJ_INT32)(l_level_no + 1));
+                    l_band->y1 = opj_int64_ceildivpow2(l_tilec->y1 - ((OPJ_INT64)l_y0b <<
+                                                       l_level_no), (OPJ_INT32)(l_level_no + 1));
+                }
+
+                if (isEncoder) {
+                    /* Skip empty bands */
+                    if (opj_tcd_is_band_empty(l_band)) {
+                        /* Do not zero l_band->precints to avoid leaks */
+                        /* but make sure we don't use it later, since */
+                        /* it will point to precincts of previous bands... */
+                        continue;
+                    }
+                }
+
+                /** avoid an if with storing function pointer */
+                l_gain = (*l_gain_ptr)(l_band->bandno);
+                numbps = (OPJ_INT32)(l_image_comp->prec + l_gain);
+                l_band->stepsize = (OPJ_FLOAT32)(((1.0 + l_step_size->mant / 2048.0) * pow(2.0,
+                                                  (OPJ_INT32)(numbps - l_step_size->expn)))) * fraction;
+                /* Mb value of Equation E-2 in "E.1 Inverse quantization
+                 * procedure" of the standard */
+                l_band->numbps = l_step_size->expn + (OPJ_INT32)l_tccp->numgbits -
+                                 1;
+
+                if (!l_band->precincts && (l_nb_precincts > 0U)) {
+                    l_band->precincts = (opj_tcd_precinct_t *) opj_malloc(/*3 * */
+                                            l_nb_precinct_size);
+                    if (! l_band->precincts) {
+                        opj_event_msg(manager, EVT_ERROR,
+                                      "Not enough memory to handle band precints\n");
+                        return OPJ_FALSE;
+                    }
+                    /*fprintf(stderr, "\t\t\t\tAllocate precincts of a band (opj_tcd_precinct_t): %d\n",l_nb_precinct_size);     */
+                    memset(l_band->precincts, 0, l_nb_precinct_size);
+                    l_band->precincts_data_size = l_nb_precinct_size;
+                } else if (l_band->precincts_data_size < l_nb_precinct_size) {
+
+                    opj_tcd_precinct_t * new_precincts = (opj_tcd_precinct_t *) opj_realloc(
+                            l_band->precincts,/*3 * */ l_nb_precinct_size);
+                    if (! new_precincts) {
+                        opj_event_msg(manager, EVT_ERROR,
+                                      "Not enough memory to handle band precints\n");
+                        opj_free(l_band->precincts);
+                        l_band->precincts = NULL;
+                        l_band->precincts_data_size = 0;
+                        return OPJ_FALSE;
+                    }
+                    l_band->precincts = new_precincts;
+                    /*fprintf(stderr, "\t\t\t\tReallocate precincts of a band (opj_tcd_precinct_t): from %d to %d\n",l_band->precincts_data_size, l_nb_precinct_size);*/
+                    memset(((OPJ_BYTE *) l_band->precincts) + l_band->precincts_data_size, 0,
+                           l_nb_precinct_size - l_band->precincts_data_size);
+                    l_band->precincts_data_size = l_nb_precinct_size;
+                }
+
+                l_current_precinct = l_band->precincts;
+                for (precno = 0; precno < l_nb_precincts; ++precno) {
+                    OPJ_INT32 tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
+                    OPJ_INT32 cbgxstart = tlcbgxstart + (OPJ_INT32)(precno % l_res->pw) *
+                                          (1 << cbgwidthexpn);
+                    OPJ_INT32 cbgystart = tlcbgystart + (OPJ_INT32)(precno / l_res->pw) *
+                                          (1 << cbgheightexpn);
+                    OPJ_INT32 cbgxend = cbgxstart + (1 << cbgwidthexpn);
+                    OPJ_INT32 cbgyend = cbgystart + (1 << cbgheightexpn);
+                    /*fprintf(stderr, "\t precno=%d; bandno=%d, resno=%d; compno=%d\n", precno, bandno , resno, compno);*/
+                    /*fprintf(stderr, "\t tlcbgxstart(=%d) + (precno(=%d) percent res->pw(=%d)) * (1 << cbgwidthexpn(=%d)) \n",tlcbgxstart,precno,l_res->pw,cbgwidthexpn);*/
+
+                    /* precinct size (global) */
+                    /*fprintf(stderr, "\t cbgxstart=%d, l_band->x0 = %d \n",cbgxstart, l_band->x0);*/
+
+                    l_current_precinct->x0 = opj_int_max(cbgxstart, l_band->x0);
+                    l_current_precinct->y0 = opj_int_max(cbgystart, l_band->y0);
+                    l_current_precinct->x1 = opj_int_min(cbgxend, l_band->x1);
+                    l_current_precinct->y1 = opj_int_min(cbgyend, l_band->y1);
+                    /*fprintf(stderr, "\t prc_x0=%d; prc_y0=%d, prc_x1=%d; prc_y1=%d\n",l_current_precinct->x0, l_current_precinct->y0 ,l_current_precinct->x1, l_current_precinct->y1);*/
+
+                    tlcblkxstart = opj_int_floordivpow2(l_current_precinct->x0,
+                                                        (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn;
+                    /*fprintf(stderr, "\t tlcblkxstart =%d\n",tlcblkxstart );*/
+                    tlcblkystart = opj_int_floordivpow2(l_current_precinct->y0,
+                                                        (OPJ_INT32)cblkheightexpn) << cblkheightexpn;
+                    /*fprintf(stderr, "\t tlcblkystart =%d\n",tlcblkystart );*/
+                    brcblkxend = opj_int_ceildivpow2(l_current_precinct->x1,
+                                                     (OPJ_INT32)cblkwidthexpn) << cblkwidthexpn;
+                    /*fprintf(stderr, "\t brcblkxend =%d\n",brcblkxend );*/
+                    brcblkyend = opj_int_ceildivpow2(l_current_precinct->y1,
+                                                     (OPJ_INT32)cblkheightexpn) << cblkheightexpn;
+                    /*fprintf(stderr, "\t brcblkyend =%d\n",brcblkyend );*/
+                    l_current_precinct->cw = (OPJ_UINT32)((brcblkxend - tlcblkxstart) >>
+                                                          cblkwidthexpn);
+                    l_current_precinct->ch = (OPJ_UINT32)((brcblkyend - tlcblkystart) >>
+                                                          cblkheightexpn);
+                    if (l_current_precinct->cw && ((OPJ_UINT32)-1) / l_current_precinct->cw < l_current_precinct->ch) {
+                        return OPJ_FALSE;
+                    }
+                    l_nb_code_blocks = l_current_precinct->cw * l_current_precinct->ch;
+                    /*fprintf(stderr, "\t\t\t\t precinct_cw = %d x recinct_ch = %d\n",l_current_precinct->cw, l_current_precinct->ch);      */
+
+                    if (((OPJ_UINT32)-1) / (OPJ_UINT32)sizeof_block < l_nb_code_blocks) {
+                        return OPJ_FALSE;
+                    }
+                    l_nb_code_blocks_size = l_nb_code_blocks * (OPJ_UINT32)sizeof_block;
+
+                    if (!l_current_precinct->cblks.blocks && (l_nb_code_blocks > 0U)) {
+                        l_current_precinct->cblks.blocks = opj_malloc(l_nb_code_blocks_size);
+                        if (! l_current_precinct->cblks.blocks) {
+                            return OPJ_FALSE;
+                        }
+                        /*fprintf(stderr, "\t\t\t\tAllocate cblks of a precinct (opj_tcd_cblk_dec_t): %d\n",l_nb_code_blocks_size);*/
+
+                        memset(l_current_precinct->cblks.blocks, 0, l_nb_code_blocks_size);
+
+                        l_current_precinct->block_size = l_nb_code_blocks_size;
+                    } else if (l_nb_code_blocks_size > l_current_precinct->block_size) {
+                        void *new_blocks = opj_realloc(l_current_precinct->cblks.blocks,
+                                                       l_nb_code_blocks_size);
+                        if (! new_blocks) {
+                            opj_free(l_current_precinct->cblks.blocks);
+                            l_current_precinct->cblks.blocks = NULL;
+                            l_current_precinct->block_size = 0;
+                            opj_event_msg(manager, EVT_ERROR,
+                                          "Not enough memory for current precinct codeblock element\n");
+                            return OPJ_FALSE;
+                        }
+                        l_current_precinct->cblks.blocks = new_blocks;
+                        /*fprintf(stderr, "\t\t\t\tReallocate cblks of a precinct (opj_tcd_cblk_dec_t): from %d to %d\n",l_current_precinct->block_size, l_nb_code_blocks_size);     */
+
+                        memset(((OPJ_BYTE *) l_current_precinct->cblks.blocks) +
+                               l_current_precinct->block_size
+                               , 0
+                               , l_nb_code_blocks_size - l_current_precinct->block_size);
+
+                        l_current_precinct->block_size = l_nb_code_blocks_size;
+                    }
+
+                    if (! l_current_precinct->incltree) {
+                        l_current_precinct->incltree = opj_tgt_create(l_current_precinct->cw,
+                                                       l_current_precinct->ch, manager);
+                    } else {
+                        l_current_precinct->incltree = opj_tgt_init(l_current_precinct->incltree,
+                                                       l_current_precinct->cw, l_current_precinct->ch, manager);
+                    }
+
+                    if (! l_current_precinct->imsbtree) {
+                        l_current_precinct->imsbtree = opj_tgt_create(l_current_precinct->cw,
+                                                       l_current_precinct->ch, manager);
+                    } else {
+                        l_current_precinct->imsbtree = opj_tgt_init(l_current_precinct->imsbtree,
+                                                       l_current_precinct->cw, l_current_precinct->ch, manager);
+                    }
+
+                    for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+                        OPJ_INT32 cblkxstart = tlcblkxstart + (OPJ_INT32)(cblkno %
+                                               l_current_precinct->cw) * (1 << cblkwidthexpn);
+                        OPJ_INT32 cblkystart = tlcblkystart + (OPJ_INT32)(cblkno /
+                                               l_current_precinct->cw) * (1 << cblkheightexpn);
+                        OPJ_INT32 cblkxend = cblkxstart + (1 << cblkwidthexpn);
+                        OPJ_INT32 cblkyend = cblkystart + (1 << cblkheightexpn);
+
+                        if (isEncoder) {
+                            opj_tcd_cblk_enc_t* l_code_block = l_current_precinct->cblks.enc + cblkno;
+
+                            if (! opj_tcd_code_block_enc_allocate(l_code_block)) {
+                                return OPJ_FALSE;
+                            }
+                            /* code-block size (global) */
+                            l_code_block->x0 = opj_int_max(cblkxstart, l_current_precinct->x0);
+                            l_code_block->y0 = opj_int_max(cblkystart, l_current_precinct->y0);
+                            l_code_block->x1 = opj_int_min(cblkxend, l_current_precinct->x1);
+                            l_code_block->y1 = opj_int_min(cblkyend, l_current_precinct->y1);
+
+                            if (! opj_tcd_code_block_enc_allocate_data(l_code_block)) {
+                                return OPJ_FALSE;
+                            }
+                        } else {
+                            opj_tcd_cblk_dec_t* l_code_block = l_current_precinct->cblks.dec + cblkno;
+
+                            if (! opj_tcd_code_block_dec_allocate(l_code_block)) {
+                                return OPJ_FALSE;
+                            }
+                            /* code-block size (global) */
+                            l_code_block->x0 = opj_int_max(cblkxstart, l_current_precinct->x0);
+                            l_code_block->y0 = opj_int_max(cblkystart, l_current_precinct->y0);
+                            l_code_block->x1 = opj_int_min(cblkxend, l_current_precinct->x1);
+                            l_code_block->y1 = opj_int_min(cblkyend, l_current_precinct->y1);
+                        }
+                    }
+                    ++l_current_precinct;
+                } /* precno */
+            } /* bandno */
+            ++l_res;
+        } /* resno */
+        ++l_tccp;
+        ++l_tilec;
+        ++l_image_comp;
+    } /* compno */
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_tcd_init_encode_tile (opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no, opj_event_mgr_t* p_manager)
+OPJ_BOOL opj_tcd_init_encode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
+                                  opj_event_mgr_t* p_manager)
 {
-	return opj_tcd_init_tile(p_tcd, p_tile_no, OPJ_TRUE, 1.0F, sizeof(opj_tcd_cblk_enc_t), p_manager);
+    return opj_tcd_init_tile(p_tcd, p_tile_no, OPJ_TRUE, 1.0F,
+                             sizeof(opj_tcd_cblk_enc_t), p_manager);
 }
 
-OPJ_BOOL opj_tcd_init_decode_tile (opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no, opj_event_mgr_t* p_manager)
+OPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
+                                  opj_event_mgr_t* p_manager)
 {
-	return opj_tcd_init_tile(p_tcd, p_tile_no, OPJ_FALSE, 0.5F, sizeof(opj_tcd_cblk_dec_t), p_manager);
+    return opj_tcd_init_tile(p_tcd, p_tile_no, OPJ_FALSE, 0.5F,
+                             sizeof(opj_tcd_cblk_dec_t), p_manager);
 }
 
 /**
  * Allocates memory for an encoding code block (but not data memory).
  */
-static OPJ_BOOL opj_tcd_code_block_enc_allocate (opj_tcd_cblk_enc_t * p_code_block)
+static OPJ_BOOL opj_tcd_code_block_enc_allocate(opj_tcd_cblk_enc_t *
+        p_code_block)
 {
-	if (! p_code_block->layers) {
-		/* no memset since data */
-		p_code_block->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t));
-		if (! p_code_block->layers) {
-			return OPJ_FALSE;
-		}
-	}
-	if (! p_code_block->passes) {
-		p_code_block->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t));
-		if (! p_code_block->passes) {
-			return OPJ_FALSE;
-		}
-	}
-	return OPJ_TRUE;
+    if (! p_code_block->layers) {
+        /* no memset since data */
+        p_code_block->layers = (opj_tcd_layer_t*) opj_calloc(100,
+                               sizeof(opj_tcd_layer_t));
+        if (! p_code_block->layers) {
+            return OPJ_FALSE;
+        }
+    }
+    if (! p_code_block->passes) {
+        p_code_block->passes = (opj_tcd_pass_t*) opj_calloc(100,
+                               sizeof(opj_tcd_pass_t));
+        if (! p_code_block->passes) {
+            return OPJ_FALSE;
+        }
+    }
+    return OPJ_TRUE;
 }
 
 /**
  * Allocates data memory for an encoding code block.
  */
-static OPJ_BOOL opj_tcd_code_block_enc_allocate_data (opj_tcd_cblk_enc_t * p_code_block)
+static OPJ_BOOL opj_tcd_code_block_enc_allocate_data(opj_tcd_cblk_enc_t *
+        p_code_block)
 {
-	OPJ_UINT32 l_data_size;
-	
-	l_data_size = (OPJ_UINT32)((p_code_block->x1 - p_code_block->x0) * (p_code_block->y1 - p_code_block->y0) * (OPJ_INT32)sizeof(OPJ_UINT32));
-	
-	if (l_data_size > p_code_block->data_size) {
-		if (p_code_block->data) {
-			opj_free(p_code_block->data - 1); /* again, why -1 */
-		}
-		p_code_block->data = (OPJ_BYTE*) opj_malloc(l_data_size+1);
-		if(! p_code_block->data) {
-			p_code_block->data_size = 0U;
-			return OPJ_FALSE;
-		}
-		p_code_block->data_size = l_data_size;
-		
-		p_code_block->data[0] = 0;
-		p_code_block->data+=1;   /*why +1 ?*/
-	}
-	return OPJ_TRUE;
+    OPJ_UINT32 l_data_size;
+
+    /* The +1 is needed for https://github.com/uclouvain/openjpeg/issues/835 */
+    l_data_size = 1 + (OPJ_UINT32)((p_code_block->x1 - p_code_block->x0) *
+                                   (p_code_block->y1 - p_code_block->y0) * (OPJ_INT32)sizeof(OPJ_UINT32));
+
+    if (l_data_size > p_code_block->data_size) {
+        if (p_code_block->data) {
+            /* We refer to data - 1 since below we incremented it */
+            opj_free(p_code_block->data - 1);
+        }
+        p_code_block->data = (OPJ_BYTE*) opj_malloc(l_data_size + 1);
+        if (! p_code_block->data) {
+            p_code_block->data_size = 0U;
+            return OPJ_FALSE;
+        }
+        p_code_block->data_size = l_data_size;
+
+        /* We reserve the initial byte as a fake byte to a non-FF value */
+        /* and increment the data pointer, so that opj_mqc_init_enc() */
+        /* can do bp = data - 1, and opj_mqc_byteout() can safely dereference */
+        /* it. */
+        p_code_block->data[0] = 0;
+        p_code_block->data += 1; /*why +1 ?*/
+    }
+    return OPJ_TRUE;
+}
+
+
+void opj_tcd_reinit_segment(opj_tcd_seg_t* seg)
+{
+    memset(seg, 0, sizeof(opj_tcd_seg_t));
 }
 
 /**
  * Allocates memory for a decoding code block.
  */
-static OPJ_BOOL opj_tcd_code_block_dec_allocate (opj_tcd_cblk_dec_t * p_code_block)
+static OPJ_BOOL opj_tcd_code_block_dec_allocate(opj_tcd_cblk_dec_t *
+        p_code_block)
 {
-        if (! p_code_block->data) {
+    if (! p_code_block->segs) {
 
-                p_code_block->data = (OPJ_BYTE*) opj_malloc(OPJ_J2K_DEFAULT_CBLK_DATA_SIZE);
-                if (! p_code_block->data) {
-                        return OPJ_FALSE;
-                }
-                p_code_block->data_max_size = OPJ_J2K_DEFAULT_CBLK_DATA_SIZE;
-                /*fprintf(stderr, "Allocate 8192 elements of code_block->data\n");*/
+        p_code_block->segs = (opj_tcd_seg_t *) opj_calloc(OPJ_J2K_DEFAULT_NB_SEGS,
+                             sizeof(opj_tcd_seg_t));
+        if (! p_code_block->segs) {
+            return OPJ_FALSE;
+        }
+        /*fprintf(stderr, "Allocate %d elements of code_block->data\n", OPJ_J2K_DEFAULT_NB_SEGS * sizeof(opj_tcd_seg_t));*/
 
-                p_code_block->segs = (opj_tcd_seg_t *) opj_calloc(OPJ_J2K_DEFAULT_NB_SEGS,sizeof(opj_tcd_seg_t));
-                if (! p_code_block->segs) {
-                        return OPJ_FALSE;
-                }
-                /*fprintf(stderr, "Allocate %d elements of code_block->data\n", OPJ_J2K_DEFAULT_NB_SEGS * sizeof(opj_tcd_seg_t));*/
-
-                p_code_block->m_current_max_segs = OPJ_J2K_DEFAULT_NB_SEGS;
-                /*fprintf(stderr, "m_current_max_segs of code_block->data = %d\n", p_code_block->m_current_max_segs);*/
-        } else {
-					/* sanitize */
-					OPJ_BYTE* l_data = p_code_block->data;
-					OPJ_UINT32 l_data_max_size = p_code_block->data_max_size;
-					opj_tcd_seg_t * l_segs = p_code_block->segs;
-					OPJ_UINT32 l_current_max_segs = p_code_block->m_current_max_segs;
-
-					memset(p_code_block, 0, sizeof(opj_tcd_cblk_dec_t));
-					p_code_block->data = l_data;
-					p_code_block->data_max_size = l_data_max_size;
-					p_code_block->segs = l_segs;
-					p_code_block->m_current_max_segs = l_current_max_segs;
-				}
-
-        return OPJ_TRUE;
-}
-
-OPJ_UINT32 opj_tcd_get_decoded_tile_size ( opj_tcd_t *p_tcd )
-{
+        p_code_block->m_current_max_segs = OPJ_J2K_DEFAULT_NB_SEGS;
+        /*fprintf(stderr, "m_current_max_segs of code_block->data = %d\n", p_code_block->m_current_max_segs);*/
+    } else {
+        /* sanitize */
+        opj_tcd_seg_t * l_segs = p_code_block->segs;
+        OPJ_UINT32 l_current_max_segs = p_code_block->m_current_max_segs;
+        opj_tcd_seg_data_chunk_t* l_chunks = p_code_block->chunks;
+        OPJ_UINT32 l_numchunksalloc = p_code_block->numchunksalloc;
         OPJ_UINT32 i;
-        OPJ_UINT32 l_data_size = 0;
-        opj_image_comp_t * l_img_comp = 00;
-        opj_tcd_tilecomp_t * l_tile_comp = 00;
-        opj_tcd_resolution_t * l_res = 00;
-        OPJ_UINT32 l_size_comp, l_remaining;
-        OPJ_UINT32 l_temp;
 
-        l_tile_comp = p_tcd->tcd_image->tiles->comps;
-        l_img_comp = p_tcd->image->comps;
-
-        for (i=0;i<p_tcd->image->numcomps;++i) {
-                l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
-                l_remaining = l_img_comp->prec & 7;  /* (%8) */
-
-                if(l_remaining) {
-                        ++l_size_comp;
-                }
-
-                if (l_size_comp == 3) {
-                        l_size_comp = 4;
-                }
-
-                l_res = l_tile_comp->resolutions + l_tile_comp->minimum_num_resolutions - 1;
-                l_temp = (OPJ_UINT32)((l_res->x1 - l_res->x0) * (l_res->y1 - l_res->y0)); /* x1*y1 can't overflow */
-
-                if (l_size_comp && ((OPJ_UINT32)-1) / l_size_comp < l_temp) {
-                        return (OPJ_UINT32)-1;
-                }
-                l_temp *= l_size_comp;
-
-                if (l_temp > ((OPJ_UINT32)-1) - l_data_size) {
-                        return (OPJ_UINT32)-1;
-                }
-                l_data_size += l_temp;
-
-                ++l_img_comp;
-                ++l_tile_comp;
+        memset(p_code_block, 0, sizeof(opj_tcd_cblk_dec_t));
+        p_code_block->segs = l_segs;
+        p_code_block->m_current_max_segs = l_current_max_segs;
+        for (i = 0; i < l_current_max_segs; ++i) {
+            opj_tcd_reinit_segment(&l_segs[i]);
         }
+        p_code_block->chunks = l_chunks;
+        p_code_block->numchunksalloc = l_numchunksalloc;
+    }
 
-        return l_data_size;
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_tcd_encode_tile(   opj_tcd_t *p_tcd,
-                                                        OPJ_UINT32 p_tile_no,
-                                                        OPJ_BYTE *p_dest,
-                                                        OPJ_UINT32 * p_data_written,
-                                                        OPJ_UINT32 p_max_length,
-                                                        opj_codestream_info_t *p_cstr_info)
+OPJ_UINT32 opj_tcd_get_decoded_tile_size(opj_tcd_t *p_tcd)
 {
+    OPJ_UINT32 i;
+    OPJ_UINT32 l_data_size = 0;
+    opj_image_comp_t * l_img_comp = 00;
+    opj_tcd_tilecomp_t * l_tile_comp = 00;
+    opj_tcd_resolution_t * l_res = 00;
+    OPJ_UINT32 l_size_comp, l_remaining;
+    OPJ_UINT32 l_temp;
 
-        if (p_tcd->cur_tp_num == 0) {
+    l_tile_comp = p_tcd->tcd_image->tiles->comps;
+    l_img_comp = p_tcd->image->comps;
 
-                p_tcd->tcd_tileno = p_tile_no;
-                p_tcd->tcp = &p_tcd->cp->tcps[p_tile_no];
+    for (i = 0; i < p_tcd->image->numcomps; ++i) {
+        l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
+        l_remaining = l_img_comp->prec & 7;  /* (%8) */
 
-                /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
-                if(p_cstr_info)  {
-                        OPJ_UINT32 l_num_packs = 0;
-                        OPJ_UINT32 i;
-                        opj_tcd_tilecomp_t *l_tilec_idx = &p_tcd->tcd_image->tiles->comps[0];        /* based on component 0 */
-                        opj_tccp_t *l_tccp = p_tcd->tcp->tccps; /* based on component 0 */
-
-                        for (i = 0; i < l_tilec_idx->numresolutions; i++) {
-                                opj_tcd_resolution_t *l_res_idx = &l_tilec_idx->resolutions[i];
-
-                                p_cstr_info->tile[p_tile_no].pw[i] = (int)l_res_idx->pw;
-                                p_cstr_info->tile[p_tile_no].ph[i] = (int)l_res_idx->ph;
-
-                                l_num_packs += l_res_idx->pw * l_res_idx->ph;
-                                p_cstr_info->tile[p_tile_no].pdx[i] = (int)l_tccp->prcw[i];
-                                p_cstr_info->tile[p_tile_no].pdy[i] = (int)l_tccp->prch[i];
-                        }
-                        p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t*) opj_calloc((size_t)p_cstr_info->numcomps * (size_t)p_cstr_info->numlayers * l_num_packs, sizeof(opj_packet_info_t));
-                        if (!p_cstr_info->tile[p_tile_no].packet) {
-                                /* FIXME event manager error callback */
-                                return OPJ_FALSE;
-                        }
-                }
-                /* << INDEX */
-
-                /* FIXME _ProfStart(PGROUP_DC_SHIFT); */
-                /*---------------TILE-------------------*/
-                if (! opj_tcd_dc_level_shift_encode(p_tcd)) {
-                        return OPJ_FALSE;
-                }
-                /* FIXME _ProfStop(PGROUP_DC_SHIFT); */
-
-                /* FIXME _ProfStart(PGROUP_MCT); */
-                if (! opj_tcd_mct_encode(p_tcd)) {
-                        return OPJ_FALSE;
-                }
-                /* FIXME _ProfStop(PGROUP_MCT); */
-
-                /* FIXME _ProfStart(PGROUP_DWT); */
-                if (! opj_tcd_dwt_encode(p_tcd)) {
-                        return OPJ_FALSE;
-                }
-                /* FIXME  _ProfStop(PGROUP_DWT); */
-
-                /* FIXME  _ProfStart(PGROUP_T1); */
-                if (! opj_tcd_t1_encode(p_tcd)) {
-                        return OPJ_FALSE;
-                }
-                /* FIXME _ProfStop(PGROUP_T1); */
-
-                /* FIXME _ProfStart(PGROUP_RATE); */
-                if (! opj_tcd_rate_allocate_encode(p_tcd,p_dest,p_max_length,p_cstr_info)) {
-                        return OPJ_FALSE;
-                }
-                /* FIXME _ProfStop(PGROUP_RATE); */
-
+        if (l_remaining) {
+            ++l_size_comp;
         }
-        /*--------------TIER2------------------*/
 
-        /* INDEX */
-        if (p_cstr_info) {
-                p_cstr_info->index_write = 1;
+        if (l_size_comp == 3) {
+            l_size_comp = 4;
         }
-        /* FIXME _ProfStart(PGROUP_T2); */
 
-        if (! opj_tcd_t2_encode(p_tcd,p_dest,p_data_written,p_max_length,p_cstr_info)) {
-                return OPJ_FALSE;
+        l_res = l_tile_comp->resolutions + l_tile_comp->minimum_num_resolutions - 1;
+        l_temp = (OPJ_UINT32)((l_res->x1 - l_res->x0) * (l_res->y1 -
+                              l_res->y0)); /* x1*y1 can't overflow */
+        if (l_size_comp && UINT_MAX / l_size_comp < l_temp) {
+            return UINT_MAX;
         }
-        /* FIXME _ProfStop(PGROUP_T2); */
+        l_temp *= l_size_comp;
 
-        /*---------------CLEAN-------------------*/
+        if (l_temp > UINT_MAX - l_data_size) {
+            return UINT_MAX;
+        }
+        l_data_size += l_temp;
+        ++l_img_comp;
+        ++l_tile_comp;
+    }
 
-        return OPJ_TRUE;
+    return l_data_size;
 }
 
-OPJ_BOOL opj_tcd_decode_tile(   opj_tcd_t *p_tcd,
-                                OPJ_BYTE *p_src,
-                                OPJ_UINT32 p_max_length,
-                                OPJ_UINT32 p_tile_no,
-                                opj_codestream_index_t *p_cstr_index,
-                                opj_event_mgr_t *p_manager
-                                )
+OPJ_BOOL opj_tcd_encode_tile(opj_tcd_t *p_tcd,
+                             OPJ_UINT32 p_tile_no,
+                             OPJ_BYTE *p_dest,
+                             OPJ_UINT32 * p_data_written,
+                             OPJ_UINT32 p_max_length,
+                             opj_codestream_info_t *p_cstr_info)
 {
-        OPJ_UINT32 l_data_read;
+
+    if (p_tcd->cur_tp_num == 0) {
+
         p_tcd->tcd_tileno = p_tile_no;
-        p_tcd->tcp = &(p_tcd->cp->tcps[p_tile_no]);
+        p_tcd->tcp = &p_tcd->cp->tcps[p_tile_no];
 
-#ifdef TODO_MSD /* FIXME */
-        /* INDEX >>  */
-        if(p_cstr_info) {
-                OPJ_UINT32 resno, compno, numprec = 0;
-                for (compno = 0; compno < (OPJ_UINT32) p_cstr_info->numcomps; compno++) {
-                        opj_tcp_t *tcp = &p_tcd->cp->tcps[0];
-                        opj_tccp_t *tccp = &tcp->tccps[compno];
-                        opj_tcd_tilecomp_t *tilec_idx = &p_tcd->tcd_image->tiles->comps[compno];
-                        for (resno = 0; resno < tilec_idx->numresolutions; resno++) {
-                                opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno];
-                                p_cstr_info->tile[p_tile_no].pw[resno] = res_idx->pw;
-                                p_cstr_info->tile[p_tile_no].ph[resno] = res_idx->ph;
-                                numprec += res_idx->pw * res_idx->ph;
-                                p_cstr_info->tile[p_tile_no].pdx[resno] = tccp->prcw[resno];
-                                p_cstr_info->tile[p_tile_no].pdy[resno] = tccp->prch[resno];
-                        }
-                }
-                p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t *) opj_malloc(p_cstr_info->numlayers * numprec * sizeof(opj_packet_info_t));
-                p_cstr_info->packno = 0;
+        /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
+        if (p_cstr_info)  {
+            OPJ_UINT32 l_num_packs = 0;
+            OPJ_UINT32 i;
+            opj_tcd_tilecomp_t *l_tilec_idx =
+                &p_tcd->tcd_image->tiles->comps[0];        /* based on component 0 */
+            opj_tccp_t *l_tccp = p_tcd->tcp->tccps; /* based on component 0 */
+
+            for (i = 0; i < l_tilec_idx->numresolutions; i++) {
+                opj_tcd_resolution_t *l_res_idx = &l_tilec_idx->resolutions[i];
+
+                p_cstr_info->tile[p_tile_no].pw[i] = (int)l_res_idx->pw;
+                p_cstr_info->tile[p_tile_no].ph[i] = (int)l_res_idx->ph;
+
+                l_num_packs += l_res_idx->pw * l_res_idx->ph;
+                p_cstr_info->tile[p_tile_no].pdx[i] = (int)l_tccp->prcw[i];
+                p_cstr_info->tile[p_tile_no].pdy[i] = (int)l_tccp->prch[i];
+            }
+            p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t*) opj_calloc((
+                    size_t)p_cstr_info->numcomps * (size_t)p_cstr_info->numlayers * l_num_packs,
+                                                  sizeof(opj_packet_info_t));
+            if (!p_cstr_info->tile[p_tile_no].packet) {
+                /* FIXME event manager error callback */
+                return OPJ_FALSE;
+            }
         }
         /* << INDEX */
-#endif
-
-        /*--------------TIER2------------------*/
-        /* FIXME _ProfStart(PGROUP_T2); */
-        l_data_read = 0;
-        if (! opj_tcd_t2_decode(p_tcd, p_src, &l_data_read, p_max_length, p_cstr_index, p_manager))
-        {
-                return OPJ_FALSE;
-        }
-        /* FIXME _ProfStop(PGROUP_T2); */
-
-        /*------------------TIER1-----------------*/
-
-        /* FIXME _ProfStart(PGROUP_T1); */
-        if
-                (! opj_tcd_t1_decode(p_tcd))
-        {
-                return OPJ_FALSE;
-        }
-        /* FIXME _ProfStop(PGROUP_T1); */
-
-        /*----------------DWT---------------------*/
-
-        /* FIXME _ProfStart(PGROUP_DWT); */
-        if
-                (! opj_tcd_dwt_decode(p_tcd))
-        {
-                return OPJ_FALSE;
-        }
-        /* FIXME _ProfStop(PGROUP_DWT); */
-
-        /*----------------MCT-------------------*/
-        /* FIXME _ProfStart(PGROUP_MCT); */
-        if
-                (! opj_tcd_mct_decode(p_tcd, p_manager))
-        {
-                return OPJ_FALSE;
-        }
-        /* FIXME _ProfStop(PGROUP_MCT); */
 
         /* FIXME _ProfStart(PGROUP_DC_SHIFT); */
-        if
-                (! opj_tcd_dc_level_shift_decode(p_tcd))
-        {
-                return OPJ_FALSE;
+        /*---------------TILE-------------------*/
+        if (! opj_tcd_dc_level_shift_encode(p_tcd)) {
+            return OPJ_FALSE;
         }
         /* FIXME _ProfStop(PGROUP_DC_SHIFT); */
 
+        /* FIXME _ProfStart(PGROUP_MCT); */
+        if (! opj_tcd_mct_encode(p_tcd)) {
+            return OPJ_FALSE;
+        }
+        /* FIXME _ProfStop(PGROUP_MCT); */
 
-        /*---------------TILE-------------------*/
-        return OPJ_TRUE;
+        /* FIXME _ProfStart(PGROUP_DWT); */
+        if (! opj_tcd_dwt_encode(p_tcd)) {
+            return OPJ_FALSE;
+        }
+        /* FIXME  _ProfStop(PGROUP_DWT); */
+
+        /* FIXME  _ProfStart(PGROUP_T1); */
+        if (! opj_tcd_t1_encode(p_tcd)) {
+            return OPJ_FALSE;
+        }
+        /* FIXME _ProfStop(PGROUP_T1); */
+
+        /* FIXME _ProfStart(PGROUP_RATE); */
+        if (! opj_tcd_rate_allocate_encode(p_tcd, p_dest, p_max_length, p_cstr_info)) {
+            return OPJ_FALSE;
+        }
+        /* FIXME _ProfStop(PGROUP_RATE); */
+
+    }
+    /*--------------TIER2------------------*/
+
+    /* INDEX */
+    if (p_cstr_info) {
+        p_cstr_info->index_write = 1;
+    }
+    /* FIXME _ProfStart(PGROUP_T2); */
+
+    if (! opj_tcd_t2_encode(p_tcd, p_dest, p_data_written, p_max_length,
+                            p_cstr_info)) {
+        return OPJ_FALSE;
+    }
+    /* FIXME _ProfStop(PGROUP_T2); */
+
+    /*---------------CLEAN-------------------*/
+
+    return OPJ_TRUE;
 }
 
-OPJ_BOOL opj_tcd_update_tile_data ( opj_tcd_t *p_tcd,
-                                    OPJ_BYTE * p_dest,
-                                    OPJ_UINT32 p_dest_length
-                                    )
+OPJ_BOOL opj_tcd_decode_tile(opj_tcd_t *p_tcd,
+                             OPJ_BYTE *p_src,
+                             OPJ_UINT32 p_max_length,
+                             OPJ_UINT32 p_tile_no,
+                             opj_codestream_index_t *p_cstr_index,
+                             opj_event_mgr_t *p_manager
+                            )
 {
-        OPJ_UINT32 i,j,k,l_data_size = 0;
-        opj_image_comp_t * l_img_comp = 00;
-        opj_tcd_tilecomp_t * l_tilec = 00;
-        opj_tcd_resolution_t * l_res;
-        OPJ_UINT32 l_size_comp, l_remaining;
-        OPJ_UINT32 l_stride, l_width,l_height;
+    OPJ_UINT32 l_data_read;
+    p_tcd->tcd_tileno = p_tile_no;
+    p_tcd->tcp = &(p_tcd->cp->tcps[p_tile_no]);
 
-        l_data_size = opj_tcd_get_decoded_tile_size(p_tcd);
-        if (l_data_size == (OPJ_UINT32)-1 || l_data_size > p_dest_length) {
-                return OPJ_FALSE;
+#ifdef TODO_MSD /* FIXME */
+    /* INDEX >>  */
+    if (p_cstr_info) {
+        OPJ_UINT32 resno, compno, numprec = 0;
+        for (compno = 0; compno < (OPJ_UINT32) p_cstr_info->numcomps; compno++) {
+            opj_tcp_t *tcp = &p_tcd->cp->tcps[0];
+            opj_tccp_t *tccp = &tcp->tccps[compno];
+            opj_tcd_tilecomp_t *tilec_idx = &p_tcd->tcd_image->tiles->comps[compno];
+            for (resno = 0; resno < tilec_idx->numresolutions; resno++) {
+                opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno];
+                p_cstr_info->tile[p_tile_no].pw[resno] = res_idx->pw;
+                p_cstr_info->tile[p_tile_no].ph[resno] = res_idx->ph;
+                numprec += res_idx->pw * res_idx->ph;
+                p_cstr_info->tile[p_tile_no].pdx[resno] = tccp->prcw[resno];
+                p_cstr_info->tile[p_tile_no].pdy[resno] = tccp->prch[resno];
+            }
+        }
+        p_cstr_info->tile[p_tile_no].packet = (opj_packet_info_t *) opj_malloc(
+                p_cstr_info->numlayers * numprec * sizeof(opj_packet_info_t));
+        p_cstr_info->packno = 0;
+    }
+    /* << INDEX */
+#endif
+
+    /*--------------TIER2------------------*/
+    /* FIXME _ProfStart(PGROUP_T2); */
+    l_data_read = 0;
+    if (! opj_tcd_t2_decode(p_tcd, p_src, &l_data_read, p_max_length, p_cstr_index,
+                            p_manager)) {
+        return OPJ_FALSE;
+    }
+    /* FIXME _ProfStop(PGROUP_T2); */
+
+    /*------------------TIER1-----------------*/
+
+    /* FIXME _ProfStart(PGROUP_T1); */
+    if (! opj_tcd_t1_decode(p_tcd, p_manager)) {
+        return OPJ_FALSE;
+    }
+    /* FIXME _ProfStop(PGROUP_T1); */
+
+    /*----------------DWT---------------------*/
+
+    /* FIXME _ProfStart(PGROUP_DWT); */
+    if
+    (! opj_tcd_dwt_decode(p_tcd)) {
+        return OPJ_FALSE;
+    }
+    /* FIXME _ProfStop(PGROUP_DWT); */
+
+    /*----------------MCT-------------------*/
+    /* FIXME _ProfStart(PGROUP_MCT); */
+    if
+    (! opj_tcd_mct_decode(p_tcd, p_manager)) {
+        return OPJ_FALSE;
+    }
+    /* FIXME _ProfStop(PGROUP_MCT); */
+
+    /* FIXME _ProfStart(PGROUP_DC_SHIFT); */
+    if
+    (! opj_tcd_dc_level_shift_decode(p_tcd)) {
+        return OPJ_FALSE;
+    }
+    /* FIXME _ProfStop(PGROUP_DC_SHIFT); */
+
+
+    /*---------------TILE-------------------*/
+    return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_update_tile_data(opj_tcd_t *p_tcd,
+                                  OPJ_BYTE * p_dest,
+                                  OPJ_UINT32 p_dest_length
+                                 )
+{
+    OPJ_UINT32 i, j, k, l_data_size = 0;
+    opj_image_comp_t * l_img_comp = 00;
+    opj_tcd_tilecomp_t * l_tilec = 00;
+    opj_tcd_resolution_t * l_res;
+    OPJ_UINT32 l_size_comp, l_remaining;
+    OPJ_UINT32 l_stride, l_width, l_height;
+
+    l_data_size = opj_tcd_get_decoded_tile_size(p_tcd);
+    if (l_data_size == UINT_MAX || l_data_size > p_dest_length) {
+        return OPJ_FALSE;
+    }
+
+    l_tilec = p_tcd->tcd_image->tiles->comps;
+    l_img_comp = p_tcd->image->comps;
+
+    for (i = 0; i < p_tcd->image->numcomps; ++i) {
+        l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
+        l_remaining = l_img_comp->prec & 7;  /* (%8) */
+        l_res = l_tilec->resolutions + l_img_comp->resno_decoded;
+        l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0);
+        l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0);
+        l_stride = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0) - l_width;
+
+        if (l_remaining) {
+            ++l_size_comp;
         }
 
-        l_tilec = p_tcd->tcd_image->tiles->comps;
-        l_img_comp = p_tcd->image->comps;
-
-        for (i=0;i<p_tcd->image->numcomps;++i) {
-                l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
-                l_remaining = l_img_comp->prec & 7;  /* (%8) */
-                l_res = l_tilec->resolutions + l_img_comp->resno_decoded;
-                l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0);
-                l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0);
-                l_stride = (OPJ_UINT32)(l_tilec->x1 - l_tilec->x0) - l_width;
-
-                if (l_remaining) {
-                        ++l_size_comp;
-                }
-
-                if (l_size_comp == 3) {
-                        l_size_comp = 4;
-                }
-
-                switch (l_size_comp)
-                        {
-                        case 1:
-                                {
-                                        OPJ_CHAR * l_dest_ptr = (OPJ_CHAR *) p_dest;
-                                        const OPJ_INT32 * l_src_ptr = l_tilec->data;
-
-                                        if (l_img_comp->sgnd) {
-                                                for (j=0;j<l_height;++j) {
-                                                        for (k=0;k<l_width;++k) {
-                                                                *(l_dest_ptr++) = (OPJ_CHAR) (*(l_src_ptr++));
-                                                        }
-                                                        l_src_ptr += l_stride;
-                                                }
-                                        }
-                                        else {
-                                                for (j=0;j<l_height;++j) {
-                                                        for     (k=0;k<l_width;++k) {
-                                                                *(l_dest_ptr++) = (OPJ_CHAR) ((*(l_src_ptr++))&0xff);
-                                                        }
-                                                        l_src_ptr += l_stride;
-                                                }
-                                        }
-
-                                        p_dest = (OPJ_BYTE *)l_dest_ptr;
-                                }
-                                break;
-                        case 2:
-                                {
-                                        const OPJ_INT32 * l_src_ptr = l_tilec->data;
-                                        OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_dest;
-
-                                        if (l_img_comp->sgnd) {
-                                                for (j=0;j<l_height;++j) {
-                                                        for (k=0;k<l_width;++k) {
-                                                                *(l_dest_ptr++) = (OPJ_INT16) (*(l_src_ptr++));
-                                                        }
-                                                        l_src_ptr += l_stride;
-                                                }
-                                        }
-                                        else {
-                                                for (j=0;j<l_height;++j) {
-                                                        for (k=0;k<l_width;++k) {
-                                                                *(l_dest_ptr++) = (OPJ_INT16) ((*(l_src_ptr++))&0xffff);
-                                                        }
-                                                        l_src_ptr += l_stride;
-                                                }
-                                        }
-
-                                        p_dest = (OPJ_BYTE*) l_dest_ptr;
-                                }
-                                break;
-                        case 4:
-                                {
-                                        OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_dest;
-                                        OPJ_INT32 * l_src_ptr = l_tilec->data;
-
-                                        for (j=0;j<l_height;++j) {
-                                                for (k=0;k<l_width;++k) {
-                                                        *(l_dest_ptr++) = (*(l_src_ptr++));
-                                                }
-                                                l_src_ptr += l_stride;
-                                        }
-
-                                        p_dest = (OPJ_BYTE*) l_dest_ptr;
-                                }
-                                break;
-                }
-
-                ++l_img_comp;
-                ++l_tilec;
+        if (l_size_comp == 3) {
+            l_size_comp = 4;
         }
 
-        return OPJ_TRUE;
+        switch (l_size_comp) {
+        case 1: {
+            OPJ_CHAR * l_dest_ptr = (OPJ_CHAR *) p_dest;
+            const OPJ_INT32 * l_src_ptr = l_tilec->data;
+
+            if (l_img_comp->sgnd) {
+                for (j = 0; j < l_height; ++j) {
+                    for (k = 0; k < l_width; ++k) {
+                        *(l_dest_ptr++) = (OPJ_CHAR)(*(l_src_ptr++));
+                    }
+                    l_src_ptr += l_stride;
+                }
+            } else {
+                for (j = 0; j < l_height; ++j) {
+                    for (k = 0; k < l_width; ++k) {
+                        *(l_dest_ptr++) = (OPJ_CHAR)((*(l_src_ptr++)) & 0xff);
+                    }
+                    l_src_ptr += l_stride;
+                }
+            }
+
+            p_dest = (OPJ_BYTE *)l_dest_ptr;
+        }
+        break;
+        case 2: {
+            const OPJ_INT32 * l_src_ptr = l_tilec->data;
+            OPJ_INT16 * l_dest_ptr = (OPJ_INT16 *) p_dest;
+
+            if (l_img_comp->sgnd) {
+                for (j = 0; j < l_height; ++j) {
+                    for (k = 0; k < l_width; ++k) {
+                        OPJ_INT16 val = (OPJ_INT16)(*(l_src_ptr++));
+                        memcpy(l_dest_ptr, &val, sizeof(val));
+                        l_dest_ptr ++;
+                    }
+                    l_src_ptr += l_stride;
+                }
+            } else {
+                for (j = 0; j < l_height; ++j) {
+                    for (k = 0; k < l_width; ++k) {
+                        OPJ_INT16 val = (OPJ_INT16)((*(l_src_ptr++)) & 0xffff);
+                        memcpy(l_dest_ptr, &val, sizeof(val));
+                        l_dest_ptr ++;
+                    }
+                    l_src_ptr += l_stride;
+                }
+            }
+
+            p_dest = (OPJ_BYTE*) l_dest_ptr;
+        }
+        break;
+        case 4: {
+            OPJ_INT32 * l_dest_ptr = (OPJ_INT32 *) p_dest;
+            OPJ_INT32 * l_src_ptr = l_tilec->data;
+
+            for (j = 0; j < l_height; ++j) {
+                memcpy(l_dest_ptr, l_src_ptr, l_width * sizeof(OPJ_INT32));
+                l_dest_ptr += l_width;
+                l_src_ptr += l_width + l_stride;
+            }
+
+            p_dest = (OPJ_BYTE*) l_dest_ptr;
+        }
+        break;
+        }
+
+        ++l_img_comp;
+        ++l_tilec;
+    }
+
+    return OPJ_TRUE;
 }
 
 
@@ -1492,747 +1595,765 @@
 
 static void opj_tcd_free_tile(opj_tcd_t *p_tcd)
 {
-        OPJ_UINT32 compno, resno, bandno, precno;
-        opj_tcd_tile_t *l_tile = 00;
-        opj_tcd_tilecomp_t *l_tile_comp = 00;
-        opj_tcd_resolution_t *l_res = 00;
-        opj_tcd_band_t *l_band = 00;
-        opj_tcd_precinct_t *l_precinct = 00;
-        OPJ_UINT32 l_nb_resolutions, l_nb_precincts;
-        void (* l_tcd_code_block_deallocate) (opj_tcd_precinct_t *) = 00;
+    OPJ_UINT32 compno, resno, bandno, precno;
+    opj_tcd_tile_t *l_tile = 00;
+    opj_tcd_tilecomp_t *l_tile_comp = 00;
+    opj_tcd_resolution_t *l_res = 00;
+    opj_tcd_band_t *l_band = 00;
+    opj_tcd_precinct_t *l_precinct = 00;
+    OPJ_UINT32 l_nb_resolutions, l_nb_precincts;
+    void (* l_tcd_code_block_deallocate)(opj_tcd_precinct_t *) = 00;
 
-        if (! p_tcd) {
-                return;
-        }
+    if (! p_tcd) {
+        return;
+    }
 
-        if (! p_tcd->tcd_image) {
-                return;
-        }
+    if (! p_tcd->tcd_image) {
+        return;
+    }
 
-        if (p_tcd->m_is_decoder) {
-                l_tcd_code_block_deallocate = opj_tcd_code_block_dec_deallocate;
-        }
-        else {
-                l_tcd_code_block_deallocate = opj_tcd_code_block_enc_deallocate;
-        }
+    if (p_tcd->m_is_decoder) {
+        l_tcd_code_block_deallocate = opj_tcd_code_block_dec_deallocate;
+    } else {
+        l_tcd_code_block_deallocate = opj_tcd_code_block_enc_deallocate;
+    }
 
-        l_tile = p_tcd->tcd_image->tiles;
-        if (! l_tile) {
-                return;
-        }
+    l_tile = p_tcd->tcd_image->tiles;
+    if (! l_tile) {
+        return;
+    }
 
-        l_tile_comp = l_tile->comps;
+    l_tile_comp = l_tile->comps;
 
-        for (compno = 0; compno < l_tile->numcomps; ++compno) {
-                l_res = l_tile_comp->resolutions;
-                if (l_res) {
+    for (compno = 0; compno < l_tile->numcomps; ++compno) {
+        l_res = l_tile_comp->resolutions;
+        if (l_res) {
 
-                        l_nb_resolutions = l_tile_comp->resolutions_size / sizeof(opj_tcd_resolution_t);
-                        for (resno = 0; resno < l_nb_resolutions; ++resno) {
-                                l_band = l_res->bands;
-                                for     (bandno = 0; bandno < 3; ++bandno) {
-                                        l_precinct = l_band->precincts;
-                                        if (l_precinct) {
+            l_nb_resolutions = l_tile_comp->resolutions_size / sizeof(opj_tcd_resolution_t);
+            for (resno = 0; resno < l_nb_resolutions; ++resno) {
+                l_band = l_res->bands;
+                for (bandno = 0; bandno < 3; ++bandno) {
+                    l_precinct = l_band->precincts;
+                    if (l_precinct) {
 
-                                                l_nb_precincts = l_band->precincts_data_size / sizeof(opj_tcd_precinct_t);
-                                                for (precno = 0; precno < l_nb_precincts; ++precno) {
-                                                        opj_tgt_destroy(l_precinct->incltree);
-                                                        l_precinct->incltree = 00;
-                                                        opj_tgt_destroy(l_precinct->imsbtree);
-                                                        l_precinct->imsbtree = 00;
-                                                        (*l_tcd_code_block_deallocate) (l_precinct);
-                                                        ++l_precinct;
-                                                }
-
-                                                opj_free(l_band->precincts);
-                                                l_band->precincts = 00;
-                                        }
-                                        ++l_band;
-                                } /* for (resno */
-                                ++l_res;
+                        l_nb_precincts = l_band->precincts_data_size / sizeof(opj_tcd_precinct_t);
+                        for (precno = 0; precno < l_nb_precincts; ++precno) {
+                            opj_tgt_destroy(l_precinct->incltree);
+                            l_precinct->incltree = 00;
+                            opj_tgt_destroy(l_precinct->imsbtree);
+                            l_precinct->imsbtree = 00;
+                            (*l_tcd_code_block_deallocate)(l_precinct);
+                            ++l_precinct;
                         }
 
-                        opj_free(l_tile_comp->resolutions);
-                        l_tile_comp->resolutions = 00;
-                }
+                        opj_free(l_band->precincts);
+                        l_band->precincts = 00;
+                    }
+                    ++l_band;
+                } /* for (resno */
+                ++l_res;
+            }
 
-                if (l_tile_comp->ownsData && l_tile_comp->data) {
-                        opj_free(l_tile_comp->data);
-                        l_tile_comp->data = 00;
-                        l_tile_comp->ownsData = 0;
-                        l_tile_comp->data_size = 0;
-                        l_tile_comp->data_size_needed = 0;
-                }
-                ++l_tile_comp;
+            opj_free(l_tile_comp->resolutions);
+            l_tile_comp->resolutions = 00;
         }
 
-        opj_free(l_tile->comps);
-        l_tile->comps = 00;
-        opj_free(p_tcd->tcd_image->tiles);
-        p_tcd->tcd_image->tiles = 00;
+        if (l_tile_comp->ownsData && l_tile_comp->data) {
+            opj_image_data_free(l_tile_comp->data);
+            l_tile_comp->data = 00;
+            l_tile_comp->ownsData = 0;
+            l_tile_comp->data_size = 0;
+            l_tile_comp->data_size_needed = 0;
+        }
+        ++l_tile_comp;
+    }
+
+    opj_free(l_tile->comps);
+    l_tile->comps = 00;
+    opj_free(p_tcd->tcd_image->tiles);
+    p_tcd->tcd_image->tiles = 00;
 }
 
 
-static OPJ_BOOL opj_tcd_t2_decode (opj_tcd_t *p_tcd,
-                            OPJ_BYTE * p_src_data,
-                            OPJ_UINT32 * p_data_read,
-                            OPJ_UINT32 p_max_src_size,
-                            opj_codestream_index_t *p_cstr_index,
-                            opj_event_mgr_t *p_manager
-                            )
+static OPJ_BOOL opj_tcd_t2_decode(opj_tcd_t *p_tcd,
+                                  OPJ_BYTE * p_src_data,
+                                  OPJ_UINT32 * p_data_read,
+                                  OPJ_UINT32 p_max_src_size,
+                                  opj_codestream_index_t *p_cstr_index,
+                                  opj_event_mgr_t *p_manager
+                                 )
 {
-        opj_t2_t * l_t2;
+    opj_t2_t * l_t2;
 
-        l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp);
-        if (l_t2 == 00) {
-                return OPJ_FALSE;
-        }
+    l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp);
+    if (l_t2 == 00) {
+        return OPJ_FALSE;
+    }
 
-        if (! opj_t2_decode_packets(
-                                        l_t2,
-                                        p_tcd->tcd_tileno,
-                                        p_tcd->tcd_image->tiles,
-                                        p_src_data,
-                                        p_data_read,
-                                        p_max_src_size,
-                                        p_cstr_index,
-                                        p_manager)) {
-                opj_t2_destroy(l_t2);
-                return OPJ_FALSE;
-        }
-
+    if (! opj_t2_decode_packets(
+                l_t2,
+                p_tcd->tcd_tileno,
+                p_tcd->tcd_image->tiles,
+                p_src_data,
+                p_data_read,
+                p_max_src_size,
+                p_cstr_index,
+                p_manager)) {
         opj_t2_destroy(l_t2);
+        return OPJ_FALSE;
+    }
 
-        /*---------------CLEAN-------------------*/
-        return OPJ_TRUE;
+    opj_t2_destroy(l_t2);
+
+    /*---------------CLEAN-------------------*/
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_tcd_t1_decode ( opj_tcd_t *p_tcd )
+static OPJ_BOOL opj_tcd_t1_decode(opj_tcd_t *p_tcd, opj_event_mgr_t *p_manager)
 {
-        OPJ_UINT32 compno;
-        opj_t1_t * l_t1;
-        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
-        opj_tcd_tilecomp_t* l_tile_comp = l_tile->comps;
-        opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
+    OPJ_UINT32 compno;
+    opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+    opj_tcd_tilecomp_t* l_tile_comp = l_tile->comps;
+    opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
+    volatile OPJ_BOOL ret = OPJ_TRUE;
+    OPJ_BOOL check_pterm = OPJ_FALSE;
+    opj_mutex_t* p_manager_mutex = NULL;
 
+    p_manager_mutex = opj_mutex_create();
 
-        l_t1 = opj_t1_create(OPJ_FALSE);
-        if (l_t1 == 00) {
-                return OPJ_FALSE;
+    /* Only enable PTERM check if we decode all layers */
+    if (p_tcd->tcp->num_layers_to_decode == p_tcd->tcp->numlayers &&
+            (l_tccp->cblksty & J2K_CCP_CBLKSTY_PTERM) != 0) {
+        check_pterm = OPJ_TRUE;
+    }
+
+    for (compno = 0; compno < l_tile->numcomps; ++compno) {
+        opj_t1_decode_cblks(p_tcd->thread_pool, &ret, l_tile_comp, l_tccp,
+                            p_manager, p_manager_mutex, check_pterm);
+        if (!ret) {
+            break;
         }
+        ++l_tile_comp;
+        ++l_tccp;
+    }
 
-        for (compno = 0; compno < l_tile->numcomps; ++compno) {
-                /* The +3 is headroom required by the vectorized DWT */
-                if (OPJ_FALSE == opj_t1_decode_cblks(l_t1, l_tile_comp, l_tccp)) {
-                        opj_t1_destroy(l_t1);
-                        return OPJ_FALSE;
-                }
-                ++l_tile_comp;
-                ++l_tccp;
-        }
-
-        opj_t1_destroy(l_t1);
-
-        return OPJ_TRUE;
+    opj_thread_pool_wait_completion(p_tcd->thread_pool, 0);
+    if (p_manager_mutex) {
+        opj_mutex_destroy(p_manager_mutex);
+    }
+    return ret;
 }
 
 
-static OPJ_BOOL opj_tcd_dwt_decode ( opj_tcd_t *p_tcd )
+static OPJ_BOOL opj_tcd_dwt_decode(opj_tcd_t *p_tcd)
 {
-        OPJ_UINT32 compno;
-        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
-        opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps;
-        opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
-        opj_image_comp_t * l_img_comp = p_tcd->image->comps;
+    OPJ_UINT32 compno;
+    opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+    opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps;
+    opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
+    opj_image_comp_t * l_img_comp = p_tcd->image->comps;
 
-        for (compno = 0; compno < l_tile->numcomps; compno++) {
-                /*
-                if (tcd->cp->reduce != 0) {
-                        tcd->image->comps[compno].resno_decoded =
-                                tile->comps[compno].numresolutions - tcd->cp->reduce - 1;
-                        if (tcd->image->comps[compno].resno_decoded < 0)
-                        {
-                                return false;
-                        }
-                }
-                numres2decode = tcd->image->comps[compno].resno_decoded + 1;
-                if(numres2decode > 0){
-                */
-
-                if (l_tccp->qmfbid == 1) {
-                        if (! opj_dwt_decode(l_tile_comp, l_img_comp->resno_decoded+1)) {
-                                return OPJ_FALSE;
-                        }
-                }
-                else {
-                        if (! opj_dwt_decode_real(l_tile_comp, l_img_comp->resno_decoded+1)) {
-                                return OPJ_FALSE;
-                        }
-                }
-
-                ++l_tile_comp;
-                ++l_img_comp;
-                ++l_tccp;
-        }
-
-        return OPJ_TRUE;
-}
-static OPJ_BOOL opj_tcd_mct_decode ( opj_tcd_t *p_tcd, opj_event_mgr_t *p_manager)
-{
-        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
-        opj_tcp_t * l_tcp = p_tcd->tcp;
-        opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps;
-        OPJ_UINT32 l_samples,i;
-
-        if (! l_tcp->mct) {
-                return OPJ_TRUE;
-        }
-
-        l_samples = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) * (l_tile_comp->y1 - l_tile_comp->y0));
-
-        if (l_tile->numcomps >= 3 ){
-                /* testcase 1336.pdf.asan.47.376 */
-                if ((l_tile->comps[0].x1 - l_tile->comps[0].x0) * (l_tile->comps[0].y1 - l_tile->comps[0].y0) < (OPJ_INT32)l_samples ||
-                    (l_tile->comps[1].x1 - l_tile->comps[1].x0) * (l_tile->comps[1].y1 - l_tile->comps[1].y0) < (OPJ_INT32)l_samples ||
-                    (l_tile->comps[2].x1 - l_tile->comps[2].x0) * (l_tile->comps[2].y1 - l_tile->comps[2].y0) < (OPJ_INT32)l_samples) {
-                        opj_event_msg(p_manager, EVT_ERROR, "Tiles don't all have the same dimension. Skip the MCT step.\n");
-                        return OPJ_FALSE;
-                }
-                else if (l_tcp->mct == 2) {
-                        OPJ_BYTE ** l_data;
-
-                        if (! l_tcp->m_mct_decoding_matrix) {
-                                return OPJ_TRUE;
-                        }
-
-                        l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps*sizeof(OPJ_BYTE*));
-                        if (! l_data) {
-                                return OPJ_FALSE;
-                        }
-
-                        for (i=0;i<l_tile->numcomps;++i) {
-                                l_data[i] = (OPJ_BYTE*) l_tile_comp->data;
-                                ++l_tile_comp;
-                        }
-
-                        if (! opj_mct_decode_custom(/* MCT data */
-                                                                        (OPJ_BYTE*) l_tcp->m_mct_decoding_matrix,
-                                                                        /* size of components */
-                                                                        l_samples,
-                                                                        /* components */
-                                                                        l_data,
-                                                                        /* nb of components (i.e. size of pData) */
-                                                                        l_tile->numcomps,
-                                                                        /* tells if the data is signed */
-                                                                        p_tcd->image->comps->sgnd)) {
-                                opj_free(l_data);
-                                return OPJ_FALSE;
-                        }
-
-                        opj_free(l_data);
-                }
-                else {
-                        if (l_tcp->tccps->qmfbid == 1) {
-                                opj_mct_decode(     l_tile->comps[0].data,
-                                                        l_tile->comps[1].data,
-                                                        l_tile->comps[2].data,
-                                                        l_samples);
-                        }
-                        else {
-                            opj_mct_decode_real((OPJ_FLOAT32*)l_tile->comps[0].data,
-                                                (OPJ_FLOAT32*)l_tile->comps[1].data,
-                                                (OPJ_FLOAT32*)l_tile->comps[2].data,
-                                                l_samples);
-                        }
-                }
-        }
-        else {
-                opj_event_msg(p_manager, EVT_ERROR, "Number of components (%d) is inconsistent with a MCT. Skip the MCT step.\n",l_tile->numcomps);
-        }
-
-        return OPJ_TRUE;
-}
-
-
-static OPJ_BOOL opj_tcd_dc_level_shift_decode ( opj_tcd_t *p_tcd )
-{
-        OPJ_UINT32 compno;
-        opj_tcd_tilecomp_t * l_tile_comp = 00;
-        opj_tccp_t * l_tccp = 00;
-        opj_image_comp_t * l_img_comp = 00;
-        opj_tcd_resolution_t* l_res = 00;
-        opj_tcd_tile_t * l_tile;
-        OPJ_UINT32 l_width,l_height,i,j;
-        OPJ_INT32 * l_current_ptr;
-        OPJ_INT32 l_min, l_max;
-        OPJ_UINT32 l_stride;
-
-        l_tile = p_tcd->tcd_image->tiles;
-        l_tile_comp = l_tile->comps;
-        l_tccp = p_tcd->tcp->tccps;
-        l_img_comp = p_tcd->image->comps;
-
-        for (compno = 0; compno < l_tile->numcomps; compno++) {
-                l_res = l_tile_comp->resolutions + l_img_comp->resno_decoded;
-                l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0);
-                l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0);
-                l_stride = (OPJ_UINT32)(l_tile_comp->x1 - l_tile_comp->x0) - l_width;
-
-                assert(l_height == 0 || l_width + l_stride <= l_tile_comp->data_size / l_height); /*MUPDF*/
-
-                if (l_img_comp->sgnd) {
-                        l_min = -(1 << (l_img_comp->prec - 1));
-                        l_max = (1 << (l_img_comp->prec - 1)) - 1;
-                }
-                else {
-            l_min = 0;
-                        l_max = (1 << l_img_comp->prec) - 1;
-                }
-
-                l_current_ptr = l_tile_comp->data;
-
-                if (l_tccp->qmfbid == 1) {
-                        for (j=0;j<l_height;++j) {
-                                for (i = 0; i < l_width; ++i) {
-                                        *l_current_ptr = opj_int_clamp(*l_current_ptr + l_tccp->m_dc_level_shift, l_min, l_max);
-                                        ++l_current_ptr;
-                                }
-                                l_current_ptr += l_stride;
-                        }
-                }
-                else {
-                        for (j=0;j<l_height;++j) {
-                                for (i = 0; i < l_width; ++i) {
-                                        OPJ_FLOAT32 l_value = *((OPJ_FLOAT32 *) l_current_ptr);
-                                        *l_current_ptr = opj_int_clamp((OPJ_INT32)opj_lrintf(l_value) + l_tccp->m_dc_level_shift, l_min, l_max); ;
-                                        ++l_current_ptr;
-                                }
-                                l_current_ptr += l_stride;
-                        }
-                }
-
-                ++l_img_comp;
-                ++l_tccp;
-                ++l_tile_comp;
-        }
-
-        return OPJ_TRUE;
-}
-
-
-
-/**
- * Deallocates the encoding data of the given precinct.
- */
-static void opj_tcd_code_block_dec_deallocate (opj_tcd_precinct_t * p_precinct)
-{
-        OPJ_UINT32 cblkno , l_nb_code_blocks;
-
-        opj_tcd_cblk_dec_t * l_code_block = p_precinct->cblks.dec;
-        if (l_code_block) {
-                /*fprintf(stderr,"deallocate codeblock:{\n");*/
-                /*fprintf(stderr,"\t x0=%d, y0=%d, x1=%d, y1=%d\n",l_code_block->x0, l_code_block->y0, l_code_block->x1, l_code_block->y1);*/
-                /*fprintf(stderr,"\t numbps=%d, numlenbits=%d, len=%d, numnewpasses=%d, real_num_segs=%d, m_current_max_segs=%d\n ",
-                                l_code_block->numbps, l_code_block->numlenbits, l_code_block->len, l_code_block->numnewpasses, l_code_block->real_num_segs, l_code_block->m_current_max_segs );*/
-
-
-                l_nb_code_blocks = p_precinct->block_size / sizeof(opj_tcd_cblk_dec_t);
-                /*fprintf(stderr,"nb_code_blocks =%d\t}\n", l_nb_code_blocks);*/
-
-                for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
-
-                        if (l_code_block->data) {
-                                opj_free(l_code_block->data);
-                                l_code_block->data = 00;
-                        }
-
-                        if (l_code_block->segs) {
-                                opj_free(l_code_block->segs );
-                                l_code_block->segs = 00;
-                        }
-
-                        ++l_code_block;
-                }
-
-                opj_free(p_precinct->cblks.dec);
-                p_precinct->cblks.dec = 00;
-        }
-}
-
-/**
- * Deallocates the encoding data of the given precinct.
- */
-static void opj_tcd_code_block_enc_deallocate (opj_tcd_precinct_t * p_precinct)
-{       
-        OPJ_UINT32 cblkno , l_nb_code_blocks;
-
-        opj_tcd_cblk_enc_t * l_code_block = p_precinct->cblks.enc;
-        if (l_code_block) {
-                l_nb_code_blocks = p_precinct->block_size / sizeof(opj_tcd_cblk_enc_t);
-                
-                for     (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno)  {
-                        if (l_code_block->data) {
-                                opj_free(l_code_block->data - 1);
-                                l_code_block->data = 00;
-                        }
-
-                        if (l_code_block->layers) {
-                                opj_free(l_code_block->layers );
-                                l_code_block->layers = 00;
-                        }
-
-                        if (l_code_block->passes) {
-                                opj_free(l_code_block->passes );
-                                l_code_block->passes = 00;
-                        }
-                        ++l_code_block;
-                }
-
-                opj_free(p_precinct->cblks.enc);
-                
-                p_precinct->cblks.enc = 00;
-        }
-}
-
-OPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_t *p_tcd )
-{
-        OPJ_UINT32 i,l_data_size = 0;
-        opj_image_comp_t * l_img_comp = 00;
-        opj_tcd_tilecomp_t * l_tilec = 00;
-        OPJ_UINT32 l_size_comp, l_remaining;
-
-        l_tilec = p_tcd->tcd_image->tiles->comps;
-        l_img_comp = p_tcd->image->comps;
-        for (i=0;i<p_tcd->image->numcomps;++i) {
-                l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
-                l_remaining = l_img_comp->prec & 7;  /* (%8) */
-
-                if (l_remaining) {
-                        ++l_size_comp;
-                }
-
-                if (l_size_comp == 3) {
-                        l_size_comp = 4;
-                }
-
-                l_data_size += l_size_comp * (OPJ_UINT32)((l_tilec->x1 - l_tilec->x0) * (l_tilec->y1 - l_tilec->y0));
-                ++l_img_comp;
-                ++l_tilec;
-        }
-
-        return l_data_size;
-}
-                
-static OPJ_BOOL opj_tcd_dc_level_shift_encode ( opj_tcd_t *p_tcd )
-{
-        OPJ_UINT32 compno;
-        opj_tcd_tilecomp_t * l_tile_comp = 00;
-        opj_tccp_t * l_tccp = 00;
-        opj_image_comp_t * l_img_comp = 00;
-        opj_tcd_tile_t * l_tile;
-        OPJ_UINT32 l_nb_elem,i;
-        OPJ_INT32 * l_current_ptr;
-
-        l_tile = p_tcd->tcd_image->tiles;
-        l_tile_comp = l_tile->comps;
-        l_tccp = p_tcd->tcp->tccps;
-        l_img_comp = p_tcd->image->comps;
-
-        for (compno = 0; compno < l_tile->numcomps; compno++) {
-                l_current_ptr = l_tile_comp->data;
-                l_nb_elem = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) * (l_tile_comp->y1 - l_tile_comp->y0));
-
-                if (l_tccp->qmfbid == 1) {
-                        for     (i = 0; i < l_nb_elem; ++i) {
-                                *l_current_ptr -= l_tccp->m_dc_level_shift ;
-                                ++l_current_ptr;
-                        }
-                }
-                else {
-                        for (i = 0; i < l_nb_elem; ++i) {
-                                *l_current_ptr = (*l_current_ptr - l_tccp->m_dc_level_shift) << 11 ;
-                                ++l_current_ptr;
-                        }
-                }
-
-                ++l_img_comp;
-                ++l_tccp;
-                ++l_tile_comp;
-        }
-
-        return OPJ_TRUE;
-}
-
-static OPJ_BOOL opj_tcd_mct_encode ( opj_tcd_t *p_tcd )
-{
-        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
-        opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps;
-        OPJ_UINT32 samples = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) * (l_tile_comp->y1 - l_tile_comp->y0));
-        OPJ_UINT32 i;
-        OPJ_BYTE ** l_data = 00;
-        opj_tcp_t * l_tcp = p_tcd->tcp;
-
-        if(!p_tcd->tcp->mct) {
-                return OPJ_TRUE;
-        }
-
-        if (p_tcd->tcp->mct == 2) {
-                if (! p_tcd->tcp->m_mct_coding_matrix) {
-                        return OPJ_TRUE;
-                }
-
-        l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps*sizeof(OPJ_BYTE*));
-                if (! l_data) {
-                        return OPJ_FALSE;
-                }
-
-                for (i=0;i<l_tile->numcomps;++i) {
-                        l_data[i] = (OPJ_BYTE*) l_tile_comp->data;
-                        ++l_tile_comp;
-                }
-
-                if (! opj_mct_encode_custom(/* MCT data */
-                                        (OPJ_BYTE*) p_tcd->tcp->m_mct_coding_matrix,
-                                        /* size of components */
-                                        samples,
-                                        /* components */
-                                        l_data,
-                                        /* nb of components (i.e. size of pData) */
-                                        l_tile->numcomps,
-                                        /* tells if the data is signed */
-                                        p_tcd->image->comps->sgnd) )
+    for (compno = 0; compno < l_tile->numcomps; compno++) {
+        /*
+        if (tcd->cp->reduce != 0) {
+                tcd->image->comps[compno].resno_decoded =
+                        tile->comps[compno].numresolutions - tcd->cp->reduce - 1;
+                if (tcd->image->comps[compno].resno_decoded < 0)
                 {
-            opj_free(l_data);
-                        return OPJ_FALSE;
+                        return false;
                 }
+        }
+        numres2decode = tcd->image->comps[compno].resno_decoded + 1;
+        if(numres2decode > 0){
+        */
 
-                opj_free(l_data);
-        }
-        else if (l_tcp->tccps->qmfbid == 0) {
-                opj_mct_encode_real(l_tile->comps[0].data, l_tile->comps[1].data, l_tile->comps[2].data, samples);
-        }
-        else {
-                opj_mct_encode(l_tile->comps[0].data, l_tile->comps[1].data, l_tile->comps[2].data, samples);
+        if (l_tccp->qmfbid == 1) {
+            if (! opj_dwt_decode(p_tcd->thread_pool, l_tile_comp,
+                                 l_img_comp->resno_decoded + 1)) {
+                return OPJ_FALSE;
+            }
+        } else {
+            if (! opj_dwt_decode_real(l_tile_comp, l_img_comp->resno_decoded + 1)) {
+                return OPJ_FALSE;
+            }
         }
 
-        return OPJ_TRUE;
+        ++l_tile_comp;
+        ++l_img_comp;
+        ++l_tccp;
+    }
+
+    return OPJ_TRUE;
 }
-
-static OPJ_BOOL opj_tcd_dwt_encode ( opj_tcd_t *p_tcd )
+static OPJ_BOOL opj_tcd_mct_decode(opj_tcd_t *p_tcd, opj_event_mgr_t *p_manager)
 {
-        opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
-        opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps;
-        opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
-        OPJ_UINT32 compno;
+    opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+    opj_tcp_t * l_tcp = p_tcd->tcp;
+    opj_tcd_tilecomp_t * l_tile_comp = l_tile->comps;
+    OPJ_UINT32 l_samples, i;
 
-        for (compno = 0; compno < l_tile->numcomps; ++compno) {
-                if (l_tccp->qmfbid == 1) {
-                        if (! opj_dwt_encode(l_tile_comp)) {
-                                return OPJ_FALSE;
-                        }
-                }
-                else if (l_tccp->qmfbid == 0) {
-                        if (! opj_dwt_encode_real(l_tile_comp)) {
-                                return OPJ_FALSE;
-                        }
-                }
+    if (! l_tcp->mct) {
+        return OPJ_TRUE;
+    }
 
+    l_samples = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) *
+                             (l_tile_comp->y1 - l_tile_comp->y0));
+
+    if (l_tile->numcomps >= 3) {
+        /* testcase 1336.pdf.asan.47.376 */
+        if ((l_tile->comps[0].x1 - l_tile->comps[0].x0) * (l_tile->comps[0].y1 -
+                l_tile->comps[0].y0) < (OPJ_INT32)l_samples ||
+                (l_tile->comps[1].x1 - l_tile->comps[1].x0) * (l_tile->comps[1].y1 -
+                        l_tile->comps[1].y0) < (OPJ_INT32)l_samples ||
+                (l_tile->comps[2].x1 - l_tile->comps[2].x0) * (l_tile->comps[2].y1 -
+                        l_tile->comps[2].y0) < (OPJ_INT32)l_samples) {
+            opj_event_msg(p_manager, EVT_ERROR,
+                          "Tiles don't all have the same dimension. Skip the MCT step.\n");
+            return OPJ_FALSE;
+        } else if (l_tcp->mct == 2) {
+            OPJ_BYTE ** l_data;
+
+            if (! l_tcp->m_mct_decoding_matrix) {
+                return OPJ_TRUE;
+            }
+
+            l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps * sizeof(OPJ_BYTE*));
+            if (! l_data) {
+                return OPJ_FALSE;
+            }
+
+            for (i = 0; i < l_tile->numcomps; ++i) {
+                l_data[i] = (OPJ_BYTE*) l_tile_comp->data;
                 ++l_tile_comp;
-                ++l_tccp;
-        }
+            }
 
-        return OPJ_TRUE;
+            if (! opj_mct_decode_custom(/* MCT data */
+                        (OPJ_BYTE*) l_tcp->m_mct_decoding_matrix,
+                        /* size of components */
+                        l_samples,
+                        /* components */
+                        l_data,
+                        /* nb of components (i.e. size of pData) */
+                        l_tile->numcomps,
+                        /* tells if the data is signed */
+                        p_tcd->image->comps->sgnd)) {
+                opj_free(l_data);
+                return OPJ_FALSE;
+            }
+
+            opj_free(l_data);
+        } else {
+            if (l_tcp->tccps->qmfbid == 1) {
+                opj_mct_decode(l_tile->comps[0].data,
+                               l_tile->comps[1].data,
+                               l_tile->comps[2].data,
+                               l_samples);
+            } else {
+                opj_mct_decode_real((OPJ_FLOAT32*)l_tile->comps[0].data,
+                                    (OPJ_FLOAT32*)l_tile->comps[1].data,
+                                    (OPJ_FLOAT32*)l_tile->comps[2].data,
+                                    l_samples);
+            }
+        }
+    } else {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Number of components (%d) is inconsistent with a MCT. Skip the MCT step.\n",
+                      l_tile->numcomps);
+    }
+
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_tcd_t1_encode ( opj_tcd_t *p_tcd )
+
+static OPJ_BOOL opj_tcd_dc_level_shift_decode(opj_tcd_t *p_tcd)
 {
-        opj_t1_t * l_t1;
-        const OPJ_FLOAT64 * l_mct_norms;
-        OPJ_UINT32 l_mct_numcomps = 0U;
-        opj_tcp_t * l_tcp = p_tcd->tcp;
+    OPJ_UINT32 compno;
+    opj_tcd_tilecomp_t * l_tile_comp = 00;
+    opj_tccp_t * l_tccp = 00;
+    opj_image_comp_t * l_img_comp = 00;
+    opj_tcd_resolution_t* l_res = 00;
+    opj_tcd_tile_t * l_tile;
+    OPJ_UINT32 l_width, l_height, i, j;
+    OPJ_INT32 * l_current_ptr;
+    OPJ_INT32 l_min, l_max;
+    OPJ_UINT32 l_stride;
 
-        l_t1 = opj_t1_create(OPJ_TRUE);
-        if (l_t1 == 00) {
-                return OPJ_FALSE;
+    l_tile = p_tcd->tcd_image->tiles;
+    l_tile_comp = l_tile->comps;
+    l_tccp = p_tcd->tcp->tccps;
+    l_img_comp = p_tcd->image->comps;
+
+    for (compno = 0; compno < l_tile->numcomps; compno++) {
+        l_res = l_tile_comp->resolutions + l_img_comp->resno_decoded;
+        l_width = (OPJ_UINT32)(l_res->x1 - l_res->x0);
+        l_height = (OPJ_UINT32)(l_res->y1 - l_res->y0);
+        l_stride = (OPJ_UINT32)(l_tile_comp->x1 - l_tile_comp->x0) - l_width;
+
+        assert(l_height == 0 ||
+               l_width + l_stride <= l_tile_comp->data_size / l_height); /*MUPDF*/
+
+        if (l_img_comp->sgnd) {
+            l_min = -(1 << (l_img_comp->prec - 1));
+            l_max = (1 << (l_img_comp->prec - 1)) - 1;
+        } else {
+            l_min = 0;
+            l_max = (OPJ_INT32)((1U << l_img_comp->prec) - 1);
         }
 
-        if (l_tcp->mct == 1) {
-                l_mct_numcomps = 3U;
-                /* irreversible encoding */
-                if (l_tcp->tccps->qmfbid == 0) {
-                        l_mct_norms = opj_mct_get_mct_norms_real();
+        l_current_ptr = l_tile_comp->data;
+
+        if (l_tccp->qmfbid == 1) {
+            for (j = 0; j < l_height; ++j) {
+                for (i = 0; i < l_width; ++i) {
+                    *l_current_ptr = opj_int_clamp(*l_current_ptr + l_tccp->m_dc_level_shift, l_min,
+                                                   l_max);
+                    ++l_current_ptr;
                 }
-                else {
-                        l_mct_norms = opj_mct_get_mct_norms();
+                l_current_ptr += l_stride;
+            }
+        } else {
+            for (j = 0; j < l_height; ++j) {
+                for (i = 0; i < l_width; ++i) {
+                    OPJ_FLOAT32 l_value = *((OPJ_FLOAT32 *) l_current_ptr);
+                    OPJ_INT32 l_value_int = (OPJ_INT32)opj_lrintf(l_value);
+                    if (l_value > INT_MAX ||
+                            (l_value_int > 0 && l_tccp->m_dc_level_shift > 0 &&
+                             l_value_int > INT_MAX - l_tccp->m_dc_level_shift)) {
+                        *l_current_ptr = l_max;
+                    } else {
+                        *l_current_ptr = opj_int_clamp(
+                                             l_value_int + l_tccp->m_dc_level_shift, l_min, l_max);
+                    }
+                    ++l_current_ptr;
                 }
-        }
-        else {
-                l_mct_numcomps = p_tcd->image->numcomps;
-                l_mct_norms = (const OPJ_FLOAT64 *) (l_tcp->mct_norms);
+                l_current_ptr += l_stride;
+            }
         }
 
-        if (! opj_t1_encode_cblks(l_t1, p_tcd->tcd_image->tiles , l_tcp, l_mct_norms, l_mct_numcomps)) {
-        opj_t1_destroy(l_t1);
-                return OPJ_FALSE;
-        }
+        ++l_img_comp;
+        ++l_tccp;
+        ++l_tile_comp;
+    }
 
-        opj_t1_destroy(l_t1);
-
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
-static OPJ_BOOL opj_tcd_t2_encode (opj_tcd_t *p_tcd,
-                                                OPJ_BYTE * p_dest_data,
-                                                OPJ_UINT32 * p_data_written,
-                                                OPJ_UINT32 p_max_dest_size,
-                                                opj_codestream_info_t *p_cstr_info )
+
+
+/**
+ * Deallocates the encoding data of the given precinct.
+ */
+static void opj_tcd_code_block_dec_deallocate(opj_tcd_precinct_t * p_precinct)
 {
-        opj_t2_t * l_t2;
+    OPJ_UINT32 cblkno, l_nb_code_blocks;
 
-        l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp);
-        if (l_t2 == 00) {
-                return OPJ_FALSE;
+    opj_tcd_cblk_dec_t * l_code_block = p_precinct->cblks.dec;
+    if (l_code_block) {
+        /*fprintf(stderr,"deallocate codeblock:{\n");*/
+        /*fprintf(stderr,"\t x0=%d, y0=%d, x1=%d, y1=%d\n",l_code_block->x0, l_code_block->y0, l_code_block->x1, l_code_block->y1);*/
+        /*fprintf(stderr,"\t numbps=%d, numlenbits=%d, len=%d, numnewpasses=%d, real_num_segs=%d, m_current_max_segs=%d\n ",
+                        l_code_block->numbps, l_code_block->numlenbits, l_code_block->len, l_code_block->numnewpasses, l_code_block->real_num_segs, l_code_block->m_current_max_segs );*/
+
+
+        l_nb_code_blocks = p_precinct->block_size / sizeof(opj_tcd_cblk_dec_t);
+        /*fprintf(stderr,"nb_code_blocks =%d\t}\n", l_nb_code_blocks);*/
+
+        for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno) {
+
+            if (l_code_block->segs) {
+                opj_free(l_code_block->segs);
+                l_code_block->segs = 00;
+            }
+
+            if (l_code_block->chunks) {
+                opj_free(l_code_block->chunks);
+                l_code_block->chunks = 00;
+            }
+
+            ++l_code_block;
         }
 
-        if (! opj_t2_encode_packets(
-                                        l_t2,
-                                        p_tcd->tcd_tileno,
-                                        p_tcd->tcd_image->tiles,
-                                        p_tcd->tcp->numlayers,
-                                        p_dest_data,
-                                        p_data_written,
-                                        p_max_dest_size,
-                                        p_cstr_info,
-                                        p_tcd->tp_num,
-                                        p_tcd->tp_pos,
-                                        p_tcd->cur_pino,
-                                        FINAL_PASS))
-        {
-                opj_t2_destroy(l_t2);
-                return OPJ_FALSE;
+        opj_free(p_precinct->cblks.dec);
+        p_precinct->cblks.dec = 00;
+    }
+}
+
+/**
+ * Deallocates the encoding data of the given precinct.
+ */
+static void opj_tcd_code_block_enc_deallocate(opj_tcd_precinct_t * p_precinct)
+{
+    OPJ_UINT32 cblkno, l_nb_code_blocks;
+
+    opj_tcd_cblk_enc_t * l_code_block = p_precinct->cblks.enc;
+    if (l_code_block) {
+        l_nb_code_blocks = p_precinct->block_size / sizeof(opj_tcd_cblk_enc_t);
+
+        for (cblkno = 0; cblkno < l_nb_code_blocks; ++cblkno)  {
+            if (l_code_block->data) {
+                /* We refer to data - 1 since below we incremented it */
+                /* in opj_tcd_code_block_enc_allocate_data() */
+                opj_free(l_code_block->data - 1);
+                l_code_block->data = 00;
+            }
+
+            if (l_code_block->layers) {
+                opj_free(l_code_block->layers);
+                l_code_block->layers = 00;
+            }
+
+            if (l_code_block->passes) {
+                opj_free(l_code_block->passes);
+                l_code_block->passes = 00;
+            }
+            ++l_code_block;
         }
 
+        opj_free(p_precinct->cblks.enc);
+
+        p_precinct->cblks.enc = 00;
+    }
+}
+
+OPJ_UINT32 opj_tcd_get_encoded_tile_size(opj_tcd_t *p_tcd)
+{
+    OPJ_UINT32 i, l_data_size = 0;
+    opj_image_comp_t * l_img_comp = 00;
+    opj_tcd_tilecomp_t * l_tilec = 00;
+    OPJ_UINT32 l_size_comp, l_remaining;
+
+    l_tilec = p_tcd->tcd_image->tiles->comps;
+    l_img_comp = p_tcd->image->comps;
+    for (i = 0; i < p_tcd->image->numcomps; ++i) {
+        l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
+        l_remaining = l_img_comp->prec & 7;  /* (%8) */
+
+        if (l_remaining) {
+            ++l_size_comp;
+        }
+
+        if (l_size_comp == 3) {
+            l_size_comp = 4;
+        }
+
+        l_data_size += l_size_comp * (OPJ_UINT32)((l_tilec->x1 - l_tilec->x0) *
+                       (l_tilec->y1 - l_tilec->y0));
+        ++l_img_comp;
+        ++l_tilec;
+    }
+
+    return l_data_size;
+}
+
+static OPJ_BOOL opj_tcd_dc_level_shift_encode(opj_tcd_t *p_tcd)
+{
+    OPJ_UINT32 compno;
+    opj_tcd_tilecomp_t * l_tile_comp = 00;
+    opj_tccp_t * l_tccp = 00;
+    opj_image_comp_t * l_img_comp = 00;
+    opj_tcd_tile_t * l_tile;
+    OPJ_UINT32 l_nb_elem, i;
+    OPJ_INT32 * l_current_ptr;
+
+    l_tile = p_tcd->tcd_image->tiles;
+    l_tile_comp = l_tile->comps;
+    l_tccp = p_tcd->tcp->tccps;
+    l_img_comp = p_tcd->image->comps;
+
+    for (compno = 0; compno < l_tile->numcomps; compno++) {
+        l_current_ptr = l_tile_comp->data;
+        l_nb_elem = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) *
+                                 (l_tile_comp->y1 - l_tile_comp->y0));
+
+        if (l_tccp->qmfbid == 1) {
+            for (i = 0; i < l_nb_elem; ++i) {
+                *l_current_ptr -= l_tccp->m_dc_level_shift ;
+                ++l_current_ptr;
+            }
+        } else {
+            for (i = 0; i < l_nb_elem; ++i) {
+                *l_current_ptr = (*l_current_ptr - l_tccp->m_dc_level_shift) * (1 << 11);
+                ++l_current_ptr;
+            }
+        }
+
+        ++l_img_comp;
+        ++l_tccp;
+        ++l_tile_comp;
+    }
+
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_tcd_mct_encode(opj_tcd_t *p_tcd)
+{
+    opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+    opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps;
+    OPJ_UINT32 samples = (OPJ_UINT32)((l_tile_comp->x1 - l_tile_comp->x0) *
+                                      (l_tile_comp->y1 - l_tile_comp->y0));
+    OPJ_UINT32 i;
+    OPJ_BYTE ** l_data = 00;
+    opj_tcp_t * l_tcp = p_tcd->tcp;
+
+    if (!p_tcd->tcp->mct) {
+        return OPJ_TRUE;
+    }
+
+    if (p_tcd->tcp->mct == 2) {
+        if (! p_tcd->tcp->m_mct_coding_matrix) {
+            return OPJ_TRUE;
+        }
+
+        l_data = (OPJ_BYTE **) opj_malloc(l_tile->numcomps * sizeof(OPJ_BYTE*));
+        if (! l_data) {
+            return OPJ_FALSE;
+        }
+
+        for (i = 0; i < l_tile->numcomps; ++i) {
+            l_data[i] = (OPJ_BYTE*) l_tile_comp->data;
+            ++l_tile_comp;
+        }
+
+        if (! opj_mct_encode_custom(/* MCT data */
+                    (OPJ_BYTE*) p_tcd->tcp->m_mct_coding_matrix,
+                    /* size of components */
+                    samples,
+                    /* components */
+                    l_data,
+                    /* nb of components (i.e. size of pData) */
+                    l_tile->numcomps,
+                    /* tells if the data is signed */
+                    p_tcd->image->comps->sgnd)) {
+            opj_free(l_data);
+            return OPJ_FALSE;
+        }
+
+        opj_free(l_data);
+    } else if (l_tcp->tccps->qmfbid == 0) {
+        opj_mct_encode_real(l_tile->comps[0].data, l_tile->comps[1].data,
+                            l_tile->comps[2].data, samples);
+    } else {
+        opj_mct_encode(l_tile->comps[0].data, l_tile->comps[1].data,
+                       l_tile->comps[2].data, samples);
+    }
+
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_tcd_dwt_encode(opj_tcd_t *p_tcd)
+{
+    opj_tcd_tile_t * l_tile = p_tcd->tcd_image->tiles;
+    opj_tcd_tilecomp_t * l_tile_comp = p_tcd->tcd_image->tiles->comps;
+    opj_tccp_t * l_tccp = p_tcd->tcp->tccps;
+    OPJ_UINT32 compno;
+
+    for (compno = 0; compno < l_tile->numcomps; ++compno) {
+        if (l_tccp->qmfbid == 1) {
+            if (! opj_dwt_encode(l_tile_comp)) {
+                return OPJ_FALSE;
+            }
+        } else if (l_tccp->qmfbid == 0) {
+            if (! opj_dwt_encode_real(l_tile_comp)) {
+                return OPJ_FALSE;
+            }
+        }
+
+        ++l_tile_comp;
+        ++l_tccp;
+    }
+
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_tcd_t1_encode(opj_tcd_t *p_tcd)
+{
+    opj_t1_t * l_t1;
+    const OPJ_FLOAT64 * l_mct_norms;
+    OPJ_UINT32 l_mct_numcomps = 0U;
+    opj_tcp_t * l_tcp = p_tcd->tcp;
+
+    l_t1 = opj_t1_create(OPJ_TRUE);
+    if (l_t1 == 00) {
+        return OPJ_FALSE;
+    }
+
+    if (l_tcp->mct == 1) {
+        l_mct_numcomps = 3U;
+        /* irreversible encoding */
+        if (l_tcp->tccps->qmfbid == 0) {
+            l_mct_norms = opj_mct_get_mct_norms_real();
+        } else {
+            l_mct_norms = opj_mct_get_mct_norms();
+        }
+    } else {
+        l_mct_numcomps = p_tcd->image->numcomps;
+        l_mct_norms = (const OPJ_FLOAT64 *)(l_tcp->mct_norms);
+    }
+
+    if (! opj_t1_encode_cblks(l_t1, p_tcd->tcd_image->tiles, l_tcp, l_mct_norms,
+                              l_mct_numcomps)) {
+        opj_t1_destroy(l_t1);
+        return OPJ_FALSE;
+    }
+
+    opj_t1_destroy(l_t1);
+
+    return OPJ_TRUE;
+}
+
+static OPJ_BOOL opj_tcd_t2_encode(opj_tcd_t *p_tcd,
+                                  OPJ_BYTE * p_dest_data,
+                                  OPJ_UINT32 * p_data_written,
+                                  OPJ_UINT32 p_max_dest_size,
+                                  opj_codestream_info_t *p_cstr_info)
+{
+    opj_t2_t * l_t2;
+
+    l_t2 = opj_t2_create(p_tcd->image, p_tcd->cp);
+    if (l_t2 == 00) {
+        return OPJ_FALSE;
+    }
+
+    if (! opj_t2_encode_packets(
+                l_t2,
+                p_tcd->tcd_tileno,
+                p_tcd->tcd_image->tiles,
+                p_tcd->tcp->numlayers,
+                p_dest_data,
+                p_data_written,
+                p_max_dest_size,
+                p_cstr_info,
+                p_tcd->tp_num,
+                p_tcd->tp_pos,
+                p_tcd->cur_pino,
+                FINAL_PASS)) {
         opj_t2_destroy(l_t2);
+        return OPJ_FALSE;
+    }
 
-        /*---------------CLEAN-------------------*/
-        return OPJ_TRUE;
+    opj_t2_destroy(l_t2);
+
+    /*---------------CLEAN-------------------*/
+    return OPJ_TRUE;
 }
 
 
-static OPJ_BOOL opj_tcd_rate_allocate_encode(  opj_tcd_t *p_tcd,
-                                                                            OPJ_BYTE * p_dest_data,
-                                                                            OPJ_UINT32 p_max_dest_size,
-                                                                            opj_codestream_info_t *p_cstr_info )
+static OPJ_BOOL opj_tcd_rate_allocate_encode(opj_tcd_t *p_tcd,
+        OPJ_BYTE * p_dest_data,
+        OPJ_UINT32 p_max_dest_size,
+        opj_codestream_info_t *p_cstr_info)
 {
-        opj_cp_t * l_cp = p_tcd->cp;
-        OPJ_UINT32 l_nb_written = 0;
+    opj_cp_t * l_cp = p_tcd->cp;
+    OPJ_UINT32 l_nb_written = 0;
 
-        if (p_cstr_info)  {
-                p_cstr_info->index_write = 0;
-        }
+    if (p_cstr_info)  {
+        p_cstr_info->index_write = 0;
+    }
 
-        if (l_cp->m_specific_param.m_enc.m_disto_alloc|| l_cp->m_specific_param.m_enc.m_fixed_quality)  {
-                /* fixed_quality */
-                /* Normal Rate/distortion allocation */
-                if (! opj_tcd_rateallocate(p_tcd, p_dest_data,&l_nb_written, p_max_dest_size, p_cstr_info)) {
-                        return OPJ_FALSE;
-                }
+    if (l_cp->m_specific_param.m_enc.m_disto_alloc ||
+            l_cp->m_specific_param.m_enc.m_fixed_quality)  {
+        /* fixed_quality */
+        /* Normal Rate/distortion allocation */
+        if (! opj_tcd_rateallocate(p_tcd, p_dest_data, &l_nb_written, p_max_dest_size,
+                                   p_cstr_info)) {
+            return OPJ_FALSE;
         }
-        else {
-                /* Fixed layer allocation */
-                opj_tcd_rateallocate_fixed(p_tcd);
-        }
+    } else {
+        /* Fixed layer allocation */
+        opj_tcd_rateallocate_fixed(p_tcd);
+    }
 
-        return OPJ_TRUE;
+    return OPJ_TRUE;
 }
 
 
-OPJ_BOOL opj_tcd_copy_tile_data (       opj_tcd_t *p_tcd,
-                                                                    OPJ_BYTE * p_src,
-                                                                    OPJ_UINT32 p_src_length )
+OPJ_BOOL opj_tcd_copy_tile_data(opj_tcd_t *p_tcd,
+                                OPJ_BYTE * p_src,
+                                OPJ_UINT32 p_src_length)
 {
-        OPJ_UINT32 i,j,l_data_size = 0;
-        opj_image_comp_t * l_img_comp = 00;
-        opj_tcd_tilecomp_t * l_tilec = 00;
-        OPJ_UINT32 l_size_comp, l_remaining;
-        OPJ_UINT32 l_nb_elem;
+    OPJ_UINT32 i, j, l_data_size = 0;
+    opj_image_comp_t * l_img_comp = 00;
+    opj_tcd_tilecomp_t * l_tilec = 00;
+    OPJ_UINT32 l_size_comp, l_remaining;
+    OPJ_UINT32 l_nb_elem;
 
-        l_data_size = opj_tcd_get_encoded_tile_size(p_tcd);
-        if (l_data_size != p_src_length) {
-                return OPJ_FALSE;
+    l_data_size = opj_tcd_get_encoded_tile_size(p_tcd);
+    if (l_data_size != p_src_length) {
+        return OPJ_FALSE;
+    }
+
+    l_tilec = p_tcd->tcd_image->tiles->comps;
+    l_img_comp = p_tcd->image->comps;
+    for (i = 0; i < p_tcd->image->numcomps; ++i) {
+        l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
+        l_remaining = l_img_comp->prec & 7;  /* (%8) */
+        l_nb_elem = (OPJ_UINT32)((l_tilec->x1 - l_tilec->x0) * (l_tilec->y1 -
+                                 l_tilec->y0));
+
+        if (l_remaining) {
+            ++l_size_comp;
         }
 
-        l_tilec = p_tcd->tcd_image->tiles->comps;
-        l_img_comp = p_tcd->image->comps;
-        for (i=0;i<p_tcd->image->numcomps;++i) {
-                l_size_comp = l_img_comp->prec >> 3; /*(/ 8)*/
-                l_remaining = l_img_comp->prec & 7;  /* (%8) */
-                l_nb_elem = (OPJ_UINT32)((l_tilec->x1 - l_tilec->x0) * (l_tilec->y1 - l_tilec->y0));
-
-                if (l_remaining) {
-                        ++l_size_comp;
-                }
-
-                if (l_size_comp == 3) {
-                        l_size_comp = 4;
-                }
-
-                switch (l_size_comp) {
-                        case 1:
-                                {
-                                        OPJ_CHAR * l_src_ptr = (OPJ_CHAR *) p_src;
-                                        OPJ_INT32 * l_dest_ptr = l_tilec->data;
-
-                                        if (l_img_comp->sgnd) {
-                                                for (j=0;j<l_nb_elem;++j) {
-                                                        *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++));
-                                                }
-                                        }
-                                        else {
-                                                for (j=0;j<l_nb_elem;++j) {
-                                                        *(l_dest_ptr++) = (*(l_src_ptr++))&0xff;
-                                                }
-                                        }
-
-                                        p_src = (OPJ_BYTE*) l_src_ptr;
-                                }
-                                break;
-                        case 2:
-                                {
-                                        OPJ_INT32 * l_dest_ptr = l_tilec->data;
-                                        OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_src;
-
-                                        if (l_img_comp->sgnd) {
-                                                for (j=0;j<l_nb_elem;++j) {
-                                                        *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++));
-                                                }
-                                        }
-                                        else {
-                                                for (j=0;j<l_nb_elem;++j) {
-                                                        *(l_dest_ptr++) = (*(l_src_ptr++))&0xffff;
-                                                }
-                                        }
-
-                                        p_src = (OPJ_BYTE*) l_src_ptr;
-                                }
-                                break;
-                        case 4:
-                                {
-                                        OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_src;
-                                        OPJ_INT32 * l_dest_ptr = l_tilec->data;
-
-                                        for (j=0;j<l_nb_elem;++j) {
-                                                *(l_dest_ptr++) = (OPJ_INT32) (*(l_src_ptr++));
-                                        }
-
-                                        p_src = (OPJ_BYTE*) l_src_ptr;
-                                }
-                                break;
-                }
-
-                ++l_img_comp;
-                ++l_tilec;
+        if (l_size_comp == 3) {
+            l_size_comp = 4;
         }
 
-        return OPJ_TRUE;
+        switch (l_size_comp) {
+        case 1: {
+            OPJ_CHAR * l_src_ptr = (OPJ_CHAR *) p_src;
+            OPJ_INT32 * l_dest_ptr = l_tilec->data;
+
+            if (l_img_comp->sgnd) {
+                for (j = 0; j < l_nb_elem; ++j) {
+                    *(l_dest_ptr++) = (OPJ_INT32)(*(l_src_ptr++));
+                }
+            } else {
+                for (j = 0; j < l_nb_elem; ++j) {
+                    *(l_dest_ptr++) = (*(l_src_ptr++)) & 0xff;
+                }
+            }
+
+            p_src = (OPJ_BYTE*) l_src_ptr;
+        }
+        break;
+        case 2: {
+            OPJ_INT32 * l_dest_ptr = l_tilec->data;
+            OPJ_INT16 * l_src_ptr = (OPJ_INT16 *) p_src;
+
+            if (l_img_comp->sgnd) {
+                for (j = 0; j < l_nb_elem; ++j) {
+                    *(l_dest_ptr++) = (OPJ_INT32)(*(l_src_ptr++));
+                }
+            } else {
+                for (j = 0; j < l_nb_elem; ++j) {
+                    *(l_dest_ptr++) = (*(l_src_ptr++)) & 0xffff;
+                }
+            }
+
+            p_src = (OPJ_BYTE*) l_src_ptr;
+        }
+        break;
+        case 4: {
+            OPJ_INT32 * l_src_ptr = (OPJ_INT32 *) p_src;
+            OPJ_INT32 * l_dest_ptr = l_tilec->data;
+
+            for (j = 0; j < l_nb_elem; ++j) {
+                *(l_dest_ptr++) = (OPJ_INT32)(*(l_src_ptr++));
+            }
+
+            p_src = (OPJ_BYTE*) l_src_ptr;
+        }
+        break;
+        }
+
+        ++l_img_comp;
+        ++l_tilec;
+    }
+
+    return OPJ_TRUE;
+}
+
+OPJ_BOOL opj_tcd_is_band_empty(opj_tcd_band_t* band)
+{
+    return (band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0);
 }
diff --git a/third_party/libopenjpeg20/tcd.h b/third_party/libopenjpeg20/tcd.h
index 07f8379..3f40b35 100644
--- a/third_party/libopenjpeg20/tcd.h
+++ b/third_party/libopenjpeg20/tcd.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,10 +8,10 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -36,8 +36,8 @@
  * 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
+#ifndef OPJ_TCD_H
+#define OPJ_TCD_H
 /**
 @file tcd.h
 @brief Implementation of a tile coder/decoder (TCD)
@@ -49,124 +49,155 @@
 /** @defgroup TCD TCD - Implementation of a tile coder/decoder */
 /*@{*/
 
-/**
-FIXME DOC
-*/
-typedef struct opj_tcd_seg {
-	OPJ_BYTE ** data;
-	OPJ_UINT32 dataindex;
-	OPJ_UINT32 numpasses;
-	OPJ_UINT32 real_num_passes;
-	OPJ_UINT32 len;
-	OPJ_UINT32 maxpasses;
-	OPJ_UINT32 numnewpasses;
-	OPJ_UINT32 newlen;
-} opj_tcd_seg_t;
 
 /**
 FIXME DOC
 */
 typedef struct opj_tcd_pass {
-	OPJ_UINT32 rate;
-	OPJ_FLOAT64 distortiondec;
-	OPJ_UINT32 len;
-	OPJ_UINT32 term : 1;
+    OPJ_UINT32 rate;
+    OPJ_FLOAT64 distortiondec;
+    OPJ_UINT32 len;
+    OPJ_BITFIELD term : 1;
 } opj_tcd_pass_t;
 
 /**
 FIXME DOC
 */
 typedef struct opj_tcd_layer {
-	OPJ_UINT32 numpasses;		/* Number of passes in the layer */
-	OPJ_UINT32 len;				/* len of information */
-	OPJ_FLOAT64 disto;			/* add for index (Cfr. Marcela) */
-	OPJ_BYTE *data;				/* data */
+    OPJ_UINT32 numpasses;       /* Number of passes in the layer */
+    OPJ_UINT32 len;             /* len of information */
+    OPJ_FLOAT64 disto;          /* add for index (Cfr. Marcela) */
+    OPJ_BYTE *data;             /* data */
 } opj_tcd_layer_t;
 
 /**
 FIXME DOC
 */
 typedef struct opj_tcd_cblk_enc {
-	OPJ_BYTE* data;               /* Data */
-	opj_tcd_layer_t* layers;      /* layer information */
-	opj_tcd_pass_t* passes;       /* information about the passes */
-	OPJ_INT32 x0, y0, x1, y1;     /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
-	OPJ_UINT32 numbps;
-	OPJ_UINT32 numlenbits;
-	OPJ_UINT32 data_size;         /* Size of allocated data buffer */
-	OPJ_UINT32 numpasses;         /* number of pass already done for the code-blocks */
-	OPJ_UINT32 numpassesinlayers; /* number of passes in the layer */
-	OPJ_UINT32 totalpasses;	      /* total number of passes */
+    OPJ_BYTE* data;               /* Data */
+    opj_tcd_layer_t* layers;      /* layer information */
+    opj_tcd_pass_t* passes;       /* information about the passes */
+    OPJ_INT32 x0, y0, x1,
+              y1;     /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
+    OPJ_UINT32 numbps;
+    OPJ_UINT32 numlenbits;
+    OPJ_UINT32 data_size;         /* Size of allocated data buffer */
+    OPJ_UINT32
+    numpasses;         /* number of pass already done for the code-blocks */
+    OPJ_UINT32 numpassesinlayers; /* number of passes in the layer */
+    OPJ_UINT32 totalpasses;       /* total number of passes */
 } opj_tcd_cblk_enc_t;
 
 
+/** Chunk of codestream data that is part of a code block */
+typedef struct opj_tcd_seg_data_chunk {
+    /* Point to tilepart buffer. We don't make a copy !
+       So the tilepart buffer must be kept alive
+       as long as we need to decode the codeblocks */
+    OPJ_BYTE * data;
+    OPJ_UINT32 len;                 /* Usable length of data */
+} opj_tcd_seg_data_chunk_t;
+
+/** Segment of a code-block.
+ * A segment represent a number of consecutive coding passes, without termination
+ * of MQC or RAW between them. */
+typedef struct opj_tcd_seg {
+    OPJ_UINT32 len;      /* Size of data related to this segment */
+    /* Number of passes decoded. Including those that we skip */
+    OPJ_UINT32 numpasses;
+    /* Number of passes actually to be decoded. To be used for code-block decoding */
+    OPJ_UINT32 real_num_passes;
+    /* Maximum number of passes for this segment */
+    OPJ_UINT32 maxpasses;
+    /* Number of new passes for current packed. Transitory value */
+    OPJ_UINT32 numnewpasses;
+    /* Codestream length for this segment for current packed. Transitory value */
+    OPJ_UINT32 newlen;
+} opj_tcd_seg_t;
+
+/** Code-block for decoding */
 typedef struct opj_tcd_cblk_dec {
-	OPJ_BYTE * data;				/* Data */
-	opj_tcd_seg_t* segs;			/* segments information */
-	OPJ_INT32 x0, y0, x1, y1;		/* position of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
-	OPJ_UINT32 numbps;
-	OPJ_UINT32 numlenbits;
-	OPJ_UINT32 data_max_size;		/* Size of allocated data buffer */
-	OPJ_UINT32 data_current_size;	/* Size of used data buffer */
-	OPJ_UINT32 numnewpasses;		/* number of pass added to the code-blocks */
-	OPJ_UINT32 numsegs;				/* number of segments */
-	OPJ_UINT32 real_num_segs;
-	OPJ_UINT32 m_current_max_segs;
+    opj_tcd_seg_t* segs;            /* segments information */
+    opj_tcd_seg_data_chunk_t* chunks; /* Array of chunks */
+    /* position of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
+    OPJ_INT32 x0, y0, x1, y1;
+    OPJ_UINT32 numbps;
+    /* number of bits for len, for the current packet. Transitory value */
+    OPJ_UINT32 numlenbits;
+    /* number of pass added to the code-blocks, for the current packet. Transitory value */
+    OPJ_UINT32 numnewpasses;
+    /* number of segments, including those of packet we skip */
+    OPJ_UINT32 numsegs;
+    /* number of segments, to be used for code block decoding */
+    OPJ_UINT32 real_num_segs;
+    OPJ_UINT32 m_current_max_segs;  /* allocated number of segs[] items */
+    OPJ_UINT32 numchunks;           /* Number of valid chunks items */
+    OPJ_UINT32 numchunksalloc;      /* Number of chunks item allocated */
 } opj_tcd_cblk_dec_t;
 
-/**
-FIXME DOC
-*/
+/** Precinct structure */
 typedef struct opj_tcd_precinct {
-	OPJ_INT32 x0, y0, x1, y1;		/* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
-	OPJ_UINT32 cw, ch;				/* number of precinct in width and height */
-	union{							/* code-blocks information */
-		opj_tcd_cblk_enc_t* enc;
-		opj_tcd_cblk_dec_t* dec;
-		void*               blocks;
-	} cblks;
-	OPJ_UINT32 block_size;			/* size taken by cblks (in bytes) */
-	opj_tgt_tree_t *incltree;	    /* inclusion tree */
-	opj_tgt_tree_t *imsbtree;	    /* IMSB tree */
+    /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
+    OPJ_INT32 x0, y0, x1, y1;
+    OPJ_UINT32 cw, ch;              /* number of code-blocks, in width and height */
+    union {                         /* code-blocks information */
+        opj_tcd_cblk_enc_t* enc;
+        opj_tcd_cblk_dec_t* dec;
+        void*               blocks;
+    } cblks;
+    OPJ_UINT32 block_size;          /* size taken by cblks (in bytes) */
+    opj_tgt_tree_t *incltree;       /* inclusion tree */
+    opj_tgt_tree_t *imsbtree;       /* IMSB tree */
 } opj_tcd_precinct_t;
 
-/**
-FIXME DOC
-*/
+/** Sub-band structure */
 typedef struct opj_tcd_band {
-	OPJ_INT32 x0, y0, x1, y1;		/* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
-	OPJ_UINT32 bandno;
-	opj_tcd_precinct_t *precincts;	/* precinct information */
-	OPJ_UINT32 precincts_data_size;	/* size of data taken by precincts */
-	OPJ_INT32 numbps;
-	OPJ_FLOAT32 stepsize;
+    /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
+    OPJ_INT32 x0, y0, x1, y1;
+    /* band number: for lowest resolution level (0=LL), otherwise (1=HL, 2=LH, 3=HH) */
+    OPJ_UINT32 bandno;
+    /* precinct information */
+    opj_tcd_precinct_t *precincts;
+    /* size of data taken by precincts */
+    OPJ_UINT32 precincts_data_size;
+    OPJ_INT32 numbps;
+    OPJ_FLOAT32 stepsize;
 } opj_tcd_band_t;
 
-/**
-FIXME DOC
-*/
+/** Tile-component resolution structure */
 typedef struct opj_tcd_resolution {
-	OPJ_INT32 x0, y0, x1, y1;		/* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
-	OPJ_UINT32 pw, ph;
-	OPJ_UINT32 numbands;			/* number sub-band for the resolution level */
-	opj_tcd_band_t bands[3];		/* subband information */
+    /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
+    OPJ_INT32 x0, y0, x1, y1;
+    /* number of precincts, in width and height, for this resolution level */
+    OPJ_UINT32 pw, ph;
+    /* number of sub-bands for the resolution level (1 for lowest resolution level, 3 otherwise) */
+    OPJ_UINT32 numbands;
+    /* subband information */
+    opj_tcd_band_t bands[3];
 } opj_tcd_resolution_t;
 
-/**
-FIXME DOC
-*/
-typedef struct opj_tcd_tilecomp
-{
-	OPJ_INT32 x0, y0, x1, y1;           /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
-	OPJ_UINT32 numresolutions;          /* number of resolutions level */
-	OPJ_UINT32 minimum_num_resolutions; /* number of resolutions level to decode (at max)*/
-	opj_tcd_resolution_t *resolutions;  /* resolutions information */
-	OPJ_UINT32 resolutions_size;        /* size of data for resolutions (in bytes) */
-	OPJ_INT32 *data;                    /* data of the component */
-	OPJ_BOOL  ownsData;                 /* if true, then need to free after usage, otherwise do not free */
-	OPJ_UINT32 data_size_needed;        /* we may either need to allocate this amount of data, or re-use image data and ignore this value */
-	OPJ_UINT32 data_size;               /* size of the data of the component */
-	OPJ_INT32 numpix;                   /* add fixed_quality */
+/** Tile-component structure */
+typedef struct opj_tcd_tilecomp {
+    /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
+    OPJ_INT32 x0, y0, x1, y1;
+    /* number of resolutions level */
+    OPJ_UINT32 numresolutions;
+    /* number of resolutions level to decode (at max)*/
+    OPJ_UINT32 minimum_num_resolutions;
+    /* resolutions information */
+    opj_tcd_resolution_t *resolutions;
+    /* size of data for resolutions (in bytes) */
+    OPJ_UINT32 resolutions_size;
+    /* data of the component */
+    OPJ_INT32 *data;
+    /* if true, then need to free after usage, otherwise do not free */
+    OPJ_BOOL  ownsData;
+    /* we may either need to allocate this amount of data, or re-use image data and ignore this value */
+    OPJ_UINT32 data_size_needed;
+    /* size of the data of the component */
+    OPJ_UINT32 data_size;
+    /* add fixed_quality */
+    OPJ_INT32 numpix;
 } opj_tcd_tilecomp_t;
 
 
@@ -174,21 +205,21 @@
 FIXME DOC
 */
 typedef struct opj_tcd_tile {
-	OPJ_INT32 x0, y0, x1, y1;		/* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
-	OPJ_UINT32 numcomps;			/* number of components in tile */
-	opj_tcd_tilecomp_t *comps;	/* Components information */
-	OPJ_INT32 numpix;				/* add fixed_quality */
-	OPJ_FLOAT64 distotile;			/* add fixed_quality */
-	OPJ_FLOAT64 distolayer[100];	/* add fixed_quality */
-	OPJ_UINT32 packno;              /* packet number */
+    /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
+    OPJ_INT32 x0, y0, x1, y1;
+    OPJ_UINT32 numcomps;            /* number of components in tile */
+    opj_tcd_tilecomp_t *comps;  /* Components information */
+    OPJ_INT32 numpix;               /* add fixed_quality */
+    OPJ_FLOAT64 distotile;          /* add fixed_quality */
+    OPJ_FLOAT64 distolayer[100];    /* add fixed_quality */
+    OPJ_UINT32 packno;              /* packet number */
 } opj_tcd_tile_t;
 
 /**
 FIXME DOC
 */
-typedef struct opj_tcd_image
-{
-	opj_tcd_tile_t *tiles;		/* Tiles information */
+typedef struct opj_tcd_image {
+    opj_tcd_tile_t *tiles;      /* Tiles information */
 }
 opj_tcd_image_t;
 
@@ -196,30 +227,31 @@
 /**
 Tile coder/decoder
 */
-typedef struct opj_tcd
-{
-	/** Position of the tilepart flag in Progression order*/
-	OPJ_INT32 tp_pos;
-	/** Tile part number*/
-	OPJ_UINT32 tp_num;
-	/** Current tile part number*/
-	OPJ_UINT32 cur_tp_num;
-	/** Total number of tileparts of the current tile*/
-	OPJ_UINT32 cur_totnum_tp;
-	/** Current Packet iterator number */
-	OPJ_UINT32 cur_pino;
-	/** info on each image tile */
-	opj_tcd_image_t *tcd_image;
-	/** image header */
-	opj_image_t *image;
-	/** coding parameters */
-	opj_cp_t *cp;
-	/** coding/decoding parameters common to all tiles */
-	opj_tcp_t *tcp;
-	/** current encoded/decoded tile */
-	OPJ_UINT32 tcd_tileno;
-	/** tell if the tcd is a decoder. */
-	OPJ_UINT32 m_is_decoder : 1;
+typedef struct opj_tcd {
+    /** Position of the tilepart flag in Progression order*/
+    OPJ_INT32 tp_pos;
+    /** Tile part number*/
+    OPJ_UINT32 tp_num;
+    /** Current tile part number*/
+    OPJ_UINT32 cur_tp_num;
+    /** Total number of tileparts of the current tile*/
+    OPJ_UINT32 cur_totnum_tp;
+    /** Current Packet iterator number */
+    OPJ_UINT32 cur_pino;
+    /** info on each image tile */
+    opj_tcd_image_t *tcd_image;
+    /** image header */
+    opj_image_t *image;
+    /** coding parameters */
+    opj_cp_t *cp;
+    /** coding/decoding parameters common to all tiles */
+    opj_tcp_t *tcp;
+    /** current encoded/decoded tile */
+    OPJ_UINT32 tcd_tileno;
+    /** tell if the tcd is a decoder. */
+    OPJ_BITFIELD m_is_decoder : 1;
+    /** Thread pool */
+    opj_thread_pool_t* thread_pool;
 } opj_tcd_t;
 
 /** @name Exported functions */
@@ -229,7 +261,7 @@
 /**
 Dump the content of a tcd structure
 */
-/*void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);*/ /* TODO MSD shoul use the new v2 structures */ 
+/*void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);*/ /* TODO MSD shoul use the new v2 structures */
 
 /**
 Create a new TCD handle
@@ -246,64 +278,68 @@
 
 /**
  * Initialize the tile coder and may reuse some memory.
- * @param	p_tcd		TCD handle.
- * @param	p_image		raw image.
- * @param	p_cp		coding parameters.
+ * @param   p_tcd       TCD handle.
+ * @param   p_image     raw image.
+ * @param   p_cp        coding parameters.
+ * @param   p_tp        thread pool
  *
  * @return true if the encoding values could be set (false otherwise).
 */
-OPJ_BOOL opj_tcd_init(	opj_tcd_t *p_tcd,
-						opj_image_t * p_image,
-						opj_cp_t * p_cp );
+OPJ_BOOL opj_tcd_init(opj_tcd_t *p_tcd,
+                      opj_image_t * p_image,
+                      opj_cp_t * p_cp,
+                      opj_thread_pool_t* p_tp);
 
 /**
  * Allocates memory for decoding a specific tile.
  *
- * @param	p_tcd		the tile decoder.
- * @param	p_tile_no	the index of the tile received in sequence. This not necessarily lead to the
+ * @param   p_tcd       the tile decoder.
+ * @param   p_tile_no   the index of the tile received in sequence. This not necessarily lead to the
  * tile at index p_tile_no.
  * @param p_manager the event manager.
  *
- * @return	true if the remaining data is sufficient.
+ * @return  true if the remaining data is sufficient.
  */
-OPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no, opj_event_mgr_t* p_manager);
+OPJ_BOOL opj_tcd_init_decode_tile(opj_tcd_t *p_tcd, OPJ_UINT32 p_tile_no,
+                                  opj_event_mgr_t* p_manager);
 
-void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno, OPJ_UINT32 final);
+void opj_tcd_makelayer_fixed(opj_tcd_t *tcd, OPJ_UINT32 layno,
+                             OPJ_UINT32 final);
 
 void opj_tcd_rateallocate_fixed(opj_tcd_t *tcd);
 
-void opj_tcd_makelayer(	opj_tcd_t *tcd,
-						OPJ_UINT32 layno,
-						OPJ_FLOAT64 thresh,
-						OPJ_UINT32 final);
+void opj_tcd_makelayer(opj_tcd_t *tcd,
+                       OPJ_UINT32 layno,
+                       OPJ_FLOAT64 thresh,
+                       OPJ_UINT32 final);
 
-OPJ_BOOL opj_tcd_rateallocate(	opj_tcd_t *tcd,
-								OPJ_BYTE *dest,
-								OPJ_UINT32 * p_data_written,
-								OPJ_UINT32 len,
-								opj_codestream_info_t *cstr_info);
+OPJ_BOOL opj_tcd_rateallocate(opj_tcd_t *tcd,
+                              OPJ_BYTE *dest,
+                              OPJ_UINT32 * p_data_written,
+                              OPJ_UINT32 len,
+                              opj_codestream_info_t *cstr_info);
 
 /**
  * Gets the maximum tile size that will be taken by the tile once decoded.
  */
-OPJ_UINT32 opj_tcd_get_decoded_tile_size (opj_tcd_t *p_tcd );
+OPJ_UINT32 opj_tcd_get_decoded_tile_size(opj_tcd_t *p_tcd);
 
 /**
  * Encodes a tile from the raw image into the given buffer.
- * @param	p_tcd			Tile Coder handle
- * @param	p_tile_no		Index of the tile to encode.
- * @param	p_dest			Destination buffer
- * @param	p_data_written	pointer to an int that is incremented by the number of bytes really written on p_dest
- * @param	p_len			Maximum length of the destination buffer
- * @param	p_cstr_info		Codestream information structure
+ * @param   p_tcd           Tile Coder handle
+ * @param   p_tile_no       Index of the tile to encode.
+ * @param   p_dest          Destination buffer
+ * @param   p_data_written  pointer to an int that is incremented by the number of bytes really written on p_dest
+ * @param   p_len           Maximum length of the destination buffer
+ * @param   p_cstr_info     Codestream information structure
  * @return  true if the coding is successful.
 */
-OPJ_BOOL opj_tcd_encode_tile(   opj_tcd_t *p_tcd,
-							    OPJ_UINT32 p_tile_no,
-							    OPJ_BYTE *p_dest,
-							    OPJ_UINT32 * p_data_written,
-							    OPJ_UINT32 p_len,
-							    struct opj_codestream_info *p_cstr_info);
+OPJ_BOOL opj_tcd_encode_tile(opj_tcd_t *p_tcd,
+                             OPJ_UINT32 p_tile_no,
+                             OPJ_BYTE *p_dest,
+                             OPJ_UINT32 * p_data_written,
+                             OPJ_UINT32 p_len,
+                             struct opj_codestream_info *p_cstr_info);
 
 
 /**
@@ -315,44 +351,44 @@
 @param cstr_info  FIXME DOC
 @param manager the event manager.
 */
-OPJ_BOOL opj_tcd_decode_tile(   opj_tcd_t *tcd,
-							    OPJ_BYTE *src,
-							    OPJ_UINT32 len,
-							    OPJ_UINT32 tileno,
-							    opj_codestream_index_t *cstr_info,
-							    opj_event_mgr_t *manager);
+OPJ_BOOL opj_tcd_decode_tile(opj_tcd_t *tcd,
+                             OPJ_BYTE *src,
+                             OPJ_UINT32 len,
+                             OPJ_UINT32 tileno,
+                             opj_codestream_index_t *cstr_info,
+                             opj_event_mgr_t *manager);
 
 
 /**
  * Copies tile data from the system onto the given memory block.
  */
-OPJ_BOOL opj_tcd_update_tile_data (	opj_tcd_t *p_tcd,
-								    OPJ_BYTE * p_dest,
-								    OPJ_UINT32 p_dest_length );
+OPJ_BOOL opj_tcd_update_tile_data(opj_tcd_t *p_tcd,
+                                  OPJ_BYTE * p_dest,
+                                  OPJ_UINT32 p_dest_length);
 
 /**
  *
  */
-OPJ_UINT32 opj_tcd_get_encoded_tile_size ( opj_tcd_t *p_tcd );
+OPJ_UINT32 opj_tcd_get_encoded_tile_size(opj_tcd_t *p_tcd);
 
 /**
  * Initialize the tile coder and may reuse some meory.
  *
- * @param	p_tcd		TCD handle.
- * @param	p_tile_no	current tile index to encode.
+ * @param   p_tcd       TCD handle.
+ * @param   p_tile_no   current tile index to encode.
  * @param p_manager the event manager.
  *
  * @return true if the encoding values could be set (false otherwise).
 */
-OPJ_BOOL opj_tcd_init_encode_tile (	opj_tcd_t *p_tcd,
-								    OPJ_UINT32 p_tile_no, opj_event_mgr_t* p_manager );
+OPJ_BOOL opj_tcd_init_encode_tile(opj_tcd_t *p_tcd,
+                                  OPJ_UINT32 p_tile_no, opj_event_mgr_t* p_manager);
 
 /**
  * Copies tile data from the given memory block onto the system.
  */
-OPJ_BOOL opj_tcd_copy_tile_data (opj_tcd_t *p_tcd,
-                                 OPJ_BYTE * p_src,
-                                 OPJ_UINT32 p_src_length );
+OPJ_BOOL opj_tcd_copy_tile_data(opj_tcd_t *p_tcd,
+                                OPJ_BYTE * p_src,
+                                OPJ_UINT32 p_src_length);
 
 /**
  * Allocates tile component data
@@ -361,9 +397,18 @@
  */
 OPJ_BOOL opj_alloc_tile_component_data(opj_tcd_tilecomp_t *l_tilec);
 
+/** Returns whether a sub-band is empty (i.e. whether it has a null area)
+ * @param band Sub-band handle.
+ * @return OPJ_TRUE whether the sub-band is empty.
+ */
+OPJ_BOOL opj_tcd_is_band_empty(opj_tcd_band_t* band);
+
+/** Reinitialize a segment */
+void opj_tcd_reinit_segment(opj_tcd_seg_t* seg);
+
 /* ----------------------------------------------------------------------- */
 /*@}*/
 
 /*@}*/
 
-#endif /* __TCD_H */
+#endif /* OPJ_TCD_H */
diff --git a/third_party/libopenjpeg20/tgt.c b/third_party/libopenjpeg20/tgt.c
index 5e34aa9..0cbad12 100644
--- a/third_party/libopenjpeg20/tgt.c
+++ b/third_party/libopenjpeg20/tgt.c
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,10 +8,10 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
+ * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -39,87 +39,90 @@
 
 #include "opj_includes.h"
 
-/* 
+/*
 ==========================================================
    Tag-tree coder interface
 ==========================================================
 */
 
-opj_tgt_tree_t *opj_tgt_create(OPJ_UINT32 numleafsh, OPJ_UINT32 numleafsv, opj_event_mgr_t *manager) {
-        OPJ_INT32 nplh[32];
-        OPJ_INT32 nplv[32];
-        opj_tgt_node_t *node = 00;
-        opj_tgt_node_t *l_parent_node = 00;
-        opj_tgt_node_t *l_parent_node0 = 00;
-        opj_tgt_tree_t *tree = 00;
-        OPJ_UINT32 i;
-        OPJ_INT32  j,k;
-        OPJ_UINT32 numlvls;
-        OPJ_UINT32 n;
+opj_tgt_tree_t *opj_tgt_create(OPJ_UINT32 numleafsh, OPJ_UINT32 numleafsv,
+                               opj_event_mgr_t *p_manager)
+{
+    OPJ_INT32 nplh[32];
+    OPJ_INT32 nplv[32];
+    opj_tgt_node_t *node = 00;
+    opj_tgt_node_t *l_parent_node = 00;
+    opj_tgt_node_t *l_parent_node0 = 00;
+    opj_tgt_tree_t *tree = 00;
+    OPJ_UINT32 i;
+    OPJ_INT32  j, k;
+    OPJ_UINT32 numlvls;
+    OPJ_UINT32 n;
 
-        tree = (opj_tgt_tree_t *) opj_calloc(1,sizeof(opj_tgt_tree_t));
-        if(!tree) {
-                opj_event_msg(manager, EVT_ERROR, "Not enough memory to create Tag-tree\n");
-                return 00;
-        }
+    tree = (opj_tgt_tree_t *) opj_calloc(1, sizeof(opj_tgt_tree_t));
+    if (!tree) {
+        opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to create Tag-tree\n");
+        return 00;
+    }
 
-        tree->numleafsh = numleafsh;
-        tree->numleafsv = numleafsv;
+    tree->numleafsh = numleafsh;
+    tree->numleafsv = numleafsv;
 
-        numlvls = 0;
-        nplh[0] = (OPJ_INT32)numleafsh;
-        nplv[0] = (OPJ_INT32)numleafsv;
-        tree->numnodes = 0;
-        do {
-                n = (OPJ_UINT32)(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);
+    numlvls = 0;
+    nplh[0] = (OPJ_INT32)numleafsh;
+    nplv[0] = (OPJ_INT32)numleafsv;
+    tree->numnodes = 0;
+    do {
+        n = (OPJ_UINT32)(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);
-                opj_event_msg(manager, EVT_WARNING, "tgt_create tree->numnodes == 0, no tree created.\n");
-                return 00;
-        }
+    /* ADD */
+    if (tree->numnodes == 0) {
+        opj_free(tree);
+        return 00;
+    }
 
-        tree->nodes = (opj_tgt_node_t*) opj_calloc(tree->numnodes, sizeof(opj_tgt_node_t));
-        if(!tree->nodes) {
-                opj_event_msg(manager, EVT_ERROR, "Not enough memory to create Tag-tree nodes\n");
-                opj_free(tree);
-                return 00;
-        }
-        tree->nodes_size = tree->numnodes * (OPJ_UINT32)sizeof(opj_tgt_node_t);
+    tree->nodes = (opj_tgt_node_t*) opj_calloc(tree->numnodes,
+                  sizeof(opj_tgt_node_t));
+    if (!tree->nodes) {
+        opj_event_msg(p_manager, EVT_ERROR,
+                      "Not enough memory to create Tag-tree nodes\n");
+        opj_free(tree);
+        return 00;
+    }
+    tree->nodes_size = tree->numnodes * (OPJ_UINT32)sizeof(opj_tgt_node_t);
 
-        node = tree->nodes;
-        l_parent_node = &tree->nodes[tree->numleafsh * tree->numleafsv];
-        l_parent_node0 = l_parent_node;
+    node = tree->nodes;
+    l_parent_node = &tree->nodes[tree->numleafsh * tree->numleafsv];
+    l_parent_node0 = l_parent_node;
 
-        for (i = 0; i < numlvls - 1; ++i) {
-                for (j = 0; j < nplv[i]; ++j) {
-                        k = nplh[i];
-                        while (--k >= 0) {
-                                node->parent = l_parent_node;
-                                ++node;
-                                if (--k >= 0) {
-                                        node->parent = l_parent_node;
-                                        ++node;
-                                }
-                                ++l_parent_node;
-                        }
-                        if ((j & 1) || j == nplv[i] - 1) {
-                                l_parent_node0 = l_parent_node;
-                        } else {
-                                l_parent_node = l_parent_node0;
-                                l_parent_node0 += nplh[i];
-                        }
+    for (i = 0; i < numlvls - 1; ++i) {
+        for (j = 0; j < nplv[i]; ++j) {
+            k = nplh[i];
+            while (--k >= 0) {
+                node->parent = l_parent_node;
+                ++node;
+                if (--k >= 0) {
+                    node->parent = l_parent_node;
+                    ++node;
                 }
+                ++l_parent_node;
+            }
+            if ((j & 1) || j == nplv[i] - 1) {
+                l_parent_node0 = l_parent_node;
+            } else {
+                l_parent_node = l_parent_node0;
+                l_parent_node0 += nplh[i];
+            }
         }
-        node->parent = 0;
-        opj_tgt_reset(tree);
-        return tree;
+    }
+    node->parent = 0;
+    opj_tgt_reset(tree);
+    return tree;
 }
 
 /**
@@ -130,206 +133,212 @@
  * @param       p_num_leafs_v           the height of the array of leafs of the tree
  * @return      a new tag-tree if successful, NULL otherwise
 */
-opj_tgt_tree_t *opj_tgt_init(opj_tgt_tree_t * p_tree,OPJ_UINT32 p_num_leafs_h, OPJ_UINT32 p_num_leafs_v, opj_event_mgr_t *p_manager)
+opj_tgt_tree_t *opj_tgt_init(opj_tgt_tree_t * p_tree, OPJ_UINT32 p_num_leafs_h,
+                             OPJ_UINT32 p_num_leafs_v, opj_event_mgr_t *p_manager)
 {
-        OPJ_INT32 l_nplh[32];
-        OPJ_INT32 l_nplv[32];
-        opj_tgt_node_t *l_node = 00;
-        opj_tgt_node_t *l_parent_node = 00;
-        opj_tgt_node_t *l_parent_node0 = 00;
-        OPJ_UINT32 i;
-        OPJ_INT32 j,k;
-        OPJ_UINT32 l_num_levels;
-        OPJ_UINT32 n;
-        OPJ_UINT32 l_node_size;
+    OPJ_INT32 l_nplh[32];
+    OPJ_INT32 l_nplv[32];
+    opj_tgt_node_t *l_node = 00;
+    opj_tgt_node_t *l_parent_node = 00;
+    opj_tgt_node_t *l_parent_node0 = 00;
+    OPJ_UINT32 i;
+    OPJ_INT32 j, k;
+    OPJ_UINT32 l_num_levels;
+    OPJ_UINT32 n;
+    OPJ_UINT32 l_node_size;
 
-        if (! p_tree){
+    if (! p_tree) {
+        return 00;
+    }
+
+    if ((p_tree->numleafsh != p_num_leafs_h) ||
+            (p_tree->numleafsv != p_num_leafs_v)) {
+        p_tree->numleafsh = p_num_leafs_h;
+        p_tree->numleafsv = p_num_leafs_v;
+
+        l_num_levels = 0;
+        l_nplh[0] = (OPJ_INT32)p_num_leafs_h;
+        l_nplv[0] = (OPJ_INT32)p_num_leafs_v;
+        p_tree->numnodes = 0;
+        do {
+            n = (OPJ_UINT32)(l_nplh[l_num_levels] * l_nplv[l_num_levels]);
+            l_nplh[l_num_levels + 1] = (l_nplh[l_num_levels] + 1) / 2;
+            l_nplv[l_num_levels + 1] = (l_nplv[l_num_levels] + 1) / 2;
+            p_tree->numnodes += n;
+            ++l_num_levels;
+        } while (n > 1);
+
+        /* ADD */
+        if (p_tree->numnodes == 0) {
+            opj_tgt_destroy(p_tree);
+            return 00;
+        }
+        l_node_size = p_tree->numnodes * (OPJ_UINT32)sizeof(opj_tgt_node_t);
+
+        if (l_node_size > p_tree->nodes_size) {
+            opj_tgt_node_t* new_nodes = (opj_tgt_node_t*) opj_realloc(p_tree->nodes,
+                                        l_node_size);
+            if (! new_nodes) {
+                opj_event_msg(p_manager, EVT_ERROR,
+                              "Not enough memory to reinitialize the tag tree\n");
+                opj_tgt_destroy(p_tree);
                 return 00;
+            }
+            p_tree->nodes = new_nodes;
+            memset(((char *) p_tree->nodes) + p_tree->nodes_size, 0,
+                   l_node_size - p_tree->nodes_size);
+            p_tree->nodes_size = l_node_size;
         }
+        l_node = p_tree->nodes;
+        l_parent_node = &p_tree->nodes[p_tree->numleafsh * p_tree->numleafsv];
+        l_parent_node0 = l_parent_node;
 
-        if ((p_tree->numleafsh != p_num_leafs_h) || (p_tree->numleafsv != p_num_leafs_v)) {
-                p_tree->numleafsh = p_num_leafs_h;
-                p_tree->numleafsv = p_num_leafs_v;
-
-                l_num_levels = 0;
-                l_nplh[0] = (OPJ_INT32)p_num_leafs_h;
-                l_nplv[0] = (OPJ_INT32)p_num_leafs_v;
-                p_tree->numnodes = 0;
-                do
-                {
-                        n = (OPJ_UINT32)(l_nplh[l_num_levels] * l_nplv[l_num_levels]);
-                        l_nplh[l_num_levels + 1] = (l_nplh[l_num_levels] + 1) / 2;
-                        l_nplv[l_num_levels + 1] = (l_nplv[l_num_levels] + 1) / 2;
-                        p_tree->numnodes += n;
-                        ++l_num_levels;
+        for (i = 0; i < l_num_levels - 1; ++i) {
+            for (j = 0; j < l_nplv[i]; ++j) {
+                k = l_nplh[i];
+                while (--k >= 0) {
+                    l_node->parent = l_parent_node;
+                    ++l_node;
+                    if (--k >= 0) {
+                        l_node->parent = l_parent_node;
+                        ++l_node;
+                    }
+                    ++l_parent_node;
                 }
-                while (n > 1);
-
-                /* ADD */
-                if (p_tree->numnodes == 0) {
-                        opj_tgt_destroy(p_tree);
-                        return 00;
+                if ((j & 1) || j == l_nplv[i] - 1) {
+                    l_parent_node0 = l_parent_node;
+                } else {
+                    l_parent_node = l_parent_node0;
+                    l_parent_node0 += l_nplh[i];
                 }
-                l_node_size = p_tree->numnodes * (OPJ_UINT32)sizeof(opj_tgt_node_t);
-                
-                if (l_node_size > p_tree->nodes_size) {
-                        opj_tgt_node_t* new_nodes = (opj_tgt_node_t*) opj_realloc(p_tree->nodes, l_node_size);
-                        if (! new_nodes) {
-                                opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to reinitialize the tag tree\n");
-                                opj_tgt_destroy(p_tree);
-                                return 00;
-                        }
-                        p_tree->nodes = new_nodes;
-                        memset(((char *) p_tree->nodes) + p_tree->nodes_size, 0 , l_node_size - p_tree->nodes_size);
-                        p_tree->nodes_size = l_node_size;
-                }
-                l_node = p_tree->nodes;
-                l_parent_node = &p_tree->nodes[p_tree->numleafsh * p_tree->numleafsv];
-                l_parent_node0 = l_parent_node;
-
-                for (i = 0; i < l_num_levels - 1; ++i) {
-                        for (j = 0; j < l_nplv[i]; ++j) {
-                                k = l_nplh[i];
-                                while (--k >= 0) {
-                                        l_node->parent = l_parent_node;
-                                        ++l_node;
-                                        if (--k >= 0) {
-                                                l_node->parent = l_parent_node;
-                                                ++l_node;
-                                        }
-                                        ++l_parent_node;
-                                        }
-                                if ((j & 1) || j == l_nplv[i] - 1)
-                                {
-                                        l_parent_node0 = l_parent_node;
-                                }
-                                else
-                                {
-                                        l_parent_node = l_parent_node0;
-                                        l_parent_node0 += l_nplh[i];
-                                }
-                        }
-                }
-                l_node->parent = 0;
+            }
         }
-        opj_tgt_reset(p_tree);
+        l_node->parent = 0;
+    }
+    opj_tgt_reset(p_tree);
 
-        return p_tree;
+    return p_tree;
 }
 
 void opj_tgt_destroy(opj_tgt_tree_t *p_tree)
 {
-        if (! p_tree) {
-                return;
-        }
+    if (! p_tree) {
+        return;
+    }
 
-        if (p_tree->nodes) {
-                opj_free(p_tree->nodes);
-                p_tree->nodes = 00;
-        }
-        opj_free(p_tree);
+    if (p_tree->nodes) {
+        opj_free(p_tree->nodes);
+        p_tree->nodes = 00;
+    }
+    opj_free(p_tree);
 }
 
-void opj_tgt_reset(opj_tgt_tree_t *p_tree) {
-        OPJ_UINT32 i;
-        opj_tgt_node_t * l_current_node = 00;;
+void opj_tgt_reset(opj_tgt_tree_t *p_tree)
+{
+    OPJ_UINT32 i;
+    opj_tgt_node_t * l_current_node = 00;;
 
-        if (! p_tree) {
-                return;
-        }
+    if (! p_tree) {
+        return;
+    }
 
-        l_current_node = p_tree->nodes;
-        for     (i = 0; i < p_tree->numnodes; ++i)
-        {
-                l_current_node->value = 999;
-                l_current_node->low = 0;
-                l_current_node->known = 0;
-                ++l_current_node;
-        }
+    l_current_node = p_tree->nodes;
+    for (i = 0; i < p_tree->numnodes; ++i) {
+        l_current_node->value = 999;
+        l_current_node->low = 0;
+        l_current_node->known = 0;
+        ++l_current_node;
+    }
 }
 
-void opj_tgt_setvalue(opj_tgt_tree_t *tree, OPJ_UINT32 leafno, OPJ_INT32 value) {
-        opj_tgt_node_t *node;
-        node = &tree->nodes[leafno];
-        while (node && node->value > value) {
-                node->value = value;
-                node = node->parent;
-        }
+void opj_tgt_setvalue(opj_tgt_tree_t *tree, OPJ_UINT32 leafno, OPJ_INT32 value)
+{
+    opj_tgt_node_t *node;
+    node = &tree->nodes[leafno];
+    while (node && node->value > value) {
+        node->value = value;
+        node = node->parent;
+    }
 }
 
-void opj_tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, OPJ_UINT32 leafno, OPJ_INT32 threshold) {
-        opj_tgt_node_t *stk[31];
-        opj_tgt_node_t **stkptr;
-        opj_tgt_node_t *node;
-        OPJ_INT32 low;
+void opj_tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, OPJ_UINT32 leafno,
+                    OPJ_INT32 threshold)
+{
+    opj_tgt_node_t *stk[31];
+    opj_tgt_node_t **stkptr;
+    opj_tgt_node_t *node;
+    OPJ_INT32 low;
 
-        stkptr = stk;
-        node = &tree->nodes[leafno];
-        while (node->parent) {
-                *stkptr++ = node;
-                node = node->parent;
+    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;
         }
-        
-        low = 0;
-        for (;;) {
-                if (low > node->low) {
-                        node->low = low;
-                } else {
-                        low = node->low;
+
+        while (low < threshold) {
+            if (low >= node->value) {
+                if (!node->known) {
+                    opj_bio_write(bio, 1, 1);
+                    node->known = 1;
                 }
-                
-                while (low < threshold) {
-                        if (low >= node->value) {
-                                if (!node->known) {
-                                        opj_bio_write(bio, 1, 1);
-                                        node->known = 1;
-                                }
-                                break;
-                        }
-                        opj_bio_write(bio, 0, 1);
-                        ++low;
-                }
-                
-                node->low = low;
-                if (stkptr == stk)
-                        break;
-                node = *--stkptr;
+                break;
+            }
+            opj_bio_write(bio, 0, 1);
+            ++low;
         }
+
+        node->low = low;
+        if (stkptr == stk) {
+            break;
+        }
+        node = *--stkptr;
+    }
 }
 
-OPJ_UINT32 opj_tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, OPJ_UINT32 leafno, OPJ_INT32 threshold) {
-        opj_tgt_node_t *stk[31];
-        opj_tgt_node_t **stkptr;
-        opj_tgt_node_t *node;
-        OPJ_INT32 low;
+OPJ_UINT32 opj_tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree,
+                          OPJ_UINT32 leafno, OPJ_INT32 threshold)
+{
+    opj_tgt_node_t *stk[31];
+    opj_tgt_node_t **stkptr;
+    opj_tgt_node_t *node;
+    OPJ_INT32 low;
 
-        stkptr = stk;
-        node = &tree->nodes[leafno];
-        while (node->parent) {
-                *stkptr++ = node;
-                node = node->parent;
+    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;
         }
-        
-        low = 0;
-        for (;;) {
-                if (low > node->low) {
-                        node->low = low;
-                } else {
-                        low = node->low;
-                }
-                while (low < threshold && low < node->value) {
-                        if (opj_bio_read(bio, 1)) {
-                                node->value = low;
-                        } else {
-                                ++low;
-                        }
-                }
-                node->low = low;
-                if (stkptr == stk) {
-                        break;
-                }
-                node = *--stkptr;
+        while (low < threshold && low < node->value) {
+            if (opj_bio_read(bio, 1)) {
+                node->value = low;
+            } else {
+                ++low;
+            }
         }
-        
-        return (node->value < threshold) ? 1 : 0;
+        node->low = low;
+        if (stkptr == stk) {
+            break;
+        }
+        node = *--stkptr;
+    }
+
+    return (node->value < threshold) ? 1 : 0;
 }
diff --git a/third_party/libopenjpeg20/tgt.h b/third_party/libopenjpeg20/tgt.h
index 1022380..9818208 100644
--- a/third_party/libopenjpeg20/tgt.h
+++ b/third_party/libopenjpeg20/tgt.h
@@ -1,6 +1,6 @@
 /*
- * The copyright in this software is being made available under the 2-clauses 
- * BSD License, included below. This software may be subject to other third 
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
  * party and contributor rights, including patent rights, and no such rights
  * are granted under this license.
  *
@@ -8,11 +8,11 @@
  * Copyright (c) 2002-2014, Professor Benoit Macq
  * Copyright (c) 2001-2003, David Janssens
  * Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
  * Copyright (c) 2003-2014, Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
- * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France 
+ * Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France
  * Copyright (c) 2012, CS Systemes d'Information, France
  * All rights reserved.
  *
@@ -38,8 +38,8 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef __TGT_H
-#define __TGT_H
+#ifndef OPJ_TGT_H
+#define OPJ_TGT_H
 /**
 @file tgt.h
 @brief Implementation of a tag-tree coder (TGT)
@@ -64,13 +64,12 @@
 /**
 Tag tree
 */
-typedef struct opj_tgt_tree
-{
-	OPJ_UINT32  numleafsh;
-	OPJ_UINT32  numleafsv;
-	OPJ_UINT32 numnodes;
-	opj_tgt_node_t *nodes;
-	OPJ_UINT32  nodes_size;		/* maximum size taken by nodes */
+typedef struct opj_tgt_tree {
+    OPJ_UINT32  numleafsh;
+    OPJ_UINT32  numleafsv;
+    OPJ_UINT32 numnodes;
+    opj_tgt_node_t *nodes;
+    OPJ_UINT32  nodes_size;     /* maximum size taken by nodes */
 } opj_tgt_tree_t;
 
 
@@ -81,21 +80,23 @@
 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
+@param p_manager the event manager
 @return Returns a new tag-tree if successful, returns NULL otherwise
 */
-opj_tgt_tree_t *opj_tgt_create(OPJ_UINT32 numleafsh, OPJ_UINT32 numleafsv, opj_event_mgr_t *manager);
+opj_tgt_tree_t *opj_tgt_create(OPJ_UINT32 numleafsh, OPJ_UINT32 numleafsv,
+                               opj_event_mgr_t *p_manager);
 
 /**
  * Reinitialises a tag-tree from an exixting one.
  *
- * @param	p_tree				the tree to reinitialize.
- * @param	p_num_leafs_h		the width of the array of leafs of the tree
- * @param	p_num_leafs_v		the height of the array of leafs of the tree
+ * @param   p_tree              the tree to reinitialize.
+ * @param   p_num_leafs_h       the width of the array of leafs of the tree
+ * @param   p_num_leafs_v       the height of the array of leafs of the tree
  * @param p_manager       the event manager
- * @return	a new tag-tree if successful, NULL otherwise
+ * @return  a new tag-tree if successful, NULL otherwise
 */
-opj_tgt_tree_t *opj_tgt_init(opj_tgt_tree_t * p_tree, 
-                             OPJ_UINT32  p_num_leafs_h, 
+opj_tgt_tree_t *opj_tgt_init(opj_tgt_tree_t * p_tree,
+                             OPJ_UINT32  p_num_leafs_h,
                              OPJ_UINT32  p_num_leafs_v, opj_event_mgr_t *p_manager);
 /**
 Destroy a tag-tree, liberating memory
@@ -113,8 +114,8 @@
 @param leafno Number that identifies the leaf to modify
 @param value New value of the leaf
 */
-void opj_tgt_setvalue(opj_tgt_tree_t *tree, 
-                      OPJ_UINT32 leafno, 
+void opj_tgt_setvalue(opj_tgt_tree_t *tree,
+                      OPJ_UINT32 leafno,
                       OPJ_INT32 value);
 /**
 Encode the value of a leaf of the tag-tree up to a given threshold
@@ -123,9 +124,9 @@
 @param leafno Number that identifies the leaf to encode
 @param threshold Threshold to use when encoding value of the leaf
 */
-void opj_tgt_encode(opj_bio_t *bio, 
-                    opj_tgt_tree_t *tree, 
-                    OPJ_UINT32 leafno, 
+void opj_tgt_encode(opj_bio_t *bio,
+                    opj_tgt_tree_t *tree,
+                    OPJ_UINT32 leafno,
                     OPJ_INT32 threshold);
 /**
 Decode the value of a leaf of the tag-tree up to a given threshold
@@ -135,13 +136,13 @@
 @param threshold Threshold to use when decoding value of the leaf
 @return Returns 1 if the node's value < threshold, returns 0 otherwise
 */
-OPJ_UINT32 opj_tgt_decode(opj_bio_t *bio, 
-                          opj_tgt_tree_t *tree, 
-                          OPJ_UINT32 leafno, 
+OPJ_UINT32 opj_tgt_decode(opj_bio_t *bio,
+                          opj_tgt_tree_t *tree,
+                          OPJ_UINT32 leafno,
                           OPJ_INT32 threshold);
 /* ----------------------------------------------------------------------- */
 /*@}*/
 
 /*@}*/
 
-#endif /* __TGT_H */
+#endif /* OPJ_TGT_H */
diff --git a/third_party/libopenjpeg20/thread.c b/third_party/libopenjpeg20/thread.c
new file mode 100644
index 0000000..8b56aa4
--- /dev/null
+++ b/third_party/libopenjpeg20/thread.c
@@ -0,0 +1,947 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2016, Even Rouault
+ * 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"
+
+#include "thread.h"
+#include <assert.h>
+
+#ifdef MUTEX_win32
+
+/* Some versions of x86_64-w64-mingw32-gc -m32 resolve InterlockedCompareExchange() */
+/* as __sync_val_compare_and_swap_4 but fails to link it. As this protects against */
+/* a rather unlikely race, skip it */
+#if !(defined(__MINGW32__) && defined(__i386__))
+#define HAVE_INTERLOCKED_COMPARE_EXCHANGE 1
+#endif
+
+#include <windows.h>
+#include <process.h>
+
+OPJ_BOOL OPJ_CALLCONV opj_has_thread_support(void)
+{
+    return OPJ_TRUE;
+}
+
+int OPJ_CALLCONV opj_get_num_cpus(void)
+{
+    SYSTEM_INFO info;
+    DWORD dwNum;
+    GetSystemInfo(&info);
+    dwNum = info.dwNumberOfProcessors;
+    if (dwNum < 1) {
+        return 1;
+    }
+    return (int)dwNum;
+}
+
+struct opj_mutex_t {
+    CRITICAL_SECTION cs;
+};
+
+opj_mutex_t* opj_mutex_create(void)
+{
+    opj_mutex_t* mutex = (opj_mutex_t*) opj_malloc(sizeof(opj_mutex_t));
+    if (!mutex) {
+        return NULL;
+    }
+    InitializeCriticalSectionAndSpinCount(&(mutex->cs), 4000);
+    return mutex;
+}
+
+void opj_mutex_lock(opj_mutex_t* mutex)
+{
+    EnterCriticalSection(&(mutex->cs));
+}
+
+void opj_mutex_unlock(opj_mutex_t* mutex)
+{
+    LeaveCriticalSection(&(mutex->cs));
+}
+
+void opj_mutex_destroy(opj_mutex_t* mutex)
+{
+    if (!mutex) {
+        return;
+    }
+    DeleteCriticalSection(&(mutex->cs));
+    opj_free(mutex);
+}
+
+struct opj_cond_waiter_list_t {
+    HANDLE hEvent;
+    struct opj_cond_waiter_list_t* next;
+};
+typedef struct opj_cond_waiter_list_t opj_cond_waiter_list_t;
+
+struct opj_cond_t {
+    opj_mutex_t             *internal_mutex;
+    opj_cond_waiter_list_t  *waiter_list;
+};
+
+static DWORD TLSKey = 0;
+static volatile LONG inTLSLockedSection = 0;
+static volatile int TLSKeyInit = OPJ_FALSE;
+
+opj_cond_t* opj_cond_create(void)
+{
+    opj_cond_t* cond = (opj_cond_t*) opj_malloc(sizeof(opj_cond_t));
+    if (!cond) {
+        return NULL;
+    }
+
+    /* Make sure that the TLS key is allocated in a thread-safe way */
+    /* We cannot use a global mutex/critical section since its creation itself would not be */
+    /* thread-safe, so use InterlockedCompareExchange trick */
+    while (OPJ_TRUE) {
+
+#if HAVE_INTERLOCKED_COMPARE_EXCHANGE
+        if (InterlockedCompareExchange(&inTLSLockedSection, 1, 0) == 0)
+#endif
+        {
+            if (!TLSKeyInit) {
+                TLSKey = TlsAlloc();
+                TLSKeyInit = OPJ_TRUE;
+            }
+#if HAVE_INTERLOCKED_COMPARE_EXCHANGE
+            InterlockedCompareExchange(&inTLSLockedSection, 0, 1);
+#endif
+            break;
+        }
+    }
+
+    if (TLSKey == TLS_OUT_OF_INDEXES) {
+        opj_free(cond);
+        return NULL;
+    }
+    cond->internal_mutex = opj_mutex_create();
+    if (cond->internal_mutex == NULL) {
+        opj_free(cond);
+        return NULL;
+    }
+    cond->waiter_list = NULL;
+    return cond;
+}
+
+void opj_cond_wait(opj_cond_t* cond, opj_mutex_t* mutex)
+{
+    opj_cond_waiter_list_t* item;
+    HANDLE hEvent = (HANDLE) TlsGetValue(TLSKey);
+    if (hEvent == NULL) {
+        hEvent = CreateEvent(NULL, /* security attributes */
+                             0,    /* manual reset = no */
+                             0,    /* initial state = unsignaled */
+                             NULL  /* no name */);
+        assert(hEvent);
+
+        TlsSetValue(TLSKey, hEvent);
+    }
+
+    /* Insert the waiter into the waiter list of the condition */
+    opj_mutex_lock(cond->internal_mutex);
+
+    item = (opj_cond_waiter_list_t*)opj_malloc(sizeof(opj_cond_waiter_list_t));
+    assert(item != NULL);
+
+    item->hEvent = hEvent;
+    item->next = cond->waiter_list;
+
+    cond->waiter_list = item;
+
+    opj_mutex_unlock(cond->internal_mutex);
+
+    /* Release the client mutex before waiting for the event being signaled */
+    opj_mutex_unlock(mutex);
+
+    /* Ideally we would check that we do not get WAIT_FAILED but it is hard */
+    /* to report a failure. */
+    WaitForSingleObject(hEvent, INFINITE);
+
+    /* Reacquire the client mutex */
+    opj_mutex_lock(mutex);
+}
+
+void opj_cond_signal(opj_cond_t* cond)
+{
+    opj_cond_waiter_list_t* psIter;
+
+    /* Signal the first registered event, and remove it from the list */
+    opj_mutex_lock(cond->internal_mutex);
+
+    psIter = cond->waiter_list;
+    if (psIter != NULL) {
+        SetEvent(psIter->hEvent);
+        cond->waiter_list = psIter->next;
+        opj_free(psIter);
+    }
+
+    opj_mutex_unlock(cond->internal_mutex);
+}
+
+void opj_cond_destroy(opj_cond_t* cond)
+{
+    if (!cond) {
+        return;
+    }
+    opj_mutex_destroy(cond->internal_mutex);
+    assert(cond->waiter_list == NULL);
+    opj_free(cond);
+}
+
+struct opj_thread_t {
+    opj_thread_fn thread_fn;
+    void* user_data;
+    HANDLE hThread;
+};
+
+unsigned int __stdcall opj_thread_callback_adapter(void *info)
+{
+    opj_thread_t* thread = (opj_thread_t*) info;
+    HANDLE hEvent = NULL;
+
+    thread->thread_fn(thread->user_data);
+
+    /* Free the handle possible allocated by a cond */
+    while (OPJ_TRUE) {
+        /* Make sure TLSKey is not being created just at that moment... */
+#if HAVE_INTERLOCKED_COMPARE_EXCHANGE
+        if (InterlockedCompareExchange(&inTLSLockedSection, 1, 0) == 0)
+#endif
+        {
+            if (TLSKeyInit) {
+                hEvent = (HANDLE) TlsGetValue(TLSKey);
+            }
+#if HAVE_INTERLOCKED_COMPARE_EXCHANGE
+            InterlockedCompareExchange(&inTLSLockedSection, 0, 1);
+#endif
+            break;
+        }
+    }
+    if (hEvent) {
+        CloseHandle(hEvent);
+    }
+
+    return 0;
+}
+
+opj_thread_t* opj_thread_create(opj_thread_fn thread_fn, void* user_data)
+{
+    opj_thread_t* thread;
+
+    assert(thread_fn);
+
+    thread = (opj_thread_t*) opj_malloc(sizeof(opj_thread_t));
+    if (!thread) {
+        return NULL;
+    }
+    thread->thread_fn = thread_fn;
+    thread->user_data = user_data;
+
+    thread->hThread = (HANDLE)_beginthreadex(NULL, 0,
+                      opj_thread_callback_adapter, thread, 0, NULL);
+
+    if (thread->hThread == NULL) {
+        opj_free(thread);
+        return NULL;
+    }
+    return thread;
+}
+
+void opj_thread_join(opj_thread_t* thread)
+{
+    WaitForSingleObject(thread->hThread, INFINITE);
+    CloseHandle(thread->hThread);
+
+    opj_free(thread);
+}
+
+#elif MUTEX_pthread
+
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+OPJ_BOOL OPJ_CALLCONV opj_has_thread_support(void)
+{
+    return OPJ_TRUE;
+}
+
+int OPJ_CALLCONV opj_get_num_cpus(void)
+{
+#ifdef _SC_NPROCESSORS_ONLN
+    return (int)sysconf(_SC_NPROCESSORS_ONLN);
+#else
+    return 1;
+#endif
+}
+
+struct opj_mutex_t {
+    pthread_mutex_t mutex;
+};
+
+opj_mutex_t* opj_mutex_create(void)
+{
+    opj_mutex_t* mutex = (opj_mutex_t*) opj_calloc(1U, sizeof(opj_mutex_t));
+    if (mutex != NULL) {
+        if (pthread_mutex_init(&mutex->mutex, NULL) != 0) {
+            opj_free(mutex);
+            mutex = NULL;
+        }
+    }
+    return mutex;
+}
+
+void opj_mutex_lock(opj_mutex_t* mutex)
+{
+    pthread_mutex_lock(&(mutex->mutex));
+}
+
+void opj_mutex_unlock(opj_mutex_t* mutex)
+{
+    pthread_mutex_unlock(&(mutex->mutex));
+}
+
+void opj_mutex_destroy(opj_mutex_t* mutex)
+{
+    if (!mutex) {
+        return;
+    }
+    pthread_mutex_destroy(&(mutex->mutex));
+    opj_free(mutex);
+}
+
+struct opj_cond_t {
+    pthread_cond_t cond;
+};
+
+opj_cond_t* opj_cond_create(void)
+{
+    opj_cond_t* cond = (opj_cond_t*) opj_malloc(sizeof(opj_cond_t));
+    if (!cond) {
+        return NULL;
+    }
+    if (pthread_cond_init(&(cond->cond), NULL) != 0) {
+        opj_free(cond);
+        return NULL;
+    }
+    return cond;
+}
+
+void opj_cond_wait(opj_cond_t* cond, opj_mutex_t* mutex)
+{
+    pthread_cond_wait(&(cond->cond), &(mutex->mutex));
+}
+
+void opj_cond_signal(opj_cond_t* cond)
+{
+    int ret = pthread_cond_signal(&(cond->cond));
+    (void)ret;
+    assert(ret == 0);
+}
+
+void opj_cond_destroy(opj_cond_t* cond)
+{
+    if (!cond) {
+        return;
+    }
+    pthread_cond_destroy(&(cond->cond));
+    opj_free(cond);
+}
+
+
+struct opj_thread_t {
+    opj_thread_fn thread_fn;
+    void* user_data;
+    pthread_t thread;
+};
+
+static void* opj_thread_callback_adapter(void* info)
+{
+    opj_thread_t* thread = (opj_thread_t*) info;
+    thread->thread_fn(thread->user_data);
+    return NULL;
+}
+
+opj_thread_t* opj_thread_create(opj_thread_fn thread_fn, void* user_data)
+{
+    pthread_attr_t attr;
+    opj_thread_t* thread;
+
+    assert(thread_fn);
+
+    thread = (opj_thread_t*) opj_malloc(sizeof(opj_thread_t));
+    if (!thread) {
+        return NULL;
+    }
+    thread->thread_fn = thread_fn;
+    thread->user_data = user_data;
+
+    pthread_attr_init(&attr);
+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+    if (pthread_create(&(thread->thread), &attr,
+                       opj_thread_callback_adapter, (void *) thread) != 0) {
+        opj_free(thread);
+        return NULL;
+    }
+    return thread;
+}
+
+void opj_thread_join(opj_thread_t* thread)
+{
+    void* status;
+    pthread_join(thread->thread, &status);
+
+    opj_free(thread);
+}
+
+#else
+/* Stub implementation */
+
+OPJ_BOOL OPJ_CALLCONV opj_has_thread_support(void)
+{
+    return OPJ_FALSE;
+}
+
+int OPJ_CALLCONV opj_get_num_cpus(void)
+{
+    return 1;
+}
+
+opj_mutex_t* opj_mutex_create(void)
+{
+    return NULL;
+}
+
+void opj_mutex_lock(opj_mutex_t* mutex)
+{
+    (void) mutex;
+}
+
+void opj_mutex_unlock(opj_mutex_t* mutex)
+{
+    (void) mutex;
+}
+
+void opj_mutex_destroy(opj_mutex_t* mutex)
+{
+    (void) mutex;
+}
+
+opj_cond_t* opj_cond_create(void)
+{
+    return NULL;
+}
+
+void opj_cond_wait(opj_cond_t* cond, opj_mutex_t* mutex)
+{
+    (void) cond;
+    (void) mutex;
+}
+
+void opj_cond_signal(opj_cond_t* cond)
+{
+    (void) cond;
+}
+
+void opj_cond_destroy(opj_cond_t* cond)
+{
+    (void) cond;
+}
+
+opj_thread_t* opj_thread_create(opj_thread_fn thread_fn, void* user_data)
+{
+    (void) thread_fn;
+    (void) user_data;
+    return NULL;
+}
+
+void opj_thread_join(opj_thread_t* thread)
+{
+    (void) thread;
+}
+
+#endif
+
+typedef struct {
+    int key;
+    void* value;
+    opj_tls_free_func opj_free_func;
+} opj_tls_key_val_t;
+
+struct opj_tls_t {
+    opj_tls_key_val_t* key_val;
+    int                key_val_count;
+};
+
+static opj_tls_t* opj_tls_new(void)
+{
+    return (opj_tls_t*) opj_calloc(1, sizeof(opj_tls_t));
+}
+
+static void opj_tls_destroy(opj_tls_t* tls)
+{
+    int i;
+    if (!tls) {
+        return;
+    }
+    for (i = 0; i < tls->key_val_count; i++) {
+        if (tls->key_val[i].opj_free_func) {
+            tls->key_val[i].opj_free_func(tls->key_val[i].value);
+        }
+    }
+    opj_free(tls->key_val);
+    opj_free(tls);
+}
+
+void* opj_tls_get(opj_tls_t* tls, int key)
+{
+    int i;
+    for (i = 0; i < tls->key_val_count; i++) {
+        if (tls->key_val[i].key == key) {
+            return tls->key_val[i].value;
+        }
+    }
+    return NULL;
+}
+
+OPJ_BOOL opj_tls_set(opj_tls_t* tls, int key, void* value,
+                     opj_tls_free_func opj_free_func)
+{
+    opj_tls_key_val_t* new_key_val;
+    int i;
+
+    if (tls->key_val_count == INT_MAX) {
+        return OPJ_FALSE;
+    }
+    for (i = 0; i < tls->key_val_count; i++) {
+        if (tls->key_val[i].key == key) {
+            if (tls->key_val[i].opj_free_func) {
+                tls->key_val[i].opj_free_func(tls->key_val[i].value);
+            }
+            tls->key_val[i].value = value;
+            tls->key_val[i].opj_free_func = opj_free_func;
+            return OPJ_TRUE;
+        }
+    }
+    new_key_val = (opj_tls_key_val_t*) opj_realloc(tls->key_val,
+                  ((size_t)tls->key_val_count + 1U) * sizeof(opj_tls_key_val_t));
+    if (!new_key_val) {
+        return OPJ_FALSE;
+    }
+    tls->key_val = new_key_val;
+    new_key_val[tls->key_val_count].key = key;
+    new_key_val[tls->key_val_count].value = value;
+    new_key_val[tls->key_val_count].opj_free_func = opj_free_func;
+    tls->key_val_count ++;
+    return OPJ_TRUE;
+}
+
+
+typedef struct {
+    opj_job_fn          job_fn;
+    void               *user_data;
+} opj_worker_thread_job_t;
+
+typedef struct {
+    opj_thread_pool_t   *tp;
+    opj_thread_t        *thread;
+    int                  marked_as_waiting;
+
+    opj_mutex_t         *mutex;
+    opj_cond_t          *cond;
+} opj_worker_thread_t;
+
+typedef enum {
+    OPJWTS_OK,
+    OPJWTS_STOP,
+    OPJWTS_ERROR
+} opj_worker_thread_state;
+
+struct opj_job_list_t {
+    opj_worker_thread_job_t* job;
+    struct opj_job_list_t* next;
+};
+typedef struct opj_job_list_t opj_job_list_t;
+
+struct opj_worker_thread_list_t {
+    opj_worker_thread_t* worker_thread;
+    struct opj_worker_thread_list_t* next;
+};
+typedef struct opj_worker_thread_list_t opj_worker_thread_list_t;
+
+struct opj_thread_pool_t {
+    opj_worker_thread_t*             worker_threads;
+    int                              worker_threads_count;
+    opj_cond_t*                      cond;
+    opj_mutex_t*                     mutex;
+    volatile opj_worker_thread_state state;
+    opj_job_list_t*                  job_queue;
+    volatile int                     pending_jobs_count;
+    opj_worker_thread_list_t*        waiting_worker_thread_list;
+    int                              waiting_worker_thread_count;
+    opj_tls_t*                       tls;
+    int                              signaling_threshold;
+};
+
+static OPJ_BOOL opj_thread_pool_setup(opj_thread_pool_t* tp, int num_threads);
+static opj_worker_thread_job_t* opj_thread_pool_get_next_job(
+    opj_thread_pool_t* tp,
+    opj_worker_thread_t* worker_thread,
+    OPJ_BOOL signal_job_finished);
+
+opj_thread_pool_t* opj_thread_pool_create(int num_threads)
+{
+    opj_thread_pool_t* tp;
+
+    tp = (opj_thread_pool_t*) opj_calloc(1, sizeof(opj_thread_pool_t));
+    if (!tp) {
+        return NULL;
+    }
+    tp->state = OPJWTS_OK;
+
+    if (num_threads <= 0) {
+        tp->tls = opj_tls_new();
+        if (!tp->tls) {
+            opj_free(tp);
+            tp = NULL;
+        }
+        return tp;
+    }
+
+    tp->mutex = opj_mutex_create();
+    if (!tp->mutex) {
+        opj_free(tp);
+        return NULL;
+    }
+    if (!opj_thread_pool_setup(tp, num_threads)) {
+        opj_thread_pool_destroy(tp);
+        return NULL;
+    }
+    return tp;
+}
+
+static void opj_worker_thread_function(void* user_data)
+{
+    opj_worker_thread_t* worker_thread;
+    opj_thread_pool_t* tp;
+    opj_tls_t* tls;
+    OPJ_BOOL job_finished = OPJ_FALSE;
+
+    worker_thread = (opj_worker_thread_t*) user_data;
+    tp = worker_thread->tp;
+    tls = opj_tls_new();
+
+    while (OPJ_TRUE) {
+        opj_worker_thread_job_t* job = opj_thread_pool_get_next_job(tp, worker_thread,
+                                       job_finished);
+        if (job == NULL) {
+            break;
+        }
+
+        if (job->job_fn) {
+            job->job_fn(job->user_data, tls);
+        }
+        opj_free(job);
+        job_finished = OPJ_TRUE;
+    }
+
+    opj_tls_destroy(tls);
+}
+
+static OPJ_BOOL opj_thread_pool_setup(opj_thread_pool_t* tp, int num_threads)
+{
+    int i;
+    OPJ_BOOL bRet = OPJ_TRUE;
+
+    assert(num_threads > 0);
+
+    tp->cond = opj_cond_create();
+    if (tp->cond == NULL) {
+        return OPJ_FALSE;
+    }
+
+    tp->worker_threads = (opj_worker_thread_t*) opj_calloc((size_t)num_threads,
+                         sizeof(opj_worker_thread_t));
+    if (tp->worker_threads == NULL) {
+        return OPJ_FALSE;
+    }
+    tp->worker_threads_count = num_threads;
+
+    for (i = 0; i < num_threads; i++) {
+        tp->worker_threads[i].tp = tp;
+
+        tp->worker_threads[i].mutex = opj_mutex_create();
+        if (tp->worker_threads[i].mutex == NULL) {
+            tp->worker_threads_count = i;
+            bRet = OPJ_FALSE;
+            break;
+        }
+
+        tp->worker_threads[i].cond = opj_cond_create();
+        if (tp->worker_threads[i].cond == NULL) {
+            opj_mutex_destroy(tp->worker_threads[i].mutex);
+            tp->worker_threads_count = i;
+            bRet = OPJ_FALSE;
+            break;
+        }
+
+        tp->worker_threads[i].marked_as_waiting = OPJ_FALSE;
+
+        tp->worker_threads[i].thread = opj_thread_create(opj_worker_thread_function,
+                                       &(tp->worker_threads[i]));
+        if (tp->worker_threads[i].thread == NULL) {
+            tp->worker_threads_count = i;
+            bRet = OPJ_FALSE;
+            break;
+        }
+    }
+
+    /* Wait all threads to be started */
+    /* printf("waiting for all threads to be started\n"); */
+    opj_mutex_lock(tp->mutex);
+    while (tp->waiting_worker_thread_count < num_threads) {
+        opj_cond_wait(tp->cond, tp->mutex);
+    }
+    opj_mutex_unlock(tp->mutex);
+    /* printf("all threads started\n"); */
+
+    if (tp->state == OPJWTS_ERROR) {
+        bRet = OPJ_FALSE;
+    }
+
+    return bRet;
+}
+
+/*
+void opj_waiting()
+{
+    printf("waiting!\n");
+}
+*/
+
+static opj_worker_thread_job_t* opj_thread_pool_get_next_job(
+    opj_thread_pool_t* tp,
+    opj_worker_thread_t* worker_thread,
+    OPJ_BOOL signal_job_finished)
+{
+    while (OPJ_TRUE) {
+        opj_job_list_t* top_job_iter;
+
+        opj_mutex_lock(tp->mutex);
+
+        if (signal_job_finished) {
+            signal_job_finished = OPJ_FALSE;
+            tp->pending_jobs_count --;
+            /*printf("tp=%p, remaining jobs: %d\n", tp, tp->pending_jobs_count);*/
+            if (tp->pending_jobs_count <= tp->signaling_threshold) {
+                opj_cond_signal(tp->cond);
+            }
+        }
+
+        if (tp->state == OPJWTS_STOP) {
+            opj_mutex_unlock(tp->mutex);
+            return NULL;
+        }
+        top_job_iter = tp->job_queue;
+        if (top_job_iter) {
+            opj_worker_thread_job_t* job;
+            tp->job_queue = top_job_iter->next;
+
+            job = top_job_iter->job;
+            opj_mutex_unlock(tp->mutex);
+            opj_free(top_job_iter);
+            return job;
+        }
+
+        /* opj_waiting(); */
+        if (!worker_thread->marked_as_waiting) {
+            opj_worker_thread_list_t* item;
+
+            worker_thread->marked_as_waiting = OPJ_TRUE;
+            tp->waiting_worker_thread_count ++;
+            assert(tp->waiting_worker_thread_count <= tp->worker_threads_count);
+
+            item = (opj_worker_thread_list_t*) opj_malloc(sizeof(opj_worker_thread_list_t));
+            if (item == NULL) {
+                tp->state = OPJWTS_ERROR;
+                opj_cond_signal(tp->cond);
+
+                opj_mutex_unlock(tp->mutex);
+                return NULL;
+            }
+
+            item->worker_thread = worker_thread;
+            item->next = tp->waiting_worker_thread_list;
+            tp->waiting_worker_thread_list = item;
+        }
+
+        /* printf("signaling that worker thread is ready\n"); */
+        opj_cond_signal(tp->cond);
+
+        opj_mutex_lock(worker_thread->mutex);
+        opj_mutex_unlock(tp->mutex);
+
+        /* printf("waiting for job\n"); */
+        opj_cond_wait(worker_thread->cond, worker_thread->mutex);
+
+        opj_mutex_unlock(worker_thread->mutex);
+        /* printf("got job\n"); */
+    }
+}
+
+OPJ_BOOL opj_thread_pool_submit_job(opj_thread_pool_t* tp,
+                                    opj_job_fn job_fn,
+                                    void* user_data)
+{
+    opj_worker_thread_job_t* job;
+    opj_job_list_t* item;
+
+    if (tp->mutex == NULL) {
+        job_fn(user_data, tp->tls);
+        return OPJ_TRUE;
+    }
+
+    job = (opj_worker_thread_job_t*)opj_malloc(sizeof(opj_worker_thread_job_t));
+    if (job == NULL) {
+        return OPJ_FALSE;
+    }
+    job->job_fn = job_fn;
+    job->user_data = user_data;
+
+    item = (opj_job_list_t*) opj_malloc(sizeof(opj_job_list_t));
+    if (item == NULL) {
+        opj_free(job);
+        return OPJ_FALSE;
+    }
+    item->job = job;
+
+    opj_mutex_lock(tp->mutex);
+
+    tp->signaling_threshold = 100 * tp->worker_threads_count;
+    while (tp->pending_jobs_count > tp->signaling_threshold) {
+        /* printf("%d jobs enqueued. Waiting\n", tp->pending_jobs_count); */
+        opj_cond_wait(tp->cond, tp->mutex);
+        /* printf("...%d jobs enqueued.\n", tp->pending_jobs_count); */
+    }
+
+    item->next = tp->job_queue;
+    tp->job_queue = item;
+    tp->pending_jobs_count ++;
+
+    if (tp->waiting_worker_thread_list) {
+        opj_worker_thread_t* worker_thread;
+        opj_worker_thread_list_t* next;
+        opj_worker_thread_list_t* to_opj_free;
+
+        worker_thread = tp->waiting_worker_thread_list->worker_thread;
+
+        assert(worker_thread->marked_as_waiting);
+        worker_thread->marked_as_waiting = OPJ_FALSE;
+
+        next = tp->waiting_worker_thread_list->next;
+        to_opj_free = tp->waiting_worker_thread_list;
+        tp->waiting_worker_thread_list = next;
+        tp->waiting_worker_thread_count --;
+
+        opj_mutex_lock(worker_thread->mutex);
+        opj_mutex_unlock(tp->mutex);
+        opj_cond_signal(worker_thread->cond);
+        opj_mutex_unlock(worker_thread->mutex);
+
+        opj_free(to_opj_free);
+    } else {
+        opj_mutex_unlock(tp->mutex);
+    }
+
+    return OPJ_TRUE;
+}
+
+void opj_thread_pool_wait_completion(opj_thread_pool_t* tp,
+                                     int max_remaining_jobs)
+{
+    if (tp->mutex == NULL) {
+        return;
+    }
+
+    if (max_remaining_jobs < 0) {
+        max_remaining_jobs = 0;
+    }
+    opj_mutex_lock(tp->mutex);
+    tp->signaling_threshold = max_remaining_jobs;
+    while (tp->pending_jobs_count > max_remaining_jobs) {
+        /*printf("tp=%p, jobs before wait = %d, max_remaining_jobs = %d\n", tp, tp->pending_jobs_count, max_remaining_jobs);*/
+        opj_cond_wait(tp->cond, tp->mutex);
+        /*printf("tp=%p, jobs after wait = %d\n", tp, tp->pending_jobs_count);*/
+    }
+    opj_mutex_unlock(tp->mutex);
+}
+
+int opj_thread_pool_get_thread_count(opj_thread_pool_t* tp)
+{
+    return tp->worker_threads_count;
+}
+
+void opj_thread_pool_destroy(opj_thread_pool_t* tp)
+{
+    if (!tp) {
+        return;
+    }
+    if (tp->cond) {
+        int i;
+        opj_thread_pool_wait_completion(tp, 0);
+
+        opj_mutex_lock(tp->mutex);
+        tp->state = OPJWTS_STOP;
+        opj_mutex_unlock(tp->mutex);
+
+        for (i = 0; i < tp->worker_threads_count; i++) {
+            opj_mutex_lock(tp->worker_threads[i].mutex);
+            opj_cond_signal(tp->worker_threads[i].cond);
+            opj_mutex_unlock(tp->worker_threads[i].mutex);
+            opj_thread_join(tp->worker_threads[i].thread);
+            opj_cond_destroy(tp->worker_threads[i].cond);
+            opj_mutex_destroy(tp->worker_threads[i].mutex);
+        }
+
+        opj_free(tp->worker_threads);
+
+        while (tp->waiting_worker_thread_list != NULL) {
+            opj_worker_thread_list_t* next = tp->waiting_worker_thread_list->next;
+            opj_free(tp->waiting_worker_thread_list);
+            tp->waiting_worker_thread_list = next;
+        }
+
+        opj_cond_destroy(tp->cond);
+    }
+    opj_mutex_destroy(tp->mutex);
+    opj_tls_destroy(tp->tls);
+    opj_free(tp);
+}
diff --git a/third_party/libopenjpeg20/thread.h b/third_party/libopenjpeg20/thread.h
new file mode 100644
index 0000000..c89e19b
--- /dev/null
+++ b/third_party/libopenjpeg20/thread.h
@@ -0,0 +1,256 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2016, Even Rouault
+ * 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 THREAD_H
+#define THREAD_H
+
+#include "openjpeg.h"
+
+/**
+@file thread.h
+@brief Thread API
+
+The functions in thread.c have for goal to manage mutex, conditions, thread
+creation and thread pools that accept jobs.
+*/
+
+/** @defgroup THREAD THREAD - Mutex, conditions, threads and thread pools */
+/*@{*/
+
+/** @name Mutex */
+/*@{*/
+
+/** Opaque type for a mutex */
+typedef struct opj_mutex_t opj_mutex_t;
+
+/** Creates a mutex.
+ * @return the mutex or NULL in case of error (can for example happen if the library
+ * is built without thread support)
+ */
+opj_mutex_t* opj_mutex_create(void);
+
+/** Lock/acquire the mutex.
+ * @param mutex the mutex to acquire.
+ */
+void opj_mutex_lock(opj_mutex_t* mutex);
+
+/** Unlock/release the mutex.
+ * @param mutex the mutex to release.
+ */
+void opj_mutex_unlock(opj_mutex_t* mutex);
+
+/** Destroy a mutex
+ * @param mutex the mutex to destroy.
+ */
+void opj_mutex_destroy(opj_mutex_t* mutex);
+
+/*@}*/
+
+/** @name Condition */
+/*@{*/
+
+/** Opaque type for a condition */
+typedef struct opj_cond_t opj_cond_t;
+
+/** Creates a condition.
+ * @return the condition or NULL in case of error (can for example happen if the library
+ * is built without thread support)
+ */
+opj_cond_t* opj_cond_create(void);
+
+/** Wait for the condition to be signaled.
+ * The semantics is the same as the POSIX pthread_cond_wait.
+ * The provided mutex *must* be acquired before calling this function, and
+ * released afterwards.
+ * The mutex will be released by this function while it must wait for the condition
+ * and reacquired afterwards.
+ * In some particular situations, the function might return even if the condition is not signaled
+ * with opj_cond_signal(), hence the need to check with an application level
+ * mechanism.
+ *
+ * Waiting thread :
+ * \code
+ *    opj_mutex_lock(mutex);
+ *    while( !some_application_level_condition )
+ *    {
+ *        opj_cond_wait(cond, mutex);
+ *    }
+ *    opj_mutex_unlock(mutex);
+ * \endcode
+ *
+ * Signaling thread :
+ * \code
+ *    opj_mutex_lock(mutex);
+ *    some_application_level_condition = TRUE;
+ *    opj_cond_signal(cond);
+ *    opj_mutex_unlock(mutex);
+ * \endcode
+ *
+ * @param cond the condition to wait.
+ * @param mutex the mutex (in acquired state before calling this function)
+ */
+void opj_cond_wait(opj_cond_t* cond, opj_mutex_t* mutex);
+
+/** Signal waiting threads on a condition.
+ * One of the thread waiting with opj_cond_wait() will be waken up.
+ * It is strongly advised that this call is done with the mutex that is used
+ * by opj_cond_wait(), in a acquired state.
+ * @param cond the condition to signal.
+ */
+void opj_cond_signal(opj_cond_t* cond);
+
+/** Destroy a condition
+ * @param cond the condition to destroy.
+ */
+void opj_cond_destroy(opj_cond_t* cond);
+
+/*@}*/
+
+/** @name Thread */
+/*@{*/
+
+/** Opaque type for a thread handle */
+typedef struct opj_thread_t opj_thread_t;
+
+/** User function to execute in a thread
+ * @param user_data user data provided with opj_thread_create()
+ */
+typedef void (*opj_thread_fn)(void* user_data);
+
+/** Creates a new thread.
+ * @param thread_fn Function to run in the new thread.
+ * @param user_data user data provided to the thread function. Might be NULL.
+ * @return a thread handle or NULL in case of failure (can for example happen if the library
+ * is built without thread support)
+ */
+opj_thread_t* opj_thread_create(opj_thread_fn thread_fn, void* user_data);
+
+/** Wait for a thread to be finished and release associated resources to the
+ * thread handle.
+ * @param thread the thread to wait for being finished.
+ */
+void opj_thread_join(opj_thread_t* thread);
+
+/*@}*/
+
+/** @name Thread local storage */
+/*@{*/
+/** Opaque type for a thread local storage */
+typedef struct opj_tls_t opj_tls_t;
+
+/** Get a thread local value corresponding to the provided key.
+ * @param tls thread local storage handle
+ * @param key key whose value to retrieve.
+ * @return value associated with the key, or NULL is missing.
+ */
+void* opj_tls_get(opj_tls_t* tls, int key);
+
+/** Type of the function used to free a TLS value */
+typedef void (*opj_tls_free_func)(void* value);
+
+/** Set a thread local value corresponding to the provided key.
+ * @param tls thread local storage handle
+ * @param key key whose value to set.
+ * @param value value to set (may be NULL).
+ * @param free_func function to call currently installed value.
+ * @return OPJ_TRUE if successful.
+ */
+OPJ_BOOL opj_tls_set(opj_tls_t* tls, int key, void* value,
+                     opj_tls_free_func free_func);
+
+/*@}*/
+
+/** @name Thread pool */
+/*@{*/
+
+/** Opaque type for a thread pool */
+typedef struct opj_thread_pool_t opj_thread_pool_t;
+
+/** Create a new thread pool.
+ * num_thread must nominally be >= 1 to create a real thread pool. If num_threads
+ * is negative or null, then a dummy thread pool will be created. All functions
+ * operating on the thread pool will work, but job submission will be run
+ * synchronously in the calling thread.
+ *
+ * @param num_threads the number of threads to allocate for this thread pool.
+ * @return a thread pool handle, or NULL in case of failure (can for example happen if the library
+ * is built without thread support)
+ */
+opj_thread_pool_t* opj_thread_pool_create(int num_threads);
+
+/** User function to execute in a thread
+ * @param user_data user data provided with opj_thread_create()
+ * @param tls handle to thread local storage
+ */
+typedef void (*opj_job_fn)(void* user_data, opj_tls_t* tls);
+
+
+/** Submit a new job to be run by one of the thread in the thread pool.
+ * The job ( thread_fn, user_data ) will be added in the queue of jobs managed
+ * by the thread pool, and run by the first thread that is no longer busy.
+ *
+ * @param tp the thread pool handle.
+ * @param job_fn Function to run. Must not be NULL.
+ * @param user_data User data provided to thread_fn.
+ * @return OPJ_TRUE if the job was successfully submitted.
+ */
+OPJ_BOOL opj_thread_pool_submit_job(opj_thread_pool_t* tp, opj_job_fn job_fn,
+                                    void* user_data);
+
+/** Wait that no more than max_remaining_jobs jobs are remaining in the queue of
+ * the thread pool. The aim of this function is to avoid submitting too many
+ * jobs while the thread pool cannot cope fast enough with them, which would
+ * result potentially in out-of-memory situations with too many job descriptions
+ * being queued.
+ *
+ * @param tp the thread pool handle
+ * @param max_remaining_jobs maximum number of jobs allowed to be queued without waiting.
+ */
+void opj_thread_pool_wait_completion(opj_thread_pool_t* tp,
+                                     int max_remaining_jobs);
+
+/** Return the number of threads associated with the thread pool.
+ *
+ * @param tp the thread pool handle.
+ * @return number of threads associated with the thread pool.
+ */
+int opj_thread_pool_get_thread_count(opj_thread_pool_t* tp);
+
+/** Destroy a thread pool.
+ * @param tp the thread pool handle.
+ */
+void opj_thread_pool_destroy(opj_thread_pool_t* tp);
+
+/*@}*/
+
+/*@}*/
+
+#endif /* THREAD_H */
diff --git a/third_party/libopenjpeg20/tls_keys.h b/third_party/libopenjpeg20/tls_keys.h
new file mode 100644
index 0000000..23f8475
--- /dev/null
+++ b/third_party/libopenjpeg20/tls_keys.h
@@ -0,0 +1,37 @@
+/*
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
+ * party and contributor rights, including patent rights, and no such rights
+ * are granted under this license.
+ *
+ * Copyright (c) 2016, Even Rouault
+ * 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_TLS_KEYS_H
+#define OPJ_TLS_KEYS_H
+
+#define OPJ_TLS_KEY_T1  0
+
+#endif /* OPJ_TLS_KEY_H */
