update libopenjpeg from 1.3 to 1.5, since 1.3 has a bug saving alpha channels.
authorCampbell Barton <ideasman42@gmail.com>
Thu, 21 Jun 2012 09:47:30 +0000 (09:47 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 21 Jun 2012 09:47:30 +0000 (09:47 +0000)
the patches/ dir is NOT applied but perhaps we can get OSX and BSD working using the opj_config.h

37 files changed:
extern/libopenjpeg/CMakeLists.txt
extern/libopenjpeg/cidx_manager.c [new file with mode: 0644]
extern/libopenjpeg/cidx_manager.h [new file with mode: 0644]
extern/libopenjpeg/cio.c
extern/libopenjpeg/cio.h
extern/libopenjpeg/dwt.c
extern/libopenjpeg/event.c
extern/libopenjpeg/event.h
extern/libopenjpeg/image.c
extern/libopenjpeg/image.h
extern/libopenjpeg/indexbox_manager.h [new file with mode: 0644]
extern/libopenjpeg/j2k.c
extern/libopenjpeg/j2k.h
extern/libopenjpeg/j2k_lib.c
extern/libopenjpeg/j2k_lib.h
extern/libopenjpeg/jp2.c
extern/libopenjpeg/jp2.h
extern/libopenjpeg/mct.c
extern/libopenjpeg/mqc.c
extern/libopenjpeg/mqc.h
extern/libopenjpeg/openjpeg.c
extern/libopenjpeg/openjpeg.h
extern/libopenjpeg/opj_config.h [new file with mode: 0644]
extern/libopenjpeg/opj_includes.h
extern/libopenjpeg/opj_malloc.h
extern/libopenjpeg/phix_manager.c [new file with mode: 0644]
extern/libopenjpeg/pi.c
extern/libopenjpeg/pi.h
extern/libopenjpeg/ppix_manager.c [new file with mode: 0644]
extern/libopenjpeg/t1.c
extern/libopenjpeg/t1.h
extern/libopenjpeg/t2.c
extern/libopenjpeg/t2.h
extern/libopenjpeg/tcd.c
extern/libopenjpeg/tcd.h
extern/libopenjpeg/thix_manager.c [new file with mode: 0644]
extern/libopenjpeg/tpix_manager.c [new file with mode: 0644]

index 6967048ac83362e9d34b8072d9c4dac8c0960cb1..c602ddcabb9a8281c03ccf45ed87f6d936778d53 100644 (file)
@@ -54,6 +54,11 @@ set(SRC
        t2.c
        tcd.c
        tgt.c
+       cidx_manager.c
+       phix_manager.c
+       ppix_manager.c
+       thix_manager.c
+       tpix_manager.c
 
        bio.h
        cio.h
@@ -78,6 +83,9 @@ set(SRC
        t2.h
        tcd.h
        tgt.h
+       cidx_manager.h
+       indexbox_manager.h
+       opj_config.h
 )
 
 blender_add_lib(extern_openjpeg "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/extern/libopenjpeg/cidx_manager.c b/extern/libopenjpeg/cidx_manager.c
new file mode 100644 (file)
index 0000000..6131b93
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * $Id: cidx_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "opj_includes.h"
+
+
+/* 
+ * Write CPTR Codestream finder box
+ *
+ * @param[in] coff offset of j2k codestream
+ * @param[in] clen length of j2k codestream
+ * @param[in] cio  file output handle
+ */
+void write_cptr(int coff, int clen, opj_cio_t *cio);
+
+
+/* 
+ * Write main header index table (box)
+ *
+ * @param[in] coff offset of j2k codestream
+ * @param[in] cstr_info codestream information
+ * @param[in] cio  file output handle
+ * @return         length of mainmhix box
+ */
+int write_mainmhix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio);
+
+
+/* 
+ * Check if EPH option is used
+ *
+ * @param[in] coff    offset of j2k codestream
+ * @param[in] markers marker information
+ * @param[in] marknum number of markers
+ * @param[in] cio     file output handle
+ * @return            true if EPH is used
+ */
+opj_bool check_EPHuse( int coff, opj_marker_info_t *markers, int marknum, opj_cio_t *cio);
+
+
+int write_cidx( int offset, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t cstr_info, int j2klen)
+{
+  int len, i, lenp;
+  opj_jp2_box_t *box;
+  int num_box = 0;
+  opj_bool  EPHused;
+  (void)image; /* unused ? */
+
+  lenp = -1;
+  box = (opj_jp2_box_t *)opj_calloc( 32, sizeof(opj_jp2_box_t));
+
+  for (i=0;i<2;i++){
+  
+    if(i)
+      cio_seek( cio, lenp);
+
+    lenp = cio_tell( cio);
+
+    cio_skip( cio, 4);              /* L [at the end] */
+    cio_write( cio, JPIP_CIDX, 4);  /* CIDX           */
+    write_cptr( offset, cstr_info.codestream_size, cio);
+
+    write_manf( i, num_box, box, cio);
+    
+    num_box = 0;
+    box[num_box].length = write_mainmhix( offset, cstr_info, cio);
+    box[num_box].type = JPIP_MHIX;
+    num_box++;
+
+    box[num_box].length = write_tpix( offset, cstr_info, j2klen, cio);
+    box[num_box].type = JPIP_TPIX;
+    num_box++;
+      
+    box[num_box].length = write_thix( offset, cstr_info, cio);
+    box[num_box].type = JPIP_THIX;
+    num_box++;
+
+    EPHused = check_EPHuse( offset, cstr_info.marker, cstr_info.marknum, cio);
+      
+    box[num_box].length = write_ppix( offset, cstr_info, EPHused, j2klen, cio);
+    box[num_box].type = JPIP_PPIX;
+    num_box++;
+    
+    box[num_box].length = write_phix( offset, cstr_info, EPHused, j2klen, cio);
+    box[num_box].type = JPIP_PHIX;
+    num_box++;
+      
+    len = cio_tell( cio)-lenp;
+    cio_seek( cio, lenp);
+    cio_write( cio, len, 4);        /* L             */
+    cio_seek( cio, lenp+len);
+  }
+
+  opj_free( box);
+  
+  return len;
+}
+
+void write_cptr(int coff, int clen, opj_cio_t *cio)
+{
+  int len, lenp;
+
+  lenp = cio_tell( cio);
+  cio_skip( cio, 4);               /* L [at the end]     */
+  cio_write( cio, JPIP_CPTR, 4);   /* T                  */
+  cio_write( cio, 0, 2);           /* DR  A PRECISER !!  */
+  cio_write( cio, 0, 2);           /* CONT               */
+  cio_write( cio, coff, 8);    /* COFF A PRECISER !! */
+  cio_write( cio, clen, 8);    /* CLEN               */
+  len = cio_tell( cio) - lenp;
+  cio_seek( cio, lenp);
+  cio_write( cio, len, 4);         /* L                  */
+  cio_seek( cio, lenp+len);
+}
+
+void write_manf(int second, int v, opj_jp2_box_t *box, opj_cio_t *cio)
+{
+  int len, lenp, i;
+  
+  lenp = cio_tell( cio); 
+  cio_skip( cio, 4);                         /* L [at the end]                    */
+  cio_write( cio, JPIP_MANF,4);              /* T                                 */
+
+  if (second){                          /* Write only during the second pass */
+    for( i=0; i<v; i++){
+      cio_write( cio, box[i].length, 4);  /* Box length                     */ 
+      cio_write( cio, box[i].type, 4); /* Box type                       */
+    }
+  }
+
+  len = cio_tell( cio) - lenp;
+  cio_seek( cio, lenp);
+  cio_write( cio, len, 4);                   /* L                                 */
+  cio_seek( cio, lenp+len);
+}
+
+int write_mainmhix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio)
+{
+  int i;
+  int len, lenp;
+  
+  lenp = cio_tell( cio);
+  cio_skip( cio, 4);                               /* L [at the end]                    */
+  cio_write( cio, JPIP_MHIX, 4);                   /* MHIX                              */
+
+  cio_write( cio, cstr_info.main_head_end-cstr_info.main_head_start+1, 8);        /* TLEN                              */
+
+  for(i = 1; i < cstr_info.marknum; i++){    /* Marker restricted to 1 apparition, skip SOC marker */
+    cio_write( cio, cstr_info.marker[i].type, 2);
+    cio_write( cio, 0, 2);
+    cio_write( cio, cstr_info.marker[i].pos-coff, 8);
+    cio_write( cio, cstr_info.marker[i].len, 2);
+  }
+
+  len = cio_tell( cio) - lenp;
+  cio_seek( cio, lenp);
+  cio_write( cio, len, 4);        /* L           */
+  cio_seek( cio, lenp+len);
+  
+  return len;
+}
+
+opj_bool check_EPHuse( int coff, opj_marker_info_t *markers, int marknum, opj_cio_t *cio)
+{
+  opj_bool EPHused = OPJ_FALSE;
+  int i=0;
+  int org_pos;
+  unsigned int Scod;
+
+  for(i = 0; i < marknum; i++){
+    if( markers[i].type == J2K_MS_COD){
+      org_pos = cio_tell( cio);
+      cio_seek( cio, coff+markers[i].pos+2);
+      
+      Scod = cio_read( cio, 1);
+      if( ((Scod >> 2) & 1))
+       EPHused = OPJ_TRUE;
+      cio_seek( cio, org_pos);
+
+      break;
+    }
+  }    
+  return EPHused;
+}
diff --git a/extern/libopenjpeg/cidx_manager.h b/extern/libopenjpeg/cidx_manager.h
new file mode 100644 (file)
index 0000000..23eebd5
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * $Id: cidx_manager.h 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * 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.
+ */
+
+/*! \file
+ *  \brief Modification of jpip.h from 2KAN indexer
+ */
+
+
+#ifndef  CIDX_MANAGER_H_
+# define CIDX_MANAGER_H_
+
+#include "openjpeg.h"
+
+
+/* 
+ * Write Codestream index box (superbox)
+ *
+ * @param[in] offset    offset of j2k codestream
+ * @param[in] cio       file output handle
+ * @param[in] image     image data
+ * @param[in] cstr_info codestream information
+ * @param[in] j2klen    length of j2k codestream
+ * @return              length of cidx box
+ */
+int write_cidx( int offset, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t cstr_info, int j2klen);
+
+
+#endif      /* !CIDX_MANAGER_H_ */
index 2ac262a1f6b54013165218e2bd1a6e2d6d53f36b..b8a7ecf8a873a7f4cf001e59334a98d4dc6ae383 100644 (file)
@@ -126,13 +126,13 @@ unsigned char *cio_getbp(opj_cio_t *cio) {
 /*
  * Write a byte.
  */
-bool cio_byteout(opj_cio_t *cio, unsigned char v) {
+opj_bool cio_byteout(opj_cio_t *cio, unsigned char v) {
        if (cio->bp >= cio->end) {
                opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n");
-               return false;
+               return OPJ_FALSE;
        }
        *cio->bp++ = v;
-       return true;
+       return OPJ_TRUE;
 }
 
 /*
@@ -152,7 +152,7 @@ unsigned char cio_bytein(opj_cio_t *cio) {
  * v : value to write
  * n : number of bytes to write
  */
-unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n) {
+unsigned int cio_write(opj_cio_t *cio, unsigned long long int v, int n) {
        int i;
        for (i = n - 1; i >= 0; i--) {
                if( !cio_byteout(cio, (unsigned char) ((v >> (i << 3)) & 0xff)) )
index 580bf9c0d12a47ff92f30d4c9965167db43219ff..ce1a13ecb3a5cab9ac1b8aaaaeab30e77e0420c5 100644 (file)
@@ -63,7 +63,7 @@ Write some bytes
 @param n Number of bytes to write
 @return Returns the number of bytes written or 0 if an error occured
 */
-unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n);
+unsigned int cio_write(opj_cio_t *cio, unsigned long long int v, int n);
 /**
 Read some bytes
 @param cio CIO handle
index 357b475b9ac35fec704488dbb593e7103b6052f1..0fbfc2033fe63f6bf499018800bbf6ab1622b5ae 100644 (file)
@@ -64,12 +64,12 @@ typedef struct v4dwt_local {
        int             cas ;
 } v4dwt_t ;
 
-static const float dwt_alpha =  1.586134342f; //  12994
-static const float dwt_beta  =  0.052980118f; //    434
-static const float dwt_gamma = -0.882911075f; //  -7233
-static const float dwt_delta = -0.443506852f; //  -3633
+static const float dwt_alpha =  1.586134342f; /*  12994 */
+static const float dwt_beta  =  0.052980118f; /*    434 */
+static const float dwt_gamma = -0.882911075f; /*  -7233 */
+static const float dwt_delta = -0.443506852f; /*  -3633 */
 
-static const float K      = 1.230174105f; //  10078
+static const float K      = 1.230174105f; /*  10078 */
 /* FIXME: What is this constant? */
 static const float c13318 = 1.625732422f;
 
@@ -527,7 +527,7 @@ static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int numres, DWT1DFN dwt_1
 
        int w = tilec->x1 - tilec->x0;
 
-       h.mem = opj_aligned_malloc(dwt_decode_max_resolution(tr, numres) * sizeof(int));
+       h.mem = (int*)opj_aligned_malloc(dwt_decode_max_resolution(tr, numres) * sizeof(int));
        v.mem = h.mem;
 
        while( --numres) {
@@ -570,6 +570,20 @@ static void v4dwt_interleave_h(v4dwt_t* restrict w, float* restrict a, int x, in
        int count = w->sn;
        int 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){
+                               int 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){
                        int j = i;
                        bi[i*8    ] = a[j];
@@ -583,6 +597,7 @@ static void v4dwt_interleave_h(v4dwt_t* restrict w, float* restrict a, int x, in
                        if(j > size) continue;
                        bi[i*8 + 3] = a[j];
                }
+               }
                bi = (float*) (w->wavelet + 1 - w->cas);
                a += w->sn;
                size -= w->sn;
@@ -608,9 +623,21 @@ static void v4dwt_interleave_v(v4dwt_t* restrict v , float* restrict a , int x){
 static void v4dwt_decode_step1_sse(v4* w, int count, const __m128 c){
        __m128* restrict vw = (__m128*) w;
        int 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){
-               __m128 tmp = vw[i*2];
-               vw[i*2] = _mm_mul_ps(tmp, c);
+               *vw = _mm_mul_ps(*vw, c);
+               vw += 2;
        }
 }
 
@@ -618,14 +645,16 @@ static void v4dwt_decode_step2_sse(v4* l, v4* w, int k, int m, __m128 c){
        __m128* restrict vl = (__m128*) l;
        __m128* restrict vw = (__m128*) w;
        int i;
+       __m128 tmp1, tmp2, tmp3;
+       tmp1 = vl[0];
        for(i = 0; i < m; ++i){
-               __m128 tmp1 = vl[ 0];
-               __m128 tmp2 = vw[-1];
-               __m128 tmp3 = vw[ 0];
+               tmp2 = vw[-1];
+               tmp3 = vw[ 0];
                vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c));
-               vl = vw;
+               tmp1 = tmp3;
                vw += 2;
        }
+       vl = vw - 2;
        if(m >= k){
                return;
        }
@@ -773,19 +802,24 @@ void dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, int numres){
                h.dn = rw - h.sn;
                h.cas = res->x0 % 2;
 
-               for(j = rh; j > 0; j -= 4){
+               for(j = rh; j > 3; j -= 4){
+                       int k;
                        v4dwt_interleave_h(&h, aj, w, bufsize);
                        v4dwt_decode(&h);
-                       if(j >= 4){
-                               int k;
                                for(k = rw; --k >= 0;){
                                        aj[k    ] = h.wavelet[k].f[0];
                                        aj[k+w  ] = h.wavelet[k].f[1];
                                        aj[k+w*2] = h.wavelet[k].f[2];
                                        aj[k+w*3] = h.wavelet[k].f[3];
                                }
-                       }else{
+                       aj += w*4;
+                       bufsize -= w*4;
+               }
+               if (rh & 0x03) {
                                int k;
+                       j = rh & 0x03;
+                       v4dwt_interleave_h(&h, aj, w, bufsize);
+                       v4dwt_decode(&h);
                                for(k = rw; --k >= 0;){
                                        switch(j) {
                                                case 3: aj[k+w*2] = h.wavelet[k].f[2];
@@ -794,30 +828,29 @@ void dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, int numres){
                                        }
                                }
                        }
-                       aj += w*4;
-                       bufsize -= w*4;
-               }
 
                v.dn = rh - v.sn;
                v.cas = res->y0 % 2;
 
                aj = (float*) tilec->data;
-               for(j = rw; j > 0; j -= 4){
+               for(j = rw; j > 3; j -= 4){
+                       int k;
                        v4dwt_interleave_v(&v, aj, w);
                        v4dwt_decode(&v);
-                       if(j >= 4){
-                               int k;
                                for(k = 0; k < rh; ++k){
                                        memcpy(&aj[k*w], &v.wavelet[k], 4 * sizeof(float));
                                }
-                       }else{
+                       aj += 4;
+               }
+               if (rw & 0x03){
                                int k;
+                       j = rw & 0x03;
+                       v4dwt_interleave_v(&v, aj, w);
+                       v4dwt_decode(&v);
                                for(k = 0; k < rh; ++k){
                                        memcpy(&aj[k*w], &v.wavelet[k], j * sizeof(float));
                                }
                        }
-                       aj += 4;
-               }
        }
 
        opj_aligned_free(h.wavelet);
index fe46e423552771355a56cebc339fad454d1503de..0dc22f125499182ee54e1c84728c3f5838ac2d21 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -29,8 +29,9 @@
 /* ==========================================================
      Utility functions
    ==========================================================*/
-#if 0
-#if !defined(_MSC_VER) && !defined(__MINGW32__)
+
+#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);
@@ -57,8 +58,8 @@ _itoa(int i, char *a, int r) {
        return a;
 }
 
-#endif /* !WIN32 */
-#endif /* unused - campbell */
+#endif /* !_WIN32 */
+#endif
 /* ----------------------------------------------------------------------- */
 
 opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, opj_event_mgr_t *event_mgr, void *context) {
@@ -72,7 +73,7 @@ opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo, opj_event_
        return NULL;
 }
 
-bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) {
+opj_bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) {
 #define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */
        opj_msg_callback msg_handler = NULL;
 
@@ -92,10 +93,10 @@ bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) {
                                break;
                }
                if(msg_handler == NULL) {
-                       return false;
+                       return OPJ_FALSE;
                }
        } else {
-               return false;
+               return OPJ_FALSE;
        }
 
        if ((fmt != NULL) && (event_mgr != NULL)) {
@@ -116,6 +117,6 @@ bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...) {
                msg_handler(message, cinfo->client_data);
        }
 
-       return true;
+       return OPJ_TRUE;
 }
 
index 11910b0e4bcd3925c1f875de171ce5e3ea71e020..9c59787caf3ac11072eb0f79dd1e48e03893b698 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -49,7 +49,7 @@ Write formatted data to a string and send the string to a user callback.
 @param fmt Format-control string (plus optionnal arguments)
 @return Returns true if successful, returns false otherwise
 */
-bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...);
+opj_bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...);
 /* ----------------------------------------------------------------------- */
 /*@}*/
 
index ea8e59ea547ab91d12b538d1ff8bf889e3ce241d..a4d2c010a56d1ab6863c60b5e1b604f92d6b9829 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -27,7 +27,7 @@
 #include "opj_includes.h"
 
 opj_image_t* opj_image_create0(void) {
-       opj_image_t *image = (opj_image_t*)opj_malloc(sizeof(opj_image_t));
+       opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t));
        return image;
 }
 
index 04c362eb8345a93ced54c6dd28c0ac1fa68c1927..f828b5b77c87c51c27c44f43c59c892fdc8063b6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/extern/libopenjpeg/indexbox_manager.h b/extern/libopenjpeg/indexbox_manager.h
new file mode 100644 (file)
index 0000000..7364df6
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * $Id: indexbox_manager.h 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * 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.
+ */
+
+/*! \file
+ *  \brief Modification of jpip.c from 2KAN indexer
+ */
+
+#ifndef  INDEXBOX_MANAGER_H_
+# define INDEXBOX_MANAGER_H_
+
+#include "openjpeg.h"
+#include "j2k.h" /* needed to use jp2.h */
+#include "jp2.h"
+
+#define JPIP_CIDX 0x63696478   /* Codestream index                */
+#define JPIP_CPTR 0x63707472   /* Codestream Finder Box           */
+#define JPIP_MANF 0x6d616e66   /* Manifest Box                    */
+#define JPIP_FAIX 0x66616978   /* Fragment array Index box        */
+#define JPIP_MHIX 0x6d686978   /* Main Header Index Table         */
+#define JPIP_TPIX 0x74706978   /* Tile-part Index Table box       */
+#define JPIP_THIX 0x74686978   /* Tile header Index Table box     */
+#define JPIP_PPIX 0x70706978   /* Precinct Packet Index Table box */
+#define JPIP_PHIX 0x70686978   /* Packet Header index Table       */
+#define JPIP_FIDX 0x66696478   /* File Index                      */
+#define JPIP_FPTR 0x66707472   /* File Finder                     */
+#define JPIP_PRXY 0x70727879   /* Proxy boxes                     */
+#define JPIP_IPTR 0x69707472   /* Index finder box                */
+#define JPIP_PHLD 0x70686c64   /* Place holder                    */
+
+
+/* 
+ * Write tile-part Index table box (superbox)
+ *
+ * @param[in] coff      offset of j2k codestream
+ * @param[in] cstr_info codestream information
+ * @param[in] j2klen    length of j2k codestream
+ * @param[in] cio       file output handle
+ * @return              length of tpix box
+ */
+int write_tpix( int coff, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio);
+
+
+/* 
+ * Write tile header index table box (superbox)
+ *
+ * @param[in] coff      offset of j2k codestream
+ * @param[in] cstr_info codestream information pointer
+ * @param[in] cio       file output handle
+ * @return              length of thix box
+ */
+int write_thix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio);
+
+
+/* 
+ * Write precinct packet index table box (superbox)
+ *
+ * @param[in] coff      offset of j2k codestream
+ * @param[in] cstr_info codestream information
+ * @param[in] EPHused   true if EPH option used
+ * @param[in] j2klen    length of j2k codestream
+ * @param[in] cio       file output handle
+ * @return              length of ppix box
+ */
+int write_ppix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio);
+
+
+/* 
+ * Write packet header index table box (superbox)
+ *
+ * @param[in] coff      offset of j2k codestream
+ * @param[in] cstr_info codestream information
+ * @param[in] EPHused   true if EPH option used
+ * @param[in] j2klen    length of j2k codestream
+ * @param[in] cio       file output handle
+ * @return              length of ppix box
+ */
+int write_phix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio);
+
+/* 
+ * Wriet manifest box (box)
+ *
+ * @param[in] second number to be visited
+ * @param[in] v      number of boxes
+ * @param[in] box    box to be manifested
+ * @param[in] cio    file output handle
+ */
+void write_manf(int second, int v, opj_jp2_box_t *box, opj_cio_t *cio);
+
+
+#endif      /* !INDEXBOX_MANAGER_H_ */
index 8e7b1ce081f2ca101cc7daa3a077b280d8c3bfd6..d34c75faa7ba20cecbccf02986d524ba8d5484c2 100644 (file)
@@ -6,6 +6,7 @@
  * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2006-2007, Parvatha Elangovan
