[trunk] Fix Java binding compilation. Need to link against openmj2 for now to resolve...
authorMathieu Malaterre <mathieu.malaterre@gmail.com>
Mon, 15 Oct 2012 09:43:28 +0000 (09:43 +0000)
committerMathieu Malaterre <mathieu.malaterre@gmail.com>
Mon, 15 Oct 2012 09:43:28 +0000 (09:43 +0000)
Add a local indec.c (pulled from opj 1.5 branch)

wrapping/java/openjp2/CMakeLists.txt
wrapping/java/openjp2/JavaOpenJPEG.c
wrapping/java/openjp2/JavaOpenJPEGDecoder.c
wrapping/java/openjp2/index.c [new file with mode: 0644]
wrapping/java/openjp2/index.h [new file with mode: 0644]

index 8f53cb766b93faaf078f2584a144a84ec2cb0e4b..e4d3a4076cf8a1456bf9d6683bfe50fab07de516 100644 (file)
@@ -4,6 +4,9 @@
 set(openjpegjni_SRCS
   JavaOpenJPEGDecoder.c
   JavaOpenJPEG.c
+  ${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_getopt.c
+  ${OPENJPEG_SOURCE_DIR}/src/bin/jp2/convert.c
+  index.c
   )
 
 # JNI binding:
@@ -13,7 +16,6 @@ include_directories(${JNI_INCLUDE_DIRS})
 # required header file:
 include_directories(
   ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h
-  #${OPENJPEG_SOURCE_DIR}/src/lib/openjp2
   ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2
   ${OPENJPEG_SOURCE_DIR}/src/bin/common
   ${OPENJPEG_SOURCE_DIR}/src/bin/jp2
@@ -22,6 +24,16 @@ include_directories(
 add_library(openjpegjni MODULE
   ${openjpegjni_SRCS}
   )
+# FIXME (need to use old API):
+if(BUILD_MJ2)
+  target_link_libraries(openjpegjni openmj2)
+endif()
+target_link_libraries(openjpegjni
+  ${PNG_LIBNAME} ${TIFF_LIBNAME} ${LCMS_LIBNAME} ${Z_LIBNAME}
+)
+if(UNIX)
+  target_link_libraries(openjpegjni m)
+endif()
 
 # build jar:
 find_package(Java 1.5 REQUIRED) # javac, jar
index 2987015e51af87176f171097570826e7304cf7c8..78a167791476f7f17c70e2819d158914a1851d1a 100644 (file)
@@ -37,6 +37,7 @@
 #include <math.h>\r
 \r
 #include "openjpeg.h"\r
+#include "opj_includes.h"\r
 #include "opj_getopt.h"\r
 #include "convert.h"\r
 #include "index.h"\r
@@ -349,18 +350,6 @@ OPJ_PROG_ORDER give_progression(char progression[4]) {
        return PROG_UNKNOWN;\r
 }\r
 \r
-\r
-/** <summary>\r
-    Get logarithm of an integer and round downwards.\r
-    </summary> */\r
-int int_floorlog2(int a) {\r
-    int l;\r
-    for (l=0; a>1; l++) {\r
-        a>>=1;\r
-    }\r
-    return l;\r
-}\r
-\r
 static int initialise_4K_poc(opj_poc_t *POC, int numres){\r
        POC[0].tile  = 1; \r
        POC[0].resno0  = 0; \r
@@ -627,7 +616,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                parameters->tcp_numlayers = numlayers;\r
                                numresolution = parameters->numresolution;\r
                                matrix_width = numresolution * 3;\r
-                               parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int));\r
+                               parameters->cp_matrice = (int *) opj_malloc(numlayers * matrix_width * sizeof(int));\r
                                s = s + 2;\r
 \r
                                for (i = 0; i < numlayers; i++) {\r
@@ -855,7 +844,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 \r
                        case 'C':                       /* add a comment */\r
                        {\r
-                               parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1);\r
+                               parameters->cp_comment = (char*)opj_malloc(strlen(opj_optarg) + 1);\r
                                if(parameters->cp_comment) {\r
                                        strcpy(parameters->cp_comment, opj_optarg);\r
                                }\r
@@ -884,7 +873,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                        \r
                        case 'z':                       /* Image Directory path */\r
                        {\r
-                               img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1);\r
+                               img_fol->imgdirpath = (char*)opj_malloc(strlen(opj_optarg) + 1);\r
                                strcpy(img_fol->imgdirpath,opj_optarg);\r
                                img_fol->set_imgdir=1;\r
                        }\r
@@ -1344,7 +1333,7 @@ char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int* buffer
        prec_max = 0;\r
        for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {\r
                for (resno = 0; resno < cstr_info->numdecompos[0] + 1; resno++) {\r
-                       prec_max = max(prec_max,cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]);\r
+                       prec_max = int_max(prec_max,cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno]);\r
                }\r
        }\r
 \r
