2005-12-02 14:34:15 +01:00
/*
2007-01-15 10:55:40 +01:00
* Copyright ( c ) 2002 - 2007 , Communications and Remote Sensing Laboratory , Universite catholique de Louvain ( UCL ) , Belgium
* Copyright ( c ) 2002 - 2007 , Professor Benoit Macq
2005-12-02 14:34:15 +01:00
* Copyright ( c ) 2001 - 2003 , David Janssens
* Copyright ( c ) 2002 - 2003 , Yannick Verschueren
2007-01-15 10:55:40 +01:00
* Copyright ( c ) 2003 - 2007 , Francois - Olivier Devaux and Antonin Descampe
* Copyright ( c ) 2005 , Herve Drolon , FreeImage Team
2007-03-20 18:15:18 +01:00
* Copyright ( c ) 2006 - 2007 , Parvatha Elangovan
2005-12-02 14:34:15 +01:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ` AS IS '
* AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR
* CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS
* INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN
* CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE )
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE .
*/
2010-11-15 12:08:03 +01:00
2005-12-02 14:34:15 +01:00
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
2007-09-07 17:01:55 +02:00
# include <math.h>
2004-11-26 17:33:18 +01:00
2010-12-08 12:06:41 +01:00
# ifdef _WIN32
2010-10-05 12:33:15 +02:00
# include "windirent.h"
# else
# include <dirent.h>
2010-12-08 12:06:41 +01:00
# endif /* _WIN32 */
2004-11-26 17:33:18 +01:00
2010-12-08 12:06:41 +01:00
# ifdef _WIN32
# include <windows.h>
# else
2010-06-21 15:21:11 +02:00
# include <strings.h>
2010-03-07 22:27:37 +01:00
# define _stricmp strcasecmp
# define _strnicmp strncasecmp
2010-12-08 12:06:41 +01:00
# endif /* _WIN32 */
2005-12-08 10:27:26 +01:00
2010-12-08 12:06:41 +01:00
# include "opj_config.h"
# include "openjpeg.h"
2011-09-01 14:08:10 +02:00
# include "opj_getopt.h"
2010-12-08 12:06:41 +01:00
# include "convert.h"
# include "index.h"
2005-12-08 10:27:26 +01:00
2010-12-08 12:06:41 +01:00
# ifdef HAVE_LIBLCMS2
# include <lcms2.h>
# endif
# ifdef HAVE_LIBLCMS1
# include <lcms.h>
# endif
# include "color.h"
2007-02-26 16:40:01 +01:00
2010-12-08 12:06:41 +01:00
# include "format_defs.h"
2003-11-27 11:07:31 +01:00
2007-02-26 16:40:01 +01:00
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*/
2010-03-24 12:20:45 +01:00
const char * out_format ;
2007-02-26 16:40:01 +01:00
/** Enable option*/
char set_imgdir ;
/** Enable Cod Format for output*/
char set_out_format ;
} img_fol_t ;
2015-10-18 16:07:40 +02:00
typedef enum opj_prec_mode
{
OPJ_PREC_MODE_CLIP ,
OPJ_PREC_MODE_SCALE
} opj_precision_mode ;
typedef struct opj_prec
{
int prec ;
opj_precision_mode mode ;
} opj_precision ;
typedef struct opj_decompress_params
{
/** core library parameters */
opj_dparameters_t core ;
/** input file name */
char infile [ OPJ_PATH_LEN ] ;
/** output file name */
char outfile [ OPJ_PATH_LEN ] ;
/** input file format 0: J2K, 1: JP2, 2: JPT */
int decod_format ;
/** output file format 0: PGX, 1: PxM, 2: BMP */
int cod_format ;
opj_precision * precision ;
int nb_precision ;
/* force output colorspace to RGB */
int force_rgb ;
/* upsample components according to their dx/dy values */
int upsample ;
} opj_decompress_parameters ;
2014-02-26 09:43:20 +01:00
static void decode_help_display ( void ) {
2010-10-19 12:06:47 +02:00
fprintf ( stdout , " HELP for j2k_to_image \n ---- \n \n " ) ;
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " - the -h option displays this help information on screen \n \n " ) ;
2006-12-04 15:55:38 +01:00
/* UniPG>> */
fprintf ( stdout , " List of parameters for the JPEG 2000 "
# ifdef USE_JPWL
" + JPWL "
# endif /* USE_JPWL */
" decoder: \n " ) ;
/* <<UniPG */
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " \n " ) ;
2007-02-26 16:40:01 +01:00
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 " ) ;
2010-10-19 12:06:47 +02:00
fprintf ( stdout , " Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA formats \n " ) ;
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " -i <compressed file> \n " ) ;
2007-02-26 16:40:01 +01:00
fprintf ( stdout , " REQUIRED only if an Input image directory not specified \n " ) ;
2005-12-08 10:27:26 +01:00
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 " ) ;
fprintf ( stdout , " REQUIRED \n " ) ;
2010-10-19 12:06:47 +02:00
fprintf ( stdout , " Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA files \n " ) ;
2007-07-17 18:19:41 +02:00
fprintf ( stdout , " Binary data is written to the file (not ascii). If a PGX \n " ) ;
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " filename is given, there will be as many output files as there are \n " ) ;
fprintf ( stdout , " components: an indice starting from 0 will then be appended to the \n " ) ;
fprintf ( stdout , " output filename, just before the \" pgx \" extension. If a PGM filename \n " ) ;
fprintf ( stdout , " is given and there are more than one component, only the first component \n " ) ;
fprintf ( stdout , " will be written to the file. \n " ) ;
fprintf ( stdout , " -r <reduce factor> \n " ) ;
fprintf ( stdout , " Set the number of highest resolution levels to be discarded. The \n " ) ;
fprintf ( stdout , " image resolution is effectively divided by 2 to the power of the \n " ) ;
fprintf ( stdout , " number of discarded levels. The reduce factor is limited by the \n " ) ;
fprintf ( stdout , " smallest total number of decomposition levels among tiles. \n " ) ;
fprintf ( stdout , " -l <number of quality layers to decode> \n " ) ;
fprintf ( stdout , " Set the maximum number of quality layers to decode. If there are \n " ) ;
fprintf ( stdout , " less quality layers than the specified number, all the quality layers \n " ) ;
fprintf ( stdout , " are decoded. \n " ) ;
2007-09-07 17:01:55 +02:00
fprintf ( stdout , " -x \n " ) ;
fprintf ( stdout , " Create an index file *.Idx (-x index_name.Idx) \n " ) ;
2015-10-18 16:07:40 +02:00
fprintf ( stdout , " -p <comp 0 precision>[C|S][,<comp 1 precision>[C|S][,...]] \n " ) ;
fprintf ( stdout , " OPTIONAL \n " ) ;
fprintf ( stdout , " Force the precision (bit depth) of components. \n " ) ;
fprintf ( stdout , " There shall be at least 1 value. Theres no limit on the number of values (comma separated, last values ignored if too much values). \n " ) ;
fprintf ( stdout , " If there are less values than components, the last value is used for remaining components. \n " ) ;
fprintf ( stdout , " If 'C' is specified (default), values are clipped. \n " ) ;
fprintf ( stdout , " If 'S' is specified, values are scaled. \n " ) ;
fprintf ( stdout , " A 0 value can be specified (meaning original bit depth). \n " ) ;
fprintf ( stdout , " -force-rgb \n " ) ;
fprintf ( stdout , " Force output image colorspace to RGB \n " ) ;
fprintf ( stdout , " -upsample \n " ) ;
fprintf ( stdout , " Downsampled components will be upsampled to image size \n " ) ;
2007-09-07 17:01:55 +02:00
fprintf ( stdout , " \n " ) ;
2006-12-04 15:55:38 +01:00
/* UniPG>> */
# ifdef USE_JPWL
fprintf ( stdout , " -W <options> \n " ) ;
fprintf ( stdout , " Activates the JPWL correction capability, if the codestream complies. \n " ) ;
fprintf ( stdout , " Options can be a comma separated list of <param=val> tokens: \n " ) ;
fprintf ( stdout , " c, c=numcomps \n " ) ;
fprintf ( stdout , " numcomps is the number of expected components in the codestream \n " ) ;
fprintf ( stdout , " (search of first EPB rely upon this, default is %d) \n " , JPWL_EXPECTED_COMPONENTS ) ;
# endif /* USE_JPWL */
/* <<UniPG */
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " \n " ) ;
2003-11-27 11:07:31 +01:00
}
2005-12-02 14:34:15 +01:00
/* -------------------------------------------------------------------------- */
2015-10-18 16:07:40 +02:00
static opj_bool parse_precision ( const char * option , opj_decompress_parameters * parameters )
{
const char * l_remaining = option ;
opj_bool l_result = OPJ_TRUE ;
/* reset */
if ( parameters - > precision ) {
free ( parameters - > precision ) ;
parameters - > precision = NULL ;
}
parameters - > nb_precision = 0U ;
for ( ; ; )
{
int prec ;
char mode ;
char comma ;
int count ;
count = sscanf ( l_remaining , " %d%c%c " , & prec , & mode , & comma ) ;
if ( count = = 1 ) {
mode = ' C ' ;
count + + ;
}
if ( ( count = = 2 ) | | ( mode = = ' , ' ) ) {
if ( mode = = ' , ' ) {
mode = ' C ' ;
}
comma = ' , ' ;
count = 3 ;
}
if ( count = = 3 ) {
if ( ( prec < 1 ) | | ( prec > 32 ) ) {
fprintf ( stderr , " Invalid precision %d in precision option %s \n " , prec , option ) ;
l_result = OPJ_FALSE ;
break ;
}
if ( ( mode ! = ' C ' ) & & ( mode ! = ' S ' ) ) {
fprintf ( stderr , " Invalid precision mode %c in precision option %s \n " , mode , option ) ;
l_result = OPJ_FALSE ;
break ;
}
if ( comma ! = ' , ' ) {
fprintf ( stderr , " Invalid character %c in precision option %s \n " , comma , option ) ;
l_result = OPJ_FALSE ;
break ;
}
if ( parameters - > precision = = NULL ) {
/* first one */
parameters - > precision = ( opj_precision * ) malloc ( sizeof ( opj_precision ) ) ;
if ( parameters - > precision = = NULL ) {
fprintf ( stderr , " Could not allocate memory for precision option \n " ) ;
l_result = OPJ_FALSE ;
break ;
}
} else {
int l_new_size = parameters - > nb_precision + 1U ;
opj_precision * l_new ;
if ( l_new_size = = 0U ) {
fprintf ( stderr , " Could not allocate memory for precision option \n " ) ;
l_result = OPJ_FALSE ;
break ;
}
l_new = ( opj_precision * ) realloc ( parameters - > precision , l_new_size * sizeof ( opj_precision ) ) ;
if ( l_new = = NULL ) {
fprintf ( stderr , " Could not allocate memory for precision option \n " ) ;
l_result = OPJ_FALSE ;
break ;
}
parameters - > precision = l_new ;
}
parameters - > precision [ parameters - > nb_precision ] . prec = prec ;
switch ( mode ) {
case ' C ' :
parameters - > precision [ parameters - > nb_precision ] . mode = OPJ_PREC_MODE_CLIP ;
break ;
case ' S ' :
parameters - > precision [ parameters - > nb_precision ] . mode = OPJ_PREC_MODE_SCALE ;
break ;
default :
break ;
}
parameters - > nb_precision + + ;
l_remaining = strchr ( l_remaining , ' , ' ) ;
if ( l_remaining = = NULL ) {
break ;
}
l_remaining + = 1 ;
} else {
fprintf ( stderr , " Could not parse precision option %s \n " , option ) ;
l_result = OPJ_FALSE ;
break ;
}
}
return l_result ;
}
/* -------------------------------------------------------------------------- */
2014-02-26 09:43:20 +01:00
static int get_num_images ( char * imgdirpath ) {
2007-02-26 16:40:01 +01:00
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 + + ;
}
2014-02-26 09:38:19 +01:00
closedir ( dir ) ;
2007-02-26 16:40:01 +01:00
return num_images ;
}
2014-02-26 09:43:20 +01:00
static int load_images ( dircnt_t * dirptr , char * imgdirpath ) {
2007-02-26 16:40:01 +01:00
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 + + ;
}
2014-02-26 09:38:19 +01:00
closedir ( dir ) ;
2007-02-26 16:40:01 +01:00
return 0 ;
}
2014-02-26 09:43:20 +01:00
static int get_file_format ( char * filename ) {
2006-01-20 17:53:05 +01:00
unsigned int i ;
2010-06-29 21:08:45 +02:00
static const char * extension [ ] = { " pgx " , " pnm " , " pgm " , " ppm " , " bmp " , " tif " , " raw " , " tga " , " png " , " j2k " , " jp2 " , " jpt " , " j2c " , " jpc " } ;
2010-03-26 17:07:08 +01:00
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 } ;
2007-02-27 15:19:09 +01:00
char * ext = strrchr ( filename , ' . ' ) ;
if ( ext = = NULL )
return - 1 ;
ext + + ;
2005-12-08 10:27:26 +01:00
if ( ext ) {
2006-01-26 21:02:04 +01:00
for ( i = 0 ; i < sizeof ( format ) / sizeof ( * format ) ; i + + ) {
2010-03-07 22:27:37 +01:00
if ( _strnicmp ( ext , extension [ i ] , 3 ) = = 0 ) {
2005-12-08 10:27:26 +01:00
return format [ i ] ;
}
}
}
return - 1 ;
2005-12-02 14:34:15 +01:00
}
2015-10-18 16:07:40 +02:00
static char get_next_file ( int imageno , dircnt_t * dirptr , img_fol_t * img_fol , opj_decompress_parameters * parameters ) {
2007-02-26 16:40:01 +01:00
char image_filename [ OPJ_PATH_LEN ] , infilename [ OPJ_PATH_LEN ] , outfilename [ OPJ_PATH_LEN ] , temp_ofname [ OPJ_PATH_LEN ] ;
2007-08-21 12:50:47 +02:00
char * temp_p , temp1 [ OPJ_PATH_LEN ] = " " ;
2007-02-26 16:40:01 +01:00
strcpy ( image_filename , dirptr - > filename [ imageno ] ) ;
2007-02-28 16:31:56 +01:00
fprintf ( stderr , " File Number %d \" %s \" \n " , imageno , image_filename ) ;
2007-02-26 16:40:01 +01:00
parameters - > decod_format = get_file_format ( image_filename ) ;
2007-02-27 15:19:09 +01:00
if ( parameters - > decod_format = = - 1 )
return 1 ;
2007-02-26 16:40:01 +01:00
sprintf ( infilename , " %s/%s " , img_fol - > imgdirpath , image_filename ) ;
strncpy ( parameters - > infile , infilename , sizeof ( infilename ) ) ;
2011-12-16 11:29:30 +01:00
/*Set output file*/
2007-02-26 16:40:01 +01:00
strcpy ( temp_ofname , strtok ( image_filename , " . " ) ) ;
2007-08-21 12:50:47 +02:00
while ( ( temp_p = strtok ( NULL , " . " ) ) ! = NULL ) {
strcat ( temp_ofname , temp1 ) ;
sprintf ( temp1 , " .%s " , temp_p ) ;
}
2007-02-26 16:40:01 +01:00
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 ) ) ;
}
2007-02-27 15:19:09 +01:00
return 0 ;
2007-02-26 16:40:01 +01:00
}
2007-09-07 17:01:55 +02:00
/* -------------------------------------------------------------------------- */
2015-10-18 16:07:40 +02:00
static int parse_cmdline_decoder ( int argc , char * * argv , opj_decompress_parameters * parameters , img_fol_t * img_fol , char * indexfilename ) {
2005-12-08 10:27:26 +01:00
/* parse the command line */
2011-07-29 10:50:55 +02:00
int totlen , c ;
2011-09-01 14:08:10 +02:00
opj_option_t long_option [ ] = {
2007-02-26 16:40:01 +01:00
{ " ImgDir " , REQ_ARG , NULL , ' y ' } ,
2015-10-18 16:07:40 +02:00
{ " OutFor " , REQ_ARG , NULL , ' O ' } ,
{ " force-rgb " , NO_ARG , NULL , 1 } ,
{ " upsample " , NO_ARG , NULL , 1 } ,
2015-09-15 18:00:52 +02:00
# ifdef USE_SYSTEM_GETOPT
2015-10-18 16:07:40 +02:00
{ 0 , 0 , 0 , 0 } /* GNU getopt_long requirement */
2015-09-15 18:00:52 +02:00
# endif
2007-02-26 16:40:01 +01:00
} ;
2005-12-08 10:27:26 +01:00
2015-10-18 16:07:40 +02:00
const char optlist [ ] = " i:o:r:l:x:p: "
2006-12-04 15:55:38 +01:00
2007-07-17 18:19:41 +02:00
/* UniPG>> */
2006-12-04 15:55:38 +01:00
# ifdef USE_JPWL
" W: "
# endif /* USE_JPWL */
/* <<UniPG */
2010-10-19 12:06:47 +02:00
" h " ;
2015-10-18 16:07:40 +02:00
long_option [ 2 ] . flag = & ( parameters - > force_rgb ) ;
long_option [ 3 ] . flag = & ( parameters - > upsample ) ;
totlen = sizeof ( long_option ) ;
2007-02-26 16:40:01 +01:00
img_fol - > set_out_format = 0 ;
2011-07-29 10:50:55 +02:00
do {
2014-03-18 17:26:39 +01:00
# ifdef USE_SYSTEM_GETOPT
c = opj_getopt_long ( argc , argv , optlist , long_option , 0 ) ;
# else
2011-09-01 14:08:10 +02:00
c = opj_getopt_long ( argc , argv , optlist , long_option , totlen ) ;
2014-03-18 17:26:39 +01:00
# endif
2005-12-08 10:27:26 +01:00
if ( c = = - 1 )
break ;
switch ( c ) {
2015-10-18 16:07:40 +02:00
case 0 : /* long opt with flag */
break ;
2005-12-08 10:27:26 +01:00
case ' i ' : /* input file */
{
2011-09-01 14:08:10 +02:00
char * infile = opj_optarg ;
2005-12-08 10:27:26 +01:00
parameters - > decod_format = get_file_format ( infile ) ;
switch ( parameters - > decod_format ) {
case J2K_CFMT :
case JP2_CFMT :
case JPT_CFMT :
break ;
default :
fprintf ( stderr ,
" !! Unrecognized format for infile : %s [accept only *.j2k, *.jp2, *.jpc or *.jpt] !! \n \n " ,
infile ) ;
return 1 ;
}
2007-02-13 10:00:37 +01:00
strncpy ( parameters - > infile , infile , sizeof ( parameters - > infile ) - 1 ) ;
2005-12-08 10:27:26 +01:00
}
break ;
/* ----------------------------------------------------- */
case ' o ' : /* output file */
{
2011-09-01 14:08:10 +02:00
char * outfile = opj_optarg ;
2005-12-08 10:27:26 +01:00
parameters - > cod_format = get_file_format ( outfile ) ;
switch ( parameters - > cod_format ) {
case PGX_DFMT :
case PXM_DFMT :
case BMP_DFMT :
2007-02-28 16:31:56 +01:00
case TIF_DFMT :
2007-07-17 18:19:41 +02:00
case RAW_DFMT :
2007-08-20 17:20:42 +02:00
case TGA_DFMT :
2010-03-26 16:46:17 +01:00
case PNG_DFMT :
2005-12-08 10:27:26 +01:00
break ;
default :
2007-08-20 17:20:42 +02:00
fprintf ( stderr , " Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n " , outfile ) ;
2005-12-08 10:27:26 +01:00
return 1 ;
}
2007-02-13 10:00:37 +01:00
strncpy ( parameters - > outfile , outfile , sizeof ( parameters - > outfile ) - 1 ) ;
2005-12-08 10:27:26 +01:00
}
break ;
/* ----------------------------------------------------- */
2007-02-26 16:40:01 +01:00
case ' O ' : /* output format */
{
char outformat [ 50 ] ;
2011-09-01 14:08:10 +02:00
char * of = opj_optarg ;
2007-02-26 16:40:01 +01:00
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 ;
2007-02-28 16:31:56 +01:00
case TIF_DFMT :
img_fol - > out_format = " tif " ;
break ;
2007-07-17 18:19:41 +02:00
case RAW_DFMT :
img_fol - > out_format = " raw " ;
break ;
2007-08-20 17:20:42 +02:00
case TGA_DFMT :
img_fol - > out_format = " raw " ;
break ;
2010-03-26 16:46:17 +01:00
case PNG_DFMT :
img_fol - > out_format = " png " ;
break ;
2007-02-26 16:40:01 +01:00
default :
2007-08-20 17:20:42 +02:00
fprintf ( stderr , " Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n " , outformat ) ;
2007-02-26 16:40:01 +01:00
return 1 ;
break ;
}
}
break ;
/* ----------------------------------------------------- */
2005-12-08 10:27:26 +01:00
case ' r ' : /* reduce option */
{
2015-10-18 16:07:40 +02:00
sscanf ( opj_optarg , " %d " , & parameters - > core . cp_reduce ) ;
2005-12-08 10:27:26 +01:00
}
break ;
/* ----------------------------------------------------- */
2005-01-26 09:59:49 +01:00
2005-12-02 14:34:15 +01:00
2005-12-08 10:27:26 +01:00
case ' l ' : /* layering option */
{
2015-10-18 16:07:40 +02:00
sscanf ( opj_optarg , " %d " , & parameters - > core . cp_layer ) ;
2005-12-08 10:27:26 +01:00
}
break ;
/* ----------------------------------------------------- */
2007-02-26 16:40:01 +01:00
2005-12-08 10:27:26 +01:00
case ' h ' : /* display an help description */
decode_help_display ( ) ;
2006-01-31 22:26:11 +01:00
return 1 ;
2007-02-26 16:40:01 +01:00
/* ------------------------------------------------------ */
case ' y ' : /* Image Directory path */
{
2011-09-01 14:08:10 +02:00
img_fol - > imgdirpath = ( char * ) malloc ( strlen ( opj_optarg ) + 1 ) ;
strcpy ( img_fol - > imgdirpath , opj_optarg ) ;
2007-02-26 16:40:01 +01:00
img_fol - > set_imgdir = 1 ;
}
break ;
2007-09-07 17:01:55 +02:00
/* ----------------------------------------------------- */
case ' x ' : /* Creation of index file */
{
2011-09-01 14:08:10 +02:00
char * index = opj_optarg ;
2007-09-07 17:01:55 +02:00
strncpy ( indexfilename , index , OPJ_PATH_LEN ) ;
}
break ;
2007-02-26 16:40:01 +01:00
/* ----------------------------------------------------- */
2015-10-18 16:07:40 +02:00
case ' p ' : /* Force precision */
{
if ( ! parse_precision ( opj_optarg , parameters ) )
{
return 1 ;
}
}
break ;
/* ----------------------------------------------------- */
2007-09-07 17:01:55 +02:00
/* UniPG>> */
2006-12-04 15:55:38 +01:00
# ifdef USE_JPWL
case ' W ' : /* activate JPWL correction */
{
char * token = NULL ;
2011-09-01 14:08:10 +02:00
token = strtok ( opj_optarg , " , " ) ;
2006-12-04 15:55:38 +01:00
while ( token ! = NULL ) {
/* search expected number of components */
if ( * token = = ' c ' ) {
static int compno ;
compno = JPWL_EXPECTED_COMPONENTS ; /* predefined no. of components */
if ( sscanf ( token , " c=%d " , & compno ) = = 1 ) {
/* Specified */
if ( ( compno < 1 ) | | ( compno > 256 ) ) {
fprintf ( stderr , " ERROR -> invalid number of components c = %d \n " , compno ) ;
return 1 ;
}
parameters - > jpwl_exp_comps = compno ;
} else if ( ! strcmp ( token , " c " ) ) {
/* default */
parameters - > jpwl_exp_comps = compno ; /* auto for default size */
} else {
fprintf ( stderr , " ERROR -> invalid components specified = %s \n " , token ) ;
return 1 ;
} ;
}
/* search maximum number of tiles */
if ( * token = = ' t ' ) {
static int tileno ;
tileno = JPWL_MAXIMUM_TILES ; /* maximum no. of tiles */
if ( sscanf ( token , " t=%d " , & tileno ) = = 1 ) {
/* Specified */
if ( ( tileno < 1 ) | | ( tileno > JPWL_MAXIMUM_TILES ) ) {
fprintf ( stderr , " ERROR -> invalid number of tiles t = %d \n " , tileno ) ;
return 1 ;
}
parameters - > jpwl_max_tiles = tileno ;
} else if ( ! strcmp ( token , " t " ) ) {
/* default */
parameters - > jpwl_max_tiles = tileno ; /* auto for default size */
} else {
fprintf ( stderr , " ERROR -> invalid tiles specified = %s \n " , token ) ;
return 1 ;
} ;
}
/* next token or bust */
token = strtok ( NULL , " , " ) ;
} ;
2011-05-18 13:02:27 +02:00
parameters - > jpwl_correct = OPJ_TRUE ;
2006-12-04 15:55:38 +01:00
fprintf ( stdout , " JPWL correction capability activated \n " ) ;
fprintf ( stdout , " - expecting %d components \n " , parameters - > jpwl_exp_comps ) ;
}
break ;
# endif /* USE_JPWL */
/* <<UniPG */
2005-12-08 10:27:26 +01:00
/* ----------------------------------------------------- */
default :
2015-09-15 18:00:52 +02:00
fprintf ( stderr , " [WARNING] An invalid option has been ignored \n " ) ;
2005-12-08 10:27:26 +01:00
break ;
}
2011-07-29 10:50:55 +02:00
} while ( c ! = - 1 ) ;
2005-12-08 10:27:26 +01:00
/* check for possible errors */
2007-02-26 16:40:01 +01:00
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 " ) ;
2007-08-20 17:20:42 +02:00
fprintf ( stderr , " Only one format allowed! Valid format PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA!! \n " ) ;
2007-02-26 16:40:01 +01:00
return 1 ;
}
if ( ! ( ( parameters - > outfile [ 0 ] = = 0 ) ) ) {
fprintf ( stderr , " Error: options -ImgDir and -o cannot be used together !! \n " ) ;
return 1 ;
}
} else {
if ( ( parameters - > infile [ 0 ] = = 0 ) | | ( parameters - > outfile [ 0 ] = = 0 ) ) {
2010-10-21 11:53:13 +02:00
fprintf ( stderr , " Example: %s -i image.j2k -o image.pgm \n " , argv [ 0 ] ) ;
fprintf ( stderr , " Try: %s -h \n " , argv [ 0 ] ) ;
2007-02-26 16:40:01 +01:00
return 1 ;
}
2005-12-08 10:27:26 +01:00
}
return 0 ;
2005-12-02 14:34:15 +01:00
}
/* -------------------------------------------------------------------------- */
2015-10-18 16:07:40 +02:00
static void set_default_parameters ( opj_decompress_parameters * parameters )
{
if ( parameters ) {
memset ( parameters , 0 , sizeof ( opj_decompress_parameters ) ) ;
/* default decoding parameters (command line specific) */
parameters - > decod_format = - 1 ;
parameters - > cod_format = - 1 ;
/* default decoding parameters (core) */
opj_set_default_decoder_parameters ( & ( parameters - > core ) ) ;
}
}
static void destroy_parameters ( opj_decompress_parameters * parameters )
{
if ( parameters ) {
if ( parameters - > precision ) {
free ( parameters - > precision ) ;
parameters - > precision = NULL ;
}
}
}
/* -------------------------------------------------------------------------- */
2005-12-02 14:34:15 +01:00
/**
sample error callback expecting a FILE * client object
*/
2014-02-26 09:43:20 +01:00
static void error_callback ( const char * msg , void * client_data ) {
2005-12-08 10:27:26 +01:00
FILE * stream = ( FILE * ) client_data ;
fprintf ( stream , " [ERROR] %s " , msg ) ;
2005-12-02 14:34:15 +01:00
}
/**
sample warning callback expecting a FILE * client object
*/
2014-02-26 09:43:20 +01:00
static void warning_callback ( const char * msg , void * client_data ) {
2005-12-08 10:27:26 +01:00
FILE * stream = ( FILE * ) client_data ;
fprintf ( stream , " [WARNING] %s " , msg ) ;
2005-12-02 14:34:15 +01:00
}
/**
sample debug callback expecting no client object
*/
2014-02-26 09:43:20 +01:00
static void info_callback ( const char * msg , void * client_data ) {
2006-01-20 17:53:05 +01:00
( void ) client_data ;
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " [INFO] %s " , msg ) ;
2005-12-02 14:34:15 +01:00
}
/* -------------------------------------------------------------------------- */
2015-10-18 16:07:40 +02:00
static opj_image_t * convert_gray_to_rgb ( opj_image_t * original )
{
int compno ;
opj_image_t * l_new_image = NULL ;
opj_image_cmptparm_t * l_new_components = NULL ;
l_new_components = ( opj_image_cmptparm_t * ) malloc ( ( original - > numcomps + 2U ) * sizeof ( opj_image_cmptparm_t ) ) ;
if ( l_new_components = = NULL ) {
fprintf ( stderr , " ERROR -> j2k_to_image: failed to allocate memory for RGB image! \n " ) ;
opj_image_destroy ( original ) ;
return NULL ;
}
l_new_components [ 0 ] . bpp = l_new_components [ 1 ] . bpp = l_new_components [ 2 ] . bpp = original - > comps [ 0 ] . bpp ;
l_new_components [ 0 ] . dx = l_new_components [ 1 ] . dx = l_new_components [ 2 ] . dx = original - > comps [ 0 ] . dx ;
l_new_components [ 0 ] . dy = l_new_components [ 1 ] . dy = l_new_components [ 2 ] . dy = original - > comps [ 0 ] . dy ;
l_new_components [ 0 ] . h = l_new_components [ 1 ] . h = l_new_components [ 2 ] . h = original - > comps [ 0 ] . h ;
l_new_components [ 0 ] . w = l_new_components [ 1 ] . w = l_new_components [ 2 ] . w = original - > comps [ 0 ] . w ;
l_new_components [ 0 ] . prec = l_new_components [ 1 ] . prec = l_new_components [ 2 ] . prec = original - > comps [ 0 ] . prec ;
l_new_components [ 0 ] . sgnd = l_new_components [ 1 ] . sgnd = l_new_components [ 2 ] . sgnd = original - > comps [ 0 ] . sgnd ;
l_new_components [ 0 ] . x0 = l_new_components [ 1 ] . x0 = l_new_components [ 2 ] . x0 = original - > comps [ 0 ] . x0 ;
l_new_components [ 0 ] . y0 = l_new_components [ 1 ] . y0 = l_new_components [ 2 ] . y0 = original - > comps [ 0 ] . y0 ;
for ( compno = 1 ; compno < original - > numcomps ; + + compno ) {
l_new_components [ compno + 2 ] . bpp = original - > comps [ compno ] . bpp ;
l_new_components [ compno + 2 ] . dx = original - > comps [ compno ] . dx ;
l_new_components [ compno + 2 ] . dy = original - > comps [ compno ] . dy ;
l_new_components [ compno + 2 ] . h = original - > comps [ compno ] . h ;
l_new_components [ compno + 2 ] . w = original - > comps [ compno ] . w ;
l_new_components [ compno + 2 ] . prec = original - > comps [ compno ] . prec ;
l_new_components [ compno + 2 ] . sgnd = original - > comps [ compno ] . sgnd ;
l_new_components [ compno + 2 ] . x0 = original - > comps [ compno ] . x0 ;
l_new_components [ compno + 2 ] . y0 = original - > comps [ compno ] . y0 ;
}
l_new_image = opj_image_create ( original - > numcomps + 2 , l_new_components , CLRSPC_SRGB ) ;
free ( l_new_components ) ;
if ( l_new_image = = NULL ) {
fprintf ( stderr , " ERROR -> j2k_to_image: failed to allocate memory for RGB image! \n " ) ;
opj_image_destroy ( original ) ;
return NULL ;
}
l_new_image - > x0 = original - > x0 ;
l_new_image - > x1 = original - > x1 ;
l_new_image - > y0 = original - > y0 ;
l_new_image - > y1 = original - > y1 ;
l_new_image - > comps [ 0 ] . factor = l_new_image - > comps [ 1 ] . factor = l_new_image - > comps [ 2 ] . factor = original - > comps [ 0 ] . factor ;
l_new_image - > comps [ 0 ] . resno_decoded = l_new_image - > comps [ 1 ] . resno_decoded = l_new_image - > comps [ 2 ] . resno_decoded = original - > comps [ 0 ] . resno_decoded ;
memcpy ( l_new_image - > comps [ 0 ] . data , original - > comps [ 0 ] . data , original - > comps [ 0 ] . w * original - > comps [ 0 ] . h * sizeof ( int ) ) ;
memcpy ( l_new_image - > comps [ 1 ] . data , original - > comps [ 0 ] . data , original - > comps [ 0 ] . w * original - > comps [ 0 ] . h * sizeof ( int ) ) ;
memcpy ( l_new_image - > comps [ 2 ] . data , original - > comps [ 0 ] . data , original - > comps [ 0 ] . w * original - > comps [ 0 ] . h * sizeof ( int ) ) ;
for ( compno = 1 ; compno < original - > numcomps ; + + compno ) {
l_new_image - > comps [ compno + 2 ] . factor = original - > comps [ compno ] . factor ;
l_new_image - > comps [ compno + 2 ] . resno_decoded = original - > comps [ compno ] . resno_decoded ;
memcpy ( l_new_image - > comps [ compno + 2 ] . data , original - > comps [ compno ] . data , original - > comps [ compno ] . w * original - > comps [ compno ] . h * sizeof ( int ) ) ;
}
opj_image_destroy ( original ) ;
return l_new_image ;
}
/* -------------------------------------------------------------------------- */
static opj_image_t * upsample_image_components ( opj_image_t * original )
{
opj_image_t * l_new_image = NULL ;
opj_image_cmptparm_t * l_new_components = NULL ;
opj_bool l_upsample_need = OPJ_FALSE ;
int compno ;
for ( compno = 0 ; compno < original - > numcomps ; + + compno ) {
if ( original - > comps [ compno ] . factor > 0 ) {
fprintf ( stderr , " ERROR -> j2k_to_image: -upsample not supported with reduction \n " ) ;
opj_image_destroy ( original ) ;
return NULL ;
}
if ( ( original - > comps [ compno ] . dx > 1 ) | | ( original - > comps [ compno ] . dy > 1 ) ) {
l_upsample_need = OPJ_TRUE ;
break ;
}
}
if ( ! l_upsample_need ) {
return original ;
}
/* Upsample is needed */
l_new_components = ( opj_image_cmptparm_t * ) malloc ( original - > numcomps * sizeof ( opj_image_cmptparm_t ) ) ;
if ( l_new_components = = NULL ) {
fprintf ( stderr , " ERROR -> j2k_to_image: failed to allocate memory for upsampled components! \n " ) ;
opj_image_destroy ( original ) ;
return NULL ;
}
for ( compno = 0 ; compno < original - > numcomps ; + + compno ) {
opj_image_cmptparm_t * l_new_cmp = & ( l_new_components [ compno ] ) ;
opj_image_comp_t * l_org_cmp = & ( original - > comps [ compno ] ) ;
l_new_cmp - > bpp = l_org_cmp - > bpp ;
l_new_cmp - > prec = l_org_cmp - > prec ;
l_new_cmp - > sgnd = l_org_cmp - > sgnd ;
l_new_cmp - > x0 = original - > x0 ;
l_new_cmp - > y0 = original - > y0 ;
l_new_cmp - > dx = 1 ;
l_new_cmp - > dy = 1 ;
l_new_cmp - > w = l_org_cmp - > w ; /* should be original->x1 - original->x0 for dx==1 */
l_new_cmp - > h = l_org_cmp - > h ; /* should be original->y1 - original->y0 for dy==0 */
if ( l_org_cmp - > dx > 1 ) {
l_new_cmp - > w = original - > x1 - original - > x0 ;
}
if ( l_org_cmp - > dy > 1 ) {
l_new_cmp - > h = original - > y1 - original - > y0 ;
}
}
l_new_image = opj_image_create ( original - > numcomps , l_new_components , original - > color_space ) ;
free ( l_new_components ) ;
if ( l_new_image = = NULL ) {
fprintf ( stderr , " ERROR -> j2k_to_image: failed to allocate memory for upsampled components! \n " ) ;
opj_image_destroy ( original ) ;
return NULL ;
}
l_new_image - > x0 = original - > x0 ;
l_new_image - > x1 = original - > x1 ;
l_new_image - > y0 = original - > y0 ;
l_new_image - > y1 = original - > y1 ;
for ( compno = 0 ; compno < original - > numcomps ; + + compno ) {
opj_image_comp_t * l_new_cmp = & ( l_new_image - > comps [ compno ] ) ;
opj_image_comp_t * l_org_cmp = & ( original - > comps [ compno ] ) ;
l_new_cmp - > factor = l_org_cmp - > factor ;
l_new_cmp - > resno_decoded = l_org_cmp - > resno_decoded ;
if ( ( l_org_cmp - > dx > 1 ) | | ( l_org_cmp - > dy > 1 ) ) {
const int * l_src = l_org_cmp - > data ;
int * l_dst = l_new_cmp - > data ;
int y ;
int xoff , yoff ;
/* need to take into account dx & dy */
xoff = l_org_cmp - > dx * l_org_cmp - > x0 - original - > x0 ;
yoff = l_org_cmp - > dy * l_org_cmp - > y0 - original - > y0 ;
if ( ( xoff > = l_org_cmp - > dx ) | | ( yoff > = l_org_cmp - > dy ) ) {
fprintf ( stderr , " ERROR -> j2k_to_image: Invalid image/component parameters found when upsampling \n " ) ;
opj_image_destroy ( original ) ;
opj_image_destroy ( l_new_image ) ;
return NULL ;
}
for ( y = 0 ; y < yoff ; + + y ) {
memset ( l_dst , 0 , l_new_cmp - > w * sizeof ( int ) ) ;
l_dst + = l_new_cmp - > w ;
}
if ( l_new_cmp - > h > ( l_org_cmp - > dy - 1 ) ) { /* check subtraction overflow for really small images */
for ( ; y < l_new_cmp - > h - ( l_org_cmp - > dy - 1 ) ; y + = l_org_cmp - > dy ) {
int x , dy ;
int xorg ;
xorg = 0 ;
for ( x = 0 ; x < xoff ; + + x ) {
l_dst [ x ] = 0 ;
}
if ( l_new_cmp - > w > ( l_org_cmp - > dx - 1 ) ) { /* check subtraction overflow for really small images */
for ( ; x < l_new_cmp - > w - ( l_org_cmp - > dx - 1 ) ; x + = l_org_cmp - > dx , + + xorg ) {
int dx ;
for ( dx = 0 ; dx < l_org_cmp - > dx ; + + dx ) {
l_dst [ x + dx ] = l_src [ xorg ] ;
}
}
}
for ( ; x < l_new_cmp - > w ; + + x ) {
l_dst [ x ] = l_src [ xorg ] ;
}
l_dst + = l_new_cmp - > w ;
for ( dy = 1 ; dy < l_org_cmp - > dy ; + + dy ) {
memcpy ( l_dst , l_dst - l_new_cmp - > w , l_new_cmp - > w * sizeof ( int ) ) ;
l_dst + = l_new_cmp - > w ;
}
l_src + = l_org_cmp - > w ;
}
}
if ( y < l_new_cmp - > h ) {
int x ;
int xorg ;
xorg = 0 ;
for ( x = 0 ; x < xoff ; + + x ) {
l_dst [ x ] = 0 ;
}
if ( l_new_cmp - > w > ( l_org_cmp - > dx - 1 ) ) { /* check subtraction overflow for really small images */
for ( ; x < l_new_cmp - > w - ( l_org_cmp - > dx - 1 ) ; x + = l_org_cmp - > dx , + + xorg ) {
int dx ;
for ( dx = 0 ; dx < l_org_cmp - > dx ; + + dx ) {
l_dst [ x + dx ] = l_src [ xorg ] ;
}
}
}
for ( ; x < l_new_cmp - > w ; + + x ) {
l_dst [ x ] = l_src [ xorg ] ;
}
l_dst + = l_new_cmp - > w ;
+ + y ;
for ( ; y < l_new_cmp - > h ; + + y ) {
memcpy ( l_dst , l_dst - l_new_cmp - > w , l_new_cmp - > w * sizeof ( int ) ) ;
l_dst + = l_new_cmp - > w ;
}
}
}
else {
memcpy ( l_new_cmp - > data , l_org_cmp - > data , l_org_cmp - > w * l_org_cmp - > h * sizeof ( int ) ) ;
}
}
opj_image_destroy ( original ) ;
return l_new_image ;
}
/* -------------------------------------------------------------------------- */
2005-12-02 14:34:15 +01:00
int main ( int argc , char * * argv ) {
2015-10-18 16:07:40 +02:00
opj_decompress_parameters parameters ; /* decompression parameters */
2007-02-26 16:40:01 +01:00
img_fol_t img_fol ;
2005-12-08 10:27:26 +01:00
opj_event_mgr_t event_mgr ; /* event manager */
opj_image_t * image = NULL ;
FILE * fsrc = NULL ;
2006-07-21 22:28:44 +02:00
unsigned char * src = NULL ;
2005-12-08 10:27:26 +01:00
int file_length ;
2007-02-26 16:40:01 +01:00
int num_images ;
int i , imageno ;
2011-07-27 18:37:57 +02:00
dircnt_t * dirptr = NULL ;
2005-12-08 10:27:26 +01:00
opj_dinfo_t * dinfo = NULL ; /* handle to a decompressor */
opj_cio_t * cio = NULL ;
2007-09-07 17:01:55 +02:00
opj_codestream_info_t cstr_info ; /* Codestream information structure */
char indexfilename [ OPJ_PATH_LEN ] ; /* index file name */
2005-12-08 10:27:26 +01:00
/* configure the event callbacks (not required) */
memset ( & event_mgr , 0 , sizeof ( opj_event_mgr_t ) ) ;
event_mgr . error_handler = error_callback ;
event_mgr . warning_handler = warning_callback ;
event_mgr . info_handler = info_callback ;
/* set decoding parameters to default values */
2015-10-18 16:07:40 +02:00
set_default_parameters ( & parameters ) ;
2005-12-08 10:27:26 +01:00
2007-09-07 17:01:55 +02:00
/* Initialize indexfilename and img_fol */
* indexfilename = 0 ;
2007-09-06 18:49:15 +02:00
memset ( & img_fol , 0 , sizeof ( img_fol_t ) ) ;
2007-02-26 16:40:01 +01:00
/* parse input and get user encoding parameters */
2007-09-07 17:01:55 +02:00
if ( parse_cmdline_decoder ( argc , argv , & parameters , & img_fol , indexfilename ) = = 1 ) {
2015-10-18 16:07:40 +02:00
destroy_parameters ( & parameters ) ;
2007-09-07 15:06:36 +02:00
return 1 ;
2005-12-08 10:27:26 +01:00
}
2006-07-21 22:28:44 +02:00
2007-09-07 17:01:55 +02:00
/* Initialize reading of directory */
2007-02-26 16:40:01 +01:00
if ( img_fol . set_imgdir = = 1 ) {
num_images = get_num_images ( img_fol . imgdirpath ) ;
dirptr = ( dircnt_t * ) malloc ( sizeof ( dircnt_t ) ) ;
if ( dirptr ) {
2011-12-16 11:29:30 +01:00
dirptr - > filename_buf = ( char * ) malloc ( num_images * OPJ_PATH_LEN * sizeof ( char ) ) ; /* Stores at max 10 image file names*/
2007-02-26 16:40:01 +01:00
dirptr - > filename = ( char * * ) malloc ( num_images * sizeof ( char * ) ) ;
if ( ! dirptr - > filename_buf ) {
2015-10-18 16:07:40 +02:00
destroy_parameters ( & parameters ) ;
2010-06-29 21:08:45 +02:00
return 1 ;
2007-02-26 16:40:01 +01:00
}
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 ) {
2015-10-18 16:07:40 +02:00
destroy_parameters ( & parameters ) ;
2010-06-29 21:08:45 +02:00
return 1 ;
2007-02-26 16:40:01 +01:00
}
if ( num_images = = 0 ) {
fprintf ( stdout , " Folder is empty \n " ) ;
2015-10-18 16:07:40 +02:00
destroy_parameters ( & parameters ) ;
2010-06-29 21:08:45 +02:00
return 1 ;
2007-02-26 16:40:01 +01:00
}
} else {
num_images = 1 ;
2006-07-21 22:28:44 +02:00
}
2007-02-26 16:40:01 +01:00
/*Encoding image one by one*/
2007-09-07 17:01:55 +02:00
for ( imageno = 0 ; imageno < num_images ; imageno + + ) {
2007-02-26 16:40:01 +01:00
image = NULL ;
fprintf ( stderr , " \n " ) ;
if ( img_fol . set_imgdir = = 1 ) {
2007-02-27 15:19:09 +01:00
if ( get_next_file ( imageno , dirptr , & img_fol , & parameters ) ) {
fprintf ( stderr , " skipping file... \n " ) ;
continue ;
}
2007-02-26 16:40:01 +01:00
}
/* 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 ) ;
2015-10-18 16:07:40 +02:00
destroy_parameters ( & parameters ) ;
2007-02-26 16:40:01 +01:00
return 1 ;
}
fseek ( fsrc , 0 , SEEK_END ) ;
file_length = ftell ( fsrc ) ;
fseek ( fsrc , 0 , SEEK_SET ) ;
src = ( unsigned char * ) malloc ( file_length ) ;
2011-07-28 12:45:22 +02:00
if ( fread ( src , 1 , file_length , fsrc ) ! = ( size_t ) file_length )
2011-07-27 18:37:57 +02:00
{
free ( src ) ;
fclose ( fsrc ) ;
fprintf ( stderr , " \n ERROR: fread return a number of element different from the expected. \n " ) ;
2015-10-18 16:07:40 +02:00
destroy_parameters ( & parameters ) ;
2011-07-27 18:37:57 +02:00
return 1 ;
}
2007-02-26 16:40:01 +01:00
fclose ( fsrc ) ;
/* decode the code-stream */
/* ---------------------- */
2005-12-02 14:34:15 +01:00
2007-02-26 16:40:01 +01:00
switch ( parameters . decod_format ) {
2005-12-08 10:27:26 +01:00
case J2K_CFMT :
{
/* JPEG-2000 codestream */
/* get a decoder handle */
dinfo = opj_create_decompress ( CODEC_J2K ) ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* catch events using our callbacks and give a local context */
2006-07-21 22:28:44 +02:00
opj_set_event_mgr ( ( opj_common_ptr ) dinfo , & event_mgr , stderr ) ;
2005-12-08 10:27:26 +01:00
/* setup the decoder decoding parameters using user parameters */
2015-10-18 16:07:40 +02:00
opj_setup_decoder ( dinfo , & parameters . core ) ;
2005-12-08 10:27:26 +01:00
/* open a byte stream */
cio = opj_cio_open ( ( opj_common_ptr ) dinfo , src , file_length ) ;
/* decode the stream and fill the image structure */
2011-12-16 11:29:30 +01:00
if ( * indexfilename ) /* If need to extract codestream information*/
2007-09-17 17:11:20 +02:00
image = opj_decode_with_info ( dinfo , cio , & cstr_info ) ;
else
image = opj_decode ( dinfo , cio ) ;
2005-12-08 10:27:26 +01:00
if ( ! image ) {
fprintf ( stderr , " ERROR -> j2k_to_image: failed to decode image! \n " ) ;
opj_destroy_decompress ( dinfo ) ;
opj_cio_close ( cio ) ;
2011-10-20 18:36:45 +02:00
free ( src ) ;
2015-10-18 16:07:40 +02:00
destroy_parameters ( & parameters ) ;
2005-12-08 10:27:26 +01:00
return 1 ;
}
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* close the byte stream */
opj_cio_close ( cio ) ;
2007-09-07 17:01:55 +02:00
/* Write the index to disk */
if ( * indexfilename ) {
2011-07-29 10:50:55 +02:00
opj_bool bSuccess ;
2007-09-07 17:01:55 +02:00
bSuccess = write_index_file ( & cstr_info , indexfilename ) ;
if ( bSuccess ) {
fprintf ( stderr , " Failed to output index file \n " ) ;
}
}
2005-12-08 10:27:26 +01:00
}
break ;
case JP2_CFMT :
{
/* JPEG 2000 compressed image data */
/* get a decoder handle */
dinfo = opj_create_decompress ( CODEC_JP2 ) ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* catch events using our callbacks and give a local context */
2006-07-21 22:28:44 +02:00
opj_set_event_mgr ( ( opj_common_ptr ) dinfo , & event_mgr , stderr ) ;
2005-12-08 10:27:26 +01:00
2006-07-21 22:28:44 +02:00
/* setup the decoder decoding parameters using the current image and user parameters */
2015-10-18 16:07:40 +02:00
opj_setup_decoder ( dinfo , & parameters . core ) ;
2005-12-08 10:27:26 +01:00
/* open a byte stream */
cio = opj_cio_open ( ( opj_common_ptr ) dinfo , src , file_length ) ;
/* decode the stream and fill the image structure */
2011-12-16 11:29:30 +01:00
if ( * indexfilename ) /* If need to extract codestream information*/
2007-09-17 17:11:20 +02:00
image = opj_decode_with_info ( dinfo , cio , & cstr_info ) ;
else
image = opj_decode ( dinfo , cio ) ;
2005-12-08 10:27:26 +01:00
if ( ! image ) {
fprintf ( stderr , " ERROR -> j2k_to_image: failed to decode image! \n " ) ;
opj_destroy_decompress ( dinfo ) ;
opj_cio_close ( cio ) ;
2011-10-20 18:36:45 +02:00
free ( src ) ;
2015-10-18 16:07:40 +02:00
destroy_parameters ( & parameters ) ;
2005-12-08 10:27:26 +01:00
return 1 ;
}
/* close the byte stream */
opj_cio_close ( cio ) ;
2007-09-07 17:01:55 +02:00
/* Write the index to disk */
if ( * indexfilename ) {
2011-07-29 10:50:55 +02:00
opj_bool bSuccess ;
2007-09-07 17:01:55 +02:00
bSuccess = write_index_file ( & cstr_info , indexfilename ) ;
if ( bSuccess ) {
fprintf ( stderr , " Failed to output index file \n " ) ;
}
}
2005-12-08 10:27:26 +01:00
}
break ;
case JPT_CFMT :
{
/* JPEG 2000, JPIP */
/* get a decoder handle */
dinfo = opj_create_decompress ( CODEC_JPT ) ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* catch events using our callbacks and give a local context */
2006-07-21 22:28:44 +02:00
opj_set_event_mgr ( ( opj_common_ptr ) dinfo , & event_mgr , stderr ) ;
2005-12-08 10:27:26 +01:00
/* setup the decoder decoding parameters using user parameters */
2015-10-18 16:07:40 +02:00
opj_setup_decoder ( dinfo , & parameters . core ) ;
2005-12-08 10:27:26 +01:00
/* open a byte stream */
cio = opj_cio_open ( ( opj_common_ptr ) dinfo , src , file_length ) ;
/* decode the stream and fill the image structure */
2011-12-16 11:29:30 +01:00
if ( * indexfilename ) /* If need to extract codestream information*/
2007-09-17 17:11:20 +02:00
image = opj_decode_with_info ( dinfo , cio , & cstr_info ) ;
else
image = opj_decode ( dinfo , cio ) ;
2005-12-08 10:27:26 +01:00
if ( ! image ) {
2006-07-21 22:28:44 +02:00
fprintf ( stderr , " ERROR -> j2k_to_image: failed to decode image! \n " ) ;
2005-12-08 10:27:26 +01:00
opj_destroy_decompress ( dinfo ) ;
opj_cio_close ( cio ) ;
2011-10-20 18:36:45 +02:00
free ( src ) ;
2015-10-18 16:07:40 +02:00
destroy_parameters ( & parameters ) ;
2005-12-08 10:27:26 +01:00
return 1 ;
2006-07-21 22:28:44 +02:00
}
2005-12-08 10:27:26 +01:00
/* close the byte stream */
opj_cio_close ( cio ) ;
2007-09-07 17:01:55 +02:00
/* Write the index to disk */
if ( * indexfilename ) {
2011-07-29 10:50:55 +02:00
opj_bool bSuccess ;
2007-09-07 17:01:55 +02:00
bSuccess = write_index_file ( & cstr_info , indexfilename ) ;
if ( bSuccess ) {
fprintf ( stderr , " Failed to output index file \n " ) ;
}
}
2005-12-08 10:27:26 +01:00
}
break ;
default :
2007-02-28 16:31:56 +01:00
fprintf ( stderr , " skipping file.. \n " ) ;
2007-02-27 15:19:09 +01:00
continue ;
2005-12-08 10:27:26 +01:00
}
2006-07-21 22:28:44 +02:00
2007-02-26 16:40:01 +01:00
/* free the memory containing the code-stream */
free ( src ) ;
src = NULL ;
2005-12-02 14:34:15 +01:00
2015-10-18 16:07:40 +02:00
if ( image - > color_space = = CLRSPC_SYCC )
{
color_sycc_to_rgb ( image ) ;
}
2010-12-08 12:06:41 +01:00
2015-10-18 16:07:40 +02:00
if ( image - > icc_profile_buf )
{
2010-12-08 12:06:41 +01:00
# if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
2015-10-18 16:07:40 +02:00
color_apply_icc_profile ( image ) ;
2010-12-08 12:06:41 +01:00
# endif
2015-10-18 16:07:40 +02:00
free ( image - > icc_profile_buf ) ;
image - > icc_profile_buf = NULL ; image - > icc_profile_len = 0 ;
}
/* Force output precision */
/* ---------------------- */
if ( parameters . precision ! = NULL )
{
int compno ;
for ( compno = 0 ; compno < image - > numcomps ; + + compno )
{
int precno = compno ;
int prec ;
if ( precno > = parameters . nb_precision ) {
precno = parameters . nb_precision - 1U ;
}
prec = parameters . precision [ precno ] . prec ;
if ( prec = = 0 ) {
prec = image - > comps [ compno ] . prec ;
}
switch ( parameters . precision [ precno ] . mode ) {
case OPJ_PREC_MODE_CLIP :
clip_component ( & ( image - > comps [ compno ] ) , prec ) ;
break ;
case OPJ_PREC_MODE_SCALE :
scale_component ( & ( image - > comps [ compno ] ) , prec ) ;
break ;
default :
break ;
}
}
}
/* Upsample components */
/* ------------------- */
if ( parameters . upsample )
{
image = upsample_image_components ( image ) ;
if ( image = = NULL ) {
fprintf ( stderr , " ERROR -> j2k_to_image: failed to upsample image components! \n " ) ;
destroy_parameters ( & parameters ) ;
opj_destroy_decompress ( dinfo ) ;
return EXIT_FAILURE ;
}
}
/* Force RGB output */
/* ---------------- */
if ( parameters . force_rgb )
{
switch ( image - > color_space ) {
case CLRSPC_SRGB :
break ;
case CLRSPC_GRAY :
image = convert_gray_to_rgb ( image ) ;
break ;
default :
fprintf ( stderr , " ERROR -> j2k_to_image: don't know how to convert image to RGB colorspace! \n " ) ;
opj_image_destroy ( image ) ;
image = NULL ;
break ;
}
if ( image = = NULL ) {
fprintf ( stderr , " ERROR -> j2k_to_image: failed to convert to RGB image! \n " ) ;
destroy_parameters ( & parameters ) ;
opj_destroy_decompress ( dinfo ) ;
return EXIT_FAILURE ;
}
}
2010-12-08 12:06:41 +01:00
2007-02-26 16:40:01 +01:00
/* create output image */
/* ------------------- */
2007-02-28 16:31:56 +01:00
switch ( parameters . cod_format ) {
2005-12-08 10:27:26 +01:00
case PXM_DFMT : /* PNM PGM PPM */
2007-02-28 16:31:56 +01:00
if ( imagetopnm ( image , parameters . outfile ) ) {
fprintf ( stdout , " Outfile %s not generated \n " , parameters . outfile ) ;
}
else {
2007-03-29 16:15:14 +02:00
fprintf ( stdout , " Generated Outfile %s \n " , parameters . outfile ) ;
2007-02-28 16:31:56 +01:00
}
2005-12-08 10:27:26 +01:00
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case PGX_DFMT : /* PGX */
2007-02-28 16:31:56 +01:00
if ( imagetopgx ( image , parameters . outfile ) ) {
fprintf ( stdout , " Outfile %s not generated \n " , parameters . outfile ) ;
}
else {
2007-03-29 16:15:14 +02:00
fprintf ( stdout , " Generated Outfile %s \n " , parameters . outfile ) ;
2007-02-28 16:31:56 +01:00
}
2005-12-08 10:27:26 +01:00
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case BMP_DFMT : /* BMP */
2007-02-28 16:31:56 +01:00
if ( imagetobmp ( image , parameters . outfile ) ) {
fprintf ( stdout , " Outfile %s not generated \n " , parameters . outfile ) ;
}
else {
2007-03-29 16:15:14 +02:00
fprintf ( stdout , " Generated Outfile %s \n " , parameters . outfile ) ;
2007-02-26 16:40:01 +01:00
}
2007-02-28 16:31:56 +01:00
break ;
2010-10-05 12:33:15 +02:00
# ifdef HAVE_LIBTIFF
2007-02-28 16:31:56 +01:00
case TIF_DFMT : /* TIFF */
if ( imagetotif ( image , parameters . outfile ) ) {
fprintf ( stdout , " Outfile %s not generated \n " , parameters . outfile ) ;
2007-02-26 16:40:01 +01:00
}
2007-02-28 16:31:56 +01:00
else {
2007-03-29 16:15:14 +02:00
fprintf ( stdout , " Generated Outfile %s \n " , parameters . outfile ) ;
2007-02-28 16:31:56 +01:00
}
break ;
2010-10-05 12:33:15 +02:00
# endif /* HAVE_LIBTIFF */
2007-07-17 18:19:41 +02:00
case RAW_DFMT : /* RAW */
if ( imagetoraw ( image , parameters . outfile ) ) {
fprintf ( stdout , " Error generating raw file. Outfile %s not generated \n " , parameters . outfile ) ;
}
else {
fprintf ( stdout , " Successfully generated Outfile %s \n " , parameters . outfile ) ;
}
break ;
2007-08-20 17:20:42 +02:00
case TGA_DFMT : /* TGA */
if ( imagetotga ( image , parameters . outfile ) ) {
fprintf ( stdout , " Error generating tga file. Outfile %s not generated \n " , parameters . outfile ) ;
}
else {
fprintf ( stdout , " Successfully generated Outfile %s \n " , parameters . outfile ) ;
}
break ;
2010-10-05 12:33:15 +02:00
# ifdef HAVE_LIBPNG
2010-03-26 16:46:17 +01:00
case PNG_DFMT : /* PNG */
if ( imagetopng ( image , parameters . outfile ) ) {
fprintf ( stdout , " Error generating png file. Outfile %s not generated \n " , parameters . outfile ) ;
}
else {
fprintf ( stdout , " Successfully generated Outfile %s \n " , parameters . outfile ) ;
}
break ;
2010-10-05 12:33:15 +02:00
# endif /* HAVE_LIBPNG */
/* Can happen if output file is TIFF or PNG
* and HAVE_LIBTIF or HAVE_LIBPNG is undefined
*/
default :
fprintf ( stderr , " Outfile %s not generated \n " , parameters . outfile ) ;
2007-02-28 16:31:56 +01:00
}
/* free remaining structures */
if ( dinfo ) {
opj_destroy_decompress ( dinfo ) ;
}
2007-09-07 17:01:55 +02:00
/* free codestream information structure */
2007-09-17 17:11:20 +02:00
if ( * indexfilename )
opj_destroy_cstr_info ( & cstr_info ) ;
2007-02-28 16:31:56 +01:00
/* free image data structure */
opj_image_destroy ( image ) ;
2007-02-27 15:19:09 +01:00
2005-12-08 10:27:26 +01:00
}
2015-10-18 16:07:40 +02:00
destroy_parameters ( & parameters ) ;
2005-12-08 10:27:26 +01:00
return 0 ;
2003-11-27 11:07:31 +01:00
}
2011-12-16 11:29:30 +01:00
/*end main*/
2005-12-02 14:34:15 +01:00
2007-08-21 12:50:47 +02:00
2007-09-17 16:00:43 +02:00