+ * Copyright (c) 2010-2011, Kaori Hagihara
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -228,6 +229,23 @@ Read an unknown marker
 @param j2k J2K handle
 */
 static void j2k_read_unk(opj_j2k_t *j2k);
+/**
+Add main header marker information
+@param cstr_info Codestream information structure
+@param type marker type
+@param pos byte offset of marker segment
+@param len length of marker segment
+ */
+static void j2k_add_mhmarker(opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len);
+/**
+Add tile header marker information
+@param tileno tile index number
+@param cstr_info Codestream information structure
+@param type marker type
+@param pos byte offset of marker segment
+@param len length of marker segment
+ */
+static void j2k_add_tlmarker( int tileno, opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len);
 
 /*@}*/
 
@@ -236,7 +254,7 @@ static void j2k_read_unk(opj_j2k_t *j2k);
 /* ----------------------------------------------------------------------- */
 typedef struct j2k_prog_order{
        OPJ_PROG_ORDER enum_prog;
-       char str_prog[4];
+       char str_prog[5];
 }j2k_prog_order_t;
 
 j2k_prog_order_t j2k_prog_order_list[] = {
@@ -245,7 +263,7 @@ j2k_prog_order_t j2k_prog_order_list[] = {
        {PCRL, "PCRL"},
        {RLCP, "RLCP"},
        {RPCL, "RPCL"},
-       {-1, ""}
+       {(OPJ_PROG_ORDER)-1, ""}
 };
 
 char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){
@@ -258,79 +276,6 @@ char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){
        return po->str_prog;
 }
 
-void j2k_dump_image(FILE *fd, opj_image_t * img) {
-       int compno;
-       fprintf(fd, "image {\n");
-       fprintf(fd, "  x0=%d, y0=%d, x1=%d, y1=%d\n", img->x0, img->y0, img->x1, img->y1);
-       fprintf(fd, "  numcomps=%d\n", img->numcomps);
-       for (compno = 0; compno < img->numcomps; compno++) {
-               opj_image_comp_t *comp = &img->comps[compno];
-               fprintf(fd, "  comp %d {\n", compno);
-               fprintf(fd, "    dx=%d, dy=%d\n", comp->dx, comp->dy);
-               fprintf(fd, "    prec=%d\n", comp->prec);
-               fprintf(fd, "    sgnd=%d\n", comp->sgnd);
-               fprintf(fd, "  }\n");
-       }
-       fprintf(fd, "}\n");
-}
-
-void j2k_dump_cp(FILE *fd, opj_image_t * img, opj_cp_t * cp) {
-       int tileno, compno, layno, bandno, resno, numbands;
-       fprintf(fd, "coding parameters {\n");
-       fprintf(fd, "  tx0=%d, ty0=%d\n", cp->tx0, cp->ty0);
-       fprintf(fd, "  tdx=%d, tdy=%d\n", cp->tdx, cp->tdy);
-       fprintf(fd, "  tw=%d, th=%d\n", cp->tw, cp->th);
-       for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
-               opj_tcp_t *tcp = &cp->tcps[tileno];
-               fprintf(fd, "  tile %d {\n", tileno);
-               fprintf(fd, "    csty=%x\n", tcp->csty);
-               fprintf(fd, "    prg=%d\n", tcp->prg);
-               fprintf(fd, "    numlayers=%d\n", tcp->numlayers);
-               fprintf(fd, "    mct=%d\n", tcp->mct);
-               fprintf(fd, "    rates=");
-               for (layno = 0; layno < tcp->numlayers; layno++) {
-                       fprintf(fd, "%.1f ", tcp->rates[layno]);
-               }
-               fprintf(fd, "\n");
-               for (compno = 0; compno < img->numcomps; compno++) {
-                       opj_tccp_t *tccp = &tcp->tccps[compno];
-                       fprintf(fd, "    comp %d {\n", compno);
-                       fprintf(fd, "      csty=%x\n", tccp->csty);
-                       fprintf(fd, "      numresolutions=%d\n", tccp->numresolutions);
-                       fprintf(fd, "      cblkw=%d\n", tccp->cblkw);
-                       fprintf(fd, "      cblkh=%d\n", tccp->cblkh);
-                       fprintf(fd, "      cblksty=%x\n", tccp->cblksty);
-                       fprintf(fd, "      qmfbid=%d\n", tccp->qmfbid);
-                       fprintf(fd, "      qntsty=%d\n", tccp->qntsty);
-                       fprintf(fd, "      numgbits=%d\n", tccp->numgbits);
-                       fprintf(fd, "      roishift=%d\n", tccp->roishift);
-                       fprintf(fd, "      stepsizes=");
-                       numbands = tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 - 2;
-                       for (bandno = 0; bandno < numbands; bandno++) {
-                               fprintf(fd, "(%d,%d) ", tccp->stepsizes[bandno].mant,
-                                       tccp->stepsizes[bandno].expn);
-                       }
-                       fprintf(fd, "\n");
-                       
-                       if (tccp->csty & J2K_CCP_CSTY_PRT) {
-                               fprintf(fd, "      prcw=");
-                               for (resno = 0; resno < tccp->numresolutions; resno++) {
-                                       fprintf(fd, "%d ", tccp->prcw[resno]);
-                               }
-                               fprintf(fd, "\n");
-                               fprintf(fd, "      prch=");
-                               for (resno = 0; resno < tccp->numresolutions; resno++) {
-                                       fprintf(fd, "%d ", tccp->prch[resno]);
-                               }
-                               fprintf(fd, "\n");
-                       }
-                       fprintf(fd, "    }\n");
-               }
-               fprintf(fd, "  }\n");
-       }
-       fprintf(fd, "}\n");
-}
-
 /* ----------------------------------------------------------------------- */
 static int j2k_get_num_tp(opj_cp_t *cp,int pino,int tileno){
        char *prog;
@@ -370,6 +315,9 @@ static int j2k_get_num_tp(opj_cp_t *cp,int pino,int tileno){
 /**    mem allocation for TLM marker*/
 int j2k_calculate_tp(opj_cp_t *cp,int img_numcomp,opj_image_t *image,opj_j2k_t *j2k ){
        int pino,tileno,totnum_tp=0;
+
+       OPJ_ARG_NOT_USED(img_numcomp);
+
        j2k->cur_totnum_tp = (int *) opj_malloc(cp->tw * cp->th * sizeof(int));
        for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
                int cur_totnum_tp = 0;
@@ -398,12 +346,14 @@ static void j2k_write_soc(opj_j2k_t *j2k) {
        opj_cio_t *cio = j2k->cio;
        cio_write(cio, J2K_MS_SOC, 2);
 
+       if(j2k->cstr_info)
+         j2k_add_mhmarker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio), 0);
+
 /* UniPG>> */
 #ifdef USE_JPWL
 
        /* update markers struct */
        j2k_add_marker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio) - 2, 2);
-
 #endif /* USE_JPWL */
 /* <<UniPG */
 }
@@ -424,7 +374,7 @@ static void j2k_write_siz(opj_j2k_t *j2k) {
        opj_cio_t *cio = j2k->cio;
        opj_image_t *image = j2k->image;
        opj_cp_t *cp = j2k->cp;
-       
+
        cio_write(cio, J2K_MS_SIZ, 2);  /* SIZ */
        lenp = cio_tell(cio);
        cio_skip(cio, 2);
@@ -447,6 +397,9 @@ static void j2k_write_siz(opj_j2k_t *j2k) {
        cio_seek(cio, lenp);
        cio_write(cio, len, 2);         /* Lsiz */
        cio_seek(cio, lenp + len);
+       
+       if(j2k->cstr_info)
+         j2k_add_mhmarker(j2k->cstr_info, J2K_MS_SIZ, lenp, len);
 }
 
 static void j2k_read_siz(opj_j2k_t *j2k) {
@@ -467,6 +420,13 @@ static void j2k_read_siz(opj_j2k_t *j2k) {
        cp->tx0 = cio_read(cio, 4);             /* XT0siz */
        cp->ty0 = cio_read(cio, 4);             /* YT0siz */
        
+       if ((image->x0<0)||(image->x1<0)||(image->y0<0)||(image->y1<0)) {
+               opj_event_msg(j2k->cinfo, EVT_ERROR,
+                                                                       "%s: invalid image size (x0:%d, x1:%d, y0:%d, y1:%d)\n",
+                                                                       image->x0,image->x1,image->y0,image->y1);
+               return;
+       }
+       
        image->numcomps = cio_read(cio, 2);     /* Csiz */
 
 #ifdef USE_JPWL
@@ -670,6 +630,11 @@ static void j2k_write_com(opj_j2k_t *j2k) {
                cio_seek(cio, lenp);
                cio_write(cio, len, 2);
                cio_seek(cio, lenp + len);
+
+               
+               if(j2k->cstr_info)
+                 j2k_add_mhmarker(j2k->cstr_info, J2K_MS_COM, lenp, len);
+
        }
 }
 
@@ -713,7 +678,7 @@ static void j2k_read_cox(opj_j2k_t *j2k, int compno) {
 
        tccp->numresolutions = cio_read(cio, 1) + 1;    /* SPcox (D) */
 
-       // If user wants to remove more resolutions than the codestream contains, return error
+       /* If user wants to remove more resolutions than the codestream contains, return error*/
        if (cp->reduce >= tccp->numresolutions) {
                opj_event_msg(j2k->cinfo, 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);
@@ -773,6 +738,10 @@ static void j2k_write_cod(opj_j2k_t *j2k) {
        cio_seek(cio, lenp);
        cio_write(cio, len, 2);         /* Lcod */
        cio_seek(cio, lenp + len);
+
+       if(j2k->cstr_info)
+         j2k_add_mhmarker(j2k->cstr_info, J2K_MS_COD, lenp, len);
+
 }
 
 static void j2k_read_cod(opj_j2k_t *j2k) {
@@ -901,6 +870,15 @@ static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len) {
                };
 
        };
+
+#else
+       /* We check whether there are too many subbands */
+       if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) {
+               opj_event_msg(j2k->cinfo, EVT_WARNING ,
+                                       "bad number of subbands in Sqcx (%d) regarding to J2K_MAXBANDS (%d) \n"
+                                   "- limiting number of bands to J2K_MAXBANDS and try to move to the next markers\n", numbands, J2K_MAXBANDS);
+       }
+
 #endif /* USE_JPWL */
 
        for (bandno = 0; bandno < numbands; bandno++) {
@@ -913,8 +891,10 @@ static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len) {
                        expn = tmp >> 11;
                        mant = tmp & 0x7ff;
                }
-               tccp->stepsizes[bandno].expn = expn;
-               tccp->stepsizes[bandno].mant = mant;
+               if (bandno < J2K_MAXBANDS){
+                       tccp->stepsizes[bandno].expn = expn;
+                       tccp->stepsizes[bandno].mant = mant;
+               }
        }
        
        /* Add Antonin : if scalar_derived -> compute other stepsizes */
@@ -942,6 +922,9 @@ static void j2k_write_qcd(opj_j2k_t *j2k) {
        cio_seek(cio, lenp);
        cio_write(cio, len, 2);                 /* Lqcd */
        cio_seek(cio, lenp + len);
+
+       if(j2k->cstr_info)
+         j2k_add_mhmarker(j2k->cstr_info, J2K_MS_QCD, lenp, len);
 }
 
 static void j2k_read_qcd(opj_j2k_t *j2k) {
@@ -978,7 +961,7 @@ static void j2k_read_qcc(opj_j2k_t *j2k) {
        int len, compno;
        int numcomp = j2k->image->numcomps;
        opj_cio_t *cio = j2k->cio;
-       
+
        len = cio_read(cio, 2); /* Lqcc */
        compno = cio_read(cio, numcomp <= 256 ? 1 : 2); /* Cqcc */
 
@@ -1263,6 +1246,10 @@ static void j2k_write_sot(opj_j2k_t *j2k) {
        j2k_add_marker(j2k->cstr_info, J2K_MS_SOT, j2k->sot_start, len + 2);
 #endif /* USE_JPWL */
        /* <<UniPG */
+
+       if( j2k->cstr_info && j2k->cur_tp_num==0){
+         j2k_add_tlmarker( j2k->curtileno, j2k->cstr_info, J2K_MS_SOT, lenp, len);
+       }
 }
 
 static void j2k_read_sot(opj_j2k_t *j2k) {
@@ -1346,6 +1333,11 @@ static void j2k_read_sot(opj_j2k_t *j2k) {
        
        partno = cio_read(cio, 1);
        numparts = cio_read(cio, 1);
+  
+  if (partno >= numparts) {
+    opj_event_msg(j2k->cinfo, EVT_WARNING, "SOT marker inconsistency in tile %d: tile-part index greater (%d) than number of tile-parts (%d)\n", tileno, partno, numparts);
+    numparts = partno+1;
+  }
        
        j2k->curtileno = tileno;
        j2k->cur_tp_num = partno;
@@ -1361,15 +1353,14 @@ static void j2k_read_sot(opj_j2k_t *j2k) {
                        j2k->cstr_info->tile[tileno].tileno = tileno;
                        j2k->cstr_info->tile[tileno].start_pos = cio_tell(cio) - 12;
                        j2k->cstr_info->tile[tileno].end_pos = j2k->cstr_info->tile[tileno].start_pos + totlen - 1;                             
-                       j2k->cstr_info->tile[tileno].num_tps = numparts;
-                       if (numparts)
-                               j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(numparts * sizeof(opj_tp_info_t));
-                       else
-                               j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(10 * sizeof(opj_tp_info_t)); // Fixme (10)
-               }
-               else {
+    } else {
                        j2k->cstr_info->tile[tileno].end_pos += totlen;
-               }               
+               }
+    j2k->cstr_info->tile[tileno].num_tps = numparts;
+    if (numparts)
+      j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_realloc(j2k->cstr_info->tile[tileno].tp, numparts * sizeof(opj_tp_info_t));
+    else
+      j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_realloc(j2k->cstr_info->tile[tileno].tp, 10 * sizeof(opj_tp_info_t)); /* Fixme (10)*/
                j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = cio_tell(cio) - 12;
                j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos = 
                        j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1;
@@ -1405,6 +1396,11 @@ static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder) {
        tcd->cur_tp_num = j2k->cur_tp_num;
        
        cio_write(cio, J2K_MS_SOD, 2);
+
+       if( j2k->cstr_info && j2k->cur_tp_num==0){
+         j2k_add_tlmarker( j2k->curtileno, j2k->cstr_info, J2K_MS_SOD, cio_tell(cio), 0);
+       }
+
        if (j2k->curtileno == 0) {
                j2k->sod_start = cio_tell(cio) + j2k->pos_correction;
        }
@@ -1431,7 +1427,11 @@ static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder) {
        
        tcp = &cp->tcps[j2k->curtileno];
        for (layno = 0; layno < tcp->numlayers; layno++) {
-               tcp->rates[layno] -= tcp->rates[layno] ? (j2k->sod_start / (cp->th * cp->tw)) : 0;
+               if (tcp->rates[layno]>(j2k->sod_start / (cp->th * cp->tw))) {
+                       tcp->rates[layno]-=(j2k->sod_start / (cp->th * cp->tw));
+               } else if (tcp->rates[layno]) {
+                       tcp->rates[layno]=1;
+               }
        }
        if(j2k->cur_tp_num == 0){
                tcd->tcd_image->tiles->packno = 0;
@@ -1554,7 +1554,7 @@ static void j2k_write_eoc(opj_j2k_t *j2k) {
 
 static void j2k_read_eoc(opj_j2k_t *j2k) {
        int i, tileno;
-       bool success;
+       opj_bool success;
 
        /* if packets should be decoded */
        if (j2k->cp->limit_decoding != DECODE_ALL_BUT_PACKETS) {
@@ -1567,7 +1567,7 @@ static void j2k_read_eoc(opj_j2k_t *j2k) {
                        opj_free(j2k->tile_data[tileno]);
                        j2k->tile_data[tileno] = NULL;
                        tcd_free_decode_tile(tcd, i);
-                       if (success == false) {
+                       if (success == OPJ_FALSE) {
                                j2k->state |= J2K_STATE_ERR;
                                break;
                        }
@@ -1822,7 +1822,7 @@ opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *c
                if (j2k->cp->correct) {
 
                        int orig_pos = cio_tell(cio);
-                       bool status;
+                       opj_bool status;
 
                        /* call the corrector */
                        status = jpwl_correct(j2k);
@@ -1861,13 +1861,13 @@ opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *c
                        return 0;
                }
                e = j2k_dec_mstab_lookup(id);
-               // Check if the marker is known
+               /* Check if the marker is known*/
                if (!(j2k->state & e->states)) {
                        opj_image_destroy(image);
                        opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n", cio_tell(cio) - 2, id);
                        return 0;
                }
-               // Check if the decoding is limited to the main header
+               /* Check if the decoding is limited to the main header*/
                if (e->id == J2K_MS_SOT && j2k->cp->limit_decoding == LIMIT_TO_MAIN_HEADER) {
                        opj_event_msg(cinfo, EVT_INFO, "Main Header decoded.\n");
                        return image;
@@ -1893,7 +1893,6 @@ opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *c
        if (j2k->state != J2K_STATE_MT) {
                opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n");
        }
-
        return image;
 }
 
@@ -1905,9 +1904,10 @@ opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio,  opj_codestre
        opj_image_t *image = NULL;
        opj_jpt_msg_header_t header;
        int position;
-
        opj_common_ptr cinfo = j2k->cinfo;
-       
+
+       OPJ_ARG_NOT_USED(cstr_info);
+
        j2k->cio = cio;
 
        /* create an empty image */
@@ -2098,12 +2098,12 @@ void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_
                int i;
 
                /* set JPWL on */
-               cp->epc_on = true;
-               cp->info_on = false; /* no informative technique */
+               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 = true;
+                       cp->epb_on = OPJ_TRUE;
                        
                        cp->hprot_MH = parameters->jpwl_hprot_MH;
                        for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
@@ -2124,7 +2124,7 @@ void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_
 
                /* set ESD writing */
                if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
-                       cp->esd_on = true;
+                       cp->esd_on = OPJ_TRUE;
 
                        cp->sens_size = parameters->jpwl_sens_size;
                        cp->sens_addr = parameters->jpwl_sens_addr;
@@ -2138,10 +2138,10 @@ void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_
                }
 
                /* always set RED writing to false: we are at the encoder */
-               cp->red_on = false;
+               cp->red_on = OPJ_FALSE;
 
        } else {
-               cp->epc_on = false;
+               cp->epc_on = OPJ_FALSE;
        }
 #endif /* USE_JPWL */
 
@@ -2214,10 +2214,10 @@ void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_
 
                        if(parameters->cp_cinema)
                        {
-                               //Precinct size for lowest frequency subband=128
+                               /*Precinct size for lowest frequency subband=128*/
                                tccp->prcw[0] = 7;
                                tccp->prch[0] = 7;
-                               //Precinct size at all other resolutions = 256
+                               /*Precinct size at all other resolutions = 256*/
                                for (j = 1; j < tccp->numresolutions; j++) {
                                        tccp->prcw[j] = 8;
                                        tccp->prch[j] = 8;
@@ -2259,7 +2259,7 @@ void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_
                                                }
                                                p++;
                                                /*printf("\nsize precinct for level %d : %d,%d\n", j,tccp->prcw[j], tccp->prch[j]); */
-                                       }       //end for
+                                       }       /*end for*/
                                } else {
                                        for (j = 0; j < tccp->numresolutions; j++) {
                                                tccp->prcw[j] = 15;
@@ -2273,7 +2273,7 @@ void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters, opj_image_
        }
 }
 
-bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
+opj_bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
        int tileno, compno;
        opj_cp_t *cp = NULL;
 
@@ -2284,8 +2284,6 @@ bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestre
 
        cp = j2k->cp;
 
-       /* j2k_dump_cp(stdout, image, cp); */
-
        /* INDEX >> */
        j2k->cstr_info = cstr_info;
        if (cstr_info) {
@@ -2382,6 +2380,9 @@ bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestre
                /* INDEX >> */
                if(cstr_info) {
                        cstr_info->tile[j2k->curtileno].start_pos = cio_tell(cio) + j2k->pos_correction;
+                       cstr_info->tile[j2k->curtileno].maxmarknum = 10;
+                       cstr_info->tile[j2k->curtileno].marker = (opj_marker_info_t *) opj_malloc(cstr_info->tile[j2k->curtileno].maxmarknum * sizeof(opj_marker_info_t));
+                       cstr_info->tile[j2k->curtileno].marknum = 0;
                }
                /* << INDEX */
 
@@ -2488,11 +2489,46 @@ bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestre
        }
 #endif /* USE_JPWL */
 
-       return true;
+       return OPJ_TRUE;
+}
+
+static void j2k_add_mhmarker(opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len) {
+
+       if (!cstr_info)
+               return;
+
+       /* expand the list? */
+       if ((cstr_info->marknum + 1) > cstr_info->maxmarknum) {
+               cstr_info->maxmarknum = 100 + (int) ((float) cstr_info->maxmarknum * 1.0F);
+               cstr_info->marker = (opj_marker_info_t*)opj_realloc(cstr_info->marker, cstr_info->maxmarknum);
+       }
+
+       /* add the marker */
+       cstr_info->marker[cstr_info->marknum].type = type;
+       cstr_info->marker[cstr_info->marknum].pos = pos;
+       cstr_info->marker[cstr_info->marknum].len = len;
+       cstr_info->marknum++;
+
 }
 
+static void j2k_add_tlmarker( int tileno, opj_codestream_info_t *cstr_info, unsigned short int type, int pos, int len) {
 
+  opj_marker_info_t *marker;
 
+       if (!cstr_info)
+               return;
 
+       /* expand the list? */
+       if ((cstr_info->tile[tileno].marknum + 1) > cstr_info->tile[tileno].maxmarknum) {
+               cstr_info->tile[tileno].maxmarknum = 100 + (int) ((float) cstr_info->tile[tileno].maxmarknum * 1.0F);
+               cstr_info->tile[tileno].marker = (opj_marker_info_t*)opj_realloc(cstr_info->tile[tileno].marker, cstr_info->maxmarknum);
+       }
 
+       marker = &(cstr_info->tile[tileno].marker[cstr_info->tile[tileno].marknum]);
 
+       /* add the marker */
+       marker->type = type;
+       marker->pos = pos;
+       marker->len = len;
+       cstr_info->tile[tileno].marknum++;
+}
index 5599be47a8dbe5acc326cec00a9b0cf67096816e..6338c290dfd487c3ad5907287667710a662f08e4 100644 (file)
@@ -45,12 +45,12 @@ The functions in J2K.C have for goal to read/write the several parts of the code
 #define J2K_CP_CSTY_SOP 0x02
 #define J2K_CP_CSTY_EPH 0x04
 #define J2K_CCP_CSTY_PRT 0x01
-#define J2K_CCP_CBLKSTY_LAZY 0x01
-#define J2K_CCP_CBLKSTY_RESET 0x02
-#define J2K_CCP_CBLKSTY_TERMALL 0x04
-#define J2K_CCP_CBLKSTY_VSC 0x08
-#define J2K_CCP_CBLKSTY_PTERM 0x10
-#define J2K_CCP_CBLKSTY_SEGSYM 0x20
+#define J2K_CCP_CBLKSTY_LAZY 0x01     /**< Selective arithmetic coding bypass */
+#define J2K_CCP_CBLKSTY_RESET 0x02    /**< Reset context probabilities on coding pass boundaries */
+#define J2K_CCP_CBLKSTY_TERMALL 0x04  /**< Termination on each coding pass */
+#define J2K_CCP_CBLKSTY_VSC 0x08      /**< Vertically stripe causal context */
+#define J2K_CCP_CBLKSTY_PTERM 0x10    /**< Predictable termination */
+#define J2K_CCP_CBLKSTY_SEGSYM 0x20   /**< Segmentation symbols are used */
 #define J2K_CCP_QNTSTY_NOQNT 0
 #define J2K_CCP_QNTSTY_SIQNT 1
 #define J2K_CCP_QNTSTY_SEQNT 2
@@ -265,15 +265,15 @@ typedef struct opj_cp {
 /* UniPG>> */
 #ifdef USE_JPWL
        /** enables writing of EPC in MH, thus activating JPWL */
-       bool epc_on;
+       opj_bool epc_on;
        /** enables writing of EPB, in case of activated JPWL */
-       bool epb_on;
+       opj_bool epb_on;
        /** enables writing of ESD, in case of activated JPWL */
-       bool esd_on;
+       opj_bool esd_on;
        /** enables writing of informative techniques of ESD, in case of activated JPWL */
-       bool info_on;
+       opj_bool info_on;
        /** enables writing of RED, in case of activated JPWL */
-       bool red_on;
+       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) */
@@ -299,7 +299,7 @@ typedef struct opj_cp {
        /** sensitivity methods for TPHs (-1,0-7) */
        int sens_TPH[JPWL_MAX_NO_TILESPECS];
        /** enables JPWL correction at the decoder */
-       bool correct;
+       opj_bool correct;
        /** expected number of components at the decoder */
        int exp_comps;
        /** maximum number of tiles at the decoder */
@@ -436,7 +436,7 @@ Encode an image into a JPEG-2000 codestream
 @param cstr_info Codestream information structure if required, NULL otherwise
 @return Returns true if successful, returns false otherwise
 */
-bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
+opj_bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
 
 /* ----------------------------------------------------------------------- */
 /*@}*/
index 91aee0071521556bdc4edcbf19c280ceb92fe5f3..a66e31e9afb3150d5650714815957177193c8cdc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifdef WIN32
+#ifdef _WIN32
 #include <windows.h>
 #else
 #include <sys/time.h>
 #include <sys/resource.h>
 #include <sys/times.h>
-#endif /* WIN32 */
+#endif /* _WIN32 */
 #include "opj_includes.h"
 
 double opj_clock(void) {
-#ifdef WIN32
-       /* WIN32: use QueryPerformance (very accurate) */
+#ifdef _WIN32
+       /* _WIN32: use QueryPerformance (very accurate) */
     LARGE_INTEGER freq , t ;
     /* freq is the clock speed of the CPU */
     QueryPerformanceFrequency(&freq) ;
index 7df4d367757186e518befee2f7b165ac00ef10a9..5f3406e510650511618d8d99e43343d65e2ffaf2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
index b2831cfb0b5940d9b4594bb4d90a53aca528e0dd..5ae114c33b9dabc06fd79571b010e8a71b326903 100644 (file)
@@ -5,6 +5,7 @@
  * Copyright (c) 2002-2003, Yannick Verschueren
  * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
+ * Copyright (c) 2010-2011, Kaori Hagihara
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -28,7 +29,6 @@
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  */
-
 #include "opj_includes.h"
 
 /** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
@@ -44,7 +44,7 @@ Read box headers
 @param box
 @return Returns true if successful, returns false otherwise
 */
-static bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box);
+static opj_bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box);
 /*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/
 /**
 Read the IHDR box - Image Header box
@@ -52,12 +52,11 @@ Read the IHDR box - Image Header box
 @param cio Input buffer stream
 @return Returns true if successful, returns false otherwise
 */
-static bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio);
+static opj_bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio);
 static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio);
 static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio);
-static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio);
+static opj_bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio);
 static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio);
