X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fbin%2Fjp2%2Fopj_compress.c;h=2cc2970f62189caec4b6b94b1bce74595d1e684e;hb=e52909f4c7896c5efff3340d707c12d0df55d3f9;hp=4a0baed6ab34ebc8c81965987ac580ff0c8f4dcb;hpb=32572617765cb9d77302384653a48d793b8f657f;p=openjpeg.git diff --git a/src/bin/jp2/opj_compress.c b/src/bin/jp2/opj_compress.c index 4a0baed6..2cc2970f 100644 --- a/src/bin/jp2/opj_compress.c +++ b/src/bin/jp2/opj_compress.c @@ -169,16 +169,17 @@ static void encode_help_display(void) 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 (use 0 for lossless)\n"); + fprintf(stdout, " compression factor (use 1 for lossless)\n"); fprintf(stdout, " Decreasing ratios required.\n"); - fprintf(stdout, " Example: -r 20,10,0 means \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, " Increasing PSNR values required, except 0 which can\n"); + fprintf(stdout, " be used for the last layer to indicate it is lossless.\n"); fprintf(stdout, " Options -r and -q cannot be used together.\n"); fprintf(stdout, "-n \n"); fprintf(stdout, " Number of resolutions.\n"); @@ -202,9 +203,9 @@ static void encode_help_display(void) 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"); + " resolution levels. The last specified record is halved successively for each \n"); fprintf(stdout, " remaining lower resolution levels.\n"); - fprintf(stdout, " Default: 215x215 at each resolution.\n"); + fprintf(stdout, " Default: 2^15x2^15 at each resolution.\n"); fprintf(stdout, "-t ,\n"); fprintf(stdout, " Tile size.\n"); fprintf(stdout, @@ -907,8 +908,9 @@ static int parse_cmdline_encoder(int argc, char **argv, case 'b': { /* code-block dimension */ int cblockw_init = 0, cblockh_init = 0; sscanf(opj_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) { + if (cblockw_init > 1024 || cblockw_init < 4 || + cblockh_init > 1024 || cblockh_init < 4 || + cblockw_init * cblockh_init > 4096) { fprintf(stderr, "!! Size of code_block error (option -b) !!\n\nRestriction :\n" " * width*height<=4096\n * 4<=width,height<= 1024\n\n"); @@ -1737,6 +1739,8 @@ int main(int argc, char **argv) img_fol_t img_fol; dircnt_t *dirptr = NULL; + int ret = 0; + OPJ_BOOL bSuccess; OPJ_BOOL bUseTiles = OPJ_FALSE; /* OPJ_TRUE */ OPJ_UINT32 l_nb_tiles = 4; @@ -1762,7 +1766,8 @@ int main(int argc, char **argv) 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, sizeof(indexfilename)) == 1) { - goto fails; + ret = 1; + goto fin; } /* Read directory if necessary */ @@ -1774,18 +1779,21 @@ int main(int argc, char **argv) char)); /* Stores at max 10 image file names*/ dirptr->filename = (char**) malloc(num_images * sizeof(char*)); if (!dirptr->filename_buf) { - return 0; + ret = 0; + goto fin; } 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; + ret = 0; + goto fin; } if (num_images == 0) { fprintf(stdout, "Folder is empty\n"); - return 0; + ret = 0; + goto fin; } } else { num_images = 1; @@ -1831,7 +1839,8 @@ int main(int argc, char **argv) image = pgxtoimage(parameters.infile, ¶meters); if (!image) { fprintf(stderr, "Unable to load pgx file\n"); - return 1; + ret = 1; + goto fin; } break; @@ -1839,7 +1848,8 @@ int main(int argc, char **argv) image = pnmtoimage(parameters.infile, ¶meters); if (!image) { fprintf(stderr, "Unable to load pnm file\n"); - return 1; + ret = 1; + goto fin; } break; @@ -1847,7 +1857,8 @@ int main(int argc, char **argv) image = bmptoimage(parameters.infile, ¶meters); if (!image) { fprintf(stderr, "Unable to load bmp file\n"); - return 1; + ret = 1; + goto fin; } break; @@ -1856,7 +1867,8 @@ int main(int argc, char **argv) image = tiftoimage(parameters.infile, ¶meters); if (!image) { fprintf(stderr, "Unable to load tiff file\n"); - return 1; + ret = 1; + goto fin; } break; #endif /* OPJ_HAVE_LIBTIFF */ @@ -1865,7 +1877,8 @@ int main(int argc, char **argv) image = rawtoimage(parameters.infile, ¶meters, &raw_cp); if (!image) { fprintf(stderr, "Unable to load raw file\n"); - return 1; + ret = 1; + goto fin; } break; @@ -1873,7 +1886,8 @@ int main(int argc, char **argv) image = rawltoimage(parameters.infile, ¶meters, &raw_cp); if (!image) { fprintf(stderr, "Unable to load raw file\n"); - return 1; + ret = 1; + goto fin; } break; @@ -1881,7 +1895,8 @@ int main(int argc, char **argv) image = tgatoimage(parameters.infile, ¶meters); if (!image) { fprintf(stderr, "Unable to load tga file\n"); - return 1; + ret = 1; + goto fin; } break; @@ -1890,7 +1905,8 @@ int main(int argc, char **argv) image = pngtoimage(parameters.infile, ¶meters); if (!image) { fprintf(stderr, "Unable to load png file\n"); - return 1; + ret = 1; + goto fin; } break; #endif /* OPJ_HAVE_LIBPNG */ @@ -1901,7 +1917,8 @@ int main(int argc, char **argv) */ if (!image) { fprintf(stderr, "Unable to load file: got no image\n"); - return 1; + ret = 1; + goto fin; } /* Decide if MCT should be used */ @@ -1912,12 +1929,14 @@ int main(int argc, char **argv) if ((parameters.tcp_mct == 1) && (image->numcomps < 3)) { fprintf(stderr, "RGB->YCC conversion cannot be used:\n"); fprintf(stderr, "Input image has less than 3 components\n"); - return 1; + ret = 1; + goto fin; } if ((parameters.tcp_mct == 2) && (!parameters.mct_data)) { fprintf(stderr, "Custom MCT has been set but no array-based MCT\n"); fprintf(stderr, "has been provided. Aborting.\n"); - return 1; + ret = 1; + goto fin; } } @@ -1957,13 +1976,15 @@ int main(int argc, char **argv) fprintf(stderr, "failed to encode image: opj_setup_encoder\n"); opj_destroy_codec(l_codec); opj_image_destroy(image); - return 1; + ret = 1; + goto fin; } /* open a byte stream for writing and allocate memory for all tiles */ l_stream = opj_stream_create_default_file_stream(parameters.outfile, OPJ_FALSE); if (! l_stream) { - return 1; + ret = 1; + goto fin; } /* encode the image */ @@ -1976,7 +1997,8 @@ int main(int argc, char **argv) OPJ_UINT32 l_data_size = 512 * 512 * 3; l_data = (OPJ_BYTE*) calloc(1, l_data_size); if (l_data == NULL) { - goto fails; + ret = 1; + goto fin; } for (i = 0; i < l_nb_tiles; ++i) { if (! opj_write_tile(l_codec, i, l_data, l_data_size, l_stream)) { @@ -1985,7 +2007,8 @@ int main(int argc, char **argv) opj_stream_destroy(l_stream); opj_destroy_codec(l_codec); opj_image_destroy(image); - return 1; + ret = 1; + goto fin; } } free(l_data); @@ -2006,7 +2029,8 @@ int main(int argc, char **argv) opj_image_destroy(image); fprintf(stderr, "failed to encode image\n"); remove(parameters.outfile); - return 1; + ret = 1; + goto fin; } num_compressed_files++; @@ -2022,26 +2046,15 @@ int main(int argc, char **argv) } - /* free user parameters structure */ - if (parameters.cp_comment) { - free(parameters.cp_comment); - } - if (parameters.cp_matrice) { - free(parameters.cp_matrice); - } - if (raw_cp.rawComps) { - free(raw_cp.rawComps); - } - t = opj_clock() - t; if (num_compressed_files) { fprintf(stdout, "encode time: %d ms \n", (int)((t * 1000.0) / (OPJ_FLOAT64)num_compressed_files)); } - return 0; + ret = 0; -fails: +fin: if (parameters.cp_comment) { free(parameters.cp_comment); } @@ -2063,5 +2076,5 @@ fails: } free(dirptr); } - return 1; + return ret; }