]> granicus.if.org Git - openjpeg/commitdiff
Option to read images from a Folder whose path is specified in the Input parameters...
authorParvatha Elangovan <p.elangovan@intopix.com>
Mon, 26 Feb 2007 15:40:01 +0000 (15:40 +0000)
committerParvatha Elangovan <p.elangovan@intopix.com>
Mon, 26 Feb 2007 15:40:01 +0000 (15:40 +0000)
Enabling use of multi character input parameters in the codec. Modifications in image_to_j2k.c, j2k_to_image.c, getopt.c, getopt.h

ChangeLog
codec/compat/getopt.c
codec/compat/getopt.h
codec/image_to_j2k.c
codec/j2k_to_image.c

index da3e97c2ee4c8d389c4db190841f8e1497bc211a..13778a1460705d08f3d7b53d11b92fc0065c69fb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,10 @@ What's New for OpenJPEG
 ! : changed
 + : added
 
+February 26, 2007
++ [Parvatha] Option to read images from a Folder whose path is specified in the Input parameters by "-ImgDir" along with output decod format specified by "-OutFor" . Modifications in image_to_j2k.c, j2k_to_image.c, getopt.c, getopt.h
++ [Parvatha] Enabling use of multi character input parameters in the codec. Modifications in image_to_j2k.c, j2k_to_image.c, getopt.c, getopt.h
+
 February 23, 2007
 * [GB] Fixed a copy-and-paste type assignment error (bool instead of int) in the JPWL section of decoder parameters structure in openjpeg.h; minor type-casting in jpwl_lib.c. As a result, now OPJViewer should run correctly when built against the most current SVN trunk of LibOpenJPEG.lib
 * [FOD] Changed version number from 1.1.0 to 1.1.1 in openjpeg.h
index ffc921bdc778a64f1d704eae71b40e4cacc92b13..426095b56fa689c3582ddf3ad054caf3d53b6153 100644 (file)
@@ -47,10 +47,36 @@ int opterr = 1,                     /* if error message should be printed */
  optreset;                     /* reset getopt */
 const char *optarg;                    /* argument associated with option */
 
+typedef struct option
+{
+       char *name;
+       int has_arg;
+       int *flag;
+       int val;
+}option_t;
+
 #define        BADCH   (int)'?'
 #define        BADARG  (int)':'
 #define        EMSG    ""
 
+
+
+static void getopterror(int which) {
+       static char error1[]="Unknown option `-x'.\n";
+       static char error2[]="Missing argument for `-x'.\n";
+       if (opterr) {
+               if (which) {
+                       error2[23]=optopt;
+                       fprintf(stderr,"%s\n",error2);
+                       
+               } else {
+                       error1[17]=optopt;
+                       fprintf(stderr,"%s\n",error1);
+               }
+       }
+}
+
+
 /*
  * getopt --
  *     Parse argc/argv argument vector.
@@ -110,3 +136,110 @@ int getopt(int nargc, char *const *nargv, const char *ostr) {
   }
   return (optopt);             /* dump back option letter */
 }
+
+
+int getopt_long(int argc, char * const argv[], const char *optstring,
+struct option *longopts, int *longindex, int totlen) {
+       static int lastidx,lastofs;
+       char *tmp;
+       int i,len;
+again:
+       if (optind>argc || !argv[optind] || *argv[optind]!='-' || argv[optind][1]==0)
+               return -1;
+
+       if (argv[optind][0]=='-' && argv[optind][1]==0) {
+               ++optind;
+               return -1;
+       }
+
+       if (argv[optind][0]=='-') {     /* long option */
+               char* arg=argv[optind]+1;
+               char* max=strchr(arg,'=');
+               const struct option* o;
+               if (!max) max=arg+strlen(arg);
+               o=longopts;
+               len=sizeof(longopts[0]);
+
+               for (i=0;i<totlen;i=i+len,o++) {
+                       if (!strncmp(o->name,arg,(size_t)(max-arg))) {  /* match */
+                               if (longindex) *longindex=o-longopts;
+                               if (o->has_arg>0) {
+                                       if (*max=='=')
+                                               optarg=max+1;
+                                       else {
+                                               optarg=argv[optind+1];
+                                               if(optarg){
+                                                       if (strchr(optarg,'-')){ /* No argument */
+                                                               if (*optstring==':') return ':';
+                                                               if (opterr)
+                                                               (void) fprintf(stderr,"%s: option requires an argument %c\n",arg, optopt);
+                                                               return (BADCH);
+                                                               ++optind;
+                                                       }
+                                               }
+                                               if (!optarg && o->has_arg==1) { /* no argument there */
+                                                       if (*optstring==':') return ':';
+                                                       if (opterr)
+                                                       (void) fprintf(stderr,"%s: option requires an argument %c\n",arg, optopt);
+                                                       return (BADCH);
+                                                       ++optind;
+                                               }
+                                               ++optind;
+                                       }
+                               }
+                               ++optind;
+                               if (o->flag)
+                                       *(o->flag)=o->val;
+                               else
+                                       return o->val;
+                               return 0;
+                       }
+               }//(end for)
+
+               if (*optstring==':') return ':';
+
+               if (lastidx!=optind) {
+                       lastidx=optind; lastofs=0;
+               }
+               optopt=argv[optind][lastofs+1];
+
+               if ((tmp=strchr(optstring,optopt))) {
+                       if (*tmp==0) {  /* apparently, we looked for \0, i.e. end of argument */
+                               ++optind;
+                               goto again;
+                       }
+
+                       if (tmp[1]==':') {      /* argument expected */
+                               if (tmp[2]==':' || argv[optind][lastofs+2]) {   /* "-foo", return "oo" as optarg */
+                                       if (!*(optarg=argv[optind]+lastofs+2)) optarg=0;
+                                       goto found;
+                               }
+
+                               optarg=argv[optind+1];
+                               if (!optarg) {  /* missing argument */
+                                       ++optind;
+                                       if (*optstring==':') return ':';
+                                       getopterror(1);
+                                       return ':';
+                               }
+                               ++optind;
+                       }
+                       else {
+                               ++lastofs;
+                               return optopt;
+                       }
+found:
+                       ++optind;
+                       return optopt;
+               } 
+               else {  /* not found */
+                       getopterror(0);
+                       ++optind;
+                       return '?';
+               }
+               
+               fprintf(stderr,"Invalid option %s\n",arg);
+               ++optind;
+               return '?';
+       }// end of long option
+}
index ab9c1a7bd6913e937184141cab94fa9148432265..4492e850c1de3b4cb4a1c086e7f865430d2b9e45 100644 (file)
@@ -3,6 +3,18 @@
 #ifndef _GETOPT_H_
 #define _GETOPT_H_
 
