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

Enabling use of multi character input parameters in the codec. Modifications in image_to_j2k.c, j2k_to_image.c, getopt.c, getopt.h
This commit is contained in:
Parvatha Elangovan 2007-02-26 15:40:01 +00:00
parent e6ce7958f2
commit 0781b7d441
5 changed files with 751 additions and 167 deletions

View File

@ -5,6 +5,10 @@ What's New for OpenJPEG
! : changed ! : changed
+ : added + : 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 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 * [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 * [FOD] Changed version number from 1.1.0 to 1.1.1 in openjpeg.h

View File

@ -47,10 +47,36 @@ int opterr = 1, /* if error message should be printed */
optreset; /* reset getopt */ optreset; /* reset getopt */
const char *optarg; /* argument associated with option */ 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 BADCH (int)'?'
#define BADARG (int)':' #define BADARG (int)':'
#define EMSG "" #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 -- * getopt --
* Parse argc/argv argument vector. * 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 */ 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
}

View File

@ -3,6 +3,18 @@
#ifndef _GETOPT_H_ #ifndef _GETOPT_H_
#define _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 opterr;
extern int optind; extern int optind;
extern int optopt; extern int optopt;
@ -10,5 +22,8 @@ extern int optreset;
extern char *optarg; extern char *optarg;
extern int getopt(int nargc, char *const *nargv, const char *ostr); 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_ */ #endif /* _GETOPT_H_ */

View File

