X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fbin%2Fjp2%2Fopj_compress.c;h=e9f3eedf78d53795327314f52218fec1c68c83a0;hb=6def7e38b4497b81f9338876548e97e8279c2acd;hp=5957a467177787de10b47eb26e7876aca1141262;hpb=a54d757a3ea5f7d5ce9efae355b67a8ec339e7bf;p=openjpeg.git diff --git a/src/bin/jp2/opj_compress.c b/src/bin/jp2/opj_compress.c index 5957a467..e9f3eedf 100644 --- a/src/bin/jp2/opj_compress.c +++ b/src/bin/jp2/opj_compress.c @@ -1,9 +1,15 @@ /* - * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium - * Copyright (c) 2002-2007, Professor Benoit Macq + * The copyright in this software is being made available under the 2-clauses + * BSD License, included below. This software may be subject to other third + * party and contributor rights, including patent rights, and no such rights + * are granted under this license. + * + * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium + * Copyright (c) 2002-2014, Professor Benoit Macq * Copyright (c) 2001-2003, David Janssens * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe + * Copyright (c) 2003-2007, Francois-Olivier Devaux + * Copyright (c) 2003-2014, Antonin Descampe * Copyright (c) 2005, Herve Drolon, FreeImage Team * Copyright (c) 2006-2007, Parvatha Elangovan * Copyright (c) 2008, Jerome Fimes, Communications & Systemes @@ -80,25 +86,12 @@ typedef struct img_folder{ }img_fol_t; static void encode_help_display(void) { - fprintf(stdout,"HELP for opj_compress\n----\n\n"); - fprintf(stdout,"- the -h option displays this help information on screen\n\n"); + fprintf(stdout,"\nThis is the opj_compress utility from the OpenJPEG project.\n" + "It compresses various image formats with the JPEG 2000 algorithm.\n" + "It has been compiled against openjp2 library v%s.\n\n",opj_version()); - /* UniPG>> */ - fprintf(stdout,"List of parameters for the JPEG 2000 " - #ifdef USE_JPWL - "+ JPWL " - #endif /* USE_JPWL */ - "encoder:\n"); - /* <\n"); + fprintf(stdout," Input file\n"); + fprintf(stdout," Known extensions are \n"); + fprintf(stdout," If used, '-o ' must be provided\n"); + fprintf(stdout,"-o \n"); + fprintf(stdout," Output file (accepted extensions are j2k or jp2).\n"); + fprintf(stdout,"-ImgDir \n"); + fprintf(stdout," Image file Directory path (example ../Images) \n"); fprintf(stdout," When using this option -OutFor must be used\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-OutFor \n"); - fprintf(stdout," REQUIRED only if -ImgDir is used\n"); - fprintf(stdout," Need to specify only format without filename \n"); - fprintf(stdout," Currently accepts PBM, PGM, PPM, PNM, PAM, PGX, PNG, BMP, TIF, RAW (MSB), RAWL (LSB) and TGA formats\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-i : source file (-i source.pnm also *pbm, *.pgm, *.ppm, *.pam, *.pgx, *png, *.bmp, *.tif, *.raw, *.tga) \n"); - fprintf(stdout," When using this option -o must be used\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-o : destination file (-o dest.j2k or .jp2) \n"); + fprintf(stdout,"-OutFor \n"); + fprintf(stdout," Output format for compressed files.\n"); + fprintf(stdout," Required only if -ImgDir is used\n"); + fprintf(stdout,"-F ,,,,{s,u}@x:...:x\n"); + fprintf(stdout," Characteristics of the raw input image\n"); + fprintf(stdout," If subsampling is omitted, 1x1 is assumed for all components\n"); + fprintf(stdout," Example: -F 512,512,3,8,u@1x1:2x2:2x2\n"); + fprintf(stdout," for raw 512x512 image with 4:2:0 subsampling\n"); + fprintf(stdout," Required only if RAW or RAWL input file is provided.\n"); fprintf(stdout,"\n"); fprintf(stdout,"Optional Parameters:\n"); fprintf(stdout,"\n"); - fprintf(stdout,"-h : display the help information \n "); - fprintf(stdout,"\n"); - 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"); - 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"); - 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"); - 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,"-TP : divide packets of every tile into tile-parts (-TP R) [R, L, C]\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"); - fprintf(stdout,"-F : characteristics of the raw input image\n"); - fprintf(stdout," -F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); - fprintf(stdout," Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); - fprintf(stdout,"\n"); - fprintf(stdout,"-mct {0,1,2} : explicitely specifies if a Multiple Component Transform has to be used.\n"); - fprintf(stdout," 0: no MCT ; 1: RGB->YCC conversion ; 2: custom MCT.\n"); - fprintf(stdout," If custom MCT, \"-m\" option has to be used (see hereunder).\n"); - fprintf(stdout," By default, RGB->YCC conversion is used if there are 3 components or more,\n"); - fprintf(stdout," no conversion otherwise.\n"); - fprintf(stdout,"-m : use array-based MCT, values are coma separated, line by line\n"); - fprintf(stdout," no specific separators between lines, no space allowed between values\n"); - fprintf(stdout," If this option is used, it automatically sets \"-mct\" option to 2.\n"); - fprintf(stdout,"-jpip : write jpip codestream index box in JP2 output file\n"); - fprintf(stdout," NOTICE: currently supports only RPCL order\n"); - fprintf(stdout,"\n"); + fprintf(stdout,"-h\n"); + fprintf(stdout," Display the help information.\n"); + fprintf(stdout,"-r ,,...\n"); + fprintf(stdout," Different compression ratios for successive layers.\n"); + fprintf(stdout," The rate specified for each quality level is the desired\n"); + fprintf(stdout," compression factor.\n"); + fprintf(stdout," Decreasing ratios required.\n"); + fprintf(stdout," Example: -r 20,10,1 means \n"); + fprintf(stdout," quality layer 1: compress 20x, \n"); + fprintf(stdout," quality layer 2: compress 10x \n"); + fprintf(stdout," quality layer 3: compress lossless\n"); + fprintf(stdout," Options -r and -q cannot be used together.\n"); + fprintf(stdout,"-q ,,,...\n"); + fprintf(stdout," Different psnr for successive layers (-q 30,40,50).\n"); + fprintf(stdout," Increasing PSNR values required.\n"); + fprintf(stdout," Options -r and -q cannot be used together.\n"); + fprintf(stdout,"-n \n"); + fprintf(stdout," Number of resolutions.\n"); + fprintf(stdout," It corresponds to the number of DWT decompositions +1. \n"); + fprintf(stdout," Default: 6.\n"); + fprintf(stdout,"-b ,\n"); + fprintf(stdout," Code-block size. The dimension must respect the constraint \n"); + fprintf(stdout," defined in the JPEG-2000 standard (no dimension smaller than 4 \n"); + fprintf(stdout," or greater than 1024, no code-block with more than 4096 coefficients).\n"); + fprintf(stdout," The maximum value authorized is 64x64. \n"); + fprintf(stdout," Default: 64x64.\n"); + fprintf(stdout,"-c [,],[,],...\n"); + fprintf(stdout," Precinct size. Values specified must be power of 2. \n"); + fprintf(stdout," Multiple records may be supplied, in which case the first record refers\n"); + fprintf(stdout," to the highest resolution level and subsequent records to lower \n"); + fprintf(stdout," resolution levels. The last specified record is right-shifted for each \n"); + fprintf(stdout," remaining lower resolution levels.\n"); + fprintf(stdout," Default: 215x215 at each resolution.\n"); + fprintf(stdout,"-t ,\n"); + fprintf(stdout," Tile size.\n"); + fprintf(stdout," Default: the dimension of the whole image, thus only one tile.\n"); + fprintf(stdout,"-p \n"); + fprintf(stdout," Progression order.\n"); + fprintf(stdout," Default: LRCP.\n"); + fprintf(stdout,"-s \n"); + fprintf(stdout," Subsampling factor.\n"); + fprintf(stdout," Subsampling bigger than 2 can produce error\n"); + fprintf(stdout," Default: no subsampling.\n"); + fprintf(stdout,"-POC //...\n"); + fprintf(stdout," Progression order change.\n"); + fprintf(stdout," The syntax of a progression order change is the following:\n"); + fprintf(stdout," T=,,,,,\n"); + fprintf(stdout," Example: -POC T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL\n"); + fprintf(stdout,"-SOP\n"); + fprintf(stdout," Write SOP marker before each packet.\n"); + fprintf(stdout,"-EPH\n"); + fprintf(stdout," Write EPH marker after each header packet.\n"); + fprintf(stdout,"-M \n"); + fprintf(stdout," Mode switch.\n"); + fprintf(stdout," [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," Example: RESTART(4) + RESET(2) + SEGMARK(32) => -M 38\n"); + fprintf(stdout,"-TP \n"); + fprintf(stdout," Divide packets of every tile into tile-parts.\n"); + fprintf(stdout," Division is made by grouping Resolutions (R), Layers (L)\n"); + fprintf(stdout," or Components (C).\n"); + #ifdef FIXME_INDEX + fprintf(stdout,"-x \n"); + fprintf(stdout," Create an index file.\n"); + #endif /*FIXME_INDEX*/ + fprintf(stdout,"-ROI c=,U=\n"); + fprintf(stdout," Quantization indices upshifted for a component. \n"); + fprintf(stdout," Warning: This option does not implement the usual ROI (Region of Interest).\n"); + fprintf(stdout," It should be understood as a 'Component of Interest'. It offers the \n"); + fprintf(stdout," possibility to upshift the value of a component during quantization step.\n"); + fprintf(stdout," The value after c= is the component number [0, 1, 2, ...] and the value \n"); + fprintf(stdout," after U= is the value of upshifting. U must be in the range [0, 37].\n"); + fprintf(stdout,"-d \n"); + fprintf(stdout," Offset of the origin of the image.\n"); + fprintf(stdout,"-T \n"); + fprintf(stdout," Offset of the origin of the tiles.\n"); + fprintf(stdout,"-I\n"); + fprintf(stdout," Use the irreversible DWT 9-7.\n"); + fprintf(stdout,"-mct <0|1|2>\n"); + fprintf(stdout," Explicitely specifies if a Multiple Component Transform has to be used.\n"); + fprintf(stdout," 0: no MCT ; 1: RGB->YCC conversion ; 2: custom MCT.\n"); + fprintf(stdout," If custom MCT, \"-m\" option has to be used (see hereunder).\n"); + fprintf(stdout," By default, RGB->YCC conversion is used if there are 3 components or more,\n"); + fprintf(stdout," no conversion otherwise.\n"); + fprintf(stdout,"-m \n"); + fprintf(stdout," Use array-based MCT, values are coma separated, line by line\n"); + fprintf(stdout," No specific separators between lines, no space allowed between values.\n"); + fprintf(stdout," If this option is used, it automatically sets \"-mct\" option to 2.\n"); + fprintf(stdout,"-cinema2K <24|48>\n"); + fprintf(stdout," Digital Cinema 2K profile compliant codestream.\n"); + fprintf(stdout," Need to specify the frames per second for a 2K resolution.\n"); + fprintf(stdout," Only 24 or 48 fps are currently allowed.\n"); + fprintf(stdout,"-cinema4K\n"); + fprintf(stdout," Digital Cinema 4K profile compliant codestream.\n"); + fprintf(stdout," Frames per second not required. Default value is 24fps.\n"); + fprintf(stdout,"-jpip\n"); + fprintf(stdout," Write jpip codestream index box in JP2 output file.\n"); + fprintf(stdout," Currently supports only RPCL order.\n"); + fprintf(stdout,"-C \n"); + fprintf(stdout," Add in the comment marker segment.\n"); /* 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<=type>,s<=method>,a=,...\n"); - fprintf(stdout," ...,z=,g=,p<=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 'tilepart' is absent, it is for main and tile headers\n"); - fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); - fprintf(stdout," onwards, up to the next h<> spec, or to the last tilepart\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 'tilepart:pack' is absent, it is from tile 0, packet 0\n"); - fprintf(stdout," if 'tilepart: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 tilepart in the stream\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 'tilepart' is absent, it is for main header only\n"); - fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); - fprintf(stdout," onwards, up to the next s<> spec, or to the last tilepart\n"); - fprintf(stdout," in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS); - fprintf(stdout,"\n"); - fprintf(stdout," g determines the addressing mode: 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: 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: can be\n"); - fprintf(stdout," 1/2 bytes, for the transformed pseudo-floating point value\n"); - fprintf(stdout,"\n"); - fprintf(stdout," ex.:\n"); - fprintf(stdout," h,h0=64,h3=16,h5=32,p0=78,p0:24=56,p1,p3:0=0,p3:20=32,s=0,\n"); - fprintf(stdout," s0=6,s3=-1,a=0,g=1,z=1\n"); - fprintf(stdout," means\n"); - fprintf(stdout," predefined EPB in MH, rs(64,32) from TPH 0 to TPH 2,\n"); - fprintf(stdout," CRC-16 in TPH 3 and TPH 4, CRC-32 in remaining TPHs,\n"); - fprintf(stdout," UEP rs(78,32) for packets 0 to 23 of tile 0,\n"); - fprintf(stdout," UEP rs(56,32) for packs. 24 to the last of tilepart 0,\n"); - fprintf(stdout," UEP rs default for packets of tilepart 1,\n"); - fprintf(stdout," no UEP for packets 0 to 19 of tilepart 3,\n"); - fprintf(stdout," UEP CRC-32 for packs. 20 of tilepart 3 to last tilepart,\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"); - 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"); + fprintf(stdout,"-W \n"); + fprintf(stdout," Adoption of JPWL (Part 11) capabilities (-W params)\n"); + fprintf(stdout," The field can be written and repeated in any order:\n"); + fprintf(stdout," [h<=type>,s<=method>,a=,...\n"); + fprintf(stdout," ...,z=,g=,p<=type>]\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 'tilepart' is absent, it is for main and tile headers\n"); + fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); + fprintf(stdout," onwards, up to the next h<> spec, or to the last tilepart\n"); + fprintf(stdout," in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS); + 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 'tilepart:pack' is absent, it is from tile 0, packet 0\n"); + fprintf(stdout," if 'tilepart: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 tilepart in the stream\n"); + fprintf(stdout," (max. %d specs)\n", JPWL_MAX_NO_PACKSPECS); + 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 'tilepart' is absent, it is for main header only\n"); + fprintf(stdout," if 'tilepart' is present, it applies from that tile\n"); + fprintf(stdout," onwards, up to the next s<> spec, or to the last tilepart\n"); + fprintf(stdout," in the codestream (max. %d specs)\n", JPWL_MAX_NO_TILESPECS); + fprintf(stdout," g determines the addressing mode: can be\n"); + fprintf(stdout," [0=PACKET 1=BYTE RANGE 2=PACKET RANGE]\n"); + fprintf(stdout," a determines the size of data addressing: can be\n"); + fprintf(stdout," 2/4 bytes (small/large codestreams). If not set, auto-mode\n"); + fprintf(stdout," z determines the size of sensitivity values: can be\n"); + fprintf(stdout," 1/2 bytes, for the transformed pseudo-floating point value\n"); + fprintf(stdout," ex.:\n"); + fprintf(stdout," h,h0=64,h3=16,h5=32,p0=78,p0:24=56,p1,p3:0=0,p3:20=32,s=0,\n"); + fprintf(stdout," s0=6,s3=-1,a=0,g=1,z=1\n"); + fprintf(stdout," means\n"); + fprintf(stdout," predefined EPB in MH, rs(64,32) from TPH 0 to TPH 2,\n"); + fprintf(stdout," CRC-16 in TPH 3 and TPH 4, CRC-32 in remaining TPHs,\n"); + fprintf(stdout," UEP rs(78,32) for packets 0 to 23 of tile 0,\n"); + fprintf(stdout," UEP rs(56,32) for packs. 24 to the last of tilepart 0,\n"); + fprintf(stdout," UEP rs default for packets of tilepart 1,\n"); + fprintf(stdout," no UEP for packets 0 to 19 of tilepart 3,\n"); + fprintf(stdout," UEP CRC-32 for packs. 20 of tilepart 3 to last tilepart,\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," 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"); + 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"); #endif /* USE_JPWL */ /* < 9) s++; @@ -784,6 +806,11 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param { char *index = opj_optarg; strncpy(indexfilename, index, OPJ_PATH_LEN); + /* FIXME ADE INDEX >> */ + fprintf(stderr, + "[WARNING] Index file generation is currently broken.\n" + " '-x' option ignored.\n"); + /* << FIXME ADE INDEX */ } break; @@ -844,7 +871,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param char *s = opj_optarg; POC = parameters->POC; - while (sscanf(s, "T%ud=%ud,%ud,%ud,%ud,%ud,%4s", &POC[numpocs].tile, + while (sscanf(s, "T%u=%u,%u,%u,%u,%u,%4s", &POC[numpocs].tile, &POC[numpocs].resno0, &POC[numpocs].compno0, &POC[numpocs].layno1, &POC[numpocs].resno1, &POC[numpocs].compno1, POC[numpocs].progorder) == 7) { @@ -962,9 +989,13 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param int fps=0; sscanf(opj_optarg,"%d",&fps); if(fps == 24){ - parameters->cp_cinema = OPJ_CINEMA2K_24; + parameters->rsiz = OPJ_PROFILE_CINEMA_2K; + parameters->max_comp_size = OPJ_CINEMA_24_COMP; + parameters->max_cs_size = OPJ_CINEMA_24_CS; }else if(fps == 48 ){ - parameters->cp_cinema = OPJ_CINEMA2K_48; + parameters->rsiz = OPJ_PROFILE_CINEMA_2K; + parameters->max_comp_size = OPJ_CINEMA_48_COMP; + parameters->max_cs_size = OPJ_CINEMA_48_CS; }else { fprintf(stderr,"Incorrect value!! must be 24 or 48\n"); return 1; @@ -979,7 +1010,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param case 'y': /* Digital Cinema 4K profile compliance*/ { - parameters->cp_cinema = OPJ_CINEMA4K_24; + parameters->rsiz = OPJ_PROFILE_CINEMA_4K; fprintf(stdout,"CINEMA 4K profile activated\n" "Other options specified could be overriden\n"); } @@ -1402,37 +1433,38 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param default: - fprintf(stderr, "ERROR -> Command line not valid\n"); - return 1; + fprintf(stderr, "[WARNING] An invalid option has been ignored\n"); + break; } }while(c != -1); if(img_fol->set_imgdir == 1){ if(!(parameters->infile[0] == 0)){ - fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n"); + 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 must be used !!\n"); + fprintf(stderr, "[ERROR] When -ImgDir is used, -OutFor must be used !!\n"); fprintf(stderr, "Only one format allowed! Valid formats are j2k and jp2!!\n"); return 1; } if(!((parameters->outfile[0] == 0))){ - fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n"); + fprintf(stderr, "[ERROR] options -ImgDir and -o cannot be used together !!\n"); fprintf(stderr, "Specify OutputFormat using -OutFor !!\n"); return 1; } }else{ if((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { - fprintf(stderr, "Example: %s -i image.ppm -o image.j2k\n",argv[0]); - fprintf(stderr, " Try: %s -h\n",argv[0]); + fprintf(stderr, "[ERROR] Required parameters are missing\n" + "Example: %s -i image.pgm -o image.j2k\n",argv[0]); + fprintf(stderr, " Help: %s -h\n",argv[0]); return 1; } } if ( (parameters->decod_format == RAW_DFMT && raw_cp->rawWidth == 0) || (parameters->decod_format == RAWL_DFMT && raw_cp->rawWidth == 0)) { - fprintf(stderr,"\nError: invalid raw image parameters\n"); + fprintf(stderr,"[ERROR] invalid raw image parameters\n"); fprintf(stderr,"Please use the Format option -F:\n"); fprintf(stderr,"-F rawWidth,rawHeight,rawComp,rawBitDepth,s/u (Signed/Unsigned)\n"); fprintf(stderr,"Example: -i lena.raw -o lena.j2k -F 512,512,3,8,u\n"); @@ -1442,7 +1474,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param 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"); + fprintf(stderr, "[ERROR] options -r -q and -f cannot be used together !!\n"); return 1; } /* mod fixed_quality */ @@ -1455,7 +1487,7 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param 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", + "[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; } @@ -1468,6 +1500,14 @@ static int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *param } } + /* If subsampled image is provided, automatically disable MCT */ + if ( ((parameters->decod_format == RAW_DFMT) || (parameters->decod_format == RAWL_DFMT)) + && ( ((raw_cp->rawComp > 1 ) && ((raw_cp->rawComps[1].dx > 1) || (raw_cp->rawComps[1].dy > 1))) + || ((raw_cp->rawComp > 2 ) && ((raw_cp->rawComps[2].dx > 1) || (raw_cp->rawComps[2].dy > 1))) + )) { + parameters->tcp_mct = 0; + } + return 0; } @@ -1526,28 +1566,20 @@ int main(int argc, char **argv) { *indexfilename = 0; memset(&img_fol,0,sizeof(img_fol_t)); + /* raw_cp initialization */ + raw_cp.rawBitDepth = 0; + raw_cp.rawComp = 0; + raw_cp.rawComps = 0; + raw_cp.rawHeight = 0; + raw_cp.rawSigned = 0; + raw_cp.rawWidth = 0; + /* parse input and get user encoding parameters */ parameters.tcp_mct = (char) 255; /* This will be set later according to the input image or the provided option */ if(parse_cmdline_encoder(argc, argv, ¶meters,&img_fol, &raw_cp, indexfilename) == 1) { return 1; } - /* Create comment for codestream */ - if(parameters.cp_comment == NULL) { - const char comment[] = "Created by OpenJPEG version "; - const size_t clen = strlen(comment); - const char *version = opj_version(); - /* UniPG>> */ -#ifdef USE_JPWL - parameters.cp_comment = (char*)malloc(clen+strlen(version)+11); - sprintf(parameters.cp_comment,"%s%s with JPWL", comment, version); -#else - parameters.cp_comment = (char*)malloc(clen+strlen(version)+1); - sprintf(parameters.cp_comment,"%s%s", comment, version); -#endif - /* < test_tile_encoder: failed to write the tile %d!\n",i); - opj_stream_destroy_v3(l_stream); + opj_stream_destroy(l_stream); opj_destroy_codec(l_codec); opj_image_destroy(image); return 1; @@ -1778,16 +1814,17 @@ int main(int argc, char **argv) { } if (!bSuccess) { - opj_stream_destroy_v3(l_stream); + opj_stream_destroy(l_stream); opj_destroy_codec(l_codec); opj_image_destroy(image); fprintf(stderr, "failed to encode image\n"); + remove(parameters.outfile); return 1; } - fprintf(stderr,"Generated outfile %s\n",parameters.outfile); + fprintf(stdout,"[INFO] Generated outfile %s\n",parameters.outfile); /* close and free the byte stream */ - opj_stream_destroy_v3(l_stream); + opj_stream_destroy(l_stream); /* free remaining compression structures */ opj_destroy_codec(l_codec);