+typedef struct option
+{
+       char *name;
+       int has_arg;
+       int *flag;
+       int val;
+}option_t;
+
+#define        NO_ARG  0
+#define REQ_ARG        1
+#define OPT_ARG        2
+
 extern int opterr;
 extern int optind;
 extern int optopt;
@@ -10,5 +22,8 @@ extern int optreset;
 extern char *optarg;
 
 extern int getopt(int nargc, char *const *nargv, const char *ostr);
+extern int getopt_long(int argc, char * const argv[], const char *optstring,
+                       const struct option *longopts, int *longindex,int totlen);
+
 
 #endif                         /* _GETOPT_H_ */
index a41f077a8f7b7199a11db027e50325155b4eca8a..70c8de56909612fa47172b94cdc67b87c249bf65 100644 (file)
@@ -35,6 +35,7 @@
 #include "openjpeg.h"
 #include "compat/getopt.h"
 #include "convert.h"
+#include "dirent.h"
 
 #ifndef WIN32
 #define stricmp strcasecmp
 #define J2K_CFMT 0
 #define JP2_CFMT 1
 #define JPT_CFMT 2
-#define MJ2_CFMT 3
-#define PXM_DFMT 0
-#define PGX_DFMT 1
-#define BMP_DFMT 2
-#define YUV_DFMT 3
+
+#define PXM_DFMT 10
+#define PGX_DFMT 11
+#define BMP_DFMT 12
+#define YUV_DFMT 13
 
 /* ----------------------------------------------------------------------- */
 
+typedef struct dircnt{
+       /** Buffer for holding images read from Directory*/
+       char *filename_buf;
+       /** Pointer to the buffer*/
+       char **filename;
+}dircnt_t;
+
+typedef struct img_folder{
+       /** The directory path of the folder containing input images*/
+       char *imgdirpath;
+       /** Output format*/
+       char *out_format;
+       /** Enable option*/
+       char set_imgdir;
+       /** Enable Cod Format for output*/
+       char set_out_format;
+
+}img_fol_t;
+
 void encode_help_display() {
        fprintf(stdout,"HELP\n----\n\n");
        fprintf(stdout,"- the -h option displays this help information on screen\n\n");
@@ -105,6 +125,13 @@ void encode_help_display() {
        fprintf(stdout,"\n");
        fprintf(stdout,"Required Parameters (except with -h):\n");
        fprintf(stdout,"\n");
+       fprintf(stdout,"-ImgDir      : Image file Directory path (example ../Images) \n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"-OutFor \n");
+       fprintf(stdout,"    REQUIRED only if -ImgDir is used\n");
+       fprintf(stdout,"          Need to specify only format without filename <BMP>  \n");
+       fprintf(stdout,"    Currently accepts PGM, PPM, PNM, PGX, BMP format\n");
+       fprintf(stdout,"\n");
        fprintf(stdout,"-i           : source file  (-i source.pnm also *.pgm, *.ppm) \n");
        fprintf(stdout,"\n");
        fprintf(stdout,"-o           : destination file (-o dest.j2k or .jp2) \n");
@@ -279,6 +306,53 @@ OPJ_PROG_ORDER give_progression(char progression[4]) {
        return PROG_UNKNOWN;
 }
 
+int get_num_images(char *imgdirpath){
+       DIR *dir;
+       struct dirent* content; 
+       int num_images = 0;
+
+       /*Reading the input images from given input directory*/
+
+       dir= opendir(imgdirpath);
+       if(!dir){
+               fprintf(stderr,"Could not open Folder %s\n",imgdirpath);
+               return 0;
+       }
+
+       num_images=0;
+       while((content=readdir(dir))!=NULL){
+               if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 )
+                       continue;
+               num_images++;
+       }
+       return num_images;
+}
+
+int load_images(dircnt_t *dirptr, char *imgdirpath){
+       DIR *dir;
+       struct dirent* content; 
+       int i = 0;
+
+       /*Reading the input images from given input directory*/
+
+       dir= opendir(imgdirpath);
+       if(!dir){
+               fprintf(stderr,"Could not open Folder %s\n",imgdirpath);
+               return 1;
+       }else   {
+               fprintf(stderr,"Folder opened successfully\n");
+       }
+
+       while((content=readdir(dir))!=NULL){
+               if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 )
+                       continue;
+
+               strcpy(dirptr->filename[i],content->d_name);
+               i++;
+       }
+       return 0;       
+}
+
 int get_file_format(char *filename) {
        unsigned int i;
        static const char *extension[] = {
@@ -297,10 +371,47 @@ int get_file_format(char *filename) {
        return -1;
 }
 
-/* -------------------------------------------------------------------------*/
+char * get_file_name(char *name){
+       char *fname;
+       fname= (char*)malloc(OPJ_PATH_LEN*sizeof(char));
+       fname= strtok(name,".");
+       return fname;
+}
+
+get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_cparameters_t *parameters){
+       char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN];
+
+       strcpy(image_filename,dirptr->filename[imageno]);
+       fprintf(stderr,"Image Number %d \"%s\"\n",imageno,image_filename);
+       parameters->decod_format = get_file_format(image_filename);
+       sprintf(infilename,"%s/%s",img_fol->imgdirpath,image_filename);
+       strncpy(parameters->infile, infilename, sizeof(infilename));
+
+       //Set output file
+       strcpy(temp_ofname,get_file_name(image_filename));
+       if(img_fol->set_out_format==1){
+               sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format);
+               strncpy(parameters->outfile, outfilename, sizeof(outfilename));
+       }
+
+}
+
+
+
 