-static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio);
 /**
 Write the FTYP box - File type box
 @param jp2 JP2 handle
@@ -70,9 +69,9 @@ Read the FTYP box - File type box
 @param cio Input buffer stream
 @return Returns true if successful, returns false otherwise
 */
-static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio);
+static opj_bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio);
 static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
-static bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset);
+static opj_bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset);
 static void jp2_write_jp(opj_cio_t *cio);
 /**
 Read the JP box - JPEG 2000 signature
@@ -80,29 +79,92 @@ Read the JP box - JPEG 2000 signature
 @param cio Input buffer stream
 @return Returns true if successful, returns false otherwise
 */
-static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio);
+static opj_bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio);
 /**
 Decode the structure of a JP2 file
 @param jp2 JP2 handle
 @param cio Input buffer stream
+@param color Collector for profile, cdef and pclr data
 @return Returns true if successful, returns false otherwise
 */
-static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio);
-
+static opj_bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio,
+       opj_jp2_color_t *color);
+/**
+Apply collected palette data
+@param color Collector for profile, cdef and pclr data
+@param image 
+*/
+static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image, opj_common_ptr cinfo);
+/**
+Collect palette data
+@param jp2 JP2 handle
+@param cio Input buffer stream
+@param box
+@param color Collector for profile, cdef and pclr data
+@return Returns true if successful, returns false otherwise
+*/
+static opj_bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio,
+    opj_jp2_box_t *box, opj_jp2_color_t *color);
+/**
+Collect component mapping data
+@param jp2 JP2 handle
+@param cio Input buffer stream
+@param box
+@param color Collector for profile, cdef and pclr data
+@return Returns true if successful, returns false otherwise
+*/
+static opj_bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio,
+    opj_jp2_box_t *box, opj_jp2_color_t *color);
+/**
+Collect colour specification data
+@param jp2 JP2 handle
+@param cio Input buffer stream
+@param box
+@param color Collector for profile, cdef and pclr data
+@return Returns true if successful, returns false otherwise
+*/
+static opj_bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio,
+    opj_jp2_box_t *box, opj_jp2_color_t *color);
+/**
+Write file Index (superbox)
+@param[in] offset_jp2c offset of jp2c box
+@param[in] length_jp2c length of jp2c box
+@param[in] offset_idx  offset of cidx box
+@param[in] length_idx  length of cidx box
+@param[in] cio         file output handle
+@return                length of fidx box
+*/
+static int write_fidx( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio);
+/**
+Write index Finder box
+@param[in] offset offset of fidx box
+@param[in] length length of fidx box
+@param[in] cio         file output handle
+*/
+static void write_iptr( int offset, int length, opj_cio_t *cio);
+/**
+Write proxy box
+@param[in] offset_jp2c offset of jp2c box
+@param[in] length_jp2c length of jp2c box
+@param[in] offset_idx  offset of cidx box
+@param[in] length_idx  length of cidx box
+@param[in] cio         file output handle
+*/
+static void write_prxy( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio);
 /*@}*/
 
 /*@}*/
 
 /* ----------------------------------------------------------------------- */
 
-static bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box) {
+static opj_bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t *box) {
        box->init_pos = cio_tell(cio);
        box->length = cio_read(cio, 4);
        box->type = cio_read(cio, 4);
        if (box->length == 1) {
                if (cio_read(cio, 4) != 0) {
                        opj_event_msg(cinfo, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
-                       return false;
+                       return OPJ_FALSE;
                }
                box->length = cio_read(cio, 4);
                if (box->length == 0) 
@@ -112,7 +174,7 @@ static bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio, opj_jp2_box_t
                box->length = cio_numbytesleft(cio) + 8;
        }
        
-       return true;
+       return OPJ_TRUE;
 }
 
 #if 0
@@ -139,7 +201,7 @@ static void jp2_write_url(opj_cio_t *cio, char *Idx_file) {
 }
 #endif
 
-static bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) {
+static opj_bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) {
        opj_jp2_box_t box;
 
        opj_common_ptr cinfo = jp2->cinfo;
@@ -147,7 +209,7 @@ static bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) {
        jp2_read_boxhdr(cinfo, cio, &box);
        if (JP2_IHDR != box.type) {
                opj_event_msg(cinfo, EVT_ERROR, "Expected IHDR Marker\n");
-               return false;
+               return OPJ_FALSE;
        }
 
        jp2->h = cio_read(cio, 4);                      /* HEIGHT */
@@ -163,10 +225,10 @@ static bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) {
 
        if (cio_tell(cio) - box.init_pos != box.length) {
                opj_event_msg(cinfo, EVT_ERROR, "Error with IHDR Box\n");
-               return false;
+               return OPJ_FALSE;
        }
 
-       return true;
+       return OPJ_TRUE;
 }
 
 static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio) {
@@ -211,7 +273,7 @@ static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) {
 }
 
 
-static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) {
+static opj_bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) {
        unsigned int i;
        opj_jp2_box_t box;
 
@@ -220,7 +282,7 @@ static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) {
        jp2_read_boxhdr(cinfo, cio, &box);
        if (JP2_BPCC != box.type) {
                opj_event_msg(cinfo, EVT_ERROR, "Expected BPCC Marker\n");
-               return false;
+               return OPJ_FALSE;
        }
 
        for (i = 0; i < jp2->numcomps; i++) {
@@ -229,10 +291,10 @@ static bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio) {
 
        if (cio_tell(cio) - box.init_pos != box.length) {
                opj_event_msg(cinfo, EVT_ERROR, "Error with BPCC Box\n");
-               return false;
+               return OPJ_FALSE;
        }
 
-       return true;
+       return OPJ_TRUE;
 }
 
 static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio) {
@@ -246,11 +308,10 @@ static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio) {
        cio_write(cio, jp2->precedence, 1);     /* PRECEDENCE */
        cio_write(cio, jp2->approx, 1);         /* APPROX */
 
-       if (jp2->meth == 1) {
-               cio_write(cio, jp2->enumcs, 4); /* EnumCS */
-       } else {
-               cio_write(cio, 0, 1);                   /* PROFILE (??) */
-       }
+       if(jp2->meth == 2)
+        jp2->enumcs = 0;
+
+       cio_write(cio, jp2->enumcs, 4); /* EnumCS */
 
        box.length = cio_tell(cio) - box.init_pos;
        cio_seek(cio, box.init_pos);
@@ -258,42 +319,478 @@ static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio) {
        cio_seek(cio, box.init_pos + box.length);
 }
 
-static bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio) {
-       opj_jp2_box_t box;
+static void jp2_free_pclr(opj_jp2_color_t *color)
+{
+    opj_free(color->jp2_pclr->channel_sign);
+    opj_free(color->jp2_pclr->channel_size);
+    opj_free(color->jp2_pclr->entries);
+
+       if(color->jp2_pclr->cmap) opj_free(color->jp2_pclr->cmap);
+
+    opj_free(color->jp2_pclr); color->jp2_pclr = NULL;
+}
+
+static void free_color_data(opj_jp2_color_t *color)
+{
+       if(color->jp2_pclr)
+   {
+       jp2_free_pclr(color);
+   }
+       if(color->jp2_cdef) 
+   {
+       if(color->jp2_cdef->info) opj_free(color->jp2_cdef->info);
+       opj_free(color->jp2_cdef);
+   }
+       if(color->icc_profile_buf) opj_free(color->icc_profile_buf);
+}
+
+static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image, opj_common_ptr cinfo)
+{
+       opj_image_comp_t *old_comps, *new_comps;
+       unsigned char *channel_size, *channel_sign;
+       unsigned int *entries;
+       opj_jp2_cmap_comp_t *cmap;
+       int *src, *dst;
+       unsigned int j, max;
+       unsigned short i, nr_channels, cmp, pcol;
+       int 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;
+
+       old_comps = image->comps;
+       new_comps = (opj_image_comp_t*)
+        opj_malloc(nr_channels * sizeof(opj_image_comp_t));
+
+       for(i = 0; i < nr_channels; ++i)
+   {
+       pcol = cmap[i].pcol; cmp = cmap[i].cmp;
+
+  if( pcol < nr_channels )
+    new_comps[pcol] = old_comps[cmp];
+  else
+    {
+    opj_event_msg(cinfo, EVT_ERROR, "Error with pcol value %d (max: %d). skipping\n", pcol, nr_channels);
+    continue;
+    }
+
+       if(cmap[i].mtyp == 0) /* Direct use */
+  {
+       old_comps[cmp].data = NULL; continue;
+  }
+/* Palette mapping: */
+       new_comps[pcol].data = (int*)
+        opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(int));
+       new_comps[pcol].prec = channel_size[i];
+       new_comps[pcol].sgnd = channel_sign[i];
+   }
+       top_k = color->jp2_pclr->nr_entries - 1;
+
+       for(i = 0; i < nr_channels; ++i)
+   {
+/* Direct use: */
+       if(cmap[i].mtyp == 0) continue;
+
+/* Palette mapping: */
+       cmp = cmap[i].cmp; pcol = cmap[i].pcol;
+       src = old_comps[cmp].data; 
+       dst = new_comps[pcol].data;
+       max = new_comps[pcol].w * new_comps[pcol].h;
+
+       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] = entries[k * nr_channels + pcol];
+  }
+   }
+       max = image->numcomps;
+       for(i = 0; i < max; ++i)
+   {
+       if(old_comps[i].data) opj_free(old_comps[i].data);
+   }
+       opj_free(old_comps);
+       image->comps = new_comps;
+       image->numcomps = nr_channels;
+
+       jp2_free_pclr(color);
+
+}/* apply_pclr() */
+
+static opj_bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio,
+       opj_jp2_box_t *box, opj_jp2_color_t *color)
+{
+       opj_jp2_pclr_t *jp2_pclr;
+       unsigned char *channel_size, *channel_sign;
+       unsigned int *entries;
+       unsigned short nr_entries, nr_channels;
+       unsigned short i, j;
+       unsigned char uc;
+
+       OPJ_ARG_NOT_USED(box);
+       OPJ_ARG_NOT_USED(jp2);
+
+/* Part 1, I.5.3.4: 'There shall be at most one Palette box inside
+ * a JP2 Header box' :
+*/
+       if(color->jp2_pclr) return OPJ_FALSE;
+
+       nr_entries = (unsigned short)cio_read(cio, 2); /* NE */
+       nr_channels = (unsigned short)cio_read(cio, 1);/* NPC */
+
+       entries = (unsigned int*)
+        opj_malloc(nr_channels * nr_entries * sizeof(unsigned int));
+       channel_size = (unsigned char*)opj_malloc(nr_channels);
+       channel_sign = (unsigned char*)opj_malloc(nr_channels);
+
+       jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t));
+       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 = nr_channels;
+       jp2_pclr->cmap = NULL;
+
+       color->jp2_pclr = jp2_pclr;
+
+       for(i = 0; i < nr_channels; ++i)
+   {
+       uc = cio_read(cio, 1); /* Bi */
+       channel_size[i] = (uc & 0x7f) + 1;
+       channel_sign[i] = (uc & 0x80)?1:0;
+   }
+
+       for(j = 0; j < nr_entries; ++j)
+   {
+       for(i = 0; i < nr_channels; ++i)
+  {
+/* Cji */
+       *entries++ = cio_read(cio, channel_size[i]>>3);
+  }
+   }
+
+       return OPJ_TRUE;
+}/* jp2_read_pclr() */
+
+static opj_bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio,
+       opj_jp2_box_t *box, opj_jp2_color_t *color)
+{
+       opj_jp2_cmap_comp_t *cmap;
+       unsigned short i, nr_channels;
+
+       OPJ_ARG_NOT_USED(box);
+       OPJ_ARG_NOT_USED(jp2);
+
+/* Need nr_channels: */
+       if(color->jp2_pclr == NULL) return OPJ_FALSE;
+
+/* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box
+ * inside a JP2 Header box' :
+*/
+       if(color->jp2_pclr->cmap) return OPJ_FALSE;
+
+       nr_channels = color->jp2_pclr->nr_channels;
+       cmap = (opj_jp2_cmap_comp_t*)
+        opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t));
+
+       for(i = 0; i < nr_channels; ++i)
+   {
+       cmap[i].cmp = (unsigned short)cio_read(cio, 2);
+       cmap[i].mtyp = cio_read(cio, 1);
+       cmap[i].pcol = cio_read(cio, 1);
+
+   }
+       color->jp2_pclr->cmap = cmap;
+
+       return OPJ_TRUE;
+}/* jp2_read_cmap() */
+
+static void jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color)
+{
+       opj_jp2_cdef_info_t *info;
+       int color_space;
+       unsigned short i, n, cn, typ, asoc, acn;
+
+       color_space = image->color_space;
+       info = color->jp2_cdef->info;
+       n = color->jp2_cdef->n;
+
+       for(i = 0; i < n; ++i)
+   {
+/* WATCH: acn = asoc - 1 ! */
+       if((asoc = info[i].asoc) == 0) continue;
+
+       cn = info[i].cn; typ = info[i].typ; acn = asoc - 1;
+
+       if(cn != acn)
+  {
+       opj_image_comp_t saved;
+
+       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));
+
+       info[i].asoc = cn + 1;
+       info[acn].asoc = info[acn].cn + 1;
+  }
+   }
+       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 jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio,
+       opj_jp2_box_t *box, opj_jp2_color_t *color)
+{
+       opj_jp2_cdef_info_t *info;
+       unsigned short i, n;
+
+       OPJ_ARG_NOT_USED(box);
+       OPJ_ARG_NOT_USED(jp2);
+
+/* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box
+ * inside a JP2 Header box.' 
+*/
+       if(color->jp2_cdef) return OPJ_FALSE;
+
+       if((n = (unsigned short)cio_read(cio, 2)) == 0) return OPJ_FALSE; /* szukw000: FIXME */
+
+       info = (opj_jp2_cdef_info_t*)
+        opj_malloc(n * sizeof(opj_jp2_cdef_info_t));
+
+       color->jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
+       color->jp2_cdef->info = info;
+       color->jp2_cdef->n = n;
+
+       for(i = 0; i < n; ++i)
+   {
+       info[i].cn = (unsigned short)cio_read(cio, 2);
+       info[i].typ = (unsigned short)cio_read(cio, 2);
+       info[i].asoc = (unsigned short)cio_read(cio, 2);
+
+   }
+       return OPJ_TRUE;
+}/* jp2_read_cdef() */
+
+static opj_bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio,
+       opj_jp2_box_t *box, opj_jp2_color_t *color) 
+{
        int skip_len;
+    opj_common_ptr cinfo;
 
-       opj_common_ptr cinfo = jp2->cinfo;
+/* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour
+ * Specification boxes after the first.' 
+*/
+       if(color->jp2_has_colr) return OPJ_FALSE;
 
-       jp2_read_boxhdr(cinfo, cio, &box);
-       do {
-               if (JP2_COLR != box.type) {
-                       cio_skip(cio, box.length - 8);
-                       jp2_read_boxhdr(cinfo, cio, &box);
-               }
-       } while(JP2_COLR != box.type);
+       cinfo = jp2->cinfo;
 
        jp2->meth = cio_read(cio, 1);           /* METH */
        jp2->precedence = cio_read(cio, 1);     /* PRECEDENCE */
        jp2->approx = cio_read(cio, 1);         /* APPROX */
 
-       if (jp2->meth == 1) {
-               jp2->enumcs = cio_read(cio, 4); /* EnumCS */
-       } else {
-               /* skip PROFILE */
-               skip_len = box.init_pos + box.length - cio_tell(cio);
-               if (skip_len < 0) {
-                       opj_event_msg(cinfo, EVT_ERROR, "Error with JP2H box size\n");
-                       return false;
-               }
-               cio_skip(cio, box.init_pos + box.length - cio_tell(cio));
-       }
+       if (jp2->meth == 1) 
+   {
+       jp2->enumcs = cio_read(cio, 4); /* EnumCS */
+   } 
+       else
+       if (jp2->meth == 2) 
+   {
+/* skip PROFILE */
+       skip_len = box->init_pos + box->length - cio_tell(cio);
+       if (skip_len < 0) 
+  {
+       opj_event_msg(cinfo, EVT_ERROR, "Error with COLR box size\n");
+       return OPJ_FALSE;
+  }
+       if(skip_len > 0)
+  {
+       unsigned char *start;
+
+       start = cio_getbp(cio);
+       color->icc_profile_buf = (unsigned char*)opj_malloc(skip_len);
+       color->icc_profile_len = skip_len;
+
+       cio_skip(cio, box->init_pos + box->length - cio_tell(cio));
+
+       memcpy(color->icc_profile_buf, start, skip_len);
+  }
+   }
+
+       if (cio_tell(cio) - box->init_pos != box->length) 
+   {
+       opj_event_msg(cinfo, EVT_ERROR, "Error with COLR Box\n");
+       return OPJ_FALSE;
+   }
+       color->jp2_has_colr = 1;
+
+       return OPJ_TRUE;
+}/* jp2_read_colr() */
+
+opj_bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color) 
+{
+       opj_jp2_box_t box;
+       int jp2h_end;
+
+       opj_common_ptr cinfo = jp2->cinfo;
+
+       jp2_read_boxhdr(cinfo, cio, &box);
+       do 
+   {
+       if (JP2_JP2H != box.type) 
+  {
+       if (box.type == JP2_JP2C) 
+ {
+       opj_event_msg(cinfo, EVT_ERROR, "Expected JP2H Marker\n");
+       return OPJ_FALSE;
+ }
+       cio_skip(cio, box.length - 8);
+
+       if(cio->bp >= cio->end) return OPJ_FALSE;
+
+       jp2_read_boxhdr(cinfo, cio, &box);
+  }
+   } while(JP2_JP2H != box.type);
+
+       if (!jp2_read_ihdr(jp2, cio))
+               return OPJ_FALSE;
+       jp2h_end = box.init_pos + box.length;
+
+       if (jp2->bpc == 255) 
+   {
+       if (!jp2_read_bpcc(jp2, cio))
+               return OPJ_FALSE;
+   }
+       jp2_read_boxhdr(cinfo, cio, &box);
+
+       while(cio_tell(cio) < jp2h_end)
+   {
+       if(box.type == JP2_COLR)
+  {
+       if( !jp2_read_colr(jp2, cio, &box, color))
+ {
+    cio_seek(cio, box.init_pos + 8);
+    cio_skip(cio, box.length - 8);
+ }
+    jp2_read_boxhdr(cinfo, cio, &box);
+    continue;
+  }
+    if(box.type == JP2_CDEF && !jp2->ignore_pclr_cmap_cdef)
+  {
+    if( !jp2_read_cdef(jp2, cio, &box, color))
+ {
+    cio_seek(cio, box.init_pos + 8);
+    cio_skip(cio, box.length - 8);
+ }
+    jp2_read_boxhdr(cinfo, cio, &box);
+    continue;
+  }
+    if(box.type == JP2_PCLR && !jp2->ignore_pclr_cmap_cdef)
+  {
+    if( !jp2_read_pclr(jp2, cio, &box, color))
+ {
+    cio_seek(cio, box.init_pos + 8);
+    cio_skip(cio, box.length - 8);
+ }
+    jp2_read_boxhdr(cinfo, cio, &box);
+    continue;
+  }
+    if(box.type == JP2_CMAP && !jp2->ignore_pclr_cmap_cdef)
+  {
+    if( !jp2_read_cmap(jp2, cio, &box, color))
+ {
+    cio_seek(cio, box.init_pos + 8);
+    cio_skip(cio, box.length - 8);
+ }
+    jp2_read_boxhdr(cinfo, cio, &box);
+    continue;
+  }
+       cio_seek(cio, box.init_pos + 8);
+       cio_skip(cio, box.length - 8);
+       jp2_read_boxhdr(cinfo, cio, &box);
+
+   }/* while(cio_tell(cio) < box_end) */
+
+       cio_seek(cio, jp2h_end);
+
+/* Part 1, I.5.3.3 : 'must contain at least one' */
+       return (color->jp2_has_colr == 1);
+
+}/* jp2_read_jp2h() */
+
+opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, 
+       opj_codestream_info_t *cstr_info) 
+{
+       opj_common_ptr cinfo;
+       opj_image_t *image = NULL;
+       opj_jp2_color_t color;
+
+       if(!jp2 || !cio) 
+   {
+       return NULL;
+   }
+       memset(&color, 0, sizeof(opj_jp2_color_t));
+       cinfo = jp2->cinfo;
+
+/* JP2 decoding */
+       if(!jp2_read_struct(jp2, cio, &color)) 
+   {
+       free_color_data(&color);
+       opj_event_msg(cinfo, EVT_ERROR, "Failed to decode jp2 structure\n");
+       return NULL;
+   }
+
+/* J2K decoding */
+       image = j2k_decode(jp2->j2k, cio, cstr_info);
+
+       if(!image) 
+   {
+       free_color_data(&color);
+       opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n");
+       return NULL;
+   }
+   
+    if (!jp2->ignore_pclr_cmap_cdef){
+
+    /* Set Image Color Space */
+       if (jp2->enumcs == 16)
+               image->color_space = CLRSPC_SRGB;
+       else if (jp2->enumcs == 17)
+               image->color_space = CLRSPC_GRAY;
+       else if (jp2->enumcs == 18)
+               image->color_space = CLRSPC_SYCC;
+       else
+               image->color_space = CLRSPC_UNKNOWN;
+
+       if(color.jp2_cdef)
+   {
+       jp2_apply_cdef(image, &color);
+   }
+       if(color.jp2_pclr)
+   {
+/* Part 1, I.5.3.4: Either both or none : */
+       if( !color.jp2_pclr->cmap) 
+        jp2_free_pclr(&color);
+       else
+        jp2_apply_pclr(&color, image, cinfo);
+   }
+       if(color.icc_profile_buf)
+   {
+       image->icc_profile_buf = color.icc_profile_buf;
+       color.icc_profile_buf = NULL;
+       image->icc_profile_len = color.icc_profile_len;
+   }
+   }
+   
+       return image;
+
+}/* opj_jp2_decode() */
 
