Update the README.cmake file : an instruction was missing to run the tests correctly.
[openjpeg.git] / codec / image_to_j2k.c
index d3027a813f0c03adc51bbaa902c53c2f8ea6ca65..7acaed073cb0d5de93815e05028dd743c433a127 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (c) 2001-2003, David Janssens
  * 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) 2005, Herve Drolon, FreeImage Team
  * Copyright (c) 2006-2007, Parvatha Elangovan
  * All rights reserved.
  *
 #include "compat/getopt.h"
 #include "convert.h"
 #include "dirent.h"
+#include "index.h"
 
 #ifndef WIN32
-#define stricmp strcasecmp
-#define strnicmp strncasecmp
+#include <strings.h>
+#define _stricmp strcasecmp
+#define _strnicmp strncasecmp
 #endif
 
 /* ----------------------------------------------------------------------- */
@@ -57,7 +59,7 @@
 #define TIF_DFMT 14
 #define RAW_DFMT 15
 #define TGA_DFMT 16
-
+#define PNG_DFMT 17
 /* ----------------------------------------------------------------------- */
 #define CINEMA_24_CS 1302083   /*Codestream length for 24fps*/
 #define CINEMA_48_CS 651041            /*Codestream length for 48fps*/
@@ -80,6 +82,8 @@ typedef struct img_folder{
        char set_imgdir;
        /** Enable Cod Format for output*/
        char set_out_format;
+       /** User specified rate stored in case of cinema option*/
+       float *rates;
 }img_fol_t;
 
 void encode_help_display() {
@@ -148,10 +152,10 @@ void encode_help_display() {
        fprintf(stdout,"-h           : display the help information \n ");
        fprintf(stdout,"\n");
        fprintf(stdout,"-cinema2K    : Digital Cinema 2K profile compliant codestream for 2K resolution.(-cinema2k 24 or 48) \n");
-  fprintf(stdout,"       Need to specify the frames per second for a 2K resolution. Only 24 or 48 fps is allowed\n"); 
+  fprintf(stdout,"       Need to specify the frames per second for a 2K resolution. Only 24 or 48 fps is allowed\n");
        fprintf(stdout,"\n");
        fprintf(stdout,"-cinema4K    : Digital Cinema 4K profile compliant codestream for 4K resolution \n");
-       fprintf(stdout,"          Frames per second not required. Default value is 24fps\n"); 
+       fprintf(stdout,"          Frames per second not required. Default value is 24fps\n");
        fprintf(stdout,"\n");
        fprintf(stdout,"-r           : different compression ratios for successive layers (-r 20,10,5)\n ");
        fprintf(stdout,"                 - The rate specified for each quality level is the desired \n");
@@ -197,7 +201,7 @@ void encode_help_display() {
        fprintf(stdout,"\n");
        fprintf(stdout,"-ROI         : c=%%d,U=%%d : quantization indices upshifted \n");
        fprintf(stdout,"               for component c=%%d [%%d = 0,1,2]\n");
-       fprintf(stdout,"               with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) \n");
+       fprintf(stdout,"               with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI c=0,U=25) \n");
        fprintf(stdout,"\n");
        fprintf(stdout,"-d           : offset of the origin of the image (-d 150,300) \n");
        fprintf(stdout,"\n");
@@ -205,6 +209,10 @@ void encode_help_display() {
        fprintf(stdout,"\n");
        fprintf(stdout,"-I           : use the irreversible DWT 9-7 (-I) \n");
        fprintf(stdout,"\n");
+       fprintf(stdout,"-F           : characteristics of the raw input image\n");
+       fprintf(stdout,"               -F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n");
+       fprintf(stdout,"               Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n");
+       fprintf(stdout,"\n");
 /* UniPG>> */
 #ifdef USE_JPWL
        fprintf(stdout,"-W           : adoption of JPWL (Part 11) capabilities (-W params)\n");
@@ -334,7 +342,7 @@ OPJ_PROG_ORDER give_progression(char progression[4]) {
 
 int get_num_images(char *imgdirpath){
        DIR *dir;
-       struct dirent* content; 
+       struct dirent* content;
        int num_images = 0;
 
        /*Reading the input images from given input directory*/
@@ -356,7 +364,7 @@ int get_num_images(char *imgdirpath){
 
 int load_images(dircnt_t *dirptr, char *imgdirpath){
        DIR *dir;
-       struct dirent* content; 
+       struct dirent* content;
        int i = 0;
 
        /*Reading the input images from given input directory*/
@@ -376,23 +384,23 @@ int load_images(dircnt_t *dirptr, char *imgdirpath){
                strcpy(dirptr->filename[i],content->d_name);
                i++;
        }
-       return 0;       
+       return 0;
 }
 
 int get_file_format(char *filename) {
        unsigned int i;
        static const char *extension[] = {
-    "pgx", "pnm", "pgm", "ppm", "bmp", "tif", "raw", "tga", "j2k", "jp2", "j2c"
+    "pgx", "pnm", "pgm", "ppm", "bmp", "tif", "raw", "tga", "png", "j2k", "jp2", "j2c", "jpc"
     };
        static const int format[] = {
-    PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, J2K_CFMT, JP2_CFMT, J2K_CFMT
+    PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, J2K_CFMT, J2K_CFMT
     };
        char * ext = strrchr(filename, '.');
        if (ext == NULL)
                return -1;
        ext++;
        for(i = 0; i < sizeof(format)/sizeof(*format); i++) {
-               if(strnicmp(ext, extension[i], 3) == 0) {
+               if(_strnicmp(ext, extension[i], 3) == 0) {
                        return format[i];
                }
        }
@@ -432,15 +440,15 @@ char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_cparamet
 }
 
 static int initialise_4K_poc(opj_poc_t *POC, int numres){
-       POC[0].tile  = 1; 
-       POC[0].resno0  = 0; 
+       POC[0].tile  = 1;
+       POC[0].resno0  = 0;
        POC[0].compno0 = 0;
        POC[0].layno1  = 1;
        POC[0].resno1  = numres-1;
        POC[0].compno1 = 3;
        POC[0].prg1 = CPRL;
        POC[1].tile  = 1;
-       POC[1].resno0  = numres-1; 
+       POC[1].resno0  = numres-1;
        POC[1].compno0 = 0;
        POC[1].layno1  = 1;
        POC[1].resno1  = numres;
@@ -453,7 +461,7 @@ void cinema_parameters(opj_cparameters_t *parameters){
        parameters->tile_size_on = false;
        parameters->cp_tdx=1;
        parameters->cp_tdy=1;
-       
+
        /*Tile part*/
        parameters->tp_flag = 'C';
        parameters->tp_on = 1;
@@ -465,7 +473,7 @@ void cinema_parameters(opj_cparameters_t *parameters){
        parameters->image_offset_y0 = 0;
 
        /*Codeblock size= 32*32*/
-       parameters->cblockw_init = 32;  
+       parameters->cblockw_init = 32;
        parameters->cblockh_init = 32;
        parameters->csty |= 0x01;
 
@@ -482,10 +490,9 @@ void cinema_parameters(opj_cparameters_t *parameters){
 
 }
 
-void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image){
+void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_fol_t *img_fol){
        int i;
        float temp_rate;
-       opj_poc_t *POC = NULL;
 
        switch (parameters->cp_cinema){
        case CINEMA2K_24:
@@ -500,7 +507,7 @@ void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image){
                        parameters->cp_rsiz = STD_RSIZ;
                }
        break;
-       
+
        case CINEMA4K_24:
                if(parameters->numresolution < 1){
                                parameters->numresolution = 1;
@@ -508,325 +515,66 @@ void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image){
                                parameters->numresolution = 7;
                        }
                if (!((image->comps[0].w == 4096) | (image->comps[0].h == 2160))){
-                       fprintf(stdout,"Image coordinates %d x %d is not 4K compliant.\nJPEG Digital Cinema Profile-4" 
+                       fprintf(stdout,"Image coordinates %d x %d is not 4K compliant.\nJPEG Digital Cinema Profile-4"
                                "(4K profile) compliance requires that at least one of coordinates match 4096 x 2160\n",
                                image->comps[0].w,image->comps[0].h);
                        parameters->cp_rsiz = STD_RSIZ;
                }
                parameters->numpocs = initialise_4K_poc(parameters->POC,parameters->numresolution);
                break;
+       default :
+               break;
        }
 
        switch (parameters->cp_cinema){
                case CINEMA2K_24:
                case CINEMA4K_24:
-                       for(i=0;i<parameters->tcp_numlayers;i++){
+                       for(i=0 ; i<parameters->tcp_numlayers ; i++){
                                temp_rate = 0 ;
-                               if (parameters->tcp_rates[i]== 0){
-                                       parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ 
+                               if (img_fol->rates[i]== 0){
+                                       parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
                                        (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy);
                                }else{
-                                       temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ 
-                                               (parameters->tcp_rates[i] * 8 * image->comps[0].dx * image->comps[0].dy);
+                                       temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+                                               (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy);
                                        if (temp_rate > CINEMA_24_CS ){
-                                               parameters->tcp_rates[i]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ 
-                                                                                                                                                               (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy);
+                                               parameters->tcp_rates[i]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+                                               (CINEMA_24_CS * 8 * image->comps[0].dx * image->comps[0].dy);
+                                       }else{
+                                               parameters->tcp_rates[i]= img_fol->rates[i];
                                        }
                                }
                        }
                        parameters->max_comp_size = COMP_24_CS;
                        break;
-               
+
                case CINEMA2K_48:
-       for(i=0;i<parameters->tcp_numlayers;i++){
+                       for(i=0 ; i<parameters->tcp_numlayers ; i++){
                                temp_rate = 0 ;
-                               if (parameters->tcp_rates[i]== 0){
-                                       parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ 
+                               if (img_fol->rates[i]== 0){
+                                       parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
                                        (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy);
                                }else{
-                                       temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ 
-                                               (parameters->tcp_rates[i] * 8 * image->comps[0].dx * image->comps[0].dy);
+                                       temp_rate =((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+                                               (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy);
                                        if (temp_rate > CINEMA_48_CS ){
-                                               parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/ 
-                                                                                                                                                               (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy);
+                                               parameters->tcp_rates[0]= ((float) (image->numcomps * image->comps[0].w * image->comps[0].h * image->comps[0].prec))/
+                                               (CINEMA_48_CS * 8 * image->comps[0].dx * image->comps[0].dy);
+                                       }else{
+                                               parameters->tcp_rates[i]= img_fol->rates[i];
                                        }
                                }
                        }
                        parameters->max_comp_size = COMP_48_CS;
                        break;
+               default:
+                       break;
        }
        parameters->cp_disto_alloc = 1;
 }
 
 /* ------------------------------------------------------------------------------------ */
 
-/**
-Create an index and write it 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;
-
-#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;
-       }
-       
-       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);
-
-       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         disto     nbpix   disto/nbpix\n");
-       for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
-               fprintf(stream, "%4d %9d %9d %9d %9d %9e %9d %9e\n",
-                       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,
-                       cstr_info->tile[tileno].distotile, cstr_info->tile[tileno].numpix,
-                       cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].numpix);
-       }
-               
-       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  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 %11d %9d\n",
-                               tilepartno, tileno,
-                               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 disto\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 %8e\n",
-                                                               pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos, disto);
-                                                       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 disto\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 %8e\n",
-                                                               pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos, disto);
-                                                       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 disto\n"); 
-
-                       for (resno = 0; resno < max_numdecompos + 1; resno++) {
-                               /* 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 prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
-                                       if (resno > cstr_info->numdecompos[compno])
-                                                       break;
-                                       for (precno = 0; precno < prec_max; precno++) {
-                                               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 );
-                                               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 %8e\n",
-                                                                                               pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos, disto); 
-                                                                                       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;
-
-                       fprintf(stream, "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos disto\n"); 
-
-                       for (compno = 0; compno < cstr_info->numcomps; compno++) {
-                               for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {
-                                       int prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
-                                       for (precno = 0; precno < prec_max; precno++) {
-                                               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 );
-                                               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 %8e\n",
-                                                                                               pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos, disto); 
-                                                                                       total_disto += disto;
-                                                                                       pack_nb++; 
-                                                                               }
-                                                                       }
-                                                               }/* x = x0..x1 */
-                                                       } 
-                                               }  /* y = y0..y1 */
-                                       } /* precno */
-                               } /* resno */
-                       } /* compno */
-               } /* PCRL */
-               else {  /* CPRL */
-
-                       fprintf(stream, "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos disto\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 (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {
-                                       int prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
-                                       for (precno = 0; precno < prec_max; precno++) {
-                                               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 );
-                                               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 %8e\n",
-                                                                                               pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos, disto); 
-                                                                                       total_disto += disto;
-                                                                                       pack_nb++; 
-                                                                               }
-                                                                       }
-                                                               }/* x = x0..x1 */
-                                                       }
-                                               } /* y = y0..y1 */
-                                       } /* precno */
-                               } /* resno */
-                       } /* compno */
-               } /* CPRL */   
-       } /* tileno */
-       
-       fprintf(stream, "%8e\n", cstr_info->D_max); /* SE max */
-       fprintf(stream, "%.8e\n", total_disto); /* SE totale */
-       fclose(stream);
-
-       fprintf(stderr,"Generated index file %s\n", index);
-
-       return 0;
-}
-
-/* ------------------------------------------------------------------------------------ */
-
 int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                                                                                        img_fol_t *img_fol, raw_cparameters_t *raw_cp, char *indexfilename) {
        int i, j,totlen;
@@ -839,6 +587,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                {"EPH",NO_ARG, NULL ,'E'},
                {"OutFor",REQ_ARG, NULL ,'O'},
                {"POC",REQ_ARG, NULL ,'P'},
+               {"ROI",REQ_ARG, NULL ,'R'},
        };
 
        /* parse the command line */