-int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters) {
-       int i, j;
+/* ------------------------------------------------------------------------------------ */
+
+int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,img_fol_t *img_fol) {
+       int i, j,totlen;
+       option_t long_option[]={
+               {"DCI",NO_ARG, NULL ,'z'},
+               {"ImgDir",REQ_ARG, NULL ,'y'},
+               {"fps",REQ_ARG, NULL ,'w'},
+               {"TP",REQ_ARG, NULL ,'v'},
+               {"SOP",NO_ARG, NULL ,'S'},
+               {"EPH",NO_ARG, NULL ,'E'},
+               {"OutFor",REQ_ARG, NULL ,'O'},
+       };
 
        /* parse the command line */
 /* UniPG>> */
@@ -310,8 +421,11 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters)
 #endif /* USE_JPWL */
                ;
 
+       totlen=sizeof(long_option);
+       img_fol->set_out_format=0;
+
        while (1) {
-               int c = getopt(argc, argv, optlist);
+    int c = getopt_long(argc, argv, optlist,long_option,NULL,totlen);
 /* <<UniPG */
                if (c == -1)
                        break;
@@ -355,6 +469,30 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters)
                        break;
 
                                /* ----------------------------------------------------- */
+                       case 'O':                       /* output file */
+                               {
+                                       char outformat[50];
+                                       char *of = optarg;
+                                       sprintf(outformat,".%s",of);
+                                       img_fol->set_out_format = 1;
+                                       parameters->cod_format = get_file_format(outformat);
+                                       switch(parameters->cod_format) {
+                       case J2K_CFMT:
+                               img_fol->out_format = "j2k";
+                               break;
+                       case JP2_CFMT:
+                               img_fol->out_format = "jp2";
+                               break;
+                       default:
+                               fprintf(stderr, "Unknown output format image %s [only j2k, jp2]!! \n");
+                               return 1;
+                                       }
+                               }
+                               break;
+
+
+                               /* ----------------------------------------------------- */
+
 
                        case 'r':                       /* rates rates/distorsion */
                        {
@@ -657,6 +795,18 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters)
                        }
                        break;
 
+                               /* ------------------------------------------------------ */
+
+                       case 'y':                       /* Image Directory path */
+                               {
+                                       img_fol->imgdirpath = (char*)malloc(strlen(optarg) + 1);
+                                       strcpy(img_fol->imgdirpath,optarg);
+                                       img_fol->set_imgdir=1;
+                               }
+                               break;
+
+
+                               /* ------------------------------------------------------ */
 /* UniPG>> */
 #ifdef USE_JPWL
                                /* ------------------------------------------------------ */
@@ -990,10 +1140,28 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters)
        }
 
        /* check for possible errors */
