2003-11-27 11:07:31 +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
2006-12-04 15:55:11 +01:00
* Copyright ( c ) 2001 - 2003 , David Janssens
2003-11-27 11:07:31 +01:00
* 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
2003-11-27 11:07:31 +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 .
*/
# include <stdio.h>
# include <string.h>
2005-12-02 14:34:15 +01:00
# include <stdlib.h>
# include "openjpeg.h"
2003-11-27 11:07:31 +01:00
# include "compat/getopt.h"
# include "convert.h"
2007-02-26 16:40:01 +01:00
# include "dirent.h"
2003-11-27 11:07:31 +01:00
2005-12-08 10:27:26 +01:00
# ifndef WIN32
# define stricmp strcasecmp
# define strnicmp strncasecmp
# endif
/* ----------------------------------------------------------------------- */
2005-12-02 14:34:15 +01:00
# define J2K_CFMT 0
# define JP2_CFMT 1
# define JPT_CFMT 2
2007-02-26 16:40:01 +01:00
# define PXM_DFMT 10
# define PGX_DFMT 11
# define BMP_DFMT 12
# define YUV_DFMT 13
2007-02-28 16:31:56 +01:00
# define TIF_DFMT 14
2005-12-02 14:34:15 +01:00
/* ----------------------------------------------------------------------- */
2007-03-07 17:04:33 +01:00
# define CINEMA_24_CS 1302083 /*Codestream length for 24fps*/
# define CINEMA_48_CS 651041 /*Codestream length for 48fps*/
2007-04-04 15:40:32 +02:00
# define COMP_24_CS 1041666 /*Maximum size per color component for 2K & 4K @ 24fps*/
# define COMP_48_CS 520833 /*Maximum size per color component for 2K @ 48fps*/
2005-12-02 14:34:15 +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*/
char * out_format ;
/** Enable option*/
char set_imgdir ;
/** Enable Cod Format for output*/
char set_out_format ;
} img_fol_t ;
2005-12-02 14:34:15 +01:00
void encode_help_display ( ) {
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " HELP \n ---- \n \n " ) ;
fprintf ( stdout , " - the -h option displays this help information on screen \n \n " ) ;
2006-12-04 15:55:11 +01:00
/* UniPG>> */
fprintf ( stdout , " List of parameters for the JPEG 2000 "
# ifdef USE_JPWL
" + JPWL "
# endif /* USE_JPWL */
" encoder: \n " ) ;
/* <<UniPG */
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " REMARKS: \n " ) ;
fprintf ( stdout , " --------- \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " The markers written to the main_header are : SOC SIZ COD QCD COM. \n " ) ;
fprintf ( stdout , " COD and QCD never appear in the tile_header. \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " - This coder can encode a mega image, a test was made on a 24000x24000 pixels \n " ) ;
fprintf ( stdout , " color image. You need enough disk space memory (twice the original) to encode \n " ) ;
fprintf ( stdout , " the image,i.e. for a 1.5 GB image you need a minimum of 3GB of disk memory) \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " By default: \n " ) ;
fprintf ( stdout , " ------------ \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " * Lossless \n " ) ;
fprintf ( stdout , " * 1 tile \n " ) ;
fprintf ( stdout , " * Size of precinct : 2^15 x 2^15 (means 1 precinct) \n " ) ;
fprintf ( stdout , " * Size of code-block : 64 x 64 \n " ) ;
fprintf ( stdout , " * Number of resolutions: 6 \n " ) ;
fprintf ( stdout , " * No SOP marker in the codestream \n " ) ;
fprintf ( stdout , " * No EPH marker in the codestream \n " ) ;
fprintf ( stdout , " * No sub-sampling in x or y direction \n " ) ;
fprintf ( stdout , " * No mode switch activated \n " ) ;
fprintf ( stdout , " * Progression order: LRCP \n " ) ;
fprintf ( stdout , " * No index file \n " ) ;
fprintf ( stdout , " * No ROI upshifted \n " ) ;
fprintf ( stdout , " * No offset of the origin of the image \n " ) ;
fprintf ( stdout , " * No offset of the origin of the tiles \n " ) ;
fprintf ( stdout , " * Reversible DWT 5-3 \n " ) ;
2006-12-04 15:55:11 +01:00
/* UniPG>> */
# ifdef USE_JPWL
fprintf ( stdout , " * No JPWL protection \n " ) ;
# endif /* USE_JPWL */
/* <<UniPG */
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " Parameters: \n " ) ;
fprintf ( stdout , " ------------ \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " Required Parameters (except with -h): \n " ) ;
2007-03-07 17:04:33 +01:00
fprintf ( stdout , " One of the two options -ImgDir or -i must be used \n " ) ;
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " \n " ) ;
2007-02-26 16:40:01 +01:00
fprintf ( stdout , " -ImgDir : Image file Directory path (example ../Images) \n " ) ;
2007-03-07 17:04:33 +01:00
fprintf ( stdout , " When using this option -OutFor must be used \n " ) ;
2007-02-26 16:40:01 +01:00
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 " ) ;
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " -i : source file (-i source.pnm also *.pgm, *.ppm) \n " ) ;
2007-03-07 17:04:33 +01:00
fprintf ( stdout , " When using this option -o must be used \n " ) ;
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -o : destination file (-o dest.j2k or .jp2) \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " Optional Parameters: \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -h : display the help information \n " ) ;
fprintf ( stdout , " \n " ) ;
2007-03-07 17:04:33 +01:00
fprintf ( stdout , " -cinema2k : Digital Cinema 2K profile compliant codestream for 2K resolution.(-cinema2k 24 or 48) \n " ) ;
fprintf ( stdout , " Need to specify the frames per second for a 2K resolution. Only 24 or 48 fps is allowed \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -cinema4k : Digital Cinema 4K profile compliant codestream for 4K resolution \n " ) ;
fprintf ( stdout , " Frames per second not required. Default value is 24fps \n " ) ;
fprintf ( stdout , " \n " ) ;
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " -r : different compression ratios for successive layers (-r 20,10,5) \n " ) ;
fprintf ( stdout , " - The rate specified for each quality level is the desired \n " ) ;
fprintf ( stdout , " compression factor. \n " ) ;
fprintf ( stdout , " Example: -r 20,10,1 means quality 1: compress 20x, \n " ) ;
fprintf ( stdout , " quality 2: compress 10x and quality 3: compress lossless \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " (options -r and -q cannot be used together) \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -q : different psnr for successive layers (-q 30,40,50) \n " ) ;
fprintf ( stdout , " (options -r and -q cannot be used together) \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -n : number of resolutions (-n 3) \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -b : size of code block (-b 32,32) \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -c : size of precinct (-c 128,128) \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -t : size of tile (-t 512,512) \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -s : subsampling factor (-s 2,2) [-s X,Y] \n " ) ;
fprintf ( stdout , " Remark: subsampling bigger than 2 can produce error \n " ) ;
fprintf ( stdout , " \n " ) ;
2007-04-04 15:40:32 +02:00
fprintf ( stdout , " -POC : Progression order change (-POC T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL) \n " ) ;
fprintf ( stdout , " Example: T1=0,0,1,5,3,CPRL \n " ) ;
fprintf ( stdout , " : Ttilenumber=Resolution num start,Component num start,Layer num end,Resolution num end,Component num end,Progression order \n " ) ;
fprintf ( stdout , " \n " ) ;
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " -SOP : write SOP marker before each packet \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -EPH : write EPH marker after each header packet \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -M : mode switch (-M 3) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL) \n " ) ;
fprintf ( stdout , " 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)] \n " ) ;
fprintf ( stdout , " Indicate multiple modes by adding their values. \n " ) ;
fprintf ( stdout , " ex: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38 \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -x : create an index file *.Idx (-x index_name.Idx) \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -ROI : c=%%d,U=%%d : quantization indices upshifted \n " ) ;
fprintf ( stdout , " for component c=%%d [%%d = 0,1,2] \n " ) ;
fprintf ( stdout , " with a value of U=%%d [0 <= %%d <= 37] (i.e. -ROI:c=0,U=25) \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -d : offset of the origin of the image (-d 150,300) \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -T : offset of the origin of the tiles (-T 100,75) \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " -I : use the irreversible DWT 9-7 (-I) \n " ) ;
fprintf ( stdout , " \n " ) ;
2006-12-04 15:55:11 +01:00
/* UniPG>> */
# ifdef USE_JPWL
fprintf ( stdout , " -W : adoption of JPWL (Part 11) capabilities (-W params) \n " ) ;
fprintf ( stdout , " The parameters can be written and repeated in any order: \n " ) ;
fprintf ( stdout , " [h<tile><=type>,s<tile><=method>,a=<addr>,z=<size>,g=<range>,... \n " ) ;
fprintf ( stdout , " ...,p<tile:pack><=type>] \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " h selects the header error protection (EPB): 'type' can be \n " ) ;
fprintf ( stdout , " [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS] \n " ) ;
fprintf ( stdout , " if 'tile' is absent, it applies to main and tile headers \n " ) ;
fprintf ( stdout , " if 'tile' is present, it applies from that tile \n " ) ;
fprintf ( stdout , " onwards, up to the next h<tile> spec, or to the last tile \n " ) ;
fprintf ( stdout , " in the codestream (max. %d specs) \n " , JPWL_MAX_NO_TILESPECS ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " p selects the packet error protection (EEP/UEP with EPBs) \n " ) ;
fprintf ( stdout , " to be applied to raw data: 'type' can be \n " ) ;
fprintf ( stdout , " [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS] \n " ) ;
fprintf ( stdout , " if 'tile:pack' is absent, it starts from tile 0, packet 0 \n " ) ;
fprintf ( stdout , " if 'tile:pack' is present, it applies from that tile \n " ) ;
fprintf ( stdout , " and that packet onwards, up to the next packet spec \n " ) ;
fprintf ( stdout , " or to the last packet in the last tile in the codestream \n " ) ;
fprintf ( stdout , " (max. %d specs) \n " , JPWL_MAX_NO_PACKSPECS ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " s enables sensitivity data insertion (ESD): 'method' can be \n " ) ;
fprintf ( stdout , " [-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR \n " ) ;
fprintf ( stdout , " 4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED] \n " ) ;
fprintf ( stdout , " if 'tile' is absent, it applies to main header only \n " ) ;
fprintf ( stdout , " if 'tile' is present, it applies from that tile \n " ) ;
fprintf ( stdout , " onwards, up to the next s<tile> spec, or to the last tile \n " ) ;
fprintf ( stdout , " in the codestream (max. %d specs) \n " , JPWL_MAX_NO_TILESPECS ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " g determines the addressing mode: <range> can be \n " ) ;
fprintf ( stdout , " [0=PACKET 1=BYTE RANGE 2=PACKET RANGE] \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " a determines the size of data addressing: <addr> can be \n " ) ;
fprintf ( stdout , " 2/4 bytes (small/large codestreams). If not set, auto-mode \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " z determines the size of sensitivity values: <size> can be \n " ) ;
fprintf ( stdout , " 1/2 bytes, for the transformed pseudo-floating point value \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " ex.: \n " ) ;
2006-12-05 19:20:04 +01:00
fprintf ( stdout , " h,h0=64,h3=16,h5=32,p0=78,p0:24=56,p1,p3:0=0,p3:20=32,s=0,s0=6,s3=-1,a=0,g=1,z=1 \n " ) ;
2006-12-04 15:55:11 +01:00
fprintf ( stdout , " means \n " ) ;
fprintf ( stdout , " predefined EPB in MH, rs(64,32) from TPH 0 to TPH 2, \n " ) ;
2006-12-05 19:20:04 +01:00
fprintf ( stdout , " CRC-16 in TPH 3 and TPH 4, CRC-32 in remaining TPHs, \n " ) ;
2006-12-04 15:55:11 +01:00
fprintf ( stdout , " UEP rs(78,32) for packets 0 to 23 of tile 0, \n " ) ;
fprintf ( stdout , " UEP rs(56,32) for packets 24 to the last of tile 0, \n " ) ;
fprintf ( stdout , " UEP rs default for packets of tile 1, \n " ) ;
fprintf ( stdout , " no UEP for packets 0 to 19 of tile 3, \n " ) ;
fprintf ( stdout , " UEP CRC-32 for packets 20 of tile 3 to last tile, \n " ) ;
fprintf ( stdout , " relative sensitivity ESD for MH, \n " ) ;
fprintf ( stdout , " TSE ESD from TPH 0 to TPH 2, byte range with automatic \n " ) ;
fprintf ( stdout , " size of addresses and 1 byte for each sensitivity value \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " ex.: \n " ) ;
fprintf ( stdout , " h,s,p \n " ) ;
fprintf ( stdout , " means \n " ) ;
fprintf ( stdout , " default protection to headers (MH and TPHs) as well as \n " ) ;
fprintf ( stdout , " data packets, one ESD in MH \n " ) ;
2006-12-05 19:20:04 +01:00
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " N.B.: use the following recommendations when specifying \n " ) ;
fprintf ( stdout , " the JPWL parameters list \n " ) ;
fprintf ( stdout , " - when you use UEP, always pair the 'p' option with 'h' \n " ) ;
fprintf ( stdout , " \n " ) ;
2006-12-04 15:55:11 +01:00
# endif /* USE_JPWL */
/* <<UniPG */
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " IMPORTANT: \n " ) ;
fprintf ( stdout , " ----------- \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " The index file has the structure below: \n " ) ;
fprintf ( stdout , " --------------------------------------- \n " ) ;
fprintf ( stdout , " \n " ) ;
fprintf ( stdout , " Image_height Image_width \n " ) ;
fprintf ( stdout , " progression order \n " ) ;
fprintf ( stdout , " Tiles_size_X Tiles_size_Y \n " ) ;
2006-12-04 15:55:11 +01:00
/* UniPG>> */
fprintf ( stdout , " Tiles_nb_X Tiles_nb_Y \n " ) ;
/* <<UniPG */
2005-12-08 10:27:26 +01:00
fprintf ( stdout , " Components_nb \n " ) ;
fprintf ( stdout , " Layers_nb \n " ) ;
fprintf ( stdout , " decomposition_levels \n " ) ;
fprintf ( stdout , " [Precincts_size_X_res_Nr Precincts_size_Y_res_Nr]... \n " ) ;
fprintf ( stdout , " [Precincts_size_X_res_0 Precincts_size_Y_res_0] \n " ) ;
fprintf ( stdout , " Main_header_end_position \n " ) ;
fprintf ( stdout , " Codestream_size \n " ) ;
fprintf ( stdout , " Tile_0 start_pos end_Theader end_pos TotalDisto NumPix MaxMSE \n " ) ;
fprintf ( stdout , " Tile_1 '' '' '' '' '' '' \n " ) ;
fprintf ( stdout , " ... \n " ) ;
fprintf ( stdout , " Tile_Nt '' '' '' '' '' '' \n " ) ;
fprintf ( stdout , " Tpacket_0 Tile layer res. comp. prec. start_pos end_pos disto \n " ) ;
fprintf ( stdout , " ... \n " ) ;
fprintf ( stdout , " Tpacket_Np '' '' '' '' '' '' '' '' \n " ) ;
fprintf ( stdout , " MaxDisto \n " ) ;
fprintf ( stdout , " TotalDisto \n \n " ) ;
2003-11-27 11:07:31 +01:00
}
2005-12-02 14:34:15 +01:00
OPJ_PROG_ORDER give_progression ( char progression [ 4 ] ) {
2005-12-08 10:27:26 +01:00
if ( strncmp ( progression , " LRCP " , 4 ) = = 0 ) {
return LRCP ;
}
if ( strncmp ( progression , " RLCP " , 4 ) = = 0 ) {
return RLCP ;
}
if ( strncmp ( progression , " RPCL " , 4 ) = = 0 ) {
return RPCL ;
}
if ( strncmp ( progression , " PCRL " , 4 ) = = 0 ) {
return PCRL ;
}
if ( strncmp ( progression , " CPRL " , 4 ) = = 0 ) {
return CPRL ;
}
return PROG_UNKNOWN ;
2003-11-27 11:07:31 +01:00
}
2007-02-26 16:40:01 +01:00
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 ;
}
2005-12-02 14:34:15 +01:00
int get_file_format ( char * filename ) {
2006-01-20 17:53:05 +01:00
unsigned int i ;
2006-07-21 22:28:44 +02:00
static const char * extension [ ] = {
2007-04-10 18:23:48 +02:00
" pgx " , " pnm " , " pgm " , " ppm " , " bmp " , " tif " , " j2k " , " jp2 " , " j2c "
2006-07-21 22:28:44 +02:00
} ;
static const int format [ ] = {
2007-04-10 18:23:48 +02:00
PGX_DFMT , PXM_DFMT , PXM_DFMT , PXM_DFMT , BMP_DFMT , TIF_DFMT , J2K_CFMT , JP2_CFMT , J2K_CFMT
2006-07-21 22:28:44 +02:00
} ;
2007-02-27 15:19:09 +01:00
char * ext = strrchr ( filename , ' . ' ) ;
if ( ext = = NULL )
return - 1 ;
ext + + ;
2006-01-26 21:02:04 +01:00
for ( i = 0 ; i < sizeof ( format ) / sizeof ( * format ) ; i + + ) {
2005-12-08 10:27:26 +01:00
if ( strnicmp ( ext , extension [ i ] , 3 ) = = 0 ) {
return format [ i ] ;
}
}
return - 1 ;
2003-11-27 11:07:31 +01:00
}
2007-02-26 16:40:01 +01:00
char * get_file_name ( char * name ) {
char * fname ;
fname = ( char * ) malloc ( OPJ_PATH_LEN * sizeof ( char ) ) ;
fname = strtok ( name , " . " ) ;
return fname ;
}
2007-02-27 15:19:09 +01:00
char get_next_file ( int imageno , dircnt_t * dirptr , img_fol_t * img_fol , opj_cparameters_t * 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 ] ;
strcpy ( image_filename , dirptr - > filename [ imageno ] ) ;
2007-02-27 15:19:09 +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 ) ) ;
//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 ) ) ;
}
2007-02-27 15:19:09 +01:00
return 0 ;
2007-02-26 16:40:01 +01:00
}
2007-04-04 15:40:32 +02:00
static int initialise_4K_poc ( opj_poc_t * POC , int numres ) {
POC [ 0 ] . tile = 1 ;
POC [ 0 ] . resno0 = 0 ;
POC [ 0 ] . compno0 = 0 ;
POC [ 0 ] . layno1 = 1 ;
POC [ 0 ] . resno1 = numres - 1 ;
POC [ 0 ] . compno1 = 3 ;
POC [ 0 ] . prg1 = CPRL ;
POC [ 1 ] . tile = 1 ;
POC [ 1 ] . resno0 = numres - 1 ;
POC [ 1 ] . compno0 = 0 ;
POC [ 1 ] . layno1 = 1 ;
POC [ 1 ] . resno1 = numres ;
POC [ 1 ] . compno1 = 3 ;
POC [ 1 ] . prg1 = CPRL ;
return 2 ;
}
2007-02-26 16:40:01 +01:00
2007-03-20 18:15:18 +01:00
void cinema_parameters ( opj_cparameters_t * parameters ) {
2007-03-07 17:04:33 +01:00
parameters - > tile_size_on = false ;
parameters - > cp_tdx = 1 ;
parameters - > cp_tdy = 1 ;
2007-03-20 18:15:18 +01:00
/*Tile part*/
parameters - > tp_flag = ' C ' ;
parameters - > tp_on = 1 ;
2007-03-07 17:04:33 +01:00
/*Tile and Image shall be at (0,0)*/
2007-03-20 18:15:18 +01:00
parameters - > cp_tx0 = 0 ;
parameters - > cp_ty0 = 0 ;
parameters - > image_offset_x0 = 0 ;
parameters - > image_offset_y0 = 0 ;
2007-03-07 17:04:33 +01:00
/*Codeblock size= 32*32*/
parameters - > cblockw_init = 32 ;
parameters - > cblockh_init = 32 ;
2007-03-20 18:15:18 +01:00
parameters - > csty | = 0x01 ;
2007-03-07 17:04:33 +01:00
/*The progression order shall be CPRL*/
2007-03-20 18:15:18 +01:00
parameters - > prog_order = CPRL ;
2007-03-07 17:04:33 +01:00
/* No ROI */
parameters - > roi_compno = - 1 ;
2007-02-26 16:40:01 +01:00
2007-03-07 17:04:33 +01:00
parameters - > subsampling_dx = 1 ; parameters - > subsampling_dy = 1 ;
2007-03-20 18:15:18 +01:00
}
void cinema_setup_encoder ( opj_cparameters_t * parameters , opj_image_t * image ) {
int i ;
float temp_rate ;
2007-04-04 15:40:32 +02:00
opj_poc_t * POC = NULL ;
2007-03-20 18:15:18 +01:00
switch ( parameters - > cp_cinema ) {
case CINEMA2K_24 :
case CINEMA2K_48 :
if ( parameters - > numresolution > 6 ) {
parameters - > numresolution = 6 ;
}
2007-04-10 18:23:48 +02:00
if ( ! ( ( image - > comps [ 0 ] . w = = 2048 ) | ( image - > comps [ 0 ] . h = = 1080 ) ) ) {
2007-03-29 16:15:14 +02:00
fprintf ( stdout , " Image coordinates %d x %d is not 2K compliant. \n DCI 2K compliance requires that atleast one of coordinates match 2048 x 1080 \n " , image - > comps [ 0 ] . w , image - > comps [ 0 ] . h ) ;
parameters - > cp_rsiz = STD_RSIZ ;
2007-03-20 18:15:18 +01:00
}
break ;
case CINEMA4K_24 :
if ( parameters - > numresolution < 1 ) {
parameters - > numresolution = 1 ;
2007-04-04 15:40:32 +02:00
} else if ( parameters - > numresolution > 7 ) {
2007-03-20 18:15:18 +01:00
parameters - > numresolution = 7 ;
}
2007-04-10 18:23:48 +02:00
if ( ! ( ( image - > comps [ 0 ] . w = = 4096 ) | ( image - > comps [ 0 ] . h = = 2160 ) ) ) {
2007-03-29 16:15:14 +02:00
fprintf ( stdout , " Image coordinates %d x %d is not 4K compliant. \n DCI 4K compliance requires that atleast one of coordinates match 4096 x 2160 \n " , image - > comps [ 0 ] . w , image - > comps [ 0 ] . h ) ;
parameters - > cp_rsiz = STD_RSIZ ;
2007-03-20 18:15:18 +01:00
}
2007-04-04 15:40:32 +02:00
parameters - > numpocs = initialise_4K_poc ( parameters - > POC , parameters - > numresolution ) ;
2007-03-20 18:15:18 +01:00
break ;
}
2007-03-07 17:04:33 +01:00
switch ( parameters - > cp_cinema ) {
case CINEMA2K_24 :
case CINEMA4K_24 :
for ( i = 0 ; i < parameters - > tcp_numlayers ; i + + ) {
temp_rate = 0 ;
if ( parameters - > tcp_rates [ i ] = = 0 ) {
parameters - > tcp_rates [ 0 ] = ( ( float ) ( image - > numcomps * image - > comps [ 0 ] . w * image - > comps [ 0 ] . h * image - > comps [ 0 ] . prec ) ) /
( CINEMA_24_CS * 8 * image - > comps [ 0 ] . dx * image - > comps [ 0 ] . dy ) ;
} else {
temp_rate = ( ( float ) ( image - > numcomps * image - > comps [ 0 ] . w * image - > comps [ 0 ] . h * image - > comps [ 0 ] . prec ) ) /
( parameters - > tcp_rates [ i ] * 8 * image - > comps [ 0 ] . dx * image - > comps [ 0 ] . dy ) ;
if ( temp_rate > CINEMA_24_CS ) {
parameters - > tcp_rates [ i ] = ( ( float ) ( image - > numcomps * image - > comps [ 0 ] . w * image - > comps [ 0 ] . h * image - > comps [ 0 ] . prec ) ) /
( CINEMA_24_CS * 8 * image - > comps [ 0 ] . dx * image - > comps [ 0 ] . dy ) ;
}
}
}
2007-04-04 15:40:32 +02:00
parameters - > max_comp_size = COMP_24_CS ;
2007-03-07 17:04:33 +01:00
break ;
case CINEMA2K_48 :
2007-03-20 18:15:18 +01:00
for ( i = 0 ; i < parameters - > tcp_numlayers ; i + + ) {
2007-03-29 16:15:14 +02:00
temp_rate = 0 ;
2007-03-07 17:04:33 +01:00
if ( parameters - > tcp_rates [ i ] = = 0 ) {
parameters - > tcp_rates [ 0 ] = ( ( float ) ( image - > numcomps * image - > comps [ 0 ] . w * image - > comps [ 0 ] . h * image - > comps [ 0 ] . prec ) ) /
( CINEMA_48_CS * 8 * image - > comps [ 0 ] . dx * image - > comps [ 0 ] . dy ) ;
} else {
2007-03-29 16:15:14 +02:00
temp_rate = ( ( float ) ( image - > numcomps * image - > comps [ 0 ] . w * image - > comps [ 0 ] . h * image - > comps [ 0 ] . prec ) ) /
2007-03-07 17:04:33 +01:00
( parameters - > tcp_rates [ i ] * 8 * image - > comps [ 0 ] . dx * image - > comps [ 0 ] . dy ) ;
2007-03-29 16:15:14 +02:00
if ( temp_rate > CINEMA_48_CS ) {
2007-03-07 17:04:33 +01:00
parameters - > tcp_rates [ 0 ] = ( ( float ) ( image - > numcomps * image - > comps [ 0 ] . w * image - > comps [ 0 ] . h * image - > comps [ 0 ] . prec ) ) /
( CINEMA_48_CS * 8 * image - > comps [ 0 ] . dx * image - > comps [ 0 ] . dy ) ;
}
}
}
2007-04-04 15:40:32 +02:00
parameters - > max_comp_size = COMP_48_CS ;
2007-03-07 17:04:33 +01:00
break ;
2007-03-29 16:15:14 +02:00
}
2007-03-07 17:04:33 +01:00
parameters - > cp_disto_alloc = 1 ;
}
2005-12-02 14:34:15 +01:00
2007-02-26 16:40:01 +01:00
/* ------------------------------------------------------------------------------------ */
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 [ ] = {
2007-03-29 16:15:14 +02:00
{ " cinema2K " , REQ_ARG , NULL , ' w ' } ,
{ " cinema4K " , NO_ARG , NULL , ' y ' } ,
2007-03-07 17:04:33 +01:00
{ " ImgDir " , REQ_ARG , NULL , ' z ' } ,
2007-02-26 16:40:01 +01:00
{ " TP " , REQ_ARG , NULL , ' v ' } ,
{ " SOP " , NO_ARG , NULL , ' S ' } ,
{ " EPH " , NO_ARG , NULL , ' E ' } ,
{ " OutFor " , REQ_ARG , NULL , ' O ' } ,
2007-04-04 15:40:32 +02:00
{ " POC " , REQ_ARG , NULL , ' P ' } ,
2007-02-26 16:40:01 +01:00
} ;
2005-12-08 10:27:26 +01:00
/* parse the command line */
2006-12-04 15:55:11 +01:00
/* UniPG>> */
const char optlist [ ] = " i:o:hr:q:n:b:c:t:p:s:SEM:x:R:d:T:If:P:C: "
# ifdef USE_JPWL
" W: "
# endif /* USE_JPWL */
;
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
totlen = sizeof ( long_option ) ;
img_fol - > set_out_format = 0 ;
2005-12-08 10:27:26 +01:00
while ( 1 ) {
2007-03-29 16:15:14 +02:00
int c = getopt_long ( argc , argv , optlist , long_option , totlen ) ;
2006-12-04 15:55:11 +01:00
/* <<UniPG */
2005-12-08 10:27:26 +01:00
if ( c = = - 1 )
break ;
switch ( c ) {
case ' i ' : /* input file */
{
char * infile = optarg ;
parameters - > decod_format = get_file_format ( infile ) ;
switch ( parameters - > decod_format ) {
case PGX_DFMT :
case PXM_DFMT :
case BMP_DFMT :
2007-02-28 16:31:56 +01:00
case TIF_DFMT :
2005-12-08 10:27:26 +01:00
break ;
default :
2006-07-21 22:28:44 +02:00
fprintf ( stderr ,
" !! Unrecognized format for infile : %s "
2007-02-28 16:31:56 +01:00
" [accept only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp or *.tif] !! \n \n " ,
2005-12-08 10:27:26 +01:00
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 ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ----------------------------------------------------- */
case ' o ' : /* output file */
{
char * outfile = optarg ;
parameters - > cod_format = get_file_format ( outfile ) ;
switch ( parameters - > cod_format ) {
case J2K_CFMT :
case JP2_CFMT :
break ;
default :
fprintf ( stderr , " Unknown output format image %s [only *.j2k, *.jp2]!! \n " , outfile ) ;
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-04-04 15:40:32 +02:00
case ' O ' : /* output format */
2007-02-26 16:40:01 +01:00
{
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 ) {
2007-04-10 18:23:48 +02:00
case J2K_CFMT :
case JP2_CFMT :
img_fol - > out_format = optarg ;
break ;
default :
fprintf ( stderr , " Unknown output format image [only j2k, jp2]!! \n " ) ;
return 1 ;
2007-02-26 16:40:01 +01:00
}
}
break ;
/* ----------------------------------------------------- */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' r ' : /* rates rates/distorsion */
{
char * s = optarg ;
2006-10-31 18:10:14 +01:00
while ( sscanf ( s , " %f " , & parameters - > tcp_rates [ parameters - > tcp_numlayers ] ) = = 1 ) {
2005-12-08 10:27:26 +01:00
parameters - > tcp_numlayers + + ;
while ( * s & & * s ! = ' , ' ) {
s + + ;
}
if ( ! * s )
break ;
s + + ;
}
parameters - > cp_disto_alloc = 1 ;
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ----------------------------------------------------- */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' q ' : /* add fixed_quality */
{
char * s = optarg ;
while ( sscanf ( s , " %f " , & parameters - > tcp_distoratio [ parameters - > tcp_numlayers ] ) = = 1 ) {
parameters - > tcp_numlayers + + ;
while ( * s & & * s ! = ' , ' ) {
s + + ;
}
if ( ! * s )
break ;
s + + ;
}
parameters - > cp_fixed_quality = 1 ;
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* dda */
/* ----------------------------------------------------- */
case ' f ' : /* mod fixed_quality (before : -q) */
{
int * row = NULL , * col = NULL ;
int numlayers = 0 , numresolution = 0 , matrix_width = 0 ;
char * s = optarg ;
sscanf ( s , " %d " , & numlayers ) ;
s + + ;
if ( numlayers > 9 )
s + + ;
parameters - > tcp_numlayers = numlayers ;
numresolution = parameters - > numresolution ;
matrix_width = numresolution * 3 ;
parameters - > cp_matrice = ( int * ) malloc ( numlayers * matrix_width * sizeof ( int ) ) ;
s = s + 2 ;
for ( i = 0 ; i < numlayers ; i + + ) {
row = & parameters - > cp_matrice [ i * matrix_width ] ;
col = row ;
parameters - > tcp_rates [ i ] = 1 ;
sscanf ( s , " %d, " , & col [ 0 ] ) ;
s + = 2 ;
if ( col [ 0 ] > 9 )
s + + ;
col [ 1 ] = 0 ;
col [ 2 ] = 0 ;
for ( j = 1 ; j < numresolution ; j + + ) {
col + = 3 ;
sscanf ( s , " %d,%d,%d " , & col [ 0 ] , & col [ 1 ] , & col [ 2 ] ) ;
s + = 6 ;
if ( col [ 0 ] > 9 )
s + + ;
if ( col [ 1 ] > 9 )
s + + ;
if ( col [ 2 ] > 9 )
s + + ;
}
if ( i < numlayers - 1 )
s + + ;
}
parameters - > cp_fixed_alloc = 1 ;
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ----------------------------------------------------- */
case ' t ' : /* tiles */
{
sscanf ( optarg , " %d,%d " , & parameters - > cp_tdx , & parameters - > cp_tdy ) ;
parameters - > tile_size_on = true ;
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ----------------------------------------------------- */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' n ' : /* resolution */
{
sscanf ( optarg , " %d " , & parameters - > numresolution ) ;
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ----------------------------------------------------- */
case ' c ' : /* precinct dimension */
{
char sep ;
int res_spec = 0 ;
char * s = optarg ;
do {
sep = 0 ;
2006-07-21 22:28:44 +02:00
sscanf ( s , " [%d,%d]%c " , & parameters - > prcw_init [ res_spec ] ,
& parameters - > prch_init [ res_spec ] , & sep ) ;
2005-12-08 10:27:26 +01:00
parameters - > csty | = 0x01 ;
res_spec + + ;
s = strpbrk ( s , " ] " ) + 2 ;
}
while ( sep = = ' , ' ) ;
parameters - > res_spec = res_spec ;
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ----------------------------------------------------- */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' b ' : /* code-block dimension */
{
int cblockw_init = 0 , cblockh_init = 0 ;
sscanf ( optarg , " %d,%d " , & cblockw_init , & cblockh_init ) ;
if ( cblockw_init * cblockh_init > 4096 | | cblockw_init > 1024
| | cblockw_init < 4 | | cblockh_init > 1024 | | cblockh_init < 4 ) {
fprintf ( stderr ,
2006-07-21 22:28:44 +02:00
" !! Size of code_block error (option -b) !! \n \n Restriction : \n "
" * width*height<=4096 \n * 4<=width,height<= 1024 \n \n " ) ;
2005-12-08 10:27:26 +01:00
return 1 ;
}
parameters - > cblockw_init = cblockw_init ;
parameters - > cblockh_init = cblockh_init ;
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ----------------------------------------------------- */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' x ' : /* creation of index file */
{
char * index = optarg ;
2007-02-13 10:00:37 +01:00
strncpy ( parameters - > index , index , sizeof ( parameters - > index ) - 1 ) ;
2005-12-08 10:27:26 +01:00
parameters - > index_on = 1 ;
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ----------------------------------------------------- */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' p ' : /* progression order */
{
char progression [ 4 ] ;
strncpy ( progression , optarg , 4 ) ;
parameters - > prog_order = give_progression ( progression ) ;
if ( parameters - > prog_order = = - 1 ) {
2006-07-21 22:28:44 +02:00
fprintf ( stderr , " Unrecognized progression order "
" [LRCP, RLCP, RPCL, PCRL, CPRL] !! \n " ) ;
2005-12-08 10:27:26 +01:00
return 1 ;
}
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ----------------------------------------------------- */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' s ' : /* subsampling factor */
{
2006-07-21 22:28:44 +02:00
if ( sscanf ( optarg , " %d,%d " , & parameters - > subsampling_dx ,
& parameters - > subsampling_dy ) ! = 2 ) {
2005-12-08 10:27:26 +01:00
fprintf ( stderr , " '-s' sub-sampling argument error ! [-s dx,dy] \n " ) ;
return 1 ;
}
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ----------------------------------------------------- */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' d ' : /* coordonnate of the reference grid */
{
2006-07-21 22:28:44 +02:00
if ( sscanf ( optarg , " %d,%d " , & parameters - > image_offset_x0 ,
& parameters - > image_offset_y0 ) ! = 2 ) {
fprintf ( stderr , " -d 'coordonnate of the reference grid' argument "
" error !! [-d x0,y0] \n " ) ;
2005-12-08 10:27:26 +01:00
return 1 ;
}
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ----------------------------------------------------- */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' h ' : /* display an help description */
encode_help_display ( ) ;
return 1 ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ----------------------------------------------------- */
case ' P ' : /* POC */
{
int numpocs = 0 ; /* number of progression order change (POC) default 0 */
opj_poc_t * POC = NULL ; /* POC : used in case of Progression order change */
char * s = optarg ;
POC = parameters - > POC ;
2007-04-04 15:40:32 +02:00
while ( sscanf ( s , " T%d=%d,%d,%d,%d,%d,%4s " , & POC [ numpocs ] . tile ,
2005-12-08 10:27:26 +01:00
& POC [ numpocs ] . resno0 , & POC [ numpocs ] . compno0 ,
& POC [ numpocs ] . layno1 , & POC [ numpocs ] . resno1 ,
2007-04-04 15:40:32 +02:00
& POC [ numpocs ] . compno1 , & POC [ numpocs ] . progorder ) = = 7 ) {
POC [ numpocs ] . prg1 = give_progression ( POC [ numpocs ] . progorder ) ;
2005-12-08 10:27:26 +01:00
numpocs + + ;
while ( * s & & * s ! = ' / ' ) {
s + + ;
}
if ( ! * s ) {
break ;
}
s + + ;
}
parameters - > numpocs = numpocs ;
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ------------------------------------------------------ */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' S ' : /* SOP marker */
{
parameters - > csty | = 0x02 ;
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ------------------------------------------------------ */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' E ' : /* EPH marker */
{
parameters - > csty | = 0x04 ;
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ------------------------------------------------------ */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' M ' : /* Mode switch pas tous au point !! */
{
int value = 0 ;
if ( sscanf ( optarg , " %d " , & value ) = = 1 ) {
for ( i = 0 ; i < = 5 ; i + + ) {
int cache = value & ( 1 < < i ) ;
if ( cache )
parameters - > mode | = ( 1 < < i ) ;
}
}
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ------------------------------------------------------ */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' R ' : /* ROI */
{
2006-07-21 22:28:44 +02:00
if ( sscanf ( optarg , " OI:c=%d,U=%d " , & parameters - > roi_compno ,
& parameters - > roi_shift ) ! = 2 ) {
2005-12-08 10:27:26 +01:00
fprintf ( stderr , " ROI error !! [-ROI:c='compno',U='shift'] \n " ) ;
return 1 ;
}
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ------------------------------------------------------ */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' T ' : /* Tile offset */
{
if ( sscanf ( optarg , " %d,%d " , & parameters - > cp_tx0 , & parameters - > cp_ty0 ) ! = 2 ) {
fprintf ( stderr , " -T 'tile offset' argument error !! [-T X0,Y0] " ) ;
return 1 ;
}
}
break ;
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
/* ------------------------------------------------------ */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' C ' : /* add a comment */
{
parameters - > cp_comment = ( char * ) malloc ( strlen ( optarg ) + 1 ) ;
if ( parameters - > cp_comment ) {
strcpy ( parameters - > cp_comment , optarg ) ;
}
}
break ;
2006-07-21 22:28:44 +02:00
2006-12-04 15:55:11 +01:00
2005-12-08 10:27:26 +01:00
/* ------------------------------------------------------ */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
case ' I ' : /* reversible or not */
{
parameters - > irreversible = 1 ;
}
break ;
2006-07-21 22:28:44 +02:00
2007-03-20 18:15:18 +01:00
/* ------------------------------------------------------ */
case ' v ' : /* Tile part generation*/
{
parameters - > tp_flag = optarg [ 0 ] ;
parameters - > tp_on = 1 ;
}
break ;
2007-02-26 16:40:01 +01:00
/* ------------------------------------------------------ */
2007-03-07 17:04:33 +01:00
case ' z ' : /* Image Directory path */
{
img_fol - > imgdirpath = ( char * ) malloc ( strlen ( optarg ) + 1 ) ;
strcpy ( img_fol - > imgdirpath , optarg ) ;
img_fol - > set_imgdir = 1 ;
}
break ;
2007-02-26 16:40:01 +01:00
2007-03-07 17:04:33 +01:00
/* ------------------------------------------------------ */
case ' w ' : /* Digital Cinema 2K profile compliance*/
{
int fps = 0 ;
sscanf ( optarg , " %d " , & fps ) ;
if ( fps = = 24 ) {
parameters - > cp_cinema = CINEMA2K_24 ;
} else if ( fps = = 48 ) {
parameters - > cp_cinema = CINEMA2K_48 ;
} else {
fprintf ( stderr , " Incorrect value!! must be 24 or 48 \n " ) ;
return 1 ;
2007-02-26 16:40:01 +01:00
}
2007-03-07 17:04:33 +01:00
fprintf ( stdout , " CINEMA 2K compliant codestream \n " ) ;
2007-03-29 16:15:14 +02:00
parameters - > cp_rsiz = CINEMA2K ;
2007-03-07 17:04:33 +01:00
}
break ;
2007-02-26 16:40:01 +01:00
/* ------------------------------------------------------ */
2007-03-07 17:04:33 +01:00
case ' y ' : /* Digital Cinema 4K profile compliance*/
{
parameters - > cp_cinema = CINEMA4K_24 ;
fprintf ( stdout , " CINEMA 4K compliant codestream \n " ) ;
2007-03-29 16:15:14 +02:00
parameters - > cp_rsiz = CINEMA4K ;
2007-03-07 17:04:33 +01:00
}
break ;
/* ------------------------------------------------------ */
2006-12-04 15:55:11 +01:00
/* UniPG>> */
# ifdef USE_JPWL
/* ------------------------------------------------------ */
case ' W ' : /* JPWL capabilities switched on */
{
char * token = NULL ;
int hprot , pprot , sens , addr , size , range ;
/* we need to enable indexing */
if ( ! parameters - > index_on ) {
2007-02-13 10:00:37 +01:00
strncpy ( parameters - > index , JPWL_PRIVATEINDEX_NAME , sizeof ( parameters - > index ) - 1 ) ;
2006-12-04 15:55:11 +01:00
parameters - > index_on = 1 ;
}
/* search for different protection methods */
/* break the option in comma points and parse the result */
token = strtok ( optarg , " , " ) ;
while ( token ! = NULL ) {
/* search header error protection method */
if ( * token = = ' h ' ) {
static int tile = 0 , tilespec = 0 , lasttileno = 0 ;
hprot = 1 ; /* predefined method */
if ( sscanf ( token , " h=%d " , & hprot ) = = 1 ) {
/* Main header, specified */
if ( ! ( ( hprot = = 0 ) | | ( hprot = = 1 ) | | ( hprot = = 16 ) | | ( hprot = = 32 ) | |
( ( hprot > = 37 ) & & ( hprot < = 128 ) ) ) ) {
fprintf ( stderr , " ERROR -> invalid main header protection method h = %d \n " , hprot ) ;
return 1 ;
}
parameters - > jpwl_hprot_MH = hprot ;
} else if ( sscanf ( token , " h%d=%d " , & tile , & hprot ) = = 2 ) {
/* Tile part header, specified */
if ( ! ( ( hprot = = 0 ) | | ( hprot = = 1 ) | | ( hprot = = 16 ) | | ( hprot = = 32 ) | |
( ( hprot > = 37 ) & & ( hprot < = 128 ) ) ) ) {
fprintf ( stderr , " ERROR -> invalid tile header protection method h = %d \n " , hprot ) ;
return 1 ;
}
if ( tile < 0 ) {
fprintf ( stderr , " ERROR -> invalid tile number on protection method t = %d \n " , tile ) ;
return 1 ;
}
if ( tilespec < JPWL_MAX_NO_TILESPECS ) {
parameters - > jpwl_hprot_TPH_tileno [ tilespec ] = lasttileno = tile ;
parameters - > jpwl_hprot_TPH [ tilespec + + ] = hprot ;
}
} else if ( sscanf ( token , " h%d " , & tile ) = = 1 ) {
/* Tile part header, unspecified */
if ( tile < 0 ) {
fprintf ( stderr , " ERROR -> invalid tile number on protection method t = %d \n " , tile ) ;
return 1 ;
}
if ( tilespec < JPWL_MAX_NO_TILESPECS ) {
parameters - > jpwl_hprot_TPH_tileno [ tilespec ] = lasttileno = tile ;
parameters - > jpwl_hprot_TPH [ tilespec + + ] = hprot ;
}
} else if ( ! strcmp ( token , " h " ) ) {
/* Main header, unspecified */
parameters - > jpwl_hprot_MH = hprot ;
} else {
fprintf ( stderr , " ERROR -> invalid protection method selection = %s \n " , token ) ;
return 1 ;
} ;
}
/* search packet error protection method */
if ( * token = = ' p ' ) {
static int pack = 0 , tile = 0 , packspec = 0 , lastpackno = 0 ;
pprot = 1 ; /* predefined method */
if ( sscanf ( token , " p=%d " , & pprot ) = = 1 ) {
/* Method for all tiles and all packets */
if ( ! ( ( pprot = = 0 ) | | ( pprot = = 1 ) | | ( pprot = = 16 ) | | ( pprot = = 32 ) | |
( ( pprot > = 37 ) & & ( pprot < = 128 ) ) ) ) {
fprintf ( stderr , " ERROR -> invalid default packet protection method p = %d \n " , pprot ) ;
return 1 ;
}
parameters - > jpwl_pprot_tileno [ 0 ] = 0 ;
parameters - > jpwl_pprot_packno [ 0 ] = 0 ;
parameters - > jpwl_pprot [ 0 ] = pprot ;
} else if ( sscanf ( token , " p%d=%d " , & tile , & pprot ) = = 2 ) {
/* method specified from that tile on */
if ( ! ( ( pprot = = 0 ) | | ( pprot = = 1 ) | | ( pprot = = 16 ) | | ( pprot = = 32 ) | |
( ( pprot > = 37 ) & & ( pprot < = 128 ) ) ) ) {
fprintf ( stderr , " ERROR -> invalid packet protection method p = %d \n " , pprot ) ;
return 1 ;
}
if ( tile < 0 ) {
fprintf ( stderr , " ERROR -> invalid tile number on protection method p = %d \n " , tile ) ;
return 1 ;
}
if ( packspec < JPWL_MAX_NO_PACKSPECS ) {
parameters - > jpwl_pprot_tileno [ packspec ] = tile ;
parameters - > jpwl_pprot_packno [ packspec ] = 0 ;
parameters - > jpwl_pprot [ packspec + + ] = pprot ;
}
} else if ( sscanf ( token , " p%d:%d=%d " , & tile , & pack , & pprot ) = = 3 ) {
/* method fully specified from that tile and that packet on */
if ( ! ( ( pprot = = 0 ) | | ( pprot = = 1 ) | | ( pprot = = 16 ) | | ( pprot = = 32 ) | |
( ( pprot > = 37 ) & & ( pprot < = 128 ) ) ) ) {
fprintf ( stderr , " ERROR -> invalid packet protection method p = %d \n " , pprot ) ;
return 1 ;
}
if ( tile < 0 ) {
fprintf ( stderr , " ERROR -> invalid tile number on protection method p = %d \n " , tile ) ;
return 1 ;
}
if ( pack < 0 ) {
fprintf ( stderr , " ERROR -> invalid packet number on protection method p = %d \n " , pack ) ;
return 1 ;
}
if ( packspec < JPWL_MAX_NO_PACKSPECS ) {
parameters - > jpwl_pprot_tileno [ packspec ] = tile ;
parameters - > jpwl_pprot_packno [ packspec ] = pack ;
parameters - > jpwl_pprot [ packspec + + ] = pprot ;
}
} else if ( sscanf ( token , " p%d:%d " , & tile , & pack ) = = 2 ) {
/* default method from that tile and that packet on */
if ( ! ( ( pprot = = 0 ) | | ( pprot = = 1 ) | | ( pprot = = 16 ) | | ( pprot = = 32 ) | |
( ( pprot > = 37 ) & & ( pprot < = 128 ) ) ) ) {
fprintf ( stderr , " ERROR -> invalid packet protection method p = %d \n " , pprot ) ;
return 1 ;
}
if ( tile < 0 ) {
fprintf ( stderr , " ERROR -> invalid tile number on protection method p = %d \n " , tile ) ;
return 1 ;
}
if ( pack < 0 ) {
fprintf ( stderr , " ERROR -> invalid packet number on protection method p = %d \n " , pack ) ;
return 1 ;
}
if ( packspec < JPWL_MAX_NO_PACKSPECS ) {
parameters - > jpwl_pprot_tileno [ packspec ] = tile ;
parameters - > jpwl_pprot_packno [ packspec ] = pack ;
parameters - > jpwl_pprot [ packspec + + ] = pprot ;
}
} else if ( sscanf ( token , " p%d " , & tile ) = = 1 ) {
/* default from a tile on */
if ( tile < 0 ) {
fprintf ( stderr , " ERROR -> invalid tile number on protection method p = %d \n " , tile ) ;
return 1 ;
}
if ( packspec < JPWL_MAX_NO_PACKSPECS ) {
parameters - > jpwl_pprot_tileno [ packspec ] = tile ;
parameters - > jpwl_pprot_packno [ packspec ] = 0 ;
parameters - > jpwl_pprot [ packspec + + ] = pprot ;
}
} else if ( ! strcmp ( token , " p " ) ) {
/* all default */
parameters - > jpwl_pprot_tileno [ 0 ] = 0 ;
parameters - > jpwl_pprot_packno [ 0 ] = 0 ;
parameters - > jpwl_pprot [ 0 ] = pprot ;
} else {
fprintf ( stderr , " ERROR -> invalid protection method selection = %s \n " , token ) ;
return 1 ;
} ;
}
/* search sensitivity method */
if ( * token = = ' s ' ) {
static int tile = 0 , tilespec = 0 , lasttileno = 0 ;
sens = 0 ; /* predefined: relative error */
if ( sscanf ( token , " s=%d " , & sens ) = = 1 ) {
/* Main header, specified */
if ( ( sens < - 1 ) | | ( sens > 7 ) ) {
fprintf ( stderr , " ERROR -> invalid main header sensitivity method s = %d \n " , sens ) ;
return 1 ;
}
parameters - > jpwl_sens_MH = sens ;
} else if ( sscanf ( token , " s%d=%d " , & tile , & sens ) = = 2 ) {
/* Tile part header, specified */
if ( ( sens < - 1 ) | | ( sens > 7 ) ) {
fprintf ( stderr , " ERROR -> invalid tile header sensitivity method s = %d \n " , sens ) ;
return 1 ;
}
if ( tile < 0 ) {
fprintf ( stderr , " ERROR -> invalid tile number on sensitivity method t = %d \n " , tile ) ;
return 1 ;
}
if ( tilespec < JPWL_MAX_NO_TILESPECS ) {
parameters - > jpwl_sens_TPH_tileno [ tilespec ] = lasttileno = tile ;
parameters - > jpwl_sens_TPH [ tilespec + + ] = sens ;
}
} else if ( sscanf ( token , " s%d " , & tile ) = = 1 ) {
/* Tile part header, unspecified */
if ( tile < 0 ) {
fprintf ( stderr , " ERROR -> invalid tile number on sensitivity method t = %d \n " , tile ) ;
return 1 ;
}
if ( tilespec < JPWL_MAX_NO_TILESPECS ) {
parameters - > jpwl_sens_TPH_tileno [ tilespec ] = lasttileno = tile ;
parameters - > jpwl_sens_TPH [ tilespec + + ] = hprot ;
}
} else if ( ! strcmp ( token , " s " ) ) {
/* Main header, unspecified */
parameters - > jpwl_sens_MH = sens ;
} else {
fprintf ( stderr , " ERROR -> invalid sensitivity method selection = %s \n " , token ) ;
return 1 ;
} ;
parameters - > jpwl_sens_size = 2 ; /* 2 bytes for default size */
}
/* search addressing size */
if ( * token = = ' a ' ) {
static int tile = 0 , tilespec = 0 , lasttileno = 0 ;
addr = 0 ; /* predefined: auto */
if ( sscanf ( token , " a=%d " , & addr ) = = 1 ) {
/* Specified */
if ( ( addr ! = 0 ) & & ( addr ! = 2 ) & & ( addr ! = 4 ) ) {
fprintf ( stderr , " ERROR -> invalid addressing size a = %d \n " , addr ) ;
return 1 ;
}
parameters - > jpwl_sens_addr = addr ;
} else if ( ! strcmp ( token , " a " ) ) {
/* default */
parameters - > jpwl_sens_addr = addr ; /* auto for default size */
} else {
fprintf ( stderr , " ERROR -> invalid addressing selection = %s \n " , token ) ;
return 1 ;
} ;
}
/* search sensitivity size */
if ( * token = = ' z ' ) {
static int tile = 0 , tilespec = 0 , lasttileno = 0 ;
size = 1 ; /* predefined: 1 byte */
if ( sscanf ( token , " z=%d " , & size ) = = 1 ) {
/* Specified */
if ( ( size ! = 0 ) & & ( size ! = 1 ) & & ( size ! = 2 ) ) {
fprintf ( stderr , " ERROR -> invalid sensitivity size z = %d \n " , size ) ;
return 1 ;
}
parameters - > jpwl_sens_size = size ;
} else if ( ! strcmp ( token , " a " ) ) {
/* default */
parameters - > jpwl_sens_size = size ; /* 1 for default size */
} else {
fprintf ( stderr , " ERROR -> invalid size selection = %s \n " , token ) ;
return 1 ;
} ;
}
/* search range method */
if ( * token = = ' g ' ) {
static int tile = 0 , tilespec = 0 , lasttileno = 0 ;
range = 0 ; /* predefined: 0 (packet) */
if ( sscanf ( token , " g=%d " , & range ) = = 1 ) {
/* Specified */
if ( ( range < 0 ) | | ( range > 3 ) ) {
fprintf ( stderr , " ERROR -> invalid sensitivity range method g = %d \n " , range ) ;
return 1 ;
}
parameters - > jpwl_sens_range = range ;
} else if ( ! strcmp ( token , " g " ) ) {
/* default */
parameters - > jpwl_sens_range = range ;
} else {
fprintf ( stderr , " ERROR -> invalid range selection = %s \n " , token ) ;
return 1 ;
} ;
}
/* next token or bust */
token = strtok ( NULL , " , " ) ;
} ;
/* some info */
fprintf ( stdout , " Info: JPWL capabilities enabled \n " ) ;
parameters - > jpwl_epc_on = true ;
}
break ;
2007-01-31 16:19:54 +01:00
# endif /* USE_JPWL */
2006-12-04 15:55:11 +01:00
/* <<UniPG */
2005-12-08 10:27:26 +01:00
/* ------------------------------------------------------ */
2006-07-21 22:28:44 +02:00
2005-12-08 10:27:26 +01:00
default :
2007-02-27 15:19:09 +01:00
fprintf ( stderr , " ERROR -> Command line not valid \n " ) ;
2005-12-08 10:27:26 +01:00
return 1 ;
}
}
/* check for possible errors */
2007-03-20 18:15:18 +01:00
if ( parameters - > cp_cinema ) {
2007-03-29 16:15:14 +02:00
if ( parameters - > tcp_numlayers > 1 ) {
parameters - > cp_rsiz = STD_RSIZ ;
2007-03-20 18:15:18 +01:00
fprintf ( stdout , " Warning: DC profiles do not allow more than one quality layer. The codestream created will not be compliant with the DC profile \n " ) ;
}
}
2007-02-28 16:31:56 +01:00
if ( img_fol - > set_imgdir = = 1 ) {
if ( ! ( parameters - > infile [ 0 ] = = 0 ) ) {
2007-02-26 16:40:01 +01:00
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-02-27 15:19:09 +01:00
fprintf ( stderr , " Only one format allowed! Valid formats are j2k and jp2!! \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 " ) ;
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 ;
}
2005-12-08 10:27:26 +01:00
}
if ( ( parameters - > cp_disto_alloc | | parameters - > cp_fixed_alloc | | parameters - > cp_fixed_quality )
& & ( ! ( parameters - > cp_disto_alloc ^ parameters - > cp_fixed_alloc ^ parameters - > cp_fixed_quality ) ) ) {
fprintf ( stderr , " Error: options -r -q and -f cannot be used together !! \n " ) ;
return 1 ;
} /* mod fixed_quality */
/* if no rate entered, lossless by default */
if ( parameters - > tcp_numlayers = = 0 ) {
parameters - > tcp_rates [ 0 ] = 0 ; /* MOD antonin : losslessbug */
parameters - > tcp_numlayers + + ;
parameters - > cp_disto_alloc = 1 ;
}
if ( ( parameters - > cp_tx0 > parameters - > image_offset_x0 ) | | ( parameters - > cp_ty0 > parameters - > image_offset_y0 ) ) {
fprintf ( stderr ,
" Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n " ,
parameters - > cp_tx0 , parameters - > image_offset_x0 , parameters - > cp_ty0 , parameters - > image_offset_y0 ) ;
return 1 ;
}
for ( i = 0 ; i < parameters - > numpocs ; i + + ) {
if ( parameters - > POC [ i ] . prg = = - 1 ) {
fprintf ( stderr ,
" Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !! \n " ,
i + 1 ) ;
}
}
return 0 ;
2005-12-02 14:34:15 +01:00
}
2004-04-29 15:10:05 +02:00
2005-12-02 14:34:15 +01:00
/* -------------------------------------------------------------------------- */
2004-08-03 16:06:10 +02:00
2005-12-02 14:34:15 +01:00
/**
sample error callback expecting a FILE * client object
*/
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
*/
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 a FILE * client object
*/
void info_callback ( const char * msg , void * client_data ) {
2005-12-08 10:27:26 +01:00
FILE * stream = ( FILE * ) client_data ;
fprintf ( stream , " [INFO] %s " , msg ) ;
2005-12-02 14:34:15 +01:00
}
2004-08-03 16:06:10 +02:00
2005-12-02 14:34:15 +01:00
/* -------------------------------------------------------------------------- */
int main ( int argc , char * * argv ) {
2005-12-08 10:27:26 +01:00
bool bSuccess ;
opj_cparameters_t parameters ; /* compression 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 ;
2007-02-26 16:40:01 +01:00
int i , num_images ;
int imageno ;
dircnt_t * dirptr ;
2005-12-08 10:27:26 +01:00
2006-07-21 22:28:44 +02:00
/*
2005-12-08 10:27:26 +01:00
configure the event callbacks ( not required )
2006-07-21 22:28:44 +02:00
setting of each callback is optionnal
2005-12-08 10:27:26 +01:00
*/
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 encoding parameters to default values */
opj_set_default_encoder_parameters ( & parameters ) ;
/* parse input and get user encoding parameters */
2007-02-26 16:40:01 +01:00
if ( parse_cmdline_encoder ( argc , argv , & parameters , & img_fol ) = = 1 ) {
2005-12-08 10:27:26 +01:00
return 0 ;
}
2007-03-20 18:15:18 +01:00
if ( parameters . cp_cinema ) {
cinema_parameters ( & parameters ) ;
}
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
/* Create comment for codestream */
2005-12-08 10:27:26 +01:00
if ( parameters . cp_comment = = NULL ) {
2006-07-21 23:00:19 +02:00
const char comment [ ] = " Created by OpenJPEG version " ;
2006-12-04 15:55:11 +01:00
const size_t clen = strlen ( comment ) ;
2006-07-21 23:00:19 +02:00
const char * version = opj_version ( ) ;
2006-12-04 15:55:11 +01:00
/* UniPG>> */
# ifdef USE_JPWL
parameters . cp_comment = ( char * ) malloc ( clen + strlen ( version ) + 11 ) ;
sprintf ( parameters . cp_comment , " %s%s with JPWL " , comment , version ) ;
# else
2006-07-21 23:00:19 +02:00
parameters . cp_comment = ( char * ) malloc ( clen + strlen ( version ) + 1 ) ;
2006-12-04 15:55:11 +01:00
sprintf ( parameters . cp_comment , " %s%s " , comment , version ) ;
# endif
/* <<UniPG */
2005-12-08 10:27:26 +01:00
}
2007-02-26 16:40:01 +01:00
/* Read directory if necessary */
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
if ( img_fol . set_imgdir = = 1 ) {
num_images = get_num_images ( img_fol . imgdirpath ) ;
2006-07-21 22:28:44 +02:00
2007-02-26 16:40:01 +01:00
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 * ) ) ;
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
if ( ! dirptr - > filename_buf ) {
return 0 ;
2005-12-08 10:27:26 +01:00
}
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 ) {
return 0 ;
}
if ( num_images = = 0 ) {
fprintf ( stdout , " Folder is empty \n " ) ;
return 0 ;
}
} else {
num_images = 1 ;
2005-12-08 10:27:26 +01:00
}
2007-02-26 16:40:01 +01:00
/*Encoding image one by one*/
for ( imageno = 0 ; imageno < num_images ; imageno + + )
{
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
image = NULL ;
fprintf ( stderr , " \n " ) ;
2007-02-27 15:19:09 +01:00
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
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
}
switch ( parameters . decod_format ) {
case PGX_DFMT :
break ;
case PXM_DFMT :
break ;
case BMP_DFMT :
break ;
2007-02-28 16:31:56 +01:00
case TIF_DFMT :
break ;
2007-02-26 16:40:01 +01:00
default :
fprintf ( stderr , " skipping file... \n " ) ;
2007-02-27 15:19:09 +01:00
continue ;
2007-02-26 16:40:01 +01:00
}
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
/* decode the source image */
/* ----------------------- */
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
switch ( parameters . decod_format ) {
case PGX_DFMT :
image = pgxtoimage ( parameters . infile , & parameters ) ;
if ( ! image ) {
2007-02-28 16:31:56 +01:00
fprintf ( stderr , " Unable to load pgx file \n " ) ;
return 1 ;
2007-02-26 16:40:01 +01:00
}
break ;
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
case PXM_DFMT :
image = pnmtoimage ( parameters . infile , & parameters ) ;
if ( ! image ) {
2007-02-28 16:31:56 +01:00
fprintf ( stderr , " Unable to load pnm file \n " ) ;
2007-02-26 16:40:01 +01:00
return 1 ;
}
break ;
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
case BMP_DFMT :
image = bmptoimage ( parameters . infile , & parameters ) ;
if ( ! image ) {
2007-02-28 16:31:56 +01:00
fprintf ( stderr , " Unable to load bmp file \n " ) ;
2007-02-26 16:40:01 +01:00
return 1 ;
}
break ;
2007-02-28 16:31:56 +01:00
case TIF_DFMT :
image = tiftoimage ( parameters . infile , & parameters ) ;
if ( ! image ) {
fprintf ( stderr , " Unable to load tiff file \n " ) ;
return 1 ;
}
break ;
}
2005-12-08 10:27:26 +01:00
2007-03-20 18:15:18 +01:00
if ( parameters . cp_cinema ) {
cinema_setup_encoder ( & parameters , image ) ;
}
2007-02-26 16:40:01 +01:00
/* encode the destination image */
/* ---------------------------- */
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
if ( parameters . cod_format = = J2K_CFMT ) { /* J2K format output */
int codestream_length ;
opj_cio_t * cio = NULL ;
FILE * f = NULL ;
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
/* get a J2K compressor handle */
opj_cinfo_t * cinfo = opj_create_compress ( CODEC_J2K ) ;
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
/* catch events using our callbacks and give a local context */
opj_set_event_mgr ( ( opj_common_ptr ) cinfo , & event_mgr , stderr ) ;
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
/* setup the encoder parameters using the current image and user parameters */
opj_setup_encoder ( cinfo , & parameters , image ) ;
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
/* open a byte stream for writing */
/* allocate memory for all tiles */
cio = opj_cio_open ( ( opj_common_ptr ) cinfo , NULL , 0 ) ;
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
/* 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 ) ;
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
/* 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 ;
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
/* get a JP2 compressor handle */
opj_cinfo_t * cinfo = opj_create_compress ( CODEC_JP2 ) ;
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
/* catch events using our callbacks and give a local context */
opj_set_event_mgr ( ( opj_common_ptr ) cinfo , & event_mgr , stderr ) ;
2005-12-08 10:27:26 +01:00
2007-02-26 16:40:01 +01:00
/* 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 ) ;
2007-03-29 16:15:14 +02:00
fprintf ( stderr , " Generated outfile %s \n " , parameters . outfile ) ;
2007-02-26 16:40:01 +01:00
/* 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 ) ;
2005-12-08 10:27:26 +01:00
}
/* free user parameters structure */
2006-07-21 22:03:07 +02:00
if ( parameters . cp_comment ) free ( parameters . cp_comment ) ;
2005-12-08 10:27:26 +01:00
if ( parameters . cp_matrice ) free ( parameters . cp_matrice ) ;
return 0 ;
2003-11-27 11:07:31 +01:00
}
2005-12-02 14:34:15 +01:00