Add option to force component splitting in imagetopnm
[openjpeg.git] / src / bin / jp2 / opj_decompress.c
1 /*
2  * The copyright in this software is being made available under the 2-clauses 
3  * BSD License, included below. This software may be subject to other third 
4  * party and contributor rights, including patent rights, and no such rights
5  * are granted under this license.
6  *
7  * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
8  * Copyright (c) 2002-2014, Professor Benoit Macq
9  * Copyright (c) 2001-2003, David Janssens
10  * Copyright (c) 2002-2003, Yannick Verschueren
11  * Copyright (c) 2003-2007, Francois-Olivier Devaux 
12  * Copyright (c) 2003-2014, Antonin Descampe
13  * Copyright (c) 2005, Herve Drolon, FreeImage Team
14  * Copyright (c) 2006-2007, Parvatha Elangovan
15  * Copyright (c) 2008, 2011-2012, Centre National d'Etudes Spatiales (CNES), FR 
16  * Copyright (c) 2012, CS Systemes d'Information, France
17  * All rights reserved.
18  *
19  * Redistribution and use in source and binary forms, with or without
20  * modification, are permitted provided that the following conditions
21  * are met:
22  * 1. Redistributions of source code must retain the above copyright
23  *    notice, this list of conditions and the following disclaimer.
24  * 2. Redistributions in binary form must reproduce the above copyright
25  *    notice, this list of conditions and the following disclaimer in the
26  *    documentation and/or other materials provided with the distribution.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
29  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
32  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
35  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
36  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38  * POSSIBILITY OF SUCH DAMAGE.
39  */
40 #include "opj_apps_config.h"
41
42 #include <stdio.h>
43 #include <string.h>
44 #include <stdlib.h>
45 #include <math.h>
46
47 #ifdef _WIN32
48 #include "windirent.h"
49 #else
50 #include <dirent.h>
51 #endif /* _WIN32 */
52
53 #ifdef _WIN32
54 #include <windows.h>
55 #define strcasecmp _stricmp
56 #define strncasecmp _strnicmp
57 #else
58 #include <strings.h>
59 #include <sys/time.h>
60 #include <sys/resource.h>
61 #include <sys/times.h>
62 #endif /* _WIN32 */
63
64 #include "openjpeg.h"
65 #include "opj_getopt.h"
66 #include "convert.h"
67 #include "index.h"
68
69 #ifdef OPJ_HAVE_LIBLCMS2
70 #include <lcms2.h>
71 #endif
72 #ifdef OPJ_HAVE_LIBLCMS1
73 #include <lcms.h>
74 #endif
75 #include "color.h"
76
77 #include "format_defs.h"
78
79 typedef struct dircnt{
80         /** Buffer for holding images read from Directory*/
81         char *filename_buf;
82         /** Pointer to the buffer*/
83         char **filename;
84 }dircnt_t;
85
86
87 typedef struct img_folder{
88         /** The directory path of the folder containing input images*/
89         char *imgdirpath;
90         /** Output format*/
91         const char *out_format;
92         /** Enable option*/
93         char set_imgdir;
94         /** Enable Cod Format for output*/
95         char set_out_format;
96
97 }img_fol_t;
98
99 typedef enum opj_prec_mode
100 {
101         OPJ_PREC_MODE_CLIP,
102         OPJ_PREC_MODE_SCALE
103 } opj_precision_mode;
104
105 typedef struct opj_prec
106 {
107         OPJ_UINT32         prec;
108         opj_precision_mode mode;
109 }opj_precision;
110
111 typedef struct opj_decompress_params
112 {
113         /** core library parameters */
114         opj_dparameters_t core;
115         
116         /** input file name */
117         char infile[OPJ_PATH_LEN];
118         /** output file name */
119         char outfile[OPJ_PATH_LEN];
120         /** input file format 0: J2K, 1: JP2, 2: JPT */
121         int decod_format;
122         /** output file format 0: PGX, 1: PxM, 2: BMP */
123         int cod_format;
124         
125         /** Decoding area left boundary */
126         OPJ_UINT32 DA_x0;
127         /** Decoding area right boundary */
128         OPJ_UINT32 DA_x1;
129         /** Decoding area up boundary */
130         OPJ_UINT32 DA_y0;
131         /** Decoding area bottom boundary */
132         OPJ_UINT32 DA_y1;
133         /** Verbose mode */
134         OPJ_BOOL m_verbose;
135         
136         /** tile number ot the decoded tile*/
137         OPJ_UINT32 tile_index;
138         /** Nb of tile to decode */
139         OPJ_UINT32 nb_tile_to_decode;
140         
141         opj_precision* precision;
142         OPJ_UINT32     nb_precision;
143         
144         /* force output colorspace to RGB */
145         int force_rgb;
146         /* upsample components according to their dx/dy values */
147         int upsample;
148         /* split output components to different files */
149         int split_pnm;
150 }opj_decompress_parameters;
151
152 /* -------------------------------------------------------------------------- */
153 /* Declarations                                                               */
154 int get_num_images(char *imgdirpath);
155 int load_images(dircnt_t *dirptr, char *imgdirpath);
156 int get_file_format(const char *filename);
157 char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_decompress_parameters *parameters);
158 static int infile_format(const char *fname);
159
160 int parse_cmdline_decoder(int argc, char **argv, opj_decompress_parameters *parameters,img_fol_t *img_fol, char *indexfilename);
161 int parse_DA_values( char* inArg, unsigned int *DA_x0, unsigned int *DA_y0, unsigned int *DA_x1, unsigned int *DA_y1);
162
163 static opj_image_t* convert_gray_to_rgb(opj_image_t* original);
164
165 /* -------------------------------------------------------------------------- */
166 static void decode_help_display(void) {
167         fprintf(stdout,"\nThis is the opj_decompress utility from the OpenJPEG project.\n"
168                        "It decompresses JPEG 2000 codestreams to various image formats.\n"
169                        "It has been compiled against openjp2 library v%s.\n\n",opj_version());
170
171         fprintf(stdout,"Parameters:\n"
172                        "-----------\n"
173                        "\n"
174                        "  -ImgDir <directory> \n"
175                        "        Image file Directory path \n"
176                        "  -OutFor <PBM|PGM|PPM|PNM|PAM|PGX|PNG|BMP|TIF|RAW|RAWL|TGA>\n"
177                        "    REQUIRED only if -ImgDir is used\n"
178                        "        Output format for decompressed images.\n"
179                        "  -i <compressed file>\n"
180                        "    REQUIRED only if an Input image directory is not specified\n"
181                        "    Currently accepts J2K-files, JP2-files and JPT-files. The file type\n"
182                        "    is identified based on its suffix.\n"
183                        "  -o <decompressed file>\n"
184                        "    REQUIRED\n"
185                        "    Currently accepts formats specified above (see OutFor option)\n"
186                        "    Binary data is written to the file (not ascii). If a PGX\n"
187                        "    filename is given, there will be as many output files as there are\n"
188                        "    components: an indice starting from 0 will then be appended to the\n"
189                        "    output filename, just before the \"pgx\" extension. If a PGM filename\n"
190                        "    is given and there are more than one component, only the first component\n"
191                        "    will be written to the file.\n"
192                        "  -r <reduce factor>\n"
193                        "    Set the number of highest resolution levels to be discarded. The\n"
194                        "    image resolution is effectively divided by 2 to the power of the\n"
195                        "    number of discarded levels. The reduce factor is limited by the\n"
196                        "    smallest total number of decomposition levels among tiles.\n"
197                        "  -l <number of quality layers to decode>\n"
198                        "    Set the maximum number of quality layers to decode. If there are\n"
199                        "    less quality layers than the specified number, all the quality layers\n"
200                        "    are decoded.\n"
201                        "  -x  \n" 
202                        "    Create an index file *.Idx (-x index_name.Idx) \n"
203                        "  -d <x0,y0,x1,y1>\n"
204                        "    OPTIONAL\n"
205                        "    Decoding area\n"
206                        "    By default all the image is decoded.\n"
207                        "  -t <tile_number>\n"
208                        "    OPTIONAL\n"
209                        "    Set the tile number of the decoded tile. Follow the JPEG2000 convention from left-up to bottom-up\n"
210                        "    By default all tiles are decoded.\n"
211                        "  -p <comp 0 precision>[C|S][,<comp 1 precision>[C|S][,...]]\n"
212                        "    OPTIONAL\n"
213                        "    Force the precision (bit depth) of components.\n"
214                        "    There shall be at least 1 value. Theres no limit on the number of values (comma separated, last values ignored if too much values).\n"
215                        "    If there are less values than components, the last value is used for remaining components.\n"
216                        "    If 'C' is specified (default), values are clipped.\n"
217                        "    If 'S' is specified, values are scaled.\n"
218                        "    A 0 value can be specified (meaning original bit depth).\n"
219                        "  -force-rgb\n"
220                        "    Force output image colorspace to RGB\n"
221                        "  -upsample\n"
222                        "    Downsampled components will be upsampled to image size\n"
223                        "  -split-pnm\n"
224                        "    Split output components to different files when writing to PNM\n"
225                        "\n");
226 /* UniPG>> */
227 #ifdef USE_JPWL
228         fprintf(stdout,"  -W <options>\n"
229                        "    Activates the JPWL correction capability, if the codestream complies.\n"
230                        "    Options can be a comma separated list of <param=val> tokens:\n"
231                        "    c, c=numcomps\n"
232                        "       numcomps is the number of expected components in the codestream\n"
233                        "       (search of first EPB rely upon this, default is %d)\n", JPWL_EXPECTED_COMPONENTS);
234 #endif /* USE_JPWL */
235 /* <<UniPG */
236         fprintf(stdout,"\n");
237 }
238
239 /* -------------------------------------------------------------------------- */
240
241 static OPJ_BOOL parse_precision(const char* option, opj_decompress_parameters* parameters)
242 {
243         const char* l_remaining = option;
244         OPJ_BOOL l_result = OPJ_TRUE;
245         
246         /* reset */
247         if (parameters->precision) {
248                 free(parameters->precision);
249                 parameters->precision = NULL;
250         }
251         parameters->nb_precision = 0U;
252         
253         for(;;)
254         {
255                 OPJ_UINT32 prec;
256                 char mode;
257                 char comma;
258                 int count;
259                 
260                 count = sscanf(l_remaining, "%d%c%c", &prec, &mode, &comma);
261                 if (count == 1) {
262                         mode = 'C';
263                         count++;
264                 }
265                 if ((count == 2) || (mode==',')) {
266                         if (mode==',') {
267                                 mode = 'C';
268                         }
269                         comma=',';
270                         count = 3;
271                 }
272                 if (count == 3) {
273                         if (prec > 32U) {
274                                 fprintf(stderr,"Invalid precision %d in precision option %s\n", prec, option);
275                                 l_result = OPJ_FALSE;
276                                 break;
277                         }
278                         if ((mode != 'C') && (mode != 'S')) {
279                                 fprintf(stderr,"Invalid precision mode %c in precision option %s\n", mode, option);
280                                 l_result = OPJ_FALSE;
281                                 break;
282                         }
283                         if (comma != ',') {
284                                 fprintf(stderr,"Invalid character %c in precision option %s\n", comma, option);
285                                 l_result = OPJ_FALSE;
286                                 break;
287                         }
288                         
289                         if (parameters->precision == NULL) {
290                                 /* first one */
291                                 parameters->precision = malloc(sizeof(opj_precision));
292                                 if (parameters->precision == NULL) {
293                                         fprintf(stderr,"Could not allocate memory for precision option\n");
294                                         l_result = OPJ_FALSE;
295                                         break;
296                                 }
297                         } else {
298                                 OPJ_UINT32 l_new_size = parameters->nb_precision + 1U;
299                                 opj_precision* l_new;
300                                 
301                                 if (l_new_size == 0U) {
302                                         fprintf(stderr,"Could not allocate memory for precision option\n");
303                                         l_result = OPJ_FALSE;
304                                         break;
305                                 }
306                                 
307                                 l_new = realloc(parameters->precision, l_new_size * sizeof(opj_precision));
308                                 if (l_new == NULL) {
309                                         fprintf(stderr,"Could not allocate memory for precision option\n");
310                                         l_result = OPJ_FALSE;
311                                         break;
312                                 }
313                                 parameters->precision = l_new;
314                         }
315                         
316                         parameters->precision[parameters->nb_precision].prec = prec;
317                         switch (mode) {
318                                 case 'C':
319                                         parameters->precision[parameters->nb_precision].mode = OPJ_PREC_MODE_CLIP;
320                                         break;
321                                 case 'S':
322                                         parameters->precision[parameters->nb_precision].mode = OPJ_PREC_MODE_SCALE;
323                                         break;
324                                 default:
325                                         break;
326                         }
327                         parameters->nb_precision++;
328                         
329                         l_remaining = strchr(l_remaining, ',');
330                         if (l_remaining == NULL) {
331                                 break;
332                         }
333                         l_remaining += 1;
334                 } else {
335                         fprintf(stderr,"Could not parse precision option %s\n", option);
336                         l_result = OPJ_FALSE;
337                         break;
338                 }
339         }
340         
341         return l_result;
342 }
343
344 /* -------------------------------------------------------------------------- */
345
346 int get_num_images(char *imgdirpath){
347         DIR *dir;
348         struct dirent* content; 
349         int num_images = 0;
350
351         /*Reading the input images from given input directory*/
352
353         dir= opendir(imgdirpath);
354         if(!dir){
355                 fprintf(stderr,"Could not open Folder %s\n",imgdirpath);
356                 return 0;
357         }
358         
359         while((content=readdir(dir))!=NULL){
360                 if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 )
361                         continue;
362                 num_images++;
363         }
364         return num_images;
365 }
366
367 /* -------------------------------------------------------------------------- */
368 int load_images(dircnt_t *dirptr, char *imgdirpath){
369         DIR *dir;
370         struct dirent* content; 
371         int i = 0;
372
373         /*Reading the input images from given input directory*/
374
375         dir= opendir(imgdirpath);
376         if(!dir){
377                 fprintf(stderr,"Could not open Folder %s\n",imgdirpath);
378                 return 1;
379         }else   {
380                 fprintf(stderr,"Folder opened successfully\n");
381         }
382         
383         while((content=readdir(dir))!=NULL){
384                 if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 )
385                         continue;
386
387                 strcpy(dirptr->filename[i],content->d_name);
388                 i++;
389         }
390         return 0;       
391 }
392
393 /* -------------------------------------------------------------------------- */
394 int get_file_format(const char *filename) {
395         unsigned int i;
396         static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "rawl", "tga", "png", "j2k", "jp2", "jpt", "j2c", "jpc" };
397         static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, RAWL_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT, J2K_CFMT };
398         char * ext = strrchr(filename, '.');
399         if (ext == NULL)
400                 return -1;
401         ext++;
402         if(*ext) {
403                 for(i = 0; i < sizeof(format)/sizeof(*format); i++) {
404                         if(strcasecmp(ext, extension[i]) == 0) {
405                                 return format[i];
406                         }
407                 }
408         }
409
410         return -1;
411 }
412
413 #ifdef _WIN32
414 const char* path_separator = "\\";
415 #else
416 const char* path_separator = "/";
417 #endif
418
419 /* -------------------------------------------------------------------------- */
420 char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_decompress_parameters *parameters){
421         char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN];
422         char *temp_p, temp1[OPJ_PATH_LEN]="";
423
424         strcpy(image_filename,dirptr->filename[imageno]);
425         fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename);
426         sprintf(infilename, "%s%s%s", img_fol->imgdirpath, path_separator, image_filename);
427         parameters->decod_format = infile_format(infilename);
428         if (parameters->decod_format == -1)
429                 return 1;
430         strncpy(parameters->infile, infilename, sizeof(infilename));
431
432         /*Set output file*/
433         strcpy(temp_ofname,strtok(image_filename,"."));
434         while((temp_p = strtok(NULL,".")) != NULL){
435                 strcat(temp_ofname,temp1);
436                 sprintf(temp1,".%s",temp_p);
437         }
438         if(img_fol->set_out_format==1){
439                 sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format);
440                 strncpy(parameters->outfile, outfilename, sizeof(outfilename));
441         }
442         return 0;
443 }
444
445 /* -------------------------------------------------------------------------- */
446 #define JP2_RFC3745_MAGIC "\x00\x00\x00\x0c\x6a\x50\x20\x20\x0d\x0a\x87\x0a"
447 #define JP2_MAGIC "\x0d\x0a\x87\x0a"
448 /* position 45: "\xff\x52" */
449 #define J2K_CODESTREAM_MAGIC "\xff\x4f\xff\x51"
450
451 static int infile_format(const char *fname)
452 {
453         FILE *reader;
454         const char *s, *magic_s;
455         int ext_format, magic_format;
456         unsigned char buf[12];
457         OPJ_SIZE_T l_nb_read;
458
459         reader = fopen(fname, "rb");
460
461         if (reader == NULL)
462                 return -2;
463
464         memset(buf, 0, 12);
465         l_nb_read = fread(buf, 1, 12, reader);
466         fclose(reader);
467         if (l_nb_read != 12)
468                 return -1;
469
470
471
472         ext_format = get_file_format(fname);
473
474         if (ext_format == JPT_CFMT)
475                 return JPT_CFMT;
476
477         if (memcmp(buf, JP2_RFC3745_MAGIC, 12) == 0 || memcmp(buf, JP2_MAGIC, 4) == 0) {
478                 magic_format = JP2_CFMT;
479                 magic_s = ".jp2";
480         }
481         else if (memcmp(buf, J2K_CODESTREAM_MAGIC, 4) == 0) {
482                 magic_format = J2K_CFMT;
483                 magic_s = ".j2k or .jpc or .j2c";
484         }
485         else
486                 return -1;
487
488         if (magic_format == ext_format)
489                 return ext_format;
490
491         s = fname + strlen(fname) - 4;
492
493         fputs("\n===========================================\n", stderr);
494         fprintf(stderr, "The extension of this file is incorrect.\n"
495                                         "FOUND %s. SHOULD BE %s\n", s, magic_s);
496         fputs("===========================================\n", stderr);
497
498         return magic_format;
499 }
500
501 /* -------------------------------------------------------------------------- */
502 /**
503  * Parse the command line
504  */
505 /* -------------------------------------------------------------------------- */
506 int parse_cmdline_decoder(int argc, char **argv, opj_decompress_parameters *parameters,img_fol_t *img_fol, char *indexfilename) {
507         /* parse the command line */
508         int totlen, c;
509         opj_option_t long_option[]={
510                 {"ImgDir",    REQ_ARG, NULL ,'y'},
511                 {"OutFor",    REQ_ARG, NULL ,'O'},
512                 {"force-rgb", NO_ARG,  &(parameters->force_rgb), 1},
513                 {"upsample",  NO_ARG,  &(parameters->upsample),  1},
514                 {"split-pnm", NO_ARG,  &(parameters->split_pnm), 1}
515         };
516
517         const char optlist[] = "i:o:r:l:x:d:t:p:"
518
519 /* UniPG>> */
520 #ifdef USE_JPWL
521                                         "W:"
522 #endif /* USE_JPWL */
523 /* <<UniPG */
524             "h"         ;
525         totlen=sizeof(long_option);
526         opj_reset_options_reading();
527         img_fol->set_out_format = 0;
528         do {
529                 c = opj_getopt_long(argc, argv,optlist,long_option,totlen);
530                 if (c == -1)
531                         break;
532                 switch (c) {
533                         case 0: /* long opt with flag */
534                                 break;
535                         case 'i':                       /* input file */
536                         {
537                                 char *infile = opj_optarg;
538                                 parameters->decod_format = infile_format(infile);
539                                 switch(parameters->decod_format) {
540                                         case J2K_CFMT:
541                                                 break;
542                                         case JP2_CFMT:
543                                                 break;
544                                         case JPT_CFMT:
545                                                 break;
546                                         case -2:
547                                                 fprintf(stderr, 
548                                                         "!! infile cannot be read: %s !!\n\n", 
549                                                         infile);
550                                                 return 1;
551                                         default:
552                                                 fprintf(stderr, 
553                             "[ERROR] Unknown input file format: %s \n"
554                             "        Known file formats are *.j2k, *.jp2, *.jpc or *.jpt\n",
555                                                         infile);
556                                                 return 1;
557                                 }
558                                 strncpy(parameters->infile, infile, sizeof(parameters->infile)-1);
559                         }
560                         break;
561                                 
562                                 /* ----------------------------------------------------- */
563
564                         case 'o':                       /* output file */
565                         {
566                                 char *outfile = opj_optarg;
567                                 parameters->cod_format = get_file_format(outfile);
568                                 switch(parameters->cod_format) {
569                                         case PGX_DFMT:
570                                                 break;
571                                         case PXM_DFMT:
572                                                 break;
573                                         case BMP_DFMT:
574                                                 break;
575                                         case TIF_DFMT:
576                                                 break;
577                                         case RAW_DFMT:
578                                                 break;
579                                         case RAWL_DFMT:
580                                                 break;
581                                         case TGA_DFMT:
582                                                 break;
583                                         case PNG_DFMT:
584                                                 break;
585                                         default:
586                                                 fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outfile);
587                                                 return 1;
588                                 }
589                                 strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1);
590                         }
591                         break;
592                         
593                                 /* ----------------------------------------------------- */
594
595                         case 'O':                       /* output format */
596                         {
597                                 char outformat[50];
598                                 char *of = opj_optarg;
599                                 sprintf(outformat,".%s",of);
600                                 img_fol->set_out_format = 1;
601                                 parameters->cod_format = get_file_format(outformat);
602                                 switch(parameters->cod_format) {
603                                         case PGX_DFMT:
604                                                 img_fol->out_format = "pgx";
605                                                 break;
606                                         case PXM_DFMT:
607                                                 img_fol->out_format = "ppm";
608                                                 break;
609                                         case BMP_DFMT:
610                                                 img_fol->out_format = "bmp";
611                                                 break;
612                                         case TIF_DFMT:
613                                                 img_fol->out_format = "tif";
614                                                 break;
615                                         case RAW_DFMT:
616                                                 img_fol->out_format = "raw";
617                                                 break;
618                                         case RAWL_DFMT:
619                                                 img_fol->out_format = "rawl";
620                                                 break;
621                                         case TGA_DFMT:
622                                                 img_fol->out_format = "raw";
623                                                 break;
624                                         case PNG_DFMT:
625                                                 img_fol->out_format = "png";
626                                                 break;
627                                         default:
628                                                 fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outformat);
629                                                 return 1;
630                                                 break;
631                                 }
632                         }
633                         break;
634
635                                 /* ----------------------------------------------------- */
636
637
638                         case 'r':               /* reduce option */
639                         {
640                                 sscanf(opj_optarg, "%u", &(parameters->core.cp_reduce));
641                         }
642                         break;
643                         
644                                 /* ----------------------------------------------------- */
645       
646
647                         case 'l':               /* layering option */
648                         {
649                                 sscanf(opj_optarg, "%u", &(parameters->core.cp_layer));
650                         }
651                         break;
652                         
653                                 /* ----------------------------------------------------- */
654
655                         case 'h':                       /* display an help description */
656                                 decode_help_display();
657                                 return 1;                               
658
659             /* ----------------------------------------------------- */
660
661                         case 'y':                       /* Image Directory path */
662                 {
663                                         img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1);
664                                         strcpy(img_fol->imgdirpath,opj_optarg);
665                                         img_fol->set_imgdir=1;
666                                 }
667                                 break;
668
669                                 /* ----------------------------------------------------- */
670
671                         case 'd':               /* Input decode ROI */
672                         {
673                                 int size_optarg = (int)strlen(opj_optarg) + 1;
674                                 char *ROI_values = (char*) malloc((size_t)size_optarg);
675                                 ROI_values[0] = '\0';
676                                 strncpy(ROI_values, opj_optarg, strlen(opj_optarg));
677                                 ROI_values[strlen(opj_optarg)] = '\0';
678                                 /*printf("ROI_values = %s [%d / %d]\n", ROI_values, strlen(ROI_values), size_optarg ); */
679                                 parse_DA_values( ROI_values, &parameters->DA_x0, &parameters->DA_y0, &parameters->DA_x1, &parameters->DA_y1);
680
681                                 free(ROI_values);
682                         }
683                         break;
684
685                         /* ----------------------------------------------------- */
686
687                         case 't':               /* Input tile index */
688                         {
689                                 sscanf(opj_optarg, "%u", &parameters->tile_index);
690                                 parameters->nb_tile_to_decode = 1;
691                         }
692                         break;
693
694                                 /* ----------------------------------------------------- */                                                             
695
696                         case 'x':                       /* Creation of index file */
697                                 {
698                                         char *index = opj_optarg;
699                                         strncpy(indexfilename, index, OPJ_PATH_LEN);
700                                 }
701                                 break;
702                                 
703                                 /* ----------------------------------------------------- */
704                         case 'p': /* Force precision */
705                                 {
706                                         if (!parse_precision(opj_optarg, parameters))
707                                         {
708                                                 return 1;
709                                         }
710                                 }
711                                 break;
712                                 /* ----------------------------------------------------- */
713                                 
714                                 /* UniPG>> */
715 #ifdef USE_JPWL
716                         
717                         case 'W':                       /* activate JPWL correction */
718                         {
719                                 char *token = NULL;
720
721                                 token = strtok(opj_optarg, ",");
722                                 while(token != NULL) {
723
724                                         /* search expected number of components */
725                                         if (*token == 'c') {
726
727                                                 static int compno;
728
729                                                 compno = JPWL_EXPECTED_COMPONENTS; /* predefined no. of components */
730
731                                                 if(sscanf(token, "c=%d", &compno) == 1) {
732                                                         /* Specified */
733                                                         if ((compno < 1) || (compno > 256)) {
734                                                                 fprintf(stderr, "ERROR -> invalid number of components c = %d\n", compno);
735                                                                 return 1;
736                                                         }
737                                                         parameters->jpwl_exp_comps = compno;
738
739                                                 } else if (!strcmp(token, "c")) {
740                                                         /* default */
741                                                         parameters->jpwl_exp_comps = compno; /* auto for default size */
742
743                                                 } else {
744                                                         fprintf(stderr, "ERROR -> invalid components specified = %s\n", token);
745                                                         return 1;
746                                                 };
747                                         }
748
749                                         /* search maximum number of tiles */
750                                         if (*token == 't') {
751
752                                                 static int tileno;
753
754                                                 tileno = JPWL_MAXIMUM_TILES; /* maximum no. of tiles */
755
756                                                 if(sscanf(token, "t=%d", &tileno) == 1) {
757                                                         /* Specified */
758                                                         if ((tileno < 1) || (tileno > JPWL_MAXIMUM_TILES)) {
759                                                                 fprintf(stderr, "ERROR -> invalid number of tiles t = %d\n", tileno);
760                                                                 return 1;
761                                                         }
762                                                         parameters->jpwl_max_tiles = tileno;
763
764                                                 } else if (!strcmp(token, "t")) {
765                                                         /* default */
766                                                         parameters->jpwl_max_tiles = tileno; /* auto for default size */
767
768                                                 } else {
769                                                         fprintf(stderr, "ERROR -> invalid tiles specified = %s\n", token);
770                                                         return 1;
771                                                 };
772                                         }
773
774                                         /* next token or bust */
775                                         token = strtok(NULL, ",");
776                                 };
777                                 parameters->jpwl_correct = OPJ_TRUE;
778                                 fprintf(stdout, "JPWL correction capability activated\n");
779                                 fprintf(stdout, "- expecting %d components\n", parameters->jpwl_exp_comps);
780                         }
781                         break;  
782 #endif /* USE_JPWL */
783 /* <<UniPG */            
784
785                                 /* ----------------------------------------------------- */
786                         
787         default:
788             fprintf(stderr, "[WARNING] An invalid option has been ignored.\n");
789             break;
790                 }
791         }while(c != -1);
792
793         /* check for possible errors */
794         if(img_fol->set_imgdir==1){
795                 if(!(parameters->infile[0]==0)){
796             fprintf(stderr, "[ERROR] options -ImgDir and -i cannot be used together.\n");
797                         return 1;
798                 }
799                 if(img_fol->set_out_format == 0){
800             fprintf(stderr, "[ERROR] When -ImgDir is used, -OutFor <FORMAT> must be used.\n");
801             fprintf(stderr, "Only one format allowed.\n"
802                             "Valid format are PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA.\n");
803                         return 1;
804                 }
805                 if(!((parameters->outfile[0] == 0))){
806             fprintf(stderr, "[ERROR] options -ImgDir and -o cannot be used together.\n");
807                         return 1;
808                 }
809         }else{
810                 if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {
811             fprintf(stderr, "[ERROR] Required parameters are missing\n"
812                             "Example: %s -i image.j2k -o image.pgm\n",argv[0]);
813             fprintf(stderr, "   Help: %s -h\n",argv[0]);
814                         return 1;
815                 }
816         }
817
818         return 0;
819 }
820
821 /* -------------------------------------------------------------------------- */
822 /**
823  * Parse decoding area input values
824  * separator = ","
825  */
826 /* -------------------------------------------------------------------------- */
827 int parse_DA_values( char* inArg, unsigned int *DA_x0, unsigned int *DA_y0, unsigned int *DA_x1, unsigned int *DA_y1)
828 {
829         int it = 0;
830         int values[4];
831         char delims[] = ",";
832         char *result = NULL;
833         result = strtok( inArg, delims );
834
835         while( (result != NULL) && (it < 4 ) ) {
836                 values[it] = atoi(result);
837                 result = strtok( NULL, delims );
838                 it++;
839         }
840
841         if (it != 4) {
842                 return EXIT_FAILURE;
843         }
844         else{
845                 *DA_x0 = (OPJ_UINT32)values[0]; *DA_y0 = (OPJ_UINT32)values[1];
846                 *DA_x1 = (OPJ_UINT32)values[2]; *DA_y1 = (OPJ_UINT32)values[3];
847                 return EXIT_SUCCESS;
848         }
849 }
850
851 OPJ_FLOAT64 opj_clock(void) {
852 #ifdef _WIN32
853         /* _WIN32: use QueryPerformance (very accurate) */
854     LARGE_INTEGER freq , t ;
855     /* freq is the clock speed of the CPU */
856     QueryPerformanceFrequency(&freq) ;
857         /* cout << "freq = " << ((double) freq.QuadPart) << endl; */
858     /* t is the high resolution performance counter (see MSDN) */
859     QueryPerformanceCounter ( & t ) ;
860         return freq.QuadPart ? (t.QuadPart / (OPJ_FLOAT64)freq.QuadPart) : 0;
861 #else
862         /* Unix or Linux: use resource usage */
863     struct rusage t;
864     OPJ_FLOAT64 procTime;
865     /* (1) Get the rusage data structure at this moment (man getrusage) */
866     getrusage(0,&t);
867     /* (2) What is the elapsed time ? - CPU time = User time + System time */
868         /* (2a) Get the seconds */
869     procTime = (OPJ_FLOAT64)(t.ru_utime.tv_sec + t.ru_stime.tv_sec);
870     /* (2b) More precisely! Get the microseconds part ! */
871     return ( procTime + (OPJ_FLOAT64)(t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6 ) ;
872 #endif
873 }
874
875 /* -------------------------------------------------------------------------- */
876
877 /**
878 sample error callback expecting a FILE* client object
879 */
880 static void error_callback(const char *msg, void *client_data) {
881         (void)client_data;
882         fprintf(stdout, "[ERROR] %s", msg);
883 }
884 /**
885 sample warning callback expecting a FILE* client object
886 */
887 static void warning_callback(const char *msg, void *client_data) {
888         (void)client_data;
889         fprintf(stdout, "[WARNING] %s", msg);
890 }
891 /**
892 sample debug callback expecting no client object
893 */
894 static void info_callback(const char *msg, void *client_data) {
895         (void)client_data;
896         fprintf(stdout, "[INFO] %s", msg);
897 }
898
899 static void set_default_parameters(opj_decompress_parameters* parameters)
900 {
901         if (parameters) {
902                 memset(parameters, 0, sizeof(opj_decompress_parameters));
903                 
904                 /* default decoding parameters (command line specific) */
905                 parameters->decod_format = -1;
906                 parameters->cod_format = -1;
907                 
908                 /* default decoding parameters (core) */
909                 opj_set_default_decoder_parameters(&(parameters->core));
910         }
911 }
912
913 static void destroy_parameters(opj_decompress_parameters* parameters)
914 {
915         if (parameters) {
916                 if (parameters->precision) {
917                         free(parameters->precision);
918                         parameters->precision = NULL;
919                 }
920         }
921 }
922
923 /* -------------------------------------------------------------------------- */
924
925 static opj_image_t* convert_gray_to_rgb(opj_image_t* original)
926 {
927         OPJ_UINT32 compno;
928         opj_image_t* l_new_image = NULL;
929         opj_image_cmptparm_t* l_new_components = NULL;
930         
931         l_new_components = (opj_image_cmptparm_t*)malloc((original->numcomps + 2U) * sizeof(opj_image_cmptparm_t));
932         if (l_new_components == NULL) {
933                 fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for RGB image!\n");
934                 opj_image_destroy(original);
935                 return NULL;
936         }
937         
938         l_new_components[0].bpp  = l_new_components[1].bpp  = l_new_components[2].bpp  = original->comps[0].bpp;
939         l_new_components[0].dx   = l_new_components[1].dx   = l_new_components[2].dx   = original->comps[0].dx;
940         l_new_components[0].dy   = l_new_components[1].dy   = l_new_components[2].dy   = original->comps[0].dy;
941         l_new_components[0].h    = l_new_components[1].h    = l_new_components[2].h    = original->comps[0].h;
942         l_new_components[0].w    = l_new_components[1].w    = l_new_components[2].w    = original->comps[0].w;
943         l_new_components[0].prec = l_new_components[1].prec = l_new_components[2].prec = original->comps[0].prec;
944         l_new_components[0].sgnd = l_new_components[1].sgnd = l_new_components[2].sgnd = original->comps[0].sgnd;
945         l_new_components[0].x0   = l_new_components[1].x0   = l_new_components[2].x0   = original->comps[0].x0;
946         l_new_components[0].y0   = l_new_components[1].y0   = l_new_components[2].y0   = original->comps[0].y0;
947         
948         for(compno = 1U; compno < original->numcomps; ++compno) {
949                 l_new_components[compno+2U].bpp  = original->comps[compno].bpp;
950                 l_new_components[compno+2U].dx   = original->comps[compno].dx;
951                 l_new_components[compno+2U].dy   = original->comps[compno].dy;
952                 l_new_components[compno+2U].h    = original->comps[compno].h;
953                 l_new_components[compno+2U].w    = original->comps[compno].w;
954                 l_new_components[compno+2U].prec = original->comps[compno].prec;
955                 l_new_components[compno+2U].sgnd = original->comps[compno].sgnd;
956                 l_new_components[compno+2U].x0   = original->comps[compno].x0;
957                 l_new_components[compno+2U].y0   = original->comps[compno].y0;
958         }
959         
960         l_new_image = opj_image_create(original->numcomps + 2U, l_new_components, OPJ_CLRSPC_SRGB);
961         free(l_new_components);
962         if (l_new_image == NULL) {
963                 fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for RGB image!\n");
964                 opj_image_destroy(original);
965                 return NULL;
966         }
967         
968         l_new_image->x0 = original->x0;
969         l_new_image->x1 = original->x1;
970         l_new_image->y0 = original->y0;
971         l_new_image->y1 = original->y1;
972         
973         l_new_image->comps[0].factor        = l_new_image->comps[1].factor        = l_new_image->comps[2].factor        = original->comps[0].factor;
974         l_new_image->comps[0].alpha         = l_new_image->comps[1].alpha         = l_new_image->comps[2].alpha         = original->comps[0].alpha;
975         l_new_image->comps[0].resno_decoded = l_new_image->comps[1].resno_decoded = l_new_image->comps[2].resno_decoded = original->comps[0].resno_decoded;
976         
977         memcpy(l_new_image->comps[0].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(OPJ_INT32));
978         memcpy(l_new_image->comps[1].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(OPJ_INT32));
979         memcpy(l_new_image->comps[2].data, original->comps[0].data, original->comps[0].w * original->comps[0].h * sizeof(OPJ_INT32));
980         
981         for(compno = 1U; compno < original->numcomps; ++compno) {
982                 l_new_image->comps[compno+2U].factor        = original->comps[compno].factor;
983                 l_new_image->comps[compno+2U].alpha         = original->comps[compno].alpha;
984                 l_new_image->comps[compno+2U].resno_decoded = original->comps[compno].resno_decoded;
985                 memcpy(l_new_image->comps[compno+2U].data, original->comps[compno].data, original->comps[compno].w * original->comps[compno].h * sizeof(OPJ_INT32));
986         }
987         opj_image_destroy(original);
988         return l_new_image;
989 }
990
991 /* -------------------------------------------------------------------------- */
992
993 static opj_image_t* upsample_image_components(opj_image_t* original)
994 {
995         opj_image_t* l_new_image = NULL;
996         opj_image_cmptparm_t* l_new_components = NULL;
997         OPJ_BOOL l_upsample_need = OPJ_FALSE;
998         OPJ_UINT32 compno;
999
1000         for (compno = 0U; compno < original->numcomps; ++compno) {
1001                 if (original->comps[compno].factor > 0U) {
1002                         fprintf(stderr, "ERROR -> opj_decompress: -upsample not supported with reduction\n");
1003                         opj_image_destroy(original);
1004                         return NULL;
1005                 }
1006                 if ((original->comps[compno].dx > 1U) || (original->comps[compno].dy > 1U)) {
1007                         l_upsample_need = OPJ_TRUE;
1008                         break;
1009                 }
1010         }
1011         if (!l_upsample_need) {
1012                 return original;
1013         }
1014         /* Upsample is needed */
1015         l_new_components = (opj_image_cmptparm_t*)malloc(original->numcomps * sizeof(opj_image_cmptparm_t));
1016         if (l_new_components == NULL) {
1017                 fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for upsampled components!\n");
1018                 opj_image_destroy(original);
1019                 return NULL;
1020         }
1021         
1022         for (compno = 0U; compno < original->numcomps; ++compno) {
1023                 opj_image_cmptparm_t* l_new_cmp = &(l_new_components[compno]);
1024                 opj_image_comp_t*     l_org_cmp = &(original->comps[compno]);
1025                 
1026                 l_new_cmp->bpp  = l_org_cmp->bpp;
1027                 l_new_cmp->prec = l_org_cmp->prec;
1028                 l_new_cmp->sgnd = l_org_cmp->sgnd;
1029                 l_new_cmp->x0   = original->x0;
1030                 l_new_cmp->y0   = original->y0;
1031                 l_new_cmp->dx   = 1;
1032                 l_new_cmp->dy   = 1;
1033                 l_new_cmp->w    = l_org_cmp->w; /* should be original->x1 - original->x0 for dx==1 */
1034                 l_new_cmp->h    = l_org_cmp->h; /* should be original->y1 - original->y0 for dy==0 */
1035                 
1036                 if (l_org_cmp->dx > 1U) {
1037                         l_new_cmp->w = original->x1 - original->x0;
1038                 }
1039                 
1040                 if (l_org_cmp->dy > 1U) {
1041                         l_new_cmp->h = original->y1 - original->y0;
1042                 }
1043         }
1044         
1045         l_new_image = opj_image_create(original->numcomps, l_new_components, original->color_space);
1046         free(l_new_components);
1047         if (l_new_image == NULL) {
1048                 fprintf(stderr, "ERROR -> opj_decompress: failed to allocate memory for upsampled components!\n");
1049                 opj_image_destroy(original);
1050                 return NULL;
1051         }
1052         
1053         l_new_image->x0 = original->x0;
1054         l_new_image->x1 = original->x1;
1055         l_new_image->y0 = original->y0;
1056         l_new_image->y1 = original->y1;
1057         
1058         for (compno = 0U; compno < original->numcomps; ++compno) {
1059                 opj_image_comp_t* l_new_cmp = &(l_new_image->comps[compno]);
1060                 opj_image_comp_t* l_org_cmp = &(original->comps[compno]);
1061                 
1062                 l_new_cmp->factor        = l_org_cmp->factor;
1063                 l_new_cmp->alpha         = l_org_cmp->alpha;
1064                 l_new_cmp->resno_decoded = l_org_cmp->resno_decoded;
1065                 
1066                 if ((l_org_cmp->dx > 1U) || (l_org_cmp->dy > 1U)) {
1067                         const OPJ_INT32* l_src = l_org_cmp->data;
1068                         OPJ_INT32*       l_dst = l_new_cmp->data;
1069                         OPJ_UINT32 y;
1070                         OPJ_UINT32 xoff, yoff;
1071                         
1072                         /* need to take into account dx & dy */
1073                         xoff = l_org_cmp->dx * l_org_cmp->x0 -  original->x0;
1074                         yoff = l_org_cmp->dy * l_org_cmp->y0 -  original->y0;
1075                         if ((xoff >= l_org_cmp->dx) || (yoff >= l_org_cmp->dy)) {
1076                                 fprintf(stderr, "ERROR -> opj_decompress: Invalid image/component parameters found when upsampling\n");
1077                                 opj_image_destroy(original);
1078                                 opj_image_destroy(l_new_image);
1079                                 return NULL;
1080                         }
1081                         
1082                         for (y = 0U; y < yoff; ++y) {
1083                                 memset(l_dst, 0U, l_new_cmp->w * sizeof(OPJ_INT32));
1084                                 l_dst += l_new_cmp->w;
1085                         }
1086                         
1087                         if(l_new_cmp->h > (l_org_cmp->dy - 1U)) { /* check substraction overflow for really small images */
1088                                 for (; y < l_new_cmp->h - (l_org_cmp->dy - 1U); y += l_org_cmp->dy) {
1089                                         OPJ_UINT32 x, dy;
1090                                         OPJ_UINT32 xorg;
1091                                         
1092                                         xorg = 0U;
1093                                         for (x = 0U; x < xoff; ++x) {
1094                                                 l_dst[x] = 0;
1095                                         }
1096                                         if (l_new_cmp->w > (l_org_cmp->dx - 1U)) { /* check substraction overflow for really small images */
1097                                                 for (; x < l_new_cmp->w - (l_org_cmp->dx - 1U); x += l_org_cmp->dx, ++xorg) {
1098                                                         OPJ_UINT32 dx;
1099                                                         for (dx = 0U; dx < l_org_cmp->dx; ++dx) {
1100                                                                 l_dst[x + dx] = l_src[xorg];
1101                                                         }
1102                                                 }
1103                                         }
1104                                         for (; x < l_new_cmp->w; ++x) {
1105                                                 l_dst[x] = l_src[xorg];
1106                                         }
1107                                         l_dst += l_new_cmp->w;
1108                                                 
1109                                         for (dy = 1U; dy < l_org_cmp->dy; ++dy) {
1110                                                 memcpy(l_dst, l_dst - l_new_cmp->w, l_new_cmp->w * sizeof(OPJ_INT32));
1111                                                 l_dst += l_new_cmp->w;
1112                                         }
1113                                         l_src += l_org_cmp->w;
1114                                 }
1115                         }
1116                         if (y < l_new_cmp->h) {
1117                                 OPJ_UINT32 x;
1118                                 OPJ_UINT32 xorg;
1119                                 
1120                                 xorg = 0U;
1121                                 for (x = 0U; x < xoff; ++x) {
1122                                         l_dst[x] = 0;
1123                                 }
1124                                 if (l_new_cmp->w > (l_org_cmp->dx - 1U)) { /* check substraction overflow for really small images */
1125                                         for (; x < l_new_cmp->w - (l_org_cmp->dx - 1U); x += l_org_cmp->dx, ++xorg) {
1126                                                 OPJ_UINT32 dx;
1127                                                 for (dx = 0U; dx < l_org_cmp->dx; ++dx) {
1128                                                         l_dst[x + dx] = l_src[xorg];
1129                                                 }
1130                                         }
1131                                 }
1132                                 for (; x < l_new_cmp->w; ++x) {
1133                                         l_dst[x] = l_src[xorg];
1134                                 }
1135                                 l_dst += l_new_cmp->w;
1136                                 ++y;
1137                                 for (; y < l_new_cmp->h; ++y) {
1138                                         memcpy(l_dst, l_dst - l_new_cmp->w, l_new_cmp->w * sizeof(OPJ_INT32));
1139                                         l_dst += l_new_cmp->w;
1140                                 }
1141                         }
1142                 }
1143                 else {
1144                         memcpy(l_new_cmp->data, l_org_cmp->data, l_org_cmp->w * l_org_cmp->h * sizeof(OPJ_INT32));
1145                 }
1146         }
1147         opj_image_destroy(original);
1148         return l_new_image;
1149 }
1150
1151 /* -------------------------------------------------------------------------- */
1152 /**
1153  * OPJ_DECOMPRESS MAIN
1154  */
1155 /* -------------------------------------------------------------------------- */
1156 int main(int argc, char **argv)
1157 {
1158         opj_decompress_parameters parameters;                   /* decompression parameters */
1159         opj_image_t* image = NULL;
1160         opj_stream_t *l_stream = NULL;                          /* Stream */
1161         opj_codec_t* l_codec = NULL;                            /* Handle to a decompressor */
1162         opj_codestream_index_t* cstr_index = NULL;
1163
1164         char indexfilename[OPJ_PATH_LEN];       /* index file name */
1165
1166         OPJ_INT32 num_images, imageno;
1167         img_fol_t img_fol;
1168         dircnt_t *dirptr = NULL;
1169   int failed = 0;
1170   OPJ_FLOAT64 t, tCumulative = 0;
1171   OPJ_UINT32 numDecompressedImages = 0;
1172
1173         /* set decoding parameters to default values */
1174         set_default_parameters(&parameters);
1175
1176         /* FIXME Initialize indexfilename and img_fol */
1177         *indexfilename = 0;
1178
1179         /* Initialize img_fol */
1180         memset(&img_fol,0,sizeof(img_fol_t));
1181
1182         /* parse input and get user encoding parameters */
1183         if(parse_cmdline_decoder(argc, argv, &parameters,&img_fol, indexfilename) == 1) {
1184                 destroy_parameters(&parameters);
1185                 return EXIT_FAILURE;
1186         }
1187
1188         /* Initialize reading of directory */
1189         if(img_fol.set_imgdir==1){      
1190                 int it_image;
1191                 num_images=get_num_images(img_fol.imgdirpath);
1192
1193                 dirptr=(dircnt_t*)malloc(sizeof(dircnt_t));
1194                 if(dirptr){
1195                         dirptr->filename_buf = (char*)malloc((size_t)num_images*OPJ_PATH_LEN*sizeof(char));     /* Stores at max 10 image file names*/
1196                         dirptr->filename = (char**) malloc((size_t)num_images*sizeof(char*));
1197
1198                         if(!dirptr->filename_buf){
1199                                 destroy_parameters(&parameters);
1200                                 return EXIT_FAILURE;
1201                         }
1202                         for(it_image=0;it_image<num_images;it_image++){
1203                                 dirptr->filename[it_image] = dirptr->filename_buf + it_image*OPJ_PATH_LEN;
1204                         }
1205                 }
1206                 if(load_images(dirptr,img_fol.imgdirpath)==1){
1207                         destroy_parameters(&parameters);
1208                         return EXIT_FAILURE;
1209                 }
1210                 if (num_images==0){
1211                         fprintf(stdout,"Folder is empty\n");
1212                         destroy_parameters(&parameters);
1213                         return EXIT_FAILURE;
1214                 }
1215         }else{
1216                 num_images=1;
1217         }
1218
1219         /*Decoding image one by one*/
1220         for(imageno = 0; imageno < num_images ; imageno++)      {
1221
1222                 fprintf(stderr,"\n");
1223
1224                 if(img_fol.set_imgdir==1){
1225                         if (get_next_file(imageno, dirptr,&img_fol, &parameters)) {
1226                                 fprintf(stderr,"skipping file...\n");
1227                                 destroy_parameters(&parameters);
1228                                 continue;
1229                         }
1230                 }
1231
1232                 /* read the input file and put it in memory */
1233                 /* ---------------------------------------- */
1234
1235                 l_stream = opj_stream_create_default_file_stream(parameters.infile,1);
1236                 if (!l_stream){
1237                         fprintf(stderr, "ERROR -> failed to create the stream from the file %s\n", parameters.infile);
1238                         destroy_parameters(&parameters);
1239                         return EXIT_FAILURE;
1240                 }
1241
1242                 /* decode the JPEG2000 stream */
1243                 /* ---------------------- */
1244
1245                 switch(parameters.decod_format) {
1246                         case J2K_CFMT:  /* JPEG-2000 codestream */
1247                         {
1248                                 /* Get a decoder handle */
1249                                 l_codec = opj_create_decompress(OPJ_CODEC_J2K);
1250                                 break;
1251                         }
1252                         case JP2_CFMT:  /* JPEG 2000 compressed image data */
1253                         {
1254                                 /* Get a decoder handle */
1255                                 l_codec = opj_create_decompress(OPJ_CODEC_JP2);
1256                                 break;
1257                         }
1258                         case JPT_CFMT:  /* JPEG 2000, JPIP */
1259                         {
1260                                 /* Get a decoder handle */
1261                                 l_codec = opj_create_decompress(OPJ_CODEC_JPT);
1262                                 break;
1263                         }
1264                         default:
1265                                 fprintf(stderr, "skipping file..\n");
1266                                 destroy_parameters(&parameters);
1267                                 opj_stream_destroy(l_stream);
1268                                 continue;
1269                 }
1270
1271                 /* catch events using our callbacks and give a local context */         
1272                 opj_set_info_handler(l_codec, info_callback,00);
1273                 opj_set_warning_handler(l_codec, warning_callback,00);
1274                 opj_set_error_handler(l_codec, error_callback,00);
1275
1276                 t = opj_clock();
1277
1278                 /* Setup the decoder decoding parameters using user parameters */
1279                 if ( !opj_setup_decoder(l_codec, &(parameters.core)) ){
1280                         fprintf(stderr, "ERROR -> opj_decompress: failed to setup the decoder\n");
1281                         destroy_parameters(&parameters);
1282                         opj_stream_destroy(l_stream);
1283                         opj_destroy_codec(l_codec);
1284                         return EXIT_FAILURE;
1285                 }
1286
1287
1288                 /* Read the main header of the codestream and if necessary the JP2 boxes*/
1289                 if(! opj_read_header(l_stream, l_codec, &image)){
1290                         fprintf(stderr, "ERROR -> opj_decompress: failed to read the header\n");
1291                         destroy_parameters(&parameters);
1292                         opj_stream_destroy(l_stream);
1293                         opj_destroy_codec(l_codec);
1294                         opj_image_destroy(image);
1295                         return EXIT_FAILURE;
1296                 }
1297
1298                 if (!parameters.nb_tile_to_decode) {
1299                         /* Optional if you want decode the entire image */
1300                         if (!opj_set_decode_area(l_codec, image, (OPJ_INT32)parameters.DA_x0,
1301                                         (OPJ_INT32)parameters.DA_y0, (OPJ_INT32)parameters.DA_x1, (OPJ_INT32)parameters.DA_y1)){
1302                                 fprintf(stderr, "ERROR -> opj_decompress: failed to set the decoded area\n");
1303                                 destroy_parameters(&parameters);
1304                                 opj_stream_destroy(l_stream);
1305                                 opj_destroy_codec(l_codec);
1306                                 opj_image_destroy(image);
1307                                 return EXIT_FAILURE;
1308                         }
1309
1310                         /* Get the decoded image */
1311                         if (!(opj_decode(l_codec, l_stream, image) && opj_end_decompress(l_codec,       l_stream))) {
1312                                 fprintf(stderr,"ERROR -> opj_decompress: failed to decode image!\n");
1313                                 destroy_parameters(&parameters);
1314                                 opj_destroy_codec(l_codec);
1315                                 opj_stream_destroy(l_stream);
1316                                 opj_image_destroy(image);
1317                                 return EXIT_FAILURE;
1318                         }
1319                 }
1320                 else {
1321
1322                         /* It is just here to illustrate how to use the resolution after set parameters */
1323                         /*if (!opj_set_decoded_resolution_factor(l_codec, 5)) {
1324                                 fprintf(stderr, "ERROR -> opj_decompress: failed to set the resolution factor tile!\n");
1325                                 opj_destroy_codec(l_codec);
1326                                 opj_stream_destroy(l_stream);
1327                                 opj_image_destroy(image);
1328                                 return EXIT_FAILURE;
1329                         }*/
1330
1331                         if (!opj_get_decoded_tile(l_codec, l_stream, image, parameters.tile_index)) {
1332                                 fprintf(stderr, "ERROR -> opj_decompress: failed to decode tile!\n");
1333                                 destroy_parameters(&parameters);
1334                                 opj_destroy_codec(l_codec);
1335                                 opj_stream_destroy(l_stream);
1336                                 opj_image_destroy(image);
1337                                 return EXIT_FAILURE;
1338                         }
1339                         fprintf(stdout, "tile %d is decoded!\n\n", parameters.tile_index);
1340                 }
1341
1342                 tCumulative += opj_clock() - t;
1343                 numDecompressedImages++;
1344
1345                 /* Close the byte stream */
1346                 opj_stream_destroy(l_stream);
1347
1348                 if(image->color_space == OPJ_CLRSPC_SYCC){
1349                         color_sycc_to_rgb(image); /* FIXME */
1350                 }
1351                 
1352                 if( image->color_space != OPJ_CLRSPC_SYCC 
1353                         && image->numcomps == 3 && image->comps[0].dx == image->comps[0].dy
1354                         && image->comps[1].dx != 1 )
1355                         image->color_space = OPJ_CLRSPC_SYCC;
1356                 else if (image->numcomps <= 2)
1357                         image->color_space = OPJ_CLRSPC_GRAY;
1358
1359                 if(image->icc_profile_buf) {
1360 #if defined(OPJ_HAVE_LIBLCMS1) || defined(OPJ_HAVE_LIBLCMS2)
1361                         color_apply_icc_profile(image); /* FIXME */
1362 #endif
1363                         free(image->icc_profile_buf);
1364                         image->icc_profile_buf = NULL; image->icc_profile_len = 0;
1365                 }
1366                 
1367                 /* Force output precision */
1368                 /* ---------------------- */
1369                 if (parameters.precision != NULL)
1370                 {
1371                         OPJ_UINT32 compno;
1372                         for (compno = 0; compno < image->numcomps; ++compno)
1373                         {
1374                                 OPJ_UINT32 precno = compno;
1375                                 OPJ_UINT32 prec;
1376                                 
1377                                 if (precno >= parameters.nb_precision) {
1378                                         precno = parameters.nb_precision - 1U;
1379                                 }
1380                                 
1381                                 prec = parameters.precision[precno].prec;
1382                                 if (prec == 0) {
1383                                         prec = image->comps[compno].prec;
1384                                 }
1385                                 
1386                                 switch (parameters.precision[precno].mode) {
1387                                         case OPJ_PREC_MODE_CLIP:
1388                                                 clip_component(&(image->comps[compno]), prec);
1389                                                 break;
1390                                         case OPJ_PREC_MODE_SCALE:
1391                                                 scale_component(&(image->comps[compno]), prec);
1392                                                 break;
1393                                         default:
1394                                                 break;
1395                                 }
1396                                 
1397                         }
1398                 }
1399                 
1400                 /* Upsample components */
1401                 /* ------------------- */
1402                 if (parameters.upsample)
1403                 {
1404                         image = upsample_image_components(image);
1405                         if (image == NULL) {
1406                                 fprintf(stderr, "ERROR -> opj_decompress: failed to upsample image components!\n");
1407                                 destroy_parameters(&parameters);
1408                                 opj_destroy_codec(l_codec);
1409                                 return EXIT_FAILURE;
1410                         }
1411                 }
1412                 
1413                 /* Force RGB output */
1414                 /* ---------------- */
1415                 if (parameters.force_rgb)
1416                 {
1417                         switch (image->color_space) {
1418                                 case OPJ_CLRSPC_SRGB:
1419                                         break;
1420                                 case OPJ_CLRSPC_GRAY:
1421                                         image = convert_gray_to_rgb(image);
1422                                         break;
1423                                 default:
1424                                         fprintf(stderr, "ERROR -> opj_decompress: don't know how to convert image to RGB colorspace!\n");
1425                                         opj_image_destroy(image);
1426                                         image = NULL;
1427                                         break;
1428                         }
1429                         if (image == NULL) {
1430                                 fprintf(stderr, "ERROR -> opj_decompress: failed to convert to RGB image!\n");
1431                                 destroy_parameters(&parameters);
1432                                 opj_destroy_codec(l_codec);
1433                                 return EXIT_FAILURE;
1434                         }
1435                 }
1436
1437                 /* create output image */
1438                 /* ------------------- */
1439                 switch (parameters.cod_format) {
1440                 case PXM_DFMT:                  /* PNM PGM PPM */
1441                         if (imagetopnm(image, parameters.outfile, parameters.split_pnm)) {
1442                 fprintf(stderr,"[ERROR] Outfile %s not generated\n",parameters.outfile);
1443         failed = 1;
1444                         }
1445                         else {
1446                 fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile);
1447                         }
1448                         break;
1449
1450                 case PGX_DFMT:                  /* PGX */
1451                         if(imagetopgx(image, parameters.outfile)){
1452                 fprintf(stderr,"[ERROR] Outfile %s not generated\n",parameters.outfile);
1453         failed = 1;
1454                         }
1455                         else {
1456                 fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile);
1457                         }
1458                         break;
1459
1460                 case BMP_DFMT:                  /* BMP */
1461                         if(imagetobmp(image, parameters.outfile)){
1462                 fprintf(stderr,"[ERROR] Outfile %s not generated\n",parameters.outfile);
1463         failed = 1;
1464                         }
1465                         else {
1466                 fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile);
1467                         }
1468                         break;
1469 #ifdef OPJ_HAVE_LIBTIFF
1470                 case TIF_DFMT:                  /* TIFF */
1471                         if(imagetotif(image, parameters.outfile)){
1472                 fprintf(stderr,"[ERROR] Outfile %s not generated\n",parameters.outfile);
1473         failed = 1;
1474                         }
1475                         else {
1476                 fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile);
1477                         }
1478                         break;
1479 #endif /* OPJ_HAVE_LIBTIFF */
1480                 case RAW_DFMT:                  /* RAW */
1481                         if(imagetoraw(image, parameters.outfile)){
1482                 fprintf(stderr,"[ERROR] Error generating raw file. Outfile %s not generated\n",parameters.outfile);
1483         failed = 1;
1484                         }
1485                         else {
1486                 fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile);
1487                         }
1488                         break;
1489
1490                 case RAWL_DFMT:                 /* RAWL */
1491                         if(imagetorawl(image, parameters.outfile)){
1492                 fprintf(stderr,"[ERROR] Error generating rawl file. Outfile %s not generated\n",parameters.outfile);
1493         failed = 1;
1494                         }
1495                         else {
1496                 fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile);
1497                         }
1498                         break;
1499
1500                 case TGA_DFMT:                  /* TGA */
1501                         if(imagetotga(image, parameters.outfile)){
1502                 fprintf(stderr,"[ERROR] Error generating tga file. Outfile %s not generated\n",parameters.outfile);
1503         failed = 1;
1504                         }
1505                         else {
1506                 fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile);
1507                         }
1508                         break;
1509 #ifdef OPJ_HAVE_LIBPNG
1510                 case PNG_DFMT:                  /* PNG */
1511                         if(imagetopng(image, parameters.outfile)){
1512                 fprintf(stderr,"[ERROR] Error generating png file. Outfile %s not generated\n",parameters.outfile);
1513         failed = 1;
1514                         }
1515                         else {
1516                 fprintf(stdout,"[INFO] Generated Outfile %s\n",parameters.outfile);
1517                         }
1518                         break;
1519 #endif /* OPJ_HAVE_LIBPNG */
1520 /* Can happen if output file is TIFF or PNG
1521  * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined
1522 */
1523                         default:
1524                 fprintf(stderr,"[ERROR] Outfile %s not generated\n",parameters.outfile);
1525         failed = 1;
1526                 }
1527
1528                 /* free remaining structures */
1529                 if (l_codec) {
1530                         opj_destroy_codec(l_codec);
1531                 }
1532
1533
1534                 /* free image data structure */
1535                 opj_image_destroy(image);
1536
1537                 /* destroy the codestream index */
1538                 opj_destroy_cstr_index(&cstr_index);
1539
1540                 if(failed) remove(parameters.outfile);
1541         }
1542         destroy_parameters(&parameters);
1543         if (numDecompressedImages)
1544                 fprintf(stdout, "decode time: %d ms \n", (int)( (tCumulative * 1000) / numDecompressedImages));
1545         //getch();
1546         return failed ? EXIT_FAILURE : EXIT_SUCCESS;
1547 }
1548 /*end main*/