@@ -1358,7 +1347,7 @@ char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int* buffer
                + cstr_info->tw*cstr_info->th * cstr_info->numlayers * (cstr_info->numdecompos[0] + 1) * cstr_info->numcomps * prec_max *8\r
                  ) * sizeof(int);\r
        /*printf("C: index buffer size = %d bytes\n", *buffer_size);*/\r
-       buffer = (char*) malloc(*buffer_size);\r
+       buffer = (char*) opj_malloc(*buffer_size);\r
 \r
        if (!buffer) {\r
                /*opj_event_msg(j2k->cinfo, EVT_ERROR, "failed to allocate index buffer for writing %d int\n", *buffer_size);*/\r
@@ -1812,7 +1801,7 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
 \r
        arraySize = (*env)->GetArrayLength(env, javaParameters);\r
        argc = (int) arraySize +1;\r
-       argv = malloc(argc*sizeof(char*));\r
+       argv = opj_malloc(argc*sizeof(char*));\r
        argv[0] = "ProgramName.exe";    /* The program name: useless*/\r
        j=0;\r
        for (i=1; i<argc; i++) {\r
@@ -1867,10 +1856,10 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
                const char *version = opj_version();\r
 /* UniPG>> */\r
 #ifdef USE_JPWL\r
-               parameters.cp_comment = (char*)malloc(clen+strlen(version)+11);\r
+               parameters.cp_comment = (char*)opj_malloc(clen+strlen(version)+11);\r
                sprintf(parameters.cp_comment,"%s%s with JPWL", comment, version);\r
 #else\r
-               parameters.cp_comment = (char*)malloc(clen+strlen(version)+1);\r
+               parameters.cp_comment = (char*)opj_malloc(clen+strlen(version)+1);\r
                sprintf(parameters.cp_comment,"%s%s", comment, version);\r
 #endif\r
 /* <<UniPG */\r
@@ -1944,7 +1933,7 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
                memcpy(jbBody, compressed_index, compressed_index_size);\r
                (*env)->ReleasePrimitiveArrayCritical(env, jba, jbBody, 0);\r
                (*env)->SetObjectField(env, obj, fid, jba); \r
-               free(compressed_index);\r
+               opj_free(compressed_index);\r
 \r
                /* write the generated codestream to disk ? */\r
                if (parameters.outfile[0]!='\0') {\r
@@ -1977,8 +1966,8 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag
        }\r
 \r
        /* free user parameters structure */\r
-  if(parameters.cp_comment) free(parameters.cp_comment);\r
-       if(parameters.cp_matrice) free(parameters.cp_matrice);\r
+  if(parameters.cp_comment) opj_free(parameters.cp_comment);\r
+       if(parameters.cp_matrice) opj_free(parameters.cp_matrice);\r
 \r
        return codestream_length;\r
 }\r
index c60f154d24afe2add3de289ef0e02357c3a23788..321b592f7cbfd1022add32076f1ff5ec95a9fbff 100644 (file)
@@ -37,6 +37,7 @@
 #include <math.h>\r
 \r
 #include "openjpeg.h"\r
+#include "opj_includes.h"\r
 #include "opj_getopt.h"\r
 #include "convert.h"\r
 #include "dirent.h"\r
@@ -338,7 +339,7 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,i
 \r
                        case 'y':                       /* Image Directory path */\r
                                {\r
-                                       img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1);\r
+                                       img_fol->imgdirpath = (char*)opj_malloc(strlen(opj_optarg) + 1);\r
                                        strcpy(img_fol->imgdirpath,opj_optarg);\r
                                        img_fol->set_imgdir=1;\r
                                }\r