-       if (cio_tell(cio) - box.init_pos != box.length) {
-               opj_event_msg(cinfo, EVT_ERROR, "Error with BPCC Box\n");
-               return false;
-       }
-       return true;
-}
 
 void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) {
        opj_jp2_box_t box;
@@ -315,44 +812,6 @@ void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) {
        cio_seek(cio, box.init_pos + box.length);
 }
 
-bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio) {
-       opj_jp2_box_t box;
-       int skip_len;
-
-       opj_common_ptr cinfo = jp2->cinfo;
-
-       jp2_read_boxhdr(cinfo, cio, &box);
-       do {
-               if (JP2_JP2H != box.type) {
-                       if (box.type == JP2_JP2C) {
-                               opj_event_msg(cinfo, EVT_ERROR, "Expected JP2H Marker\n");
-                               return false;
-                       }
-                       cio_skip(cio, box.length - 8);
-                       jp2_read_boxhdr(cinfo, cio, &box);
-               }
-       } while(JP2_JP2H != box.type);
-
-       if (!jp2_read_ihdr(jp2, cio))
-               return false;
-
-       if (jp2->bpc == 255) {
-               if (!jp2_read_bpcc(jp2, cio))
-                       return false;
-       }
-       if (!jp2_read_colr(jp2, cio))
-               return false;
-
-       skip_len = box.init_pos + box.length - cio_tell(cio);
-       if (skip_len < 0) {
-               opj_event_msg(cinfo, EVT_ERROR, "Error with JP2H Box\n");
-               return false;
-       }
-       cio_skip(cio, box.init_pos + box.length - cio_tell(cio));
-
-       return true;
-}
-
 static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) {
        unsigned int i;
        opj_jp2_box_t box;
@@ -374,7 +833,7 @@ static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) {
        cio_seek(cio, box.init_pos + box.length);
 }
 
-static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) {
+static opj_bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) {
        int i;
        opj_jp2_box_t box;
 
@@ -384,7 +843,7 @@ static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) {
 
        if (JP2_FTYP != box.type) {
                opj_event_msg(cinfo, EVT_ERROR, "Expected FTYP Marker\n");
-               return false;
+               return OPJ_FALSE;
        }
 
        jp2->brand = cio_read(cio, 4);          /* BR */
@@ -398,10 +857,10 @@ static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) {
 
        if (cio_tell(cio) - box.init_pos != box.length) {
                opj_event_msg(cinfo, EVT_ERROR, "Error with FTYP Box\n");
-               return false;
+               return OPJ_FALSE;
        }
 
-       return true;
+       return OPJ_TRUE;
 }
 
 static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
@@ -433,7 +892,7 @@ static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, op
        return box.length;
 }
 
-static bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset) {
+static opj_bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset) {
        opj_jp2_box_t box;
 
        opj_common_ptr cinfo = jp2->cinfo;
@@ -449,7 +908,7 @@ static bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_code
        *j2k_codestream_offset = cio_tell(cio);
        *j2k_codestream_length = box.length - 8;
 
-       return true;
+       return OPJ_TRUE;
 }
 
 static void jp2_write_jp(opj_cio_t *cio) {
@@ -466,7 +925,7 @@ static void jp2_write_jp(opj_cio_t *cio) {
        cio_seek(cio, box.init_pos + box.length);
 }
 
-static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio) {
+static opj_bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio) {
        opj_jp2_box_t box;
 
        opj_common_ptr cinfo = jp2->cinfo;
@@ -474,34 +933,96 @@ static bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio) {
        jp2_read_boxhdr(cinfo, cio, &box);
        if (JP2_JP != box.type) {
                opj_event_msg(cinfo, EVT_ERROR, "Expected JP Marker\n");
-               return false;
+               return OPJ_FALSE;
        }
        if (0x0d0a870a != cio_read(cio, 4)) {
                opj_event_msg(cinfo, EVT_ERROR, "Error with JP Marker\n");
-               return false;
+               return OPJ_FALSE;
        }
        if (cio_tell(cio) - box.init_pos != box.length) {
                opj_event_msg(cinfo, EVT_ERROR, "Error with JP Box size\n");
-               return false;
+               return OPJ_FALSE;
        }
 
-       return true;
+       return OPJ_TRUE;
 }
 
 
-static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio) {
+static opj_bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio,
+       opj_jp2_color_t *color) {
        if (!jp2_read_jp(jp2, cio))
-               return false;
+               return OPJ_FALSE;
        if (!jp2_read_ftyp(jp2, cio))
-               return false;
-       if (!jp2_read_jp2h(jp2, cio))
-               return false;
+               return OPJ_FALSE;
+       if (!jp2_read_jp2h(jp2, cio, color))
+               return OPJ_FALSE;
        if (!jp2_read_jp2c(jp2, cio, &jp2->j2k_codestream_length, &jp2->j2k_codestream_offset))
-               return false;
+               return OPJ_FALSE;
        
-       return true;
+       return OPJ_TRUE;
+}
+
+
+static int write_fidx( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio)
+{  
+  int len, lenp;
+  
+  lenp = cio_tell( cio);
+  cio_skip( cio, 4);              /* L [at the end] */
+  cio_write( cio, JPIP_FIDX, 4);  /* IPTR           */
+  
+  write_prxy( offset_jp2c, length_jp2c, offset_idx, length_idx, cio);
+
+  len = cio_tell( cio)-lenp;
+  cio_seek( cio, lenp);
+  cio_write( cio, len, 4);        /* L              */
+  cio_seek( cio, lenp+len);  
+
+  return len;
+}
+
+static void write_prxy( int offset_jp2c, int length_jp2c, int offset_idx, int length_idx, opj_cio_t *cio)
+{
+  int len, lenp;
+
+  lenp = cio_tell( cio);
+  cio_skip( cio, 4);              /* L [at the end] */
+  cio_write( cio, JPIP_PRXY, 4);  /* IPTR           */
+  
+  cio_write( cio, offset_jp2c, 8); /* OOFF           */
+  cio_write( cio, length_jp2c, 4); /* OBH part 1     */
+  cio_write( cio, JP2_JP2C, 4);        /* OBH part 2     */
+  
+  cio_write( cio, 1,1);           /* NI             */
+
+  cio_write( cio, offset_idx, 8);  /* IOFF           */
+  cio_write( cio, length_idx, 4);  /* IBH part 1     */
+  cio_write( cio, JPIP_CIDX, 4);   /* IBH part 2     */
+
+  len = cio_tell( cio)-lenp;
+  cio_seek( cio, lenp);
+  cio_write( cio, len, 4);        /* L              */
+  cio_seek( cio, lenp+len);
 }
 
+static void write_iptr( int offset, int length, opj_cio_t *cio)
+{
+  int len, lenp;
+  
+  lenp = cio_tell( cio);
+  cio_skip( cio, 4);              /* L [at the end] */
+  cio_write( cio, JPIP_IPTR, 4);  /* IPTR           */
+  
+  cio_write( cio, offset, 8);
+  cio_write( cio, length, 8);
+
+  len = cio_tell( cio)-lenp;
+  cio_seek( cio, lenp);
+  cio_write( cio, len, 4);        /* L             */
+  cio_seek( cio, lenp+len);
+}
+
+
 /* ----------------------------------------------------------------------- */
 /* JP2 decoder interface                                             */
 /* ----------------------------------------------------------------------- */
@@ -539,42 +1060,7 @@ void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters) {
        /* setup the J2K codec */
        j2k_setup_decoder(jp2->j2k, parameters);
        /* further JP2 initializations go here */
-}
-
-opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info) {
-       opj_common_ptr cinfo;
-       opj_image_t *image = NULL;
-
-       if(!jp2 || !cio) {
-               return NULL;
-       }
-
-       cinfo = jp2->cinfo;
-
-       /* JP2 decoding */
-       if(!jp2_read_struct(jp2, cio)) {
-               opj_event_msg(cinfo, EVT_ERROR, "Failed to decode jp2 structure\n");
-               return NULL;
-       }
-
-       /* J2K decoding */
-       image = j2k_decode(jp2->j2k, cio, cstr_info);
-       if(!image) {
-               opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n");
-               return NULL;
-       }
-
-       /* Set Image Color Space */
-       if (jp2->enumcs == 16)
-               image->color_space = CLRSPC_SRGB;
-       else if (jp2->enumcs == 17)
-               image->color_space = CLRSPC_GRAY;
-       else if (jp2->enumcs == 18)
-               image->color_space = CLRSPC_SYCC;
-       else
-               image->color_space = CLRSPC_UNKNOWN;
-
-       return image;
+       jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
 }
 
 /* ----------------------------------------------------------------------- */
@@ -664,30 +1150,23 @@ void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_
        for (i = 0; i < image->numcomps; i++) {
                jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);
        }
-
-       /* Colour Specification box */
-
-       if ((image->numcomps == 1 || image->numcomps == 3) && (jp2->bpc != 255)) {
-               jp2->meth = 1;  /* METH: Enumerated colourspace */
-       } else {
-               jp2->meth = 2;  /* METH: Restricted ICC profile */
-       }
-       if (jp2->meth == 1) {
-               if (image->color_space == 1)
-                       jp2->enumcs = 16;       /* sRGB as defined by IEC 61966\962\961 */
-               else if (image->color_space == 2)
-                       jp2->enumcs = 17;       /* greyscale */
-               else if (image->color_space == 3)
-                       jp2->enumcs = 18;       /* YUV */
-       } else {
-               jp2->enumcs = 0;                /* PROFILE (??) */
-       }
+       jp2->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 */
        jp2->precedence = 0;    /* PRECEDENCE */
        jp2->approx = 0;                /* APPROX */
-
+       
+       jp2->jpip_on = parameters->jpip_on;
 }
 
-bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
+opj_bool opj_jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
+
+       int pos_iptr, pos_cidx, pos_jp2c, len_jp2c, len_cidx, end_pos, pos_fidx, len_fidx;
+       pos_jp2c = pos_iptr = -1; /* remove a warning */
 
        /* JP2 encoding */
 
@@ -698,14 +1177,34 @@ bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestre
        /* JP2 Header box */
        jp2_write_jp2h(jp2, cio);
 
+       if( jp2->jpip_on){
+         pos_iptr = cio_tell( cio);
+         cio_skip( cio, 24); /* IPTR further ! */
+         
+         pos_jp2c = cio_tell( cio);
+       }
+
        /* J2K encoding */
+       if(!(len_jp2c = jp2_write_jp2c( jp2, cio, image, cstr_info))){
+           opj_event_msg(jp2->cinfo, EVT_ERROR, "Failed to encode image\n");
+           return OPJ_FALSE;
+       }
 
-       if(!jp2_write_jp2c(jp2, cio, image, cstr_info)) {
-               opj_event_msg(jp2->cinfo, EVT_ERROR, "Failed to encode image\n");
-               return false;
+       if( jp2->jpip_on){
+         pos_cidx = cio_tell( cio);
+         
+         len_cidx = write_cidx( pos_jp2c+8, cio, image, *cstr_info, len_jp2c-8);
+         
+         pos_fidx = cio_tell( cio);
+         len_fidx = write_fidx( pos_jp2c, len_jp2c, pos_cidx, len_cidx, cio);
+         
+         end_pos = cio_tell( cio);
+         
+         cio_seek( cio, pos_iptr);
+         write_iptr( pos_fidx, len_fidx, cio);
+         
+         cio_seek( cio, end_pos);
        }
 
-       return true;
+       return OPJ_TRUE;
 }
-
-
index 7e363be2eee494346a359d4896339463a1bab609..acb643cad77581a79e3f6d1b9a3d1f36798d8e3d 100644 (file)
 #define JP2_COLR 0x636f6c72            /**< Colour specification box */
 #define JP2_JP2C 0x6a703263            /**< Contiguous codestream box */
 #define JP2_URL  0x75726c20            /**< URL box */
-#define JP2_DBTL 0x6474626c            /**< ??? */
+#define JP2_DTBL 0x6474626c            /**< Data Reference box */
 #define JP2_BPCC 0x62706363            /**< Bits per component box */
 #define JP2_JP2  0x6a703220            /**< File type fields */
+#define JP2_PCLR 0x70636c72            /**< Palette box */
+#define JP2_CMAP 0x636d6170            /**< Component Mapping box */
+#define JP2_CDEF 0x63646566            /**< Channel Definition box */
 
 /* ----------------------------------------------------------------------- */
+/** 
+Channel description: channel index, type, assocation
+*/
+typedef struct opj_jp2_cdef_info
+{
+    unsigned short cn, typ, asoc;
+} opj_jp2_cdef_info_t;
+
+/** 
+Channel descriptions and number of descriptions
+*/
+typedef struct opj_jp2_cdef
+{
+    opj_jp2_cdef_info_t *info;
+    unsigned short n;
+} opj_jp2_cdef_t;
+
+/** 
+Component mappings: channel index, mapping type, palette index
+*/
+typedef struct opj_jp2_cmap_comp
+{
+    unsigned short cmp;
+    unsigned char mtyp, pcol;
+} opj_jp2_cmap_comp_t;
+
+/** 
+Palette data: table entries, palette columns
+*/
+typedef struct opj_jp2_pclr
+{
+    unsigned int *entries;
+    unsigned char *channel_sign;
+    unsigned char *channel_size;
+    opj_jp2_cmap_comp_t *cmap;
+    unsigned short nr_entries, nr_channels;
+} opj_jp2_pclr_t;
+
+/** 
+Collector for ICC profile, palette, component mapping, channel description 
+*/
+typedef struct opj_jp2_color
+{
+    unsigned char *icc_profile_buf;
+    int icc_profile_len;
+
+    opj_jp2_cdef_t *jp2_cdef;
+    opj_jp2_pclr_t *jp2_pclr;
+    unsigned char jp2_has_colr;
+} opj_jp2_color_t;
 
 /** 
 JP2 component
@@ -87,6 +140,8 @@ typedef struct opj_jp2 {
        opj_jp2_comps_t *comps;
        unsigned int j2k_codestream_offset;
        unsigned int j2k_codestream_length;
+       opj_bool jpip_on;
+       opj_bool ignore_pclr_cmap_cdef;
 } opj_jp2_t;
 
 /**
@@ -111,9 +166,10 @@ void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio);
 Read the JP2H box - JP2 Header box (used in MJ2)
 @param jp2 JP2 handle
 @param cio Input buffer stream
+@param ext Collector for profile, cdef and pclr data
 @return Returns true if successful, returns false otherwise
 */
-bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio);
+opj_bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color);
 /**
 Creates a JP2 decompression structure
 @param cinfo Codec context info
@@ -139,7 +195,7 @@ Decode an image from a JPEG-2000 file stream
 @param cstr_info Codestream information structure if required, NULL otherwise
 @return Returns a decoded image if successful, returns NULL otherwise
 */
-opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
+opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info);
 /**
 Creates a JP2 compression structure
 @param cinfo Codec context info
@@ -167,7 +223,8 @@ Encode an image into a JPEG-2000 file stream
 @param cstr_info Codestream information structure if required, NULL otherwise
 @return Returns true if successful, returns false otherwise
 */
-bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
+opj_bool opj_jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
+
 /* ----------------------------------------------------------------------- */
 /*@}*/
 
index ca21744f3e48ec6d1c50e05edfc61aa6d271be95..870993b06d250b01f4a8163b960dd00934190224 100644 (file)
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#ifdef __SSE__
+#include <xmmintrin.h>
+#endif
+
 #include "opj_includes.h"
 
 /* <summary> */
@@ -127,6 +131,44 @@ void mct_decode_real(
                int n)
 {
        int i;
+#ifdef __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;
+
+               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;
+#endif
        for(i = 0; i < n; ++i) {
                float y = c0[i];
                float u = c1[i];
index 9aa9d2c2e5b7145c13869b5c31394cbe88c19635..14129fbf4e5970bfb3b9d3dbf2594aadeb59eac7 100644 (file)
@@ -68,24 +68,23 @@ FIXME: documentation ???
 @param mqc MQC handle
 @return 
 */
-static int mqc_mpsexchange(opj_mqc_t *mqc);
+static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc);
 /**
 FIXME: documentation ???
 @param mqc MQC handle
 @return 
 */
-static int mqc_lpsexchange(opj_mqc_t *mqc);
+static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc);
 /**
 Input a byte
 @param mqc MQC handle
 */
-static void mqc_bytein(opj_mqc_t *mqc);
+static INLINE void mqc_bytein(opj_mqc_t *const mqc);
 /**
 Renormalize mqc->a and mqc->c while decoding
 @param mqc MQC handle
 */
-static void mqc_renormd(opj_mqc_t *mqc);
-
+static INLINE void mqc_renormd(opj_mqc_t *const mqc);
 /*@}*/
 
 /*@}*/
@@ -271,7 +270,7 @@ static void mqc_setbits(opj_mqc_t *mqc) {
        }
 }
 