@ -35,6 +35,7 @@
#include "openjpeg.h" #include "openjpeg.h"
#include "compat/getopt.h" #include "compat/getopt.h"
#include "convert.h" #include "convert.h"
#include "dirent.h"
#ifndef WIN32 #ifndef WIN32
#define stricmp strcasecmp #define stricmp strcasecmp
@ -46,14 +47,33 @@
#define J2K_CFMT 0 #define J2K_CFMT 0
#define JP2_CFMT 1 #define JP2_CFMT 1
#define JPT_CFMT 2 #define JPT_CFMT 2
#define MJ2_CFMT 3
#define PXM_DFMT 0 #define PXM_DFMT 10
#define PGX_DFMT 1 #define PGX_DFMT 11
#define BMP_DFMT 2 #define BMP_DFMT 12
#define YUV_DFMT 3 #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() { void encode_help_display() {
fprintf(stdout,"HELP\n----\n\n"); fprintf(stdout,"HELP\n----\n\n");
fprintf(stdout,"- the -h option displays this help information on screen\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,"\n");
fprintf(stdout,"Required Parameters (except with -h):\n"); fprintf(stdout,"Required Parameters (except with -h):\n");
fprintf(stdout,"\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,"-i : source file (-i source.pnm also *.pgm, *.ppm) \n");
fprintf(stdout,"\n"); fprintf(stdout,"\n");
fprintf(stdout,"-o : destination file (-o dest.j2k or .jp2) \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; 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) { int get_file_format(char *filename) {
unsigned int i; unsigned int i;
static const char *extension[] = { static const char *extension[] = {
@ -297,10 +371,47 @@ int get_file_format(char *filename) {
return -1; return -1;
} }
/* -------------------------------------------------------------------------*/ char * get_file_name(char *name){
char *fname;
fname= (char*)malloc(OPJ_PATH_LEN*sizeof(char));
fname= strtok(name,".");
return fname;
}
int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters) { get_next_file(int imageno,dircnt_t *dirptr,img_fol_t *img_fol, opj_cparameters_t *parameters){
int i, j; 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,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 */ /* parse the command line */
/* UniPG>> */ /* UniPG>> */
@ -310,8 +421,11 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters)
#endif /* USE_JPWL */ #endif /* USE_JPWL */
; ;
totlen=sizeof(long_option);
img_fol->set_out_format=0;
while (1) { while (1) {
int c = getopt(argc, argv, optlist); int c = getopt_long(argc, argv, optlist,long_option,NULL,totlen);
/* <<UniPG */ /* <<UniPG */
if (c == -1) if (c == -1)
break; break;
@ -355,6 +469,30 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters)
break; 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 */ case 'r': /* rates rates/distorsion */
{ {
@ -657,6 +795,18 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters)
} }
break; 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>> */ /* UniPG>> */
#ifdef USE_JPWL #ifdef USE_JPWL
/* ------------------------------------------------------ */ /* ------------------------------------------------------ */
@ -990,10 +1140,28 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters)
} }
/* check for possible errors */ /* check for possible errors */
if(img_fol->set_imgdir==1){
if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { if(!(parameters->infile[0]==0)){
fprintf(stderr, "usage: image_to_j2k -i image-file -o j2k/jp2-file (+ options)\n"); fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n");
return 1; 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) 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) { int main(int argc, char **argv) {
bool bSuccess; bool bSuccess;
opj_cparameters_t parameters; /* compression parameters */ opj_cparameters_t parameters; /* compression parameters */
img_fol_t img_fol;
opj_event_mgr_t event_mgr; /* event manager */ opj_event_mgr_t event_mgr; /* event manager */
opj_image_t *image = NULL; opj_image_t *image = NULL;
int i,num_images;
int imageno;
char process_file = 1;
dircnt_t *dirptr;
/* /*
configure the event callbacks (not required) configure the event callbacks (not required)
@ -1072,10 +1245,11 @@ int main(int argc, char **argv) {
opj_set_default_encoder_parameters(&parameters); opj_set_default_encoder_parameters(&parameters);
/* parse input and get user encoding 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; return 0;
} }
/* Create comment for codestream */
if(parameters.cp_comment == NULL) { if(parameters.cp_comment == NULL) {
const char comment[] = "Created by OpenJPEG version "; const char comment[] = "Created by OpenJPEG version ";
const size_t clen = strlen(comment); 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) { if(img_fol.set_imgdir==1){
case PGX_DFMT: num_images=get_num_images(img_fol.imgdirpath);
image = pgxtoimage(parameters.infile, &parameters);
if (!image) {
fprintf(stderr, " unable to load pgx file\n");
return 1;
}
break;
case PXM_DFMT: dirptr=(dircnt_t*)malloc(sizeof(dircnt_t));
image = pnmtoimage(parameters.infile, &parameters); if(dirptr){
if (!image) { dirptr->filename_buf = (char*)malloc(num_images*OPJ_PATH_LEN*sizeof(char)); // Stores at max 10 image file names
fprintf(stderr, " not a pnm file\n"); dirptr->filename = (char**) malloc(num_images*sizeof(char*));
return 1;
}
break;
case BMP_DFMT: if(!dirptr->filename_buf){
image = bmptoimage(parameters.infile, &parameters); return 0;
if (!image) {
fprintf(stderr, " not a bmp file\n");
return 1;
} }
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 */ if(img_fol.set_imgdir==1){
int codestream_length; get_next_file(imageno, dirptr,&img_fol, &parameters );
opj_cio_t *cio = NULL;
FILE *f = NULL;
/* 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);
/* 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);
/* 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:
break;
case PXM_DFMT:
break;
case BMP_DFMT:
break;
/* write the buffer to disk */ default:
f = fopen(parameters.outfile, "wb"); fprintf(stderr,"skipping file...\n");
if (!f) { process_file = 0;
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 */ if(process_file == 1){
opj_cio_close(cio);
/* free remaining compression structures */ /* decode the source image */
opj_destroy_compress(cinfo); /* ----------------------- */
} else { /* JP2 format output */ switch (parameters.decod_format) {
int codestream_length; case PGX_DFMT:
opj_cio_t *cio = NULL; image = pgxtoimage(parameters.infile, &parameters);
FILE *f = NULL; if (!image) {
fprintf(stderr, " unable to load pgx file\n");
return 1;
}
break;
/* get a JP2 compressor handle */ case PXM_DFMT:
opj_cinfo_t* cinfo = opj_create_compress(CODEC_JP2); image = pnmtoimage(parameters.infile, &parameters);
if (!image) {
fprintf(stderr, " not a pnm file\n");
return 1;
}
break;
/* catch events using our callbacks and give a local context */ case BMP_DFMT:
opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); image = bmptoimage(parameters.infile, &parameters);
if (!image) {
fprintf(stderr, " not a bmp file\n");
return 1;
}
break;
}
/* setup the encoder parameters using the current image and using user parameters */ /* encode the destination image */
opj_setup_encoder(cinfo, &parameters, image); /* ---------------------------- */
/* open a byte stream for writing */ if (parameters.cod_format == J2K_CFMT) { /* J2K format output */
/* allocate memory for all tiles */ int codestream_length;
cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); opj_cio_t *cio = NULL;
FILE *f = NULL;
/* encode the image */ /* get a J2K compressor handle */
bSuccess = opj_encode(cinfo, cio, image, parameters.index); opj_cinfo_t* cinfo = opj_create_compress(CODEC_J2K);
if (!bSuccess) {
opj_cio_close(cio); /* catch events using our callbacks and give a local context */
fprintf(stderr, "failed to encode image\n"); opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);
return 1;
/* 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);
/* 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);
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;
/* get a JP2 compressor handle */
opj_cinfo_t* cinfo = opj_create_compress(CODEC_JP2);
/* catch events using our callbacks and give a local context */
opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr);
/* 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);
} }
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 user parameters structure */ /* free user parameters structure */
if(parameters.cp_comment) free(parameters.cp_comment); if(parameters.cp_comment) free(parameters.cp_comment);
if(parameters.cp_matrice) free(parameters.cp_matrice); if(parameters.cp_matrice) free(parameters.cp_matrice);
/* free image data */
opj_image_destroy(image);
return 0; return 0;
} }

View File

@ -35,6 +35,7 @@
#include "openjpeg.h" #include "openjpeg.h"
#include "compat/getopt.h" #include "compat/getopt.h"
#include "convert.h" #include "convert.h"
#include "dirent.h"
#ifndef WIN32 #ifndef WIN32
#define stricmp strcasecmp #define stricmp strcasecmp
@ -46,14 +47,34 @@
#define J2K_CFMT 0 #define J2K_CFMT 0
#define JP2_CFMT 1 #define JP2_CFMT 1
#define JPT_CFMT 2 #define JPT_CFMT 2
#define MJ2_CFMT 3
#define PXM_DFMT 0 #define PXM_DFMT 10
#define PGX_DFMT 1 #define PGX_DFMT 11
#define BMP_DFMT 2 #define BMP_DFMT 12
#define YUV_DFMT 3 #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() { void decode_help_display() {
fprintf(stdout,"HELP\n----\n\n"); fprintf(stdout,"HELP\n----\n\n");
fprintf(stdout,"- the -h option displays this help information on screen\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"); "decoder:\n");
/* <<UniPG */ /* <<UniPG */
fprintf(stdout,"\n"); 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," -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," Currently accepts J2K-files, JP2-files and JPT-files. The file type\n");
fprintf(stdout," is identified based on its suffix.\n"); fprintf(stdout," is identified based on its suffix.\n");
fprintf(stdout," -o <decompressed file>\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) { int get_file_format(char *filename) {
unsigned int i; unsigned int i;
static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp", "j2k", "jp2", "jpt" }; static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp", "j2k", "jp2", "jpt" };
@ -119,10 +193,33 @@ int get_file_format(char *filename) {
return -1; 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 */ /* parse the command line */
int totlen;
option_t long_option[]={
{"ImgDir",REQ_ARG, NULL ,'y'},
{"OutFor",REQ_ARG, NULL ,'O'},
};
/* UniPG>> */ /* UniPG>> */
const char optlist[] = "i:o:r:l:h" 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 */ #endif /* USE_JPWL */
; ;
/* <<UniPG */ /* <<UniPG */
totlen=sizeof(long_option);
img_fol->set_out_format = 0;
while (1) { while (1) {
int c = getopt(argc, argv, optlist); /* >>JPWL<< */ int c = getopt_long(argc, argv,optlist,long_option,NULL,totlen);
if (c == -1) if (c == -1)
break; break;
switch (c) { switch (c) {
@ -178,6 +276,33 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters)
/* ----------------------------------------------------- */ /* ----------------------------------------------------- */
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 */ case 'r': /* reduce option */
{ {
@ -200,9 +325,18 @@ int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters)
decode_help_display(); decode_help_display();
return 1; 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>> */ /* UniPG>> */
#ifdef USE_JPWL #ifdef USE_JPWL
/* ----------------------------------------------------- */
case 'W': /* activate JPWL correction */ 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 */ /* check for possible errors */
if(img_fol->set_imgdir==1){
if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { if(!(parameters->infile[0]==0)){
fprintf(stderr,"ERROR -> At least one required argument is missing\nCheck j2k_to_image -h for usage information\n"); fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n");
return 1; 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; return 0;
@ -318,12 +470,16 @@ void info_callback(const char *msg, void *client_data) {
int main(int argc, char **argv) { int main(int argc, char **argv) {
opj_dparameters_t parameters; /* decompression parameters */ opj_dparameters_t parameters; /* decompression parameters */
img_fol_t img_fol;
opj_event_mgr_t event_mgr; /* event manager */ opj_event_mgr_t event_mgr; /* event manager */
opj_image_t *image = NULL; opj_image_t *image = NULL;
FILE *fsrc = NULL; FILE *fsrc = NULL;
unsigned char *src = NULL; unsigned char *src = NULL;
int file_length; 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_dinfo_t* dinfo = NULL; /* handle to a decompressor */
opj_cio_t *cio = NULL; opj_cio_t *cio = NULL;
@ -336,29 +492,73 @@ int main(int argc, char **argv) {
/* set decoding parameters to default values */ /* set decoding parameters to default values */
opj_set_default_decoder_parameters(&parameters); 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; return 0;
} }
/* read the input file and put it in memory */ if(img_fol.set_imgdir==1){
/* ---------------------------------------- */ num_images=get_num_images(img_fol.imgdirpath);
fsrc = fopen(parameters.infile, "rb");
if (!fsrc) { dirptr=(dircnt_t*)malloc(sizeof(dircnt_t));
fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile); if(dirptr){
return 1; 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++)
{
switch(parameters.decod_format) { 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) {
case J2K_CFMT: case J2K_CFMT:
{ {
/* JPEG-2000 codestream */ /* JPEG-2000 codestream */
@ -451,18 +651,18 @@ int main(int argc, char **argv) {
break; break;
default: default:
fprintf(stderr, "ERROR -> j2k_to_image : Unknown input image format\n"); fprintf(stderr, "False input image format skipping file..\n");
return 1; process_file = 0;
} }
/* free the memory containing the code-stream */ /* free the memory containing the code-stream */
free(src); free(src);
src = NULL; src = NULL;
/* create output image */ /* create output image */
/* ------------------- */ /* ------------------- */
if(process_file == 1){
switch (parameters.cod_format) { switch (parameters.cod_format) {
case PXM_DFMT: /* PNM PGM PPM */ case PXM_DFMT: /* PNM PGM PPM */
imagetopnm(image, parameters.outfile); imagetopnm(image, parameters.outfile);
break; break;
@ -474,16 +674,17 @@ int main(int argc, char **argv) {
case BMP_DFMT: /* BMP */ case BMP_DFMT: /* BMP */
imagetobmp(image, parameters.outfile); imagetobmp(image, parameters.outfile);
break; break;
}
/* free remaining structures */
if(dinfo) {
opj_destroy_decompress(dinfo);
}
/* free image data structure */
opj_image_destroy(image);
}
} }
/* free remaining structures */
if(dinfo) {
opj_destroy_decompress(dinfo);
}
/* free image data structure */
opj_image_destroy(image);
return 0; return 0;
} }
//end main