-
-       if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {
-               fprintf(stderr, "usage: image_to_j2k -i image-file -o j2k/jp2-file (+ options)\n");
-               return 1;
+       if(img_fol->set_imgdir==1){
+               if(!(parameters->infile[0]==0)){
+                       fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n");
+                       return 1;
+               }
+               if(img_fol->set_out_format == 0){
+                       fprintf(stderr, "Error: When -ImgDir is used, -OutFor <FORMAT> must be used !!\n");
+                       fprintf(stderr, "Only one format allowed! Valid format PGM, PPM, PNM, PGX,BMP!!\n");
+                       return 1;
+               }
+               if(!((parameters->outfile[0] == 0))){
+                       fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n");
+                       fprintf(stderr, "Specify OutputFormat using -OutFor<FORMAT> !!\n");
+                       return 1;
+               }
+       }else{
+               if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {
+                       fprintf(stderr, "Error: One of the options; -i or -ImgDir must be specified\n");
+                       fprintf(stderr, "Error: When using -i; -o must be used\n");
+                       fprintf(stderr, "usage: image_to_j2k -i image-file -o j2k/jp2-file (+ options)\n");
+                       return 1;
+               }
        }
 
        if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || parameters->cp_fixed_quality)
@@ -1056,8 +1224,13 @@ void info_callback(const char *msg, void *client_data) {
 int main(int argc, char **argv) {
        bool bSuccess;
        opj_cparameters_t parameters;   /* compression parameters */
+       img_fol_t img_fol;
        opj_event_mgr_t event_mgr;              /* event manager */
        opj_image_t *image = NULL;
+       int i,num_images;
+       int imageno;
+       char process_file = 1;
+       dircnt_t *dirptr;
 
        /*
        configure the event callbacks (not required)
@@ -1072,10 +1245,11 @@ int main(int argc, char **argv) {
        opj_set_default_encoder_parameters(&parameters);
 
        /* parse input and get user encoding parameters */
-       if(parse_cmdline_encoder(argc, argv, &parameters) == 1) {
+       if(parse_cmdline_encoder(argc, argv, &parameters,&img_fol) == 1) {
                return 0;
        }
 
+       /* Create comment for codestream */
        if(parameters.cp_comment == NULL) {
     const char comment[] = "Created by OpenJPEG version ";
                const size_t clen = strlen(comment);
@@ -1092,131 +1266,188 @@ int main(int argc, char **argv) {
 
        }
 
-       /* decode the source image */
-       /* ----------------------- */
+       /* Read directory if necessary */
 
-       switch (parameters.decod_format) {
-               case PGX_DFMT:
-                       image = pgxtoimage(parameters.infile, &parameters);
-                       if (!image) {
-                               fprintf(stderr, " unable to load pgx file\n");
-                               return 1;
-                       }
-                       break;
+       if(img_fol.set_imgdir==1){
+               num_images=get_num_images(img_fol.imgdirpath);
 
-               case PXM_DFMT:
-                       image = pnmtoimage(parameters.infile, &parameters);
-                       if (!image) {
-                               fprintf(stderr, " not a pnm file\n");
-                               return 1;
-                       }
-                       break;
+               dirptr=(dircnt_t*)malloc(sizeof(dircnt_t));
+               if(dirptr){
+                       dirptr->filename_buf = (char*)malloc(num_images*OPJ_PATH_LEN*sizeof(char));     // Stores at max 10 image file names
+                       dirptr->filename = (char**) malloc(num_images*sizeof(char*));
 
-               case BMP_DFMT:
-                       image = bmptoimage(parameters.infile, &parameters);
-                       if (!image) {
-                               fprintf(stderr, " not a bmp file\n");
-                               return 1;
+                       if(!dirptr->filename_buf){
+                               return 0;
                        }
-                       break;
+                       for(i=0;i<num_images;i++){
+                               dirptr->filename[i] = dirptr->filename_buf + i*OPJ_PATH_LEN;
+                       }
+               }
+               if(load_images(dirptr,img_fol.imgdirpath)==1){
+                       return 0;
+               }
+               if (num_images==0){
+                       fprintf(stdout,"Folder is empty\n");
+                       return 0;
+               }
+       }else{
+               num_images=1;
        }
+       /*Encoding image one by one*/
+       for(imageno=0;imageno<num_images;imageno++)
+       {
 
-       /* encode the destination image */
-       /* ---------------------------- */
+               image = NULL;
+               fprintf(stderr,"\n");
+               process_file = 1;
 
-       if (parameters.cod_format == J2K_CFMT) {        /* J2K format output */
-               int codestream_length;
-               opj_cio_t *cio = NULL;
-               FILE *f = NULL;
+               if(img_fol.set_imgdir==1){
+                       get_next_file(imageno, dirptr,&img_fol, &parameters );
 
-               /* get a J2K compressor handle */
-               opj_cinfo_t* cinfo = opj_create_compress(CODEC_J2K);
+               }
+               switch(parameters.decod_format) {
+                       case PGX_DFMT:
+                               break;
+                       case PXM_DFMT:
+                               break;
+                       case BMP_DFMT:
+                               break;
 
-               /* catch events using our callbacks and give a local context */
-               opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);
+                       default:
+                               fprintf(stderr,"skipping file...\n");
+                               process_file = 0;                               
+               }
 
-               /* setup the encoder parameters using the current image and user parameters */
-               opj_setup_encoder(cinfo, &parameters, image);
+               if(process_file == 1){
 
-               /* open a byte stream for writing */
-               /* allocate memory for all tiles */
-               cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
+                       /* decode the source image */
+                       /* ----------------------- */
 
-               /* encode the image */
-               bSuccess = opj_encode(cinfo, cio, image, parameters.index);
-               if (!bSuccess) {
-                       opj_cio_close(cio);
-                       fprintf(stderr, "failed to encode image\n");
-                       return 1;
-               }
-               codestream_length = cio_tell(cio);
+                       switch (parameters.decod_format) {
+                               case PGX_DFMT:
+                                       image = pgxtoimage(parameters.infile, &parameters);
+                                       if (!image) {
+                                               fprintf(stderr, " unable to load pgx file\n");
+                                               return 1;
+                                       }
+                                       break;
 
-               /* write the buffer to disk */
-               f = fopen(parameters.outfile, "wb");
-               if (!f) {
-                       fprintf(stderr, "failed to open %s for writing\n", parameters.outfile);
-                       return 1;
-               }
-               fwrite(cio->buffer, 1, codestream_length, f);
-               fclose(f);
+                               case PXM_DFMT:
+                                       image = pnmtoimage(parameters.infile, &parameters);
+                                       if (!image) {
+                                               fprintf(stderr, " not a pnm file\n");
+                                               return 1;
+                                       }
+                                       break;
 
-               /* close and free the byte stream */
-               opj_cio_close(cio);
+                               case BMP_DFMT:
+                                       image = bmptoimage(parameters.infile, &parameters);
+                                       if (!image) {
+                                               fprintf(stderr, " not a bmp file\n");
+                                               return 1;
+                                       }
+                                       break;
+                       }
 
-               /* free remaining compression structures */
-               opj_destroy_compress(cinfo);
+                       /* encode the destination image */
+                       /* ---------------------------- */
 
-       } else {                        /* JP2 format output */
-               int codestream_length;
-               opj_cio_t *cio = NULL;
-               FILE *f = NULL;
+                       if (parameters.cod_format == J2K_CFMT) {        /* J2K format output */
+                               int codestream_length;
+                               opj_cio_t *cio = NULL;
+                               FILE *f = NULL;
 
-               /* get a JP2 compressor handle */
-               opj_cinfo_t* cinfo = opj_create_compress(CODEC_JP2);
+                               /* get a J2K compressor handle */
+                               opj_cinfo_t* cinfo = opj_create_compress(CODEC_J2K);
 
-               /* catch events using our callbacks and give a local context */
-               opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);                   
+                               /* catch events using our callbacks and give a local context */
+                               opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);
 
-               /* setup the encoder parameters using the current image and using user parameters */
-               opj_setup_encoder(cinfo, &parameters, image);
+                               /* setup the encoder parameters using the current image and user parameters */
+                               opj_setup_encoder(cinfo, &parameters, image);
 
-               /* open a byte stream for writing */
-               /* allocate memory for all tiles */
-               cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
+                               /* open a byte stream for writing */
+                               /* allocate memory for all tiles */
+                               cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
 
-               /* encode the image */
-               bSuccess = opj_encode(cinfo, cio, image, parameters.index);
-               if (!bSuccess) {
-                       opj_cio_close(cio);
-                       fprintf(stderr, "failed to encode image\n");
-                       return 1;
-               }
-               codestream_length = cio_tell(cio);
+                               /* encode the image */
+                               bSuccess = opj_encode(cinfo, cio, image, parameters.index);
+                               if (!bSuccess) {
+                                       opj_cio_close(cio);
+                                       fprintf(stderr, "failed to encode image\n");
+                                       return 1;
+                               }
+                               codestream_length = cio_tell(cio);
 
-               /* write the buffer to disk */
-               f = fopen(parameters.outfile, "wb");
-               if (!f) {
-                       fprintf(stderr, "failed to open %s for writing\n", parameters.outfile);
-                       return 1;
-               }
-               fwrite(cio->buffer, 1, codestream_length, f);
-               fclose(f);
+                               /* write the buffer to disk */
+                               f = fopen(parameters.outfile, "wb");
+                               if (!f) {
+                                       fprintf(stderr, "failed to open %s for writing\n", parameters.outfile);
+                                       return 1;
+                               }
+                               fwrite(cio->buffer, 1, codestream_length, f);
+                               fclose(f);
+
+                               fprintf(stderr,"Generated outfile %s\n",parameters.outfile);
+                               /* close and free the byte stream */
+                               opj_cio_close(cio);
+
+                               /* free remaining compression structures */
+                               opj_destroy_compress(cinfo);
+
+                       } else {                        /* JP2 format output */
+                               int codestream_length;
+                               opj_cio_t *cio = NULL;
+                               FILE *f = NULL;
 
-               /* close and free the byte stream */
-               opj_cio_close(cio);
+                               /* get a JP2 compressor handle */
+                               opj_cinfo_t* cinfo = opj_create_compress(CODEC_JP2);
 
-               /* free remaining compression structures */
-               opj_destroy_compress(cinfo);
+                               /* catch events using our callbacks and give a local context */
+                               opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);                   
 
+                               /* setup the encoder parameters using the current image and using user parameters */
+                               opj_setup_encoder(cinfo, &parameters, image);
+
+                               /* open a byte stream for writing */
+                               /* allocate memory for all tiles */
+                               cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0);
+
+                               /* encode the image */
+                               bSuccess = opj_encode(cinfo, cio, image, parameters.index);
+                               if (!bSuccess) {
+                                       opj_cio_close(cio);
+                                       fprintf(stderr, "failed to encode image\n");
+                                       return 1;
+                               }
+                               codestream_length = cio_tell(cio);
+
+                               /* write the buffer to disk */
+                               f = fopen(parameters.outfile, "wb");
+                               if (!f) {
+                                       fprintf(stderr, "failed to open %s for writing\n", parameters.outfile);
+                                       return 1;
+                               }
+                               fwrite(cio->buffer, 1, codestream_length, f);
+                               fclose(f);
+
+                               /* close and free the byte stream */
+                               opj_cio_close(cio);
+
+                               /* free remaining compression structures */
+                               opj_destroy_compress(cinfo);
+
+                       }
+       
+                       /* free image data */
+                       opj_image_destroy(image);
+               }
        }
 
        /* free user parameters structure */
   if(parameters.cp_comment) free(parameters.cp_comment);
        if(parameters.cp_matrice) free(parameters.cp_matrice);
 
-       /* free image data */
-       opj_image_destroy(image);
-
        return 0;
 }
 
index 7d8eefd0fbd23e93bd93ae18c72d19d74c0dbab3..ff13a1b5a4357f4213ff847a61063dd5cb20d5bf 100644 (file)
@@ -35,6 +35,7 @@
 #include "openjpeg.h"
 #include "compat/getopt.h"
 #include "convert.h"
+#include "dirent.h"
 
 #ifndef WIN32
 #define stricmp strcasecmp
 #define J2K_CFMT 0
 #define JP2_CFMT 1
 #define JPT_CFMT 2
-#define MJ2_CFMT 3
-#define PXM_DFMT 0
-#define PGX_DFMT 1
-#define BMP_DFMT 2
-#define YUV_DFMT 3
+
+#define PXM_DFMT 10
+#define PGX_DFMT 11
+#define BMP_DFMT 12
+#define YUV_DFMT 13
 
 /* ----------------------------------------------------------------------- */
 
+typedef struct dircnt{
+       /** Buffer for holding images read from Directory*/
+       char *filename_buf;
+       /** Pointer to the buffer*/
+       char **filename;
+}dircnt_t;
+
+
+typedef struct img_folder{
+       /** The directory path of the folder containing input images*/
+       char *imgdirpath;
+       /** Output format*/
+       char *out_format;
+       /** Enable option*/
+       char set_imgdir;
+       /** Enable Cod Format for output*/
+       char set_out_format;
+
+}img_fol_t;
+
 void decode_help_display() {
        fprintf(stdout,"HELP\n----\n\n");
        fprintf(stdout,"- the -h option displays this help information on screen\n\n");
@@ -66,8 +87,15 @@ void decode_help_display() {
                "decoder:\n");
 /* <<UniPG */
        fprintf(stdout,"\n");
+       fprintf(stdout,"\n");
+       fprintf(stdout,"  -ImgDir \n");
+       fprintf(stdout,"        Image file Directory path \n");
+       fprintf(stdout,"  -OutFor \n");
+       fprintf(stdout,"    REQUIRED only if -ImgDir is used\n");
+       fprintf(stdout,"          Need to specify only format without filename <BMP>  \n");
+       fprintf(stdout,"    Currently accepts PGM, PPM, PNM, PGX, BMP format\n");
        fprintf(stdout,"  -i <compressed file>\n");
-       fprintf(stdout,"    REQUIRED\n");
+       fprintf(stdout,"    REQUIRED only if an Input image directory not specified\n");
        fprintf(stdout,"    Currently accepts J2K-files, JP2-files and JPT-files. The file type\n");
        fprintf(stdout,"    is identified based on its suffix.\n");
        fprintf(stdout,"  -o <decompressed file>\n");
@@ -103,6 +131,52 @@ void decode_help_display() {
 
 /* -------------------------------------------------------------------------- */
 
+int get_num_images(char *imgdirpath){
+       DIR *dir;
+       struct dirent* content; 
+       int num_images = 0;
+
+       /*Reading the input images from given input directory*/
+
+       dir= opendir(imgdirpath);
+       if(!dir){
+               fprintf(stderr,"Could not open Folder %s\n",imgdirpath);
+               return 0;
+       }
+       
+       while((content=readdir(dir))!=NULL){
+               if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 )
+                       continue;
+               num_images++;
+       }
+       return num_images;
+}
+
+int load_images(dircnt_t *dirptr, char *imgdirpath){
+       DIR *dir;
+       struct dirent* content; 
+       int i = 0;
+
+       /*Reading the input images from given input directory*/
+
+       dir= opendir(imgdirpath);
+       if(!dir){
+               fprintf(stderr,"Could not open Folder %s\n",imgdirpath);
+               return 1;
+       }else   {
+               fprintf(stderr,"Folder opened successfully\n");
+       }
+       
+       while((content=readdir(dir))!=NULL){
+               if(strcmp(".",content->d_name)==0 || strcmp("..",content->d_name)==0 )
+                       continue;
+
+               strcpy(dirptr->filename[i],content->d_name);
+               i++;
+       }
+       return 0;       
+}
+
 int get_file_format(char *filename) {
        unsigned int i;
        static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp", "j2k", "jp2", "jpt" };
@@ -119,10 +193,33 @@ int get_file_format(char *filename) {
        return -1;
 }
 
+get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_dparameters_t *parameters){
+       char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN],outfilename[OPJ_PATH_LEN],temp_ofname[OPJ_PATH_LEN];
+
+       strcpy(image_filename,dirptr->filename[imageno]);
+       fprintf(stderr,"Imageno=%d %s\n",imageno,image_filename);
+       parameters->decod_format = get_file_format(image_filename);
+       sprintf(infilename,"%s/%s",img_fol->imgdirpath,image_filename);
+       strncpy(parameters->infile, infilename, sizeof(infilename));
+
+       //Set output file
+       strcpy(temp_ofname,strtok(image_filename,"."));
+       if(img_fol->set_out_format==1){
+               sprintf(outfilename,"%s/%s.%s",img_fol->imgdirpath,temp_ofname,img_fol->out_format);
+               strncpy(parameters->outfile, outfilename, sizeof(outfilename));
+       }
+}
+
+
 /* -------------------------------------------------------------------------- */
 
-int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters) {
+int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters,img_fol_t *img_fol) {
        /* parse the command line */
+       int totlen;
+       option_t long_option[]={
+               {"ImgDir",REQ_ARG, NULL ,'y'},
+               {"OutFor",REQ_ARG, NULL ,'O'},
+       };
 
 /* UniPG>> */
        const char optlist[] = "i:o:r:l:h"
@@ -132,9 +229,10 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters)
 #endif /* USE_JPWL */
                                        ;
 /* <<UniPG */