-static int mqc_mpsexchange(opj_mqc_t *mqc) {
+static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc) {
        int d;
        if (mqc->a < (*mqc->curctx)->qeval) {
                d = 1 - (*mqc->curctx)->mps;
@@ -284,7 +283,7 @@ static int mqc_mpsexchange(opj_mqc_t *mqc) {
        return d;
 }
 
-static int mqc_lpsexchange(opj_mqc_t *mqc) {
+static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc) {
        int d;
        if (mqc->a < (*mqc->curctx)->qeval) {
                mqc->a = (*mqc->curctx)->qeval;
@@ -299,7 +298,15 @@ static int mqc_lpsexchange(opj_mqc_t *mqc) {
        return d;
 }
 
-static void mqc_bytein(opj_mqc_t *mqc) {
+#ifdef MQC_PERF_OPT
+static INLINE void 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 mqc_bytein(opj_mqc_t *const mqc) {
        if (mqc->bp != mqc->end) {
                unsigned int c;
                if (mqc->bp + 1 != mqc->end) {
@@ -326,8 +333,9 @@ static void mqc_bytein(opj_mqc_t *mqc) {
                mqc->ct = 8;
        }
 }
+#endif
 
-static void mqc_renormd(opj_mqc_t *mqc) {
+static INLINE void mqc_renormd(opj_mqc_t *const mqc) {
        do {
                if (mqc->ct == 0) {
                        mqc_bytein(mqc);
@@ -346,11 +354,19 @@ static void mqc_renormd(opj_mqc_t *mqc) {
 
 opj_mqc_t* mqc_create(void) {
        opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
+#ifdef MQC_PERF_OPT
+       mqc->buffer = NULL;
+#endif
        return mqc;
 }
 
 void mqc_destroy(opj_mqc_t *mqc) {
        if(mqc) {
+#ifdef MQC_PERF_OPT
+               if (mqc->buffer) {
+                       opj_free(mqc->buffer);
+               }
+#endif
                opj_free(mqc);
        }
 }
@@ -499,13 +515,51 @@ void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len) {
        mqc->bp = bp;
        if (len==0) mqc->c = 0xff << 16;
        else mqc->c = *mqc->bp << 16;
+
+#ifdef MQC_PERF_OPT
+       {
+               unsigned int c;
+               unsigned int *ip;
+               unsigned char *end = mqc->end - 1;
+               mqc->buffer = opj_realloc(mqc->buffer, (len + 1) * sizeof(unsigned int));
+               ip = (unsigned int *) mqc->buffer;
+
+               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++;
+               }
+
+               /* Handle last byte of data */
+               c = 0xff;
+               if (*bp == 0xff) {
+                       *ip = 0x0000ff18;
+               } else {
+                       bp++;
+                       *ip = 0x00000018 | (c << 8);
+               }
+               ip++;
+
+               *ip = 0x0000ff08;
+               mqc->bp = mqc->buffer;
+       }
+#endif
        mqc_bytein(mqc);
        mqc->c <<= 7;
        mqc->ct -= 7;
        mqc->a = 0x8000;
 }
 
-int mqc_decode(opj_mqc_t *mqc) {
+int mqc_decode(opj_mqc_t *const mqc) {
        int d;
        mqc->a -= (*mqc->curctx)->qeval;
        if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
index 8cc8c934598c57226b8c1f4c793cc864f03a1940..d00cd1067d88d28c7e2f0c28e49c1f0b39dd156b 100644 (file)
@@ -70,6 +70,9 @@ typedef struct opj_mqc {
        unsigned char *end;
        opj_mqc_state_t *ctxs[MQC_NUMCTXS];
        opj_mqc_state_t **curctx;
+#ifdef MQC_PERF_OPT
+       unsigned char *buffer;
+#endif
 } opj_mqc_t;
 
 /** @name Exported functions */
@@ -188,7 +191,7 @@ Decode a symbol
 @param mqc MQC handle
 @return Returns the decoded symbol (0 or 1)
 */
-int mqc_decode(opj_mqc_t *mqc);
+int mqc_decode(opj_mqc_t *const mqc);
 /* ----------------------------------------------------------------------- */
 /*@}*/
 
index 96fa0ad57e5d4e3ef9d1803d1f7c2900c9c06e71..180cc844ab558967b24966fb2db2be2ddfc1b0bc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifdef WIN32
+#ifdef _WIN32
 #include <windows.h>
-#endif /* WIN32 */
+#endif /* _WIN32 */
 
+#include "opj_config.h"
 #include "opj_includes.h"
 
 /* ---------------------------------------------------------------------- */
-#ifdef WIN32
+#ifdef _WIN32
 #ifndef OPJ_STATIC
 BOOL APIENTRY
 DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
+
+       OPJ_ARG_NOT_USED(lpReserved);
+       OPJ_ARG_NOT_USED(hModule);
+
        switch (ul_reason_for_call) {
                case DLL_PROCESS_ATTACH :
                        break;
@@ -48,19 +53,19 @@ DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
     return TRUE;
 }
 #endif /* OPJ_STATIC */
-#endif /* WIN32 */
+#endif /* _WIN32 */
 
 /* ---------------------------------------------------------------------- */
 
 
 const char* OPJ_CALLCONV opj_version(void) {
-    return OPENJPEG_VERSION;
+    return PACKAGE_VERSION;
 }
 
 opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format) {
-       opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_malloc(sizeof(opj_dinfo_t));
+       opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_calloc(1, sizeof(opj_dinfo_t));
        if(!dinfo) return NULL;
-       dinfo->is_decompressor = true;
+       dinfo->is_decompressor = OPJ_TRUE;
        switch(format) {
                case CODEC_J2K:
                case CODEC_JPT:
@@ -120,9 +125,10 @@ void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t *paramete
 
                parameters->decod_format = -1;
                parameters->cod_format = -1;
+               parameters->flags = 0;          
 /* UniPG>> */
 #ifdef USE_JPWL
-               parameters->jpwl_correct = false;
+               parameters->jpwl_correct = OPJ_FALSE;
                parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS;
                parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES;
 #endif /* USE_JPWL */
@@ -159,7 +165,7 @@ opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *ci
                        case CODEC_JPT:
                                return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info);
                        case CODEC_JP2:
-                               return jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio, cstr_info);
+                               return opj_jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio, cstr_info);
                        case CODEC_UNKNOWN:
                        default:
                                break;
@@ -169,9 +175,9 @@ opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo, opj_cio_t *ci
 }
 
 opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format) {
-       opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_malloc(sizeof(opj_cinfo_t));
+       opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_calloc(1, sizeof(opj_cinfo_t));
        if(!cinfo) return NULL;
-       cinfo->is_decompressor = false;
+       cinfo->is_decompressor = OPJ_FALSE;
        switch(format) {
                case CODEC_J2K:
                        /* get a J2K coder handle */
@@ -238,9 +244,15 @@ void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t *paramete
                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 = false;
+               parameters->jpwl_epc_on = OPJ_FALSE;
                parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */
                {
                        int i;
@@ -290,7 +302,7 @@ void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *param
        }
 }
 
-bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index) {
+opj_bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index) {
        if (index != NULL)
                opj_event_msg((opj_common_ptr)cinfo, EVT_WARNING, "Set index to NULL when calling the opj_encode function.\n"
                "To extract the index, use the opj_encode_with_info() function.\n"
@@ -298,20 +310,20 @@ bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *im
        return opj_encode_with_info(cinfo, cio, image, NULL);
 }
 
-bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
+opj_bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
        if(cinfo && cio && image) {
                switch(cinfo->codec_format) {
                        case CODEC_J2K:
                                return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, cstr_info);
                        case CODEC_JP2:
-                               return jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, cstr_info);
+                               return opj_jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, cstr_info);        
                        case CODEC_JPT:
                        case CODEC_UNKNOWN:
                        default:
                                break;
                }
        }
-       return false;
+       return OPJ_FALSE;
 }
 
 void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info) {
@@ -322,8 +334,10 @@ void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info) {
                        opj_free(tile_info->thresh);
                        opj_free(tile_info->packet);
                        opj_free(tile_info->tp);
+                       opj_free(tile_info->marker);
                }
                opj_free(cstr_info->tile);
                opj_free(cstr_info->marker);
+               opj_free(cstr_info->numdecompos);
        }
 }
index ae7764eab2f5028a4f57d35aa73e7672c34d9e33..53e9fac0438131b1a3d9220dcea1c856c3efaf32 100644 (file)
@@ -6,6 +6,7 @@
  * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
  * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2006-2007, Parvatha Elangovan
+ * Copyright (c) 2010-2011, Kaori Hagihara
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -32,7 +33,6 @@
 #ifndef OPENJPEG_H
 #define OPENJPEG_H
 
-#define OPENJPEG_VERSION "1.3.0"
 
 /* 
 ==========================================================
 ==========================================================
 */
 
+#if defined(OPJ_STATIC) || !defined(_WIN32)
 #define OPJ_API
 #define OPJ_CALLCONV
-
-#ifndef __cplusplus
-#if defined(HAVE_STDBOOL_H)
-/*
-The C language implementation does correctly provide the standard header
-file "stdbool.h".
- */
-#include <stdbool.h>
 #else
+#define OPJ_CALLCONV __stdcall
 /*
-The C language implementation does not provide the standard header file
-"stdbool.h" as required by ISO/IEC 9899:1999.  Try to compensate for this
-braindamage below.
-*/
-#if !defined(bool)
-#define        bool    int
-#endif
-#if !defined(true)
-#define true   1
-#endif
-#if !defined(false)
-#define        false   0
-#endif
-#endif
-#endif /* __cplusplus */
+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 
+OPJ_API functions as being imported from a DLL, wheras 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 */
+#endif /* !OPJ_STATIC || !_WIN32 */
 
+typedef int opj_bool;
+#define OPJ_TRUE 1
+#define OPJ_FALSE 0
+
+/* Avoid compile-time warning because parameter is not used */
+#define OPJ_ARG_NOT_USED(x) (void)(x)
 /* 
 ==========================================================
    Useful constant definitions
@@ -130,7 +128,8 @@ typedef enum PROG_ORDER {
 Supported image color spaces
 */
 typedef enum COLOR_SPACE {
-       CLRSPC_UNKNOWN = -1,    /**< place-holder */
+       CLRSPC_UNKNOWN = -1,    /**< not supported by the library */
+       CLRSPC_UNSPECIFIED = 0, /**< not specified in the codestream */ 
        CLRSPC_SRGB = 1,                /**< sRGB */
        CLRSPC_GRAY = 2,                /**< grayscale */
        CLRSPC_SYCC = 3                 /**< YUV */
@@ -141,9 +140,9 @@ Supported codec
 */
 typedef enum CODEC_FORMAT {
        CODEC_UNKNOWN = -1,     /**< place-holder */
-       CODEC_J2K = 0,          /**< JPEG-2000 codestream : read/write */
-       CODEC_JPT = 1,          /**< JPT-stream (JPEG 2000, JPIP) : read only */
-       CODEC_JP2 = 2           /**< JPEG-2000 file format : read/write */
+       CODEC_J2K  = 0,         /**< JPEG-2000 codestream : read/write */
+       CODEC_JPT  = 1,         /**< JPT-stream (JPEG 2000, JPIP) : read only */
+       CODEC_JP2  = 2          /**< JPEG-2000 file format : read/write */
 } OPJ_CODEC_FORMAT;
 
 /** 
@@ -226,7 +225,7 @@ Compression parameters
 */
 typedef struct opj_cparameters {
        /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
-       bool tile_size_on;
+       opj_bool tile_size_on;
        /** XTOsiz */
        int cp_tx0;
        /** YTOsiz */
@@ -308,7 +307,7 @@ typedef struct opj_cparameters {
        /**@name JPWL encoding parameters */
        /*@{*/
        /** enables writing of EPC in MH, thus activating JPWL */
-       bool jpwl_epc_on;
+       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) */
@@ -348,8 +347,12 @@ typedef struct opj_cparameters {
        char tp_flag;
        /** MCT (multiple component transform) */
        char tcp_mct;
+       /** Enable JPIP indexing*/
+       opj_bool jpip_on;
 } opj_cparameters_t;
 
+#define OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG     0x0001
+
 /**
 Decompression parameters
 */
@@ -386,7 +389,7 @@ typedef struct opj_dparameters {
        /**@name JPWL decoding parameters */
        /*@{*/
        /** activates the JPWL correction capabilities */
-       bool jpwl_correct;
+       opj_bool jpwl_correct;
        /** expected number of components */
        int jpwl_exp_comps;
        /** maximum number of tiles */
@@ -402,6 +405,7 @@ typedef struct opj_dparameters {
        */
        OPJ_LIMIT_DECODING cp_limit_decoding;
 
+       unsigned int flags;
 } opj_dparameters_t;
 
 /** Common fields between JPEG-2000 compression and decompression master structs. */
@@ -409,7 +413,7 @@ typedef struct opj_dparameters {
 #define opj_common_fields \
        opj_event_mgr_t *event_mgr;     /**< pointer to the event manager */\
        void * client_data;                     /**< Available for use by application */\
-       bool is_decompressor;           /**< So common code can tell which is which */\
+       opj_bool is_decompressor;       /**< So common code can tell which is which */\
        OPJ_CODEC_FORMAT codec_format;  /**< selected codec */\
        void *j2k_handle;                       /**< pointer to the J2K codec */\
        void *jp2_handle;                       /**< pointer to the JP2 codec */\
@@ -537,6 +541,10 @@ typedef struct opj_image {
        OPJ_COLOR_SPACE color_space;
        /** image components */
        opj_image_comp_t *comps;
+       /** 'restricted' ICC profile */
+       unsigned char *icc_profile_buf;
+       /** size of ICC profile */
+       int icc_profile_len;
 } opj_image_t;
 
 /**
@@ -583,6 +591,21 @@ typedef struct opj_packet_info {
        double disto;
 } opj_packet_info_t;
 
+
+/* UniPG>> */
+/**
+Marker structure
+*/
+typedef struct opj_marker_info_t {
+       /** marker type */
+       unsigned short int type;
+       /** position in codestream */
+       int pos;
+       /** length, marker val included */
+       int len;
+} opj_marker_info_t;
+/* <<UniPG */
+
 /**
 Index structure : Information concerning tile-parts
 */
@@ -627,26 +650,18 @@ typedef struct opj_tile_info {
        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;
 
-/* UniPG>> */
-/**
-Marker structure
-*/
-typedef struct opj_marker_info_t {
-       /** marker type */
-       unsigned short int type;
-       /** position in codestream */
-       int pos;
-       /** length, marker val included */
-       int len;
-} opj_marker_info_t;
-/* <<UniPG */
-
 /**
 Index structure of the codestream
 */
@@ -865,13 +880,13 @@ Setup the encoder parameters using the current image and using user parameters.
 OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo, opj_cparameters_t *parameters, opj_image_t *image);
 /**
 Encode an image into a JPEG-2000 codestream
-@param cinfo compressor handle
+3@param cinfo compressor handle
 @param cio Output buffer stream
 @param image Image to encode
 @param index Depreacted -> Set to NULL. To extract index, used opj_encode_wci()
 @return Returns true if successful, returns false otherwise
 */
-OPJ_API bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index);
+OPJ_API opj_bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, char *index);
 /**
 Encode an image into a JPEG-2000 codestream and extract the codestream information
 @param cinfo compressor handle
@@ -880,13 +895,14 @@ Encode an image into a JPEG-2000 codestream and extract the codestream informati
 @param cstr_info Codestream information structure if needed afterwards, NULL otherwise
 @return Returns true if successful, returns false otherwise
 */
-OPJ_API bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
+OPJ_API opj_bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
 /**
 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_t *cstr_info);
 
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/extern/libopenjpeg/opj_config.h b/extern/libopenjpeg/opj_config.h
new file mode 100644 (file)
index 0000000..82e12be
--- /dev/null
@@ -0,0 +1,38 @@
+/* for BLENDER - we hand-maintain this,
+ * for the original OpenJpeg package it is generated,
+ * the endian check is a blender define */
+
+/* create config.h for CMake */
+#define PACKAGE_VERSION "1.5.0"
+
+#define HAVE_INTTYPES_H
+#define HAVE_MEMORY_H
+#define HAVE_STDINT_H
+#define HAVE_STDLIB_H
+#define HAVE_STRINGS_H
+#define HAVE_STRING_H
+#define HAVE_SYS_STAT_H
+#define HAVE_SYS_TYPES_H
+#define HAVE_UNISTD_H
+/* #define HAVE_LIBPNG */
+/* #define HAVE_PNG_H */
+/* #define HAVE_LIBTIFF */
+/* #define HAVE_TIFF_H */
+
+/* #undef HAVE_LIBLCMS1 */
+/* #undef HAVE_LIBLCMS2 */
+/* #undef HAVE_LCMS1_H */
+/* #undef HAVE_LCMS2_H */
+
+/* Byte order.  */
+/* All compilers that support Mac OS X define either __BIG_ENDIAN__ or
+__LITTLE_ENDIAN__ to match the endianness of the architecture being
+compiled for. This is not necessarily the same as the architecture of the
+machine doing the building. In order to support Universal Binaries on
+Mac OS X, we prefer those defines to decide the endianness.
+On other platforms we use the result of the TRY_RUN. */
+#if defined(__BIG_ENDIAN__)
+#  define OPJ_BIG_ENDIAN
+#else
+#  undef OPJ_BIG_ENDIAN
+#endif
index 3464cfcf9ed9d86231ec64cf43d785bf99fdbf09..2b5866a99902bd32a2d754d2bd442d2db9d109ce 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -65,7 +65,7 @@ Most compilers implement their own version of this keyword ...
 */
 #ifndef INLINE
        #if defined(_MSC_VER)
-               #define INLINE __inline
+               #define INLINE __forceinline
        #elif defined(__GNUC__)
                #define INLINE __inline__
        #elif defined(__MWERKS__)
@@ -86,30 +86,28 @@ Most compilers implement their own version of this keyword ...
        #endif
 #endif
 
-/* MSVC does not have lrintf */
-#ifdef _MSC_VER
+/* MSVC and Borland C do not have lrintf */
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+static INLINE long lrintf(float f){
 #ifdef _M_X64
-#include <emmintrin.h>
-static INLINE long lrintf(float f) {
-        return _mm_cvtss_si32(_mm_load_ss(&f));
-} 
+    return (long)((f>0.0f) ? (f + 0.5f):(f -0.5f));
 #else
-static INLINE long lrintf(float f){
-       int i;
-
-       _asm{
-               fld f
-               fistp i
-       };
-
-       return i;
-}
+    int i;
+    _asm{
+        fld f
+        fistp i
+    };
+    return i;
 #endif
+}
 #endif
 
 #include "j2k_lib.h"
 #include "opj_malloc.h"
 #include "event.h"
+#include "bio.h"
 #include "cio.h"
 
 #include "image.h"
@@ -130,9 +128,12 @@ static INLINE long lrintf(float f){
 #include "int.h"
 #include "fix.h"
 
+#include "cidx_manager.h"
+#include "indexbox_manager.h"
+
 /* JPWL>> */
 #ifdef USE_JPWL
-#include "../jpwl/jpwl.h"
+#include "./jpwl/jpwl.h"
 #endif /* USE_JPWL */
 /* <<JPWL */
 
index 960bdb3ec4b53cfac0a9c3bbb62d21af7671621b..87493f497c7a5e07e08983917ac6015b92b9e83f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, Hervé Drolon, FreeImage Team
+ * Copyright (c) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
  * All rights reserved.
  *
@@ -45,7 +45,11 @@ 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
 */
+#ifdef ALLOC_PERF_OPT
+void * OPJ_CALLCONV opj_malloc(size_t size);
+#else
 #define opj_malloc(size) malloc(size)
+#endif
 
 /**
 Allocate a memory block with elements initialized to 0
@@ -53,7 +57,11 @@ Allocate a memory block with elements initialized to 0
 @param size 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
+void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements);
+#else
 #define opj_calloc(num, size) calloc(num, size)
+#endif
 
 /**
 Allocate memory aligned to a 16 byte boundry
@@ -61,7 +69,7 @@ Allocate memory aligned to a 16 byte boundry
 @return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
 */
 /* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */
-#ifdef WIN32
+#ifdef _WIN32
        /* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */
        #ifdef __GNUC__
                #include <mm_malloc.h>
@@ -72,23 +80,16 @@ Allocate memory aligned to a 16 byte boundry
                        #define HAVE_MM_MALLOC
                #endif
        #endif
-#else /* Not WIN32 */
+#else /* Not _WIN32 */
        #if defined(__sun)
-                       #define HAVE_MEMALIGN
-               #elif defined(__GNUC__)
-                        #if !defined(__APPLE__) && !defined(__FreeBSD__)
-                           #define HAVE_MEMALIGN
-                           #include <malloc.h>
-                        #endif
-               /* Linux x86_64 and OSX always align allocations to 16 bytes */
-               #elif !defined(__amd64__) && !defined(__APPLE__)        
-                       /* FIXME: Yes, this is a big assumption */
-                       #define HAVE_POSIX_MEMALIGN
+               #define HAVE_MEMALIGN
+       /* Linux x86_64 and OSX always align allocations to 16 bytes */
+       #elif !defined(__amd64__) && !defined(__APPLE__)        
+               #define HAVE_MEMALIGN
+               #include <malloc.h>                     
        #endif
 #endif
 
-
-
 #define opj_aligned_malloc(size) malloc(size)
 #define opj_aligned_free(m) free(m)
 
@@ -120,19 +121,34 @@ Allocate memory aligned to a 16 byte boundry
        #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)
+#endif
+
 /**
 Reallocate memory blocks.
-@param memblock Pointer to previously allocated memory block
-@param size New size in bytes
+@param m Pointer to previously allocated memory block
+@param s New size in bytes
 @return Returns a void pointer to the reallocated (and possibly moved) memory block
 */
+#ifdef ALLOC_PERF_OPT
+void * OPJ_CALLCONV opj_realloc(void * m, size_t s);
+#else
 #define opj_realloc(m, s) realloc(m, s)
+#endif
 
 /**
 Deallocates or frees a memory block.
-@param memblock Previously allocated memory block to be freed
+@param m Previously allocated memory block to be freed
 */
+#ifdef ALLOC_PERF_OPT
+void OPJ_CALLCONV opj_free(void * m);
+#else
 #define opj_free(m) free(m)
+#endif
 
 #ifdef __GNUC__
 #pragma GCC poison malloc calloc realloc free
diff --git a/extern/libopenjpeg/phix_manager.c b/extern/libopenjpeg/phix_manager.c
new file mode 100644 (file)
index 0000000..60a0281
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * $Id: phix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * 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.
+ */
+
+/*! \file
+ *  \brief Modification of jpip.c from 2KAN indexer
+ */
+
+#include <stdlib.h>
+#include <math.h>
+#include "opj_includes.h"
+
+/* 
+ * Write faix box of phix
+ *
+ * @param[in] coff      offset of j2k codestream
+ * @param[in] compno    component number
+ * @param[in] cstr_info codestream information
+ * @param[in] EPHused   true if if EPH option used
+ * @param[in] j2klen    length of j2k codestream
+ * @param[in] cio       file output handle
+ * @return              length of faix box
+ */
+int write_phixfaix( int coff, int compno, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio);
+
+int write_phix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio)
+{
+  int len, lenp=0, compno, i;
+  opj_jp2_box_t *box;
+
+  box = (opj_jp2_box_t *)opj_calloc( cstr_info.numcomps, sizeof(opj_jp2_box_t));
+  
+  for( i=0;i<2;i++){
+    if (i) cio_seek( cio, lenp);
+      
+    lenp = cio_tell( cio);
+    cio_skip( cio, 4);              /* L [at the end] */
+    cio_write( cio, JPIP_PHIX, 4);  /* PHIX           */
+      
+    write_manf( i, cstr_info.numcomps, box, cio);
+
+    for( compno=0; compno<cstr_info.numcomps; compno++){       
+      box[compno].length = write_phixfaix( coff, compno, cstr_info, EPHused, j2klen, cio);
+      box[compno].type = JPIP_FAIX;
+    }
+
+    len = cio_tell( cio)-lenp;
+    cio_seek( cio, lenp);
+    cio_write( cio, len, 4);        /* L              */
+    cio_seek( cio, lenp+len);
+  }
+
+  opj_free(box);
+
+  return len;
+}
+
+int write_phixfaix( int coff, int compno, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio)
+{
+  int len, lenp, tileno, version, i, nmax, size_of_coding; /* 4 or 8 */
+  opj_tile_info_t *tile_Idx;
+  opj_packet_info_t packet;
+  int resno, precno, layno, num_packet;
+  int numOfres, numOfprec, numOflayers;
+  packet.end_ph_pos = packet.start_pos = -1;
+  (void)EPHused; /* unused ? */
+
+  if( j2klen > pow( 2, 32)){
+    size_of_coding =  8;
+    version = 1;
+  }
+  else{
+    size_of_coding = 4;
+    version = 0;
+  }
+
+  lenp = cio_tell( cio);
+  cio_skip( cio, 4);              /* L [at the end]      */
+  cio_write( cio, JPIP_FAIX, 4);  /* FAIX                */ 
+  cio_write( cio, version,1);     /* Version 0 = 4 bytes */
+
+  nmax = 0;
+  for( i=0; i<=cstr_info.numdecompos[compno]; i++)
+    nmax += cstr_info.tile[0].ph[i] * cstr_info.tile[0].pw[i] * cstr_info.numlayers;
+  
+  cio_write( cio, nmax, size_of_coding); /* NMAX */
+  cio_write( cio, cstr_info.tw*cstr_info.th, size_of_coding);      /* M    */
+  
+  for( tileno=0; tileno<cstr_info.tw*cstr_info.th; tileno++){
+    tile_Idx = &cstr_info.tile[ tileno];
+    
+    num_packet = 0;
+    numOfres = cstr_info.numdecompos[compno] + 1;
+
+    for( resno=0; resno<numOfres ; resno++){
+      numOfprec = tile_Idx->pw[resno]*tile_Idx->ph[resno];
+      for( precno=0; precno<numOfprec; precno++){
+       numOflayers = cstr_info.numlayers;
+       for( layno=0; layno<numOflayers; layno++){
+         
+         switch ( cstr_info.prog){
+         case LRCP:
+           packet = tile_Idx->packet[ ((layno*numOfres+resno)*cstr_info.numcomps+compno)*numOfprec+precno];
+           break;
+         case RLCP:
+           packet = tile_Idx->packet[ ((resno*numOflayers+layno)*cstr_info.numcomps+compno)*numOfprec+precno];
+           break;
+         case RPCL:
+           packet = tile_Idx->packet[ ((resno*numOfprec+precno)*cstr_info.numcomps+compno)*numOflayers+layno];
+           break;
+         case PCRL:
+           packet = tile_Idx->packet[ ((precno*cstr_info.numcomps+compno)*numOfres+resno)*numOflayers + layno];
+           break;
+         case CPRL:
+           packet = tile_Idx->packet[ ((compno*numOfprec+precno)*numOfres+resno)*numOflayers + layno];
+           break;
+         default:
+           fprintf( stderr, "failed to ppix indexing\n");
+         }
+
+         cio_write( cio, packet.start_pos-coff, size_of_coding);                /* start position */
+         cio_write( cio, packet.end_ph_pos-packet.start_pos+1, size_of_coding); /* length         */
+         
+         num_packet++;
+       }
+      }
+    }
+
+    /* PADDING */
+    while( num_packet < nmax){
+      cio_write( cio, 0, size_of_coding); /* start position            */
+      cio_write( cio, 0, size_of_coding); /* length                    */
+      num_packet++;
+    }
+  }
+
+  len = cio_tell( cio)-lenp;
+  cio_seek( cio, lenp);
+  cio_write( cio, len, 4);        /* L  */
+  cio_seek( cio, lenp+len);
+
+  return len;
+}
index ac7654c5f14f65e8d3a6ebe62cff7ede39b140b2..e8e33bfe6008d78aec0d88ebd054632c02dd23ed 100644 (file)
@@ -43,31 +43,31 @@ Get next packet in layer-resolution-component-precinct order.
 @param pi packet iterator to modify
 @return returns false if pi pointed to the last packet or else returns true 
 */
-static bool pi_next_lrcp(opj_pi_iterator_t * pi);
+static opj_bool pi_next_lrcp(opj_pi_iterator_t * pi);
 /**
 Get next packet in resolution-layer-component-precinct order.
 @param pi packet iterator to modify
 @return returns false if pi pointed to the last packet or else returns true 
 */
-static bool pi_next_rlcp(opj_pi_iterator_t * pi);
+static opj_bool pi_next_rlcp(opj_pi_iterator_t * pi);
 /**
 Get next packet in resolution-precinct-component-layer order.
 @param pi packet iterator to modify
 @return returns false if pi pointed to the last packet or else returns true 
 */
-static bool pi_next_rpcl(opj_pi_iterator_t * pi);
+static opj_bool pi_next_rpcl(opj_pi_iterator_t * pi);
 /**
 Get next packet in precinct-component-resolution-layer order.
 @param pi packet iterator to modify
 @return returns false if pi pointed to the last packet or else returns true 
 */
-static bool pi_next_pcrl(opj_pi_iterator_t * pi);
+static opj_bool pi_next_pcrl(opj_pi_iterator_t * pi);
 /**
 Get next packet in component-precinct-resolution-layer order.
 @param pi packet iterator to modify
 @return returns false if pi pointed to the last packet or else returns true 
 */
-static bool pi_next_cprl(opj_pi_iterator_t * pi);
+static opj_bool pi_next_cprl(opj_pi_iterator_t * pi);
 
 /*@}*/
 
@@ -79,7 +79,7 @@ static bool pi_next_cprl(opj_pi_iterator_t * pi);
 ==========================================================
 */
 
-static bool pi_next_lrcp(opj_pi_iterator_t * pi) {
+static opj_bool pi_next_lrcp(opj_pi_iterator_t * pi) {
        opj_pi_comp_t *comp = NULL;
        opj_pi_resolution_t *res = NULL;
        long index = 0;
@@ -108,7 +108,7 @@ static bool pi_next_lrcp(opj_pi_iterator_t * pi) {
                                        index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
                                        if (!pi->include[index]) {
                                                pi->include[index] = 1;
-                                               return true;
+                                               return OPJ_TRUE;
                                        }
 LABEL_SKIP:;
                                }
@@ -116,10 +116,10 @@ LABEL_SKIP:;
                }
        }
        
-       return false;
+       return OPJ_FALSE;
 }
 
-static bool pi_next_rlcp(opj_pi_iterator_t * pi) {
+static opj_bool pi_next_rlcp(opj_pi_iterator_t * pi) {
        opj_pi_comp_t *comp = NULL;
        opj_pi_resolution_t *res = NULL;
        long index = 0;
@@ -147,7 +147,7 @@ static bool pi_next_rlcp(opj_pi_iterator_t * pi) {
                                        index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
                                        if (!pi->include[index]) {
                                                pi->include[index] = 1;
-                                               return true;
+                                               return OPJ_TRUE;
                                        }
 LABEL_SKIP:;
                                }
@@ -155,10 +155,10 @@ LABEL_SKIP:;
                }
        }
        
-       return false;
+       return OPJ_FALSE;
 }
 
-static bool pi_next_rpcl(opj_pi_iterator_t * pi) {
+static opj_bool pi_next_rpcl(opj_pi_iterator_t * pi) {
        opj_pi_comp_t *comp = NULL;
        opj_pi_resolution_t *res = NULL;
        long index = 0;
@@ -209,14 +209,14 @@ if (!pi->tp_on){
                                        try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
                                        rpx = res->pdx + levelno;
                                        rpy = res->pdy + levelno;
-                                       if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpx))))){
+                                       if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
                                                continue;       
                                        }
                                        if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
                                                continue; 
                                        }
                                        