@@ -542,7 +543,7 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
        /* Get the String[] containing the parameters, and converts it into a char** to simulate command line arguments.*/\r
        arraySize = (*env)->GetArrayLength(env, javaParameters);\r
        argc = (int) arraySize +1;\r
-       argv = malloc(argc*sizeof(char*));\r
+       argv = opj_malloc(argc*sizeof(char*));\r
        argv[0] = "ProgramName.exe";    /* The program name: useless*/\r
        j=0;\r
        for (i=1; i<argc; i++) {\r
@@ -596,7 +597,7 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
                        fseek(fsrc, 0, SEEK_END);\r
                        file_length = ftell(fsrc);\r
                        fseek(fsrc, 0, SEEK_SET);\r
-                       src = (unsigned char *) malloc(file_length);\r
+                       src = (unsigned char *) opj_malloc(file_length);\r
                        fread(src, 1, file_length, fsrc);\r
                        fclose(fsrc);\r
                        /*printf("C: %d bytes read from file\n",file_length);*/\r
@@ -712,7 +713,7 @@ JNIEXPORT jint JNICALL Java_org_openJpeg_OpenJPEGJavaDecoder_internalDecodeJ2Kto
 \r
                /* free the memory containing the code-stream */\r
                if (parameters.infile && parameters.infile[0]!='\0') {\r
-                       free(src);\r
+                       opj_free(src);\r
                } else {\r
                        (*env)->ReleaseByteArrayElements(env, jba, jbBody, 0);\r
                }\r
diff --git a/wrapping/java/openjp2/index.c b/wrapping/java/openjp2/index.c
new file mode 100644 (file)
index 0000000..22389c7
--- /dev/null
@@ -0,0 +1,391 @@
+/*
+ * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2007, Professor Benoit Macq
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux 
+ * 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 <math.h>
+#include <string.h>
+#include "openjpeg.h"
+#include "index.h"
+
+/* ------------------------------------------------------------------------------------ */
+
+/**
+Write a structured index to a file
+@param cstr_info Codestream information 
+@param index Index filename
+@return Returns 0 if successful, returns 1 otherwise
+*/
+int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
+       int tileno, compno, layno, resno, precno, pack_nb, x, y;
+       FILE *stream = NULL;
+       double total_disto = 0;
+/* UniPG>> */
+       int tilepartno;
+       char disto_on, numpix_on;
+
+#ifdef USE_JPWL
+       if (!strcmp(index, JPWL_PRIVATEINDEX_NAME))
+               return 0;
+#endif /* USE_JPWL */
+/* <<UniPG */
+
+       if (!cstr_info)         
+               return 1;
+
+       stream = fopen(index, "w");
+       if (!stream) {
+               fprintf(stderr, "failed to open index file [%s] for writing\n", index);
+               return 1;
+       }
+       
+       if (cstr_info->tile[0].distotile)
+               disto_on = 1;
+       else 
+               disto_on = 0;
+
+       if (cstr_info->tile[0].numpix)
+               numpix_on = 1;
+       else 
+               numpix_on = 0;
+
+       fprintf(stream, "%d %d\n", cstr_info->image_w, cstr_info->image_h);
+       fprintf(stream, "%d\n", cstr_info->prog);
+       fprintf(stream, "%d %d\n", cstr_info->tile_x, cstr_info->tile_y);
+       fprintf(stream, "%d %d\n", cstr_info->tw, cstr_info->th);
+       fprintf(stream, "%d\n", cstr_info->numcomps);
+       fprintf(stream, "%d\n", cstr_info->numlayers);
+       fprintf(stream, "%d\n", cstr_info->numdecompos[0]); /* based on component 0 */
+
+       for (resno = cstr_info->numdecompos[0]; resno >= 0; resno--) {
+               fprintf(stream, "[%d,%d] ", 
+                       (1 << cstr_info->tile[0].pdx[resno]), (1 << cstr_info->tile[0].pdx[resno]));    /* based on tile 0 and component 0 */
+       }
+
+       fprintf(stream, "\n");
+/* UniPG>> */
+       fprintf(stream, "%d\n", cstr_info->main_head_start);
+/* <<UniPG */
+       fprintf(stream, "%d\n", cstr_info->main_head_end);
+       fprintf(stream, "%d\n", cstr_info->codestream_size);
+       
+       fprintf(stream, "\nINFO ON TILES\n");
+       fprintf(stream, "tileno start_pos  end_hd  end_tile   nbparts");
+       if (disto_on)
+               fprintf(stream,"         disto");
+       if (numpix_on)
+               fprintf(stream,"     nbpix");
+       if (disto_on && numpix_on)
+               fprintf(stream,"  disto/nbpix");
+       fprintf(stream, "\n");
+
+       for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
+               fprintf(stream, "%4d %9d %9d %9d %9d", 
+                       cstr_info->tile[tileno].tileno,
+                       cstr_info->tile[tileno].start_pos,
+                       cstr_info->tile[tileno].end_header,
+                       cstr_info->tile[tileno].end_pos,
+                       cstr_info->tile[tileno].num_tps);
+               if (disto_on)
+                       fprintf(stream," %9e", cstr_info->tile[tileno].distotile);
+               if (numpix_on)
+                       fprintf(stream," %9d", cstr_info->tile[tileno].numpix);
+               if (disto_on && numpix_on)
+                       fprintf(stream," %9e", cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].numpix);
+               fprintf(stream, "\n");
+       }
+               
+       for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
+               int start_pos, end_ph_pos, end_pos;
+               double disto = 0;
+               int max_numdecompos = 0;
+               pack_nb = 0;
+
+               for (compno = 0; compno < cstr_info->numcomps; compno++) {
+                       if (max_numdecompos < cstr_info->numdecompos[compno])
+                               max_numdecompos = cstr_info->numdecompos[compno];
+               }       
+
+               fprintf(stream, "\nTILE %d DETAILS\n", tileno); 
+               fprintf(stream, "part_nb tileno  start_pack num_packs  start_pos end_tph_pos   end_pos\n");
+               for (tilepartno = 0; tilepartno < cstr_info->tile[tileno].num_tps; tilepartno++)
+                       fprintf(stream, "%4d %9d   %9d %9d  %9d %11d %9d\n",
+                               tilepartno, tileno,
+                               cstr_info->tile[tileno].tp[tilepartno].tp_start_pack,
+                               cstr_info->tile[tileno].tp[tilepartno].tp_numpacks,
+                               cstr_info->tile[tileno].tp[tilepartno].tp_start_pos,
+                               cstr_info->tile[tileno].tp[tilepartno].tp_end_header,
+                               cstr_info->tile[tileno].tp[tilepartno].tp_end_pos
+                               );
+
+               if (cstr_info->prog == LRCP) {  /* LRCP */
+                       fprintf(stream, "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos");
+                       if (disto_on)
+                               fprintf(stream, " disto");
+                       fprintf(stream,"\n");
+
+                       for (layno = 0; layno < cstr_info->numlayers; layno++) {
+                               for (resno = 0; resno < max_numdecompos + 1; resno++) {
+                                       for (compno = 0; compno < cstr_info->numcomps; compno++) {
+                                               int prec_max;
+                                               if (resno > cstr_info->numdecompos[compno])
+                                                       break;
+                                               prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                                               for (precno = 0; precno < prec_max; precno++) {
+                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
+                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
+                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;
+                                                       fprintf(stream, "%4d %6d %7d %5d %6d  %6d    %6d     %6d %7d",
+                                                               pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos);
+                                                       if (disto_on)
+                                                               fprintf(stream, " %8e", disto);
+                                                       fprintf(stream, "\n");
+                                                       total_disto += disto;
+                                                       pack_nb++;
+                                               }
+                                       }
+                               }
+                       }
+               } /* LRCP */
+
+               else if (cstr_info->prog == RLCP) {     /* RLCP */                      
+                       fprintf(stream, "RLCP\npack_nb tileno resno layno compno precno start_pos end_ph_pos end_pos\n");
+                       if (disto_on)
+                               fprintf(stream, " disto");
+                       fprintf(stream,"\n");
+
+                       for (resno = 0; resno < max_numdecompos + 1; resno++) {
+                               for (layno = 0; layno < cstr_info->numlayers; layno++) {
+                                       for (compno = 0; compno < cstr_info->numcomps; compno++) {
+                                               int prec_max; 
+                                               if (resno > cstr_info->numdecompos[compno])
+                                                       break;
+                                               prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                                               for (precno = 0; precno < prec_max; precno++) {
+                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
+                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
+                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;
+                                                       fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d   %9d %7d",
+                                                               pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos);
+                                                       if (disto_on)
+                                                               fprintf(stream, " %8e", disto);
+                                                       fprintf(stream, "\n");
+                                                       total_disto += disto;
+                                                       pack_nb++;
+                                               }
+                                       }
+                               }
+                       }
+               } /* RLCP */
+
+               else if (cstr_info->prog == RPCL) {     /* RPCL */
+
+                       fprintf(stream, "RPCL\npack_nb tileno resno precno compno layno start_pos end_ph_pos end_pos"); 
+                       if (disto_on)
+                               fprintf(stream, " disto");
+                       fprintf(stream,"\n");
+
+                       for (resno = 0; resno < max_numdecompos + 1; resno++) {
+                               int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                               for (precno = 0; precno < numprec; precno++) {                                                          
+                                       /* I suppose components have same XRsiz, YRsiz */
+                                       int x0 = cstr_info->tile_Ox + tileno - (int)floor((float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;
+                                       int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;
+                                       int x1 = x0 + cstr_info->tile_x;
+                                       int y1 = y0 + cstr_info->tile_y;
+                                       for (compno = 0; compno < cstr_info->numcomps; compno++) {                                      
+                                               int pcnx = cstr_info->tile[tileno].pw[resno];
+                                               int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );
+                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );
+                                               int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
+                                               int precno_y = (int) floor( (float)precno/(float)pcnx );
+                                               if (resno > cstr_info->numdecompos[compno])
+                                                       break;
+                                               for(y = y0; y < y1; y++) {                                                      
+                                                       if (precno_y*pcy == y ) {
+                                                               for (x = x0; x < x1; x++) {                                                                     
+                                                                       if (precno_x*pcx == x ) {
+                                                                               for (layno = 0; layno < cstr_info->numlayers; layno++) {
+                                                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
+                                                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
+                                                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;
+                                                                                       fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d   %9d %7d",
+                                                                                               pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos); 
+                                                                                       if (disto_on)
+                                                                                               fprintf(stream, " %8e", disto);
+                                                                                       fprintf(stream, "\n");
+                                                                                       total_disto += disto;
+                                                                                       pack_nb++; 
+                                                                               }
+                                                                       }
+                                                               }/* x = x0..x1 */
+                                                       } 
+                                               }  /* y = y0..y1 */
+                                       } /* precno */
+                               } /* compno */
+                       } /* resno */
+               } /* RPCL */
+
+               else if (cstr_info->prog == PCRL) {     /* PCRL */
+                       /* I suppose components have same XRsiz, YRsiz */
+                       int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;
+                       int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;
+                       int x1 = x0 + cstr_info->tile_x;
+                       int y1 = y0 + cstr_info->tile_y;
+
+                       /* Count the maximum number of precincts */
+                       int max_numprec = 0;
+                       for (resno = 0; resno < max_numdecompos + 1; resno++) {
+                               int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                               if (numprec > max_numprec)
+                                       max_numprec = numprec;
+                       }
+
+                       fprintf(stream, "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos"); 
+                       if (disto_on)
+                               fprintf(stream, " disto");
+                       fprintf(stream,"\n");
+
+                       for (precno = 0; precno < max_numprec; precno++) {
+                               for (compno = 0; compno < cstr_info->numcomps; compno++) {
+                                       for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {
+                                               int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                                               int pcnx = cstr_info->tile[tileno].pw[resno];
+                                               int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );
+                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );
+                                               int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
+                                               int precno_y = (int) floor( (float)precno/(float)pcnx );
+                                               if (precno >= numprec)
+                                                       continue;
+                                               for(y = y0; y < y1; y++) {                                                      
+                                                       if (precno_y*pcy == y ) {
+                                                               for (x = x0; x < x1; x++) {                                                                     
+                                                                       if (precno_x*pcx == x ) {
+                                                                               for (layno = 0; layno < cstr_info->numlayers; layno++) {
+                                                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
+                                                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
+                                                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;
+                                                                                       fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d   %9d %7d",
+                                                                                               pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos); 
+                                                                                       if (disto_on)
+                                                                                               fprintf(stream, " %8e", disto);
+                                                                                       fprintf(stream, "\n");
+                                                                                       total_disto += disto;
+                                                                                       pack_nb++; 
+                                                                               }
+                                                                       }
+                                                               }/* x = x0..x1 */
+                                                       } 
+                                               }  /* y = y0..y1 */
+                                       } /* resno */
+                               } /* compno */
+                       } /* precno */
+               } /* PCRL */
+
+               else {  /* CPRL */
+                       /* Count the maximum number of precincts */
+                       int max_numprec = 0;
+                       for (resno = 0; resno < max_numdecompos + 1; resno++) {
+                               int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                               if (numprec > max_numprec)
+                                       max_numprec = numprec;
+                       }
+
+                       fprintf(stream, "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos"); 
+                       if (disto_on)
+                               fprintf(stream, " disto");
+                       fprintf(stream,"\n");
+
+                       for (compno = 0; compno < cstr_info->numcomps; compno++) {
+                               /* I suppose components have same XRsiz, YRsiz */
+                               int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;
+                               int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;
+                               int x1 = x0 + cstr_info->tile_x;
+                               int y1 = y0 + cstr_info->tile_y;
+
+                               for (precno = 0; precno < max_numprec; precno++) {
+                                       for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {
+                                               int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
+                                               int pcnx = cstr_info->tile[tileno].pw[resno];
+                                               int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );
+                                               int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );
+                                               int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
+                                               int precno_y = (int) floor( (float)precno/(float)pcnx );
+                                               if (precno >= numprec)
+                                                       continue;
+
+                                               for(y = y0; y < y1; y++) {
+                                                       if (precno_y*pcy == y ) {
+                                                               for (x = x0; x < x1; x++) {
+                                                                       if (precno_x*pcx == x ) {
+                                                                               for (layno = 0; layno < cstr_info->numlayers; layno++) {
+                                                                                       start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
+                                                                                       end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
+                                                                                       end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
+                                                                                       disto = cstr_info->tile[tileno].packet[pack_nb].disto;
+                                                                                       fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d   %9d %7d",
+                                                                                               pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos); 
+                                                                                       if (disto_on)
+                                                                                               fprintf(stream, " %8e", disto);
+                                                                                       fprintf(stream, "\n");
+                                                                                       total_disto += disto;
+                                                                                       pack_nb++; 
+                                                                               }
+                                                                       }
+                                                               }/* x = x0..x1 */
+                                                       }
+                                               } /* y = y0..y1 */
+                                       } /* resno */
+                               } /* precno */
+                       } /* compno */
+               } /* CPRL */   
+       } /* tileno */
+       
+       if (disto_on) {
+               fprintf(stream, "%8e\n", cstr_info->D_max); /* SE max */        
+               fprintf(stream, "%.8e\n", total_disto); /* SE totale */
+       }
+/* UniPG>> */
+       /* print the markers' list */
+       if (cstr_info->marknum) {
+               fprintf(stream, "\nMARKER LIST\n");
+               fprintf(stream, "%d\n", cstr_info->marknum);
+               fprintf(stream, "type\tstart_pos    length\n");
+               for (x = 0; x < cstr_info->marknum; x++)
+                       fprintf(stream, "%X\t%9d %9d\n", cstr_info->marker[x].type, cstr_info->marker[x].pos, cstr_info->marker[x].len);
+       }
+/* <<UniPG */
+       fclose(stream);
+
+       fprintf(stderr,"Generated index file %s\n", index);
+
+       return 0;
+}
diff --git a/wrapping/java/openjp2/index.h b/wrapping/java/openjp2/index.h
new file mode 100644 (file)
index 0000000..6c2231d
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2007, Professor Benoit Macq
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __J2K_INDEX_H
+#define __J2K_INDEX_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+Write a structured index to a file
+@param cstr_info Codestream information 
+@param index Index filename
+@return Returns 0 if successful, returns 1 otherwise
+*/
+int write_index_file(opj_codestream_info_t *cstr_info, char *index);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __J2K_INDEX_H */
+