-
+       totlen=sizeof(long_option);
+       img_fol->set_out_format = 0;
        while (1) {
-               int c = getopt(argc, argv, optlist); /* >>JPWL<< */
+               int c = getopt_long(argc, argv,optlist,long_option,NULL,totlen);
                if (c == -1)
                        break;
                switch (c) {
@@ -177,8 +275,35 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters)
                        break;
                        
                                /* ----------------------------------------------------- */
-                       
-    
+
+                       case 'O':                       /* output format */
+                       {
+                               char outformat[50];
+                               char *of = optarg;
+                               sprintf(outformat,".%s",of);
+                               img_fol->set_out_format = 1;
+                               parameters->cod_format = get_file_format(outformat);
+                               switch(parameters->cod_format) {
+                                       case PGX_DFMT:
+                                               img_fol->out_format = "pgx";
+                                               break;
+                                       case PXM_DFMT:
+                                               img_fol->out_format = "ppm";
+                                               break;
+                                       case BMP_DFMT:
+                                               img_fol->out_format = "bmp";
+                                               break;
+                                       default:
+                                               fprintf(stderr, "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx or *.bmp]!! \n");
+                                               return 1;
+                                               break;
+                               }
+                       }
+                       break;
+
+                               /* ----------------------------------------------------- */
+
+
                        case 'r':               /* reduce option */
                        {
                                sscanf(optarg, "%d", &parameters->cp_reduce);
@@ -195,14 +320,23 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters)
                        break;
                        
                                /* ----------------------------------------------------- */
-                       
+
                        case 'h':                       /* display an help description */
                                decode_help_display();
                                return 1;                               
-            
+
+                               /* ------------------------------------------------------ */
+
+                       case 'y':                       /* Image Directory path */
+                               {
+                                       img_fol->imgdirpath = (char*)malloc(strlen(optarg) + 1);
+                                       strcpy(img_fol->imgdirpath,optarg);
+                                       img_fol->set_imgdir=1;
+                               }
+                               break;
+                               /* ----------------------------------------------------- */
 /* UniPG>> */
 #ifdef USE_JPWL
-                               /* ----------------------------------------------------- */     
                        
                        case 'W':                       /* activate JPWL correction */
                        {
@@ -281,10 +415,28 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters)
        }
 
        /* check for possible errors */