-                                       if ((res->pw==0)||(res->pw==0)) continue;
+                                       if ((res->pw==0)||(res->ph==0)) continue;
                                        
                                        if ((trx0==trx1)||(try0==try1)) continue;
                                        
@@ -229,7 +229,7 @@ if (!pi->tp_on){
                                                index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
                                                if (!pi->include[index]) {
                                                        pi->include[index] = 1;
-                                                       return true;
+                                                       return OPJ_TRUE;
                                                }
 LABEL_SKIP:;
                                        }
@@ -238,10 +238,10 @@ LABEL_SKIP:;
                }
        }
        
-       return false;
+       return OPJ_FALSE;
 }
 
-static bool pi_next_pcrl(opj_pi_iterator_t * pi) {
+static opj_bool pi_next_pcrl(opj_pi_iterator_t * pi) {
        opj_pi_comp_t *comp = NULL;
        opj_pi_resolution_t *res = NULL;
        long index = 0;
@@ -290,14 +290,14 @@ static bool pi_next_pcrl(opj_pi_iterator_t * pi) {
                                        try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
                                        rpx = res->pdx + levelno;
                                        rpy = res->pdy + levelno;
-                                       if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpx))))){
+                                       if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
                                                continue;       
                                        }
                                        if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
                                                continue; 
                                        }
                                        
-                                       if ((res->pw==0)||(res->pw==0)) continue;
+                                       if ((res->pw==0)||(res->ph==0)) continue;
                                        
                                        if ((trx0==trx1)||(try0==try1)) continue;
                                        
@@ -310,7 +310,7 @@ static bool pi_next_pcrl(opj_pi_iterator_t * pi) {
                                                index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
                                                if (!pi->include[index]) {
                                                        pi->include[index] = 1;
-                                                       return true;
+                                                       return OPJ_TRUE;
                                                }       
 LABEL_SKIP:;
                                        }
@@ -319,10 +319,10 @@ LABEL_SKIP:;
                }
        }
        
-       return false;
+       return OPJ_FALSE;
 }
 
-static bool pi_next_cprl(opj_pi_iterator_t * pi) {
+static opj_bool pi_next_cprl(opj_pi_iterator_t * pi) {
        opj_pi_comp_t *comp = NULL;
        opj_pi_resolution_t *res = NULL;
        long index = 0;
@@ -369,14 +369,14 @@ static bool pi_next_cprl(opj_pi_iterator_t * pi) {
                                        try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
                                        rpx = res->pdx + levelno;
                                        rpy = res->pdy + levelno;
-                                       if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpx))))){
+                                       if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) && ((try0 << levelno) % (1 << rpy))))){
                                                continue;       
                                        }
                                        if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) && ((trx0 << levelno) % (1 << rpx))))){
                                                continue; 
                                        }
                                        
-                                       if ((res->pw==0)||(res->pw==0)) continue;
+                                       if ((res->pw==0)||(res->ph==0)) continue;
                                        
                                        if ((trx0==trx1)||(try0==try1)) continue;
                                        
@@ -389,7 +389,7 @@ static bool pi_next_cprl(opj_pi_iterator_t * pi) {
                                                index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p;
                                                if (!pi->include[index]) {
                                                        pi->include[index] = 1;
-                                                       return true;
+                                                       return OPJ_TRUE;
                                                }
 LABEL_SKIP:;
                                        }
@@ -398,7 +398,7 @@ LABEL_SKIP:;
                }
        }
        
-       return false;
+       return OPJ_FALSE;
 }
 
 /* 
@@ -707,7 +707,7 @@ void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno) {
        }
 }
 
-bool pi_next(opj_pi_iterator_t * pi) {
+opj_bool pi_next(opj_pi_iterator_t * pi) {
        switch (pi->poc.prg) {
                case LRCP:
                        return pi_next_lrcp(pi);
@@ -720,13 +720,13 @@ bool pi_next(opj_pi_iterator_t * pi) {
                case CPRL:
                        return pi_next_cprl(pi);
                case PROG_UNKNOWN:
-                       return false;
+                       return OPJ_FALSE;
        }
        
-       return false;
+       return OPJ_FALSE;
 }
 
-bool pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp){
+opj_bool pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp){
        char prog[4];
        int i;
        int incr_top=1,resetX=0;
@@ -748,7 +748,7 @@ bool pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,
                case RPCL: strncpy(prog, "RPCL",4);
                        break;
                case PROG_UNKNOWN: 
-                       return true;
+                       return OPJ_TRUE;
        }
 
        if(!(cp->tp_on && ((!cp->cinema && (t2_mode == FINAL_PASS)) || cp->cinema))){
@@ -958,6 +958,6 @@ bool pi_create_encode( opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,
                        } 
                }
        }       
-       return false;
+       return OPJ_FALSE;
 }
 
index b5e0f6a4df85060d51be5c85576cd95a90deb9f0..cf9135fd1f52c1ee03e497db74e01f1f8d62307c 100644 (file)
@@ -115,12 +115,14 @@ Modify the packet iterator for enabling tile part generation
 @param pi Handle to the packet iterator generated in pi_initialise_encode  
 @param cp Coding parameters
 @param tileno Number that identifies the tile for which to list the packets
+@param pino Iterator index for pi
 @param tpnum Tile part number of the current tile
 @param tppos The position of the tile part flag in the progression order
+@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass
 @param cur_totnum_tp The total number of tile parts in the current tile
 @return Returns true if an error is detected 
 */
-bool pi_create_encode(opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp);
+opj_bool pi_create_encode(opj_pi_iterator_t *pi, opj_cp_t *cp,int tileno, int pino,int tpnum, int tppos, J2K_T2_MODE t2_mode,int cur_totnum_tp);
 /**
 Create a packet iterator for Decoder
 @param image Raw image for which the packets will be listed
@@ -145,7 +147,7 @@ Modify the packet iterator to point to the next packet
 @param pi Packet iterator to modify
 @return Returns false if pi pointed to the last packet or else returns true 
 */
-bool pi_next(opj_pi_iterator_t * pi);
+opj_bool pi_next(opj_pi_iterator_t * pi);
 /* ----------------------------------------------------------------------- */
 /*@}*/
 
