3e4ca23d14cdaf67e7ea38fb24bc3238659060cb
[openjpeg.git] / src / bin / jpwl / opj_jpwl_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  * All rights reserved.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions
19  * are met:
20  * 1. Redistributions of source code must retain the above copyright
21  *    notice, this list of conditions and the following disclaimer.
22  * 2. Redistributions in binary form must reproduce the above copyright
23  *    notice, this list of conditions and the following disclaimer in the
24  *    documentation and/or other materials provided with the distribution.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
27  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38
39 #include <stdio.h>
40 #include <string.h>
41 #include <stdlib.h>
42 #include <math.h>
43
44 #ifdef _WIN32
45 #include "windirent.h"
46 #else
47 #include <dirent.h>
48 #endif /* _WIN32 */
49
50 #ifdef _WIN32
51 #include <windows.h>
52 #else
53 #include <strings.h>
54 #define _stricmp strcasecmp
55 #define _strnicmp strncasecmp
56 #endif /* _WIN32 */
57
58 #include "opj_apps_config.h"
59 #include "openjpeg.h"
60 #include "opj_getopt.h"
61 #include "convert.h"
62 #include "index.h"
63
64 #ifdef OPJ_HAVE_LIBLCMS2
65 #include <lcms2.h>
66 #endif
67 #ifdef OPJ_HAVE_LIBLCMS1
68 #include <lcms.h>
69 #endif
70 #include "color.h"
71
72 #include "format_defs.h"
73
74 typedef struct dircnt{
75         /** Buffer for holding images read from Directory*/
76         char *filename_buf;
77         /** Pointer to the buffer*/
78         char **filename;
79 }dircnt_t;
80
81
82 typedef struct img_folder{
83         /** The directory path of the folder containing input images*/
84         char *imgdirpath;
85         /** Output format*/
86         const char *out_format;
87         /** Enable option*/
88         char set_imgdir;
89         /** Enable Cod Format for output*/
90         char set_out_format;
91
92 }img_fol_t;
93
94 void decode_help_display(void) {
95         fprintf(stdout,"HELP for j2k_to_image\n----\n\n");
96         fprintf(stdout,"- the -h option displays this help information on screen\n\n");
97
98 /* UniPG>> */
99         fprintf(stdout,"List of parameters for the JPEG 2000 "
100 #ifdef USE_JPWL
101                 "+ JPWL "
102 #endif /* USE_JPWL */
103                 "decoder:\n");
104 /* <<UniPG */
105         fprintf(stdout,"\n");
106         fprintf(stdout,"\n");
107         fprintf(stdout,"  -ImgDir \n");
108         fprintf(stdout,"        Image file Directory path \n");
109         fprintf(stdout,"  -OutFor \n");
110         fprintf(stdout,"    REQUIRED only if -ImgDir is used\n");
111         fprintf(stdout,"          Need to specify only format without filename <BMP>  \n");
112         fprintf(stdout,"    Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA formats\n");
113         fprintf(stdout,"  -i <compressed file>\n");
114         fprintf(stdout,"    REQUIRED only if an Input image directory not specified\n");
115         fprintf(stdout,"    Currently accepts J2K-files, JP2-files and JPT-files. The file type\n");
116         fprintf(stdout,"    is identified based on its suffix.\n");
117         fprintf(stdout,"  -o <decompressed file>\n");
118         fprintf(stdout,"    REQUIRED\n");
119         fprintf(stdout,"    Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA files\n");
120         fprintf(stdout,"    Binary data is written to the file (not ascii). If a PGX\n");
121         fprintf(stdout,"    filename is given, there will be as many output files as there are\n");
122         fprintf(stdout,"    components: an indice starting from 0 will then be appended to the\n");
123         fprintf(stdout,"    output filename, just before the \"pgx\" extension. If a PGM filename\n");
124         fprintf(stdout,"    is given and there are more than one component, only the first component\n");
125         fprintf(stdout,"    will be written to the file.\n");
126         fprintf(stdout,"  -r <reduce factor>\n");
127         fprintf(stdout,"    Set the number of highest resolution levels to be discarded. The\n");
128         fprintf(stdout,"    image resolution is effectively divided by 2 to the power of the\n");
129         fprintf(stdout,"    number of discarded levels. The reduce factor is limited by the\n");
130         fprintf(stdout,"    smallest total number of decomposition levels among tiles.\n");
131         fprintf(stdout,"  -l <number of quality layers to decode>\n");
132         fprintf(stdout,"    Set the maximum number of quality layers to decode. If there are\n");
133         fprintf(stdout,"    less quality layers than the specified number, all the quality layers\n");
134         fprintf(stdout,"    are decoded.\n");
135         fprintf(stdout,"  -x  \n"); 
136         fprintf(stdout,"    Create an index file *.Idx (-x index_name.Idx) \n");
137         fprintf(stdout,"\n");
138 /* UniPG>> */
139 #ifdef USE_JPWL
140         fprintf(stdout,"  -W <options>\n");
141         fprintf(stdout,"    Activates the JPWL correction capability, if the codestream complies.\n");
142         fprintf(stdout,"    Options can be a comma separated list of <param=val> tokens:\n");
143         fprintf(stdout,"    c, c=numcomps\n");
144         fprintf(stdout,"       numcomps is the number of expected components in the codestream\n");
145         fprintf(stdout,"       (search of first EPB rely upon this, default is %d)\n", JPWL_EXPECTED_COMPONENTS);
146 #endif /* USE_JPWL */
147 /* <<UniPG */
148         fprintf(stdout,"\n");
149 }
150
151 /* -------------------------------------------------------------------------- */
152
153 int get_num_images(char *imgdirpath){
154         DIR *dir;
155         struct dirent* content; 
156         int num_images = 0;
157
158         /*Reading the input images from given input directory*/
159
160         dir= opendir(imgdirpath);
161         if(!dir){
162                 fprintf(stderr,"Could not open Folder %s\n",imgdirpath);
163                 return 0;
164         }
165         
166         while((content=readdir(dir))!=NULL){
167                 if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 )
168                         continue;
169                 num_images++;
170         }
171         return num_images;
172 }
173
174 int load_images(dircnt_t *dirptr, char *imgdirpath){
175         DIR *dir;
176         struct dirent* content; 
177         int i = 0;
178
179         /*Reading the input images from given input directory*/
180
181         dir= opendir(imgdirpath);
182         if(!dir){
183                 fprintf(stderr,"Could not open Folder %s\n",imgdirpath);
184                 return 1;
185         }else   {
186                 fprintf(stderr,"Folder opened successfully\n");
187         }
188         
189         while((content=readdir(dir))!=NULL){
190                 if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 )
191                         continue;
192
193                 strcpy(dirptr->filename[i],content->d_name);
194                 i++;
195         }
196         return 0;       
197 }
198
199 int get_file_format(char *filename) {
200         unsigned int i;
201         static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp","tif", "raw", "tga", "png", "j2k", "jp2", "jpt", "j2c", "jpc" };
202         static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT, J2K_CFMT };
203         char * ext = strrchr(filename, '.');
204         if (ext == NULL)
205                 return -1;
206         ext++;
207         if(ext) {
208                 for(i = 0; i < sizeof(format)/sizeof(*format); i++) {
209                         if(_strnicmp(ext, extension[i], 3) == 0) {
210                                 return format[i];
211                         }
212                 }
213         }
214
215         return -1;
216 }
217
218 char get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_dparameters_t *parameters){
219         char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN];
220         char *temp_p, temp1[OPJ_PATH_LEN]="";
221
222         strcpy(image_filename,dirptr->filename[imageno]);
223         fprintf(stderr,"File Number %d \"%s\"\n",imageno,image_filename);
224         parameters->decod_format = get_file_format(image_filename);
225         if (parameters->decod_format == -1)
226                 return 1;
227         sprintf(infilename,"%s/%s",img_fol->imgdirpath,image_filename);
228         strncpy(parameters->infile, infilename, sizeof(infilename));
229
230         /*Set output file*/
231         strcpy(temp_ofname,strtok(image_filename,"."));
232         while((temp_p = strtok(NULL,".")) != NULL){
233                 strcat(temp_ofname,temp1);
234                 sprintf(temp1,".%s",temp_p);
235         }
236         if(img_fol->set_out_format==1){
237                 sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format);
238                 strncpy(parameters->outfile, outfilename, sizeof(outfilename));
239         }
240         return 0;
241 }
242
243 /* -------------------------------------------------------------------------- */
244 int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,img_fol_t *img_fol, char *indexfilename) {
245         /* parse the command line */
246         int totlen, c;
247         opj_option_t long_option[]={
248                 {"ImgDir",REQ_ARG, NULL ,'y'},
249                 {"OutFor",REQ_ARG, NULL ,'O'},
250         };
251
252         const char optlist[] = "i:o:r:l:x:"
253
254 /* UniPG>> */
255 #ifdef USE_JPWL
256                                         "W:"
257 #endif /* USE_JPWL */
258 /* <<UniPG */
259                         "h"             ;
260         totlen=sizeof(long_option);
261         img_fol->set_out_format = 0;
262         do {
263                 c = opj_getopt_long(argc, argv,optlist,long_option,totlen);
264                 if (c == -1)
265                         break;
266                 switch (c) {
267                         case 'i':                       /* input file */
268                         {
269                                 char *infile = opj_optarg;
270                                 parameters->decod_format = get_file_format(infile);
271                                 switch(parameters->decod_format) {
272                                         case J2K_CFMT:
273                                         case JP2_CFMT:
274                                         case JPT_CFMT:
275                                                 break;
276                                         default:
277                                                 fprintf(stderr, 
278                                                         "!! Unrecognized format for infile : %s [accept only *.j2k, *.jp2, *.jpc or *.jpt] !!\n\n", 
279                                                         infile);
280                                                 return 1;
281                                 }
282                                 strncpy(parameters->infile, infile, sizeof(parameters->infile)-1);
283                         }
284                         break;
285                                 
286                                 /* ----------------------------------------------------- */
287
288                         case 'o':                       /* output file */
289                         {
290                                 char *outfile = opj_optarg;
291                                 parameters->cod_format = get_file_format(outfile);
292                                 switch(parameters->cod_format) {
293                                         case PGX_DFMT:
294                                         case PXM_DFMT:
295                                         case BMP_DFMT:
296                                         case TIF_DFMT:
297                                         case RAW_DFMT:
298                                         case TGA_DFMT:
299                                         case PNG_DFMT:
300                                                 break;
301                                         default:
302                                                 fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outfile);
303                                                 return 1;
304                                 }
305                                 strncpy(parameters->outfile, outfile, sizeof(parameters->outfile)-1);
306                         }
307                         break;
308                         
309                                 /* ----------------------------------------------------- */
310
311                         case 'O':                       /* output format */
312                         {
313                                 char outformat[50];
314                                 char *of = opj_optarg;
315                                 sprintf(outformat,".%s",of);
316                                 img_fol->set_out_format = 1;
317                                 parameters->cod_format = get_file_format(outformat);
318                                 switch(parameters->cod_format) {
319                                         case PGX_DFMT:
320                                                 img_fol->out_format = "pgx";
321                                                 break;
322                                         case PXM_DFMT:
323                                                 img_fol->out_format = "ppm";
324                                                 break;
325                                         case BMP_DFMT:
326                                                 img_fol->out_format = "bmp";
327                                                 break;
328                                         case TIF_DFMT:
329                                                 img_fol->out_format = "tif";
330                                                 break;
331                                         case RAW_DFMT:
332                                                 img_fol->out_format = "raw";
333                                                 break;
334                                         case TGA_DFMT:
335                                                 img_fol->out_format = "raw";
336                                                 break;
337                                         case PNG_DFMT:
338                                                 img_fol->out_format = "png";
339                                                 break;
340                                         default:
341                                                 fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", outformat);
342                                                 return 1;
343                                                 break;
344                                 }
345                         }
346                         break;
347
348                                 /* ----------------------------------------------------- */
349
350
351                         case 'r':               /* reduce option */
352                         {
353                                 sscanf(opj_optarg, "%d", &parameters->cp_reduce);
354                         }
355                         break;
356                         
357                                 /* ----------------------------------------------------- */
358       
359
360                         case 'l':               /* layering option */
361                         {
362                                 sscanf(opj_optarg, "%d", &parameters->cp_layer);
363                         }
364                         break;
365                         
366                                 /* ----------------------------------------------------- */
367
368                         case 'h':                       /* display an help description */
369                                 decode_help_display();
370                                 return 1;                               
371
372                                 /* ------------------------------------------------------ */
373
374                         case 'y':                       /* Image Directory path */
375                                 {
376                                         img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1);
377                                         strcpy(img_fol->imgdirpath,opj_optarg);
378                                         img_fol->set_imgdir=1;
379                                 }
380                                 break;
381                                 /* ----------------------------------------------------- */                                                             
382                         case 'x':                       /* Creation of index file */
383                                 {
384                                         char *index = opj_optarg;
385                                         strncpy(indexfilename, index, OPJ_PATH_LEN);
386                                 }
387                                 break;
388                                 /* ----------------------------------------------------- */
389                                 /* UniPG>> */
390 #ifdef USE_JPWL
391                         
392                         case 'W':                       /* activate JPWL correction */
393                         {
394                                 char *token = NULL;
395
396                                 token = strtok(opj_optarg, ",");
397                                 while(token != NULL) {
398
399                                         /* search expected number of components */
400                                         if (*token == 'c') {
401
402                                                 static int compno;
403
404                                                 compno = JPWL_EXPECTED_COMPONENTS; /* predefined no. of components */
405
406                                                 if(sscanf(token, "c=%d", &compno) == 1) {
407                                                         /* Specified */
408                                                         if ((compno < 1) || (compno > 256)) {
409                                                                 fprintf(stderr, "ERROR -> invalid number of components c = %d\n", compno);
410                                                                 return 1;
411                                                         }
412                                                         parameters->jpwl_exp_comps = compno;
413
414                                                 } else if (!strcmp(token, "c")) {
415                                                         /* default */
416                                                         parameters->jpwl_exp_comps = compno; /* auto for default size */
417
418                                                 } else {
419                                                         fprintf(stderr, "ERROR -> invalid components specified = %s\n", token);
420                                                         return 1;
421                                                 };
422                                         }
423
424                                         /* search maximum number of tiles */
425                                         if (*token == 't') {
426
427                                                 static int tileno;
428
429                                                 tileno = JPWL_MAXIMUM_TILES; /* maximum no. of tiles */
430
431                                                 if(sscanf(token, "t=%d", &tileno) == 1) {
432                                                         /* Specified */
433                                                         if ((tileno < 1) || (tileno > JPWL_MAXIMUM_TILES)) {
434                                                                 fprintf(stderr, "ERROR -> invalid number of tiles t = %d\n", tileno);
435                                                                 return 1;
436                                                         }
437                                                         parameters->jpwl_max_tiles = tileno;
438
439                                                 } else if (!strcmp(token, "t")) {
440                                                         /* default */
441                                                         parameters->jpwl_max_tiles = tileno; /* auto for default size */
442
443                                                 } else {
444                                                         fprintf(stderr, "ERROR -> invalid tiles specified = %s\n", token);
445                                                         return 1;
446                                                 };
447                                         }
448
449                                         /* next token or bust */
450                                         token = strtok(NULL, ",");
451                                 };
452                                 parameters->jpwl_correct = OPJ_TRUE;
453                                 fprintf(stdout, "JPWL correction capability activated\n");
454                                 fprintf(stdout, "- expecting %d components\n", parameters->jpwl_exp_comps);
455                         }
456                         break;  
457 #endif /* USE_JPWL */
458 /* <<UniPG */            
459
460                                 /* ----------------------------------------------------- */
461                         
462                         default:
463                                 fprintf(stderr,"WARNING -> this option is not valid \"-%c %s\"\n",c, opj_optarg);
464                                 break;
465                 }
466         }while(c != -1);
467
468         /* check for possible errors */
469         if(img_fol->set_imgdir==1){
470                 if(!(parameters->infile[0]==0)){
471                         fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n");
472                         return 1;
473                 }
474                 if(img_fol->set_out_format == 0){
475                         fprintf(stderr, "Error: When -ImgDir is used, -OutFor <FORMAT> must be used !!\n");
476                         fprintf(stderr, "Only one format allowed! Valid format PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA!!\n");
477                         return 1;
478                 }
479                 if(!((parameters->outfile[0] == 0))){
480                         fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n");
481                         return 1;
482                 }
483         }else{
484                 if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {
485                         fprintf(stderr, "Example: %s -i image.j2k -o image.pgm\n",argv[0]);
486                         fprintf(stderr, "    Try: %s -h\n",argv[0]);
487                         return 1;
488                 }
489         }
490
491         return 0;
492 }
493
494 /* -------------------------------------------------------------------------- */
495
496 /**
497 sample error callback expecting a FILE* client object
498 */
499 void error_callback(const char *msg, void *client_data) {
500         FILE *stream = (FILE*)client_data;
501         fprintf(stream, "[ERROR] %s", msg);
502 }
503 /**
504 sample warning callback expecting a FILE* client object
505 */
506 void warning_callback(const char *msg, void *client_data) {
507         FILE *stream = (FILE*)client_data;
508         fprintf(stream, "[WARNING] %s", msg);
509 }
510 /**
511 sample debug callback expecting no client object
512 */
513 void info_callback(const char *msg, void *client_data) {
514         (void)client_data;
515         fprintf(stdout, "[INFO] %s", msg);
516 }
517
518 /* -------------------------------------------------------------------------- */
519
520 int main(int argc, char **argv) {
521         opj_dparameters_t parameters;   /* decompression parameters */
522         img_fol_t img_fol;
523         opj_event_mgr_t event_mgr;              /* event manager */
524         opj_image_t *image = NULL;
525         FILE *fsrc = NULL;
526         unsigned char *src = NULL;
527         int file_length;
528         int num_images;
529         int i,imageno;
530         dircnt_t *dirptr = NULL;
531         opj_dinfo_t* dinfo = NULL;      /* handle to a decompressor */
532         opj_cio_t *cio = NULL;
533         opj_codestream_info_t cstr_info;  /* Codestream information structure */
534         char indexfilename[OPJ_PATH_LEN];       /* index file name */
535
536         /* configure the event callbacks (not required) */
537         memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
538         event_mgr.error_handler = error_callback;
539         event_mgr.warning_handler = warning_callback;
540         event_mgr.info_handler = info_callback;
541
542         /* set decoding parameters to default values */
543         opj_set_default_decoder_parameters(&parameters);
544
545         /* Initialize indexfilename and img_fol */
546         *indexfilename = 0;
547         memset(&img_fol,0,sizeof(img_fol_t));
548
549         /* parse input and get user encoding parameters */
550         if(parse_cmdline_decoder(argc, argv, &parameters,&img_fol, indexfilename) == 1) {
551                 return 1;
552         }
553
554         /* Initialize reading of directory */
555         if(img_fol.set_imgdir==1){      
556                 num_images=get_num_images(img_fol.imgdirpath);
557
558                 dirptr=(dircnt_t*)malloc(sizeof(dircnt_t));
559                 if(dirptr){
560                         dirptr->filename_buf = (char*)malloc(num_images*OPJ_PATH_LEN*sizeof(char));     /* Stores at max 10 image file names*/
561                         dirptr->filename = (char**) malloc(num_images*sizeof(char*));
562
563                         if(!dirptr->filename_buf){
564                                 return 1;
565                         }
566                         for(i=0;i<num_images;i++){
567                                 dirptr->filename[i] = dirptr->filename_buf + i*OPJ_PATH_LEN;
568                         }
569                 }
570                 if(load_images(dirptr,img_fol.imgdirpath)==1){
571                         return 1;
572                 }
573                 if (num_images==0){
574                         fprintf(stdout,"Folder is empty\n");
575                         return 1;
576                 }
577         }else{
578                 num_images=1;
579         }
580
581         /*Encoding image one by one*/
582         for(imageno = 0; imageno < num_images ; imageno++)      {
583                 image = NULL;
584                 fprintf(stderr,"\n");
585
586                 if(img_fol.set_imgdir==1){
587                         if (get_next_file(imageno, dirptr,&img_fol, &parameters)) {
588                                 fprintf(stderr,"skipping file...\n");
589                                 continue;
590                         }
591                 }
592
593                 /* read the input file and put it in memory */
594                 /* ---------------------------------------- */
595                 fsrc = fopen(parameters.infile, "rb");
596                 if (!fsrc) {
597                         fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile);
598                         return 1;
599                 }
600                 fseek(fsrc, 0, SEEK_END);
601                 file_length = ftell(fsrc);
602                 fseek(fsrc, 0, SEEK_SET);
603                 src = (unsigned char *) malloc(file_length);
604                 if (fread(src, 1, file_length, fsrc) != (size_t)file_length)
605                 {
606                         free(src);
607                         fclose(fsrc);
608                         fprintf(stderr, "\nERROR: fread return a number of element different from the expected.\n");
609                         return 1;
610                 }
611                 fclose(fsrc);
612
613                 /* decode the code-stream */
614                 /* ---------------------- */
615
616                 switch(parameters.decod_format) {
617                 case J2K_CFMT:
618                 {
619                         /* JPEG-2000 codestream */
620
621                         /* get a decoder handle */
622                         dinfo = opj_create_decompress(CODEC_J2K);
623
624                         /* catch events using our callbacks and give a local context */
625                         opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
626
627                         /* setup the decoder decoding parameters using user parameters */
628                         opj_setup_decoder(dinfo, &parameters);
629
630                         /* open a byte stream */
631                         cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
632
633                         /* decode the stream and fill the image structure */
634                         if (*indexfilename)                             /* If need to extract codestream information*/
635                                 image = opj_decode_with_info(dinfo, cio, &cstr_info);
636                         else
637                                 image = opj_decode(dinfo, cio);
638                         if(!image) {
639                                 fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
640                                 opj_destroy_decompress(dinfo);
641                                 opj_cio_close(cio);
642                                 free(src);
643                                 return 1;
644                         }
645
646                         /* close the byte stream */
647                         opj_cio_close(cio);
648
649                         /* Write the index to disk */
650                         if (*indexfilename) {
651                                 opj_bool bSuccess;
652                                 bSuccess = write_index_file(&cstr_info, indexfilename);
653                                 if (bSuccess) {
654                                         fprintf(stderr, "Failed to output index file\n");
655                                 }
656                         }
657                 }
658                 break;
659
660                 case JP2_CFMT:
661                 {
662                         /* JPEG 2000 compressed image data */
663
664                         /* get a decoder handle */
665                         dinfo = opj_create_decompress(CODEC_JP2);
666
667                         /* catch events using our callbacks and give a local context */
668                         opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
669
670                         /* setup the decoder decoding parameters using the current image and user parameters */
671                         opj_setup_decoder(dinfo, &parameters);
672
673                         /* open a byte stream */
674                         cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
675
676                         /* decode the stream and fill the image structure */
677                         if (*indexfilename)                             /* If need to extract codestream information*/
678                                 image = opj_decode_with_info(dinfo, cio, &cstr_info);
679                         else
680                                 image = opj_decode(dinfo, cio);                 
681                         if(!image) {
682                                 fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
683                                 opj_destroy_decompress(dinfo);
684                                 opj_cio_close(cio);
685                                 free(src);
686                                 return 1;
687                         }
688
689                         /* close the byte stream */
690                         opj_cio_close(cio);
691
692                         /* Write the index to disk */
693                         if (*indexfilename) {
694                                 opj_bool bSuccess;
695                                 bSuccess = write_index_file(&cstr_info, indexfilename);
696                                 if (bSuccess) {
697                                         fprintf(stderr, "Failed to output index file\n");
698                                 }
699                         }
700                 }
701                 break;
702
703                 case JPT_CFMT:
704                 {
705                         /* JPEG 2000, JPIP */
706
707                         /* get a decoder handle */
708                         dinfo = opj_create_decompress(CODEC_JPT);
709
710                         /* catch events using our callbacks and give a local context */
711                         opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);
712
713                         /* setup the decoder decoding parameters using user parameters */
714                         opj_setup_decoder(dinfo, &parameters);
715
716                         /* open a byte stream */
717                         cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length);
718
719                         /* decode the stream and fill the image structure */
720                         if (*indexfilename)                             /* If need to extract codestream information*/
721                                 image = opj_decode_with_info(dinfo, cio, &cstr_info);
722                         else
723                                 image = opj_decode(dinfo, cio);
724                         if(!image) {
725                                 fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n");
726                                 opj_destroy_decompress(dinfo);
727                                 opj_cio_close(cio);
728                                 free(src);
729                                 return 1;
730                         }
731
732                         /* close the byte stream */
733                         opj_cio_close(cio);
734
735                         /* Write the index to disk */
736                         if (*indexfilename) {
737                                 opj_bool bSuccess;
738                                 bSuccess = write_index_file(&cstr_info, indexfilename);
739                                 if (bSuccess) {
740                                         fprintf(stderr, "Failed to output index file\n");
741                                 }
742                         }
743                 }
744                 break;
745
746                 default:
747                         fprintf(stderr, "skipping file..\n");
748                         continue;
749         }
750
751                 /* free the memory containing the code-stream */
752                 free(src);
753                 src = NULL;
754
755         if(image->color_space == CLRSPC_SYCC)
756    {
757         color_sycc_to_rgb(image);
758    }
759
760         if(image->icc_profile_buf)
761    {
762 #if defined(OPJ_HAVE_LIBLCMS1) || defined(OPJ_HAVE_LIBLCMS2)
763         color_apply_icc_profile(image);
764 #endif
765
766         free(image->icc_profile_buf);
767         image->icc_profile_buf = NULL; image->icc_profile_len = 0;
768    }
769
770                 /* create output image */
771                 /* ------------------- */
772                 switch (parameters.cod_format) {
773                 case PXM_DFMT:                  /* PNM PGM PPM */
774                         if (imagetopnm(image, parameters.outfile)) {
775                                 fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
776                         }
777                         else {
778                                 fprintf(stdout,"Generated Outfile %s\n",parameters.outfile);
779                         }
780                         break;
781
782                 case PGX_DFMT:                  /* PGX */
783                         if(imagetopgx(image, parameters.outfile)){
784                                 fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
785                         }
786                         else {
787                                 fprintf(stdout,"Generated Outfile %s\n",parameters.outfile);
788                         }
789                         break;
790
791                 case BMP_DFMT:                  /* BMP */
792                         if(imagetobmp(image, parameters.outfile)){
793                                 fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
794                         }
795                         else {
796                                 fprintf(stdout,"Generated Outfile %s\n",parameters.outfile);
797                         }
798                         break;
799 #ifdef OPJ_HAVE_LIBTIFF
800                 case TIF_DFMT:                  /* TIFF */
801                         if(imagetotif(image, parameters.outfile)){
802                                 fprintf(stdout,"Outfile %s not generated\n",parameters.outfile);
803                         }
804                         else {
805                                 fprintf(stdout,"Generated Outfile %s\n",parameters.outfile);
806                         }
807                         break;
808 #endif /* OPJ_HAVE_LIBTIFF */
809                 case RAW_DFMT:                  /* RAW */
810                         if(imagetoraw(image, parameters.outfile)){
811                                 fprintf(stdout,"Error generating raw file. Outfile %s not generated\n",parameters.outfile);
812                         }
813                         else {
814                                 fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile);
815                         }
816                         break;
817
818                 case TGA_DFMT:                  /* TGA */
819                         if(imagetotga(image, parameters.outfile)){
820                                 fprintf(stdout,"Error generating tga file. Outfile %s not generated\n",parameters.outfile);
821                         }
822                         else {
823                                 fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile);
824                         }
825                         break;
826 #ifdef OPJ_HAVE_LIBPNG
827                 case PNG_DFMT:                  /* PNG */
828                         if(imagetopng(image, parameters.outfile)){
829                                 fprintf(stdout,"Error generating png file. Outfile %s not generated\n",parameters.outfile);
830                         }
831                         else {
832                                 fprintf(stdout,"Successfully generated Outfile %s\n",parameters.outfile);
833                         }
834                         break;
835 #endif /* OPJ_HAVE_LIBPNG */
836 /* Can happen if output file is TIFF or PNG
837  * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined
838 */
839                         default:
840                                 fprintf(stderr,"Outfile %s not generated\n",parameters.outfile);
841                 }
842
843                 /* free remaining structures */
844                 if(dinfo) {
845                         opj_destroy_decompress(dinfo);
846                 }
847                 /* free codestream information structure */
848                 if (*indexfilename)     
849                         opj_destroy_cstr_info(&cstr_info);
850                 /* free image data structure */
851                 opj_image_destroy(image);
852
853         }
854         return 0;
855 }
856 /*end main*/
857
858
859
860