@@ -868,11 +617,12 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                        case TIF_DFMT:
                                        case RAW_DFMT:
                                        case TGA_DFMT:
+                                       case PNG_DFMT:
                                                break;
                                        default:
                                                fprintf(stderr,
                                                        "!! Unrecognized format for infile : %s "
-              "[accept only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga] !!\n\n", 
+              "[accept only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga] !!\n\n",
                                                        infile);
                                                return 1;
                                }
@@ -925,6 +675,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                        case 'r':                       /* rates rates/distorsion */
                        {
                                char *s = optarg;
+                               parameters->tcp_numlayers = 0;
                                while (sscanf(s, "%f", &parameters->tcp_rates[parameters->tcp_numlayers]) == 1) {
                                        parameters->tcp_numlayers++;
                                        while (*s && *s != ',') {
@@ -940,7 +691,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                                /* ----------------------------------------------------- */
 
-                       
+
                        case 'F':                       /* Raw image format parameters */
                        {
                                char signo;
@@ -960,7 +711,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                                fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n");
                                                fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n");
                                                fprintf(stderr,"Aborting\n");
-                                       }                                       
+                                       }
                                }
                                else {
                                        fprintf(stderr,"\nError: invalid raw image parameters\n");
@@ -1163,7 +914,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile,
                                        &POC[numpocs].resno0, &POC[numpocs].compno0,
                                        &POC[numpocs].layno1, &POC[numpocs].resno1,
-                                       &POC[numpocs].compno1, &POC[numpocs].progorder) == 7) {
+                                       &POC[numpocs].compno1, POC[numpocs].progorder) == 7) {
                                        POC[numpocs].prg1 = give_progression(POC[numpocs].progorder);
                                        numpocs++;
                                        while (*s && *s != '/') {
@@ -1213,9 +964,9 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
 
                        case 'R':                       /* ROI */
                        {
-                               if (sscanf(optarg, "OI:c=%d,U=%d", &parameters->roi_compno,
+                               if (sscanf(optarg, "c=%d,U=%d", &parameters->roi_compno,
                                            &parameters->roi_shift) != 2) {
-                                       fprintf(stderr, "ROI error !! [-ROI:c='compno',U='shift']\n");
+                                       fprintf(stderr, "ROI error !! [-ROI c='compno',U='shift']\n");
                                        return 1;
                                }
                        }
@@ -1253,16 +1004,16 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                        break;
 
                        /* ------------------------------------------------------ */
-                       
+
                        case 'v':                       /* Tile part generation*/
                        {
                                parameters->tp_flag = optarg[0];
                                parameters->tp_on = 1;
                        }
-                       break;  
+                       break;
 
                                /* ------------------------------------------------------ */
-                       
+
                        case 'z':                       /* Image Directory path */
                        {
                                img_fol->imgdirpath = (char*)malloc(strlen(optarg) + 1);
@@ -1272,7 +1023,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                        break;
 
                                /* ------------------------------------------------------ */
-                       
+
                        case 'w':                       /* Digital Cinema 2K profile compliance*/
                        {
                                int fps=0;
@@ -1287,12 +1038,12 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                }
                                fprintf(stdout,"CINEMA 2K compliant codestream\n");
                                parameters->cp_rsiz = CINEMA2K;
-                               
+
                        }
                        break;
-                               
+
                                /* ------------------------------------------------------ */
-                       
+
                        case 'y':                       /* Digital Cinema 4K profile compliance*/
                        {
                                parameters->cp_cinema = CINEMA4K_24;
@@ -1300,20 +1051,20 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                parameters->cp_rsiz = CINEMA4K;
                        }
                        break;
-                               
+
                                /* ------------------------------------------------------ */
 
 /* UniPG>> */
 #ifdef USE_JPWL
                                /* ------------------------------------------------------ */
-                       
+
                        case 'W':                       /* JPWL capabilities switched on */
                        {
                                char *token = NULL;
                                int hprot, pprot, sens, addr, size, range;
 
                                /* we need to enable indexing */
-                               if (!indexfilename) {
+                               if (!indexfilename || !*indexfilename) {
                                        strncpy(indexfilename, JPWL_PRIVATEINDEX_NAME, OPJ_PATH_LEN);
                                }
 
@@ -1381,7 +1132,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                        /* search packet error protection method */
                                        if (*token == 'p') {
 
-                                               static int pack = 0, tile = 0, packspec = 0, lastpackno = 0;
+                                               static int pack = 0, tile = 0, packspec = 0;
 
                                                pprot = 1; /* predefined method */
 
@@ -1530,14 +1281,13 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                                        fprintf(stderr, "ERROR -> invalid sensitivity method selection = %s\n", token);
                                                        return 1;
                                                };
-                                               
+
                                                parameters->jpwl_sens_size = 2; /* 2 bytes for default size */
                                        }
 
                                        /* search addressing size */
                                        if (*token == 'a') {
 
-                                               static int tile = 0, tilespec = 0, lasttileno = 0;
 
                                                addr = 0; /* predefined: auto */
 
@@ -1557,13 +1307,12 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                                        fprintf(stderr, "ERROR -> invalid addressing selection = %s\n", token);
                                                        return 1;
                                                };
-                                               
+
                                        }
 
                                        /* search sensitivity size */
                                        if (*token == 'z') {
 
-                                               static int tile = 0, tilespec = 0, lasttileno = 0;
 
                                                size = 1; /* predefined: 1 byte */
 
@@ -1583,13 +1332,12 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                                        fprintf(stderr, "ERROR -> invalid size selection = %s\n", token);
                                                        return 1;
                                                };
-                                               
+
                                        }
 
                                        /* search range method */
                                        if (*token == 'g') {
 
-                                               static int tile = 0, tilespec = 0, lasttileno = 0;
 
                                                range = 0; /* predefined: 0 (packet) */
 
@@ -1609,7 +1357,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
                                                        fprintf(stderr, "ERROR -> invalid range selection = %s\n", token);
                                                        return 1;
                                                };
-                                               
+
                                        }
 
                                        /* next token or bust */
@@ -1764,10 +1512,14 @@ int main(int argc, char **argv) {
        if(parse_cmdline_encoder(argc, argv, &parameters,&img_fol, &raw_cp, indexfilename) == 1) {
                return 1;
        }
-       
+
        if (parameters.cp_cinema){
+               img_fol.rates = (float*)malloc(parameters.tcp_numlayers * sizeof(float));
+               for(i=0; i< parameters.tcp_numlayers; i++){
+                       img_fol.rates[i] = parameters.tcp_rates[i];
+               }
                cinema_parameters(&parameters);
-       }                               
+       }
 
        /* Create comment for codestream */
        if(parameters.cp_comment == NULL) {
@@ -1813,7 +1565,7 @@ int main(int argc, char **argv) {
        for(imageno=0;imageno<num_images;imageno++)     {
                image = NULL;
                fprintf(stderr,"\n");
-               
+
                if(img_fol.set_imgdir==1){
                        if (get_next_file(imageno, dirptr,&img_fol, &parameters)) {
                                fprintf(stderr,"skipping file...\n");
@@ -1833,9 +1585,11 @@ int main(int argc, char **argv) {
                                break;
                        case TGA_DFMT:
                                break;
+                       case PNG_DFMT:
+                               break;
                        default:
                                fprintf(stderr,"skipping file...\n");
-                               continue;                       
+                               continue;
                }
 
                        /* decode the source image */
@@ -1846,7 +1600,7 @@ int main(int argc, char **argv) {
                                        image = pgxtoimage(parameters.infile, &parameters);
                                        if (!image) {
                                                fprintf(stderr, "Unable to load pgx file\n");
-                                               return 1; 
+                                               return 1;
                                        }
                                        break;
 
@@ -1865,7 +1619,7 @@ int main(int argc, char **argv) {
                                                return 1;
                                        }
                                        break;
-                       
+
                                case TIF_DFMT:
                                        image = tiftoimage(parameters.infile, &parameters);
                                        if (!image) {
@@ -1889,12 +1643,20 @@ int main(int argc, char **argv) {
                                                return 1;
                                        }
                                break;
+
+                               case PNG_DFMT:
+                                       image = pngtoimage(parameters.infile, &parameters);
+                                       if (!image) {
+                                               fprintf(stderr, "Unable to load png file\n");
+                                               return 1;
+                                       }
+                                       break;
                }
                        /* Decide if MCT should be used */
                        parameters.tcp_mct = image->numcomps == 3 ? 1 : 0;
 
                        if(parameters.cp_cinema){
-                               cinema_setup_encoder(&parameters,image);
+                               cinema_setup_encoder(&parameters,image,&img_fol);
                        }
 
                        /* encode the destination image */
@@ -1947,7 +1709,7 @@ int main(int argc, char **argv) {
                                if (*indexfilename) {
                                        bSuccess = write_index_file(&cstr_info, indexfilename);
                                        if (bSuccess) {
-                                               fprintf(stderr, "Failed to output index file\n");
+                                               fprintf(stderr, "Failed to output index file into [%s]\n", indexfilename);
                                        }
                                }
 
@@ -1964,7 +1726,7 @@ int main(int argc, char **argv) {
                                opj_cinfo_t* cinfo = opj_create_compress(CODEC_JP2);
 
                                /* catch events using our callbacks and give a local context */
-                               opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);                   
+                               opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);
 
                                /* setup the encoder parameters using the current image and using user parameters */
                                opj_setup_encoder(cinfo, &parameters, image);
@@ -1996,7 +1758,7 @@ int main(int argc, char **argv) {
                                fprintf(stderr,"Generated outfile %s\n",parameters.outfile);
                                /* close and free the byte stream */
                                opj_cio_close(cio);
-                               
+
                                /* Write the index to disk */
                                if (*indexfilename) {
                                        bSuccess = write_index_file(&cstr_info, indexfilename);
@@ -2010,7 +1772,7 @@ int main(int argc, char **argv) {
                                if (*indexfilename)
                                        opj_destroy_cstr_info(&cstr_info);
                        }
-       
+
                        /* free image data */
                        opj_image_destroy(image);
        }