diff --git a/extern/libopenjpeg/ppix_manager.c b/extern/libopenjpeg/ppix_manager.c
new file mode 100644 (file)
index 0000000..58d324c
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+ * $Id: ppix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * 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.
+ */
+
+/*! \file
+ *  \brief Modification of jpip.c from 2KAN indexer
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include "opj_includes.h"
+
+/* 
+ * Write faix box of ppix
+ *
+ * @param[in] coff offset of j2k codestream
+ * @param[in] compno    component number
+ * @param[in] cstr_info codestream information
+ * @param[in] EPHused   true if if EPH option used
+ * @param[in] j2klen    length of j2k codestream
+ * @param[in] cio       file output handle
+ * @return              length of faix box
+ */
+int write_ppixfaix( int coff, int compno, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio);
+
+int write_ppix( int coff, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio)
+{
+  int len, lenp, compno, i;
+  opj_jp2_box_t *box;
+
+  /*  printf("cstr_info.packno %d\n", cstr_info.packno); //NMAX? */
+
+  lenp = -1;
+  box = (opj_jp2_box_t *)opj_calloc( cstr_info.numcomps, sizeof(opj_jp2_box_t));
+  
+  for (i=0;i<2;i++){
+    if (i) cio_seek( cio, lenp);
+    
+    lenp = cio_tell( cio);
+    cio_skip( cio, 4);              /* L [at the end] */
+    cio_write( cio, JPIP_PPIX, 4);  /* PPIX           */
+
+    write_manf( i, cstr_info.numcomps, box, cio);
+    
+    for (compno=0; compno<cstr_info.numcomps; compno++){
+      box[compno].length = write_ppixfaix( coff, compno, cstr_info, EPHused, j2klen, cio);
+      box[compno].type = JPIP_FAIX;
+    }
+   
+    len = cio_tell( cio)-lenp;
+    cio_seek( cio, lenp);
+    cio_write( cio, len, 4);        /* L              */
+    cio_seek( cio, lenp+len);
+  }
+  
+  opj_free(box);
+
+  return len;
+}
+
+int write_ppixfaix( int coff, int compno, opj_codestream_info_t cstr_info, opj_bool EPHused, int j2klen, opj_cio_t *cio)
+{
+  int len, lenp, tileno, version, i, nmax, size_of_coding; /* 4 or 8*/
+  opj_tile_info_t *tile_Idx;
+  opj_packet_info_t packet;
+  int resno, precno, layno, num_packet;
+  int numOfres, numOfprec, numOflayers;
+  packet.end_pos = packet.end_ph_pos = packet.start_pos = -1;
+  (void)EPHused; /* unused ? */
+
+  if( j2klen > pow( 2, 32)){
+    size_of_coding =  8;
+    version = 1;
+  }
+  else{
+    size_of_coding = 4;
+    version = 0;
+  }
+  
+  lenp = cio_tell( cio);
+  cio_skip( cio, 4);              /* L [at the end]      */
+  cio_write( cio, JPIP_FAIX, 4);  /* FAIX                */ 
+  cio_write( cio, version, 1);     /* Version 0 = 4 bytes */
+
+  nmax = 0;
+  for( i=0; i<=cstr_info.numdecompos[compno]; i++)
+    nmax += cstr_info.tile[0].ph[i] * cstr_info.tile[0].pw[i] * cstr_info.numlayers;
+  
+  cio_write( cio, nmax, size_of_coding); /* NMAX */
+  cio_write( cio, cstr_info.tw*cstr_info.th, size_of_coding);      /* M    */
+
+  for( tileno=0; tileno<cstr_info.tw*cstr_info.th; tileno++){
+    tile_Idx = &cstr_info.tile[ tileno];
+    num_packet=0;
+    numOfres = cstr_info.numdecompos[compno] + 1;
+  
+    for( resno=0; resno<numOfres ; resno++){
+      numOfprec = tile_Idx->pw[resno]*tile_Idx->ph[resno];
+      for( precno=0; precno<numOfprec; precno++){
+       numOflayers = cstr_info.numlayers;
+       for( layno=0; layno<numOflayers; layno++){
+
+         switch ( cstr_info.prog){
+         case LRCP:
+           packet = tile_Idx->packet[ ((layno*numOfres+resno)*cstr_info.numcomps+compno)*numOfprec+precno];
+           break;
+         case RLCP:
+           packet = tile_Idx->packet[ ((resno*numOflayers+layno)*cstr_info.numcomps+compno)*numOfprec+precno];
+           break;
+         case RPCL:
+           packet = tile_Idx->packet[ ((resno*numOfprec+precno)*cstr_info.numcomps+compno)*numOflayers+layno];
+           break;
+         case PCRL:
+           packet = tile_Idx->packet[ ((precno*cstr_info.numcomps+compno)*numOfres+resno)*numOflayers + layno];
+           break;
+         case CPRL:
+           packet = tile_Idx->packet[ ((compno*numOfprec+precno)*numOfres+resno)*numOflayers + layno];
+           break;
+         default:
+           fprintf( stderr, "failed to ppix indexing\n");
+         }
+
+         cio_write( cio, packet.start_pos-coff, size_of_coding);             /* start position */
+         cio_write( cio, packet.end_pos-packet.start_pos+1, size_of_coding); /* length         */
+         
+         num_packet++;
+       }
+      }
+    }
+  
+    while( num_packet < nmax){     /* PADDING */
+      cio_write( cio, 0, size_of_coding); /* start position            */
+      cio_write( cio, 0, size_of_coding); /* length                    */
+      num_packet++;
+    }   
+  }
+
+  len = cio_tell( cio)-lenp;
+  cio_seek( cio, lenp);
+  cio_write( cio, len, 4);        /* L  */
+  cio_seek( cio, lenp+len);
+
+  return len;
+}
index ad1c6a83ab634411889a519621a2b4bb7d9a3419..477720412aa13aafdfa4f98c7259823c929f8a35 100644 (file)
@@ -62,13 +62,25 @@ static void t1_enc_sigpass_step(
 /**
 Decode significant pass
 */
-static void t1_dec_sigpass_step(
+static INLINE void t1_dec_sigpass_step_raw(
+               opj_t1_t *t1,
+               flag_t *flagsp,
+               int *datap,
+               int orient,
+               int oneplushalf,
+               int vsc);
+static INLINE void t1_dec_sigpass_step_mqc(
+               opj_t1_t *t1,
+               flag_t *flagsp,
+               int *datap,
+               int orient,
+               int oneplushalf);
+static INLINE void t1_dec_sigpass_step_mqc_vsc(
                opj_t1_t *t1,
                flag_t *flagsp,
                int *datap,
                int orient,
                int oneplushalf,
-               char type,
                int vsc);
 /**
 Encode significant pass
@@ -83,12 +95,19 @@ static void t1_enc_sigpass(
 /**
 Decode significant pass
 */
-static void t1_dec_sigpass(
+static void t1_dec_sigpass_raw(
                opj_t1_t *t1,
                int bpno,
                int orient,
-               char type,
                int cblksty);
+static void t1_dec_sigpass_mqc(
+               opj_t1_t *t1,
+               int bpno,
+               int orient);
+static void t1_dec_sigpass_mqc_vsc(
+               opj_t1_t *t1,
+               int bpno,
+               int orient);
 /**
 Encode refinement pass
 */
@@ -104,14 +123,27 @@ static void t1_enc_refpass_step(
 /**
 Decode refinement pass
 */
-static void t1_dec_refpass_step(
+static INLINE void t1_dec_refpass_step_raw(
                opj_t1_t *t1,
                flag_t *flagsp,
                int *datap,
                int poshalf,
                int neghalf,
-               char type,
                int vsc);
+static INLINE void t1_dec_refpass_step_mqc(
+               opj_t1_t *t1,
+               flag_t *flagsp,
+               int *datap,
+               int poshalf,
+               int neghalf);
+static INLINE void t1_dec_refpass_step_mqc_vsc(
+               opj_t1_t *t1,
+               flag_t *flagsp,
+               int *datap,
+               int poshalf,
+               int neghalf,
+               int vsc);
+
 /**
 Encode refinement pass
 */
@@ -124,11 +156,16 @@ static void t1_enc_refpass(
 /**
 Decode refinement pass
 */
-static void t1_dec_refpass(
+static void t1_dec_refpass_raw(
                opj_t1_t *t1,
                int bpno,
-               char type,
                int cblksty);
+static void t1_dec_refpass_mqc(
+               opj_t1_t *t1,
+               int bpno);
+static void t1_dec_refpass_mqc_vsc(
+               opj_t1_t *t1,
+               int bpno);
 /**
 Encode clean-up pass
 */
@@ -145,7 +182,19 @@ static void t1_enc_clnpass_step(
 /**
 Decode clean-up pass
 */
+static void t1_dec_clnpass_step_partial(
+               opj_t1_t *t1,
+               flag_t *flagsp,
+               int *datap,
+               int orient,
+               int oneplushalf);
 static void t1_dec_clnpass_step(
+               opj_t1_t *t1,
+               flag_t *flagsp,
+               int *datap,
+               int orient,
+               int oneplushalf);
+static void t1_dec_clnpass_step_vsc(
                opj_t1_t *t1,
                flag_t *flagsp,
                int *datap,
@@ -178,7 +227,8 @@ static double t1_getwmsedec(
                int bpno,
                int qmfbid,
                double stepsize,
-               int numcomps);
+               int numcomps,
+               int mct);
 /**
 Encode 1 code-block
 @param t1 T1 handle
@@ -190,6 +240,7 @@ Encode 1 code-block
 @param stepsize
 @param cblksty Code-block style
 @param numcomps
+@param mct
 @param tile
 */
 static void t1_encode_cblk(
@@ -202,6 +253,7 @@ static void t1_encode_cblk(
                double stepsize,
                int cblksty,
                int numcomps,
+               int mct,
                opj_tcd_tile_t * tile);
 /**
 Decode 1 code-block
@@ -321,29 +373,43 @@ static void t1_enc_sigpass_step(
        }
 }
 
-static void t1_dec_sigpass_step(
+static INLINE void t1_dec_sigpass_step_raw(
                opj_t1_t *t1,
                flag_t *flagsp,
                int *datap,
                int orient,
                int oneplushalf,
-               char type,
                int vsc)
 {
        int v, flag;
-       
        opj_raw_t *raw = t1->raw;       /* RAW component */
-       opj_mqc_t *mqc = t1->mqc;       /* MQC component */
+       
+       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 (type == T1_TYPE_RAW) {
                        if (raw_decode(raw)) {
                                v = raw_decode(raw);    /* ESSAI */
                                *datap = v ? -oneplushalf : oneplushalf;
                                t1_updateflags(flagsp, v, t1->flags_stride);
                        }
-               } else {
+               *flagsp |= T1_VISIT;
+       }
+}                              /* VSC and  BYPASS by Antonin */
+
+static INLINE void t1_dec_sigpass_step_mqc(
+               opj_t1_t *t1,
+               flag_t *flagsp,
+               int *datap,
+               int orient,
+               int oneplushalf)
+{
+       int v, flag;
+       
+       opj_mqc_t *mqc = t1->mqc;       /* MQC component */
+       
+       flag = *flagsp;
+       if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
                        mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
                        if (mqc_decode(mqc)) {
                                mqc_setcurctx(mqc, t1_getctxno_sc(flag));
@@ -351,6 +417,30 @@ static void t1_dec_sigpass_step(
                                *datap = v ? -oneplushalf : oneplushalf;
                                t1_updateflags(flagsp, v, t1->flags_stride);
                        }
+               *flagsp |= T1_VISIT;
+       }
+}                              /* VSC and  BYPASS by Antonin */
+
+static INLINE void t1_dec_sigpass_step_mqc_vsc(
+               opj_t1_t *t1,
+               flag_t *flagsp,
+               int *datap,
+               int orient,
+               int oneplushalf,
+               int vsc)
+{
+       int 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))) {
+               mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
+               if (mqc_decode(mqc)) {
+                       mqc_setcurctx(mqc, t1_getctxno_sc(flag));
+                       v = mqc_decode(mqc) ^ t1_getspb(flag);
+                       *datap = v ? -oneplushalf : oneplushalf;
+                       t1_updateflags(flagsp, v, t1->flags_stride);
                }
                *flagsp |= T1_VISIT;
        }
@@ -386,11 +476,10 @@ static void t1_enc_sigpass(
        }
 }
 
-static void t1_dec_sigpass(
+static void t1_dec_sigpass_raw(
                opj_t1_t *t1,
                int bpno,
                int orient,
-               char type,
                int cblksty)
 {
        int i, j, k, one, half, oneplushalf, vsc;
@@ -401,13 +490,79 @@ static void t1_dec_sigpass(
                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;
-                               t1_dec_sigpass_step(
+                               t1_dec_sigpass_step_raw(
+                                               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 t1_dec_sigpass_mqc(
+               opj_t1_t *t1,
+               int bpno,
+               int orient)
+{
+       int i, j, k, one, half, oneplushalf;
+       int *data1 = t1->data;
+       flag_t *flags1 = &t1->flags[1];
+       one = 1 << bpno;
+       half = one >> 1;
+       oneplushalf = one | half;
+       for (k = 0; k < (t1->h & ~3); k += 4) {
+               for (i = 0; i < t1->w; ++i) {
+                       int *data2 = data1 + i;
+                       flag_t *flags2 = flags1 + i;
+                       flags2 += t1->flags_stride;
+                       t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+                       data2 += t1->w;
+                       flags2 += t1->flags_stride;
+                       t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+                       data2 += t1->w;
+                       flags2 += t1->flags_stride;
+                       t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+                       data2 += t1->w;
+                       flags2 += t1->flags_stride;
+                       t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+                       data2 += t1->w;
+               }
+               data1 += t1->w << 2;
+               flags1 += t1->flags_stride << 2;
+       }
+       for (i = 0; i < t1->w; ++i) {
+               int *data2 = data1 + i;
+               flag_t *flags2 = flags1 + i;
+               for (j = k; j < t1->h; ++j) {
+                       flags2 += t1->flags_stride;
+                       t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
+                       data2 += t1->w;
+               }
+       }
+}                              /* VSC and  BYPASS by Antonin */
+
+static void t1_dec_sigpass_mqc_vsc(
+               opj_t1_t *t1,
+               int bpno,
+               int orient)
+{
+       int i, j, k, one, half, oneplushalf, vsc;
+       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;
+                               t1_dec_sigpass_step_mqc_vsc(
                                                t1,
                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
                                                &t1->data[(j * t1->w) + i],
                                                orient,
                                                oneplushalf,
-                                               type,
                                                vsc);
                        }
                }
@@ -442,28 +597,64 @@ static void t1_enc_refpass_step(
        }
 }
 
-static void t1_dec_refpass_step(
+static INLINE void t1_dec_refpass_step_raw(
                opj_t1_t *t1,
                flag_t *flagsp,
                int *datap,
                int poshalf,
                int neghalf,
-               char type,
                int vsc)
 {
        int v, t, flag;
        
-       opj_mqc_t *mqc = t1->mqc;       /* MQC component */
        opj_raw_t *raw = t1->raw;       /* RAW component */
        
        flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*flagsp);
        if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
-               mqc_setcurctx(mqc, t1_getctxno_mag(flag));      /* ESSAI */
-               if (type == T1_TYPE_RAW) {
                        v = raw_decode(raw);
-               } else {
+               t = v ? poshalf : neghalf;
+               *datap += *datap < 0 ? -t : t;
+               *flagsp |= T1_REFINE;
+       }
+}                              /* VSC and  BYPASS by Antonin  */
+
+static INLINE void t1_dec_refpass_step_mqc(
+               opj_t1_t *t1,
+               flag_t *flagsp,
+               int *datap,
+               int poshalf,
+               int neghalf)
+{
+       int v, t, flag;
+       
+       opj_mqc_t *mqc = t1->mqc;       /* MQC component */
+       
+       flag = *flagsp;
+       if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
+               mqc_setcurctx(mqc, t1_getctxno_mag(flag));      /* ESSAI */
                        v = mqc_decode(mqc);
+               t = v ? poshalf : neghalf;
+               *datap += *datap < 0 ? -t : t;
+               *flagsp |= T1_REFINE;
                }
+}                              /* VSC and  BYPASS by Antonin  */
+
+static INLINE void t1_dec_refpass_step_mqc_vsc(
+               opj_t1_t *t1,
+               flag_t *flagsp,
+               int *datap,
+               int poshalf,
+               int neghalf,
+               int vsc)
+{
+       int 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) {
+               mqc_setcurctx(mqc, t1_getctxno_mag(flag));      /* ESSAI */
+               v = mqc_decode(mqc);
                t = v ? poshalf : neghalf;
                *datap += *datap < 0 ? -t : t;
                *flagsp |= T1_REFINE;
@@ -498,10 +689,9 @@ static void t1_enc_refpass(
        }
 }
 
-static void t1_dec_refpass(
+static void t1_dec_refpass_raw(
                opj_t1_t *t1,
                int bpno,
-               char type,
                int cblksty)
 {
        int i, j, k, one, poshalf, neghalf;
@@ -513,13 +703,78 @@ static void t1_dec_refpass(
                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;
-                               t1_dec_refpass_step(
+                               t1_dec_refpass_step_raw(
+                                               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 t1_dec_refpass_mqc(
+               opj_t1_t *t1,
+               int bpno)
+{
+       int i, j, k, one, poshalf, neghalf;
+       int *data1 = t1->data;
+       flag_t *flags1 = &t1->flags[1];
+       one = 1 << bpno;
+       poshalf = one >> 1;
+       neghalf = bpno > 0 ? -poshalf : -1;
+       for (k = 0; k < (t1->h & ~3); k += 4) {
+               for (i = 0; i < t1->w; ++i) {
+                       int *data2 = data1 + i;
+                       flag_t *flags2 = flags1 + i;
+                       flags2 += t1->flags_stride;
+                       t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+                       data2 += t1->w;
+                       flags2 += t1->flags_stride;
+                       t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+                       data2 += t1->w;
+                       flags2 += t1->flags_stride;
+                       t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+                       data2 += t1->w;
+                       flags2 += t1->flags_stride;
+                       t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+                       data2 += t1->w;
+               }
+               data1 += t1->w << 2;
+               flags1 += t1->flags_stride << 2;
+       }
+       for (i = 0; i < t1->w; ++i) {
+               int *data2 = data1 + i;
+               flag_t *flags2 = flags1 + i;
+               for (j = k; j < t1->h; ++j) {
+                       flags2 += t1->flags_stride;
+                       t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
+                       data2 += t1->w;
+               }
+       }
+}                              /* VSC and  BYPASS by Antonin */
+
+static void t1_dec_refpass_mqc_vsc(
+               opj_t1_t *t1,
+               int bpno)
+{
+       int i, j, k, one, poshalf, neghalf;
+       int 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;
+                               t1_dec_refpass_step_mqc_vsc(
                                                t1,
                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
                                                &t1->data[(j * t1->w) + i],
                                                poshalf,
                                                neghalf,
-                                               type,
                                                vsc);
                        }
                }
@@ -561,7 +816,51 @@ LABEL_PARTIAL:
        *flagsp &= ~T1_VISIT;
 }
 
+static void t1_dec_clnpass_step_partial(
+               opj_t1_t *t1,
+               flag_t *flagsp,
+               int *datap,
+               int orient,
+               int oneplushalf)
+{
+       int v, flag;
+       opj_mqc_t *mqc = t1->mqc;       /* MQC component */
+       
+       OPJ_ARG_NOT_USED(orient);
+       
+       flag = *flagsp;
+       mqc_setcurctx(mqc, t1_getctxno_sc(flag));
+       v = mqc_decode(mqc) ^ t1_getspb(flag);
+       *datap = v ? -oneplushalf : oneplushalf;
+       t1_updateflags(flagsp, v, t1->flags_stride);
+       *flagsp &= ~T1_VISIT;
+}                              /* VSC and  BYPASS by Antonin */
+
 static void t1_dec_clnpass_step(
+               opj_t1_t *t1,
+               flag_t *flagsp,
+               int *datap,
+               int orient,
+               int oneplushalf)
+{
+       int v, flag;
+       
+       opj_mqc_t *mqc = t1->mqc;       /* MQC component */
+       
+       flag = *flagsp;
+       if (!(flag & (T1_SIG | T1_VISIT))) {
+               mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
+               if (mqc_decode(mqc)) {
+                       mqc_setcurctx(mqc, t1_getctxno_sc(flag));
+                       v = mqc_decode(mqc) ^ t1_getspb(flag);
+                       *datap = v ? -oneplushalf : oneplushalf;
+                       t1_updateflags(flagsp, v, t1->flags_stride);
+               }
+       }
+       *flagsp &= ~T1_VISIT;
+}                              /* VSC and  BYPASS by Antonin */
+
+static void t1_dec_clnpass_step_vsc(
                opj_t1_t *t1,
                flag_t *flagsp,
                int *datap,
@@ -589,7 +888,7 @@ LABEL_PARTIAL:
                }
        }
        *flagsp &= ~T1_VISIT;
-}                              /* VSC and  BYPASS by Antonin */
+}
 
 static void t1_enc_clnpass(
                opj_t1_t *t1,
@@ -669,22 +968,16 @@ static void t1_dec_clnpass(
        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) {
-                               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) & (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 | T1_VISIT | T1_SIG_OTH));
-                               }
-                       } else {
                                agg = 0;
                        }
                        if (agg) {
@@ -699,8 +992,8 @@ static void t1_dec_clnpass(
                                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;
-                               t1_dec_clnpass_step(
+                                       vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
+                                       t1_dec_clnpass_step_vsc(
                                                t1,
                                                &t1->flags[((j+1) * t1->flags_stride) + i + 1],
                                                &t1->data[(j * t1->w) + i],
@@ -711,6 +1004,65 @@ static void t1_dec_clnpass(
                        }
                }
        }
+       } else {
+               int *data1 = t1->data;
+               flag_t *flags1 = &t1->flags[1];
+               for (k = 0; k < (t1->h & ~3); k += 4) {
+                       for (i = 0; i < t1->w; ++i) {
+                               int *data2 = data1 + i;
+                               flag_t *flags2 = flags1 + i;
+                               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 | T1_VISIT | T1_SIG_OTH));
+                               if (agg) {
+                                       mqc_setcurctx(mqc, T1_CTXNO_AGG);
+                                       if (!mqc_decode(mqc)) {
+                                               continue;
+                                       }
+                                       mqc_setcurctx(mqc, T1_CTXNO_UNI);
+                                       runlen = mqc_decode(mqc);
+                                       runlen = (runlen << 1) | mqc_decode(mqc);
+                                       flags2 += runlen * t1->flags_stride;
+                                       data2 += runlen * t1->w;
+                                       for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
+                                               flags2 += t1->flags_stride;
+                                               if (agg && (j == k + runlen)) {
+                                                       t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf);
+                                               } else {
+                                                       t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+                                               }
+                                               data2 += t1->w;
+                                       }
+                               } else {
+                                       flags2 += t1->flags_stride;
+                                       t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+                                       data2 += t1->w;
+                                       flags2 += t1->flags_stride;
+                                       t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+                                       data2 += t1->w;
+                                       flags2 += t1->flags_stride;
+                                       t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+                                       data2 += t1->w;
+                                       flags2 += t1->flags_stride;
+                                       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) {
+                       int *data2 = data1 + i;
+                       flag_t *flags2 = flags1 + i;
+                       for (j = k; j < t1->h; ++j) {
+                               flags2 += t1->flags_stride;
+                               t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
+                               data2 += t1->w;
+                       }
+               }
+       }
+
        if (segsym) {
                int v = 0;
                mqc_setcurctx(mqc, T1_CTXNO_UNI);
@@ -736,14 +1088,15 @@ static double t1_getwmsedec(
                int bpno,
                int qmfbid,
                double stepsize,
-               int numcomps)
+               int numcomps,
+               int mct)
 {
        double w1, w2, wmsedec;
        if (qmfbid == 1) {
-               w1 = (numcomps > 1) ? mct_getnorm(compno) : 1.0;
+               w1 = (mct && numcomps==3) ? mct_getnorm(compno) : 1.0;
                w2 = dwt_getnorm(level, orient);
        } else {                        /* if (qmfbid == 0) */
-               w1 = (numcomps > 1) ? mct_getnorm_real(compno) : 1.0;
+               w1 = (mct && numcomps==3) ? mct_getnorm_real(compno) : 1.0;
                w2 = dwt_getnorm_real(level, orient);
        }
        wmsedec = w1 * w2 * stepsize * (1 << bpno);
@@ -752,7 +1105,7 @@ static double t1_getwmsedec(
        return wmsedec;
 }
 
-static bool allocate_buffers(
+static opj_bool allocate_buffers(
                opj_t1_t *t1,
                int w,
                int h)
@@ -764,7 +1117,7 @@ static bool allocate_buffers(
                opj_aligned_free(t1->data);
                t1->data = (int*) opj_aligned_malloc(datasize * sizeof(int));
                if(!t1->data){
-                       return false;
+                       return OPJ_FALSE;
                }
                t1->datasize=datasize;
        }
@@ -777,7 +1130,7 @@ static bool allocate_buffers(
                opj_aligned_free(t1->flags);
                t1->flags = (flag_t*) opj_aligned_malloc(flagssize * sizeof(flag_t));
                if(!t1->flags){
-                       return false;
+                       return OPJ_FALSE;
                }
                t1->flagssize=flagssize;
        }
@@ -786,7 +1139,7 @@ static bool allocate_buffers(
        t1->w=w;
        t1->h=h;
 
-       return true;
+       return OPJ_TRUE;
 }
 
 /** mod fixed_quality */
@@ -800,6 +1153,7 @@ static void t1_encode_cblk(
                double stepsize,
                int cblksty,
                int numcomps,
+               int mct,
                opj_tcd_tile_t * tile)
 {
        double cumwmsedec = 0.0;
@@ -850,7 +1204,7 @@ static void t1_encode_cblk(
                }
                
                /* fixed_quality */
-               tempwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps);
+               tempwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize, numcomps, mct);
                cumwmsedec += tempwmsedec;
                tile->distotile += tempwmsedec;
                
@@ -971,10 +1325,26 @@ static void t1_decode_cblk(
                for (passno = 0; passno < seg->numpasses; ++passno) {
                        switch (passtype) {
                                case 0:
-                                       t1_dec_sigpass(t1, bpno+1, orient, type, cblksty);
+                                       if (type == T1_TYPE_RAW) {
+                                               t1_dec_sigpass_raw(t1, bpno+1, orient, cblksty);
+                                       } else {
+                                               if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+                                                       t1_dec_sigpass_mqc_vsc(t1, bpno+1, orient);
+                                               } else {
+                                                       t1_dec_sigpass_mqc(t1, bpno+1, orient);
+                                               }
+                                       }
                                        break;
                                case 1:
-                                       t1_dec_refpass(t1, bpno+1, type, cblksty);
+                                       if (type == T1_TYPE_RAW) {
+                                               t1_dec_refpass_raw(t1, bpno+1, cblksty);
+                                       } else {
+                                               if (cblksty & J2K_CCP_CBLKSTY_VSC) {
+                                                       t1_dec_refpass_mqc_vsc(t1, bpno+1);
+                                               } else {
+                                                       t1_dec_refpass_mqc(t1, bpno+1);
+                                               }
+                                       }
                                        break;
                                case 2:
                                        t1_dec_clnpass(t1, bpno+1, orient, cblksty);
@@ -1045,6 +1415,7 @@ void t1_encode_cblks(
 
                        for (bandno = 0; bandno < res->numbands; ++bandno) {
                                opj_tcd_band_t* restrict band = &res->bands[bandno];
+        int bandconst = 8192 * 8192 / ((int) floor(band->stepsize * 8192));
 
                                for (precno = 0; precno < res->pw * res->ph; ++precno) {
                                        opj_tcd_precinct_t *prc = &band->precincts[precno];
@@ -1095,7 +1466,7 @@ void t1_encode_cblks(
                                                                        datap[(j * cblk_w) + i] =
                                                                                fix_mul(
                                                                                tmp,
-                                                                               8192 * 8192 / ((int) floor(band->stepsize * 8192))) >> (11 - T1_NMSEDEC_FRACBITS);
+                                                                               bandconst) >> (11 - T1_NMSEDEC_FRACBITS);
                                                                }
                                                        }
                                                }
@@ -1110,6 +1481,7 @@ void t1_encode_cblks(
                                                                band->stepsize,
                                                                tccp->cblksty,
                                                                tile->numcomps,
+                                                               tcp->mct,
                                                                tile);
 
                                        } /* cblkno */
@@ -1140,7 +1512,6 @@ void t1_decode_cblks(
                                for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
                                        opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
                                        int* restrict datap;
-                                       void* restrict tiledp;
                                        int cblk_w, cblk_h;
                                        int x, y;
                                        int i, j;
@@ -1181,8 +1552,8 @@ void t1_decode_cblks(
                                                }
                                        }
 
-                                       tiledp=(void*)&tilec->data[(y * tile_w) + x];
                                        if (tccp->qmfbid == 1) {
+                                               int* restrict tiledp = &tilec->data[(y * tile_w) + x];
                                                for (j = 0; j < cblk_h; ++j) {
                                                        for (i = 0; i < cblk_w; ++i) {
                                                                int tmp = datap[(j * cblk_w) + i];
@@ -1190,11 +1561,16 @@ void t1_decode_cblks(
                                                        }
                                                }
                                        } else {                /* if (tccp->qmfbid == 0) */
+                                               float* restrict tiledp = (float*) &tilec->data[(y * tile_w) + x];
                                                for (j = 0; j < cblk_h; ++j) {
+                                                       float* restrict tiledp2 = tiledp;
                                                        for (i = 0; i < cblk_w; ++i) {
-                                                               float tmp = datap[(j * cblk_w) + i] * band->stepsize;
-                                                               ((float*)tiledp)[(j * tile_w) + i] = tmp;
+                                                               float tmp = *datap * band->stepsize;
+                                                               *tiledp2 = tmp;
+                                                               datap++;
+                                                               tiledp2++;
                                                        }
+                                                       tiledp += tile_w;
                                                }
                                        }
                                        opj_free(cblk->data);
index 0b4294e1d6b912ae71019e8a83037603b0c21fd4..572ec88d2f62d5378ddf7db3d437868c7c556411 100644 (file)
@@ -135,8 +135,8 @@ void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);
 /**
 Decode the code-blocks of a tile
 @param t1 T1 handle
-@param tile The tile to decode
-@param tcp Tile coding parameters
+@param tilec The tile to decode
+@param tccp Tile coding parameters
 */
 void t1_decode_cblks(opj_t1_t* t1, opj_tcd_tilecomp_t* tilec, opj_tccp_t* tccp);
 /* ----------------------------------------------------------------------- */
index be9b42a41327b2f85aeea820a83eb04225673e98..232a54373290efde0216abc1dea918d96f7f793f 100644 (file)
@@ -59,7 +59,8 @@ Encode a packet of a tile to a destination buffer
 */
 static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi, unsigned char *dest, int len, opj_codestream_info_t *cstr_info, int tileno);
 /**
-@param seg
+@param cblk
+@param index
 @param cblksty
 @param first
 */
@@ -72,6 +73,7 @@ Decode a packet of a tile from a source buffer
 @param tile Tile for which to write the packets
 @param tcp Tile coding parameters
 @param pi Packet identity
+@param pack_info Packet information
 @return 
 */
 static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_tile_t *tile, 
@@ -147,8 +149,8 @@ static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_itera
                c[1] = 145;
                c[2] = 0;
                c[3] = 4;
-               c[4] = (tile->packno % 65536) / 256;
-               c[5] = (tile->packno % 65536) % 256;
+               c[4] = (unsigned char)((tile->packno % 65536) / 256);
+               c[5] = (unsigned char)((tile->packno % 65536) % 256);
                c += 6;
        }
        /* </SOP> */
@@ -253,8 +255,8 @@ static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp, opj_pi_itera
        /* </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
+       /* 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 = (int)(c - dest);
@@ -401,8 +403,8 @@ static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_t
                }
 
                /* << 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
+               /* 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(pack_info) {
                        pack_info->end_ph_pos = (int)(c - src);
                }
@@ -494,14 +496,15 @@ static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_t
        if (tcp->csty & J2K_CP_CSTY_EPH) {
                if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {
                        opj_event_msg(t2->cinfo, EVT_ERROR, "Expected EPH marker\n");
+                       return -999;
                } else {
                        hd += 2;
                }
        }
 
        /* << 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
+       /* 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(pack_info) {
                pack_info->end_ph_pos = (int)(hd - src);
        }
@@ -565,7 +568,7 @@ static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len, opj_tcd_t
 
 #endif /* USE_JPWL */
                                
-                               cblk->data = (unsigned char*) opj_realloc(cblk->data, (cblk->len + seg->newlen) * sizeof(unsigned char*));
+                               cblk->data = (unsigned char*) opj_realloc(cblk->data, (cblk->len + seg->newlen) * sizeof(unsigned char));
                                memcpy(cblk->data + cblk->len, c, seg->newlen);
                                if (seg->numpasses == 0) {
                                        seg->data = &cblk->data;
@@ -614,6 +617,7 @@ int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlaye
                                int tpnum = compno;
                                if (pi_create_encode(pi, cp,tileno,poc,tpnum,tppos,t2_mode,cur_totnum_tp)) {
                                        opj_event_msg(t2->cinfo, EVT_ERROR, "Error initializing Packet Iterator\n");
+                                       pi_destroy(pi, cp, tileno);
                                        return -999;
                                }
                                while (pi_next(&pi[poc])) {
@@ -658,8 +662,8 @@ int t2_encode_packets(opj_t2_t* t2,int tileno, opj_tcd_tile_t *tile, int maxlaye
                                                        info_PK->start_pos = ((cp->tp_on | 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 + e - 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
+                                               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++;
@@ -710,7 +714,7 @@ int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj
                        } else {
                                e = 0;
                        }
-                       
+                       if(e == -999) return -999;
                        /* progression in resolution */
                        image->comps[pi[pino].compno].resno_decoded =   
                                (e > 0) ? 
@@ -724,8 +728,9 @@ int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj
                                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 if (info_TL->packet[cstr_info->packno-1].end_pos >= (int)cstr_info->tile[tileno].tp[curtp].tp_end_pos){ // New tile part
-                                       info_TL->tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; // Number of packets in previous tile-part
+                               } else if (info_TL->packet[cstr_info->packno-1].end_pos >= (int)cstr_info->tile[tileno].tp[curtp].tp_end_pos){ /* New tile part*/
+                                       info_TL->tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; /* Number of packets in previous tile-part*/
+          info_TL->tp[curtp].tp_start_pack = tp_start_packno;
                                        tp_start_packno = cstr_info->packno;
                                        curtp++;
                                        info_PK->start_pos = cstr_info->tile[tileno].tp[curtp].tp_end_header+1;
@@ -733,8 +738,8 @@ int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj
                                        info_PK->start_pos = (cp->tp_on && 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 + e - 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
+                               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 */
@@ -748,7 +753,8 @@ int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj
        }
        /* INDEX >> */
        if(cstr_info) {
-               cstr_info->tile[tileno].tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; // Number of packets in last tile-part
+               cstr_info->tile[tileno].tp[curtp].tp_numpacks = cstr_info->packno - tp_start_packno; /* Number of packets in last tile-part*/
+    cstr_info->tile[tileno].tp[curtp].tp_start_pack = tp_start_packno;
        }
        /* << INDEX */
 
index b15b752001936507bbfd0d0a007088cc0b492117..2151ba67f48c144f0d1429c02984b3078a0b25fe 100644 (file)
@@ -67,6 +67,7 @@ Encode the packets of a tile to a destination buffer
 @param cstr_info Codestream information structure 
 @param tpnum Tile part number of the current tile
 @param tppos The position of the tile part flag in the progression order
+@param pino 
 @param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass
 @param cur_totnum_tp The total number of tile parts in the current tile
 */
@@ -78,6 +79,7 @@ Decode the packets of a tile from a source buffer
 @param len length of the source buffer
 @param tileno number that identifies the tile for which to decode the packets
 @param tile tile for which to decode the packets
+@param cstr_info Codestream information structure
  */
 int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno, opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info);
 
index f4a54553e28a5747cc6be0fc3b4beed799ee235b..18cdbc786bca6318246f9c556c4b77f82b6a9fff 100644 (file)
@@ -33,7 +33,7 @@
 #include "opj_includes.h"
 
 void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img) {
-       int tileno, compno, resno, bandno, precno;//, cblkno;
+       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", 
@@ -290,6 +290,7 @@ void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int c
                                        for (i = 0; i < res->pw * res->ph * 3; i++) {
                                                band->precincts[i].imsbtree = NULL;
                                                band->precincts[i].incltree = NULL;
+                                               band->precincts[i].cblks.enc = NULL;
                                        }
                                        
                                        for (precno = 0; precno < res->pw * res->ph; precno++) {
@@ -418,12 +419,19 @@ void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int cur
                /* Modification of the RATE >> */
                for (j = 0; j < tcp->numlayers; j++) {
                        tcp->rates[j] = tcp->rates[j] ? 
-                                               ((float) (tile->numcomps 
-                                                               * (tile->x1 - tile->x0) 
-                                                               * (tile->y1 - tile->y0) 
-                                                               * image->comps[0].prec))/ 
-                                               (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy) 
-                                               : 0;
+                               cp->tp_on ? 
+                                       (((float) (tile->numcomps 
+                                       * (tile->x1 - tile->x0) 
+                                       * (tile->y1 - tile->y0)
+                                       * image->comps[0].prec))
+                                       /(tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((tcd->cur_totnum_tp - 1) * 14 )/ tcp->numlayers)
+                                       :
+                               ((float) (tile->numcomps 
+                                       * (tile->x1 - tile->x0) 
+                                       * (tile->y1 - tile->y0) 
+                                       * image->comps[0].prec))/ 
+                                       (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)
+                                       : 0;
 
                        if (tcp->rates[j]) {
                                if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) {
@@ -584,7 +592,9 @@ void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp, int cur
                                                        cblk->y0 = int_max(cblkystart, prc->y0);
                                                        cblk->x1 = int_min(cblkxend, prc->x1);
                                                        cblk->y1 = int_min(cblkyend, prc->y1);
-                                                       cblk->data = (unsigned char*) opj_calloc(8192, sizeof(unsigned char));
+                                                       cblk->data = (unsigned char*) opj_calloc(8192+2, sizeof(unsigned char));
+                                                       /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */
+                                                       cblk->data += 2;
                                                        cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t));
                                                        cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t));
                                                }
@@ -647,7 +657,7 @@ void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp) {
                        tilec->y1 = int_ceildiv(tile->y1, image->comps[i].dy);
 
                        x0 = j == 0 ? tilec->x0 : int_min(x0, (unsigned int) tilec->x0);
-                       y0 = j == 0 ? tilec->y0 : int_min(y0,   (unsigned int) tilec->x0);
+                       y0 = j == 0 ? tilec->y0 : int_min(y0,   (unsigned int) tilec->y0);
                        x1 = j == 0 ? tilec->x1 : int_max(x1,   (unsigned int) tilec->x1);
                        y1 = j == 0 ? tilec->y1 : int_max(y1,   (unsigned int) tilec->y1);
                }
@@ -667,6 +677,8 @@ void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp,
        opj_tcp_t *tcp;
        opj_tcd_tile_t *tile;
 
+       OPJ_ARG_NOT_USED(cstr_info);
+
        tcd->cp = cp;
        
        tcp = &(cp->tcps[cp->tileno[tileno]]);
@@ -988,7 +1000,7 @@ void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final) {
        }
 }
 
-bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) {
+opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) {
        int compno, resno, bandno, precno, cblkno, passno, layno;
        double min, max;
        double cumdisto[100];   /* fixed_quality */
@@ -1085,7 +1097,7 @@ bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestre
                        opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->image, cp);
                        double thresh = 0;
 
-                       for (i = 0; i < 32; i++) {
+                       for (i = 0; i < 128; i++) {
                                int l = 0;
                                double distoachieved = 0;       /* fixed_quality */
                                thresh = (lo + hi) / 2;
@@ -1140,7 +1152,7 @@ bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestre
                }
                
                if (!success) {
-                       return false;
+                       return OPJ_FALSE;
                }
                
                if(cstr_info) { /* Threshold for Marcela Index */
@@ -1152,7 +1164,7 @@ bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestre
                cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]); 
        }
 
-       return true;
+       return OPJ_TRUE;
 }
 
 int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, opj_codestream_info_t *cstr_info) {
@@ -1304,7 +1316,7 @@ int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len, op
        return l;
 }
 
-bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info) {
+opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info) {
        int l;
        int compno;
        int eof = 0;
@@ -1340,7 +1352,7 @@ bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, op
                                }
                                else {
                                        cstr_info->tile[tileno].pdx[resno] = 15;
-                                       cstr_info->tile[tileno].pdx[resno] = 15;
+                                       cstr_info->tile[tileno].pdy[resno] = 15;
                                }
                        }
                }
@@ -1387,7 +1399,7 @@ bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, op
                        if (tcd->image->comps[compno].resno_decoded < 0) {                              
                                opj_event_msg(tcd->cinfo, EVT_ERROR, "Error decoding tile. The number of resolutions to remove [%d+1] is higher than the number "
                                        " of resolutions in the original codestream [%d]\nModify the cp_reduce parameter.\n", tcd->cp->reduce, tile->comps[compno].numresolutions);
-                               return false;
+                               return OPJ_FALSE;
                        }
                }
 
@@ -1407,18 +1419,23 @@ bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, op
 
        if (tcd->tcp->mct) {
                int n = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0);
-               if (tcd->tcp->tccps[0].qmfbid == 1) {
-                       mct_decode(
-                                       tile->comps[0].data,
-                                       tile->comps[1].data,
-                                       tile->comps[2].data, 
-                                       n);
-               } else {
-                       mct_decode_real(
-                                       (float*)tile->comps[0].data,
-                                       (float*)tile->comps[1].data,
-                                       (float*)tile->comps[2].data, 
-                                       n);
+
+               if (tile->numcomps >= 3 ){
+                       if (tcd->tcp->tccps[0].qmfbid == 1) {
+                               mct_decode(
+                                               tile->comps[0].data,
+                                               tile->comps[1].data,
+                                               tile->comps[2].data,
+                                               n);
+                       } else {
+                               mct_decode_real(
+                                               (float*)tile->comps[0].data,
+                                               (float*)tile->comps[1].data,
+                                               (float*)tile->comps[2].data,
+                                               n);
+                       }
+               } else{
+                       opj_event_msg(tcd->cinfo, EVT_WARNING,"Number of components (%d) is inconsistent with a MCT. Skip the MCT step.\n",tile->numcomps);
                }
        }
 
@@ -1467,10 +1484,10 @@ bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, op
        opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time);
 
        if (eof) {
-               return false;
+               return OPJ_FALSE;
        }
        
-       return true;
+       return OPJ_TRUE;
 }
 
 void tcd_free_decode(opj_tcd_t *tcd) {
@@ -1504,3 +1521,4 @@ void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno) {
 }
 
 
+
index f0ac5619f1e4c2966d9108b86f9c8b05f7dce3be..e3f93adc37f4e6c0570816eead7d1e907e0f6f00 100644 (file)
@@ -251,7 +251,7 @@ void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp,
 void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final);
 void tcd_rateallocate_fixed(opj_tcd_t *tcd);
 void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final);
-bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info);
+opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len, opj_codestream_info_t *cstr_info);
 /**
 Encode a tile from the raw image into a buffer
 @param tcd TCD handle
@@ -268,8 +268,9 @@ Decode a tile from a buffer into a raw image
 @param src Source buffer
 @param len Length of source buffer
 @param tileno Number that identifies one of the tiles to be decoded
+@param cstr_info Codestream information structure
 */
-bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info);
+opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno, opj_codestream_info_t *cstr_info);
 /**
 Free the memory allocated for decoding
 @param tcd TCD handle
diff --git a/extern/libopenjpeg/thix_manager.c b/extern/libopenjpeg/thix_manager.c
new file mode 100644 (file)
index 0000000..aa55f21
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * $Id: thix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * 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.
+ */
+
+/*! \file
+ *  \brief Modification of jpip.c from 2KAN indexer
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "opj_includes.h"
+
+/* 
+ * Write tile-part headers mhix box
+ *
+ * @param[in] coff      offset of j2k codestream
+ * @param[in] cstr_info codestream information
+ * @param[in] tileno    tile number
+ * @param[in] cio       file output handle
+ * @return              length of mhix box
+ */
+int write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_cio_t *cio);
+
+int write_thix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio)
+{
+  int len, lenp, i;
+  int tileno;
+  opj_jp2_box_t *box;
+
+  lenp = 0;
+  box = (opj_jp2_box_t *)opj_calloc( cstr_info.tw*cstr_info.th, sizeof(opj_jp2_box_t));
+
+  for ( i = 0; i < 2 ; i++ ){
+    if (i)
+      cio_seek( cio, lenp);
+
+    lenp = cio_tell( cio);
+    cio_skip( cio, 4);              /* L [at the end] */
+    cio_write( cio, JPIP_THIX, 4);  /* THIX           */
+    write_manf( i, cstr_info.tw*cstr_info.th, box, cio);
+    
+    for (tileno = 0; tileno < cstr_info.tw*cstr_info.th; tileno++){
+      box[tileno].length = write_tilemhix( coff, cstr_info, tileno, cio);
+      box[tileno].type = JPIP_MHIX;
+    }
+    len = cio_tell( cio)-lenp;
+    cio_seek( cio, lenp);
+    cio_write( cio, len, 4);        /* L              */
+    cio_seek( cio, lenp+len);
+  }
+
+  opj_free(box);
+
+  return len;
+}
+
+int write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_cio_t *cio)
+{
+  int i;
+  opj_tile_info_t tile;
+  opj_tp_info_t tp;
+  int len, lenp;
+  opj_marker_info_t *marker;
+
+  lenp = cio_tell( cio);
+  cio_skip( cio, 4);                               /* L [at the end]                    */
+  cio_write( cio, JPIP_MHIX, 4);                   /* MHIX                              */
+
+  tile = cstr_info.tile[tileno];
+  tp = tile.tp[0];
+
+  cio_write( cio, tp.tp_end_header-tp.tp_start_pos+1, 8);  /* TLEN                              */ 
+
+  marker = cstr_info.tile[tileno].marker;
+
+  for( i=0; i<cstr_info.tile[tileno].marknum; i++){             /* Marker restricted to 1 apparition */
+    cio_write( cio, marker[i].type, 2);
+    cio_write( cio, 0, 2);
+    cio_write( cio, marker[i].pos-coff, 8);
+    cio_write( cio, marker[i].len, 2);
+  }
+     
+  /*  free( marker);*/
+
+  len = cio_tell( cio) - lenp;
+  cio_seek( cio, lenp);
+  cio_write( cio, len, 4);        /* L           */
+  cio_seek( cio, lenp+len);
+
+  return len;
+}
diff --git a/extern/libopenjpeg/tpix_manager.c b/extern/libopenjpeg/tpix_manager.c
new file mode 100644 (file)
index 0000000..9ba9e7f
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * $Id: tpix_manager.c 897 2011-08-28 21:43:57Z Kaori.Hagihara@gmail.com $
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * 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.
+ */
+
+/*! \file
+ *  \brief Modification of jpip.c from 2KAN indexer
+ */
+
+#include <math.h>
+#include "opj_includes.h"
+
+#define MAX(a,b) ((a)>(b)?(a):(b))
+
+
+/* 
+ * Write faix box of tpix
+ *
+ * @param[in] coff offset of j2k codestream
+ * @param[in] compno    component number
+ * @param[in] cstr_info codestream information
+ * @param[in] j2klen    length of j2k codestream
+ * @param[in] cio       file output handle
+ * @return              length of faix box
+ */
+int write_tpixfaix( int coff, int compno, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio);
+
+
+int write_tpix( int coff, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio)
+{
+  int len, lenp;
+  lenp = cio_tell( cio);
+  cio_skip( cio, 4);              /* L [at the end] */
+  cio_write( cio, JPIP_TPIX, 4);  /* TPIX           */
+  
+  write_tpixfaix( coff, 0, cstr_info, j2klen, cio);
+
+  len = cio_tell( cio)-lenp;
+  cio_seek( cio, lenp);
+  cio_write( cio, len, 4);        /* L              */
+  cio_seek( cio, lenp+len);
+
+  return len;
+}
+
+
+/* 
+ * Get number of maximum tile parts per tile
+ *
+ * @param[in] cstr_info codestream information
+ * @return              number of maximum tile parts per tile
+ */
+int get_num_max_tile_parts( opj_codestream_info_t cstr_info);
+
+int write_tpixfaix( int coff, int compno, opj_codestream_info_t cstr_info, int j2klen, opj_cio_t *cio)
+{
+  int len, lenp;
+  int i, j;
+  int Aux;
+  int num_max_tile_parts;
+  int size_of_coding; /* 4 or 8 */
+  opj_tp_info_t tp;
+  int version;
+
+  num_max_tile_parts = get_num_max_tile_parts( cstr_info);
+
+  if( j2klen > pow( 2, 32)){
+    size_of_coding =  8;
+    version = num_max_tile_parts == 1 ? 1:3;
+  }
+  else{
+    size_of_coding = 4;
+    version = num_max_tile_parts == 1 ? 0:2;
+  }
+
+  lenp = cio_tell( cio);
+  cio_skip( cio, 4);              /* L [at the end]      */
+  cio_write( cio, JPIP_FAIX, 4);  /* FAIX                */ 
+  cio_write( cio, version, 1);     /* Version 0 = 4 bytes */
+
+  cio_write( cio, num_max_tile_parts, size_of_coding);                      /* NMAX           */
+  cio_write( cio, cstr_info.tw*cstr_info.th, size_of_coding);                               /* M              */
+  for (i = 0; i < cstr_info.tw*cstr_info.th; i++){
+    for (j = 0; j < cstr_info.tile[i].num_tps; j++){
+      tp = cstr_info.tile[i].tp[j];
+      cio_write( cio, tp.tp_start_pos-coff, size_of_coding); /* start position */
+      cio_write( cio, tp.tp_end_pos-tp.tp_start_pos+1, size_of_coding);    /* length         */
+      if (version & 0x02){
+       if( cstr_info.tile[i].num_tps == 1 && cstr_info.numdecompos[compno] > 1)
+         Aux = cstr_info.numdecompos[compno] + 1;
+       else
+         Aux = j + 1;
+                 
+       cio_write( cio, Aux,4);
+       /*cio_write(img.tile[i].tile_parts[j].num_reso_AUX,4);*/ /* Aux_i,j : Auxiliary value */
+       /* fprintf(stderr,"AUX value %d\n",Aux);*/
+      }
+      /*cio_write(0,4);*/
+    }
+    /* PADDING */
+    while (j < num_max_tile_parts){
+      cio_write( cio, 0, size_of_coding); /* start position            */
+      cio_write( cio, 0, size_of_coding); /* length                    */
+      if (version & 0x02)
+       cio_write( cio, 0,4);                  /* Aux_i,j : Auxiliary value */
+      j++;
+    }
+  }
+  
+  len = cio_tell( cio)-lenp;
+  cio_seek( cio, lenp);
+  cio_write( cio, len, 4);        /* L  */
+  cio_seek( cio, lenp+len);
+
+  return len;
+
+}
+
+int get_num_max_tile_parts( opj_codestream_info_t cstr_info)
+{
+  int num_max_tp = 0, i;
+
+  for( i=0; i<cstr_info.tw*cstr_info.th; i++)
+    num_max_tp = MAX( cstr_info.tile[i].num_tps, num_max_tp);
+  
+  return num_max_tp;
+}