-
-       if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {
-               fprintf(stderr,"ERROR -> At least one required argument is missing\nCheck j2k_to_image -h for usage information\n");
-               return 1;
+       if(img_fol->set_imgdir==1){
+               if(!(parameters->infile[0]==0)){
+                       fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n");
+                       return 1;
+               }
+               if(img_fol->set_out_format == 0){
+                       fprintf(stderr, "Error: When -ImgDir is used, -OutFor <FORMAT> must be used !!\n");
+                       fprintf(stderr, "Only one format allowed! Valid format PGM, PPM, PNM, PGX,BMP!!\n");
+                       return 1;
+               }
+               if(!((parameters->outfile[0] == 0))){
+                       fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n");
+                       fprintf(stderr, "Specify OutputFormat using -OutFor<FORMAT> !!\n");
+                       return 1;
+               }
+       }else{
+               if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) {
+                       fprintf(stderr, "Error: One of option; -i or -ImgDir must be specified\n");
+                       fprintf(stderr, "Error: When using -i; -o must be used\n");
+                       fprintf(stderr, "usage: image_to_j2k -i image-file -o j2k/jp2-file (+ options)\n");
+                       return 1;
+               }
        }
 
        return 0;
@@ -318,12 +470,16 @@ void info_callback(const char *msg, void *client_data) {
 
 int main(int argc, char **argv) {
        opj_dparameters_t parameters;   /* decompression parameters */
+       img_fol_t img_fol;
        opj_event_mgr_t event_mgr;              /* event manager */
        opj_image_t *image = NULL;
        FILE *fsrc = NULL;
        unsigned char *src = NULL;
        int file_length;
-
+       int num_images;
+       int i,imageno;
+       dircnt_t *dirptr;
+       char process_file = 1;
        opj_dinfo_t* dinfo = NULL;      /* handle to a decompressor */
        opj_cio_t *cio = NULL;
 
@@ -336,29 +492,73 @@ int main(int argc, char **argv) {
        /* set decoding parameters to default values */
        opj_set_default_decoder_parameters(&parameters);
 
-       /* parse input and get user decoding parameters */
-       if(parse_cmdline_decoder(argc, argv, &parameters) == 1) {
+
+       /* parse input and get user encoding parameters */
+       if(parse_cmdline_decoder(argc, argv, &parameters,&img_fol) == 1) {
                return 0;
        }
 
-       /* read the input file and put it in memory */
-       /* ---------------------------------------- */
-       fsrc = fopen(parameters.infile, "rb");
-       if (!fsrc) {
-               fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile);
-               return 1;
+       if(img_fol.set_imgdir==1){      
+               num_images=get_num_images(img_fol.imgdirpath);
+
+               dirptr=(dircnt_t*)malloc(sizeof(dircnt_t));
+               if(dirptr){
+                       dirptr->filename_buf = (char*)malloc(num_images*OPJ_PATH_LEN*sizeof(char));     // Stores at max 10 image file names
+                       dirptr->filename = (char**) malloc(num_images*sizeof(char*));
+
+                       if(!dirptr->filename_buf){
+                               return 0;
+                       }
+                       for(i=0;i<num_images;i++){
+                               dirptr->filename[i] = dirptr->filename_buf + i*OPJ_PATH_LEN;
+                       }
+               }
+               if(load_images(dirptr,img_fol.imgdirpath)==1){
+                       return 0;
+               }
+               if (num_images==0){
+                       fprintf(stdout,"Folder is empty\n");
+                       return 0;
+               }
+       }else{
+               num_images=1;
        }
-       fseek(fsrc, 0, SEEK_END);
-       file_length = ftell(fsrc);
-       fseek(fsrc, 0, SEEK_SET);
-       src = (unsigned char *) malloc(file_length);
-       fread(src, 1, file_length, fsrc);
-       fclose(fsrc);
 
-       /* decode the code-stream */
-       /* ---------------------- */
+       /*Encoding image one by one*/
+       for(imageno = 0; imageno < num_images ; imageno++)
+       {
+
+               image = NULL;
+               fprintf(stderr,"\n");
+               process_file = 1;
+
+               
+               if(img_fol.set_imgdir==1){
+                       get_next_file(imageno, dirptr,&img_fol, &parameters );
+
+               }
+
+
+               /* read the input file and put it in memory */
+               /* ---------------------------------------- */
+               fsrc = fopen(parameters.infile, "rb");
+               if (!fsrc) {
+                       fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile);
+                       return 1;
+               }
+               fseek(fsrc, 0, SEEK_END);
+               file_length = ftell(fsrc);
+               fseek(fsrc, 0, SEEK_SET);
+               src = (unsigned char *) malloc(file_length);
+               fread(src, 1, file_length, fsrc);
+               fclose(fsrc);
+
+
+
+               /* decode the code-stream */
+               /* ---------------------- */
 
-    switch(parameters.decod_format) {
+               switch(parameters.decod_format) {
                case J2K_CFMT:
                {
                        /* JPEG-2000 codestream */
@@ -451,18 +651,18 @@ int main(int argc, char **argv) {
                break;
 
                default:
-                       fprintf(stderr, "ERROR -> j2k_to_image : Unknown input image format\n");
-                       return 1;
+                       fprintf(stderr, "False input image format skipping file..\n");
+                       process_file = 0;
        }
 
-       /* free the memory containing the code-stream */
-       free(src);
-       src = NULL;
-
-       /* create output image */
-       /* ------------------- */
+               /* free the memory containing the code-stream */
+               free(src);
+               src = NULL;
 
-       switch (parameters.cod_format) {
+               /* create output image */
+               /* ------------------- */
+               if(process_file == 1){
+                       switch (parameters.cod_format) {
                case PXM_DFMT:                  /* PNM PGM PPM */
                        imagetopnm(image, parameters.outfile);
                        break;
@@ -474,16 +674,17 @@ int main(int argc, char **argv) {
                case BMP_DFMT:                  /* BMP */
                        imagetobmp(image, parameters.outfile);
                        break;
-       }
+                       }
 
-       /* free remaining structures */
-       if(dinfo) {
-               opj_destroy_decompress(dinfo);
+                       /* free remaining structures */
+                       if(dinfo) {
+                               opj_destroy_decompress(dinfo);
+                       }
+                       /* free image data structure */
+                       opj_image_destroy(image);
+               }
        }
-
-       /* free image data structure */
-       opj_image_destroy(image);
-
        return 0;
 }
+//end main