From 3b1bee0eec81ae97bdb345103074e98ad1d29ab8 Mon Sep 17 00:00:00 2001 From: Antonin Descampe Date: Wed, 26 Jan 2005 08:59:49 +0000 Subject: [PATCH] * function getopt added to the decoder (to efficiently manage arguments in command line) * reduce_on, reduce_value grouped in a single variable reduce * up-to-date usage display * image_type renamed --> decod_format * JPEG2000_format renamed --> cod_format --- codec/image_to_j2k.c | 16 +- codec/j2k_to_image.c | 928 +++++++++++++++++++++++++------------------ libopenjpeg/j2k.c | 4 +- libopenjpeg/j2k.h | 15 +- libopenjpeg/tcd.c | 8 +- mj2/frames_to_mj2.c | 5 +- 6 files changed, 570 insertions(+), 406 deletions(-) diff --git a/codec/image_to_j2k.c b/codec/image_to_j2k.c index 944e2506..adc6c17d 100644 --- a/codec/image_to_j2k.c +++ b/codec/image_to_j2k.c @@ -378,7 +378,7 @@ int main(int argc, char **argv) if ((S1 == 'p' && S2 == 'g' && S3 == 'x') || (S1 == 'P' && S2 == 'G' && S3 == 'X')) { - cp.image_type = 0; + cp.decod_format = PGX_DFMT; break; } @@ -390,13 +390,13 @@ int main(int argc, char **argv) || (S1 == 'P' && S2 == 'P' && S3 == 'M') || (S1 == 'p' && S2 == 'p' && S3 == 'm')) { - cp.image_type = 1; + cp.decod_format = PXM_DFMT; break; } if ((S1 == 'b' && S2 == 'm' && S3 == 'p') || (S1 == 'B' && S2 == 'M' && S3 == 'P')) { - cp.image_type = 2; + cp.decod_format = BMP_DFMT; break; } fprintf(stderr, @@ -421,10 +421,10 @@ int main(int argc, char **argv) if ((S1 == 'j' && S2 == '2' && S3 == 'k') || (S1 == 'J' && S2 == '2' && S3 == 'K')) - cp.JPEG2000_format = 0; + cp.cod_format = J2K_CFMT; else if ((S1 == 'j' && S2 == 'p' && S3 == '2') || (S1 == 'J' && S2 == 'P' && S3 == '2')) - cp.JPEG2000_format = 1; + cp.cod_format = JP2_CFMT; else { fprintf(stderr, "Unknown output format image *.%c%c%c [only *.j2k, *.jp2]!! \n", @@ -685,7 +685,7 @@ int main(int argc, char **argv) } } - switch (cp.image_type) { + switch (cp.decod_format) { case 0: if (Tile_arg) { if (!pgxtoimage @@ -841,7 +841,7 @@ int main(int argc, char **argv) - if (cp.JPEG2000_format == 0) { /* J2K format output */ + if (cp.cod_format == J2K_CFMT) { /* J2K format output */ if (cp.intermed_file == 1) { /* After the encoding of each tile, j2k_encode stores the data in the file */ len = j2k_encode(&img, &cp, outfile, cp.tdx * cp.tdy * 2, index); @@ -955,7 +955,7 @@ int main(int argc, char **argv) /* Remove the temporary files */ /* -------------------------- */ - if (cp.image_type) { /* PNM PGM PPM */ + if (cp.decod_format != PGX_CFMT) { /* PNM PGM PPM or BMP */ for (i = 0; i < img.numcomps; i++) { char tmp; sprintf(&tmp, "Compo%d", i); diff --git a/codec/j2k_to_image.c b/codec/j2k_to_image.c index ea4e52d0..5895b8e3 100644 --- a/codec/j2k_to_image.c +++ b/codec/j2k_to_image.c @@ -1,29 +1,29 @@ /* Copyright (c) 2001 David Janssens - * Copyright (c) 2002-2003 Yannick Verschueren - * Copyright (c) 2002-2003 Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * - * 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. - */ +* Copyright (c) 2002-2003 Yannick Verschueren +* Copyright (c) 2002-2003 Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium +* +* 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. +*/ @@ -47,421 +47,573 @@ #include #include #include +#ifndef DONT_HAVE_GETOPT +#include +#else +#include "compat/getopt.h" +#endif -int ceildiv(int a, int b) +void usage_display(char *prgm) { - return (a + b - 1) / b; + fprintf(stdout,"Usage:\n"); + fprintf(stdout," %s...\n",prgm); + fprintf(stdout," -i \n"); + fprintf(stdout," REQUIRED\n"); + fprintf(stdout," Currently accepts J2K-files, JP2-files and JPT-files. The file type\n"); + fprintf(stdout," is identified based on its suffix.\n"); + fprintf(stdout," -o \n"); + fprintf(stdout," REQUIRED\n"); + fprintf(stdout," Currently accepts PGM-files, PPM-files, PNM-files, PGX-files and\n"); + fprintf(stdout," BMP-files. Binary data is written to the file (not ascii). If a PGX\n"); + fprintf(stdout," filename is given, there will be as many output files as there are\n"); + fprintf(stdout," components: an indice starting from 0 will then be appended to the\n"); + fprintf(stdout," output filename, just before the \"pgx\" extension. If a PGM filename\n"); + fprintf(stdout," is given and there are more than one component, only the first component\n"); + fprintf(stdout," will be written to the file.\n"); + fprintf(stdout," -r \n"); + fprintf(stdout," Set the number of highest resolution levels to be discarded. The\n"); + fprintf(stdout," image resolution is effectively divided by 2 to the power of the\n"); + fprintf(stdout," number of discarded levels. The reduce factor is limited by the\n"); + fprintf(stdout," smallest total number of decomposition levels among tiles.\n"); + //fprintf(stdout," -l \n"); + //fprintf(stdout," Set the maximum number of quality layers to decode. If there are\n"); + //fprintf(stdout," less quality layers than the specified number, all the quality layers\n"); + //fprintf(stdout," are decoded.\n"); + fprintf(stdout," -u\n"); + fprintf(stdout," print an usage statement\n"); + fprintf(stdout,"\n"); } int main(int argc, char **argv) { - FILE *f=NULL; - char *src=NULL, *src_name=NULL; - char *dest=NULL, S1, S2, S3; + FILE *fsrc=NULL; + FILE *fdest=NULL; + char *infile=NULL; + char *outfile=NULL; + char *tmp=NULL; + char S1, S2, S3; + + char *src=NULL; + char *dest=NULL; + int len; - + j2k_image_t img; - j2k_cp_t cp; - int w, wr, wrr, h, hr, hrr, max; - int i, image_type = -1, compno, pad, j; - int adjust; jp2_struct_t *jp2_struct=NULL; - - if (argc < 3) { - fprintf(stderr, - "usage: %s j2k-file image-file [-reduce n]\n", argv[0]); - return 1; - } - - f = fopen(argv[1], "rb"); - if (!f) { - fprintf(stderr, "failed to open %s for reading\n", argv[1]); - return 1; - } - - dest = argv[2]; - - cp.reduce_on = 0; - cp.reduce_value = 0; - - /* OPTION REDUCE IS ACTIVE */ - if (argc == 5) { - if (strcmp(argv[3], "-reduce")) { + + int w, wr, wrr, h, hr, hrr, max; + int i, compno, pad, j; + int adjust; + + cp.layer=0; + cp.reduce=0; + cp.decod_format=-1; + cp.cod_format=-1; + + while (1) { + int c = getopt(argc, argv,"i:o:r:l:u"); + if (c == -1) + break; + switch (c) { + + //Input file + case 'i': + infile = optarg; + tmp = optarg; + while (*tmp) { + tmp++; + } + tmp--; + S3 = *tmp; + tmp--; + S2 = *tmp; + tmp--; + S1 = *tmp; + + /* J2K format */ + if ((S1 == 'j' && S2 == '2' && S3 == 'k') + || (S1 == 'J' && S2 == '2' && S3 == 'K') + || (S1 == 'j' && S2 == '2' && S3 == 'c') + || (S1 == 'J' && S2 == '2' && S3 == 'C')) { + cp.cod_format=J2K_CFMT; + break; + } + + /* JP2 format */ + if ((S1 == 'j' && S2 == 'p' && S3 == '2') + || (S1 == 'J' && S2 == 'P' && S3 == '2')) { + cp.cod_format=JP2_CFMT; + break; + } + + /* JPT format */ + if ((S1 == 'j' && S2 == 'p' && S3 == 't') + || (S1 == 'J' && S2 == 'P' && S3 == 'T')) { + cp.cod_format=JPT_CFMT; + break; + } + fprintf(stderr, - "usage: options " "-reduce n" - " where n is the factor of reduction [%s]\n", argv[3]); + "j2k_to_image : Unknown input image format *.%c%c%c [only *.j2k, *.jp2, *.jpc or *.jpt]!! \n", + S1, S2, S3); return 1; + break; + + /* ----------------------------------------------------- */ + + //Output file + case 'o': + outfile = optarg; + tmp = optarg; + while (*tmp) { + tmp++; + } + tmp--; + S3 = *tmp; + tmp--; + S2 = *tmp; + tmp--; + S1 = *tmp; + + // PGX format + if ((S1 == 'p' && S2 == 'g' && S3 == 'x') + || (S1 == 'P' && S2 == 'G' && S3 == 'X')) { + cp.decod_format = PGX_DFMT; + break; + } + + // PxM format + if ((S1 == 'p' && S2 == 'n' && S3 == 'm') + || (S1 == 'P' && S2 == 'N' && S3 == 'M') + || (S1 == 'p' && S2 == 'g' && S3 == 'm') + || (S1 == 'P' && S2 == 'G' && S3 == 'M') + || (S1 == 'P' && S2 == 'P' && S3 == 'M') + || (S1 == 'p' && S2 == 'p' && S3 == 'm')) { + cp.decod_format = PXM_DFMT; + break; + } + + // BMP format + if ((S1 == 'b' && S2 == 'm' && S3 == 'p') + || (S1 == 'B' && S2 == 'M' && S3 == 'P')) { + cp.decod_format = BMP_DFMT; + break; + } + + // otherwise : error + fprintf(stderr, + "!! Unrecognized output image format *.%c%c%c [only *.pnm, *.pgm, *.ppm, *.pgx or *.bmp] !!\n", + S1, S2, S3); + + return 1; + break; + + /* ----------------------------------------------------- */ + + //Reduce option + case 'r': + tmp=optarg; + sscanf(tmp, "%d", &cp.reduce); + break; + + /* ----------------------------------------------------- */ + + //Layering option + case 'l': + tmp=optarg; + sscanf(tmp, "%d", &cp.layer); + break; + + /* ----------------------------------------------------- */ + + case 'u': + usage_display(argv[0]); + return 0; + break; + /* ----------------------------------------------------- */ + + default: + fprintf(stderr,"WARNING -> this option is not valid \"-%c %s\"\n",c,optarg); + break; + } - cp.reduce_on = 1; - sscanf(argv[4], "%d", &cp.reduce_value); } - - while (*dest) { - dest++; - } - dest--; - S3 = *dest; - dest--; - S2 = *dest; - dest--; - S1 = *dest; - - if ((S1 == 'p' && S2 == 'g' && S3 == 'x') - || (S1 == 'P' && S2 == 'G' && S3 == 'X')) { - image_type = 0; - - dest--; - - *dest = '\0'; - } - - if ((S1 == 'p' && S2 == 'n' && S3 == 'm') - || (S1 == 'P' && S2 == 'N' && S3 == 'M') || (S1 == 'p' && S2 == 'g' - && S3 == 'm') - || (S1 == 'P' && S2 == 'G' && S3 == 'M') || (S1 == 'P' && S2 == 'P' - && S3 == 'M') - || (S1 == 'p' && S2 == 'p' && S3 == 'm')) { - image_type = 1; - } - - if ((S1 == 'b' && S2 == 'm' && S3 == 'p') - || (S1 == 'B' && S2 == 'M' && S3 == 'P')) { - image_type = 2; - } - - if (image_type == -1) { - fprintf(stderr, - "!! Unrecognized format for infile : %c%c%c [accept only *.pnm, *.pgm, *.ppm, *.pgx or *.bmp] !!\n\n", - S1, S2, S3); + + //Check required arguments + //------------------------ + if (!infile || !outfile) { + fprintf(stderr,"ERROR -> At least one required argument is missing\nCheck j2k_to_image -u for usage information\n"); return 1; } - - fseek(f, 0, SEEK_END); - len = ftell(f); - fseek(f, 0, SEEK_SET); + + //Read the input file and put it in memory + //---------------------------------------- + fsrc = fopen(infile, "rb"); + if (!fsrc) { + fprintf(stderr, "ERROR -> failed to open %s for reading\n", infile); + return 1; + } + fseek(fsrc, 0, SEEK_END); + len = ftell(fsrc); + fseek(fsrc, 0, SEEK_SET); src = (char *) malloc(len); - fread(src, 1, len, f); - fclose(f); - - src_name = argv[1]; - while (*src_name) { - src_name++; - } - src_name--; - S3 = *src_name; - src_name--; - S2 = *src_name; - src_name--; - S1 = *src_name; - - - /* J2K format */ - if ((S1 == 'j' && S2 == '2' && S3 == 'k') - || (S1 == 'J' && S2 == '2' && S3 == 'K') || (S1 == 'j' && S2 == '2' - && S3 == 'c') - || (S1 == 'J' && S2 == '2' && S3 == 'C')) { + fread(src, 1, len, fsrc); + fclose(fsrc); + + //Decode the code-stream + //---------------------- + switch(cp.cod_format) { + + case J2K_CFMT: if (!j2k_decode(src, len, &img, &cp)) { - fprintf(stderr, "j2k_to_image: failed to decode image!\n"); + fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); return 1; } - } - - /* JP2 format */ - else if ((S1 == 'j' && S2 == 'p' && S3 == '2') - || (S1 == 'J' && S2 == 'P' && S3 == '2')) { + break; + + case JP2_CFMT: jp2_struct = (jp2_struct_t *) malloc(sizeof(jp2_struct_t)); - jp2_struct->image = &img; - + if (jp2_read_struct(src, jp2_struct, len)) { - fprintf(stderr, "j2k_to_image: failed to decode jp2 structure!\n"); + fprintf(stderr, "ERROR -> j2k_to_image: failed to decode jp2 structure!\n"); return 1; } - + if (!j2k_decode(src + jp2_struct->j2k_codestream_offset, jp2_struct->j2k_codestream_len, &img, &cp)) { - fprintf(stderr, "j2k_to_image: failed to decode image!\n"); + fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); return 1; } + /* Insert code here if you want to create actions on jp2_struct before deleting it */ + free(jp2_struct); - } - - /* JPT format */ - else if ((S1 == 'j' && S2 == 'p' && S3 == 't') - || (S1 == 'J' && S2 == 'P' && S3 == 'T')) { + break; + + case JPT_CFMT: if (!j2k_decode_jpt_stream(src, len, &img, &cp)) { - fprintf(stderr, "j2k_to_image: failed to decode image!\n"); + fprintf(stderr, "ERROR -> j2k_to_image: failed to decode JPT-file!\n"); return 1; } - } - - /* otherwise : error */ - else { + break; + + default: fprintf(stderr, - "j2k_to_image : Unknown format image *.%c%c%c [only *.j2k, *.jp2, *.jpc or *.jpt]!! \n", - S1, S2, S3); + "ERROR -> j2k_to_image : Unknown input image format\n"); return 1; + break; } - + + //Free the memory containing the code-stream + //------------------------------------------ + free(src); - /* ------------------ CREATE OUT IMAGE WITH THE RIGHT FORMAT ----------------------- */ - + + + //Create output image + //------------------- + /* ---------------------------- / */ /* / / */ /* / FORMAT : PNM, PGM or PPM / */ /* / / */ /* ---------------------------- / */ - - switch (image_type) { - case 1: /* PNM PGM PPM */ + + switch (cp.decod_format) { + case PXM_DFMT: /* PNM PGM PPM */ + + tmp=outfile; + while (*tmp) { + tmp++; + } + tmp--; + tmp--; + S2 = *tmp; + if (img.numcomps == 3 && img.comps[0].dx == img.comps[1].dx - && img.comps[1].dx == img.comps[2].dx - && img.comps[0].dy == img.comps[1].dy - && img.comps[1].dy == img.comps[2].dy - && img.comps[0].prec == img.comps[1].prec - && img.comps[1].prec == img.comps[2].prec) { - f = fopen(argv[2], "wb"); - w = ceildiv(img.x1 - img.x0, img.comps[0].dx); - // wr = ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor),img.comps[0].dx); + && img.comps[1].dx == img.comps[2].dx + && img.comps[0].dy == img.comps[1].dy + && img.comps[1].dy == img.comps[2].dy + && img.comps[0].prec == img.comps[1].prec + && img.comps[1].prec == img.comps[2].prec + && S2 !='g' && S2 !='G') { + + fdest = fopen(outfile, "wb"); + if (!fdest) { + fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); + return 1; + } + + w = int_ceildiv(img.x1 - img.x0, img.comps[0].dx); + // wr = int_ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor),img.comps[0].dx); wr = img.comps[0].w; wrr = int_ceildivpow2(img.comps[0].w, img.comps[0].factor); - - h = ceildiv(img.y1 - img.y0, img.comps[0].dy); - // hr = ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[0].dy); + + h = int_ceildiv(img.y1 - img.y0, img.comps[0].dy); + // hr = int_ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[0].dy); hr = img.comps[0].h; hrr = int_ceildivpow2(img.comps[0].h, img.comps[0].factor); - + max = img.comps[0].prec > 8 ? 255 : (1 << img.comps[0].prec) - 1; - + img.comps[0].x0 = int_ceildivpow2(img.comps[0].x0 - - int_ceildiv(img.x0, img.comps[0].dx), - img.comps[0].factor); + int_ceildiv(img.x0, img.comps[0].dx), + img.comps[0].factor); img.comps[0].y0 = int_ceildivpow2(img.comps[0].y0 - - int_ceildiv(img.y0, img.comps[0].dy), - img.comps[0].factor); - - - fprintf(f, "P6\n# %d %d %d %d %d\n%d %d\n%d\n", - cp.tcps[cp.tileno[0]].tccps[0].numresolutions, w, h, - img.comps[0].x0, img.comps[0].y0, wrr, hrr, max); + int_ceildiv(img.y0, img.comps[0].dy), + img.comps[0].factor); + + + fprintf(fdest, "P6\n# %d %d %d %d %d\n%d %d\n%d\n", + cp.tcps[cp.tileno[0]].tccps[0].numresolutions, w, h, + img.comps[0].x0, img.comps[0].y0, wrr, hrr, max); adjust = img.comps[0].prec > 8 ? img.comps[0].prec - 8 : 0; for (i = 0; i < wrr * hrr; i++) { char r, g, b; r = img.comps[0].data[i / wrr * wr + i % wrr]; r += (img.comps[0].sgnd ? 1 << (img.comps[0].prec - 1) : 0); r = r >> adjust; - + g = img.comps[1].data[i / wrr * wr + i % wrr]; g += (img.comps[1].sgnd ? 1 << (img.comps[1].prec - 1) : 0); g = g >> adjust; - + b = img.comps[2].data[i / wrr * wr + i % wrr]; b += (img.comps[2].sgnd ? 1 << (img.comps[2].prec - 1) : 0); b = b >> adjust; - - fprintf(f, "%c%c%c", r, g, b); + + fprintf(fdest, "%c%c%c", r, g, b); } free(img.comps[0].data); free(img.comps[1].data); free(img.comps[2].data); - fclose(f); + fclose(fdest); + } else { - for (compno = 0; compno < img.numcomps; compno++) { + int ncomp=(S2=='g' || S2=='G')?1:img.numcomps; + if (img.numcomps>ncomp) { + fprintf(stderr,"WARNING -> [PGM files] Only the first component\n"); + fprintf(stderr," is written to the file\n"); + } + for (compno = 0; compno < ncomp; compno++) { char name[256]; - if (img.numcomps > 1) { - sprintf(name, "%d.%s", compno, argv[2]); + if (ncomp > 1) { + sprintf(name, "%d.%s", compno, outfile); } else { - sprintf(name, "%s", argv[2]); + sprintf(name, "%s", outfile); } - f = fopen(name, "wb"); - w = ceildiv(img.x1 - img.x0, img.comps[compno].dx); - // wr = ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor),img.comps[compno].dx); + + fdest = fopen(name, "wb"); + if (!fdest) { + fprintf(stderr, "ERROR -> failed to open %s for writing\n", name); + return 1; + } + + w = int_ceildiv(img.x1 - img.x0, img.comps[compno].dx); + // wr = int_ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor),img.comps[compno].dx); wr = img.comps[compno].w; wrr = int_ceildivpow2(img.comps[compno].w, img.comps[compno].factor); - - h = ceildiv(img.y1 - img.y0, img.comps[compno].dy); - // hr = ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[compno].dy); + + h = int_ceildiv(img.y1 - img.y0, img.comps[compno].dy); + // hr = int_ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[compno].dy); hr = img.comps[compno].h; hrr = int_ceildivpow2(img.comps[compno].h, img.comps[compno].factor); - + max = img.comps[compno].prec > 8 ? 255 : (1 << img.comps[compno].prec) - 1; - + img.comps[compno].x0 = int_ceildivpow2(img.comps[compno].x0 - - int_ceildiv(img.x0, + int_ceildiv(img.x0, img.comps[compno].dx), - img.comps[compno].factor); + img.comps[compno].factor); img.comps[compno].y0 = int_ceildivpow2(img.comps[compno].y0 - - int_ceildiv(img.y0, + int_ceildiv(img.y0, img.comps[compno].dy), - img.comps[compno].factor); - - fprintf(f, "P5\n# %d %d %d %d %d\n%d %d\n%d\n", - cp.tcps[cp.tileno[0]].tccps[compno]. - numresolutions, w, h, img.comps[compno].x0, - img.comps[compno].y0, wrr, hrr, max); + img.comps[compno].factor); + + fprintf(fdest, "P5\n# %d %d %d %d %d\n%d %d\n%d\n", + cp.tcps[cp.tileno[0]].tccps[compno]. + numresolutions, w, h, img.comps[compno].x0, + img.comps[compno].y0, wrr, hrr, max); adjust = img.comps[compno].prec > 8 ? img.comps[compno].prec - 8 : 0; for (i = 0; i < wrr * hrr; i++) { char l; l = img.comps[compno].data[i / wrr * wr + i % wrr]; l += (img.comps[compno]. - sgnd ? 1 << (img.comps[compno].prec - 1) : 0); + sgnd ? 1 << (img.comps[compno].prec - 1) : 0); l = l >> adjust; - fprintf(f, "%c", l); + fprintf(fdest, "%c", l); } - fclose(f); + fclose(fdest); free(img.comps[compno].data); } } break; - + /* ------------------------ / */ /* / / */ /* / FORMAT : PGX / */ /* / / */ /* /----------------------- / */ - case 0: /* PGX */ + case PGX_DFMT: /* PGX */ for (compno = 0; compno < img.numcomps; compno++) { j2k_comp_t *comp = &img.comps[compno]; char name[256]; - int nbytes = 0; + tmp = outfile; + while (*tmp) { + tmp++; + } + while (*tmp!='.') { + tmp--; + } + *tmp='\0'; //if (img.numcomps > 1) - sprintf(name, "%s-%d.pgx", argv[2], compno); - + sprintf(name, "%s-%d.pgx", outfile, compno); + //else - - //sprintf(name, "%s.pgx", argv[2]); - - f = fopen(name, "wb"); - // w = ceildiv(img.x1 - img.x0, comp->dx); - // wr = ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor), comp->dx); + + //sprintf(name, "%s.pgx", outfile); + + fdest = fopen(name, "wb"); + if (!fdest) { + fprintf(stderr, "ERROR -> failed to open %s for writing\n", name); + return 1; + } + + // w = int_ceildiv(img.x1 - img.x0, comp->dx); + // wr = int_ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor), comp->dx); w = img.comps[compno].w; wr = int_ceildivpow2(img.comps[compno].w, img.comps[compno].factor); - - // h = ceildiv(img.y1 - img.y0, comp->dy); - // hr = ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), comp->dy); + + // h = int_ceildiv(img.y1 - img.y0, comp->dy); + // hr = int_ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), comp->dy); h = img.comps[compno].h; hr = int_ceildivpow2(img.comps[compno].h, img.comps[compno].factor); - - fprintf(f, "PG ML %c %d %d %d\n", comp->sgnd ? '-' : '+', - comp->prec, wr, hr); - + + fprintf(fdest, "PG ML %c %d %d %d\n", comp->sgnd ? '-' : '+', + comp->prec, wr, hr); + if (comp->prec <= 8) nbytes = 1; - + else if (comp->prec <= 16) nbytes = 2; - + else nbytes = 4; for (i = 0; i < wr * hr; i++) { int v = img.comps[compno].data[i / wr * w + i % wr]; - + for (j = nbytes - 1; j >= 0; j--) { - + char byte = (char) (v >> (j * 8)); - - fwrite(&byte, 1, 1, f); - + + fwrite(&byte, 1, 1, fdest); + } } free(img.comps[compno].data); - fclose(f); + fclose(fdest); } break; - + /* ------------------------ / */ /* / / */ /* / FORMAT : BMP / */ /* / / */ /* /----------------------- / */ - - case 2: /* BMP */ + + case BMP_DFMT: /* BMP */ if (img.numcomps == 3 && img.comps[0].dx == img.comps[1].dx - && img.comps[1].dx == img.comps[2].dx - && img.comps[0].dy == img.comps[1].dy - && img.comps[1].dy == img.comps[2].dy - && img.comps[0].prec == img.comps[1].prec - && img.comps[1].prec == img.comps[2].prec) { + && img.comps[1].dx == img.comps[2].dx + && img.comps[0].dy == img.comps[1].dy + && img.comps[1].dy == img.comps[2].dy + && img.comps[0].prec == img.comps[1].prec + && img.comps[1].prec == img.comps[2].prec) { /* -->> -->> -->> -->> - - 24 bits color - - <<-- <<-- <<-- <<-- */ - - f = fopen(argv[2], "wb"); - // w = ceildiv(img.x1 - img.x0, img.comps[0].dx); - // wr = ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor), img.comps[0].dx); + + 24 bits color + + <<-- <<-- <<-- <<-- */ + + fdest = fopen(outfile, "wb"); + if (!fdest) { + fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); + return 1; + } + + // w = int_ceildiv(img.x1 - img.x0, img.comps[0].dx); + // wr = int_ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor), img.comps[0].dx); w = img.comps[0].w; wr = int_ceildivpow2(img.comps[0].w, img.comps[0].factor); - - // h = ceildiv(img.y1 - img.y0, img.comps[0].dy); - // hr = ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[0].dy); + + // h = int_ceildiv(img.y1 - img.y0, img.comps[0].dy); + // hr = int_ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[0].dy); h = img.comps[0].h; hr = int_ceildivpow2(img.comps[0].h, img.comps[0].factor); - - fprintf(f, "BM"); - + + fprintf(fdest, "BM"); + /* FILE HEADER */ /* ------------- */ - fprintf(f, "%c%c%c%c", - (unsigned char) (hr * wr * 3 + 3 * hr * (wr % 2) + - 54) & 0xff, - (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54) - >> 8) & 0xff, - (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54) - >> 16) & 0xff, - (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54) - >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, - ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff, - ((54) >> 16) & 0xff, ((54) >> 24) & 0xff); - + fprintf(fdest, "%c%c%c%c", + (unsigned char) (hr * wr * 3 + 3 * hr * (wr % 2) + + 54) & 0xff, + (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54) + >> 8) & 0xff, + (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54) + >> 16) & 0xff, + (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2) + 54) + >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, + ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff, + ((54) >> 16) & 0xff, ((54) >> 24) & 0xff); + /* INFO HEADER */ /* ------------- */ - fprintf(f, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, - ((40) >> 16) & 0xff, ((40) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (unsigned char) ((wr) & 0xff), - (unsigned char) ((wr) >> 8) & 0xff, - (unsigned char) ((wr) >> 16) & 0xff, - (unsigned char) ((wr) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (unsigned char) ((hr) & 0xff), - (unsigned char) ((hr) >> 8) & 0xff, - (unsigned char) ((hr) >> 16) & 0xff, - (unsigned char) ((hr) >> 24) & 0xff); - fprintf(f, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff); - fprintf(f, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff); - fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, - ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", - (unsigned char) (3 * hr * wr + - 3 * hr * (wr % 2)) & 0xff, - (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >> - 8) & 0xff, - (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >> - 16) & 0xff, - (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >> - 24) & 0xff); - fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, - ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, - ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, - ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, - ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - + fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, + ((40) >> 16) & 0xff, ((40) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (unsigned char) ((wr) & 0xff), + (unsigned char) ((wr) >> 8) & 0xff, + (unsigned char) ((wr) >> 16) & 0xff, + (unsigned char) ((wr) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (unsigned char) ((hr) & 0xff), + (unsigned char) ((hr) >> 8) & 0xff, + (unsigned char) ((hr) >> 16) & 0xff, + (unsigned char) ((hr) >> 24) & 0xff); + fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff); + fprintf(fdest, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff); + fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, + ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", + (unsigned char) (3 * hr * wr + + 3 * hr * (wr % 2)) & 0xff, + (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >> + 8) & 0xff, + (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >> + 16) & 0xff, + (unsigned char) ((hr * wr * 3 + 3 * hr * (wr % 2)) >> + 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, + ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, + ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, + ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, + ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); + for (i = 0; i < wr * hr; i++) { unsigned char R, G, B; /* a modifier */ @@ -471,125 +623,129 @@ int main(int argc, char **argv) G = img.comps[1].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)]; // B = img.comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; B = img.comps[2].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)]; - fprintf(f, "%c%c%c", B, G, R); - + fprintf(fdest, "%c%c%c", B, G, R); + if ((i + 1) % wr == 0) { for (pad = (3 * wr) % 4 ? 4 - (3 * wr) % 4 : 0; pad > 0; pad--) /* ADD */ - fprintf(f, "%c", 0); + fprintf(fdest, "%c", 0); } } - fclose(f); + fclose(fdest); free(img.comps[1].data); free(img.comps[2].data); } else { /* Gray-scale */ - - /* -->> -->> -->> -->> - - 8 bits non code (Gray scale) - - <<-- <<-- <<-- <<-- */ - f = fopen(argv[2], "wb"); - // w = ceildiv(img.x1 - img.x0, img.comps[0].dx); - // wr = ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor), img.comps[0].dx); + + /* -->> -->> -->> -->> + + 8 bits non code (Gray scale) + + <<-- <<-- <<-- <<-- */ + fdest = fopen(argv[2], "wb"); + // w = int_ceildiv(img.x1 - img.x0, img.comps[0].dx); + // wr = int_ceildiv(int_ceildivpow2(img.x1 - img.x0,img.factor), img.comps[0].dx); w = img.comps[0].w; wr = int_ceildivpow2(img.comps[0].w, img.comps[0].factor); - - // h = ceildiv(img.y1 - img.y0, img.comps[0].dy); - // hr = ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[0].dy); + + // h = int_ceildiv(img.y1 - img.y0, img.comps[0].dy); + // hr = int_ceildiv(int_ceildivpow2(img.y1 - img.y0,img.factor), img.comps[0].dy); h = img.comps[0].h; hr = int_ceildivpow2(img.comps[0].h, img.comps[0].factor); - - fprintf(f, "BM"); - + + fprintf(fdest, "BM"); + /* FILE HEADER */ /* ------------- */ - fprintf(f, "%c%c%c%c", - (unsigned char) (hr * wr + 54 + 1024 + - hr * (wr % 2)) & 0xff, - (unsigned char) ((hr * wr + 54 + 1024 + hr * (wr % 2)) - >> 8) & 0xff, - (unsigned char) ((hr * wr + 54 + 1024 + hr * (wr % 2)) - >> 16) & 0xff, - (unsigned char) ((hr * wr + 54 + 1024 + wr * (wr % 2)) - >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, - ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (54 + 1024) & 0xff, - ((54 + 1024) >> 8) & 0xff, ((54 + 1024) >> 16) & 0xff, - ((54 + 1024) >> 24) & 0xff); - + fprintf(fdest, "%c%c%c%c", + (unsigned char) (hr * wr + 54 + 1024 + + hr * (wr % 2)) & 0xff, + (unsigned char) ((hr * wr + 54 + 1024 + hr * (wr % 2)) + >> 8) & 0xff, + (unsigned char) ((hr * wr + 54 + 1024 + hr * (wr % 2)) + >> 16) & 0xff, + (unsigned char) ((hr * wr + 54 + 1024 + wr * (wr % 2)) + >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, + ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (54 + 1024) & 0xff, + ((54 + 1024) >> 8) & 0xff, ((54 + 1024) >> 16) & 0xff, + ((54 + 1024) >> 24) & 0xff); + /* INFO HEADER */ /* ------------- */ - fprintf(f, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, - ((40) >> 16) & 0xff, ((40) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (unsigned char) ((wr) & 0xff), - (unsigned char) ((wr) >> 8) & 0xff, - (unsigned char) ((wr) >> 16) & 0xff, - (unsigned char) ((wr) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (unsigned char) ((hr) & 0xff), - (unsigned char) ((hr) >> 8) & 0xff, - (unsigned char) ((hr) >> 16) & 0xff, - (unsigned char) ((hr) >> 24) & 0xff); - fprintf(f, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff); - fprintf(f, "%c%c", (8) & 0xff, ((8) >> 8) & 0xff); - fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, - ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", - (unsigned char) (hr * wr + hr * (wr % 2)) & 0xff, - (unsigned char) ((hr * wr + hr * (wr % 2)) >> 8) & - 0xff, - (unsigned char) ((hr * wr + hr * (wr % 2)) >> 16) & - 0xff, - (unsigned char) ((hr * wr + hr * (wr % 2)) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, - ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, - ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, - ((256) >> 16) & 0xff, ((256) >> 24) & 0xff); - fprintf(f, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, - ((256) >> 16) & 0xff, ((256) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, + ((40) >> 16) & 0xff, ((40) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (unsigned char) ((wr) & 0xff), + (unsigned char) ((wr) >> 8) & 0xff, + (unsigned char) ((wr) >> 16) & 0xff, + (unsigned char) ((wr) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (unsigned char) ((hr) & 0xff), + (unsigned char) ((hr) >> 8) & 0xff, + (unsigned char) ((hr) >> 16) & 0xff, + (unsigned char) ((hr) >> 24) & 0xff); + fprintf(fdest, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff); + fprintf(fdest, "%c%c", (8) & 0xff, ((8) >> 8) & 0xff); + fprintf(fdest, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff, + ((0) >> 16) & 0xff, ((0) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", + (unsigned char) (hr * wr + hr * (wr % 2)) & 0xff, + (unsigned char) ((hr * wr + hr * (wr % 2)) >> 8) & + 0xff, + (unsigned char) ((hr * wr + hr * (wr % 2)) >> 16) & + 0xff, + (unsigned char) ((hr * wr + hr * (wr % 2)) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, + ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff, + ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, + ((256) >> 16) & 0xff, ((256) >> 24) & 0xff); + fprintf(fdest, "%c%c%c%c", (256) & 0xff, ((256) >> 8) & 0xff, + ((256) >> 16) & 0xff, ((256) >> 24) & 0xff); } - + for (i = 0; i < 256; i++) { - fprintf(f, "%c%c%c%c", i, i, i, 0); + fprintf(fdest, "%c%c%c%c", i, i, i, 0); } - + for (i = 0; i < wr * hr; i++) { /* a modifier !! */ - // fprintf(f, "%c", img.comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]); - fprintf(f, "%c", - img.comps[0].data[w * hr - ((i) / (wr) + 1) * w + - (i) % (wr)]); - /*if (((i + 1) % w == 0 && w % 2)) - fprintf(f, "%c", 0); */ + // fprintf(fdest, "%c", img.comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]); + fprintf(fdest, "%c", + img.comps[0].data[w * hr - ((i) / (wr) + 1) * w + + (i) % (wr)]); + /*if (((i + 1) % w == 0 && w % 2)) + fprintf(fdest, "%c", 0); */ if ((i + 1) % wr == 0) { for (pad = wr % 4 ? 4 - wr % 4 : 0; pad > 0; pad--) /* ADD */ - fprintf(f, "%c", 0); + fprintf(fdest, "%c", 0); } } - fclose(f); + fclose(fdest); free(img.comps[0].data); break; + default: + fprintf(stderr, + "ERROR -> j2k_to_image : Unknown output image format\n"); + return 1; break; } - - - + + + // Free remaining structures + //-------------------------- j2k_dec_release(); - - - - //MEMORY LEAK - - #ifdef _DEBUG - - _CrtDumpMemoryLeaks(); - - #endif - - //MEM - + + + + // Check memory leaks if debug mode + //--------------------------------- + +#ifdef _DEBUG + + _CrtDumpMemoryLeaks(); + +#endif + return 0; } diff --git a/libopenjpeg/j2k.c b/libopenjpeg/j2k.c index 274d1b69..6092c5bb 100644 --- a/libopenjpeg/j2k.c +++ b/libopenjpeg/j2k.c @@ -345,6 +345,8 @@ void j2k_read_cox(int compno) J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp; tccp = &tcp->tccps[compno]; tccp->numresolutions = cio_read(1) + 1; /* SPcox (D) */ + //Check the reduce value + j2k_cp->reduce=int_min((tccp->numresolutions)-1,j2k_cp->reduce); tccp->cblkw = cio_read(1) + 2; /* SPcox (E) */ tccp->cblkh = cio_read(1) + 2; /* SPcox (F) */ tccp->cblksty = cio_read(1); /* SPcox (G) */ @@ -878,7 +880,7 @@ void j2k_write_sod() } info_IM.num = 0; - if (j2k_cp->image_type) + if (j2k_cp->decod_format != PGX_DFMT) l = tcd_encode_tile_pxm(j2k_curtileno, cio_getbp(), cio_numbytesleft() - 2, &info_IM); else diff --git a/libopenjpeg/j2k.h b/libopenjpeg/j2k.h index bc0ad535..d32d6bf8 100644 --- a/libopenjpeg/j2k.h +++ b/libopenjpeg/j2k.h @@ -43,6 +43,13 @@ #define J2K_MAXRLVLS 33 /* Number of maximum resolution level authorized */ #define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /* Number of maximum sub-band linked to number of resolution level */ +#define J2K_CFMT 0 +#define JP2_CFMT 1 +#define JPT_CFMT 2 +#define MJ2_CFMT 3 +#define PXM_DFMT 0 +#define PGX_DFMT 1 +#define BMP_DFMT 2 #define J2K_CP_CSTY_PRT 0x01 #define J2K_CP_CSTY_SOP 0x02 @@ -125,14 +132,14 @@ typedef struct { } j2k_tcp_t; typedef struct { - int JPEG2000_format; /* 0: J2K 1:JP2 */ int intermed_file; /* 1: Store each encoded tile one by one in the output file (for mega-Images)*/ - int image_type; /* 0: PNM, PGM, PPM 1: PGX */ + int decod_format; /* 0: PGX, 1: PxM, 2: BMP */ + int cod_format; /* 0: J2K, 1: JP2, 2: JPT */ int disto_alloc; /* Allocation by rate/distortion */ int fixed_alloc; /* Allocation by fixed layer */ int fixed_quality; /* add fixed_quality */ - int reduce_on; /* option reduce is used if reduce = 1 */ - int reduce_value; /* if option reduce is used -> original dimension divided by 2^value */ + int reduce; /* if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */ + int layer; /* if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */ int index_on; /* 0 = no index || 1 = index */ int tx0, ty0; /* XTOsiz, YTOsiz */ int tdx, tdy; /* XTsiz, YTsiz */ diff --git a/libopenjpeg/tcd.c b/libopenjpeg/tcd.c index 225f75a0..58c660e1 100644 --- a/libopenjpeg/tcd.c +++ b/libopenjpeg/tcd.c @@ -1488,7 +1488,7 @@ int tcd_decode_tile(unsigned char *src, int len, int tileno) time = clock(); - fprintf(stdout, "tile decoding time %d/%d: ", tileno + 1, + fprintf(stdout, "Tile %d of %d decoded in ", tileno + 1, tcd_cp->tw * tcd_cp->th); /*--------------TIER2------------------*/ @@ -1508,9 +1508,9 @@ int tcd_decode_tile(unsigned char *src, int len, int tileno) for (compno = 0; compno < tile->numcomps; compno++) { tcd_tilecomp_t *tilec = &tile->comps[compno]; - if (tcd_cp->reduce_on == 1) { + if (tcd_cp->reduce != 0) { tcd_img->comps[compno].resno_decoded = - tile->comps[compno].numresolutions - tcd_cp->reduce_value - 1; + tile->comps[compno].numresolutions - tcd_cp->reduce - 1; } @@ -1611,7 +1611,7 @@ int tcd_decode_tile(unsigned char *src, int len, int tileno) } time = clock() - time; - fprintf(stdout, "total: %ld.%.3ld s\n", time / CLOCKS_PER_SEC, + fprintf(stdout, "%ld.%.3ld s\n", time / CLOCKS_PER_SEC, (time % CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC); diff --git a/mj2/frames_to_mj2.c b/mj2/frames_to_mj2.c index fbc42fa3..27fad274 100644 --- a/mj2/frames_to_mj2.c +++ b/mj2/frames_to_mj2.c @@ -304,7 +304,6 @@ int main(int argc, char **argv) int h; /* Height of YUV file */ int CbCr_subsampling_dx; /* Sample rate of YUV 4:4:4 4:2:2 or 4:2:0 */ int CbCr_subsampling_dy; /* Sample rate of YUV 4:4:4 4:2:2 or 4:2:0 */ - int output_image_type = -1; int frame_rate; /* Video Frame Rate */ int numcomps; /* In YUV files, numcomps always considered as 3 */ int prec; /* In YUV files, precision always considered as 8 */ @@ -373,7 +372,7 @@ int main(int argc, char **argv) if ((S1 == 'y' && S2 == 'u' && S3 == 'v') || (S1 == 'Y' && S2 == 'U' && S3 == 'V')) { - cp.image_type = 3; + cp.decod_format = YUV_DFMT; break; } fprintf(stderr, @@ -398,7 +397,7 @@ int main(int argc, char **argv) if ((S1 == 'm' && S2 == 'j' && S3 == '2') || (S1 == 'M' && S2 == 'J' && S3 == '2')) - cp.JPEG2000_format = 2; + cp.cod_format = MJ2_CFMT; else { fprintf(stderr, "Unknown output format image *.%c%c%c [only *.mj2]!! \n",