diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2021-05-04 19:21:45 +0200 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2021-05-04 19:21:45 +0200 |
| commit | 85a87cd505f37027c4b74363b529a1e166e32651 (patch) | |
| tree | 841da2c29908b1f1679872786646e177d20abd9e /src/bin | |
| parent | 05263eeee9bc666184a39cd2a83a7214cc83ec27 (diff) | |
Remove obsolete components JPWL, JP3D and MJ2
Diffstat (limited to 'src/bin')
37 files changed, 0 insertions, 18313 deletions
diff --git a/src/bin/CMakeLists.txt b/src/bin/CMakeLists.txt index edf85feb..292fe5a7 100644 --- a/src/bin/CMakeLists.txt +++ b/src/bin/CMakeLists.txt @@ -4,18 +4,9 @@ add_subdirectory(common) add_subdirectory(jp2) # optionals components: -if(BUILD_JPWL) - add_subdirectory(jpwl) -endif() -if(BUILD_MJ2) - add_subdirectory(mj2) -endif() if(BUILD_JPIP) add_subdirectory(jpip) endif() -if(BUILD_JP3D) - add_subdirectory(jp3d) -endif() # wx apps: add_subdirectory(wx) diff --git a/src/bin/jp3d/CMakeLists.txt b/src/bin/jp3d/CMakeLists.txt deleted file mode 100644 index 3cac1a8f..00000000 --- a/src/bin/jp3d/CMakeLists.txt +++ /dev/null @@ -1,41 +0,0 @@ -# Build the demo app, small examples - -# First thing define the common source: -set(common_SRCS - convert.c - ${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_getopt.c - ) - -# Headers file are located here: -include_directories( - ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h - ${OPENJPEG_SOURCE_DIR}/src/lib/openjp3d - ${LCMS_INCLUDE_DIRNAME} - ${OPENJPEG_SOURCE_DIR}/src/bin/common - ${Z_INCLUDE_DIRNAME} - ${PNG_INCLUDE_DIRNAME} - ${TIFF_INCLUDE_DIRNAME} - ) - -if(WIN32) - if(BUILD_SHARED_LIBS) - add_definitions(-DOPJ_EXPORTS) - else() - add_definitions(-DOPJ_STATIC) - endif() -endif() - -# Loop over all executables: -foreach(exe opj_jp3d_compress opj_jp3d_decompress) - add_executable(${exe} ${exe}.c ${common_SRCS}) - target_link_libraries(${exe} openjp3d) - # On unix you need to link to the math library: - if(UNIX) - target_link_libraries(${exe} m) - endif(UNIX) - # Install exe - install(TARGETS ${exe} - EXPORT OpenJP3DTargets - DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications - ) -endforeach() diff --git a/src/bin/jp3d/convert.c b/src/bin/jp3d/convert.c deleted file mode 100644 index 4e4bea9c..00000000 --- a/src/bin/jp3d/convert.c +++ /dev/null @@ -1,1051 +0,0 @@ -/* - * 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) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain - * 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 <stdlib.h> -#include <string.h> -#include "openjp3d.h" -#ifdef _WIN32 -#include "windirent.h" -#else -#include <dirent.h> -#endif /* _WIN32 */ - - - -void dump_volume(FILE *fd, opj_volume_t * vol) -{ - int compno; - fprintf(fd, "volume {\n"); - fprintf(fd, " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d\n", vol->x0, vol->y0, - vol->z0, vol->x1, vol->y1, vol->z1); - fprintf(fd, " numcomps=%d\n", vol->numcomps); - for (compno = 0; compno < vol->numcomps; compno++) { - opj_volume_comp_t *comp = &vol->comps[compno]; - fprintf(fd, " comp %d {\n", compno); - fprintf(fd, " dx=%d, dy=%d, dz=%d\n", comp->dx, comp->dy, comp->dz); - fprintf(fd, " prec=%d\n", comp->prec); - fprintf(fd, " sgnd=%d\n", comp->sgnd); - fprintf(fd, " }\n"); - } - fprintf(fd, "}\n"); -} - -/* - * Get logarithm of an integer and round downwards. - * - * log2(a) - */ -static int int_floorlog2(int a) -{ - int l; - for (l = 0; a > 1; l++) { - a >>= 1; - } - return l; -} - -/* - * Divide an integer by a power of 2 and round upwards. - * - * a divided by 2^b - */ -static int int_ceildivpow2(int a, int b) -{ - return (a + (1 << b) - 1) >> b; -} - -/* - * Divide an integer and round upwards. - * - * a divided by b - */ -static int int_ceildiv(int a, int b) -{ - return (a + b - 1) / b; -} - - -/* -->> -->> -->> -->> - -PGX IMAGE FORMAT - -<<-- <<-- <<-- <<-- */ - - -unsigned char readuchar(FILE * f) -{ - unsigned char c1; - fread(&c1, 1, 1, f); - return c1; -} - -unsigned short readushort(FILE * f, int bigendian) -{ - unsigned char c1, c2; - fread(&c1, 1, 1, f); - fread(&c2, 1, 1, f); - if (bigendian) { - return (c1 << 8) + c2; - } else { - return (c2 << 8) + c1; - } -} - -unsigned int readuint(FILE * f, int bigendian) -{ - unsigned char c1, c2, c3, c4; - fread(&c1, 1, 1, f); - fread(&c2, 1, 1, f); - fread(&c3, 1, 1, f); - fread(&c4, 1, 1, f); - if (bigendian) { - return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4; - } else { - return (c4 << 24) + (c3 << 16) + (c2 << 8) + c1; - } -} -/*****************************************/ -static unsigned short ShortSwap(unsigned short v) -{ - unsigned char c1, c2; - c1 = v & 0xff; - c2 = (v >> 8) & 0xff; - return (c1 << 8) + c2; -} - -static unsigned int LongSwap(unsigned int i) -{ - unsigned char b1, b2, b3, b4; - b1 = i & 255; - b2 = (i >> 8) & 255; - b3 = (i >> 16) & 255; - b4 = (i >> 24) & 255; - return ((int)b1 << 24) + ((int)b2 << 16) + ((int)b3 << 8) + b4; -} -/*****************************************/ - -opj_volume_t* pgxtovolume(char *relpath, opj_cparameters_t *parameters) -{ - - FILE *f = NULL; - int w, h, prec; - unsigned long offset; - int i, s, numcomps, maxvalue, sliceno, slicepos, maxslice = 0; - - OPJ_COLOR_SPACE color_space; - opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ - opj_volume_t * volume = NULL; - - char endian1, endian2, sign; - char signtmp[32]; - char temp[32]; - opj_volume_comp_t *comp = NULL; - - DIR *dirp; - struct dirent *direntp; - - char *tmp = NULL, *tmp2 = NULL, - *point = NULL, *pgx = NULL; - char tmpdirpath[MAX_PATH]; - char dirpath[MAX_PATH]; - char pattern[MAX_PATH]; - char pgxfiles[MAX_SLICES][MAX_PATH]; - int pgxslicepos[MAX_SLICES]; - char tmpno[3]; - - numcomps = 1; - color_space = CLRSPC_GRAY; - sliceno = 0; - maxvalue = 0; - memset(pgxfiles, 0, MAX_SLICES * MAX_PATH * sizeof(char)); - memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); - - /* Separación del caso de un único slice frente al de muchos */ - if ((tmp = strrchr(relpath, '-')) == NULL) { - /*fprintf(stdout,"[INFO] A volume of only one slice....\n");*/ - sliceno = 1; - maxslice = 1; - strcpy(pgxfiles[0], relpath); - - } else { - /*Fetch only the path */ - strcpy(tmpdirpath, relpath); - if ((tmp = strrchr(tmpdirpath, '/')) != NULL) { - tmp++; - *tmp = '\0'; - strcpy(dirpath, tmpdirpath); - } else { - strcpy(dirpath, "./"); - } - - /*Fetch the pattern of the volume slices*/ - if ((tmp = strrchr(relpath, '/')) != NULL) { - tmp++; - } else { - tmp = relpath; - } - if ((tmp2 = strrchr(tmp, '-')) != NULL) { - *tmp2 = '\0'; - } else { - fprintf(stdout, "[ERROR] tmp2 ha dado null. no ha encontrado el * %s %s", tmp, - relpath); - return NULL; - } - strcpy(pattern, tmp); - - dirp = opendir(dirpath); - if (dirp == NULL) { - fprintf(stdout, - "[ERROR] Infile must be a .pgx file or a directory that contain pgx files"); - return NULL; - } - - /*Read all .pgx files of directory */ - while ((direntp = readdir(dirp)) != NULL) { - /* Found a directory, but ignore . and .. */ - if (strcmp(".", direntp->d_name) == 0 || strcmp("..", direntp->d_name) == 0) { - continue; - } - - if (((pgx = strstr(direntp->d_name, pattern)) != NULL) && - ((tmp2 = strstr(direntp->d_name, ".pgx")) != NULL)) { - - strcpy(tmp, dirpath); - tmp = strcat(tmp, direntp->d_name); - - /*Obtenemos el index de la secuencia de slices*/ - if ((tmp2 = strpbrk(direntp->d_name, "0123456789")) == NULL) { - continue; - } - i = 0; - while (tmp2 != NULL) { - tmpno[i++] = *tmp2; - point = tmp2; - tmp2 = strpbrk(tmp2 + 1, "0123456789"); - } - tmpno[i] = '\0'; - - /*Comprobamos que no estamos leyendo algo raro como pattern.jp3d*/ - if ((point = strpbrk(point, ".")) == NULL) { - break; - } - /*Slicepos --> index de slice; Sliceno --> no de slices hasta el momento*/ - slicepos = atoi(tmpno); - pgxslicepos[sliceno] = slicepos - 1; - sliceno++; - if (slicepos > maxslice) { - maxslice = slicepos; - } - - /*Colocamos el slices en su posicion correspondiente*/ - strcpy(pgxfiles[slicepos - 1], tmp); - } - } - - }/* else if pattern*.pgx */ - - if (!sliceno) { - fprintf(stdout, - "[ERROR] No slices with this pattern founded !! Please check input volume name\n"); - closedir(dirp); - return NULL; - } - /*if ( maxslice != sliceno) { - fprintf(stdout,"[ERROR] Slices are not sequentially numbered !! Please rename them accordingly\n"); - return NULL; - }*/ - - for (s = 0; s < sliceno; s++) { - int pos = maxslice == sliceno ? s : pgxslicepos[s]; - f = fopen(pgxfiles[pos], "rb"); - if (!f) { - fprintf(stdout, "[ERROR] Failed to open %s for reading !\n", pgxfiles[s]); - return NULL; - } - fprintf(stdout, "[INFO] Loading %s \n", pgxfiles[pos]); - - fseek(f, 0, SEEK_SET); - fscanf(f, "PG%31[ \t]%c%c%31[ \t+-]%d%31[ \t]%d%31[ \t]%d", temp, &endian1, - &endian2, signtmp, &prec, temp, &w, temp, &h); - - i = 0; - sign = '+'; - while (signtmp[i] != '\0') { - if (signtmp[i] == '-') { - sign = '-'; - } - i++; - } - - fgetc(f); - if (endian1 == 'M' && endian2 == 'L') { - cmptparm.bigendian = 1; - } else if (endian2 == 'M' && endian1 == 'L') { - cmptparm.bigendian = 0; - } else { - fprintf(stdout, "[ERROR] Bad pgx header, please check input file\n"); - fclose(f); - closedir(dirp); - return NULL; - } - - if (s == 0) { - /* initialize volume component */ - - cmptparm.x0 = parameters->volume_offset_x0; - cmptparm.y0 = parameters->volume_offset_y0; - cmptparm.z0 = parameters->volume_offset_z0; - cmptparm.w = !cmptparm.x0 ? (w - 1) * parameters->subsampling_dx + 1 : - cmptparm.x0 + (w - 1) * parameters->subsampling_dx + 1; - cmptparm.h = !cmptparm.y0 ? (h - 1) * parameters->subsampling_dy + 1 : - cmptparm.y0 + (h - 1) * parameters->subsampling_dy + 1; - cmptparm.l = !cmptparm.z0 ? (sliceno - 1) * parameters->subsampling_dz + 1 : - cmptparm.z0 + (sliceno - 1) * parameters->subsampling_dz + 1; - - if (sign == '-') { - cmptparm.sgnd = 1; - } else { - cmptparm.sgnd = 0; - } - cmptparm.prec = prec; - cmptparm.bpp = prec; - cmptparm.dcoffset = parameters->dcoffset; - cmptparm.dx = parameters->subsampling_dx; - cmptparm.dy = parameters->subsampling_dy; - cmptparm.dz = parameters->subsampling_dz; - - /* create the volume */ - volume = opj_volume_create(numcomps, &cmptparm, color_space); - if (!volume) { - fclose(f); - return NULL; - } - /* set volume offset and reference grid */ - volume->x0 = cmptparm.x0; - volume->y0 = cmptparm.y0; - volume->z0 = cmptparm.z0; - volume->x1 = cmptparm.w; - volume->y1 = cmptparm.h; - volume->z1 = cmptparm.l; - - /* set volume data :only one component, that is a volume*/ - comp = &volume->comps[0]; - - }/*if sliceno==1*/ - - offset = w * h * s; - - for (i = 0; i < w * h; i++) { - int v; - if (comp->prec <= 8) { - if (!comp->sgnd) { - v = readuchar(f); - } else { - v = (char) readuchar(f); - } - } else if (comp->prec <= 16) { - if (!comp->sgnd) { - v = readushort(f, cmptparm.bigendian); - } else { - v = (short) readushort(f, cmptparm.bigendian); - } - } else { - if (!comp->sgnd) { - v = readuint(f, cmptparm.bigendian); - } else { - v = (int) readuint(f, cmptparm.bigendian); - } - } - if (v > maxvalue) { - maxvalue = v; - } - comp->data[i + offset] = v; - - } - fclose(f); - } /* for s --> sliceno*/ - comp->bpp = int_floorlog2(maxvalue) + 1; - closedir(dirp); - /*dump_volume(stdout, volume);*/ - return volume; -} - - -int volumetopgx(opj_volume_t * volume, char *outfile) -{ - int w, wr, wrr, h, hr, hrr, l, lr, lrr; - int i, j, compno, offset, sliceno; - FILE *fdest = NULL; - - for (compno = 0; compno < volume->numcomps; compno++) { - opj_volume_comp_t *comp = &volume->comps[compno]; - char name[256]; - int nbytes = 0; - char *tmp = outfile; - while (*tmp) { - tmp++; - } - while (*tmp != '.') { - tmp--; - } - *tmp = '\0'; - for (sliceno = 0; sliceno < volume->z1 - volume->z0; sliceno++) { - - if (volume->numcomps > 1) { - sprintf(name, "%s%d-%d.pgx", outfile, sliceno + 1, compno); - } else if ((volume->z1 - volume->z0) > 1) { - sprintf(name, "%s%d.pgx", outfile, sliceno + 1); - } else { - sprintf(name, "%s.pgx", outfile); - } - - fdest = fopen(name, "wb"); - if (!fdest) { - fprintf(stdout, "[ERROR] Failed to open %s for writing \n", name); - return 1; - } - - fprintf(stdout, "[INFO] Writing in %s (%s)\n", name, - volume->comps[0].bigendian ? "Bigendian" : "Little-endian"); - - w = int_ceildiv(volume->x1 - volume->x0, volume->comps[compno].dx); - wr = volume->comps[compno].w; - wrr = int_ceildivpow2(volume->comps[compno].w, volume->comps[compno].factor[0]); - - h = int_ceildiv(volume->y1 - volume->y0, volume->comps[compno].dy); - hr = volume->comps[compno].h; - hrr = int_ceildivpow2(volume->comps[compno].h, volume->comps[compno].factor[1]); - - l = int_ceildiv(volume->z1 - volume->z0, volume->comps[compno].dz); - lr = volume->comps[compno].l; - lrr = int_ceildivpow2(volume->comps[compno].l, volume->comps[compno].factor[2]); - - fprintf(fdest, "PG %c%c %c%d %d %d\n", comp->bigendian ? 'M' : 'L', - comp->bigendian ? 'L' : 'M', comp->sgnd ? '-' : '+', comp->prec, wr, hr); - if (comp->prec <= 8) { - nbytes = 1; - } else if (comp->prec <= 16) { - nbytes = 2; - } else { - nbytes = 4; - } - - offset = (sliceno / lrr * l) + (sliceno % lrr); - offset = wrr * hrr * offset; - /*fprintf(stdout,"%d %d %d %d\n",offset,wrr*hrr,wrr,w);*/ - for (i = 0; i < wrr * hrr; i++) { - int v = volume->comps[0].data[(i / wrr * w) + (i % wrr) + offset]; - if (volume->comps[0].bigendian) { - for (j = nbytes - 1; j >= 0; j--) { - char byte = (char)((v >> (j * 8)) & 0xff); - fwrite(&byte, 1, 1, fdest); - } - } else { - for (j = 0; j <= nbytes - 1; j++) { - char byte = (char)((v >> (j * 8)) & 0xff); - fwrite(&byte, 1, 1, fdest); - } - } - } - - fclose(fdest); - }/*for sliceno*/ - }/*for compno*/ - - return 0; -} - -/* -->> -->> -->> -->> - -BIN IMAGE FORMAT - -<<-- <<-- <<-- <<-- */ - -opj_volume_t* bintovolume(char *filename, char *fileimg, - opj_cparameters_t *parameters) -{ - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - int subsampling_dz = parameters->subsampling_dz; - - int i, compno, w, h, l, numcomps = 1; - int prec, max = 0; - - /* char temp[32];*/ - char line[100]; - int bigendian; - - FILE *f = NULL; - FILE *fimg = NULL; - OPJ_COLOR_SPACE color_space; - opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ - opj_volume_t * volume = NULL; - opj_volume_comp_t *comp = NULL; - - bigendian = 0; - color_space = CLRSPC_GRAY; - - fimg = fopen(fileimg, "r"); - if (!fimg) { - fprintf(stdout, "[ERROR] Failed to open %s for reading !!\n", fileimg); - return 0; - } - - fseek(fimg, 0, SEEK_SET); - while (!feof(fimg)) { - fgets(line, 100, fimg); - /*fprintf(stdout,"%s %d \n",line,feof(fimg));*/ - if (strncmp(line, "Bpp", 3) == 0) { - sscanf(line, "%*s%*[ \t]%d", &prec); - } else if (strncmp(line, "Color", 5) == 0) { - sscanf(line, "%*s%*[ \t]%d", &color_space); - } else if (strncmp(line, "Dim", 3) == 0) { - sscanf(line, "%*s%*[ \t]%d%*[ \t]%d%*[ \t]%d", &w, &h, &l); - } - } - /*fscanf(fimg, "Bpp%[ \t]%d%[ \t\n]",temp,&prec,temp);*/ - /*fscanf(fimg, "Color Map%[ \t]%d%[ \n\t]Dimensions%[ \t]%d%[ \t]%d%[ \t]%d%[ \n\t]",temp,&color_space,temp,temp,&w,temp,&h,temp,&l,temp);*/ - /*fscanf(fimg, "Resolution(mm)%[ \t]%d%[ \t]%d%[ \t]%d%[ \n\t]",temp,&subsampling_dx,temp,&subsampling_dy,temp,&subsampling_dz,temp);*/ - -#ifdef VERBOSE - fprintf(stdout, "[INFO] %d \t %d %d %d \t %3.2f %2.2f %2.2f \t %d \n", - color_space, w, h, l, subsampling_dx, subsampling_dy, subsampling_dz, prec); -#endif - fclose(fimg); - - /* initialize volume components */ - memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); - - cmptparm.prec = prec; - cmptparm.bpp = prec; - cmptparm.sgnd = 0; - cmptparm.bigendian = bigendian; - cmptparm.dcoffset = parameters->dcoffset; - cmptparm.dx = subsampling_dx; - cmptparm.dy = subsampling_dy; - cmptparm.dz = subsampling_dz; - cmptparm.w = w; - cmptparm.h = h; - cmptparm.l = l; - - /* create the volume */ - volume = opj_volume_create(numcomps, &cmptparm, color_space); - if (!volume) { - fprintf(stdout, "[ERROR] Unable to create volume"); - fclose(f); - return NULL; - } - - /* set volume offset and reference grid */ - volume->x0 = parameters->volume_offset_x0; - volume->y0 = parameters->volume_offset_y0; - volume->z0 = parameters->volume_offset_z0; - volume->x1 = parameters->volume_offset_x0 + (w - 1) * subsampling_dx + 1; - volume->y1 = parameters->volume_offset_y0 + (h - 1) * subsampling_dy + 1; - volume->z1 = parameters->volume_offset_z0 + (l - 1) * subsampling_dz + 1; - - /* set volume data */ - f = fopen(filename, "rb"); - if (!f) { - fprintf(stdout, "[ERROR] Failed to open %s for reading !!\n", filename); - opj_free(volume); - return 0; - } - - /* BINARY */ - for (compno = 0; compno < volume->numcomps; compno++) { - int whl = w * h * l; - /* set volume data */ - comp = &volume->comps[compno]; - - /*if (comp->prec <= 8) { - if (!comp->sgnd) { - unsigned char *data = (unsigned char *) malloc(whl * sizeof(unsigned char)); - fread(data, 1, whl, f); - for (i = 0; i < whl; i++) { - comp->data[i] = data[i]; - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } else { - char *data = (char *) malloc(whl); - fread(data, 1, whl, f); - for (i = 0; i < whl; i++) { - comp->data[i] = data[i]; - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } - } else if (comp->prec <= 16) { - if (!comp->sgnd) { - unsigned short *data = (unsigned short *) malloc(whl * sizeof(unsigned short)); - int leido = fread(data, 2, whl, f); - if (!leido) { - free(data); fclose(f); - return NULL; - } - - for (i = 0; i < whl; i++) { - if (bigendian) //(c1 << 8) + c2; - comp->data[i] = data[i]; - else{ //(c2 << 8) + c1; - comp->data[i] = ShortSwap(data[i]); - } - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } else { - short *data = (short *) malloc(whl); - int leido = fread(data, 2, whl, f); - if (!leido) { - free(data); fclose(f); - return NULL; - } - for (i = 0; i < whl; i++) { - if (bigendian){ //(c1 << 8) + c2; - comp->data[i] = data[i]; - }else{ //(c2 << 8) + c1; - comp->data[i] = (short) ShortSwap((unsigned short) data[i]); - } - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } - } else { - if (!comp->sgnd) { - unsigned int *data = (unsigned int *) malloc(whl * sizeof(unsigned int)); - int leido = fread(data, 4, whl, f); - if (!leido) { - free(data); fclose(f); - return NULL; - } for (i = 0; i < whl; i++) { - if (!bigendian) - comp->data[i] = LongSwap(data[i]); - else - comp->data[i] = data[i]; - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } else { - int leido = fread(comp->data, 4, whl, f); - if (!leido) { - fclose(f); - return NULL; - } - for (i = 0; i < whl; i++) { - if (!bigendian) - comp->data[i] = (int) LongSwap((unsigned int) comp->data[i]); - if (comp->data[i] > max) - max = comp->data[i]; - } - } - }*/ - - for (i = 0; i < whl; i++) { - int v; - if (comp->prec <= 8) { - if (!comp->sgnd) { - v = readuchar(f); - } else { - v = (char) readuchar(f); - } - } else if (comp->prec <= 16) { - if (!comp->sgnd) { - v = readushort(f, bigendian); - } else { - v = (short) readushort(f, bigendian); - } - } else { - if (!comp->sgnd) { - v = readuint(f, bigendian); - } else { - v = (int) readuint(f, bigendian); - } - } - if (v > max) { - max = v; - } - comp->data[i] = v; - } - comp->bpp = int_floorlog2(max) + 1; - } - fclose(f); - return volume; -} - -int volumetobin(opj_volume_t * volume, char *outfile) -{ - int w, wr, wrr, h, hr, hrr, l, lr, lrr, max; - int i, j, compno, nbytes; - int offset, sliceno; - FILE *fdest = NULL; - FILE *fimgdest = NULL; - /* char *imgtemp;*/ - char name[256]; - - for (compno = 0; compno < 1; compno++) { /*Only one component*/ - - fdest = fopen(outfile, "wb"); - if (!fdest) { - fprintf(stdout, "[ERROR] Failed to open %s for writing\n", outfile); - return 1; - } - fprintf(stdout, "[INFO] Writing outfile %s (%s) \n", outfile, - volume->comps[0].bigendian ? "Bigendian" : "Little-endian"); - - w = int_ceildiv(volume->x1 - volume->x0, volume->comps[compno].dx); - wr = volume->comps[compno].w; - wrr = int_ceildivpow2(volume->comps[compno].w, volume->comps[compno].factor[0]); - - h = int_ceildiv(volume->y1 - volume->y0, volume->comps[compno].dy); - hr = volume->comps[compno].h; - hrr = int_ceildivpow2(volume->comps[compno].h, volume->comps[compno].factor[1]); - - l = int_ceildiv(volume->z1 - volume->z0, volume->comps[compno].dz); - lr = volume->comps[compno].l; - lrr = int_ceildivpow2(volume->comps[compno].l, volume->comps[compno].factor[2]); - - max = (volume->comps[compno].prec <= 8) ? 255 : (1 << - volume->comps[compno].prec) - 1; - - volume->comps[compno].x0 = int_ceildivpow2(volume->comps[compno].x0 - - int_ceildiv(volume->x0, volume->comps[compno].dx), - volume->comps[compno].factor[0]); - volume->comps[compno].y0 = int_ceildivpow2(volume->comps[compno].y0 - - int_ceildiv(volume->y0, volume->comps[compno].dy), - volume->comps[compno].factor[1]); - volume->comps[compno].z0 = int_ceildivpow2(volume->comps[compno].z0 - - int_ceildiv(volume->z0, volume->comps[compno].dz), - volume->comps[compno].factor[2]); - - if (volume->comps[0].prec <= 8) { - nbytes = 1; - } else if (volume->comps[0].prec <= 16) { - nbytes = 2; - } else { - nbytes = 4; - } - - /*fprintf(stdout,"w %d wr %d wrr %d h %d hr %d hrr %d l %d lr %d lrr %d max %d nbytes %d\n Factor %d %d %d",w,wr,wrr,h,hr,hrr,l,lr,lrr,max,nbytes,volume->comps[compno].factor[0],volume->comps[compno].factor[1],volume->comps[compno].factor[2]);*/ - - for (sliceno = 0; sliceno < lrr; sliceno++) { - offset = (sliceno / lrr * l) + (sliceno % lrr); - offset = wrr * hrr * offset; - for (i = 0; i < wrr * hrr; i++) { - int v = volume->comps[0].data[(i / wrr * w) + (i % wrr) + offset]; - if (volume->comps[0].bigendian) { - for (j = nbytes - 1; j >= 0; j--) { - char byte = (char)((v >> (j * 8)) & 0xff); - fwrite(&byte, 1, 1, fdest); - } - } else { - for (j = 0; j <= nbytes - 1; j++) { - char byte = (char)((v >> (j * 8)) & 0xff); - fwrite(&byte, 1, 1, fdest); - } - } - } - } - - } - - fclose(fdest); - - snprintf(name, sizeof(name), "%s.img", outfile); - fimgdest = fopen(name, "w"); - if (!fimgdest) { - fprintf(stdout, "[ERROR] Failed to open %s for writing\n", name); - return 1; - } - fprintf(fimgdest, - "Bpp\t%d\nColor Map\t2\nDimensions\t%d\t%d\t%d\nResolution(mm)\t%d\t%d\t%d\t\n", - volume->comps[0].prec, wrr, hrr, lrr, volume->comps[0].dx, volume->comps[0].dy, - volume->comps[0].dz); - - fclose(fimgdest); - return 0; -} -/* -->> -->> -->> -->> - -IMG IMAGE FORMAT - -<<-- <<-- <<-- <<-- */ -opj_volume_t* imgtovolume(char *fileimg, opj_cparameters_t *parameters) -{ - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - int subsampling_dz = parameters->subsampling_dz; - - int i, compno, w, h, l, numcomps = 1; - int prec, max = 0, min = 0; - float dx, dy, dz; - char filename[100], tmpdirpath[100], dirpath[100], *tmp; - char line[100], datatype[100]; - int bigendian; - - FILE *f = NULL; - FILE *fimg = NULL; - OPJ_COLOR_SPACE color_space; - opj_volume_cmptparm_t cmptparm; /* maximum of 1 component */ - opj_volume_t * volume = NULL; - opj_volume_comp_t *comp = NULL; - - bigendian = 0; - color_space = CLRSPC_GRAY; - - fimg = fopen(fileimg, "r"); - if (!fimg) { - fprintf(stderr, "[ERROR] Failed to open %s for reading !!\n", fileimg); - return 0; - } - - /*Fetch only the path */ - strcpy(tmpdirpath, fileimg); - if ((tmp = strrchr(tmpdirpath, '/')) != NULL) { - tmp++; - *tmp = '\0'; - strcpy(dirpath, tmpdirpath); - } else { - strcpy(dirpath, "./"); - } - - fseek(fimg, 0, SEEK_SET); - while (!feof(fimg)) { - fgets(line, 100, fimg); - /*fprintf(stdout,"%s %d \n",line,feof(fimg));*/ - if (strncmp(line, "Image", 5) == 0) { - sscanf(line, "%*s%*[ \t]%s", datatype); - } else if (strncmp(line, "File", 4) == 0) { - sscanf(line, "%*s %*s%*[ \t]%s", filename); - strcat(dirpath, filename); - strcpy(filename, dirpath); - } else if (strncmp(line, "Min", 3) == 0) { - sscanf(line, "%*s %*s%*[ \t]%d%*[ \t]%d", &min, &max); - prec = int_floorlog2(max - min + 1); - } else if (strncmp(line, "Bpp", 3) == 0) { - sscanf(line, "%*s%*[ \t]%d", &prec); - } else if (strncmp(line, "Color", 5) == 0) { - sscanf(line, "%*s %*s%*[ \t]%d", &color_space); - } else if (strncmp(line, "Dim", 3) == 0) { - sscanf(line, "%*s%*[ \t]%d%*[ \t]%d%*[ \t]%d", &w, &h, &l); - } else if (strncmp(line, "Res", 3) == 0) { - sscanf(line, "%*s%*[ \t]%f%*[ \t]%f%*[ \t]%f", &dx, &dy, &dz); - } - - } -#ifdef VERBOSE - fprintf(stdout, "[INFO] %s %d \t %d %d %d \t %f %f %f \t %d %d %d \n", filename, - color_space, w, h, l, dx, dy, dz, max, min, prec); -#endif - fclose(fimg); - - /* error control */ - if (!prec || !w || !h || !l) { - fprintf(stderr, - "[ERROR] Unable to read IMG file correctly. Found some null values."); - return NULL; - } - - /* initialize volume components */ - memset(&cmptparm, 0, sizeof(opj_volume_cmptparm_t)); - - cmptparm.prec = prec; - cmptparm.bpp = prec; - cmptparm.sgnd = 0; - cmptparm.bigendian = bigendian; - cmptparm.dcoffset = parameters->dcoffset; - cmptparm.dx = subsampling_dx; - cmptparm.dy = subsampling_dy; - cmptparm.dz = subsampling_dz; - cmptparm.w = w; - cmptparm.h = h; - cmptparm.l = l; - - /* create the volume */ - volume = opj_volume_create(numcomps, &cmptparm, color_space); - if (!volume) { - fprintf(stdout, "[ERROR] Unable to create volume"); - return NULL; - } - - /* set volume offset and reference grid */ - volume->x0 = parameters->volume_offset_x0; - volume->y0 = parameters->volume_offset_y0; - volume->z0 = parameters->volume_offset_z0; - volume->x1 = parameters->volume_offset_x0 + (w - 1) * subsampling_dx + 1; - volume->y1 = parameters->volume_offset_y0 + (h - 1) * subsampling_dy + 1; - volume->z1 = parameters->volume_offset_z0 + (l - 1) * subsampling_dz + 1; - - max = 0; - /* set volume data */ - f = fopen(filename, "rb"); - if (!f) { - fprintf(stderr, "[ERROR] Failed to open %s for reading !!\n", filename); - opj_free(volume); - return 0; - } - - /* BINARY */ - for (compno = 0; compno < volume->numcomps; compno++) { - int whl = w * h * l; - /* set volume data */ - comp = &volume->comps[compno]; - - /*if (comp->prec <= 8) { - if (!comp->sgnd) { - unsigned char *data = (unsigned char *) malloc(whl * sizeof(unsigned char)); - fread(data, 1, whl, f); - for (i = 0; i < whl; i++) { - comp->data[i] = data[i]; - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } else { - char *data = (char *) malloc(whl); - fread(data, 1, whl, f); - for (i = 0; i < whl; i++) { - comp->data[i] = data[i]; - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } - } else if (comp->prec <= 16) { - if (!comp->sgnd) { - unsigned short *data = (unsigned short *) malloc(whl * sizeof(unsigned short)); - int leido = fread(data, 2, whl, f); - if (!leido) { - free(data); fclose(f); - return NULL; - } - - for (i = 0; i < whl; i++) { - if (bigendian) //(c1 << 8) + c2; - comp->data[i] = data[i]; - else{ //(c2 << 8) + c1; - comp->data[i] = ShortSwap(data[i]); - } - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } else { - short *data = (short *) malloc(whl); - int leido = fread(data, 2, whl, f); - if (!leido) { - free(data); fclose(f); - return NULL; - } - for (i = 0; i < whl; i++) { - if (bigendian){ //(c1 << 8) + c2; - comp->data[i] = data[i]; - }else{ //(c2 << 8) + c1; - comp->data[i] = (short) ShortSwap((unsigned short) data[i]); - } - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } - } else { - if (!comp->sgnd) { - unsigned int *data = (unsigned int *) malloc(whl * sizeof(unsigned int)); - int leido = fread(data, 4, whl, f); - if (!leido) { - free(data); fclose(f); - return NULL; - } for (i = 0; i < whl; i++) { - if (!bigendian) - comp->data[i] = LongSwap(data[i]); - else - comp->data[i] = data[i]; - if (comp->data[i] > max) - max = comp->data[i]; - } - free(data); - } else { - int leido = fread(comp->data, 4, whl, f); - if (!leido) { - fclose(f); - return NULL; - } - for (i = 0; i < whl; i++) { - if (!bigendian) - comp->data[i] = (int) LongSwap((unsigned int) comp->data[i]); - if (comp->data[i] > max) - max = comp->data[i]; - } - } - }*/ - - for (i = 0; i < whl; i++) { - int v; - if (comp->prec <= 8) { - if (!comp->sgnd) { - v = readuchar(f); - } else { - v = (char) readuchar(f); - } - } else if (comp->prec <= 16) { - if (!comp->sgnd) { - v = readushort(f, bigendian); - } else { - v = (short) readushort(f, bigendian); - } - } else { - if (!comp->sgnd) { - v = readuint(f, bigendian); - } else { - v = (int) readuint(f, bigendian); - } - } - if (v > max) { - max = v; - } - comp->data[i] = v; - } - comp->bpp = int_floorlog2(max) + 1; - } - fclose(f); - return volume; -} - diff --git a/src/bin/jp3d/convert.h b/src/bin/jp3d/convert.h deleted file mode 100644 index 255717e1..00000000 --- a/src/bin/jp3d/convert.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain - * 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. - */ -#ifndef __JP3D_CONVERT_H -#define __JP3D_CONVERT_H - -/** -Load a single volume component encoded in PGX file format -@param filename Name of the PGX file to load -@param parameters *List ?* -@return Returns a greyscale volume if successful, returns NULL otherwise -*/ -opj_volume_t* pgxtovolume(char *filename, opj_cparameters_t *parameters); - -int volumetopgx(opj_volume_t *volume, char *outfile); - -opj_volume_t* bintovolume(char *filename, char *fileimg, - opj_cparameters_t *parameters); - -int volumetobin(opj_volume_t *volume, char *outfile); - -opj_volume_t* imgtovolume(char *fileimg, opj_cparameters_t *parameters); - -#endif /* __J2K_CONVERT_H */ - diff --git a/src/bin/jp3d/getopt.c b/src/bin/jp3d/getopt.c deleted file mode 100644 index 855b9ae5..00000000 --- a/src/bin/jp3d/getopt.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 1987, 1993, 1994 - * The Regents of the University of California. 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. - */ - -/* last review : october 29th, 2002 */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; -#endif /* LIBC_SCCS and not lint */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -int opterr = 1, /* if error message should be printed */ - optind = 1, /* index into parent argv vector */ - optopt, /* character checked for validity */ - optreset; /* reset getopt */ -char *optarg; /* argument associated with option */ - -#define BADCH (int)'?' -#define BADARG (int)':' -#define EMSG "" - -/* - * getopt -- - * Parse argc/argv argument vector. - */ -int getopt(int nargc, char *const *nargv, const char *ostr) -{ - -# define __progname nargv[0] /* program name */ - - static char *place = EMSG; /* option letter processing */ - char *oli; /* option letter list index */ - - if (optreset || !*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= nargc || *(place = nargv[optind]) != '-') { - place = EMSG; - return (-1); - } - if (place[1] && *++place == '-') { /* found "--" */ - ++optind; - place = EMSG; - return (-1); - } - } /* option letter okay? */ - - if ((optopt = (int) * place++) == (int) ':' || !(oli = strchr(ostr, optopt))) { - /* if the user didn't specify '-' as an option, assume it means -1. */ - if (optopt == (int) '-') { - return (-1); - } - if (!*place) { - ++optind; - } - if (opterr && *ostr != ':') { - (void) fprintf(stdout, "[ERROR] %s: illegal option -- %c\n", __progname, - optopt); - } - return (BADCH); - } - - if (*++oli != ':') { /* don't need argument */ - optarg = NULL; - if (!*place) { - ++optind; - } - } else { /* need an argument */ - if (*place) { /* no white space */ - optarg = place; - } else if (nargc <= ++optind) { /* no arg */ - place = EMSG; - if (*ostr == ':') { - return (BADARG); - } - if (opterr) { - (void) fprintf(stdout, "[ERROR] %s: option requires an argument -- %c\n", - __progname, optopt); - } - return (BADCH); - } else { /* white space */ - optarg = nargv[optind]; - } - place = EMSG; - ++optind; - } - return (optopt); /* dump back option letter */ -} diff --git a/src/bin/jp3d/getopt.h b/src/bin/jp3d/getopt.h deleted file mode 100644 index 935171ba..00000000 --- a/src/bin/jp3d/getopt.h +++ /dev/null @@ -1,14 +0,0 @@ -/* last review : october 29th, 2002 */ - -#ifndef _GETOPT_H_ -#define _GETOPT_H_ - -extern int opterr; -extern int optind; -extern int optopt; -extern int optreset; -extern char *optarg; - -extern int getopt(int nargc, char *const *nargv, const char *ostr); - -#endif /* _GETOPT_H_ */ diff --git a/src/bin/jp3d/opj_jp3d_compress.c b/src/bin/jp3d/opj_jp3d_compress.c deleted file mode 100644 index 901a14f8..00000000 --- a/src/bin/jp3d/opj_jp3d_compress.c +++ /dev/null @@ -1,989 +0,0 @@ -/* - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain - * 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> -#include <stdlib.h> - -#include "opj_config.h" -#include "openjp3d.h" -#include "opj_getopt.h" -#include "convert.h" - -#ifdef _WIN32 -#include <windows.h> -#else -#define stricmp strcasecmp -#define strnicmp strncasecmp -#endif /* _WIN32 */ - -/* ----------------------------------------------------------------------- */ - -void encode_help_display() -{ - fprintf(stdout, "List of parameters for the JPEG2000 Part 10 encoder:\n"); - fprintf(stdout, "------------\n"); - fprintf(stdout, "\n"); - fprintf(stdout, "Required Parameters (except with -h):\n"); - fprintf(stdout, "\n"); - fprintf(stdout, - "-i : source file (-i source.bin or source*.pgx) \n"); - fprintf(stdout, "\n"); - fprintf(stdout, - "-m : source characteristics file (-m imgfile.img) \n"); - fprintf(stdout, "\n"); - fprintf(stdout, "-o : destination file (-o dest.jp3d) \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, "-n : number of resolutions (-n 3,3,3) \n"); - fprintf(stdout, "\n"); - fprintf(stdout, - "-I : use the irreversible transforms: ICT + DWT 9-7 (-I) \n"); - fprintf(stdout, "\n"); - fprintf(stdout, "-C : coding algorithm (-C 2EB) [2EB, 3EB] \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 compression factor.\n"); - fprintf(stdout, " - Rate 1 means lossless compression\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, "-b : size of code block (-b 32,32,32) \n"); - fprintf(stdout, "\n"); - fprintf(stdout, "-c : size of precinct (-c 128,128,128) \n"); - fprintf(stdout, "\n"); - fprintf(stdout, "-t : size of tile (-t 512,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,2) [-s X,Y,Z] \n"); - fprintf(stdout, " - Remark: subsampling bigger than 2 can produce error\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 : code-block style (-M 0) [1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL)\n"); - fprintf(stdout, " 8=VSC 16=PTERM 32=SEGSYM 64=3DCTXT] \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, "-D : define DC offset (-D 12) \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 volume (-d 150,300,100) \n"); - fprintf(stdout, "\n"); - fprintf(stdout, - "-l : offset of the origin of the tiles (-l 100,75,25) \n"); - fprintf(stdout, "\n"); - fprintf(stdout, "\n"); - fprintf(stdout, "DEFAULT CODING:\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 x 2^15 (means 1 precinct)\n"); - fprintf(stdout, " * Size of code-block : 64 x 64 x 64\n"); - fprintf(stdout, " * Number of resolutions in x, y and z axis: 3\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, y or z 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 volume\n"); - fprintf(stdout, " * No offset of the origin of the tiles\n"); - fprintf(stdout, " * Reversible DWT 5-3 on each 2D slice\n"); - fprintf(stdout, " * Coding algorithm: 2D-EBCOT \n"); - 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 markers will never appear in the tile_header.\n"); - fprintf(stdout, "\n"); - fprintf(stdout, - "- You need enough disk space memory (twice the original) to encode \n"); - fprintf(stdout, - "the volume,i.e. for a 1.5 GB volume you need a minimum of 3GB of disk memory)\n"); - fprintf(stdout, "\n"); - fprintf(stdout, - "- When loading *.pgx files, a relative path to directory is needed for input argument \n"); - fprintf(stdout, - " followed by the common prefix of the slices and a '*' character representing sequential numeration.\n"); - fprintf(stdout, "( -i relativepath/slices*.pgx )\n"); - fprintf(stdout, "\n"); - fprintf(stdout, " - The index file has the structure below:\n"); - fprintf(stdout, "\n"); - fprintf(stdout, "\t Image_height Image_width Image_depth\n"); - fprintf(stdout, "\t Progression order: 0 (LRCP)\n"); - fprintf(stdout, "\t Tiles_size_X Tiles_size_Y Tiles_size_Z\n"); - fprintf(stdout, "\t Components_nb\n"); - fprintf(stdout, "\t Layers_nb\n"); - fprintf(stdout, "\t Decomposition_levels\n"); - fprintf(stdout, - "\t [Precincts_size_X_res_Nr Precincts_size_Y_res_Nr Precincts_size_Z_res_Nr]\n\t ...\n"); - fprintf(stdout, - "\t [Precincts_size_X_res_0 Precincts_size_Y_res_0 Precincts_size_Z_res_0]\n"); - fprintf(stdout, "\t Main_header_end_position\n"); - fprintf(stdout, "\t Codestream_size\n"); - fprintf(stdout, - "\t Tile_0 [start_pos end_header end_pos TotalDisto NumPix MaxMSE]\n"); - fprintf(stdout, "\t ...\n"); - fprintf(stdout, - "\t Tile_Nt [ '' '' '' '' '' '' ]\n"); - fprintf(stdout, - "\t Tpacket_0 [Tile layer res. comp. prec. start_pos end_pos disto]\n"); - fprintf(stdout, "\t ...\n"); - fprintf(stdout, - "\t Tpacket_Np ['' '' '' '' '' '' '' '' ]\n"); - fprintf(stdout, "\t MaxDisto\n"); - fprintf(stdout, "\t TotalDisto\n\n"); - fprintf(stdout, "\n"); - -} - -OPJ_PROG_ORDER give_progression(char progression[4]) -{ - 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; -} - -OPJ_TRANSFORM give_transform(char transform[4]) -{ - if (strncmp(transform, "2DWT", 4) == 0) { - return TRF_2D_DWT; - } - if (strncmp(transform, "3DWT", 4) == 0) { - return TRF_3D_DWT; - } - return TRF_UNKNOWN; -} - -OPJ_ENTROPY_CODING give_coding(char coding[3]) -{ - - if (strncmp(coding, "2EB", 3) == 0) { - return ENCOD_2EB; - } - if (strncmp(coding, "3EB", 3) == 0) { - return ENCOD_3EB; - } - /*if(strncmp(coding, "2GR", 3) == 0) { - return ENCOD_2GR; - } - if(strncmp(coding, "3GR", 3) == 0) { - return ENCOD_3GR; - }*/ - - return ENCOD_UNKNOWN; -} - -int get_file_format(char *filename) -{ - int i; - static const char *extension[] = {"pgx", "bin", "img", "j3d", "jp3d", "j2k"}; - static const int format[] = { PGX_DFMT, BIN_DFMT, IMG_DFMT, J3D_CFMT, J3D_CFMT, J2K_CFMT}; - char * ext = strrchr(filename, '.'); - if (ext) { - ext++; - for (i = 0; i < sizeof(format) / sizeof(*format); i++) { - if (strnicmp(ext, extension[i], 3) == 0) { - return format[i]; - } - } - } - - return -1; -} - -/* ------------------------------------------------------------------------------------ */ - -int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters) -{ - int i, value; - - /* parse the command line */ - - while (1) { - int c = opj_getopt(argc, argv, - "i:m:o:r:q:f:t:n:c:b:x:p:s:d:hP:S:E:M:D:R:l:T:C:A:I"); - if (c == -1) { - break; - } - switch (c) { - case 'i': { /* input file */ - char *infile = opj_optarg; - parameters->decod_format = get_file_format(infile); - switch (parameters->decod_format) { - case PGX_DFMT: - case BIN_DFMT: - case IMG_DFMT: - break; - default: - fprintf(stdout, - "[ERROR] Unrecognized format for infile : %s [accept only *.pgx or *.bin] !!\n\n", - infile); - return 1; - break; - } - strncpy(parameters->infile, infile, MAX_PATH); - fprintf(stdout, "[INFO] Infile: %s \n", parameters->infile); - - } - break; - - /* ----------------------------------------------------- */ - case 'm': { /* input IMG file */ - char *imgfile = opj_optarg; - int imgformat = get_file_format(imgfile); - switch (imgformat) { - case IMG_DFMT: - break; - default: - fprintf(stdout, - "[ERROR] Unrecognized format for imgfile : %s [accept only *.img] !!\n\n", - imgfile); - return 1; - break; - } - strncpy(parameters->imgfile, imgfile, MAX_PATH); - fprintf(stdout, "[INFO] Imgfile: %s Format: %d\n", parameters->imgfile, - imgformat); - } - break; - - /* ----------------------------------------------------- */ - case 'o': { /* output file */ - char *outfile = opj_optarg; - parameters->cod_format = get_file_format(outfile); - switch (parameters->cod_format) { - case J3D_CFMT: - case J2K_CFMT: - case LSE_CFMT: - break; - default: - fprintf(stdout, - "[ERROR] Unknown output format volume %s [only *.j2k, *.lse3d or *.jp3d]!! \n", - outfile); - return 1; - break; - } - strncpy(parameters->outfile, outfile, MAX_PATH); - fprintf(stdout, "[INFO] Outfile: %s \n", parameters->outfile); - } - break; - - /* ----------------------------------------------------- */ - - case 'r': { /* define compression rates for each layer */ - char *s = opj_optarg; - while (sscanf(s, "%f", ¶meters->tcp_rates[parameters->tcp_numlayers]) == - 1) { - parameters->tcp_numlayers++; - while (*s && *s != ',') { - s++; - } - if (!*s) { - break; - } - s++; - } - parameters->cp_disto_alloc = 1; - } - break; - - /* ----------------------------------------------------- */ - - case 'q': { /* define distorsion (PSNR) for each layer */ - char *s = opj_optarg; - while (sscanf(s, "%f", ¶meters->tcp_distoratio[parameters->tcp_numlayers]) - == 1) { - parameters->tcp_numlayers++; - while (*s && *s != ',') { - s++; - } - if (!*s) { - break; - } - s++; - } - parameters->cp_fixed_quality = 1; - } - break; - - /* ----------------------------------------------------- */ - - case 'f': { - fprintf(stdout, "/---------------------------------------------------\\\n"); - fprintf(stdout, "| Fixed layer allocation option not implemented !! |\n"); - fprintf(stdout, "\\---------------------------------------------------/\n"); - /*int *row = NULL, *col = NULL; - int numlayers = 0, matrix_width = 0; - - char *s = opj_optarg; - sscanf(s, "%d", &numlayers); - s++; - if (numlayers > 9) - s++; - - parameters->tcp_numlayers = numlayers; - matrix_width = parameters->numresolution[0] + parameters->numresolution[1] + parameters->numresolution[2]; - parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int)); - s = s + 2; - - for (i = 0; i < numlayers; i++) { - row = ¶meters->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 < matrix_width; j++) { - col += 3; j+=2; - 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; - - /* ----------------------------------------------------- */ - - case 't': { /* tiles */ - if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->cp_tdx, ¶meters->cp_tdy, - ¶meters->cp_tdz) != 3) { - fprintf(stdout, - "[ERROR] '-t' 'dimensions of tiles' argument error ! [-t tdx,tdy,tdz]\n"); - return 1; - } - parameters->tile_size_on = true; - } - break; - - /* ----------------------------------------------------- */ - - case 'n': { /* resolution */ - int aux; - aux = sscanf(opj_optarg, "%d,%d,%d", ¶meters->numresolution[0], - ¶meters->numresolution[1], ¶meters->numresolution[2]); - if (aux == 2) { - parameters->numresolution[2] = 1; - } else if (aux == 1) { - parameters->numresolution[1] = parameters->numresolution[0]; - parameters->numresolution[2] = 1; - } else if (aux == 0) { - parameters->numresolution[0] = 1; - parameters->numresolution[1] = 1; - parameters->numresolution[2] = 1; - } - } - break; - - /* ----------------------------------------------------- */ - case 'c': { /* precinct dimension */ - char sep; - int res_spec = 0; - int aux; - char *s = opj_optarg; - do { - sep = 0; - aux = sscanf(s, "[%d,%d,%d]%c", ¶meters->prct_init[0][res_spec], - ¶meters->prct_init[1][res_spec], ¶meters->prct_init[2][res_spec], &sep); - if (sep == ',' && aux != 4) { - fprintf(stdout, - "[ERROR] '-c' 'dimensions of precincts' argument error ! [-c [prcx_res0,prcy_res0,prcz_res0],...,[prcx_resN,prcy_resN,prcz_resN]]\n"); - return 1; - } - parameters->csty |= 0x01; - res_spec++; - s = strpbrk(s, "]") + 2; - } while (sep == ','); - parameters->res_spec = res_spec; /* number of precinct size specifications */ - } - break; - - /* ----------------------------------------------------- */ - - case 'b': { /* code-block dimension */ - int cblockw_init = 0, cblockh_init = 0, cblockl_init = 0; - if (sscanf(opj_optarg, "%d,%d,%d", &cblockw_init, &cblockh_init, - &cblockl_init) != 3) { - fprintf(stdout, - "[ERROR] '-b' 'dimensions of codeblocks' argument error ! [-b cblkx,cblky,cblkz]\n"); - return 1; - } - if (cblockw_init * cblockh_init * cblockl_init > (1 << 18) || - cblockw_init > 1024 || cblockw_init < 4 || cblockh_init > 1024 || - cblockh_init < 4 || cblockl_init > 1024 || cblockl_init < 4) { - fprintf(stdout, - "[ERROR] Size of code_block error (option -b) !!\n\nRestriction :\n * width*height*length<=4096\n * 4<=width,height,length<= 1024\n\n"); - return 1; - } - parameters->cblock_init[0] = cblockw_init; - parameters->cblock_init[1] = cblockh_init; - parameters->cblock_init[2] = cblockl_init; - } - break; - - /* ----------------------------------------------------- */ - - case 'x': { /* creation of index file */ - char *index = opj_optarg; - strncpy(parameters->index, index, MAX_PATH); - parameters->index_on = 1; - } - break; - - /* ----------------------------------------------------- */ - - case 'p': { /* progression order */ - char progression[4]; - - strncpy(progression, opj_optarg, 4); - parameters->prog_order = give_progression(progression); - if (parameters->prog_order == -1) { - fprintf(stdout, - "[ERROR] Unrecognized progression order [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - - case 's': { /* subsampling factor */ - if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->subsampling_dx, - ¶meters->subsampling_dy, ¶meters->subsampling_dz) != 3) { - fprintf(stdout, "[ERROR] '-s' sub-sampling argument error ! [-s dx,dy,dz]\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - - case 'd': { /* coordonnate of the reference grid */ - if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->volume_offset_x0, - ¶meters->volume_offset_y0, ¶meters->volume_offset_z0) != 3) { - fprintf(stdout, - "[ERROR] -d 'coordonnate of the reference grid' argument error !! [-d x0,y0,z0]\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - - case 'h': { /* display an help description */ - encode_help_display(); - return 1; - } - break; - - /* ----------------------------------------------------- */ - - 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 = opj_optarg; - POC = parameters->POC; - - fprintf(stdout, "/----------------------------------\\\n"); - fprintf(stdout, "| POC option not fully tested !! |\n"); - fprintf(stdout, "\\----------------------------------/\n"); - - while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%s", &POC[numpocs].tile, - &POC[numpocs].resno0, &POC[numpocs].compno0, - &POC[numpocs].layno1, &POC[numpocs].resno1, - &POC[numpocs].compno1, POC[numpocs].progorder) == 7) { - POC[numpocs].prg = give_progression(POC[numpocs].progorder); - /* POC[numpocs].tile; */ - numpocs++; - while (*s && *s != '/') { - s++; - } - if (!*s) { - break; - } - s++; - } - parameters->numpocs = numpocs; - } - break; - - /* ------------------------------------------------------ */ - - case 'S': { /* SOP marker */ - parameters->csty |= 0x02; - } - break; - - /* ------------------------------------------------------ */ - - case 'E': { /* EPH marker */ - parameters->csty |= 0x04; - } - break; - - /* ------------------------------------------------------ */ - - case 'M': { /* Codification mode switch */ - fprintf(stdout, "[INFO] Mode switch option not fully tested !!\n"); - value = 0; - if (sscanf(opj_optarg, "%d", &value) == 1) { - for (i = 0; i <= 6; i++) { - int cache = value & (1 << i); - if (cache) { - parameters->mode |= (1 << i); - } - } - } - } - break; - - /* ------------------------------------------------------ */ - - case 'D': { /* DCO */ - if (sscanf(opj_optarg, "%d", ¶meters->dcoffset) != 1) { - fprintf(stdout, "[ERROR] DC offset error !! [-D %d]\n", parameters->dcoffset); - return 1; - } - } - break; - - /* ------------------------------------------------------ */ - - case 'R': { /* ROI */ - if (sscanf(opj_optarg, "OI:c=%d,U=%d", ¶meters->roi_compno, - ¶meters->roi_shift) != 2) { - fprintf(stdout, "[ERROR] ROI error !! [-ROI:c='compno',U='shift']\n"); - return 1; - } - } - break; - - /* ------------------------------------------------------ */ - - case 'l': { /* Tile offset */ - if (sscanf(opj_optarg, "%d,%d,%d", ¶meters->cp_tx0, ¶meters->cp_ty0, - ¶meters->cp_tz0) != 3) { - fprintf(stdout, "[ERROR] -l 'tile offset' argument error !! [-l X0,Y0,Z0]"); - return 1; - } - } - break; - - /* ------------------------------------------------------ - - case 'T': // Transformation of original data (2D-DWT/3D-DWT/3D-RLS/2D-DWT+1D-RLS) - { - char transform[4]; - - strncpy(transform, opj_optarg, 4); - parameters->transform_format = give_transform(transform); - if (parameters->transform_format == -1) { - fprintf(stdout, "[ERROR] -T 'Transform domain' argument error !! [-T 2DWT, 3DWT, 3RLS or 3LSE only]"); - return 1; - } - } - break; - - ------------------------------------------------------ */ - - case 'C': { /* Coding of transformed data */ - char coding[3]; - - strncpy(coding, opj_optarg, 3); - parameters->encoding_format = give_coding(coding); - if (parameters->encoding_format == -1) { - fprintf(stdout, - "[ERROR] -C 'Coding algorithm' argument error !! [-C 2EB, 3EB, 2GR, 3GR or GRI only]"); - return 1; - } - } - break; - - /* ------------------------------------------------------ */ - - case 'I': { /* reversible or not */ - parameters->irreversible = 1; - } - break; - - default: - fprintf(stdout, "[ERROR] This option is not valid \"-%c %s\"\n", c, opj_optarg); - return 1; - } - } - - /* check for possible errors */ - - if ((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { - fprintf(stdout, "usage: jp3d_vm_enc -i volume-file -o jp3d-file (+ options)\n"); - return 1; - } - - if ((parameters->decod_format == BIN_DFMT) && (parameters->imgfile[0] == 0)) { - fprintf(stdout, - "usage: jp3d_vm_enc -i bin-volume-file -m img-file -o jp3d-file (+ options)\n"); - return 1; - } - - if ((parameters->decod_format != BIN_DFMT) && - (parameters->decod_format != PGX_DFMT) && - (parameters->decod_format != IMG_DFMT)) { - fprintf(stdout, - "usage: jp3d_vm_enc -i input-volume-file [*.bin,*.pgx,*.img] -o jp3d-file [*.jp3d,*.j2k] (+ options)\n"); - return 1; - } - if ((parameters->cod_format != J3D_CFMT) && - (parameters->cod_format != J2K_CFMT)) { - fprintf(stdout, - "usage: jp3d_vm_enc -i input-volume-file [*.bin,*.pgx,*.img] -o jp3d-file [*.jp3d,*.j2k] (+ options)\n"); - return 1; - } - - if ((parameters->encoding_format == ENCOD_2GR || - parameters->encoding_format == ENCOD_3GR) && - parameters->transform_format != TRF_3D_LSE && - parameters->transform_format != TRF_3D_RLS) { - fprintf(stdout, - "[ERROR] Entropy coding options -C [2GR,3GR] are only compatible with predictive-based transform algorithms: -T [3RLS,3LSE].\n"); - return 1; - } - if (parameters->encoding_format == ENCOD_3EB) { - parameters->mode |= (1 << 6); - } - - if ((parameters->mode >> 6) & 1) { - parameters->encoding_format = ENCOD_3EB; - } - - if ((parameters->numresolution[2] == 0 || (parameters->numresolution[1] == 0) || - (parameters->numresolution[0] == 0))) { - fprintf(stdout, - "[ERROR] -n 'resolution levels' argument error ! Resolutions must be greater than 1 in order to perform DWT.\n"); - return 1; - } - if (parameters->numresolution[1] != parameters->numresolution[0]) { - fprintf(stdout, - "[ERROR] -n 'resolution levels' argument error ! Resolutions in X and Y axis must be the same in this implementation.\n"); - return 1; - } - - if (parameters->numresolution[2] > parameters->numresolution[0]) { - fprintf(stdout, - "[ERROR] -n 'resolution levels' argument error ! Resolutions in Z axis must be lower than in X-Y axis.\n"); - return 1; - } - - if (parameters->dcoffset >= 128 && parameters->dcoffset <= -128) { - fprintf(stdout, - "[ERROR] -D 'DC offset' argument error ! Value must be -128<=DCO<=128.\n"); - return 1; - } - - if (parameters->numresolution[2] != 1) { - parameters->transform_format = TRF_3D_DWT; - /*fprintf(stdout, "[Warning] Resolution level in axial dim > 1 : 3D-DWT will be performed... \n");*/ - } else if (parameters->numresolution[2] == 1) { - parameters->transform_format = TRF_2D_DWT; - /*fprintf(stdout, "[Warning] Resolution level in axial dim == 1 : 2D-DWT will be performed... \n");*/ - } - - if ((parameters->cod_format == J2K_CFMT) && - (parameters->transform_format != TRF_2D_DWT || - parameters->encoding_format != ENCOD_2EB)) { - fprintf(stdout, - "[WARNING] Incompatible options -o *.j2k and defined transform or encoding algorithm. Latter will be ignored\n"); - parameters->transform_format = TRF_2D_DWT; - parameters->encoding_format = ENCOD_2EB; - } - - if ((parameters->cp_disto_alloc || parameters->cp_fixed_alloc || - parameters->cp_fixed_quality) && - (!(parameters->cp_disto_alloc ^ parameters->cp_fixed_quality))) { - fprintf(stdout, "[ERROR] Options -r and -q 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.0; /* MOD antonin : losslessbug */ - parameters->tcp_numlayers++; - parameters->cp_disto_alloc = 1; - } - - if ((parameters->cp_tx0 > parameters->volume_offset_x0) || - (parameters->cp_ty0 > parameters->volume_offset_y0) || - (parameters->cp_tz0 > parameters->volume_offset_z0)) { - fprintf(stdout, - "[ERROR] Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) TZO(%d)<=IMG_Z0(%d)\n", - parameters->cp_tx0, parameters->volume_offset_x0, parameters->cp_ty0, - parameters->volume_offset_y0, - parameters->cp_tz0, parameters->volume_offset_z0); - return 1; - } - - for (i = 0; i < parameters->numpocs; i++) { - if (parameters->POC[i].prg == -1) { - fprintf(stdout, - "[ERROR] Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n", - i + 1); - } - } - return 0; -} - -/* -------------------------------------------------------------------------- */ - -/** -sample error callback expecting a FILE* client object -*/ -void error_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); -} -/** -sample warning callback expecting a FILE* client object -*/ -void warning_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); -} -/** -sample debug callback expecting a FILE* client object -*/ -void info_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[INFO] %s", msg); -} - -/* -------------------------------------------------------------------------- */ - -int main(int argc, char **argv) -{ - bool bSuccess; - bool delete_comment = true; - opj_cparameters_t parameters; /* compression parameters */ - opj_event_mgr_t event_mgr; /* event manager */ - opj_volume_t *volume = NULL; - - /* - configure the event callbacks (not required) - setting of each callback is optional - */ - 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(¶meters); - - /* parse input and get user encoding parameters */ - if (parse_cmdline_encoder(argc, argv, ¶meters) == 1) { - return 0; - } - - if (parameters.cp_comment == NULL) { - parameters.cp_comment = "Created by OpenJPEG version JP3D"; - /* no need to delete parameters.cp_comment on exit */ - delete_comment = false; - } - - /* encode the destination volume */ - /* ---------------------------- */ - if (parameters.cod_format == J3D_CFMT || parameters.cod_format == J2K_CFMT) { - int codestream_length, pixels, bitsin; - opj_cio_t *cio = NULL; - FILE *f = NULL; - opj_cinfo_t* cinfo = NULL; - - /* decode the source volume */ - /* ----------------------- */ - switch (parameters.decod_format) { - case PGX_DFMT: - fprintf(stdout, "[INFO] Loading pgx file(s)\n"); - volume = pgxtovolume(parameters.infile, ¶meters); - if (!volume) { - fprintf(stdout, "[ERROR] Unable to load pgx files\n"); - return 1; - } - break; - - case BIN_DFMT: - fprintf(stdout, "[INFO] Loading bin file\n"); - volume = bintovolume(parameters.infile, parameters.imgfile, ¶meters); - if (!volume) { - fprintf(stdout, "[ERROR] Unable to load bin file\n"); - return 1; - } - break; - - case IMG_DFMT: - fprintf(stdout, "[INFO] Loading img file\n"); - volume = imgtovolume(parameters.infile, ¶meters); - if (!volume) { - fprintf(stderr, "[ERROR] Unable to load img file\n"); - return 1; - } - break; - } - - /* get a JP3D or J2K compressor handle */ - if (parameters.cod_format == J3D_CFMT) { - cinfo = opj_create_compress(CODEC_J3D); - } else if (parameters.cod_format == J2K_CFMT) { - cinfo = opj_create_compress(CODEC_J2K); - } - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stdout); - - /* setup the encoder parameters using the current volume and using user parameters */ - opj_setup_encoder(cinfo, ¶meters, volume); - - /* open a byte stream for writing */ - /* allocate memory for all tiles */ - cio = opj_cio_open((opj_common_ptr)cinfo, NULL, 0); - - /* encode the volume */ - /*fprintf(stdout, "[INFO] Encode the volume\n");*/ - bSuccess = opj_encode(cinfo, cio, volume, parameters.index); - if (!bSuccess) { - opj_cio_close(cio); - fprintf(stdout, "[ERROR] Failed to encode volume\n"); - return 1; - } - codestream_length = cio_tell(cio); - pixels = (volume->x1 - volume->x0) * (volume->y1 - volume->y0) * - (volume->z1 - volume->z0); - bitsin = pixels * volume->comps[0].prec; - fprintf(stdout, - "[RESULT] Volume: %d x %d x %d (x %d bpv)\n Codestream: %d B, Ratio: %5.3f bpv, (%5.3f : 1) \n", - (volume->x1 - volume->x0), (volume->y1 - volume->y0), (volume->z1 - volume->z0), - volume->comps[0].prec, - codestream_length, ((double)codestream_length * 8.0 / (double)pixels), - ((double)bitsin / (8.0 * (double)codestream_length))); - - /* write the buffer to disk */ - f = fopen(parameters.outfile, "wb"); - if (!f) { - fprintf(stdout, "[ERROR] Failed to open %s for writing\n", parameters.outfile); - return 1; - } - fwrite(cio->buffer, 1, codestream_length, f); - fclose(f); - - /* close and free the byte stream */ - opj_cio_close(cio); - - /* free remaining compression structures */ - opj_destroy_compress(cinfo); - } else { - fprintf(stdout, "[ERROR] Cod_format != JP3d !!! \n"); - return 1; - } - - /* free user parameters structure */ - if (delete_comment) { - if (parameters.cp_comment) { - free(parameters.cp_comment); - } - } - if (parameters.cp_matrice) { - free(parameters.cp_matrice); - } - - /* free volume data */ - opj_volume_destroy(volume); - - return 0; -} diff --git a/src/bin/jp3d/opj_jp3d_decompress.c b/src/bin/jp3d/opj_jp3d_decompress.c deleted file mode 100644 index eb7ebe8e..00000000 --- a/src/bin/jp3d/opj_jp3d_decompress.c +++ /dev/null @@ -1,601 +0,0 @@ -/* - * Copyright (c) 2001-2003, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium - * Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain - * 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> -#include <stdlib.h> -#include <math.h> - -#include "opj_config.h" -#include "openjp3d.h" -#include "opj_getopt.h" -#include "convert.h" - -#ifdef _WIN32 -#include <windows.h> -#else -#define stricmp strcasecmp -#define strnicmp strncasecmp -#endif /* _WIN32 */ - -/* ----------------------------------------------------------------------- */ -static double calc_PSNR(opj_volume_t *original, opj_volume_t *decoded) -{ - int max, i, k, compno = 0, size; - double sum, total = 0; - int global = 1; - - max = (original->comps[compno].prec <= 8) ? 255 : (1 << - original->comps[compno].prec) - 1; - if (global) { - size = (original->x1 - original->x0) * (original->y1 - original->y0) * - (original->z1 - original->z0); - - for (compno = 0; compno < original->numcomps; compno++) { - for (sum = 0, i = 0; i < size; ++i) { - if ((decoded->comps[compno].data[i] < 0) || - (decoded->comps[compno].data[i] > max)) { - fprintf(stdout, "[WARNING] Data out of range during PSNR computing...\n"); - } else { - sum += (original->comps[compno].data[i] - decoded->comps[compno].data[i]) * - (original->comps[compno].data[i] - decoded->comps[compno].data[i]); - } - } - } - sum /= size; - total = ((sum == 0.0) ? 0.0 : 10 * log10(max * max / sum)); - } else { - size = (original->x1 - original->x0) * (original->y1 - original->y0); - - for (k = 0; k < original->z1 - original->z0; k++) { - int offset = k * size; - for (sum = 0, compno = 0; compno < original->numcomps; compno++) { - for (i = 0; i < size; ++i) { - if ((decoded->comps[compno].data[i + offset] < 0) || - (decoded->comps[compno].data[i + offset] > max)) { - fprintf(stdout, "[WARNING] Data out of range during PSNR computing...\n"); - } else { - sum += (original->comps[compno].data[i + offset] - decoded->comps[compno].data[i - + offset]) * (original->comps[compno].data[i + offset] - - decoded->comps[compno].data[i + offset]); - } - } - } - sum /= size; - total = total + ((sum == 0.0) ? 0.0 : 10 * log10(max * max / sum)); - } - - } - if (total == 0) { /* perfect reconstruction, PSNR should return infinity */ - return -1.0; - } - - return total; - /*return 20 * log10((max - 1) / sqrt(sum));*/ -} - -static double calc_SSIM(opj_volume_t *original, opj_volume_t *decoded) -{ - int max, i, compno = 0, size, sizeM; - double sum; - double mux = 0.0, muy = 0.0, sigmax = 0.0, sigmay = 0.0, - sigmaxy = 0.0/*, structx = 0.0, structy = 0.0*/; - double lcomp, ccomp, scomp; - double C1, C2, C3; - - max = (original->comps[compno].prec <= 8) ? 255 : (1 << - original->comps[compno].prec) - 1; - size = (original->x1 - original->x0) * (original->y1 - original->y0) * - (original->z1 - original->z0); - - /*MSSIM*/ - - /* sizeM = size / (original->z1 - original->z0);*/ - - sizeM = size; - for (sum = 0, i = 0; i < sizeM; ++i) { - /* First, the luminance of each signal is compared.*/ - mux += original->comps[compno].data[i]; - muy += decoded->comps[compno].data[i]; - } - mux /= sizeM; - muy /= sizeM; - - /*We use the standard deviation (the square root of variance) as an estimate of the signal contrast.*/ - for (sum = 0, i = 0; i < sizeM; ++i) { - /* First, the luminance of each signal is compared.*/ - sigmax += (original->comps[compno].data[i] - mux) * - (original->comps[compno].data[i] - mux); - sigmay += (decoded->comps[compno].data[i] - muy) * - (decoded->comps[compno].data[i] - muy); - sigmaxy += (original->comps[compno].data[i] - mux) * - (decoded->comps[compno].data[i] - muy); - } - sigmax /= sizeM - 1; - sigmay /= sizeM - 1; - sigmaxy /= sizeM - 1; - - sigmax = sqrt(sigmax); - sigmay = sqrt(sigmay); - sigmaxy = sqrt(sigmaxy); - - /*Third, the signal is normalized (divided) by its own standard deviation, */ - /*so that the two signals being compared have unit standard deviation.*/ - - /*Luminance comparison*/ - C1 = (0.01 * max) * (0.01 * max); - lcomp = ((2 * mux * muy) + C1) / ((mux * mux) + (muy * mux) + C1); - /*Constrast comparison*/ - C2 = (0.03 * max) * (0.03 * max); - ccomp = ((2 * sigmax * sigmay) + C2) / ((sigmax * sigmax) + - (sigmay * sigmay) + C2); - /*Structure comparison*/ - C3 = C2 / 2; - scomp = (sigmaxy + C3) / (sigmax * sigmay + C3); - /*Similarity measure*/ - - sum = lcomp * ccomp * scomp; - return sum; -} - -void decode_help_display() -{ - fprintf(stdout, "HELP\n----\n\n"); - fprintf(stdout, "- the -h option displays this help information on screen\n\n"); - - fprintf(stdout, "List of parameters for the JPEG 2000 encoder:\n"); - fprintf(stdout, "\n"); - fprintf(stdout, " Required arguments \n"); - fprintf(stdout, " ---------------------------- \n"); - fprintf(stdout, " -i <compressed file> ( *.jp3d, *.j3d )\n"); - fprintf(stdout, - " Currently accepts J3D-files. The file type is identified based on its suffix.\n"); - fprintf(stdout, " -o <decompressed file> ( *.pgx, *.bin )\n"); - fprintf(stdout, - " Currently accepts PGX-files and BIN-files. Binary data is written to the file (not ascii). \n"); - fprintf(stdout, - " If a PGX filename is given, there will be as many output files as slices; \n"); - fprintf(stdout, - " an indice starting from 0 will then be appended to the output filename,\n"); - fprintf(stdout, " just before the \"pgx\" extension.\n"); - fprintf(stdout, " -m <characteristics file> ( *.img ) \n"); - fprintf(stdout, - " Required only for BIN-files. Ascii data of volume characteristics is written. \n"); - fprintf(stdout, "\n"); - fprintf(stdout, " Optional \n"); - fprintf(stdout, " ---------------------------- \n"); - fprintf(stdout, " -h \n "); - fprintf(stdout, " Display the help information\n"); - fprintf(stdout, " -r <RFx,RFy,RFz>\n"); - fprintf(stdout, - " Set the number of highest resolution levels to be discarded on each dimension. \n"); - fprintf(stdout, - " The volume resolution is effectively divided by 2 to the power of the\n"); - fprintf(stdout, - " number of discarded levels. The reduce factor is limited by the\n"); - fprintf(stdout, - " smallest total number of decomposition levels among tiles.\n"); - fprintf(stdout, " -l <number of quality layers to decode>\n"); - fprintf(stdout, - " Set the maximum number of quality layers to decode. If there are\n"); - fprintf(stdout, - " less quality layers than the specified number, all the quality layers\n"); - fprintf(stdout, " are decoded. \n"); - fprintf(stdout, " -O original-file \n"); - fprintf(stdout, - " This option offers the possibility to compute some quality results \n"); - fprintf(stdout, - " for the decompressed volume, like the PSNR value achieved or the global SSIM value. \n"); - fprintf(stdout, - " Needs the original file in order to compare with the new one.\n"); - fprintf(stdout, - " NOTE: Only valid when -r option is 0,0,0 (both original and decompressed volumes have same resolutions) \n"); - fprintf(stdout, - " NOTE: If original file is .BIN file, the volume characteristics file shall be defined with the -m option. \n"); - fprintf(stdout, " (i.e. -O original-BIN-file -m original-IMG-file) \n"); - fprintf(stdout, " -BE \n"); - fprintf(stdout, - " Define that the recovered volume data will be saved with big endian byte order.\n"); - fprintf(stdout, " By default, little endian byte order is used.\n"); - fprintf(stdout, "\n"); -} - -/* -------------------------------------------------------------------------- */ - -int get_file_format(char *filename) -{ - int i; - static const char *extension[] = {"pgx", "bin", "j3d", "jp3d", "j2k", "img"}; - static const int format[] = { PGX_DFMT, BIN_DFMT, J3D_CFMT, J3D_CFMT, J2K_CFMT, IMG_DFMT}; - char * ext = strrchr(filename, '.'); - if (ext) { - ext++; - for (i = 0; i < sizeof(format) / sizeof(format[0]); i++) { - if (strnicmp(ext, extension[i], 3) == 0) { - return format[i]; - } - } - } - - return -1; -} - -/* -------------------------------------------------------------------------- */ - -int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters) -{ - /* parse the command line */ - - while (1) { - int c = opj_getopt(argc, argv, "i:o:O:r:l:B:m:h"); - if (c == -1) { - break; - } - switch (c) { - case 'i': { /* input file */ - char *infile = opj_optarg; - parameters->decod_format = get_file_format(infile); - switch (parameters->decod_format) { - case J3D_CFMT: - case J2K_CFMT: - break; - default: - fprintf(stdout, "[ERROR] Unknown format for infile %s [only *.j3d]!! \n", - infile); - return 1; - break; - } - strncpy(parameters->infile, infile, MAX_PATH); - fprintf(stdout, "[INFO] Infile: %s \n", parameters->infile); - - } - break; - - case 'm': { /* img file */ - char *imgfile = opj_optarg; - int imgformat = get_file_format(imgfile); - switch (imgformat) { - case IMG_DFMT: - break; - default: - fprintf(stdout, - "[ERROR] Unrecognized format for imgfile : %s [accept only *.img] !!\n\n", - imgfile); - return 1; - break; - } - strncpy(parameters->imgfile, imgfile, MAX_PATH); - fprintf(stdout, "[INFO] Imgfile: %s Format: %d\n", parameters->imgfile, - imgformat); - } - break; - - /* ----------------------------------------------------- */ - - case 'o': { /* output file */ - char *outfile = opj_optarg; - parameters->cod_format = get_file_format(outfile); - switch (parameters->cod_format) { - case PGX_DFMT: - case BIN_DFMT: - break; - default: - fprintf(stdout, - "[ERROR] Unrecognized format for outfile : %s [accept only *.pgx or *.bin] !!\n\n", - outfile); - return 1; - break; - } - strncpy(parameters->outfile, outfile, MAX_PATH); - fprintf(stdout, "[INFO] Outfile: %s \n", parameters->outfile); - - } - break; - - /* ----------------------------------------------------- */ - - case 'O': { /* Original image for PSNR computing */ - char *original = opj_optarg; - parameters->orig_format = get_file_format(original); - switch (parameters->orig_format) { - case PGX_DFMT: - case BIN_DFMT: - break; - default: - fprintf(stdout, - "[ERROR] Unrecognized format for original file : %s [accept only *.pgx or *.bin] !!\n\n", - original); - return 1; - break; - } - strncpy(parameters->original, original, MAX_PATH); - fprintf(stdout, "[INFO] Original file: %s \n", parameters->original); - } - break; - - /* ----------------------------------------------------- */ - - case 'r': { /* reduce option */ - /*sscanf(opj_optarg, "%d, %d, %d", ¶meters->cp_reduce[0], ¶meters->cp_reduce[1], ¶meters->cp_reduce[2]);*/ - int aux; - aux = sscanf(opj_optarg, "%d,%d,%d", ¶meters->cp_reduce[0], - ¶meters->cp_reduce[1], ¶meters->cp_reduce[2]); - if (aux == 2) { - parameters->cp_reduce[2] = 0; - } else if (aux == 1) { - parameters->cp_reduce[1] = parameters->cp_reduce[0]; - parameters->cp_reduce[2] = 0; - } else if (aux == 0) { - parameters->cp_reduce[0] = 0; - parameters->cp_reduce[1] = 0; - parameters->cp_reduce[2] = 0; - } - } - break; - - /* ----------------------------------------------------- */ - - case 'l': { /* layering option */ - sscanf(opj_optarg, "%d", ¶meters->cp_layer); - } - break; - - /* ----------------------------------------------------- */ - - case 'B': { /* BIGENDIAN vs. LITTLEENDIAN */ - parameters->bigendian = 1; - } - break; - - /* ----------------------------------------------------- */ - - case 'L': { /* BIGENDIAN vs. LITTLEENDIAN */ - parameters->decod_format = LSE_CFMT; - } - break; - - /* ----------------------------------------------------- */ - - case 'h': { /* display an help description */ - decode_help_display(); - return 1; - } - break; - - /* ----------------------------------------------------- */ - - default: - fprintf(stdout, "[WARNING] This option is not valid \"-%c %s\"\n", c, - opj_optarg); - break; - } - } - - /* check for possible errors */ - - if ((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { - fprintf(stdout, - "[ERROR] At least one required argument is missing\n Check jp3d_to_volume -help for usage information\n"); - return 1; - } - - return 0; -} - -/* -------------------------------------------------------------------------- */ - -/** -sample error callback expecting a FILE* client object -*/ -void error_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); -} -/** -sample warning callback expecting a FILE* client object -*/ -void warning_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); -} -/** -sample debug callback expecting no client object -*/ -void info_callback(const char *msg, void *client_data) -{ - fprintf(stdout, "[INFO] %s", msg); -} - -/* -------------------------------------------------------------------------- */ - -int main(int argc, char **argv) -{ - - opj_dparameters_t parameters; /* decompression parameters */ - opj_event_mgr_t event_mgr; /* event manager */ - opj_volume_t *volume = NULL; - - opj_volume_t *original = NULL; - opj_cparameters_t cparameters; /* original parameters */ - - FILE *fsrc = NULL; - unsigned char *src = NULL; - int file_length; - int decodeok; - double psnr, ssim; - - opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ - opj_cio_t *cio = NULL; - - /* configure the event callbacks (not required) */ - memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); - event_mgr.error_handler = error_callback; - event_mgr.warning_handler = warning_callback; - event_mgr.info_handler = info_callback; - - /* set decoding parameters to default values */ - opj_set_default_decoder_parameters(¶meters); - - /* parse input and get user decoding parameters */ - strcpy(parameters.original, "NULL"); - strcpy(parameters.imgfile, "NULL"); - if (parse_cmdline_decoder(argc, argv, ¶meters) == 1) { - return 0; - } - - /* read the input file and put it in memory */ - /* ---------------------------------------- */ - fprintf(stdout, "[INFO] Loading %s file \n", - parameters.decod_format == J3D_CFMT ? ".jp3d" : ".j2k"); - fsrc = fopen(parameters.infile, "rb"); - if (!fsrc) { - fprintf(stdout, "[ERROR] Failed to open %s for reading\n", parameters.infile); - return 1; - } - fseek(fsrc, 0, SEEK_END); - file_length = ftell(fsrc); - fseek(fsrc, 0, SEEK_SET); - src = (unsigned char *) malloc(file_length); - fread(src, 1, file_length, fsrc); - fclose(fsrc); - - /* decode the code-stream */ - /* ---------------------- */ - if (parameters.decod_format == J3D_CFMT || - parameters.decod_format == J2K_CFMT) { - /* get a JP3D or J2K decoder handle */ - if (parameters.decod_format == J3D_CFMT) { - dinfo = opj_create_decompress(CODEC_J3D); - } else if (parameters.decod_format == J2K_CFMT) { - dinfo = opj_create_decompress(CODEC_J2K); - } - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); - - /* setup the decoder decoding parameters using user parameters */ - opj_setup_decoder(dinfo, ¶meters); - - /* open a byte stream */ - cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); - - /* decode the stream and fill the volume structure */ - volume = opj_decode(dinfo, cio); - if (!volume) { - fprintf(stdout, "[ERROR] jp3d_to_volume: failed to decode volume!\n"); - opj_destroy_decompress(dinfo); - opj_cio_close(cio); - return 1; - } - - /* close the byte stream */ - opj_cio_close(cio); - } - - /* free the memory containing the code-stream */ - free(src); - src = NULL; - - /* create output volume */ - /* ------------------- */ - - switch (parameters.cod_format) { - case PGX_DFMT: /* PGX */ - decodeok = volumetopgx(volume, parameters.outfile); - if (decodeok) { - fprintf(stdout, "[ERROR] Unable to write decoded volume into pgx files\n"); - } - break; - - case BIN_DFMT: /* BMP */ - decodeok = volumetobin(volume, parameters.outfile); - if (decodeok) { - fprintf(stdout, "[ERROR] Unable to write decoded volume into pgx files\n"); - } - break; - } - switch (parameters.orig_format) { - case PGX_DFMT: /* PGX */ - if (strcmp("NULL", parameters.original) != 0) { - fprintf(stdout, "Loading original file %s \n", parameters.original); - cparameters.subsampling_dx = 1; - cparameters.subsampling_dy = 1; - cparameters.subsampling_dz = 1; - cparameters.volume_offset_x0 = 0; - cparameters.volume_offset_y0 = 0; - cparameters.volume_offset_z0 = 0; - original = pgxtovolume(parameters.original, &cparameters); - } - break; - - case BIN_DFMT: /* BMP */ - if (strcmp("NULL", parameters.original) != 0 && - strcmp("NULL", parameters.imgfile) != 0) { - fprintf(stdout, "Loading original file %s %s\n", parameters.original, - parameters.imgfile); - cparameters.subsampling_dx = 1; - cparameters.subsampling_dy = 1; - cparameters.subsampling_dz = 1; - cparameters.volume_offset_x0 = 0; - cparameters.volume_offset_y0 = 0; - cparameters.volume_offset_z0 = 0; - original = bintovolume(parameters.original, parameters.imgfile, &cparameters); - } - break; - } - - fprintf(stdout, "[RESULT] Volume: %d x %d x %d (x %d bpv)\n ", - (volume->comps[0].w >> volume->comps[0].factor[0]), - (volume->comps[0].h >> volume->comps[0].factor[1]), - (volume->comps[0].l >> volume->comps[0].factor[2]), - volume->comps[0].prec); - - if (original) { - psnr = calc_PSNR(original, volume); - ssim = calc_SSIM(original, volume); - if (psnr < 0.0) { - fprintf(stdout, " PSNR: Inf , SSMI %f -- Perfect reconstruction!\n", ssim); - } else { - fprintf(stdout, " PSNR: %f , SSIM %f \n", psnr, ssim); - } - } - /* free remaining structures */ - if (dinfo) { - opj_destroy_decompress(dinfo); - } - - /* free volume data structure */ - opj_volume_destroy(volume); - - return 0; -} - diff --git a/src/bin/jp3d/tcltk/LPI_JP3D_VM.tcl b/src/bin/jp3d/tcltk/LPI_JP3D_VM.tcl deleted file mode 100755 index 37657b27..00000000 --- a/src/bin/jp3d/tcltk/LPI_JP3D_VM.tcl +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/sh -# The next line is executed by /bin/sh, but not tcl \ -exec wish "$0" ${1+"$@"} -lappend auto_path /usr/share/tcltk/bwidget1.9.2 - -namespace eval jp3dVM { - - variable _progress 0 - variable _afterid "" - variable _status "Compute in progress..." - variable notebook - variable mainframe - variable dataout "Process execution information" - variable status - variable prgtext - variable prgindic - - set pwd [pwd] - cd [file dirname [info script]] - variable VMDIR [pwd] - cd $pwd - - foreach script {encoder.tcl decoder.tcl} { - namespace inscope :: source $VMDIR/$script - } -} - - -proc jp3dVM::create { } { - variable notebook - variable mainframe - variable dataout - - bind all <F12> { catch {console show} } - - # Menu description - set descmenu { - "&File" {} {} 0 { - {command "E&xit" {} "Exit BWidget jp3dVM" {} -command exit} - } - "&Options" {} {} 0 { - {command "&Encode" {} "Show encoder" {} - -command {$jp3dVM::notebook raise [$jp3dVM::notebook page 0]} - } - {command "&Decode" {} "Show decoder" {} - -command {$jp3dVM::notebook raise [$jp3dVM::notebook page 1]} - } - } - "&Help" {} {} 0 { - {command "&About authors..." {} "Show info about authors" {} - -command {MessageDlg .msgdlg -parent . -title "About authors" -message " Copyright @ LPI-UVA 2006 " -type ok -icon info}} - } - } - - set mainframe [MainFrame .mainframe \ - -menu $descmenu \ - -textvariable jp3dVM::status \ - -progressvar jp3dVM::prgindic] - - $mainframe addindicator -text "JP3D Verification Model 1.0.0" - - # NoteBook creation - set frame [$mainframe getframe] - set notebook [NoteBook $frame.nb] - - set logo [frame $frame.logo] - #creo imagen logo - image create photo LPIimg -file logoLPI.gif - set logoimg [Label $logo.logoimg -image LPIimg] - - set f0 [VMEncoder::create $notebook] - set f1 [VMDecoder::create $notebook] - - set tfinfo [TitleFrame $frame.codinfo -text "Program Execution"] - set codinfo [$tfinfo getframe] - set sw [ScrolledWindow $codinfo.sw -relief sunken -borderwidth 2 -scrollbar both] - set sf [ScrollableFrame $codinfo.sf ] - $sw setwidget $sf - set subf [$sf getframe] - set labinfo [label $subf.labinfo -textvariable jp3dVM::dataout -justify left] - - pack $labinfo -side left - pack $sw - - $notebook compute_size - $notebook raise [$notebook page 0] - - pack $logoimg -side left -fill x -expand yes - pack $notebook -expand yes - pack $logo $tfinfo -side left -expand yes - pack $mainframe -fill both -expand yes - update idletasks -} - - -proc jp3dVM::main {} { - variable VMDIR - - lappend ::auto_path [file dirname $VMDIR] - namespace inscope :: package require BWidget - - option add *TitleFrame.l.font {helvetica 11 bold italic} - - wm withdraw . - wm title . "JP3D Verification Model @ LPI" - - jp3dVM::create - BWidget::place . 0 0 center - wm deiconify . - raise . - focus -force . -} - -jp3dVM::main -wm geom . [wm geom .] diff --git a/src/bin/jp3d/tcltk/README b/src/bin/jp3d/tcltk/README deleted file mode 100644 index f4e2e359..00000000 --- a/src/bin/jp3d/tcltk/README +++ /dev/null @@ -1,13 +0,0 @@ -HOWTO USE THE TCL/TK APP IN 'jp3d/tcltk' ----------------------------------------- -1. Download the 'BWidget-1.9.2' - http://www.sourceforge.net/projects/tcllib/ - -2. Install it e.g. in '/usr/local/BWidget-1.9.2/' -3. Add the lappend command in line 4 - to jp3d/tcltk/LPI_JP3D_VM.tcl: - -#!/bin/sh -# The next line is executed by /bin/sh, but not tcl \ -exec wish "$0" ${1+"$@"} -lappend auto_path /usr/local/BWidget-1.9.2 diff --git a/src/bin/jp3d/tcltk/Thumbs.db b/src/bin/jp3d/tcltk/Thumbs.db Binary files differdeleted file mode 100755 index 5d6ffdf9..00000000 --- a/src/bin/jp3d/tcltk/Thumbs.db +++ /dev/null diff --git a/src/bin/jp3d/tcltk/decoder.tcl b/src/bin/jp3d/tcltk/decoder.tcl deleted file mode 100755 index 98edcde9..00000000 --- a/src/bin/jp3d/tcltk/decoder.tcl +++ /dev/null @@ -1,272 +0,0 @@ -
-namespace eval VMDecoder {
- variable var
- variable JP3Ddecoder "../bin/jp3d_to_volume.exe"
- #variable JP3Ddecoder "jp3d_to_volume.exe"
-}
-
-
-proc VMDecoder::create { nb } {
- variable var
-
- set frameD [$nb insert end VMDecoder -text "Decoder"]
- set topfD [frame $frameD.topfD]
- set medfD [frame $frameD.medfD]
- set bottomfD [frame $frameD.bottomfD]
- set srcfD [TitleFrame $topfD.srcfD -text "Source"]
- set dstfD [TitleFrame $topfD.dstfD -text "Destination"]
- set paramfD [TitleFrame $medfD.paramfD -text "Decoding parameters"]
- set infofD [TitleFrame $medfD.infofD -text "Distortion measures"]
-
- set frame1 [$srcfD getframe]
- _sourceD $frame1
- set frame2 [$dstfD getframe]
- _destinationD $frame2
- set frame3 [$infofD getframe]
- _originalD $frame3
- set frame4 [$paramfD getframe]
- _paramsD $frame4
-
- set butD [Button $bottomfD.butD -text "Decode!" \
- -command "VMDecoder::_decode $frame1 $frame2 $frame3" \
- -helptext "Decoding trigger button"]
- set butR [Button $bottomfD.butR -text "Save info" \
- -command "VMDecoder::_save $frame3" \
- -helptext "Save information"]
-
- pack $srcfD $dstfD -side left -fill both -padx 10 -ipadx 5 -expand yes
- pack $topfD -pady 4 -fill x
-
- pack $paramfD $infofD -side left -fill both -padx 10 -pady 2 -ipadx 5 -expand yes
- pack $medfD -pady 4 -fill x
-
- pack $butD $butR -side left -padx 4 -pady 5 -expand yes
- pack $bottomfD -pady 4 -fill x
-
-return $frameD
-}
-
-
-proc fileDialogD {w ent operation} {
-
- variable file
-
- if {$operation == "open"} {
- #-----Type names---------Extension(s)---
- set types {
- {"JP3D Files" {.jp3d} }
- {"All files" *}
- }
- set file [tk_getOpenFile -filetypes $types -parent $w ]
- } elseif {$operation == "original"} {
- #-----Type names---------Extension(s)---
- set types {
- {"BIN Raw Image Files" {.bin} }
- {"PGX Raw Image Files" {.pgx} }
- {"All files" *}
- }
- set file [tk_getOpenFile -filetypes $types -parent $w ]
- } else {
- #-----Type names---------Extension(s)---
- set types {
- {"BIN Raw Image Files" {.bin} }
- {"PGX Raw Image Files" {.pgx} }
- {"All files" *}
- }
- set file [tk_getSaveFile -filetypes $types -parent $w -initialfile Untitled -defaultextension "*.bin"]
- }
- if {[string compare $file ""]} {
- $ent delete 0 end
- $ent insert end $file
- $ent xview moveto 1
- }
-}
-
-proc VMDecoder::_sourceD { parent } {
-
- variable var
-
- set labsrcD [LabelFrame $parent.labsrcD -text "Select compressed file: " -side top \
- -anchor w -relief flat -borderwidth 0]
- set subsrcD [$labsrcD getframe]
- set listD [entry $subsrcD.entrysrcD -width 40 -textvariable VMDecoder::var(sourceD)]
-
- set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0]
- set subbrw [$labbrw getframe]
- set butbrw [button $subbrw.butbrw -image [Bitmap::get open] \
- -relief raised -borderwidth 1 -padx 1 -pady 1 \
- -command "fileDialogD . $subsrcD.entrysrcD open"]
-
- pack $listD -side top
- pack $butbrw -side top
- pack $labsrcD $labbrw -side left -fill both -expand yes
-
-
-}
-
-proc VMDecoder::_destinationD { parent } {
-
- variable var
-
- set labdstD [LabelFrame $parent.labdstD -text "Save decompressed volume file(s) as: " -side top \
- -anchor w -relief flat -borderwidth 0]
- set subdstD [$labdstD getframe]
- set listD [entry $subdstD.entrydstD -width 40 -textvariable VMDecoder::var(destinationD)]
-
- set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0]
- set subbrw [$labbrw getframe]
- set butbrw [button $subbrw.butbrw -image [Bitmap::get save] \
- -relief raised -borderwidth 1 -padx 1 -pady 1 \
- -command "fileDialogD . $subdstD.entrydstD save"]
-
- pack $listD -side top
- pack $butbrw -side top
- pack $labdstD $labbrw -side left -fill both -expand yes
-}
-
-proc VMDecoder::_originalD { parent } {
-
- variable var
-
- set laborgD [LabelFrame $parent.laborgD -text "Select original file: " -side top \
- -anchor w -relief flat -borderwidth 0]
- set suborgD [$laborgD getframe]
- set listorgD [entry $suborgD.entryorgD -width 30 -textvariable VMDecoder::var(originalD)]
-
- set labbrw2 [LabelFrame $parent.labbrw2 -side top -anchor w -relief flat -borderwidth 0]
- set subbrw2 [$labbrw2 getframe]
- set butbrw2 [button $subbrw2.butbrw2 -image [Bitmap::get open] \
- -relief raised -borderwidth 1 -padx 1 -pady 1 \
- -command "fileDialogD . $suborgD.entryorgD original"]
-
- set infoD [Label $parent.infoD -relief sunken -textvariable VMDecoder::var(decodinfo) -justify left]
-
- pack $listorgD -side left -anchor n
- pack $butbrw2 -side left -anchor n
- pack $infoD -side bottom -anchor nw -pady 4 -ipadx 150 -ipady 20 -expand yes
- pack $laborgD $labbrw2 -side left -fill both
-
-
-}
-
-proc VMDecoder::_paramsD { parent } {
-
- variable var
-
- ########### DECODING #############
- set labcod [LabelFrame $parent.labcod -side top -anchor w -relief sunken -borderwidth 1]
- set subcod [$labcod getframe]
-
- set frameres [frame $subcod.frameres -borderwidth 1]
- set labres [LabelEntry $frameres.labres -label "Resolutions to discard: " -labelwidth 20 -labelanchor w \
- -textvariable VMDecoder::var(resdiscard) -editable 1 \
- -helptext "Number of highest resolution levels to be discarded on each dimension" ]
- set VMDecoder::var(resdiscard) "0,0,0"
-
- set framelayer [frame $subcod.framelayer -borderwidth 1]
- set lablayer [LabelEntry $framelayer.lablayer -label "Layers to decode: " -labelwidth 20 -labelanchor w \
- -textvariable VMDecoder::var(layer) -editable 1 \
- -helptext "Maximum number of quality layers to decode" ]
- set VMDecoder::var(layer) "All"
-
- set framebe [frame $subcod.framebe -borderwidth 1]
- set chkbe [checkbutton $framebe.chkbe -text "Write decoded file with BigEndian byte order" \
- -variable VMDecoder::var(be) -onvalue 1 -offvalue 0 ]
-
- pack $labres -side left -padx 2 -anchor n
- pack $lablayer -side left -padx 2 -anchor n
- pack $chkbe -side left -padx 2 -anchor w
- pack $frameres $framelayer $framebe -side top -anchor w
-
- pack $subcod -anchor n
- pack $labcod -side left -fill both -padx 4 -expand yes
-}
-
-
-proc VMDecoder::_decode { framesrc framedst frameinfo} {
-
- variable var
-
- set sourceD [$framesrc.labsrcD.f.entrysrcD get ]
- set destinationD [$framedst.labdstD.f.entrydstD get ]
- set originD [$frameinfo.laborgD.f.entryorgD get ]
- set cond1 [string match *.pgx [string tolower $destinationD]]
- set cond2 [string match *\**.pgx [string tolower $destinationD]]
- set cond3 [string match *.bin [string tolower $destinationD]]
-
- #comprobamos datos son correctos
- if {($cond1 == 1) && ($cond2 == 0)} {
- set pgx "*.pgx"
- set pattern [string range $destinationD 0 [expr [string length $destinationD]-5]]
- set destinationD $pattern$img
- } elseif {$sourceD == ""} {
- MessageDlg .msgdlg -parent . -message "Error : Source file is not defined !" -type ok -icon error
- } elseif {$destinationD == ""} {
- MessageDlg .msgdlg -parent . -message "Error : Destination file is not defined !" -type ok -icon error
- } else {
-
- #creamos datain a partir de los parametros de entrada
- #set dirJP3Ddecoder [mk_relativepath $VMDecoder::JP3Ddecoder]
- set dirJP3Ddecoder $VMDecoder::JP3Ddecoder
- set datain [concat " $dirJP3Ddecoder -i [mk_relativepath $sourceD] "]
- set datain [concat " $datain -o [mk_relativepath $destinationD] "]
- if {$originD != ""} {
- set datain [concat " $datain -O [mk_relativepath $originD] "]
- if {$cond3 == 1} {
- set img ".img"
- set pattern [string range $originD 0 [expr [string length $originD]-5]]
- set pattern $pattern$img
- if {[file exists $pattern]} {
- set datain [concat " $datain -m [mk_relativepath $pattern] "]
- } else {
- MessageDlg .msgdlg -parent . -message "Error : IMG file associated to original BIN volume file not found in same directory !" -type ok -icon info
- }
- }
- }
- if {$VMDecoder::var(resdiscard) != "0,0,0"} {
- set datain [concat " $datain -r $VMDecoder::var(resdiscard) "]
- }
- if {$VMDecoder::var(layer) != "All" && $VMDecoder::var(layer) > 0} {
- set datain [concat " $datain -l $VMDecoder::var(layer) "]
- }
- if {$VMDecoder::var(be) == 1} {
- set datain [concat " $datain -BE"]
- }
-
- set VMDecoder::var(progval) 10
- ProgressDlg .progress -parent . -title "Wait..." \
- -type infinite \
- -width 20 \
- -textvariable "Compute in progress..."\
- -variable VMDecoder::progval \
- -stop "Stop" \
- -command {destroy .progress}
-
- after 200 set VMDecoder::var(progval) 2
-
- set fp [open "| $datain " r+]
- fconfigure $fp -buffering line
- set jp3dVM::dataout [concat "EXECUTED PROGRAM:\n\t$datain"]
- while {-1 != [gets $fp tmp]} {
- set jp3dVM::dataout [concat "$jp3dVM::dataout\n$tmp"]
- }
- close $fp
- destroy .progress
- set cond [string first "ERROR" $jp3dVM::dataout]
- set cond2 [string first "PSNR" $jp3dVM::dataout]
- set cond3 [string first "RESULT" $jp3dVM::dataout]
- if {$cond != -1} {
- MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond-1] end] -type ok -icon error
- } elseif {$cond3 != -1} {
- if {$cond2 != -1} {
- set VMDecoder::var(decodinfo) [string range $jp3dVM::dataout [expr $cond2-1] end]
- }
- MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond3-1] end] -type ok -icon info
- }
- }
-}
-
-proc VMDecoder::_save { frameinfo } {
-
-}
-
diff --git a/src/bin/jp3d/tcltk/encoder.tcl b/src/bin/jp3d/tcltk/encoder.tcl deleted file mode 100755 index 6c4a5083..00000000 --- a/src/bin/jp3d/tcltk/encoder.tcl +++ /dev/null @@ -1,470 +0,0 @@ - -namespace eval VMEncoder { - variable var - variable JP3Dencoder "../bin/bin/volume_to_jp3d" -} - -proc VMEncoder::create { nb } { - - set frame [$nb insert end VMEncoder -text "Encoder"] - set topf [frame $frame.topf] - set midf [frame $frame.midf] - set bottomf [frame $frame.bottomf] - set srcf [TitleFrame $topf.srcf -text "Source"] - set dstf [TitleFrame $topf.dstf -text "Destination"] - set Tparf [TitleFrame $midf.parfT -text "Transform Parameters"] - set Cparf [TitleFrame $midf.parfC -text "Coding Parameters"] - - set frame1 [$srcf getframe] - VMEncoder::_sourceE $frame1 - - set frame2 [$dstf getframe] - VMEncoder::_destinationE $frame2 - - set frame3 [$Tparf getframe] - VMEncoder::_transformE $frame3 - - set frame4 [$Cparf getframe] - VMEncoder::_codingE $frame4 - - set butE [Button $bottomf.butE -text "Encode!" \ - -command "VMEncoder::_encode $frame1 $frame2" \ - -helptext "Encoding trigger button"] - set butR [Button $bottomf.butR -text "Restore defaults" \ - -command "VMEncoder::_reset $frame1 $frame2 $frame3 $frame4" \ - -helptext "Reset to default values"] - - pack $srcf $dstf -side left -fill y -padx 4 -expand yes - pack $topf -pady 2 -fill x - - pack $Tparf $Cparf -side left -fill both -padx 4 -expand yes - pack $midf -pady 2 -fill x - - pack $butE $butR -side left -padx 40 -pady 5 -fill y -expand yes - pack $bottomf -pady 2 -fill x - - return $frame -} - -proc VMEncoder::_sourceE { parent } { - - variable var - - set labsrc [LabelFrame $parent.labsrc -text "Select volume file to encode: " -side top \ - -anchor w -relief flat -borderwidth 0] - set subsrc [$labsrc getframe] - set list [entry $subsrc.entrysrc -width 30 -textvariable VMDecoder::var(source)] - - set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0] - set subbrw [$labbrw getframe] - set butbrw [button $subbrw.butbrw -image [Bitmap::get open] \ - -relief raised -borderwidth 1 -padx 1 -pady 1 \ - -command "fileDialogE . $subsrc.entrysrc open"] - - pack $list -side top - pack $butbrw -side top - pack $labsrc $labbrw -side left -fill both -expand yes -} - -proc VMEncoder::_destinationE { parent } { - - variable var - - set labdst [LabelFrame $parent.labdst -text "Save compressed volume as: " -side top \ - -anchor w -relief flat -borderwidth 0] - set subdst [$labdst getframe] - set list [entry $subdst.entrydst -width 30 -textvariable VMDecoder::var(destination)] - - set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0] - set subbrw [$labbrw getframe] - set butbrw [button $subbrw.butbrw -image [Bitmap::get save] \ - -relief raised -borderwidth 1 -padx 1 -pady 1 \ - -command "fileDialogE . $subdst.entrydst save"] - - pack $list -side top - pack $butbrw -side top - pack $labdst $labbrw -side left -fill both -expand yes -} - -proc VMEncoder::_codingE { parent } { - - - ########### CODING ############# - set labcod [LabelFrame $parent.labcod -side top -anchor w -relief sunken -borderwidth 1] - set subcod [$labcod getframe] - - set framerate [frame $subcod.framerate -borderwidth 1] - set labrate [LabelEntry $framerate.labrate -label "Rates: " -labelwidth 9 -labelanchor w \ - -textvariable VMEncoder::var(rate) -editable 1 \ - -helptext "Compression ratios for different layers (R1, R2, R3,...). If R=1, lossless coding" ] - set VMEncoder::var(rate) "1" - - set framecblk [frame $subcod.framecblk -borderwidth 1] - set labcblk [LabelEntry $framecblk.labcblk -label "Codeblock: " -labelwidth 9 -labelanchor w \ - -textvariable VMEncoder::var(cblksize) -editable 1 \ - -helptext "Codeblock size (X, Y, Z)" ] - set VMEncoder::var(cblksize) "64,64,64" - - set frametile [frame $subcod.frametile -borderwidth 1] - set labtile [LabelEntry $frametile.labtile -label "Tile size: " -labelwidth 9 -labelanchor w \ - -textvariable VMEncoder::var(tilesize) -editable 1 \ - -helptext "Tile size (X, Y, Z)" ] - set VMEncoder::var(tilesize) "512,512,512" - - set framesop [frame $subcod.framesop -borderwidth 1] - set chksop [checkbutton $framesop.chksop -text "Write SOP marker" \ - -variable VMEncoder::var(sop) -onvalue 1 -offvalue 0 ] - set frameeph [frame $subcod.frameeph -borderwidth 1] - set chkeph [checkbutton $frameeph.chkeph -text "Write EPH marker" \ - -variable VMEncoder::var(eph) -onvalue 1 -offvalue 0 ] - - set framepoc [frame $subcod.framepoc -borderwidth 1] - set labpoc [label $framepoc.labpoc -text "Progression order: " ] - set progorder [ComboBox $framepoc.progorder \ - -text {Choose a progression order} \ - -width 10 \ - -textvariable VMEncoder::var(progorder) \ - -values {"LRCP" "RLCP" "RPCL" "PCRL" "CPRL"} \ - -helptext "Progression order"] - set VMEncoder::var(progorder) "LRCP" - - pack $labrate -side left -padx 2 -anchor n - pack $labcblk -side left -padx 2 -anchor n - pack $labpoc $progorder -side left -padx 2 -anchor w - #pack $labtile -side left -padx 2 -anchor n - pack $chksop -side left -padx 2 -anchor w - pack $chkeph -side left -padx 2 -anchor w - ########### ENTROPY CODING ############# - set labent [LabelFrame $parent.labent -text "Entropy Coding" -side top -anchor w -relief sunken -borderwidth 1] - set subent [$labent getframe] - foreach entval {2EB 3EB} entropy {2D_EBCOT 3D_EBCOT} { - set rad [radiobutton $subent.$entval \ - -text $entropy \ - -variable VMEncoder::var(encoding) \ - -command "disableGR $entval $labcblk $progorder $labrate $chksop $chkeph" \ - -value $entval ] - pack $rad -anchor w - } - $subent.2EB select - - pack $subent -padx 2 -anchor n - - pack $framerate $framecblk $framepoc $framesop $frameeph -side top -anchor w - pack $subcod -anchor n - - pack $labent $labcod -side left -fill both -padx 4 -expand yes - - -} - -proc VMEncoder::_transformE { parent } { - - variable var - - ########### TRANSFORM ############# - set labtrf [LabelFrame $parent.labtrf -text "Transform" -side top -anchor w -relief sunken -borderwidth 1] - set subtrf [$labtrf getframe] - set labres [LabelFrame $parent.labres -side top -anchor w -relief sunken -borderwidth 1] - set subres [$labres getframe] - - ########### ATK ############# - set frameatk [frame $subres.frameatk -borderwidth 1] - set labatk [label $frameatk.labatk -text "Wavelet kernel: " -anchor w] - set atk [ComboBox $frameatk.atk \ - -textvariable VMEncoder::var(atk) \ - -width 20 \ - -text {Choose a wavelet kernel} \ - -editable false \ - -values {"R5.3" "I9.7"} ] - set VMEncoder::var(atk) "R5.3" - pack $labatk $atk -side left -anchor w - ########### RESOLUTIONS ############# - set frameres1 [frame $subres.frameres1 -borderwidth 1] - set labresolution [label $frameres1.labresol -text "Resolutions: " -anchor w ] - set frameres2 [frame $subres.frameres2 -borderwidth 1] - set labresX [label $frameres2.labresX -text " X" -anchor w ] - set labresY [label $frameres2.labresY -text " Y" -anchor w ] - set labresZ [label $frameres2.labresZ -text " Z" -anchor w ] - - - set resX [SpinBox $frameres2.spinresX \ - -range {1 6 1} -textvariable VMEncoder::var(resX) \ - -helptext "Number of resolutions in X" \ - -width 3 \ - -editable false ] - set resY [SpinBox $frameres2.spinresY \ - -range {1 6 1} -textvariable VMEncoder::var(resY) \ - -helptext "Number of resolutions in Y" \ - -width 3 \ - -editable false ] - set resZ [SpinBox $frameres2.spinresZ \ - -range {1 6 1} -textvariable VMEncoder::var(resZ) \ - -helptext "Number of resolutions in Z" \ - -width 3 \ - -editable false \ - -state disabled ] - set VMEncoder::var(resX) 3 - set VMEncoder::var(resY) 3 - set VMEncoder::var(resZ) 3 - - ########### TRF ############# - foreach trfval {2DWT 3DWT} trf {2D-DWT 3D-DWT} { - set rad [radiobutton $subtrf.$trfval -text $trf \ - -variable VMEncoder::var(transform) \ - -command "disable3RLS $trfval $atk $resX $resY $resZ"\ - -value $trfval ] - pack $rad -anchor w - } - $subtrf.2DWT select - - pack $subtrf -side left -padx 2 -pady 4 - - pack $labresolution -padx 2 -side left -anchor w - pack $labresX $resX -padx 2 -side left -anchor w - pack $labresY $resY -padx 2 -side left -anchor w - pack $labresZ $resZ -padx 2 -side left -anchor w - - pack $frameres1 -side top -fill x - pack $frameres2 $frameatk -side top -padx 2 -pady 4 -anchor n - - pack $subres -side left -padx 2 -pady 4 - pack $labtrf $labres -side left -fill both -padx 4 -expand yes -} - - -proc VMEncoder::_encode { framesrc framedst } { - - variable var - - set source [$framesrc.labsrc.f.entrysrc get ] - set destination [$framedst.labdst.f.entrydst get ] - set cond1 [string match *.pgx [string tolower $source]] - set cond2 [string match *-*.pgx [string tolower $source]] - set cond3 [string match *.bin [string tolower $source]] - - set img ".img" - set pattern [string range $source 0 [expr [string length $source]-5]] - set pattern $pattern$img - set exist [file exists $pattern] - - #comprobamos datos son correctos - if {($cond1 == 1) && ($cond2 == 0)} { - MessageDlg .msgdlg -parent . -message "Info : Really want to encode an slice instead of a volume?.\n For a group of .pgx slices, name must contain a - denoting a sequential index!" -type ok -icon info - } - - if {$source == ""} { - MessageDlg .msgdlg -parent . -message "Error : Source file is not defined !" -type ok -icon error - } elseif {$destination == ""} { - MessageDlg .msgdlg -parent . -message "Error : Destination file is not defined !" -type ok -icon error - } elseif { ($VMEncoder::var(transform) != "3RLS") && ($VMEncoder::var(atk) == "Choose a wavelet transformation kernel") } { - MessageDlg .msgdlg -parent . -title "Info" -message "Please choose a wavelet transformation kernel"\ - -type ok -icon warning - } elseif {($exist == 0) && ($cond1 == 0) && ($cond3 == 1)} { - MessageDlg .msgdlg -parent . -message "Error : IMG file associated to BIN volume file not found in same directory !" -type ok -icon info - } else { - - #creamos datain a partir de los parametros de entrada -# set dirJP3Dencoder [mk_relativepath $VMEncoder::JP3Dencoder] - set dirJP3Dencoder $VMEncoder::JP3Dencoder - set datain [concat " $dirJP3Dencoder -i [mk_relativepath $source] "] - if {$cond3 == 1} { - set datain [concat " $datain -m [mk_relativepath $pattern] "] - } - set datain [concat " $datain -o [mk_relativepath $destination] "] - if {$VMEncoder::var(encoding) != "2EB"} { - set datain [concat " $datain -C $VMEncoder::var(encoding) "] - } - if {$VMEncoder::var(transform) == "2DWT"} { - set datain [concat " $datain -n $VMEncoder::var(resX),$VMEncoder::var(resY) "] - } elseif {$VMEncoder::var(transform) == "3DWT"} { - set datain [concat " $datain -n $VMEncoder::var(resX),$VMEncoder::var(resY),$VMEncoder::var(resZ) "] - } - - set datain [concat " $datain -r $VMEncoder::var(rate) "] - - if {$VMEncoder::var(atk) == "I9.7"} { - set datain [concat " $datain -I "] - } - if {$VMEncoder::var(sop) == 1} { - set datain [concat " $datain -SOP "] - } - if {$VMEncoder::var(eph) == 1} { - set datain [concat " $datain -EPH "] - } - if {$VMEncoder::var(progorder) != "LRCP"} { - set datain [concat " $datain -p $VMEncoder::var(progorder) "] - } - if {$VMEncoder::var(cblksize) != "64,64,64"} { - set datain [concat " $datain -b $VMEncoder::var(cblksize) "] - } - - - #Making this work would be great !!! - set VMEncoder::var(progval) 10 - ProgressDlg .progress -parent . -title "Wait..." \ - -type infinite \ - -width 20 \ - -textvariable "Compute in progress..."\ - -variable VMEncoder::progval \ - -stop "Stop" \ - -command {destroy .progress} - after 200 set VMEncoder::var(progval) 2 - set fp [open "| $datain " r+] - fconfigure $fp -buffering line - set jp3dVM::dataout [concat "EXECUTED PROGRAM:\n\t$datain"] - while {-1 != [gets $fp tmp]} { - set jp3dVM::dataout [concat "$jp3dVM::dataout\n$tmp"] - } - destroy .progress - set cond [string first "ERROR" $jp3dVM::dataout] - set cond2 [string first "RESULT" $jp3dVM::dataout] - if {$cond != -1} { - MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond-1] end] -type ok -icon error - } elseif {$cond2 != -1} { - MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond2+7] end] -type ok -icon info - close $fp - } else { - #Must do something with this !!! [pid $fp] - close $fp - } - } -} - -proc VMEncoder::_reset { framesrc framedst frametrf framecod} { - - variable var - - #Restore defaults values - set VMEncoder::var(transform) 2DWT - set VMEncoder::var(encoding) 2EB - set VMEncoder::var(atk) "R5.3" - set VMEncoder::var(progorder) "LRCP" - set atk $frametrf.labres.f.frameatk.atk - set resX $frametrf.labres.f.frameres2.spinresX - set resY $frametrf.labres.f.frameres2.spinresY - set resZ $frametrf.labres.f.frameres2.spinresZ - disable3RLS 2DWT $atk $resX $resY $resZ - set labcblk $framecod.labcod.f.framecblk.labcblk - set progorder $framecod.labcod.f.framepoc.progorder - set labrate $framecod.labcod.f.framerate.labrate - set chksop $framecod.labcod.f.framesop.chksop - set chkeph $framecod.labcod.f.frameeph.chkeph - disableGR 3EB $labcblk $progorder $labrate $chksop $chkeph - - $framesrc.labsrc.f.entrysrc delete 0 end - $framedst.labdst.f.entrydst delete 0 end -} - -proc fileDialogE {w ent operation} { - - variable file - variable i j - - if {$operation == "open"} { - set types { - {"Source Image Files" {.pgx .bin} } - {"All files" *} - } - set file [tk_getOpenFile -filetypes $types -parent $w] - if {[string compare $file ""]} { - $ent delete 0 end - $ent insert end $file - $ent xview moveto 1 - } - } else { - set types { - {"JP3D Files" {.jp3d} } - {"JPEG2000 Files" {.j2k} } - {"All files" *} - } - set file [tk_getSaveFile -filetypes $types -parent $w \ - -initialfile Untitled -defaultextension .jp3d] - if {[string compare $file ""]} { - $ent delete 0 end - $ent insert end $file - $ent xview moveto 1 - } - } -} - -proc mk_relativepath {abspath} { - - set mydir [split [string trimleft [pwd] {/}] {/}] - set abspathcomps [split [string trimleft $abspath {/}] {/}] - - set i 0 - while {$i<[llength $mydir]} { - if {![string compare [lindex $abspathcomps $i] [lindex $mydir $i]]} { - incr i - } else { - break - } - } - set h [expr [llength $mydir]-$i] - set j [expr [llength $abspathcomps]-$i] - - if {!$h} { - set relpath "./" - } else { - set relpath "" - while { $h > 0 } { - set relpath "../$relpath" - incr h -1 - } - } - - set h [llength $abspathcomps] - while { $h > $i } { - set relpath [concat $relpath[lindex $abspathcomps [expr [llength $abspathcomps]-$j]]/] - incr h -1 - incr j -1 - } - return [string trim $relpath {/}] -} - -proc disable3RLS {flag atk resX resY resZ} { - - if {$flag == "3RLS"} { - $atk configure -state disabled - $resX configure -state disabled - $resY configure -state disabled - $resZ configure -state disabled - } elseif {$flag == "2DWT"} { - $atk configure -state normal - $resX configure -state normal - $resY configure -state normal - $resZ configure -state disabled - } elseif {$flag == "3DWT"} { - $atk configure -state normal - $resX configure -state normal - $resY configure -state normal - $resZ configure -state normal - } -} - -proc disableGR {flag labcblk progorder labrate chksop chkeph} { - - if {$flag == "2EB"} { - $labcblk configure -state normal - $progorder configure -state normal - $labrate configure -state normal - $chksop configure -state normal - $chkeph configure -state normal - set VMEncoder::var(cblksize) "64,64,64" - set VMEncoder::var(tilesize) "512,512,512" - } elseif {$flag == "3EB"} { - $labcblk configure -state normal - $progorder configure -state normal - $labrate configure -state normal - $chksop configure -state normal - $chkeph configure -state normal - set VMEncoder::var(cblksize) "64,64,64" - set VMEncoder::var(tilesize) "512,512,512" - } else { - $labcblk configure -state disabled - $progorder configure -state disabled - $labrate configure -state disabled - $chksop configure -state disabled - $chkeph configure -state disabled - } -} diff --git a/src/bin/jp3d/tcltk/logoLPI.gif b/src/bin/jp3d/tcltk/logoLPI.gif Binary files differdeleted file mode 100755 index df795150..00000000 --- a/src/bin/jp3d/tcltk/logoLPI.gif +++ /dev/null diff --git a/src/bin/jp3d/windirent.h b/src/bin/jp3d/windirent.h deleted file mode 100644 index 4b1d9ff1..00000000 --- a/src/bin/jp3d/windirent.h +++ /dev/null @@ -1,679 +0,0 @@ -/* - * uce-dirent.h - operating system independent dirent implementation - * - * Copyright (C) 1998-2002 Toni Ronkko - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * ``Software''), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL TONI RONKKO BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * - * May 28 1998, Toni Ronkko <tronkko@messi.uku.fi> - * - * $Id: uce-dirent.h,v 1.7 2002/05/13 10:48:35 tr Exp $ - * - * $Log: uce-dirent.h,v $ - * Revision 1.7 2002/05/13 10:48:35 tr - * embedded some source code directly to the header so that no source - * modules need to be included in the MS Visual C project using the - * interface, removed all the dependencies to other headers of the `uce' - * library so that the header can be made public - * - * Revision 1.6 2002/04/12 16:22:04 tr - * Unified Compiling Environment (UCE) replaced `std' library - * - * Revision 1.5 2001/07/20 16:33:40 tr - * moved to `std' library and re-named defines accordingly - * - * Revision 1.4 2001/07/10 16:47:18 tronkko - * revised comments - * - * Revision 1.3 2001/01/11 13:16:43 tr - * using ``uce-machine.h'' for finding out defines such as `FREEBSD' - * - * Revision 1.2 2000/10/08 16:00:41 tr - * copy of FreeBSD man page - * - * Revision 1.1 2000/07/10 05:53:16 tr - * Initial revision - * - * Revision 1.2 1998/07/19 18:29:14 tr - * Added error reporting capabilities and some asserts. - * - * Revision 1.1 1998/07/04 16:27:51 tr - * Initial revision - * - * - * MSVC 1.0 scans automatic dependencies incorrectly when your project - * contains this very header. The problem is that MSVC cannot handle - * include directives inside #if..#endif block those are never entered. - * Since this header ought to compile in many different operating systems, - * there had to be several conditional blocks that are compiled only in - * operating systems for what they were designed for. MSVC 1.0 cannot - * handle inclusion of sys/dir.h in a part that is compiled only in Apollo - * operating system. To fix the problem you need to insert DIR.H into - * SYSINCL.DAT located in MSVC\BIN directory and restart visual C++. - * Consult manuals for more informaton about the problem. - * - * Since many UNIX systems have dirent.h we assume to have one also. - * However, if your UNIX system does not have dirent.h you can download one - * for example at: http://ftp.uni-mannheim.de/ftp/GNU/dirent/dirent.tar.gz. - * You can also see if you have one of dirent.h, direct.h, dir.h, ndir.h, - * sys/dir.h and sys/ndir.h somewhere. Try defining HAVE_DIRENT_H, - * HAVE_DIRECT_H, HAVE_DIR_H, HAVE_NDIR_H, HAVE_SYS_DIR_H and - * HAVE_SYS_NDIR_H according to the files found. - */ -#ifndef DIRENT_H -#define DIRENT_H -#define DIRENT_H_INCLUDED - -/* find out platform */ -#if defined(MSDOS) /* MS-DOS */ -#elif defined(__MSDOS__) /* Turbo C/Borland */ -# define MSDOS -#elif defined(__DOS__) /* Watcom */ -# define MSDOS -#endif - -#if defined(WIN32) /* MS-Windows */ -#elif defined(__NT__) /* Watcom */ -# define WIN32 -#elif defined(_WIN32) /* Microsoft */ -# define WIN32 -#elif defined(__WIN32__) /* Borland */ -# define WIN32 -#endif - -/* - * See what kind of dirent interface we have unless autoconf has already - * determinated that. - */ -#if !defined(HAVE_DIRENT_H) && !defined(HAVE_DIRECT_H) && !defined(HAVE_SYS_DIR_H) && !defined(HAVE_NDIR_H) && !defined(HAVE_SYS_NDIR_H) && !defined(HAVE_DIR_H) -# if defined(_MSC_VER) /* Microsoft C/C++ */ -/* no dirent.h */ -# elif defined(__MINGW32__) /* MinGW */ -/* no dirent.h */ -# elif defined(__BORLANDC__) /* Borland C/C++ */ -# define HAVE_DIRENT_H -# define VOID_CLOSEDIR -# elif defined(__TURBOC__) /* Borland Turbo C */ -/* no dirent.h */ -# elif defined(__WATCOMC__) /* Watcom C/C++ */ -# define HAVE_DIRECT_H -# elif defined(__apollo) /* Apollo */ -# define HAVE_SYS_DIR_H -# elif defined(__hpux) /* HP-UX */ -# define HAVE_DIRENT_H -# elif defined(__alpha) || defined(__alpha__) /* Alpha OSF1 */ -# error "not implemented" -# elif defined(__sgi) /* Silicon Graphics */ -# define HAVE_DIRENT_H -# elif defined(sun) || defined(_sun) /* Sun Solaris */ -# define HAVE_DIRENT_H -# elif defined(__FreeBSD__) /* FreeBSD */ -# define HAVE_DIRENT_H -# elif defined(__linux__) /* Linux */ -# define HAVE_DIRENT_H -# elif defined(__GNUC__) /* GNU C/C++ */ -# define HAVE_DIRENT_H -# else -# error "not implemented" -# endif -#endif - -/* include proper interface headers */ -#if defined(HAVE_DIRENT_H) -# include <dirent.h> -# ifdef FREEBSD -# define NAMLEN(dp) ((int)((dp)->d_namlen)) -# else -# define NAMLEN(dp) ((int)(strlen((dp)->d_name))) -# endif - -#elif defined(HAVE_NDIR_H) -# include <ndir.h> -# define NAMLEN(dp) ((int)((dp)->d_namlen)) - -#elif defined(HAVE_SYS_NDIR_H) -# include <sys/ndir.h> -# define NAMLEN(dp) ((int)((dp)->d_namlen)) - -#elif defined(HAVE_DIRECT_H) -# include <direct.h> -# define NAMLEN(dp) ((int)((dp)->d_namlen)) - -#elif defined(HAVE_DIR_H) -# include <dir.h> -# define NAMLEN(dp) ((int)((dp)->d_namlen)) - -#elif defined(HAVE_SYS_DIR_H) -# include <sys/types.h> -# include <sys/dir.h> -# ifndef dirent -# define dirent direct -# endif -# define NAMLEN(dp) ((int)((dp)->d_namlen)) - -#elif defined(MSDOS) || defined(WIN32) - -/* figure out type of underlaying directory interface to be used */ -# if defined(WIN32) -# define DIRENT_WIN32_INTERFACE -# elif defined(MSDOS) -# define DIRENT_MSDOS_INTERFACE -# else -# error "missing native dirent interface" -# endif - -/*** WIN32 specifics ***/ -# if defined(DIRENT_WIN32_INTERFACE) -# include <windows.h> -# if !defined(DIRENT_MAXNAMLEN) -# define DIRENT_MAXNAMLEN (MAX_PATH) -# endif - - -/*** MS-DOS specifics ***/ -# elif defined(DIRENT_MSDOS_INTERFACE) -# include <dos.h> - -/* Borland defines file length macros in dir.h */ -# if defined(__BORLANDC__) -# include <dir.h> -# if !defined(DIRENT_MAXNAMLEN) -# define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT)) -# endif -# if !defined(_find_t) -# define _find_t find_t -# endif - -/* Turbo C defines ffblk structure in dir.h */ -# elif defined(__TURBOC__) -# include <dir.h> -# if !defined(DIRENT_MAXNAMLEN) -# define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT)) -# endif -# define DIRENT_USE_FFBLK - -/* MSVC */ -# elif defined(_MSC_VER) -# if !defined(DIRENT_MAXNAMLEN) -# define DIRENT_MAXNAMLEN (12) -# endif - -/* Watcom */ -# elif defined(__WATCOMC__) -# if !defined(DIRENT_MAXNAMLEN) -# if defined(__OS2__) || defined(__NT__) -# define DIRENT_MAXNAMLEN (255) -# else -# define DIRENT_MAXNAMLEN (12) -# endif -# endif - -# endif -# endif - -/*** generic MS-DOS and MS-Windows stuff ***/ -# if !defined(NAME_MAX) && defined(DIRENT_MAXNAMLEN) -# define NAME_MAX DIRENT_MAXNAMLEN -# endif -# if NAME_MAX < DIRENT_MAXNAMLEN -# error "assertion failed: NAME_MAX >= DIRENT_MAXNAMLEN" -# endif - - -/* - * Substitute for real dirent structure. Note that `d_name' field is a - * true character array although we have it copied in the implementation - * dependent data. We could save some memory if we had declared `d_name' - * as a pointer referring the name within implementation dependent data. - * We have not done that since some code may rely on sizeof(d_name) to be - * something other than four. Besides, directory entries are typically so - * small that it takes virtually no time to copy them from place to place. - */ -typedef struct dirent { - char d_name[NAME_MAX + 1]; - - /*** Operating system specific part ***/ -# if defined(DIRENT_WIN32_INTERFACE) /*WIN32*/ - WIN32_FIND_DATA data; -# elif defined(DIRENT_MSDOS_INTERFACE) /*MSDOS*/ -# if defined(DIRENT_USE_FFBLK) - struct ffblk data; -# else - struct _find_t data; -# endif -# endif -} dirent; - -/* DIR substitute structure containing directory name. The name is - * essential for the operation of ``rewinndir'' function. */ -typedef struct DIR { - char *dirname; /* directory being scanned */ - dirent current; /* current entry */ - int dirent_filled; /* is current un-processed? */ - - /*** Operating system specific part ***/ -# if defined(DIRENT_WIN32_INTERFACE) - HANDLE search_handle; -# elif defined(DIRENT_MSDOS_INTERFACE) -# endif -} DIR; - -# ifdef __cplusplus -extern "C" { -# endif - -/* supply prototypes for dirent functions */ -static DIR *opendir(const char *dirname); -static struct dirent *readdir(DIR *dirp); -static int closedir(DIR *dirp); -static void rewinddir(DIR *dirp); - -/* - * Implement dirent interface as static functions so that the user does not - * need to change his project in any way to use dirent function. With this - * it is sufficient to include this very header from source modules using - * dirent functions and the functions will be pulled in automatically. - */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> -#include <errno.h> - -/* use ffblk instead of _find_t if requested */ -#if defined(DIRENT_USE_FFBLK) -# define _A_ARCH (FA_ARCH) -# define _A_HIDDEN (FA_HIDDEN) -# define _A_NORMAL (0) -# define _A_RDONLY (FA_RDONLY) -# define _A_SUBDIR (FA_DIREC) -# define _A_SYSTEM (FA_SYSTEM) -# define _A_VOLID (FA_LABEL) -# define _dos_findnext(dest) findnext(dest) -# define _dos_findfirst(name,flags,dest) findfirst(name,dest,flags) -#endif - -static int _initdir(DIR *p); -static const char *_getdirname(const struct dirent *dp); -static void _setdirname(struct DIR *dirp); - -/* - * <function name="opendir"> - * <intro>open directory stream for reading - * <syntax>DIR *opendir (const char *dirname); - * - * <desc>Open named directory stream for read and return pointer to the - * internal working area that is used for retrieving individual directory - * entries. The internal working area has no fields of your interest. - * - * <ret>Returns a pointer to the internal working area or NULL in case the - * directory stream could not be opened. Global `errno' variable will set - * in case of error as follows: - * - * <table> - * [EACESS |Permission denied. - * [EMFILE |Too many open files used by the process. - * [ENFILE |Too many open files in system. - * [ENOENT |Directory does not exist. - * [ENOMEM |Insufficient memory. - * [ENOTDIR |dirname does not refer to directory. This value is not - * reliable on MS-DOS and MS-Windows platforms. Many - * implementations return ENOENT even when the name refers to a - * file.] - * </table> - * </function> - */ -static DIR *opendir(const char *dirname) -{ - DIR *dirp; - assert(dirname != NULL); - - dirp = (DIR*)malloc(sizeof(struct DIR)); - if (dirp != NULL) { - char *p; - - /* allocate room for directory name */ - dirp->dirname = (char*) malloc(strlen(dirname) + 1 + strlen("\\*.*")); - if (dirp->dirname == NULL) { - /* failed to duplicate directory name. errno set by malloc() */ - free(dirp); - return NULL; - } - /* Copy directory name while appending directory separator and "*.*". - * Directory separator is not appended if the name already ends with - * drive or directory separator. Directory separator is assumed to be - * '/' or '\' and drive separator is assumed to be ':'. */ - strcpy(dirp->dirname, dirname); - p = strchr(dirp->dirname, '\0'); - if (dirp->dirname < p && - *(p - 1) != '\\' && *(p - 1) != '/' && *(p - 1) != ':') { - strcpy(p++, "\\"); - } -# ifdef DIRENT_WIN32_INTERFACE - strcpy(p, "*"); /*scan files with and without extension in win32*/ -# else - strcpy(p, "*.*"); /*scan files with and without extension in DOS*/ -# endif - - /* open stream */ - if (_initdir(dirp) == 0) { - /* initialization failed */ - free(dirp->dirname); - free(dirp); - return NULL; - } - } - return dirp; -} - - -/* - * <function name="readdir"> - * <intro>read a directory entry - * <syntax>struct dirent *readdir (DIR *dirp); - * - * <desc>Read individual directory entry and return pointer to a structure - * containing the name of the entry. Individual directory entries returned - * include normal files, sub-directories, pseudo-directories "." and ".." - * and also volume labels, hidden files and system files in MS-DOS and - * MS-Windows. You might want to use stat(2) function to determinate which - * one are you dealing with. Many dirent implementations already contain - * equivalent information in dirent structure but you cannot depend on - * this. - * - * The dirent structure contains several system dependent fields that - * generally have no interest to you. The only interesting one is char - * d_name[] that is also portable across different systems. The d_name - * field contains the name of the directory entry without leading path. - * While d_name is portable across different systems the actual storage - * capacity of d_name varies from system to system and there is no portable - * way to find out it at compile time as different systems define the - * capacity of d_name with different macros and some systems do not define - * capacity at all (besides actual declaration of the field). If you really - * need to find out storage capacity of d_name then you might want to try - * NAME_MAX macro. The NAME_MAX is defined in POSIX standard although - * there are many MS-DOS and MS-Windows implementations those do not define - * it. There are also systems that declare d_name as "char d_name[1]" and - * then allocate suitable amount of memory at run-time. Thanks to Alain - * Decamps (Alain.Decamps@advalvas.be) for pointing it out to me. - * - * This all leads to the fact that it is difficult to allocate space - * for the directory names when the very same program is being compiled on - * number of operating systems. Therefore I suggest that you always - * allocate space for directory names dynamically. - * - * <ret> - * Returns a pointer to a structure containing name of the directory entry - * in `d_name' field or NULL if there was an error. In case of an error the - * global `errno' variable will set as follows: - * - * <table> - * [EBADF |dir parameter refers to an invalid directory stream. This value - * is not set reliably on all implementations.] - * </table> - * </function> - */ -static struct dirent * -readdir(DIR *dirp) -{ - assert(dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return NULL; - } - -#if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle == INVALID_HANDLE_VALUE) { - /* directory stream was opened/rewound incorrectly or it ended normally */ - errno = EBADF; - return NULL; - } -#endif - - if (dirp->dirent_filled != 0) { - /* - * Directory entry has already been retrieved and there is no need to - * retrieve a new one. Directory entry will be retrieved in advance - * when the user calls readdir function for the first time. This is so - * because real dirent has separate functions for opening and reading - * the stream whereas Win32 and DOS dirents open the stream - * automatically when we retrieve the first file. Therefore, we have to - * save the first file when opening the stream and later we have to - * return the saved entry when the user tries to read the first entry. - */ - dirp->dirent_filled = 0; - } else { - /* fill in entry and return that */ -#if defined(DIRENT_WIN32_INTERFACE) - if (FindNextFile(dirp->search_handle, &dirp->current.data) == FALSE) { - /* Last file has been processed or an error occurred */ - FindClose(dirp->search_handle); - dirp->search_handle = INVALID_HANDLE_VALUE; - errno = ENOENT; - return NULL; - } - -# elif defined(DIRENT_MSDOS_INTERFACE) - if (_dos_findnext(&dirp->current.data) != 0) { - /* _dos_findnext and findnext will set errno to ENOENT when no - * more entries could be retrieved. */ - return NULL; - } -# endif - - _setdirname(dirp); - assert(dirp->dirent_filled == 0); - } - return &dirp->current; -} - - -/* - * <function name="closedir"> - * <intro>close directory stream. - * <syntax>int closedir (DIR *dirp); - * - * <desc>Close directory stream opened by the `opendir' function. Close of - * directory stream invalidates the DIR structure as well as previously read - * dirent entry. - * - * <ret>The function typically returns 0 on success and -1 on failure but - * the function may be declared to return void on same systems. At least - * Borland C/C++ and some UNIX implementations use void as a return type. - * The dirent wrapper tries to define VOID_CLOSEDIR whenever closedir is - * known to return nothing. The very same definition is made by the GNU - * autoconf if you happen to use it. - * - * The global `errno' variable will set to EBADF in case of error. - * </function> - */ -static int -closedir(DIR *dirp) -{ - int retcode = 0; - - /* make sure that dirp points to legal structure */ - assert(dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return -1; - } - - /* free directory name and search handles */ - if (dirp->dirname != NULL) { - free(dirp->dirname); - } - -#if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle != INVALID_HANDLE_VALUE) { - if (FindClose(dirp->search_handle) == FALSE) { - /* Unknown error */ - retcode = -1; - errno = EBADF; - } - } -#endif - - /* clear dirp structure to make sure that it cannot be used anymore*/ - memset(dirp, 0, sizeof(*dirp)); -# if defined(DIRENT_WIN32_INTERFACE) - dirp->search_handle = INVALID_HANDLE_VALUE; -# endif - - free(dirp); - return retcode; -} - - -/* - * <function name="rewinddir"> - * <intro>rewind directory stream to the beginning - * <syntax>void rewinddir (DIR *dirp); - * - * <desc>Rewind directory stream to the beginning so that the next call of - * readdir() returns the very first directory entry again. However, note - * that next call of readdir() may not return the same directory entry as it - * did in first time. The directory stream may have been affected by newly - * created files. - * - * Almost every dirent implementation ensure that rewinddir will update - * the directory stream to reflect any changes made to the directory entries - * since the previous ``opendir'' or ``rewinddir'' call. Keep an eye on - * this if your program depends on the feature. I know at least one dirent - * implementation where you are required to close and re-open the stream to - * see the changes. - * - * <ret>Returns nothing. If something went wrong while rewinding, you will - * notice it later when you try to retrieve the first directory entry. - */ -static void -rewinddir(DIR *dirp) -{ - /* make sure that dirp is legal */ - assert(dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return; - } - assert(dirp->dirname != NULL); - - /* close previous stream */ -#if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle != INVALID_HANDLE_VALUE) { - if (FindClose(dirp->search_handle) == FALSE) { - /* Unknown error */ - errno = EBADF; - } - } -#endif - - /* re-open previous stream */ - if (_initdir(dirp) == 0) { - /* initialization failed but we cannot deal with error. User will notice - * error later when she tries to retrieve first directory enty. */ - /*EMPTY*/; - } -} - - -/* - * Open native directory stream object and retrieve first file. - * Be sure to close previous stream before opening new one. - */ -static int -_initdir(DIR *dirp) -{ - assert(dirp != NULL); - assert(dirp->dirname != NULL); - dirp->dirent_filled = 0; - -# if defined(DIRENT_WIN32_INTERFACE) - /* Open stream and retrieve first file */ - dirp->search_handle = FindFirstFile(dirp->dirname, &dirp->current.data); - if (dirp->search_handle == INVALID_HANDLE_VALUE) { - /* something went wrong but we don't know what. GetLastError() could - * give us more information about the error, but then we should map - * the error code into errno. */ - errno = ENOENT; - return 0; - } - -# elif defined(DIRENT_MSDOS_INTERFACE) - if (_dos_findfirst(dirp->dirname, - _A_SUBDIR | _A_RDONLY | _A_ARCH | _A_SYSTEM | _A_HIDDEN, - &dirp->current.data) != 0) { - /* _dos_findfirst and findfirst will set errno to ENOENT when no - * more entries could be retrieved. */ - return 0; - } -# endif - - /* initialize DIR and it's first entry */ - _setdirname(dirp); - dirp->dirent_filled = 1; - return 1; -} - - -/* - * Return implementation dependent name of the current directory entry. - */ -static const char * -_getdirname(const struct dirent *dp) -{ -#if defined(DIRENT_WIN32_INTERFACE) - return dp->data.cFileName; - -#elif defined(DIRENT_USE_FFBLK) - return dp->data.ff_name; - -#else - return dp->data.name; -#endif -} - - -/* - * Copy name of implementation dependent directory entry to the d_name field. - */ -static void -_setdirname(struct DIR *dirp) -{ - /* make sure that d_name is long enough */ - assert(strlen(_getdirname(&dirp->current)) <= NAME_MAX); - - strncpy(dirp->current.d_name, - _getdirname(&dirp->current), - NAME_MAX); - dirp->current.d_name[NAME_MAX] = '\0'; /*char d_name[NAME_MAX+1]*/ -} - -# ifdef __cplusplus -} -# endif -# define NAMLEN(dp) ((int)(strlen((dp)->d_name))) - -#else -# error "missing dirent interface" -#endif - - -#endif /*DIRENT_H*/ diff --git a/src/bin/jpwl/CMakeLists.txt b/src/bin/jpwl/CMakeLists.txt deleted file mode 100644 index 5df225de..00000000 --- a/src/bin/jpwl/CMakeLists.txt +++ /dev/null @@ -1,62 +0,0 @@ -# jpwl apps - -# First thing define the common source: -set(common_SRCS - convert.c - index.c - ${OPENJPEG_SOURCE_DIR}/src/bin/common/color.c - ${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_getopt.c - ) - -# Headers file are located here: -include_directories( - ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h - ${OPENJPEG_BINARY_DIR}/src/bin/common # opj_apps_config.h - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2 - ${OPENJPEG_SOURCE_DIR}/src/bin/common - ${LCMS_INCLUDE_DIRNAME} - ${Z_INCLUDE_DIRNAME} - ${PNG_INCLUDE_DIRNAME} - ${TIFF_INCLUDE_DIRNAME} - ) - -if(WIN32) - if(BUILD_SHARED_LIBS) - add_definitions(-DOPJ_EXPORTS) - else() - add_definitions(-DOPJ_STATIC) - endif() -endif() - -add_definitions(-DOPJ_USE_LEGACY) -foreach(exe decompress compress) - set(jpwl_exe opj_jpwl_${exe}) - set(jp2_exe opj_${exe}) - add_executable(${jpwl_exe} - #../jp2/${jp2_exe}.c - ${jpwl_exe}.c - ${common_SRCS} - ) - set_property( - TARGET ${jpwl_exe} - APPEND PROPERTY COMPILE_DEFINITIONS USE_JPWL - ) - - target_link_libraries(${jpwl_exe} openjpwl - ${LCMS_LIBNAME} ${PNG_LIBNAME} ${TIFF_LIBNAME}) - - # To support universal exe: - if(ZLIB_FOUND AND APPLE) - target_link_libraries(${jpwl_exe} z) - else(ZLIB_FOUND AND APPLE) - target_link_libraries(${jpwl_exe} ${Z_LIBNAME}) - endif() - - if(UNIX) - target_link_libraries(${jpwl_exe} m) - endif() - - install(TARGETS ${jpwl_exe} - DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications - ) -endforeach() diff --git a/src/bin/jpwl/convert.c b/src/bin/jpwl/convert.c deleted file mode 100644 index b7fb5b5c..00000000 --- a/src/bin/jpwl/convert.c +++ /dev/null @@ -1,3771 +0,0 @@ -/* - * 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 - * Copyright (c) 2003-2014, Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2006-2007, Parvatha Elangovan - * 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 "opj_apps_config.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <limits.h> - -#ifdef OPJ_HAVE_LIBTIFF -#include <tiffio.h> -#endif /* OPJ_HAVE_LIBTIFF */ - -#ifdef OPJ_HAVE_LIBPNG -#include <zlib.h> -#include <png.h> -#endif /* OPJ_HAVE_LIBPNG */ - -#include "openjpeg.h" -#include "convert.h" - -/* - * Get logarithm of an integer and round downwards. - * - * log2(a) - */ -static int int_floorlog2(int a) -{ - int l; - for (l = 0; a > 1; l++) { - a >>= 1; - } - return l; -} - -/* -->> -->> -->> -->> - - TGA IMAGE FORMAT - - <<-- <<-- <<-- <<-- */ - -#ifdef INFORMATION_ONLY -/* TGA header definition. */ -struct tga_header { - unsigned char id_length; /* Image id field length */ - unsigned char colour_map_type; /* Colour map type */ - unsigned char image_type; /* Image type */ - /* - ** Colour map specification - */ - unsigned short colour_map_index; /* First entry index */ - unsigned short colour_map_length; /* Colour map length */ - unsigned char colour_map_entry_size; /* Colour map entry size */ - /* - ** Image specification - */ - unsigned short x_origin; /* x origin of image */ - unsigned short y_origin; /* u origin of image */ - unsigned short image_width; /* Image width */ - unsigned short image_height; /* Image height */ - unsigned char pixel_depth; /* Pixel depth */ - unsigned char image_desc; /* Image descriptor */ -}; -#endif /* INFORMATION_ONLY */ - -static unsigned short get_ushort(unsigned short val) -{ - -#ifdef OPJ_BIG_ENDIAN - return (((val & 0xff) << 8) + (val >> 8)); -#else - return (val); -#endif - -} - -#define TGA_HEADER_SIZE 18 - -static int tga_readheader(FILE *fp, unsigned int *bits_per_pixel, - unsigned int *width, unsigned int *height, int *flip_image) -{ - int palette_size; - unsigned char *tga ; - unsigned char id_len, cmap_type, image_type; - unsigned char pixel_depth, image_desc; - unsigned short cmap_index, cmap_len, cmap_entry_size; - unsigned short x_origin, y_origin, image_w, image_h; - - if (!bits_per_pixel || !width || !height || !flip_image) { - return 0; - } - tga = (unsigned char*)malloc(18); - - if (fread(tga, TGA_HEADER_SIZE, 1, fp) != 1) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - free(tga); - return 0 ; - } - id_len = (unsigned char)tga[0]; - cmap_type = (unsigned char)tga[1]; - image_type = (unsigned char)tga[2]; - cmap_index = get_ushort(*(unsigned short*)(&tga[3])); - cmap_len = get_ushort(*(unsigned short*)(&tga[5])); - cmap_entry_size = (unsigned char)tga[7]; - - - x_origin = get_ushort(*(unsigned short*)(&tga[8])); - y_origin = get_ushort(*(unsigned short*)(&tga[10])); - image_w = get_ushort(*(unsigned short*)(&tga[12])); - image_h = get_ushort(*(unsigned short*)(&tga[14])); - pixel_depth = (unsigned char)tga[16]; - image_desc = (unsigned char)tga[17]; - - free(tga); - - *bits_per_pixel = (unsigned int)pixel_depth; - *width = (unsigned int)image_w; - *height = (unsigned int)image_h; - - /* Ignore tga identifier, if present ... */ - if (id_len) { - unsigned char *id = (unsigned char *) malloc(id_len); - if (!fread(id, id_len, 1, fp)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - free(id); - return 0 ; - } - free(id); - } - - /* Test for compressed formats ... not yet supported ... - // Note :- 9 - RLE encoded palettized. - // 10 - RLE encoded RGB. */ - if (image_type > 8) { - fprintf(stderr, "Sorry, compressed tga files are not currently supported.\n"); - return 0 ; - } - - *flip_image = !(image_desc & 32); - - /* Palettized formats are not yet supported, skip over the palette, if present ... */ - palette_size = cmap_len * (cmap_entry_size / 8); - - if (palette_size > 0) { - fprintf(stderr, "File contains a palette - not yet supported."); - fseek(fp, palette_size, SEEK_CUR); - } - return 1; -} - -#ifdef OPJ_BIG_ENDIAN - -static inline uint16_t swap16(uint16_t x) -{ - return (((x & 0x00ffU) << 8) | ((x & 0xff00U) >> 8)); -} - -#endif - -static int tga_writeheader(FILE *fp, int bits_per_pixel, int width, int height, - opj_bool flip_image) -{ - unsigned short image_w, image_h, us0; - unsigned char uc0, image_type; - unsigned char pixel_depth, image_desc; - - if (!bits_per_pixel || !width || !height) { - return 0; - } - - pixel_depth = 0; - - if (bits_per_pixel < 256) { - pixel_depth = (unsigned char)bits_per_pixel; - } else { - fprintf(stderr, "ERROR: Wrong bits per pixel inside tga_header"); - return 0; - } - uc0 = 0; - - if (fwrite(&uc0, 1, 1, fp) != 1) { - goto fails; /* id_length */ - } - if (fwrite(&uc0, 1, 1, fp) != 1) { - goto fails; /* colour_map_type */ - } - - image_type = 2; /* Uncompressed. */ - if (fwrite(&image_type, 1, 1, fp) != 1) { - goto fails; - } - - us0 = 0; - if (fwrite(&us0, 2, 1, fp) != 1) { - goto fails; /* colour_map_index */ - } - if (fwrite(&us0, 2, 1, fp) != 1) { - goto fails; /* colour_map_length */ - } - if (fwrite(&uc0, 1, 1, fp) != 1) { - goto fails; /* colour_map_entry_size */ - } - - if (fwrite(&us0, 2, 1, fp) != 1) { - goto fails; /* x_origin */ - } - if (fwrite(&us0, 2, 1, fp) != 1) { - goto fails; /* y_origin */ - } - - image_w = (unsigned short)width; - image_h = (unsigned short) height; - -#ifndef OPJ_BIG_ENDIAN - if (fwrite(&image_w, 2, 1, fp) != 1) { - goto fails; - } - if (fwrite(&image_h, 2, 1, fp) != 1) { - goto fails; - } -#else - image_w = swap16(image_w); - image_h = swap16(image_h); - if (fwrite(&image_w, 2, 1, fp) != 1) { - goto fails; - } - if (fwrite(&image_h, 2, 1, fp) != 1) { - goto fails; - } -#endif - - if (fwrite(&pixel_depth, 1, 1, fp) != 1) { - goto fails; - } - - image_desc = 8; /* 8 bits per component. */ - - if (flip_image) { - image_desc |= 32; - } - if (fwrite(&image_desc, 1, 1, fp) != 1) { - goto fails; - } - - return 1; - -fails: - fputs("\nwrite_tgaheader: write ERROR\n", stderr); - return 0; -} - -opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters) -{ - FILE *f; - opj_image_t *image; - unsigned int image_width, image_height, pixel_bit_depth; - unsigned int x, y; - int flip_image = 0; - opj_image_cmptparm_t cmptparm[4]; /* maximum 4 components */ - int numcomps; - OPJ_COLOR_SPACE color_space; - opj_bool mono ; - opj_bool save_alpha; - int subsampling_dx, subsampling_dy; - int i; - - f = fopen(filename, "rb"); - if (!f) { - fprintf(stderr, "Failed to open %s for reading !!\n", filename); - return 0; - } - - if (!tga_readheader(f, &pixel_bit_depth, &image_width, &image_height, - &flip_image)) { - return NULL; - } - - /* We currently only support 24 & 32 bit tga's ... */ - if (!((pixel_bit_depth == 24) || (pixel_bit_depth == 32))) { - return NULL; - } - - /* initialize image components */ - memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t)); - - mono = (pixel_bit_depth == 8) || - (pixel_bit_depth == 16); /* Mono with & without alpha. */ - save_alpha = (pixel_bit_depth == 16) || - (pixel_bit_depth == 32); /* Mono with alpha, or RGB with alpha */ - - if (mono) { - color_space = CLRSPC_GRAY; - numcomps = save_alpha ? 2 : 1; - } else { - numcomps = save_alpha ? 4 : 3; - color_space = CLRSPC_SRGB; - } - - subsampling_dx = parameters->subsampling_dx; - subsampling_dy = parameters->subsampling_dy; - - for (i = 0; i < numcomps; i++) { - cmptparm[i].prec = 8; - cmptparm[i].bpp = 8; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = subsampling_dx; - cmptparm[i].dy = subsampling_dy; - cmptparm[i].w = image_width; - cmptparm[i].h = image_height; - } - - /* create the image */ - image = opj_image_create(numcomps, &cmptparm[0], color_space); - - if (!image) { - return NULL; - } - - /* set image offset and reference grid */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = !image->x0 ? (image_width - 1) * subsampling_dx + 1 : image->x0 + - (image_width - 1) * subsampling_dx + 1; - image->y1 = !image->y0 ? (image_height - 1) * subsampling_dy + 1 : image->y0 + - (image_height - 1) * subsampling_dy + 1; - - /* set image data */ - for (y = 0; y < image_height; y++) { - int index; - - if (flip_image) { - index = (image_height - y - 1) * image_width; - } else { - index = y * image_width; - } - - if (numcomps == 3) { - for (x = 0; x < image_width; x++) { - unsigned char r, g, b; - - if (!fread(&b, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if (!fread(&g, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if (!fread(&r, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - - image->comps[0].data[index] = r; - image->comps[1].data[index] = g; - image->comps[2].data[index] = b; - index++; - } - } else if (numcomps == 4) { - for (x = 0; x < image_width; x++) { - unsigned char r, g, b, a; - if (!fread(&b, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if (!fread(&g, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if (!fread(&r, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - if (!fread(&a, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - opj_image_destroy(image); - return NULL; - } - - image->comps[0].data[index] = r; - image->comps[1].data[index] = g; - image->comps[2].data[index] = b; - image->comps[3].data[index] = a; - index++; - } - } else { - fprintf(stderr, "Currently unsupported bit depth : %s\n", filename); - } - } - return image; -} - -int imagetotga(opj_image_t * image, const char *outfile) -{ - int width, height, bpp, x, y; - opj_bool write_alpha; - int i, adjustR, adjustG = 0, adjustB = 0; - unsigned int alpha_channel; - float r, g, b, a; - unsigned char value; - float scale; - FILE *fdest; - size_t res; - - fdest = fopen(outfile, "wb"); - if (!fdest) { - fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); - return 1; - } - - for (i = 0; i < image->numcomps - 1; i++) { - if ((image->comps[0].dx != image->comps[i + 1].dx) - || (image->comps[0].dy != image->comps[i + 1].dy) - || (image->comps[0].prec != image->comps[i + 1].prec)) { - fprintf(stderr, - "Unable to create a tga file with such J2K image charateristics."); - fclose(fdest); - return 1; - } - } - - width = image->comps[0].w; - height = image->comps[0].h; - - /* Mono with alpha, or RGB with alpha. */ - write_alpha = (image->numcomps == 2) || (image->numcomps == 4); - - /* Write TGA header */ - bpp = write_alpha ? 32 : 24; - if (!tga_writeheader(fdest, bpp, width, height, OPJ_TRUE)) { - fclose(fdest); - return 1; - } - - alpha_channel = image->numcomps - 1; - - scale = 255.0f / (float)((1 << image->comps[0].prec) - 1); - - adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); - if (image->numcomps >= 3) { - adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); - adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); - } - - for (y = 0; y < height; y++) { - unsigned int index = y * width; - - for (x = 0; x < width; x++, index++) { - r = (float)(image->comps[0].data[index] + adjustR); - - if (image->numcomps > 2) { - g = (float)(image->comps[1].data[index] + adjustG); - b = (float)(image->comps[2].data[index] + adjustB); - } else { /* Greyscale ... */ - g = r; - b = r; - } - - /* TGA format writes BGR ... */ - value = (unsigned char)(b * scale); - res = fwrite(&value, 1, 1, fdest); - if (res < 1) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - fclose(fdest); - return 1; - } - - value = (unsigned char)(g * scale); - res = fwrite(&value, 1, 1, fdest); - if (res < 1) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - fclose(fdest); - return 1; - } - - value = (unsigned char)(r * scale); - res = fwrite(&value, 1, 1, fdest); - if (res < 1) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - fclose(fdest); - return 1; - } - - if (write_alpha) { - a = (float)(image->comps[alpha_channel].data[index]); - value = (unsigned char)(a * scale); - res = fwrite(&value, 1, 1, fdest); - if (res < 1) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - fclose(fdest); - return 1; - } - } - } - } - - fclose(fdest); - - return 0; -} - -/* -->> -->> -->> -->> - - BMP IMAGE FORMAT - - <<-- <<-- <<-- <<-- */ - -/* WORD defines a two byte word */ -typedef unsigned short int WORD; - -/* DWORD defines a four byte word */ -typedef unsigned int DWORD; - -typedef struct { - WORD bfType; /* 'BM' for Bitmap (19776) */ - DWORD bfSize; /* Size of the file */ - WORD bfReserved1; /* Reserved : 0 */ - WORD bfReserved2; /* Reserved : 0 */ - DWORD bfOffBits; /* Offset */ -} BITMAPFILEHEADER_t; - -typedef struct { - DWORD biSize; /* Size of the structure in bytes */ - DWORD biWidth; /* Width of the image in pixels */ - DWORD biHeight; /* Height of the image in pixels */ - WORD biPlanes; /* 1 */ - WORD biBitCount; /* Number of color bits by pixels */ - DWORD biCompression; /* Type of encoding 0: none 1: RLE8 2: RLE4 */ - DWORD biSizeImage; /* Size of the image in bytes */ - DWORD biXpelsPerMeter; /* Horizontal (X) resolution in pixels/meter */ - DWORD biYpelsPerMeter; /* Vertical (Y) resolution in pixels/meter */ - DWORD biClrUsed; /* Number of color used in the image (0: ALL) */ - DWORD biClrImportant; /* Number of important color (0: ALL) */ -} BITMAPINFOHEADER_t; - -opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters) -{ - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - - int i, numcomps, w, h; - OPJ_COLOR_SPACE color_space; - opj_image_cmptparm_t cmptparm[3]; /* maximum of 3 components */ - opj_image_t * image = NULL; - - FILE *IN; - BITMAPFILEHEADER_t File_h; - BITMAPINFOHEADER_t Info_h; - unsigned char *RGB; - unsigned char *table_R, *table_G, *table_B; - unsigned int j, PAD = 0; - - int x, y, index; - int gray_scale = 1; - int has_color; - DWORD W, H; - - IN = fopen(filename, "rb"); - if (!IN) { - fprintf(stderr, "Failed to open %s for reading !!\n", filename); - return NULL; - } - - File_h.bfType = getc(IN); - File_h.bfType = (getc(IN) << 8) + File_h.bfType; - - if (File_h.bfType != 19778) { - fprintf(stderr, "Error, not a BMP file!\n"); - fclose(IN); - return NULL; - } - /* FILE HEADER */ - /* ------------- */ - File_h.bfSize = getc(IN); - File_h.bfSize = (getc(IN) << 8) + File_h.bfSize; - File_h.bfSize = (getc(IN) << 16) + File_h.bfSize; - File_h.bfSize = (getc(IN) << 24) + File_h.bfSize; - - File_h.bfReserved1 = getc(IN); - File_h.bfReserved1 = (getc(IN) << 8) + File_h.bfReserved1; - - File_h.bfReserved2 = getc(IN); - File_h.bfReserved2 = (getc(IN) << 8) + File_h.bfReserved2; - - File_h.bfOffBits = getc(IN); - File_h.bfOffBits = (getc(IN) << 8) + File_h.bfOffBits; - File_h.bfOffBits = (getc(IN) << 16) + File_h.bfOffBits; - File_h.bfOffBits = (getc(IN) << 24) + File_h.bfOffBits; - - /* INFO HEADER */ - /* ------------- */ - - Info_h.biSize = getc(IN); - Info_h.biSize = (getc(IN) << 8) + Info_h.biSize; - Info_h.biSize = (getc(IN) << 16) + Info_h.biSize; - Info_h.biSize = (getc(IN) << 24) + Info_h.biSize; - - if (Info_h.biSize != 40) { - fprintf(stderr, "Error, unknown BMP header size %d\n", Info_h.biSize); - fclose(IN); - return NULL; - } - Info_h.biWidth = getc(IN); - Info_h.biWidth = (getc(IN) << 8) + Info_h.biWidth; - Info_h.biWidth = (getc(IN) << 16) + Info_h.biWidth; - Info_h.biWidth = (getc(IN) << 24) + Info_h.biWidth; - w = Info_h.biWidth; - - Info_h.biHeight = getc(IN); - Info_h.biHeight = (getc(IN) << 8) + Info_h.biHeight; - Info_h.biHeight = (getc(IN) << 16) + Info_h.biHeight; - Info_h.biHeight = (getc(IN) << 24) + Info_h.biHeight; - h = Info_h.biHeight; - - Info_h.biPlanes = getc(IN); - Info_h.biPlanes = (getc(IN) << 8) + Info_h.biPlanes; - - Info_h.biBitCount = getc(IN); - Info_h.biBitCount = (getc(IN) << 8) + Info_h.biBitCount; - - Info_h.biCompression = getc(IN); - Info_h.biCompression = (getc(IN) << 8) + Info_h.biCompression; - Info_h.biCompression = (getc(IN) << 16) + Info_h.biCompression; - Info_h.biCompression = (getc(IN) << 24) + Info_h.biCompression; - - Info_h.biSizeImage = getc(IN); - Info_h.biSizeImage = (getc(IN) << 8) + Info_h.biSizeImage; - Info_h.biSizeImage = (getc(IN) << 16) + Info_h.biSizeImage; - Info_h.biSizeImage = (getc(IN) << 24) + Info_h.biSizeImage; - - Info_h.biXpelsPerMeter = getc(IN); - Info_h.biXpelsPerMeter = (getc(IN) << 8) + Info_h.biXpelsPerMeter; - Info_h.biXpelsPerMeter = (getc(IN) << 16) + Info_h.biXpelsPerMeter; - Info_h.biXpelsPerMeter = (getc(IN) << 24) + Info_h.biXpelsPerMeter; - - Info_h.biYpelsPerMeter = getc(IN); - Info_h.biYpelsPerMeter = (getc(IN) << 8) + Info_h.biYpelsPerMeter; - Info_h.biYpelsPerMeter = (getc(IN) << 16) + Info_h.biYpelsPerMeter; - Info_h.biYpelsPerMeter = (getc(IN) << 24) + Info_h.biYpelsPerMeter; - - Info_h.biClrUsed = getc(IN); - Info_h.biClrUsed = (getc(IN) << 8) + Info_h.biClrUsed; - Info_h.biClrUsed = (getc(IN) << 16) + Info_h.biClrUsed; - Info_h.biClrUsed = (getc(IN) << 24) + Info_h.biClrUsed; - - Info_h.biClrImportant = getc(IN); - Info_h.biClrImportant = (getc(IN) << 8) + Info_h.biClrImportant; - Info_h.biClrImportant = (getc(IN) << 16) + Info_h.biClrImportant; - Info_h.biClrImportant = (getc(IN) << 24) + Info_h.biClrImportant; - - /* Read the data and store them in the OUT file */ - - if (Info_h.biBitCount == 24) { - numcomps = 3; - color_space = CLRSPC_SRGB; - /* initialize image components */ - memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); - for (i = 0; i < numcomps; i++) { - cmptparm[i].prec = 8; - cmptparm[i].bpp = 8; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = subsampling_dx; - cmptparm[i].dy = subsampling_dy; - cmptparm[i].w = w; - cmptparm[i].h = h; - } - /* create the image */ - image = opj_image_create(numcomps, &cmptparm[0], color_space); - if (!image) { - fclose(IN); - return NULL; - } - - /* set image offset and reference grid */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + - (w - 1) * subsampling_dx + 1; - image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + - (h - 1) * subsampling_dy + 1; - - /* set image data */ - - /* Place the cursor at the beginning of the image information */ - fseek(IN, 0, SEEK_SET); - fseek(IN, File_h.bfOffBits, SEEK_SET); - - W = Info_h.biWidth; - H = Info_h.biHeight; - - /* PAD = 4 - (3 * W) % 4; */ - /* PAD = (PAD == 4) ? 0 : PAD; */ - PAD = (3 * W) % 4 ? 4 - (3 * W) % 4 : 0; - - RGB = (unsigned char *) - malloc((3 * W + PAD) * H * sizeof(unsigned char)); - - if (fread(RGB, sizeof(unsigned char), (3 * W + PAD) * H, - IN) != (3 * W + PAD) * H) { - fclose(IN); - free(RGB); - opj_image_destroy(image); - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - return NULL; - } - - index = 0; - - for (y = 0; y < (int)H; y++) { - unsigned char *scanline = RGB + (3 * W + PAD) * (H - 1 - y); - for (x = 0; x < (int)W; x++) { - unsigned char *pixel = &scanline[3 * x]; - image->comps[0].data[index] = pixel[2]; /* R */ - image->comps[1].data[index] = pixel[1]; /* G */ - image->comps[2].data[index] = pixel[0]; /* B */ - index++; - } - } - free(RGB); - }/* if (Info_h.biBitCount == 24) */ - else if (Info_h.biBitCount == 8 && Info_h.biCompression == 0) { /*RGB */ - if (Info_h.biClrUsed == 0) { - Info_h.biClrUsed = 256; - } else if (Info_h.biClrUsed > 256) { - Info_h.biClrUsed = 256; - } - - table_R = (unsigned char *) malloc(256 * sizeof(unsigned char)); - table_G = (unsigned char *) malloc(256 * sizeof(unsigned char)); - table_B = (unsigned char *) malloc(256 * sizeof(unsigned char)); - - has_color = 0; - for (j = 0; j < Info_h.biClrUsed; j++) { - table_B[j] = (unsigned char)getc(IN); - table_G[j] = (unsigned char)getc(IN); - table_R[j] = (unsigned char)getc(IN); - getc(IN); - has_color += - !(table_R[j] == table_G[j] && table_R[j] == table_B[j]); - } - if (has_color) { - gray_scale = 0; - } - - /* Place the cursor at the beginning of the image information */ - fseek(IN, 0, SEEK_SET); - fseek(IN, File_h.bfOffBits, SEEK_SET); - - W = Info_h.biWidth; - H = Info_h.biHeight; - if (Info_h.biWidth % 2) { - W++; - } - - numcomps = gray_scale ? 1 : 3; - color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB; - /* initialize image components */ - memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); - for (i = 0; i < numcomps; i++) { - cmptparm[i].prec = 8; - cmptparm[i].bpp = 8; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = subsampling_dx; - cmptparm[i].dy = subsampling_dy; - cmptparm[i].w = w; - cmptparm[i].h = h; - } - /* create the image */ - image = opj_image_create(numcomps, &cmptparm[0], color_space); - if (!image) { - fclose(IN); - free(table_R); - free(table_G); - free(table_B); - return NULL; - } - - /* set image offset and reference grid */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + - (w - 1) * subsampling_dx + 1; - image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + - (h - 1) * subsampling_dy + 1; - - /* set image data */ - - RGB = (unsigned char *) malloc(W * H * sizeof(unsigned char)); - - if (fread(RGB, sizeof(unsigned char), W * H, IN) != W * H) { - fclose(IN); - free(table_R); - free(table_G); - free(table_B); - free(RGB); - opj_image_destroy(image); - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - return NULL; - } - if (gray_scale) { - index = 0; - for (j = 0; j < W * H; j++) { - if ((j % W < W - 1 && Info_h.biWidth % 2) || !(Info_h.biWidth % 2)) { - image->comps[0].data[index] = - table_R[RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]]; - index++; - } - } - - } else { - index = 0; - for (j = 0; j < W * H; j++) { - if ((j % W < W - 1 && Info_h.biWidth % 2) - || !(Info_h.biWidth % 2)) { - unsigned char pixel_index = - RGB[W * H - ((j) / (W) + 1) * W + (j) % (W)]; - image->comps[0].data[index] = table_R[pixel_index]; - image->comps[1].data[index] = table_G[pixel_index]; - image->comps[2].data[index] = table_B[pixel_index]; - index++; - } - } - } - free(RGB); - free(table_R); - free(table_G); - free(table_B); - }/* RGB8 */ - else if (Info_h.biBitCount == 8 && Info_h.biCompression == 1) { /*RLE8*/ - unsigned char *pix, *beyond; - int *gray, *red, *green, *blue; - unsigned int x, y, max; - int i, c, c1; - unsigned char uc; - - if (Info_h.biClrUsed == 0) { - Info_h.biClrUsed = 256; - } else if (Info_h.biClrUsed > 256) { - Info_h.biClrUsed = 256; - } - - table_R = (unsigned char *) malloc(256 * sizeof(unsigned char)); - table_G = (unsigned char *) malloc(256 * sizeof(unsigned char)); - table_B = (unsigned char *) malloc(256 * sizeof(unsigned char)); - - has_color = 0; - for (j = 0; j < Info_h.biClrUsed; j++) { - table_B[j] = (unsigned char)getc(IN); - table_G[j] = (unsigned char)getc(IN); - table_R[j] = (unsigned char)getc(IN); - getc(IN); - has_color += !(table_R[j] == table_G[j] && table_R[j] == table_B[j]); - } - - if (has_color) { - gray_scale = 0; - } - - numcomps = gray_scale ? 1 : 3; - color_space = gray_scale ? CLRSPC_GRAY : CLRSPC_SRGB; - /* initialize image components */ - memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t)); - for (i = 0; i < numcomps; i++) { - cmptparm[i].prec = 8; - cmptparm[i].bpp = 8; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = subsampling_dx; - cmptparm[i].dy = subsampling_dy; - cmptparm[i].w = w; - cmptparm[i].h = h; - } - /* create the image */ - image = opj_image_create(numcomps, &cmptparm[0], color_space); - if (!image) { - fclose(IN); - free(table_R); - free(table_G); - free(table_B); - return NULL; - } - - /* set image offset and reference grid */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : image->x0 + (w - - 1) * subsampling_dx + 1; - image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : image->y0 + (h - - 1) * subsampling_dy + 1; - - /* set image data */ - - /* Place the cursor at the beginning of the image information */ - fseek(IN, 0, SEEK_SET); - fseek(IN, File_h.bfOffBits, SEEK_SET); - - W = Info_h.biWidth; - H = Info_h.biHeight; - RGB = (unsigned char *) calloc(1, W * H * sizeof(unsigned char)); - beyond = RGB + W * H; - pix = beyond - W; - x = y = 0; - - while (y < H) { - c = getc(IN); - - if (c) { - c1 = getc(IN); - - for (i = 0; i < c && x < W && pix < beyond; i++, x++, pix++) { - *pix = (unsigned char)c1; - } - } else { - c = getc(IN); - - if (c == 0x00) { /* EOL */ - x = 0; - ++y; - pix = RGB + x + (H - y - 1) * W; - } else if (c == 0x01) { /* EOP */ - break; - } else if (c == 0x02) { /* MOVE by dxdy */ - c = getc(IN); - x += c; - c = getc(IN); - y += c; - pix = RGB + (H - y - 1) * W + x; - } else { /* 03 .. 255 */ - i = 0; - for (; i < c && x < W && pix < beyond; i++, x++, pix++) { - c1 = getc(IN); - *pix = (unsigned char)c1; - } - if (c & 1) { /* skip padding byte */ - getc(IN); - } - } - } - }/* while() */ - - if (gray_scale) { - gray = image->comps[0].data; - pix = RGB; - max = W * H; - - while (max--) { - uc = *pix++; - - *gray++ = table_R[uc]; - } - } else { - /*int *red, *green, *blue;*/ - - red = image->comps[0].data; - green = image->comps[1].data; - blue = image->comps[2].data; - pix = RGB; - max = W * H; - - while (max--) { - uc = *pix++; - - *red++ = table_R[uc]; - *green++ = table_G[uc]; - *blue++ = table_B[uc]; - } - } - free(RGB); - free(table_R); - free(table_G); - free(table_B); - }/* RLE8 */ - else { - fprintf(stderr, - "Other system than 24 bits/pixels or 8 bits (no RLE coding) " - "is not yet implemented [%d]\n", Info_h.biBitCount); - } - fclose(IN); - return image; -} - -int imagetobmp(opj_image_t * image, const char *outfile) -{ - int w, h; - int i, pad; - FILE *fdest = NULL; - int adjustR, adjustG, adjustB; - - if (image->comps[0].prec < 8) { - fprintf(stderr, "Unsupported precision: %d\n", image->comps[0].prec); - return 1; - } - if (image->numcomps >= 3 && image->comps[0].dx == image->comps[1].dx - && image->comps[1].dx == image->comps[2].dx - && image->comps[0].dy == image->comps[1].dy - && image->comps[1].dy == image->comps[2].dy - && image->comps[0].prec == image->comps[1].prec - && image->comps[1].prec == image->comps[2].prec) { - - /* -->> -->> -->> -->> - 24 bits color - <<-- <<-- <<-- <<-- */ - - fdest = fopen(outfile, "wb"); - if (!fdest) { - fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); - return 1; - } - - w = image->comps[0].w; - h = image->comps[0].h; - - fprintf(fdest, "BM"); - - /* FILE HEADER */ - /* ------------- */ - fprintf(fdest, "%c%c%c%c", - (unsigned char)(h * w * 3 + 3 * h * (w % 2) + 54) & 0xff, - (unsigned char)((h * w * 3 + 3 * h * (w % 2) + 54) >> 8) & 0xff, - (unsigned char)((h * w * 3 + 3 * h * (w % 2) + 54) >> 16) & 0xff, - (unsigned char)((h * w * 3 + 3 * h * (w % 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(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, ((40) >> 16) & 0xff, - ((40) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (unsigned char)((w) & 0xff), - (unsigned char)((w) >> 8) & 0xff, - (unsigned char)((w) >> 16) & 0xff, - (unsigned char)((w) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (unsigned char)((h) & 0xff), - (unsigned char)((h) >> 8) & 0xff, - (unsigned char)((h) >> 16) & 0xff, - (unsigned char)((h) >> 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 * h * w + 3 * h * (w % 2)) & 0xff, - (unsigned char)((h * w * 3 + 3 * h * (w % 2)) >> 8) & 0xff, - (unsigned char)((h * w * 3 + 3 * h * (w % 2)) >> 16) & 0xff, - (unsigned char)((h * w * 3 + 3 * h * (w % 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); - - if (image->comps[0].prec > 8) { - adjustR = image->comps[0].prec - 8; - printf("BMP CONVERSION: Truncating component 0 from %d bits to 8 bits\n", - image->comps[0].prec); - } else { - adjustR = 0; - } - if (image->comps[1].prec > 8) { - adjustG = image->comps[1].prec - 8; - printf("BMP CONVERSION: Truncating component 1 from %d bits to 8 bits\n", - image->comps[1].prec); - } else { - adjustG = 0; - } - if (image->comps[2].prec > 8) { - adjustB = image->comps[2].prec - 8; - printf("BMP CONVERSION: Truncating component 2 from %d bits to 8 bits\n", - image->comps[2].prec); - } else { - adjustB = 0; - } - - for (i = 0; i < w * h; i++) { - unsigned char rc, gc, bc; - int r, g, b; - - r = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; - r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); - r = ((r >> adjustR) + ((r >> (adjustR - 1)) % 2)); - if (r > 255) { - r = 255; - } else if (r < 0) { - r = 0; - } - rc = (unsigned char)r; - - g = image->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; - g += (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); - g = ((g >> adjustG) + ((g >> (adjustG - 1)) % 2)); - if (g > 255) { - g = 255; - } else if (g < 0) { - g = 0; - } - gc = (unsigned char)g; - - b = image->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; - b += (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); - b = ((b >> adjustB) + ((b >> (adjustB - 1)) % 2)); - if (b > 255) { - b = 255; - } else if (b < 0) { - b = 0; - } - bc = (unsigned char)b; - - fprintf(fdest, "%c%c%c", bc, gc, rc); - - if ((i + 1) % w == 0) { - for (pad = (3 * w) % 4 ? 4 - (3 * w) % 4 : 0; pad > 0; pad--) { /* ADD */ - fprintf(fdest, "%c", 0); - } - } - } - fclose(fdest); - } else { /* Gray-scale */ - - /* -->> -->> -->> -->> - 8 bits non code (Gray scale) - <<-- <<-- <<-- <<-- */ - - fdest = fopen(outfile, "wb"); - w = image->comps[0].w; - h = image->comps[0].h; - - fprintf(fdest, "BM"); - - /* FILE HEADER */ - /* ------------- */ - fprintf(fdest, "%c%c%c%c", - (unsigned char)(h * w + 54 + 1024 + h * (w % 2)) & 0xff, - (unsigned char)((h * w + 54 + 1024 + h * (w % 2)) >> 8) & 0xff, - (unsigned char)((h * w + 54 + 1024 + h * (w % 2)) >> 16) & 0xff, - (unsigned char)((h * w + 54 + 1024 + w * (w % 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(fdest, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff, ((40) >> 16) & 0xff, - ((40) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (unsigned char)((w) & 0xff), - (unsigned char)((w) >> 8) & 0xff, - (unsigned char)((w) >> 16) & 0xff, - (unsigned char)((w) >> 24) & 0xff); - fprintf(fdest, "%c%c%c%c", (unsigned char)((h) & 0xff), - (unsigned char)((h) >> 8) & 0xff, - (unsigned char)((h) >> 16) & 0xff, - (unsigned char)((h) >> 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)(h * w + h * (w % 2)) & 0xff, - (unsigned char)((h * w + h * (w % 2)) >> 8) & 0xff, - (unsigned char)((h * w + h * (w % 2)) >> 16) & 0xff, - (unsigned char)((h * w + h * (w % 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); - - if (image->comps[0].prec > 8) { - adjustR = image->comps[0].prec - 8; - printf("BMP CONVERSION: Truncating component 0 from %d bits to 8 bits\n", - image->comps[0].prec); - } else { - adjustR = 0; - } - - for (i = 0; i < 256; i++) { - fprintf(fdest, "%c%c%c%c", i, i, i, 0); - } - - for (i = 0; i < w * h; i++) { - int r; - - r = image->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)]; - r += (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); - r = ((r >> adjustR) + ((r >> (adjustR - 1)) % 2)); - if (r > 255) { - r = 255; - } else if (r < 0) { - r = 0; - } - - fprintf(fdest, "%c", (unsigned char)r); - - if ((i + 1) % w == 0) { - for (pad = w % 4 ? 4 - w % 4 : 0; pad > 0; pad--) { /* ADD */ - fprintf(fdest, "%c", 0); - } - } - } - fclose(fdest); - } - - return 0; -} - -/* -->> -->> -->> -->> - -PGX IMAGE FORMAT - -<<-- <<-- <<-- <<-- */ - - -static unsigned char readuchar(FILE * f) -{ - unsigned char c1; - if (!fread(&c1, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - return c1; -} - -static unsigned short readushort(FILE * f, int bigendian) -{ - unsigned char c1, c2; - if (!fread(&c1, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - if (!fread(&c2, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - if (bigendian) { - return (c1 << 8) + c2; - } else { - return (c2 << 8) + c1; - } -} - -static unsigned int readuint(FILE * f, int bigendian) -{ - unsigned char c1, c2, c3, c4; - if (!fread(&c1, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - if (!fread(&c2, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - if (!fread(&c3, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - if (!fread(&c4, 1, 1, f)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - return 0; - } - if (bigendian) { - return (c1 << 24) + (c2 << 16) + (c3 << 8) + c4; - } else { - return (c4 << 24) + (c3 << 16) + (c2 << 8) + c1; - } -} - -opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters) -{ - FILE *f = NULL; - int w, h, prec; - int i, numcomps, max; - OPJ_COLOR_SPACE color_space; - opj_image_cmptparm_t cmptparm; /* maximum of 1 component */ - opj_image_t * image = NULL; - int adjustS, ushift, dshift, force8; - - char endian1, endian2, sign; - char signtmp[32]; - - char temp[32]; - int bigendian; - opj_image_comp_t *comp = NULL; - - numcomps = 1; - color_space = CLRSPC_GRAY; - - memset(&cmptparm, 0, sizeof(opj_image_cmptparm_t)); - - max = 0; - - f = fopen(filename, "rb"); - if (!f) { - fprintf(stderr, "Failed to open %s for reading !\n", filename); - return NULL; - } - - fseek(f, 0, SEEK_SET); - if (fscanf(f, "PG%31[ \t]%c%c%31[ \t+-]%d%31[ \t]%d%31[ \t]%d", temp, &endian1, - &endian2, signtmp, &prec, temp, &w, temp, &h) != 9) { - fprintf(stderr, - "ERROR: Failed to read the right number of element from the fscanf() function!\n"); - fclose(f); - return NULL; - } - - i = 0; - sign = '+'; - while (signtmp[i] != '\0') { - if (signtmp[i] == '-') { - sign = '-'; - } - i++; - } - - fgetc(f); - if (endian1 == 'M' && endian2 == 'L') { - bigendian = 1; - } else if (endian2 == 'M' && endian1 == 'L') { - bigendian = 0; - } else { - fprintf(stderr, "Bad pgx header, please check input file\n"); - fclose(f); - return NULL; - } - - /* initialize image component */ - - cmptparm.x0 = parameters->image_offset_x0; - cmptparm.y0 = parameters->image_offset_y0; - cmptparm.w = !cmptparm.x0 ? (w - 1) * parameters->subsampling_dx + 1 : - cmptparm.x0 + (w - 1) * parameters->subsampling_dx + 1; - cmptparm.h = !cmptparm.y0 ? (h - 1) * parameters->subsampling_dy + 1 : - cmptparm.y0 + (h - 1) * parameters->subsampling_dy + 1; - - if (sign == '-') { - cmptparm.sgnd = 1; - } else { - cmptparm.sgnd = 0; - } - if (prec < 8) { - force8 = 1; - ushift = 8 - prec; - dshift = prec - ushift; - if (cmptparm.sgnd) { - adjustS = (1 << (prec - 1)); - } else { - adjustS = 0; - } - cmptparm.sgnd = 0; - prec = 8; - } else { - ushift = dshift = force8 = adjustS = 0; - } - - cmptparm.prec = prec; - cmptparm.bpp = prec; - cmptparm.dx = parameters->subsampling_dx; - cmptparm.dy = parameters->subsampling_dy; - - /* create the image */ - image = opj_image_create(numcomps, &cmptparm, color_space); - if (!image) { - fclose(f); - return NULL; - } - /* set image offset and reference grid */ - image->x0 = cmptparm.x0; - image->y0 = cmptparm.x0; - image->x1 = cmptparm.w; - image->y1 = cmptparm.h; - - /* set image data */ - - comp = &image->comps[0]; - - for (i = 0; i < w * h; i++) { - int v; - if (force8) { - v = readuchar(f) + adjustS; - v = (v << ushift) + (v >> dshift); - comp->data[i] = (unsigned char)v; - - if (v > max) { - max = v; - } - - continue; - } - if (comp->prec == 8) { - if (!comp->sgnd) { - v = readuchar(f); - } else { - v = (char) readuchar(f); - } - } else if (comp->prec <= 16) { - if (!comp->sgnd) { - v = readushort(f, bigendian); - } else { - v = (short) readushort(f, bigendian); - } - } else { - if (!comp->sgnd) { - v = readuint(f, bigendian); - } else { - v = (int) readuint(f, bigendian); - } - } - if (v > max) { - max = v; - } - comp->data[i] = v; - } - fclose(f); - comp->bpp = int_floorlog2(max) + 1; - - return image; -} - -int imagetopgx(opj_image_t * image, const char *outfile) -{ - int w, h; - int i, j, compno; - FILE *fdest = NULL; - - for (compno = 0; compno < image->numcomps; compno++) { - opj_image_comp_t *comp = &image->comps[compno]; - char bname[256]; /* buffer for name */ - char *name = bname; /* pointer */ - int nbytes = 0; - size_t res; - const size_t olen = strlen(outfile); - const size_t dotpos = olen - 4; - const size_t total = dotpos + 1 + 1 + 4; /* '-' + '[1-3]' + '.pgx' */ - if (olen < 4 || outfile[dotpos] != '.') { - /* `pgx` was recognized but there is no dot at expected position */ - fprintf(stderr, "ERROR -> Impossible happen."); - return 1; - } - if (total > 256) { - name = (char*)malloc(total + 1); - } - strncpy(name, outfile, dotpos); - /*if (image->numcomps > 1) {*/ - sprintf(name + dotpos, "_%d.pgx", compno); - /*} else { - strcpy(name+dotpos, ".pgx"); - }*/ - fdest = fopen(name, "wb"); - if (!fdest) { - fprintf(stderr, "ERROR -> failed to open %s for writing\n", name); - free(name); - return 1; - } - /* don't need name anymore */ - if (total > 256) { - free(name); - } - - w = image->comps[compno].w; - h = image->comps[compno].h; - - fprintf(fdest, "PG ML %c %d %d %d\n", comp->sgnd ? '-' : '+', comp->prec, w, h); - if (comp->prec <= 8) { - nbytes = 1; - } else if (comp->prec <= 16) { - nbytes = 2; - } else { - nbytes = 4; - } - for (i = 0; i < w * h; i++) { - int v = image->comps[compno].data[i]; - for (j = nbytes - 1; j >= 0; j--) { - char byte = (char)(v >> (j * 8)); - res = fwrite(&byte, 1, 1, fdest); - if (res < 1) { - fprintf(stderr, "failed to write 1 byte for %s\n", name); - fclose(fdest); - return 1; - } - } - } - fclose(fdest); - } - - return 0; -} - -/* -->> -->> -->> -->> - -PNM IMAGE FORMAT - -<<-- <<-- <<-- <<-- */ - -struct pnm_header { - int width, height, maxval, depth, format; - char rgb, rgba, gray, graya, bw; - char ok; -}; - -static char *skip_white(char *s) -{ - while (*s) { - if (*s == '\n' || *s == '\r') { - return NULL; - } - if (isspace(*s)) { - ++s; - continue; - } - return s; - } - return NULL; -} - -static char *skip_int(char *start, int *out_n) -{ - char *s; - char c; - - *out_n = 0; - s = start; - - s = skip_white(start); - if (s == NULL) { - return NULL; - } - start = s; - - while (*s) { - if (!isdigit(*s)) { - break; - } - ++s; - } - c = *s; - *s = 0; - *out_n = atoi(start); - *s = c; - return s; -} - -static char *skip_idf(char *start, char out_idf[256]) -{ - char *s; - char c; - - s = skip_white(start); - if (s == NULL) { - return NULL; - } - start = s; - - while (*s) { - if (isalpha(*s) || *s == '_') { - ++s; - continue; - } - break; - } - c = *s; - *s = 0; - strncpy(out_idf, start, 255); - *s = c; - return s; -} - -static void read_pnm_header(FILE *reader, struct pnm_header *ph) -{ - char *s; - int format, have_wh, end, ttype; - char idf[256], type[256]; - char line[256]; - - if (fgets(line, 250, reader) == NULL) { - fprintf(stderr, "\nWARNING: fgets return a NULL value"); - return; - } - - if (line[0] != 'P') { - fprintf(stderr, "read_pnm_header:PNM:magic P missing\n"); - return; - } - format = atoi(line + 1); - if (format < 1 || format > 7) { - fprintf(stderr, "read_pnm_header:magic format %d invalid\n", format); - return; - } - ph->format = format; - ttype = end = have_wh = 0; - - while (fgets(line, 250, reader)) { - if (*line == '#') { - continue; - } - - s = line; - - if (format == 7) { - s = skip_idf(s, idf); - - if (s == NULL || *s == 0) { - return; - } - - if (strcmp(idf, "ENDHDR") == 0) { - end = 1; - break; - } - if (strcmp(idf, "WIDTH") == 0) { - s = skip_int(s, &ph->width); - if (s == NULL || *s == 0) { - return; - } - - continue; - } - if (strcmp(idf, "HEIGHT") == 0) { - s = skip_int(s, &ph->height); - if (s == NULL || *s == 0) { - return; - } - - continue; - } - if (strcmp(idf, "DEPTH") == 0) { - s = skip_int(s, &ph->depth); - if (s == NULL || *s == 0) { - return; - } - - continue; - } - if (strcmp(idf, "MAXVAL") == 0) { - s = skip_int(s, &ph->maxval); - if (s == NULL || *s == 0) { - return; - } - - continue; - } - if (strcmp(idf, "TUPLTYPE") == 0) { - s = skip_idf(s, type); - if (s == NULL || *s == 0) { - return; - } - - if (strcmp(type, "BLACKANDWHITE") == 0) { - ph->bw = 1; - ttype = 1; - continue; - } - if (strcmp(type, "GRAYSCALE") == 0) { - ph->gray = 1; - ttype = 1; - continue; - } - if (strcmp(type, "GRAYSCALE_ALPHA") == 0) { - ph->graya = 1; - ttype = 1; - continue; - } - if (strcmp(type, "RGB") == 0) { - ph->rgb = 1; - ttype = 1; - continue; - } - if (strcmp(type, "RGB_ALPHA") == 0) { - ph->rgba = 1; - ttype = 1; - continue; - } - fprintf(stderr, "read_pnm_header:unknown P7 TUPLTYPE %s\n", type); - return; - } - fprintf(stderr, "read_pnm_header:unknown P7 idf %s\n", idf); - return; - } /* if(format == 7) */ - - if (!have_wh) { - s = skip_int(s, &ph->width); - - s = skip_int(s, &ph->height); - - have_wh = 1; - - if (format == 1 || format == 4) { - break; - } - - continue; - } - if (format == 2 || format == 3 || format == 5 || format == 6) { - /* P2, P3, P5, P6: */ - s = skip_int(s, &ph->maxval); - - if (ph->maxval > 65535) { - return; - } - } - break; - }/* while(fgets( ) */ - if (format == 2 || format == 3 || format > 4) { - if (ph->maxval < 1 || ph->maxval > 65535) { - return; - } - } - if (ph->width < 1 || ph->height < 1) { - return; - } - - if (format == 7) { - if (!end) { - fprintf(stderr, "read_pnm_header:P7 without ENDHDR\n"); - return; - } - if (ph->depth < 1 || ph->depth > 4) { - return; - } - - if (ph->width && ph->height && ph->depth & ph->maxval && ttype) { - ph->ok = 1; - } - } else { - if (format != 1 && format != 4) { - if (ph->width && ph->height && ph->maxval) { - ph->ok = 1; - } - } else { - if (ph->width && ph->height) { - ph->ok = 1; - } - ph->maxval = 255; - } - } -} - -static int has_prec(int val) -{ - if (val < 2) { - return 1; - } - if (val < 4) { - return 2; - } - if (val < 8) { - return 3; - } - if (val < 16) { - return 4; - } - if (val < 32) { - return 5; - } - if (val < 64) { - return 6; - } - if (val < 128) { - return 7; - } - if (val < 256) { - return 8; - } - if (val < 512) { - return 9; - } - if (val < 1024) { - return 10; - } - if (val < 2048) { - return 11; - } - if (val < 4096) { - return 12; - } - if (val < 8192) { - return 13; - } - if (val < 16384) { - return 14; - } - if (val < 32768) { - return 15; - } - return 16; -} - -opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters) -{ - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - - FILE *fp = NULL; - int i, compno, numcomps, w, h, prec, format; - OPJ_COLOR_SPACE color_space; - opj_image_cmptparm_t cmptparm[4]; /* RGBA: max. 4 components */ - opj_image_t * image = NULL; - struct pnm_header header_info; - - if ((fp = fopen(filename, "rb")) == NULL) { - fprintf(stderr, "pnmtoimage:Failed to open %s for reading!\n", filename); - return NULL; - } - memset(&header_info, 0, sizeof(struct pnm_header)); - - read_pnm_header(fp, &header_info); - - if (!header_info.ok) { - fclose(fp); - return NULL; - } - - /* This limitation could be removed by making sure to use size_t below */ - if (header_info.height != 0 && - header_info.width > INT_MAX / header_info.height) { - fprintf(stderr, "pnmtoimage:Image %dx%d too big!\n", - header_info.width, header_info.height); - fclose(fp); - return NULL; - } - - format = header_info.format; - - switch (format) { - case 1: /* ascii bitmap */ - case 4: /* raw bitmap */ - numcomps = 1; - break; - - case 2: /* ascii greymap */ - case 5: /* raw greymap */ - numcomps = 1; - break; - - case 3: /* ascii pixmap */ - case 6: /* raw pixmap */ - numcomps = 3; - break; - - case 7: /* arbitrary map */ - numcomps = header_info.depth; - break; - - default: - fclose(fp); - return NULL; - } - if (numcomps < 3) { - color_space = CLRSPC_GRAY; /* GRAY, GRAYA */ - } else { - color_space = CLRSPC_SRGB; /* RGB, RGBA */ - } - - prec = has_prec(header_info.maxval); - - if (prec < 8) { - prec = 8; - } - - w = header_info.width; - h = header_info.height; - subsampling_dx = parameters->subsampling_dx; - subsampling_dy = parameters->subsampling_dy; - - memset(&cmptparm[0], 0, numcomps * sizeof(opj_image_cmptparm_t)); - - for (i = 0; i < numcomps; i++) { - cmptparm[i].prec = prec; - cmptparm[i].bpp = prec; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = subsampling_dx; - cmptparm[i].dy = subsampling_dy; - cmptparm[i].w = w; - cmptparm[i].h = h; - } - image = opj_image_create(numcomps, &cmptparm[0], color_space); - - if (!image) { - fclose(fp); - return NULL; - } - - /* set image offset and reference grid */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = parameters->image_offset_x0 + (w - 1) * subsampling_dx + 1; - image->y1 = parameters->image_offset_y0 + (h - 1) * subsampling_dy + 1; - - if ((format == 2) || (format == 3)) { /* ascii pixmap */ - unsigned int index; - - for (i = 0; i < w * h; i++) { - for (compno = 0; compno < numcomps; compno++) { - index = 0; - if (fscanf(fp, "%u", &index) != 1) { - fprintf(stderr, - "\nWARNING: fscanf return a number of element different from the expected.\n"); - } - - image->comps[compno].data[i] = (index * 255) / header_info.maxval; - } - } - } else if ((format == 5) - || (format == 6) - || ((format == 7) - && (header_info.gray || header_info.graya - || header_info.rgb || header_info.rgba))) { /* binary pixmap */ - unsigned char c0, c1, one; - - one = (prec < 9); - - for (i = 0; i < w * h; i++) { - for (compno = 0; compno < numcomps; compno++) { - if (!fread(&c0, 1, 1, fp)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - } - if (one) { - image->comps[compno].data[i] = c0; - } else { - if (!fread(&c1, 1, 1, fp)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - } - /* netpbm: */ - image->comps[compno].data[i] = ((c0 << 8) | c1); - } - } - } - } else if (format == 1) { /* ascii bitmap */ - for (i = 0; i < w * h; i++) { - unsigned int index; - - if (fscanf(fp, "%u", &index) != 1) { - fprintf(stderr, - "\nWARNING: fscanf return a number of element different from the expected.\n"); - } - - image->comps[0].data[i] = (index ? 0 : 255); - } - } else if (format == 4) { - int x, y, bit; - unsigned char uc; - - i = 0; - for (y = 0; y < h; ++y) { - bit = -1; - uc = 0; - - for (x = 0; x < w; ++x) { - if (bit == -1) { - bit = 7; - uc = (unsigned char)getc(fp); - } - image->comps[0].data[i] = (((uc >> bit) & 1) ? 0 : 255); - --bit; - ++i; - } - } - } else if ((format == 7 && header_info.bw)) { /*MONO*/ - unsigned char uc; - - for (i = 0; i < w * h; ++i) { - if (!fread(&uc, 1, 1, fp)) { - fprintf(stderr, - "\nError: fread return a number of element different from the expected.\n"); - } - image->comps[0].data[i] = (uc & 1) ? 0 : 255; - } - } - fclose(fp); - - return image; -}/* pnmtoimage() */ - -int imagetopnm(opj_image_t * image, const char *outfile) -{ - int *red, *green, *blue, *alpha; - int wr, hr, max; - int i, compno, ncomp; - int adjustR, adjustG, adjustB, adjustA; - int fails, two, want_gray, has_alpha, triple; - int prec, v; - FILE *fdest = NULL; - const char *tmp = outfile; - char *destname; - alpha = NULL; - if ((prec = image->comps[0].prec) > 16) { - fprintf(stderr, "%s:%d:imagetopnm\n\tprecision %d is larger than 16" - "\n\t: refused.\n", __FILE__, __LINE__, prec); - return 1; - } - two = has_alpha = 0; - fails = 1; - ncomp = image->numcomps; - - while (*tmp) { - ++tmp; - } - tmp -= 2; - want_gray = (*tmp == 'g' || *tmp == 'G'); - ncomp = image->numcomps; - - if (want_gray) { - ncomp = 1; - } - - if (ncomp == 2 /* GRAYA */ - || (ncomp > 2 /* RGB, RGBA */ - && image->comps[0].dx == image->comps[1].dx - && image->comps[1].dx == image->comps[2].dx - && image->comps[0].dy == image->comps[1].dy - && image->comps[1].dy == image->comps[2].dy - && image->comps[0].prec == image->comps[1].prec - && image->comps[1].prec == image->comps[2].prec - )) { - fdest = fopen(outfile, "wb"); - - if (!fdest) { - fprintf(stderr, "ERROR -> failed to open %s for writing\n", outfile); - return fails; - } - two = (prec > 8); - triple = (ncomp > 2); - wr = image->comps[0].w; - hr = image->comps[0].h; - max = (1 << prec) - 1; - has_alpha = (ncomp == 4 || ncomp == 2); - - red = image->comps[0].data; - - if (triple) { - green = image->comps[1].data; - blue = image->comps[2].data; - } else { - green = blue = NULL; - } - - if (has_alpha) { - const char *tt = (triple ? "RGB_ALPHA" : "GRAYSCALE_ALPHA"); - - fprintf(fdest, "P7\n# OpenJPEG-%s\nWIDTH %d\nHEIGHT %d\nDEPTH %d\n" - "MAXVAL %d\nTUPLTYPE %s\nENDHDR\n", opj_version(), - wr, hr, ncomp, max, tt); - alpha = image->comps[ncomp - 1].data; - adjustA = (image->comps[ncomp - 1].sgnd ? - 1 << (image->comps[ncomp - 1].prec - 1) : 0); - } else { - fprintf(fdest, "P6\n# OpenJPEG-%s\n%d %d\n%d\n", - opj_version(), wr, hr, max); - adjustA = 0; - } - adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); - - if (triple) { - adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); - adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); - } else { - adjustG = adjustB = 0; - } - - for (i = 0; i < wr * hr; ++i) { - if (two) { - v = *red + adjustR; - ++red; - /* netpbm: */ - fprintf(fdest, "%c%c", (unsigned char)(v >> 8), (unsigned char)v); - - if (triple) { - v = *green + adjustG; - ++green; - /* netpbm: */ - fprintf(fdest, "%c%c", (unsigned char)(v >> 8), (unsigned char)v); - - v = *blue + adjustB; - ++blue; - /* netpbm: */ - fprintf(fdest, "%c%c", (unsigned char)(v >> 8), (unsigned char)v); - - }/* if(triple) */ - - if (has_alpha) { - v = *alpha + adjustA; - ++alpha; - /* netpbm: */ - fprintf(fdest, "%c%c", (unsigned char)(v >> 8), (unsigned char)v); - } - continue; - - } /* if(two) */ - - /* prec <= 8: */ - - fprintf(fdest, "%c", (unsigned char)*red++); - if (triple) { - fprintf(fdest, "%c%c", (unsigned char)*green++, (unsigned char)*blue++); - } - - if (has_alpha) { - fprintf(fdest, "%c", (unsigned char)*alpha++); - } - - } /* for(i */ - - fclose(fdest); - return 0; - } - - /* YUV or MONO: */ - - if (image->numcomps > ncomp) { - fprintf(stderr, "WARNING -> [PGM file] Only the first component\n"); - fprintf(stderr, " is written to the file\n"); - } - destname = (char*)malloc(strlen(outfile) + 8); - - for (compno = 0; compno < ncomp; compno++) { - if (ncomp > 1) { - sprintf(destname, "%d.%s", compno, outfile); - } else { - sprintf(destname, "%s", outfile); - } - - fdest = fopen(destname, "wb"); - if (!fdest) { - fprintf(stderr, "ERROR -> failed to open %s for writing\n", destname); - free(destname); - return 1; - } - wr = image->comps[compno].w; - hr = image->comps[compno].h; - prec = image->comps[compno].prec; - max = (1 << prec) - 1; - - fprintf(fdest, "P5\n#OpenJPEG-%s\n%d %d\n%d\n", - opj_version(), wr, hr, max); - - red = image->comps[compno].data; - adjustR = - (image->comps[compno].sgnd ? 1 << (image->comps[compno].prec - 1) : 0); - - if (prec > 8) { - for (i = 0; i < wr * hr; i++) { - v = *red + adjustR; - ++red; - /* netpbm: */ - fprintf(fdest, "%c%c", (unsigned char)(v >> 8), (unsigned char)v); - - if (has_alpha) { - v = *alpha++; - /* netpbm: */ - fprintf(fdest, "%c%c", (unsigned char)(v >> 8), (unsigned char)v); - } - }/* for(i */ - } else { /* prec <= 8 */ - for (i = 0; i < wr * hr; ++i) { - fprintf(fdest, "%c", (unsigned char)(*red + adjustR)); - ++red; - } - } - fclose(fdest); - } /* for (compno */ - free(destname); - - return 0; -}/* imagetopnm() */ - -#ifdef OPJ_HAVE_LIBTIFF -/* -->> -->> -->> -->> - - TIFF IMAGE FORMAT - - <<-- <<-- <<-- <<-- */ - -int imagetotif(opj_image_t * image, const char *outfile) -{ - int width, height, imgsize; - int bps, index, adjust, sgnd; - int ushift, dshift, has_alpha, force16; - TIFF *tif; - tdata_t buf; - tstrip_t strip; - tsize_t strip_size; - - ushift = dshift = force16 = has_alpha = 0; - bps = image->comps[0].prec; - - if (bps > 8 && bps < 16) { - ushift = 16 - bps; - dshift = bps - ushift; - bps = 16; - force16 = 1; - } - - if (bps != 8 && bps != 16) { - fprintf(stderr, "imagetotif: Bits=%d, Only 8 and 16 bits implemented\n", - bps); - fprintf(stderr, "\tAborting\n"); - return 1; - } - tif = TIFFOpen(outfile, "wb"); - - if (!tif) { - fprintf(stderr, "imagetotif:failed to open %s for writing\n", outfile); - return 1; - } - sgnd = image->comps[0].sgnd; - adjust = sgnd ? 1 << (image->comps[0].prec - 1) : 0; - - if (image->numcomps >= 3 - && image->comps[0].dx == image->comps[1].dx - && image->comps[1].dx == image->comps[2].dx - && image->comps[0].dy == image->comps[1].dy - && image->comps[1].dy == image->comps[2].dy - && image->comps[0].prec == image->comps[1].prec - && image->comps[1].prec == image->comps[2].prec) { - has_alpha = (image->numcomps == 4); - - width = image->comps[0].w; - height = image->comps[0].h; - imgsize = width * height ; - - TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); - TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); - TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3 + has_alpha); - TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); - TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); - TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); - TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); - strip_size = TIFFStripSize(tif); - buf = _TIFFmalloc(strip_size); - index = 0; - - for (strip = 0; strip < TIFFNumberOfStrips(tif); strip++) { - unsigned char *dat8; - tsize_t i, ssize, last_i = 0; - int step, restx; - ssize = TIFFStripSize(tif); - dat8 = (unsigned char*)buf; - - if (bps == 8) { - step = 3 + has_alpha; - restx = step - 1; - - for (i = 0; i < ssize - restx; i += step) { - int r, g, b, a = 0; - - if (index < imgsize) { - r = image->comps[0].data[index]; - g = image->comps[1].data[index]; - b = image->comps[2].data[index]; - if (has_alpha) { - a = image->comps[3].data[index]; - } - - if (sgnd) { - r += adjust; - g += adjust; - b += adjust; - if (has_alpha) { - a += adjust; - } - } - dat8[i + 0] = r ; - dat8[i + 1] = g ; - dat8[i + 2] = b ; - if (has_alpha) { - dat8[i + 3] = a; - } - - index++; - last_i = i + step; - } else { - break; - } - }/*for(i = 0;)*/ - - if (last_i < ssize) { - for (i = last_i; i < ssize; i += step) { - int r, g, b, a = 0; - - if (index < imgsize) { - r = image->comps[0].data[index]; - g = image->comps[1].data[index]; - b = image->comps[2].data[index]; - if (has_alpha) { - a = image->comps[3].data[index]; - } - - if (sgnd) { - r += adjust; - g += adjust; - b += adjust; - if (has_alpha) { - a += adjust; - } - } - dat8[i + 0] = r ; - if (i + 1 < ssize) { - dat8[i + 1] = g ; - } else { - break; - } - if (i + 2 < ssize) { - dat8[i + 2] = b ; - } else { - break; - } - if (has_alpha) { - if (i + 3 < ssize) { - dat8[i + 3] = a ; - } else { - break; - } - } - index++; - } else { - break; - } - }/*for(i)*/ - }/*if(last_i < ssize)*/ - - } /*if(bps == 8)*/ - else if (bps == 16) { - step = 6 + has_alpha + has_alpha; - restx = step - 1; - - for (i = 0; i < ssize - restx ; i += step) { - int r, g, b, a = 0; - - if (index < imgsize) { - r = image->comps[0].data[index]; - g = image->comps[1].data[index]; - b = image->comps[2].data[index]; - if (has_alpha) { - a = image->comps[3].data[index]; - } - - if (sgnd) { - r += adjust; - g += adjust; - b += adjust; - if (has_alpha) { - a += adjust; - } - } - if (force16) { - r = (r << ushift) + (r >> dshift); - g = (g << ushift) + (g >> dshift); - b = (b << ushift) + (b >> dshift); - if (has_alpha) { - a = (a << ushift) + (a >> dshift); - } - } - dat8[i + 0] = r; /*LSB*/ - dat8[i + 1] = (r >> 8); /*MSB*/ - dat8[i + 2] = g; - dat8[i + 3] = (g >> 8); - dat8[i + 4] = b; - dat8[i + 5] = (b >> 8); - if (has_alpha) { - dat8[i + 6] = a; - dat8[i + 7] = (a >> 8); - } - index++; - last_i = i + step; - } else { - break; - } - }/*for(i = 0;)*/ - - if (last_i < ssize) { - for (i = last_i ; i < ssize ; i += step) { - int r, g, b, a = 0; - - if (index < imgsize) { - r = image->comps[0].data[index]; - g = image->comps[1].data[index]; - b = image->comps[2].data[index]; - if (has_alpha) { - a = image->comps[3].data[index]; - } - - if (sgnd) { - r += adjust; - g += adjust; - b += adjust; - if (has_alpha) { - a += adjust; - } - } - if (force16) { - r = (r << ushift) + (r >> dshift); - g = (g << ushift) + (g >> dshift); - b = (b << ushift) + (b >> dshift); - if (has_alpha) { - a = (a << ushift) + (a >> dshift); - } - } - dat8[i + 0] = r; /*LSB*/ - if (i + 1 < ssize) { - dat8[i + 1] = (r >> 8); - } else { - break; /*MSB*/ - } - if (i + 2 < ssize) { - dat8[i + 2] = g; - } else { - break; - } - if (i + 3 < ssize) { - dat8[i + 3] = (g >> 8); - } else { - break; - } - if (i + 4 < ssize) { - dat8[i + 4] = b; - } else { - break; - } - if (i + 5 < ssize) { - dat8[i + 5] = (b >> 8); - } else { - break; - } - - if (has_alpha) { - if (i + 6 < ssize) { - dat8[i + 6] = a; - } else { - break; - } - if (i + 7 < ssize) { - dat8[i + 7] = (a >> 8); - } else { - break; - } - } - index++; - } else { - break; - } - }/*for(i)*/ - }/*if(last_i < ssize)*/ - - }/*if(bps == 16)*/ - (void)TIFFWriteEncodedStrip(tif, strip, (void*)buf, strip_size); - }/*for(strip = 0; )*/ - - _TIFFfree((void*)buf); - TIFFClose(tif); - - return 0; - }/*RGB(A)*/ - - if (image->numcomps == 1 /* GRAY */ - || (image->numcomps == 2 /* GRAY_ALPHA */ - && image->comps[0].dx == image->comps[1].dx - && image->comps[0].dy == image->comps[1].dy - && image->comps[0].prec == image->comps[1].prec)) { - int step; - - has_alpha = (image->numcomps == 2); - - width = image->comps[0].w; - height = image->comps[0].h; - imgsize = width * height; - - /* Set tags */ - TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, width); - TIFFSetField(tif, TIFFTAG_IMAGELENGTH, height); - TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1 + has_alpha); - TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); - TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); - TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); - TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); - TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, 1); - - /* Get a buffer for the data */ - strip_size = TIFFStripSize(tif); - buf = _TIFFmalloc(strip_size); - index = 0; - - for (strip = 0; strip < TIFFNumberOfStrips(tif); strip++) { - unsigned char *dat8; - tsize_t i, ssize = TIFFStripSize(tif); - dat8 = (unsigned char*)buf; - - if (bps == 8) { - step = 1 + has_alpha; - - for (i = 0; i < ssize; i += step) { - if (index < imgsize) { - int r, a = 0; - - r = image->comps[0].data[index]; - if (has_alpha) { - a = image->comps[1].data[index]; - } - - if (sgnd) { - r += adjust; - if (has_alpha) { - a += adjust; - } - } - dat8[i + 0] = r; - if (has_alpha) { - dat8[i + 1] = a; - } - index++; - } else { - break; - } - }/*for(i )*/ - }/*if(bps == 8*/ - else if (bps == 16) { - step = 2 + has_alpha + has_alpha; - - for (i = 0; i < ssize; i += step) { - if (index < imgsize) { - int r, a = 0; - - r = image->comps[0].data[index]; - if (has_alpha) { - a = image->comps[1].data[index]; - } - - if (sgnd) { - r += adjust; - if (has_alpha) { - a += adjust; - } - } - if (force16) { - r = (r << ushift) + (r >> dshift); - if (has_alpha) { - a = (a << ushift) + (a >> dshift); - } - } - dat8[i + 0] = r; /*LSB*/ - dat8[i + 1] = r >> 8; /*MSB*/ - if (has_alpha) { - dat8[i + 2] = a; - dat8[i + 3] = a >> 8; - } - index++; - }/*if(index < imgsize)*/ - else { - break; - } - }/*for(i )*/ - } - (void)TIFFWriteEncodedStrip(tif, strip, (void*)buf, strip_size); - }/*for(strip*/ - - _TIFFfree(buf); - TIFFClose(tif); - - return 0; - } - - TIFFClose(tif); - - fprintf(stderr, "imagetotif: Bad color format.\n" - "\tOnly RGB(A) and GRAY(A) has been implemented\n"); - fprintf(stderr, "\tFOUND: numcomps(%d)\n\tAborting\n", - image->numcomps); - - return 1; -}/* imagetotif() */ - -/* - * libtiff/tif_getimage.c : 1,2,4,8,16 bitspersample accepted - * CINEMA : 12 bit precision -*/ -opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters) -{ - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - TIFF *tif; - tdata_t buf; - tstrip_t strip; - tsize_t strip_size; - int j, numcomps, w, h, index; - OPJ_COLOR_SPACE color_space; - opj_image_cmptparm_t cmptparm[4]; /* RGBA */ - opj_image_t *image = NULL; - int imgsize = 0; - int has_alpha = 0; - unsigned short tiBps, tiPhoto, tiSf, tiSpp, tiPC; - unsigned int tiWidth, tiHeight; - - tif = TIFFOpen(filename, "r"); - - if (!tif) { - fprintf(stderr, "tiftoimage:Failed to open %s for reading\n", filename); - return 0; - } - tiBps = tiPhoto = tiSf = tiSpp = tiPC = 0; - tiWidth = tiHeight = 0; - - TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &tiWidth); - TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &tiHeight); - TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &tiBps); - TIFFGetField(tif, TIFFTAG_SAMPLEFORMAT, &tiSf); - TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &tiSpp); - TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &tiPhoto); - TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &tiPC); - w = tiWidth; - h = tiHeight; - - { - unsigned short b = tiBps, p = tiPhoto; - - if (tiBps != 8 && tiBps != 16 && tiBps != 12) { - b = 0; - } - if (tiPhoto != 1 && tiPhoto != 2) { - p = 0; - } - - if (!b || !p) { - if (!b) - fprintf(stderr, "imagetotif: Bits=%d, Only 8 and 16 bits" - " implemented\n", tiBps); - else if (!p) - fprintf(stderr, "tiftoimage: Bad color format %d.\n\tOnly RGB(A)" - " and GRAY(A) has been implemented\n", (int) tiPhoto); - - fprintf(stderr, "\tAborting\n"); - TIFFClose(tif); - - return NULL; - } - } - {/* From: tiff-4.0.x/libtiff/tif_getimage.c : */ - uint16* sampleinfo; - uint16 extrasamples; - - TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, - &extrasamples, &sampleinfo); - - if (extrasamples >= 1) { - switch (sampleinfo[0]) { - case EXTRASAMPLE_UNSPECIFIED: - /* Workaround for some images without correct info about alpha channel - */ - if (tiSpp > 3) { - has_alpha = 1; - } - break; - - case EXTRASAMPLE_ASSOCALPHA: /* data pre-multiplied */ - case EXTRASAMPLE_UNASSALPHA: /* data not pre-multiplied */ - has_alpha = 1; - break; - } - } else /* extrasamples == 0 */ - if (tiSpp == 4 || tiSpp == 2) { - has_alpha = 1; - } - } - - /* initialize image components - */ - memset(&cmptparm[0], 0, 4 * sizeof(opj_image_cmptparm_t)); - - if (tiPhoto == PHOTOMETRIC_RGB) { /* RGB(A) */ - numcomps = 3 + has_alpha; - color_space = CLRSPC_SRGB; - - for (j = 0; j < numcomps; j++) { - if (parameters->cp_cinema) { - cmptparm[j].prec = 12; - cmptparm[j].bpp = 12; - } else { - cmptparm[j].prec = tiBps; - cmptparm[j].bpp = tiBps; - } - cmptparm[j].dx = subsampling_dx; - cmptparm[j].dy = subsampling_dy; - cmptparm[j].w = w; - cmptparm[j].h = h; - } - - image = opj_image_create(numcomps, &cmptparm[0], color_space); - - if (!image) { - TIFFClose(tif); - return NULL; - } - /* set image offset and reference grid - */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : - image->x0 + (w - 1) * subsampling_dx + 1; - image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : - image->y0 + (h - 1) * subsampling_dy + 1; - - buf = _TIFFmalloc(TIFFStripSize(tif)); - - strip_size = TIFFStripSize(tif); - index = 0; - imgsize = image->comps[0].w * image->comps[0].h ; - /* Read the Image components - */ - for (strip = 0; strip < TIFFNumberOfStrips(tif); strip++) { - unsigned char *dat8; - int step; - tsize_t i, ssize; - ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size); - dat8 = (unsigned char*)buf; - - if (tiBps == 16) { - step = 6 + has_alpha + has_alpha; - - for (i = 0; i < ssize; i += step) { - if (index < imgsize) { - image->comps[0].data[index] = (dat8[i + 1] << 8) | dat8[i + 0]; /* R */ - image->comps[1].data[index] = (dat8[i + 3] << 8) | dat8[i + 2]; /* G */ - image->comps[2].data[index] = (dat8[i + 5] << 8) | dat8[i + 4]; /* B */ - if (has_alpha) { - image->comps[3].data[index] = (dat8[i + 7] << 8) | dat8[i + 6]; - } - - if (parameters->cp_cinema) { - /* Rounding 16 to 12 bits - */ - image->comps[0].data[index] = - (image->comps[0].data[index] + 0x08) >> 4 ; - image->comps[1].data[index] = - (image->comps[1].data[index] + 0x08) >> 4 ; - image->comps[2].data[index] = - (image->comps[2].data[index] + 0x08) >> 4 ; - if (has_alpha) - image->comps[3].data[index] = - (image->comps[3].data[index] + 0x08) >> 4 ; - } - index++; - } else { - break; - } - }/*for(i = 0)*/ - }/*if(tiBps == 16)*/ - else if (tiBps == 8) { - step = 3 + has_alpha; - - for (i = 0; i < ssize; i += step) { - if (index < imgsize) { - image->comps[0].data[index] = dat8[i + 0]; /* R */ - image->comps[1].data[index] = dat8[i + 1]; /* G */ - image->comps[2].data[index] = dat8[i + 2]; /* B */ - if (has_alpha) { - image->comps[3].data[index] = dat8[i + 3]; - } - - if (parameters->cp_cinema) { - /* Rounding 8 to 12 bits - */ - image->comps[0].data[index] = image->comps[0].data[index] << 4 ; - image->comps[1].data[index] = image->comps[1].data[index] << 4 ; - image->comps[2].data[index] = image->comps[2].data[index] << 4 ; - if (has_alpha) { - image->comps[3].data[index] = image->comps[3].data[index] << 4 ; - } - } - index++; - }/*if(index*/ - else { - break; - } - }/*for(i )*/ - }/*if( tiBps == 8)*/ - else if (tiBps == 12) { /* CINEMA file */ - step = 9; - - for (i = 0; i < ssize; i += step) { - if ((index < imgsize) & (index + 1 < imgsize)) { - image->comps[0].data[index] = (dat8[i + 0] << 4) | (dat8[i + 1] >> 4); - image->comps[1].data[index] = ((dat8[i + 1] & 0x0f) << 8) | dat8[i + 2]; - - image->comps[2].data[index] = (dat8[i + 3] << 4) | (dat8[i + 4] >> 4); - image->comps[0].data[index + 1] = ((dat8[i + 4] & 0x0f) << 8) | dat8[i + 5]; - - image->comps[1].data[index + 1] = (dat8[i + 6] << 4) | - (dat8[i + 7] >> 4); - image->comps[2].data[index + 1] = ((dat8[i + 7] & 0x0f) << 8) | dat8[i + 8]; - - index += 2; - } else { - break; - } - }/*for(i )*/ - } - }/*for(strip = 0; )*/ - - _TIFFfree(buf); - TIFFClose(tif); - - return image; - }/*RGB(A)*/ - - if (tiPhoto == PHOTOMETRIC_MINISBLACK) { /* GRAY(A) */ - numcomps = 1 + has_alpha; - color_space = CLRSPC_GRAY; - - for (j = 0; j < numcomps; ++j) { - cmptparm[j].prec = tiBps; - cmptparm[j].bpp = tiBps; - cmptparm[j].dx = subsampling_dx; - cmptparm[j].dy = subsampling_dy; - cmptparm[j].w = w; - cmptparm[j].h = h; - } - image = opj_image_create(numcomps, &cmptparm[0], color_space); - - if (!image) { - TIFFClose(tif); - return NULL; - } - /* set image offset and reference grid - */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = !image->x0 ? (w - 1) * subsampling_dx + 1 : - image->x0 + (w - 1) * subsampling_dx + 1; - image->y1 = !image->y0 ? (h - 1) * subsampling_dy + 1 : - image->y0 + (h - 1) * subsampling_dy + 1; - - buf = _TIFFmalloc(TIFFStripSize(tif)); - - strip_size = TIFFStripSize(tif); - index = 0; - imgsize = image->comps[0].w * image->comps[0].h ; - /* Read the Image components - */ - for (strip = 0; strip < TIFFNumberOfStrips(tif); strip++) { - unsigned char *dat8; - tsize_t i, ssize; - int step; - - ssize = TIFFReadEncodedStrip(tif, strip, buf, strip_size); - dat8 = (unsigned char*)buf; - - if (tiBps == 16) { - step = 2 + has_alpha + has_alpha; - - for (i = 0; i < ssize; i += step) { - if (index < imgsize) { - image->comps[0].data[index] = (dat8[i + 1] << 8) | dat8[i + 0]; - if (has_alpha) { - image->comps[1].data[index] = (dat8[i + 3] << 8) | dat8[i + 2]; - } - index++; - } else { - break; - } - }/*for(i )*/ - } else if (tiBps == 8) { - step = 1 + has_alpha; - - for (i = 0; i < ssize; i += step) { - if (index < imgsize) { - image->comps[0].data[index] = dat8[i + 0]; - if (has_alpha) { - image->comps[1].data[index] = dat8[i + 1]; - } - index++; - } else { - break; - } - }/*for(i )*/ - } - }/*for(strip = 0;*/ - - _TIFFfree(buf); - TIFFClose(tif); - - }/*GRAY(A)*/ - - return image; - -}/* tiftoimage() */ - -#endif /* OPJ_HAVE_LIBTIFF */ - -/* -->> -->> -->> -->> - - RAW IMAGE FORMAT - - <<-- <<-- <<-- <<-- */ - -opj_image_t* rawtoimage(const char *filename, opj_cparameters_t *parameters, - raw_cparameters_t *raw_cp) -{ - int subsampling_dx = parameters->subsampling_dx; - int subsampling_dy = parameters->subsampling_dy; - - FILE *f = NULL; - int i, compno, numcomps, w, h; - OPJ_COLOR_SPACE color_space; - opj_image_cmptparm_t *cmptparm; - opj_image_t * image = NULL; - unsigned short ch; - - if ((!(raw_cp->rawWidth & raw_cp->rawHeight & raw_cp->rawComp & - raw_cp->rawBitDepth)) == 0) { - fprintf(stderr, "\nError: 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"); - fprintf(stderr, "Aborting\n"); - return NULL; - } - - f = fopen(filename, "rb"); - if (!f) { - fprintf(stderr, "Failed to open %s for reading !!\n", filename); - fprintf(stderr, "Aborting\n"); - return NULL; - } - numcomps = raw_cp->rawComp; - color_space = CLRSPC_SRGB; - w = raw_cp->rawWidth; - h = raw_cp->rawHeight; - cmptparm = (opj_image_cmptparm_t*) malloc(numcomps * sizeof( - opj_image_cmptparm_t)); - - /* initialize image components */ - memset(&cmptparm[0], 0, numcomps * sizeof(opj_image_cmptparm_t)); - for (i = 0; i < numcomps; i++) { - cmptparm[i].prec = raw_cp->rawBitDepth; - cmptparm[i].bpp = raw_cp->rawBitDepth; - cmptparm[i].sgnd = raw_cp->rawSigned; - cmptparm[i].dx = subsampling_dx; - cmptparm[i].dy = subsampling_dy; - cmptparm[i].w = w; - cmptparm[i].h = h; - } - /* create the image */ - image = opj_image_create(numcomps, &cmptparm[0], color_space); - if (!image) { - fclose(f); - return NULL; - } - /* set image offset and reference grid */ - image->x0 = parameters->image_offset_x0; - image->y0 = parameters->image_offset_y0; - image->x1 = parameters->image_offset_x0 + (w - 1) * subsampling_dx + 1; - image->y1 = parameters->image_offset_y0 + (h - 1) * subsampling_dy + 1; - - if (raw_cp->rawBitDepth <= 8) { - unsigned char value = 0; - for (compno = 0; compno < numcomps; compno++) { - for (i = 0; i < w * h; i++) { - if (!fread(&value, 1, 1, f)) { - fprintf(stderr, "Error reading raw file. End of file probably reached.\n"); - fclose(f); - return NULL; - } - image->comps[compno].data[i] = raw_cp->rawSigned ? (char)value : value; - } - } - } else if (raw_cp->rawBitDepth <= 16) { - unsigned short value; - for (compno = 0; compno < numcomps; compno++) { - for (i = 0; i < w * h; i++) { - unsigned char temp; - if (!fread(&temp, 1, 1, f)) { - fprintf(stderr, "Error reading raw file. End of file probably reached.\n"); - fclose(f); - return NULL; - } - value = temp << 8; - if (!fread(&temp, 1, 1, f)) { - fprintf(stderr, "Error reading raw file. End of file probably reached.\n"); - fclose(f); - return NULL; - } - value += temp; - image->comps[compno].data[i] = raw_cp->rawSigned ? (short)value : value; - } - } - } else { - fprintf(stderr, - "OpenJPEG cannot encode raw components with bit depth higher than 16 bits.\n"); - fclose(f); - return NULL; - } - - if (fread(&ch, 1, 1, f)) { - fprintf(stderr, "Warning. End of raw file not reached... processing anyway\n"); - } - fclose(f); - - return image; -} - -int imagetoraw(opj_image_t * image, const char *outfile) -{ - FILE *rawFile = NULL; - size_t res; - int compno; - int w, h; - int line, row; - int *ptr; - - if ((image->numcomps * image->x1 * image->y1) == 0) { - fprintf(stderr, "\nError: invalid raw image parameters\n"); - return 1; - } - - rawFile = fopen(outfile, "wb"); - if (!rawFile) { - fprintf(stderr, "Failed to open %s for writing !!\n", outfile); - return 1; - } - - fprintf(stdout, "Raw image characteristics: %d components\n", image->numcomps); - - for (compno = 0; compno < image->numcomps; compno++) { - fprintf(stdout, "Component %d characteristics: %dx%dx%d %s\n", compno, - image->comps[compno].w, - image->comps[compno].h, image->comps[compno].prec, - image->comps[compno].sgnd == 1 ? "signed" : "unsigned"); - - w = image->comps[compno].w; - h = image->comps[compno].h; - - if (image->comps[compno].prec <= 8) { - if (image->comps[compno].sgnd == 1) { - signed char curr; - int mask = (1 << image->comps[compno].prec) - 1; - ptr = image->comps[compno].data; - for (line = 0; line < h; line++) { - for (row = 0; row < w; row++) { - curr = (signed char)(*ptr & mask); - res = fwrite(&curr, sizeof(signed char), 1, rawFile); - if (res < 1) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; - } - ptr++; - } - } - } else if (image->comps[compno].sgnd == 0) { - unsigned char curr; - int mask = (1 << image->comps[compno].prec) - 1; - ptr = image->comps[compno].data; - for (line = 0; line < h; line++) { - for (row = 0; row < w; row++) { - curr = (unsigned char)(*ptr & mask); - res = fwrite(&curr, sizeof(unsigned char), 1, rawFile); - if (res < 1) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; - } - ptr++; - } - } - } - } else if (image->comps[compno].prec <= 16) { - if (image->comps[compno].sgnd == 1) { - signed short int curr; - int mask = (1 << image->comps[compno].prec) - 1; - ptr = image->comps[compno].data; - for (line = 0; line < h; line++) { - for (row = 0; row < w; row++) { - unsigned char temp; - curr = (signed short int)(*ptr & mask); - temp = (unsigned char)(curr >> 8); - res = fwrite(&temp, 1, 1, rawFile); - if (res < 1) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; - } - temp = (unsigned char) curr; - res = fwrite(&temp, 1, 1, rawFile); - if (res < 1) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; - } - ptr++; - } - } - } else if (image->comps[compno].sgnd == 0) { - unsigned short int curr; - int mask = (1 << image->comps[compno].prec) - 1; - ptr = image->comps[compno].data; - for (line = 0; line < h; line++) { - for (row = 0; row < w; row++) { - unsigned char temp; - curr = (unsigned short int)(*ptr & mask); - temp = (unsigned char)(curr >> 8); - res = fwrite(&temp, 1, 1, rawFile); - if (res < 1) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; - } - temp = (unsigned char) curr; - res = fwrite(&temp, 1, 1, rawFile); - if (res < 1) { - fprintf(stderr, "failed to write 1 byte for %s\n", outfile); - return 1; - } - ptr++; - } - } - } - } else if (image->comps[compno].prec <= 32) { - fprintf(stderr, "More than 16 bits per component no handled yet\n"); - return 1; - } else { - fprintf(stderr, "Error: invalid precision: %d\n", image->comps[compno].prec); - return 1; - } - } - fclose(rawFile); - return 0; -} - -#ifdef OPJ_HAVE_LIBPNG - -#define PNG_MAGIC "\x89PNG\x0d\x0a\x1a\x0a" -#define MAGIC_SIZE 8 -/* PNG allows bits per sample: 1, 2, 4, 8, 16 */ - -opj_image_t *pngtoimage(const char *read_idf, opj_cparameters_t * params) -{ - png_structp png; - png_infop info; - double gamma, display_exponent; - int bit_depth, interlace_type, compression_type, filter_type; - int unit; - png_uint_32 resx, resy; - unsigned int i, j; - png_uint_32 width, height; - int color_type, has_alpha, is16; - unsigned char *s; - FILE *reader; - unsigned char **rows; - /* j2k: */ - opj_image_t *image; - opj_image_cmptparm_t cmptparm[4]; - int sub_dx, sub_dy; - unsigned int nr_comp; - int *r, *g, *b, *a; - unsigned char sigbuf[8]; - - if ((reader = fopen(read_idf, "rb")) == NULL) { - fprintf(stderr, "pngtoimage: can not open %s\n", read_idf); - return NULL; - } - image = NULL; - png = NULL; - rows = NULL; - - if (fread(sigbuf, 1, MAGIC_SIZE, reader) != MAGIC_SIZE - || memcmp(sigbuf, PNG_MAGIC, MAGIC_SIZE) != 0) { - fprintf(stderr, "pngtoimage: %s is no valid PNG file\n", read_idf); - goto fin; - } - /* libpng-VERSION/example.c: - * PC : screen_gamma = 2.2; - * Mac: screen_gamma = 1.7 or 1.0; - */ - display_exponent = 2.2; - - if ((png = png_create_read_struct(PNG_LIBPNG_VER_STRING, - NULL, NULL, NULL)) == NULL) { - goto fin; - } - if ((info = png_create_info_struct(png)) == NULL) { - goto fin; - } - - if (setjmp(png_jmpbuf(png))) { - goto fin; - } - - png_init_io(png, reader); - png_set_sig_bytes(png, MAGIC_SIZE); - - png_read_info(png, info); - - if (png_get_IHDR(png, info, &width, &height, - &bit_depth, &color_type, &interlace_type, - &compression_type, &filter_type) == 0) { - goto fin; - } - - /* png_set_expand(): - * expand paletted images to RGB, expand grayscale images of - * less than 8-bit depth to 8-bit depth, and expand tRNS chunks - * to alpha channels. - */ - if (color_type == PNG_COLOR_TYPE_PALETTE) { - png_set_expand(png); - } else if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) { - png_set_expand(png); - } - - if (png_get_valid(png, info, PNG_INFO_tRNS)) { - png_set_expand(png); - } - - is16 = (bit_depth == 16); - - /* GRAY => RGB; GRAY_ALPHA => RGBA - */ - if (color_type == PNG_COLOR_TYPE_GRAY - || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { - png_set_gray_to_rgb(png); - color_type = - (color_type == PNG_COLOR_TYPE_GRAY ? PNG_COLOR_TYPE_RGB : - PNG_COLOR_TYPE_RGB_ALPHA); - } - if (!png_get_gAMA(png, info, &gamma)) { - gamma = 0.45455; - } - - png_set_gamma(png, display_exponent, gamma); - - png_read_update_info(png, info); - - png_get_pHYs(png, info, &resx, &resy, &unit); - - color_type = png_get_color_type(png, info); - - has_alpha = (color_type == PNG_COLOR_TYPE_RGB_ALPHA); - - nr_comp = 3 + has_alpha; - - bit_depth = png_get_bit_depth(png, info); - - rows = (unsigned char**)calloc(height + 1, sizeof(unsigned char*)); - for (i = 0; i < height; ++i) { - rows[i] = (unsigned char*)malloc(png_get_rowbytes(png, info)); - } - - png_read_image(png, rows); - - memset(&cmptparm, 0, 4 * sizeof(opj_image_cmptparm_t)); - - sub_dx = params->subsampling_dx; - sub_dy = params->subsampling_dy; - - for (i = 0; i < nr_comp; ++i) { - cmptparm[i].prec = bit_depth; - /* bits_per_pixel: 8 or 16 */ - cmptparm[i].bpp = bit_depth; - cmptparm[i].sgnd = 0; - cmptparm[i].dx = sub_dx; - cmptparm[i].dy = sub_dy; - cmptparm[i].w = width; - cmptparm[i].h = height; - } - - image = opj_image_create(nr_comp, &cmptparm[0], CLRSPC_SRGB); - - if (image == NULL) { - goto fin; - } - - image->x0 = params->image_offset_x0; - image->y0 = params->image_offset_y0; - image->x1 = image->x0 + (width - 1) * sub_dx + 1 + image->x0; - image->y1 = image->y0 + (height - 1) * sub_dy + 1 + image->y0; - - r = image->comps[0].data; - g = image->comps[1].data; - b = image->comps[2].data; - a = image->comps[3].data; - - for (i = 0; i < height; ++i) { - s = rows[i]; - - for (j = 0; j < width; ++j) { - if (is16) { - *r++ = s[0] << 8 | s[1]; - s += 2; - - *g++ = s[0] << 8 | s[1]; - s += 2; - - *b++ = s[0] << 8 | s[1]; - s += 2; - - if (has_alpha) { - *a++ = s[0] << 8 | s[1]; - s += 2; - } - - continue; - } - *r++ = *s++; - *g++ = *s++; - *b++ = *s++; - - if (has_alpha) { - *a++ = *s++; - } - } - } -fin: - if (rows) { - for (i = 0; i < height; ++i) { - free(rows[i]); - } - free(rows); - } - if (png) { - png_destroy_read_struct(&png, &info, NULL); - } - - fclose(reader); - - return image; - -}/* pngtoimage() */ - -int imagetopng(opj_image_t * image, const char *write_idf) -{ - FILE *writer; - png_structp png; - png_infop info; - int *red, *green, *blue, *alpha; - unsigned char *row_buf, *d; - int has_alpha, width, height, nr_comp, color_type; - int adjustR, adjustG, adjustB, adjustA, x, y, fails; - int prec, ushift, dshift, is16, force16, force8; - unsigned short mask = 0xffff; - png_color_8 sig_bit; - - is16 = force16 = force8 = ushift = dshift = 0; - fails = 1; - prec = image->comps[0].prec; - nr_comp = image->numcomps; - - if (prec > 8 && prec < 16) { - ushift = 16 - prec; - dshift = prec - ushift; - prec = 16; - force16 = 1; - } else if (prec < 8 && nr_comp > 1) { /* GRAY_ALPHA, RGB, RGB_ALPHA */ - ushift = 8 - prec; - dshift = 8 - ushift; - prec = 8; - force8 = 1; - } - - if (prec != 1 && prec != 2 && prec != 4 && prec != 8 && prec != 16) { - fprintf(stderr, "imagetopng: can not create %s" - "\n\twrong bit_depth %d\n", write_idf, prec); - return fails; - } - writer = fopen(write_idf, "wb"); - - if (writer == NULL) { - return fails; - } - - info = NULL; - has_alpha = 0; - - /* Create and initialize the png_struct with the desired error handler - * functions. If you want to use the default stderr and longjump method, - * you can supply NULL for the last three parameters. We also check that - * the library version is compatible with the one used at compile time, - * in case we are using dynamically linked libraries. REQUIRED. - */ - png = png_create_write_struct(PNG_LIBPNG_VER_STRING, - NULL, NULL, NULL); - /*png_voidp user_error_ptr, user_error_fn, user_warning_fn); */ - - if (png == NULL) { - goto fin; - } - - /* Allocate/initialize the image information data. REQUIRED - */ - info = png_create_info_struct(png); - - if (info == NULL) { - goto fin; - } - - /* Set error handling. REQUIRED if you are not supplying your own - * error handling functions in the png_create_write_struct() call. - */ - if (setjmp(png_jmpbuf(png))) { - goto fin; - } - - /* I/O initialization functions is REQUIRED - */ - png_init_io(png, writer); - - /* Set the image information here. Width and height are up to 2^31, - * bit_depth is one of 1, 2, 4, 8, or 16, but valid values also depend on - * the color_type selected. color_type is one of PNG_COLOR_TYPE_GRAY, - * PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB, - * or PNG_COLOR_TYPE_RGB_ALPHA. interlace is either PNG_INTERLACE_NONE or - * PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST - * currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE. - * REQUIRED - * - * ERRORS: - * - * color_type == PNG_COLOR_TYPE_PALETTE && bit_depth > 8 - * color_type == PNG_COLOR_TYPE_RGB && bit_depth < 8 - * color_type == PNG_COLOR_TYPE_GRAY_ALPHA && bit_depth < 8 - * color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8 - * - */ - png_set_compression_level(png, Z_BEST_COMPRESSION); - - if (prec == 16) { - mask = 0xffff; - } else if (prec == 8) { - mask = 0x00ff; - } else if (prec == 4) { - mask = 0x000f; - } else if (prec == 2) { - mask = 0x0003; - } else if (prec == 1) { - mask = 0x0001; - } - - if (nr_comp >= 3 - && image->comps[0].dx == image->comps[1].dx - && image->comps[1].dx == image->comps[2].dx - && image->comps[0].dy == image->comps[1].dy - && image->comps[1].dy == image->comps[2].dy - && image->comps[0].prec == image->comps[1].prec - && image->comps[1].prec == image->comps[2].prec) { - int v; - - has_alpha = (nr_comp > 3); - - is16 = (prec == 16); - - width = image->comps[0].w; - height = image->comps[0].h; - - red = image->comps[0].data; - green = image->comps[1].data; - blue = image->comps[2].data; - - sig_bit.red = sig_bit.green = sig_bit.blue = prec; - - if (has_alpha) { - sig_bit.alpha = prec; - alpha = image->comps[3].data; - color_type = PNG_COLOR_TYPE_RGB_ALPHA; - adjustA = (image->comps[3].sgnd ? 1 << (image->comps[3].prec - 1) : 0); - } else { - sig_bit.alpha = 0; - alpha = NULL; - color_type = PNG_COLOR_TYPE_RGB; - adjustA = 0; - } - png_set_sBIT(png, info, &sig_bit); - - png_set_IHDR(png, info, width, height, prec, - color_type, - PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); - /*=============================*/ - png_write_info(png, info); - /*=============================*/ - if (prec < 8) { - png_set_packing(png); - } - adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); - adjustG = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); - adjustB = (image->comps[2].sgnd ? 1 << (image->comps[2].prec - 1) : 0); - - row_buf = (unsigned char*)malloc(width * nr_comp * 2); - - for (y = 0; y < height; ++y) { - d = row_buf; - - for (x = 0; x < width; ++x) { - if (is16) { - v = *red + adjustR; - ++red; - - if (force16) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v >> 8); - *d++ = (unsigned char)v; - - v = *green + adjustG; - ++green; - - if (force16) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v >> 8); - *d++ = (unsigned char)v; - - v = *blue + adjustB; - ++blue; - - if (force16) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v >> 8); - *d++ = (unsigned char)v; - - if (has_alpha) { - v = *alpha + adjustA; - ++alpha; - - if (force16) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v >> 8); - *d++ = (unsigned char)v; - } - continue; - }/* if(is16) */ - - v = *red + adjustR; - ++red; - - if (force8) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v & mask); - - v = *green + adjustG; - ++green; - - if (force8) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v & mask); - - v = *blue + adjustB; - ++blue; - - if (force8) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v & mask); - - if (has_alpha) { - v = *alpha + adjustA; - ++alpha; - - if (force8) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v & mask); - } - } /* for(x) */ - - png_write_row(png, row_buf); - - } /* for(y) */ - free(row_buf); - - }/* nr_comp >= 3 */ - else if (nr_comp == 1 /* GRAY */ - || (nr_comp == 2 /* GRAY_ALPHA */ - && image->comps[0].dx == image->comps[1].dx - && image->comps[0].dy == image->comps[1].dy - && image->comps[0].prec == image->comps[1].prec)) { - int v; - - red = image->comps[0].data; - - sig_bit.gray = prec; - sig_bit.red = sig_bit.green = sig_bit.blue = sig_bit.alpha = 0; - alpha = NULL; - adjustA = 0; - color_type = PNG_COLOR_TYPE_GRAY; - - if (nr_comp == 2) { - has_alpha = 1; - sig_bit.alpha = prec; - alpha = image->comps[1].data; - color_type = PNG_COLOR_TYPE_GRAY_ALPHA; - adjustA = (image->comps[1].sgnd ? 1 << (image->comps[1].prec - 1) : 0); - } - width = image->comps[0].w; - height = image->comps[0].h; - - png_set_IHDR(png, info, width, height, sig_bit.gray, - color_type, - PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); - - png_set_sBIT(png, info, &sig_bit); - /*=============================*/ - png_write_info(png, info); - /*=============================*/ - adjustR = (image->comps[0].sgnd ? 1 << (image->comps[0].prec - 1) : 0); - - if (prec < 8) { - png_set_packing(png); - } - - if (prec > 8) { - row_buf = (unsigned char*) - malloc(width * nr_comp * sizeof(unsigned short)); - - for (y = 0; y < height; ++y) { - d = row_buf; - - for (x = 0; x < width; ++x) { - v = *red + adjustR; - ++red; - - if (force16) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v >> 8); - *d++ = (unsigned char)v; - - if (has_alpha) { - v = *alpha++; - - if (force16) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v >> 8); - *d++ = (unsigned char)v; - } - }/* for(x) */ - png_write_row(png, row_buf); - - } /* for(y) */ - free(row_buf); - } else { /* prec <= 8 */ - row_buf = (unsigned char*)calloc(width, nr_comp * 2); - - for (y = 0; y < height; ++y) { - d = row_buf; - - for (x = 0; x < width; ++x) { - v = *red + adjustR; - ++red; - - if (force8) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v & mask); - - if (has_alpha) { - v = *alpha + adjustA; - ++alpha; - - if (force8) { - v = (v << ushift) + (v >> dshift); - } - - *d++ = (unsigned char)(v & mask); - } - }/* for(x) */ - - png_write_row(png, row_buf); - - } /* for(y) */ - free(row_buf); - } - } else { - fprintf(stderr, "imagetopng: can not create %s\n", write_idf); - goto fin; - } - png_write_end(png, info); - - fails = 0; - -fin: - - if (png) { - png_destroy_write_struct(&png, &info); - } - fclose(writer); - - if (fails) { - remove(write_idf); - } - - return fails; -}/* imagetopng() */ -#endif /* OPJ_HAVE_LIBPNG */ diff --git a/src/bin/jpwl/convert.h b/src/bin/jpwl/convert.h deleted file mode 100644 index 7f1a5bc8..00000000 --- a/src/bin/jpwl/convert.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * 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 - * Copyright (c) 2003-2014, Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * 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. - */ -#ifndef __J2K_CONVERT_H -#define __J2K_CONVERT_H - -/**@name RAW image encoding parameters */ -/*@{*/ -typedef struct raw_cparameters { - /** width of the raw image */ - int rawWidth; - /** height of the raw image */ - int rawHeight; - /** components of the raw image */ - int rawComp; - /** bit depth of the raw image */ - int rawBitDepth; - /** signed/unsigned raw image */ - opj_bool rawSigned; - /*@}*/ -} raw_cparameters_t; - -/* TGA conversion */ -opj_image_t* tgatoimage(const char *filename, opj_cparameters_t *parameters); -int imagetotga(opj_image_t * image, const char *outfile); - -/* BMP conversion */ -opj_image_t* bmptoimage(const char *filename, opj_cparameters_t *parameters); -int imagetobmp(opj_image_t *image, const char *outfile); - -/* TIFF conversion*/ -opj_image_t* tiftoimage(const char *filename, opj_cparameters_t *parameters); -int imagetotif(opj_image_t *image, const char *outfile); -/** -Load a single image component encoded in PGX file format -@param filename Name of the PGX file to load -@param parameters *List ?* -@return Returns a greyscale image if successful, returns NULL otherwise -*/ -opj_image_t* pgxtoimage(const char *filename, opj_cparameters_t *parameters); -int imagetopgx(opj_image_t *image, const char *outfile); - -opj_image_t* pnmtoimage(const char *filename, opj_cparameters_t *parameters); -int imagetopnm(opj_image_t *image, const char *outfile); - -/* RAW conversion */ -int imagetoraw(opj_image_t * image, const char *outfile); -opj_image_t* rawtoimage(const char *filename, opj_cparameters_t *parameters, - raw_cparameters_t *raw_cp); - -/* PNG conversion*/ -extern int imagetopng(opj_image_t *image, const char *write_idf); -extern opj_image_t* pngtoimage(const char *filename, - opj_cparameters_t *parameters); - -#endif /* __J2K_CONVERT_H */ - diff --git a/src/bin/jpwl/index.c b/src/bin/jpwl/index.c deleted file mode 100644 index 6c6c8fc0..00000000 --- a/src/bin/jpwl/index.c +++ /dev/null @@ -1,454 +0,0 @@ -/* - * 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) 2003-2007, Francois-Olivier Devaux - * 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 <math.h> -#include <string.h> -#include "openjpeg.h" -#include "index.h" - -/* ------------------------------------------------------------------------------------ */ - -/** -Write a structured index to a file -@param cstr_info Codestream information -@param index Index filename -@return Returns 0 if successful, returns 1 otherwise -*/ -int write_index_file(opj_codestream_info_t *cstr_info, char *index) -{ - int tileno, compno, layno, resno, precno, pack_nb, x, y; - FILE *stream = NULL; - double total_disto = 0; - /* UniPG>> */ - int tilepartno; - char disto_on, numpix_on; - -#ifdef USE_JPWL - if (!strcmp(index, JPWL_PRIVATEINDEX_NAME)) { - return 0; - } -#endif /* USE_JPWL */ - /* <<UniPG */ - - if (!cstr_info) { - return 1; - } - - stream = fopen(index, "w"); - if (!stream) { - fprintf(stderr, "failed to open index file [%s] for writing\n", index); - return 1; - } - - if (cstr_info->tile[0].distotile) { - disto_on = 1; - } else { - disto_on = 0; - } - - if (cstr_info->tile[0].numpix) { - numpix_on = 1; - } else { - numpix_on = 0; - } - - fprintf(stream, "%d %d\n", cstr_info->image_w, cstr_info->image_h); - fprintf(stream, "%d\n", cstr_info->prog); - fprintf(stream, "%d %d\n", cstr_info->tile_x, cstr_info->tile_y); - fprintf(stream, "%d %d\n", cstr_info->tw, cstr_info->th); - fprintf(stream, "%d\n", cstr_info->numcomps); - fprintf(stream, "%d\n", cstr_info->numlayers); - fprintf(stream, "%d\n", cstr_info->numdecompos[0]); /* based on component 0 */ - - for (resno = cstr_info->numdecompos[0]; resno >= 0; resno--) { - fprintf(stream, "[%d,%d] ", - (1 << cstr_info->tile[0].pdx[resno]), - (1 << cstr_info->tile[0].pdx[resno])); /* based on tile 0 and component 0 */ - } - - fprintf(stream, "\n"); - /* UniPG>> */ - fprintf(stream, "%d\n", cstr_info->main_head_start); - /* <<UniPG */ - fprintf(stream, "%d\n", cstr_info->main_head_end); - fprintf(stream, "%d\n", cstr_info->codestream_size); - - fprintf(stream, "\nINFO ON TILES\n"); - fprintf(stream, "tileno start_pos end_hd end_tile nbparts"); - if (disto_on) { - fprintf(stream, " disto"); - } - if (numpix_on) { - fprintf(stream, " nbpix"); - } - if (disto_on && numpix_on) { - fprintf(stream, " disto/nbpix"); - } - fprintf(stream, "\n"); - - for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { - fprintf(stream, "%4d %9d %9d %9d %9d", - cstr_info->tile[tileno].tileno, - cstr_info->tile[tileno].start_pos, - cstr_info->tile[tileno].end_header, - cstr_info->tile[tileno].end_pos, - cstr_info->tile[tileno].num_tps); - if (disto_on) { - fprintf(stream, " %9e", cstr_info->tile[tileno].distotile); - } - if (numpix_on) { - fprintf(stream, " %9d", cstr_info->tile[tileno].numpix); - } - if (disto_on && numpix_on) { - fprintf(stream, " %9e", cstr_info->tile[tileno].distotile / - cstr_info->tile[tileno].numpix); - } - fprintf(stream, "\n"); - } - - for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) { - int start_pos, end_ph_pos, end_pos; - double disto = 0; - int max_numdecompos = 0; - pack_nb = 0; - - for (compno = 0; compno < cstr_info->numcomps; compno++) { - if (max_numdecompos < cstr_info->numdecompos[compno]) { - max_numdecompos = cstr_info->numdecompos[compno]; - } - } - - fprintf(stream, "\nTILE %d DETAILS\n", tileno); - fprintf(stream, - "part_nb tileno start_pack num_packs start_pos end_tph_pos end_pos\n"); - for (tilepartno = 0; tilepartno < cstr_info->tile[tileno].num_tps; tilepartno++) - fprintf(stream, "%4d %9d %9d %9d %9d %11d %9d\n", - tilepartno, tileno, - cstr_info->tile[tileno].tp[tilepartno].tp_start_pack, - cstr_info->tile[tileno].tp[tilepartno].tp_numpacks, - cstr_info->tile[tileno].tp[tilepartno].tp_start_pos, - cstr_info->tile[tileno].tp[tilepartno].tp_end_header, - cstr_info->tile[tileno].tp[tilepartno].tp_end_pos - ); - - if (cstr_info->prog == LRCP) { /* LRCP */ - fprintf(stream, - "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos"); - if (disto_on) { - fprintf(stream, " disto"); - } - fprintf(stream, "\n"); - - for (layno = 0; layno < cstr_info->numlayers; layno++) { - for (resno = 0; resno < max_numdecompos + 1; resno++) { - for (compno = 0; compno < cstr_info->numcomps; compno++) { - int prec_max; - if (resno > cstr_info->numdecompos[compno]) { - break; - } - prec_max = cstr_info->tile[tileno].pw[resno] * - cstr_info->tile[tileno].ph[resno]; - for (precno = 0; precno < prec_max; precno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %7d %5d %6d %6d %6d %6d %7d", - pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos); - if (disto_on) { - fprintf(stream, " %8e", disto); - } - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - } - } - } /* LRCP */ - - else if (cstr_info->prog == RLCP) { /* RLCP */ - fprintf(stream, - "RLCP\npack_nb tileno resno layno compno precno start_pos end_ph_pos end_pos\n"); - if (disto_on) { - fprintf(stream, " disto"); - } - fprintf(stream, "\n"); - - for (resno = 0; resno < max_numdecompos + 1; resno++) { - for (layno = 0; layno < cstr_info->numlayers; layno++) { - for (compno = 0; compno < cstr_info->numcomps; compno++) { - int prec_max; - if (resno > cstr_info->numdecompos[compno]) { - break; - } - prec_max = cstr_info->tile[tileno].pw[resno] * - cstr_info->tile[tileno].ph[resno]; - for (precno = 0; precno < prec_max; precno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d %9d %7d", - pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos); - if (disto_on) { - fprintf(stream, " %8e", disto); - } - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - } - } - } /* RLCP */ - - else if (cstr_info->prog == RPCL) { /* RPCL */ - - fprintf(stream, - "RPCL\npack_nb tileno resno precno compno layno start_pos end_ph_pos end_pos"); - if (disto_on) { - fprintf(stream, " disto"); - } - fprintf(stream, "\n"); - - for (resno = 0; resno < max_numdecompos + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * - cstr_info->tile[tileno].ph[resno]; - for (precno = 0; precno < numprec; precno++) { - /* I suppose components have same XRsiz, YRsiz */ - int x0 = cstr_info->tile_Ox + tileno - (int)floor((float)tileno / - (float)cstr_info->tw) * cstr_info->tw * cstr_info->tile_x; - int y0 = cstr_info->tile_Ox + (int)floor((float)tileno / - (float)cstr_info->tw) * cstr_info->tile_y; - int x1 = x0 + cstr_info->tile_x; - int y1 = y0 + cstr_info->tile_y; - for (compno = 0; compno < cstr_info->numcomps; compno++) { - int pcnx = cstr_info->tile[tileno].pw[resno]; - int pcx = (int) pow(2, cstr_info->tile[tileno].pdx[resno] + - cstr_info->numdecompos[compno] - resno); - int pcy = (int) pow(2, cstr_info->tile[tileno].pdy[resno] + - cstr_info->numdecompos[compno] - resno); - int precno_x = precno - (int) floor((float)precno / (float)pcnx) * pcnx; - int precno_y = (int) floor((float)precno / (float)pcnx); - if (resno > cstr_info->numdecompos[compno]) { - break; - } - for (y = y0; y < y1; y++) { - if (precno_y * pcy == y) { - for (x = x0; x < x1; x++) { - if (precno_x * pcx == x) { - for (layno = 0; layno < cstr_info->numlayers; layno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d %9d %7d", - pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos); - if (disto_on) { - fprintf(stream, " %8e", disto); - } - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - }/* x = x0..x1 */ - } - } /* y = y0..y1 */ - } /* precno */ - } /* compno */ - } /* resno */ - } /* RPCL */ - - else if (cstr_info->prog == PCRL) { /* PCRL */ - /* I suppose components have same XRsiz, YRsiz */ - int x0 = cstr_info->tile_Ox + tileno - (int)floor((float)tileno / - (float)cstr_info->tw) * cstr_info->tw * cstr_info->tile_x; - int y0 = cstr_info->tile_Ox + (int)floor((float)tileno / - (float)cstr_info->tw) * cstr_info->tile_y; - int x1 = x0 + cstr_info->tile_x; - int y1 = y0 + cstr_info->tile_y; - - /* Count the maximum number of precincts */ - int max_numprec = 0; - for (resno = 0; resno < max_numdecompos + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * - cstr_info->tile[tileno].ph[resno]; - if (numprec > max_numprec) { - max_numprec = numprec; - } - } - - fprintf(stream, - "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos"); - if (disto_on) { - fprintf(stream, " disto"); - } - fprintf(stream, "\n"); - - for (precno = 0; precno < max_numprec; precno++) { - for (compno = 0; compno < cstr_info->numcomps; compno++) { - for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * - cstr_info->tile[tileno].ph[resno]; - int pcnx = cstr_info->tile[tileno].pw[resno]; - int pcx = (int) pow(2, cstr_info->tile[tileno].pdx[resno] + - cstr_info->numdecompos[compno] - resno); - int pcy = (int) pow(2, cstr_info->tile[tileno].pdy[resno] + - cstr_info->numdecompos[compno] - resno); - int precno_x = precno - (int) floor((float)precno / (float)pcnx) * pcnx; - int precno_y = (int) floor((float)precno / (float)pcnx); - if (precno >= numprec) { - continue; - } - for (y = y0; y < y1; y++) { - if (precno_y * pcy == y) { - for (x = x0; x < x1; x++) { - if (precno_x * pcx == x) { - for (layno = 0; layno < cstr_info->numlayers; layno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %7d", - pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos); - if (disto_on) { - fprintf(stream, " %8e", disto); - } - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - }/* x = x0..x1 */ - } - } /* y = y0..y1 */ - } /* resno */ - } /* compno */ - } /* precno */ - } /* PCRL */ - - else { /* CPRL */ - /* Count the maximum number of precincts */ - int max_numprec = 0; - for (resno = 0; resno < max_numdecompos + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * - cstr_info->tile[tileno].ph[resno]; - if (numprec > max_numprec) { - max_numprec = numprec; - } - } - - fprintf(stream, - "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos"); - if (disto_on) { - fprintf(stream, " disto"); - } - fprintf(stream, "\n"); - - for (compno = 0; compno < cstr_info->numcomps; compno++) { - /* I suppose components have same XRsiz, YRsiz */ - int x0 = cstr_info->tile_Ox + tileno - (int)floor((float)tileno / - (float)cstr_info->tw) * cstr_info->tw * cstr_info->tile_x; - int y0 = cstr_info->tile_Ox + (int)floor((float)tileno / - (float)cstr_info->tw) * cstr_info->tile_y; - int x1 = x0 + cstr_info->tile_x; - int y1 = y0 + cstr_info->tile_y; - - for (precno = 0; precno < max_numprec; precno++) { - for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) { - int numprec = cstr_info->tile[tileno].pw[resno] * - cstr_info->tile[tileno].ph[resno]; - int pcnx = cstr_info->tile[tileno].pw[resno]; - int pcx = (int) pow(2, cstr_info->tile[tileno].pdx[resno] + - cstr_info->numdecompos[compno] - resno); - int pcy = (int) pow(2, cstr_info->tile[tileno].pdy[resno] + - cstr_info->numdecompos[compno] - resno); - int precno_x = precno - (int) floor((float)precno / (float)pcnx) * pcnx; - int precno_y = (int) floor((float)precno / (float)pcnx); - if (precno >= numprec) { - continue; - } - - for (y = y0; y < y1; y++) { - if (precno_y * pcy == y) { - for (x = x0; x < x1; x++) { - if (precno_x * pcx == x) { - for (layno = 0; layno < cstr_info->numlayers; layno++) { - start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos; - end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos; - end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos; - disto = cstr_info->tile[tileno].packet[pack_nb].disto; - fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %7d", - pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos); - if (disto_on) { - fprintf(stream, " %8e", disto); - } - fprintf(stream, "\n"); - total_disto += disto; - pack_nb++; - } - } - }/* x = x0..x1 */ - } - } /* y = y0..y1 */ - } /* resno */ - } /* precno */ - } /* compno */ - } /* CPRL */ - } /* tileno */ - - if (disto_on) { - fprintf(stream, "%8e\n", cstr_info->D_max); /* SE max */ - fprintf(stream, "%.8e\n", total_disto); /* SE totale */ - } - /* UniPG>> */ - /* print the markers' list */ - if (cstr_info->marknum) { - fprintf(stream, "\nMARKER LIST\n"); - fprintf(stream, "%d\n", cstr_info->marknum); - fprintf(stream, "type\tstart_pos length\n"); - for (x = 0; x < cstr_info->marknum; x++) { - fprintf(stream, "%X\t%9d %9d\n", cstr_info->marker[x].type, - cstr_info->marker[x].pos, cstr_info->marker[x].len); - } - } - /* <<UniPG */ - fclose(stream); - - fprintf(stderr, "Generated index file %s\n", index); - - return 0; -} diff --git a/src/bin/jpwl/index.h b/src/bin/jpwl/index.h deleted file mode 100644 index b461e91b..00000000 --- a/src/bin/jpwl/index.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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) 2003-2007, Francois-Olivier Devaux - * 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. - */ - -#ifndef __J2K_INDEX_H -#define __J2K_INDEX_H - -#ifdef __cplusplus -extern "C" { -#endif - -/** -Write a structured index to a file -@param cstr_info Codestream information -@param index Index filename -@return Returns 0 if successful, returns 1 otherwise -*/ -int write_index_file(opj_codestream_info_t *cstr_info, char *index); - -#ifdef __cplusplus -} -#endif - -#endif /* __J2K_INDEX_H */ - diff --git a/src/bin/jpwl/opj_jpwl_compress.c b/src/bin/jpwl/opj_jpwl_compress.c deleted file mode 100644 index ccf03615..00000000 --- a/src/bin/jpwl/opj_jpwl_compress.c +++ /dev/null @@ -1,1965 +0,0 @@ -/* - * 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 - * Copyright (c) 2003-2014, Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2006-2007, Parvatha Elangovan - * 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> -#include <stdlib.h> -#include <math.h> - -#ifdef _WIN32 -#include "windirent.h" -#else -#include <dirent.h> -#endif /* _WIN32 */ - -#ifdef _WIN32 -#include <windows.h> -#define strcasecmp _stricmp -#define strncasecmp _strnicmp -#else -#include <strings.h> -#endif /* _WIN32 */ - -#include "opj_apps_config.h" -#include "openjpeg.h" -#include "opj_getopt.h" -#include "convert.h" -#include "index.h" - -#include "format_defs.h" - -#define CINEMA_24_CS 1302083 /*Codestream length for 24fps*/ -#define CINEMA_48_CS 651041 /*Codestream length for 48fps*/ -#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*/ - -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; - /** User specified rate stored in case of cinema option*/ - float *rates; -} img_fol_t; - -static void encode_help_display(void) -{ - fprintf(stdout, "HELP for opj_jpwl_compress\n----\n\n"); - fprintf(stdout, "- the -h option displays this help information on screen\n\n"); - - /* UniPG>> */ - fprintf(stdout, "List of parameters for the JPEG 2000 " -#ifdef USE_JPWL - "+ JPWL " -#endif /* USE_JPWL */ - "encoder:\n"); - /* <<UniPG */ - 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, "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"); - /* UniPG>> */ -#ifdef USE_JPWL - fprintf(stdout, " * No JPWL protection\n"); -#endif /* USE_JPWL */ - /* <<UniPG */ - fprintf(stdout, "\n"); - fprintf(stdout, "Parameters:\n"); - fprintf(stdout, "------------\n"); - fprintf(stdout, "\n"); - fprintf(stdout, "Required Parameters (except with -h):\n"); - fprintf(stdout, "One of the two options -ImgDir or -i must be used\n"); - fprintf(stdout, "\n"); - fprintf(stdout, - "-ImgDir : 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 <BMP> \n"); - fprintf(stdout, - " Currently accepts PBM, PGM, PPM, PNM, PAM, PGX, PNG, BMP, TIF, RAW 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, "\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, - "-jpip : write jpip codestream index box in JP2 output file\n"); - fprintf(stdout, " NOTICE: currently supports only RPCL order\n"); - fprintf(stdout, "\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<tilepart><=type>,s<tilepart><=method>,a=<addr>,...\n"); - fprintf(stdout, - " ...,z=<size>,g=<range>,p<tilepart: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 '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: <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"); - 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"); -#endif /* USE_JPWL */ - /* <<UniPG */ - 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"); - fprintf(stdout, "Tiles_nb_X Tiles_nb_Y\n"); - 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_start_position\n"); - fprintf(stdout, "Main_header_end_position\n"); - fprintf(stdout, "Codestream_size\n"); - fprintf(stdout, "\n"); - fprintf(stdout, "INFO ON TILES\n"); - fprintf(stdout, - "tileno start_pos end_hd end_tile nbparts disto nbpix disto/nbpix\n"); - fprintf(stdout, - "Tile_0 start_pos end_Theader end_pos NumParts TotalDisto NumPix MaxMSE\n"); - fprintf(stdout, - "Tile_1 '' '' '' '' '' '' ''\n"); - fprintf(stdout, "...\n"); - fprintf(stdout, - "Tile_Nt '' '' '' '' '' '' ''\n"); - fprintf(stdout, "...\n"); - fprintf(stdout, "TILE 0 DETAILS\n"); - fprintf(stdout, "part_nb tileno num_packs start_pos end_tph_pos end_pos\n"); - fprintf(stdout, "...\n"); - fprintf(stdout, "Progression_string\n"); - fprintf(stdout, - "pack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos disto\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"); -} - -static OPJ_PROG_ORDER give_progression(const char progression[4]) -{ - 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; -} - -static unsigned int get_num_images(char *imgdirpath) -{ - DIR *dir; - struct dirent* content; - unsigned 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; -} - -static 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; -} - -static int get_file_format(char *filename) -{ - unsigned int i; - static const char *extension[] = { - "pgx", "pnm", "pgm", "ppm", "pbm", "pam", "bmp", "tif", "raw", "tga", "png", "j2k", "jp2", "j2c", "jpc" - }; - static const int format[] = { - PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, J2K_CFMT, J2K_CFMT - }; - char * ext = strrchr(filename, '.'); - if (ext == NULL) { - return -1; - } - ext++; - for (i = 0; i < sizeof(format) / sizeof(*format); i++) { - if (strcasecmp(ext, extension[i]) == 0) { - return format[i]; - } - } - return -1; -} - -static char * get_file_name(char *name) -{ - char *fname; - fname = (char*)malloc(OPJ_PATH_LEN * sizeof(char)); - fname = strtok(name, "."); - return fname; -} - -static char get_next_file(int imageno, dircnt_t *dirptr, img_fol_t *img_fol, - opj_cparameters_t *parameters) -{ - char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN], - outfilename[OPJ_PATH_LEN], temp_ofname[OPJ_PATH_LEN]; - char *temp_p, temp1[OPJ_PATH_LEN] = ""; - - strcpy(image_filename, dirptr->filename[imageno]); - fprintf(stderr, "File Number %d \"%s\"\n", imageno, image_filename); - parameters->decod_format = get_file_format(image_filename); - if (parameters->decod_format == -1) { - return 1; - } - 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)); - while ((temp_p = strtok(NULL, ".")) != NULL) { - strcat(temp_ofname, temp1); - sprintf(temp1, ".%s", temp_p); - } - 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)); - } - return 0; -} - -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; -} - -static void cinema_parameters(opj_cparameters_t *parameters) -{ - parameters->tile_size_on = OPJ_FALSE; - parameters->cp_tdx = 1; - parameters->cp_tdy = 1; - - /*Tile part*/ - parameters->tp_flag = 'C'; - parameters->tp_on = 1; - - /*Tile and Image shall be at (0,0)*/ - parameters->cp_tx0 = 0; - parameters->cp_ty0 = 0; - parameters->image_offset_x0 = 0; - parameters->image_offset_y0 = 0; - - /*Codeblock size= 32*32*/ - parameters->cblockw_init = 32; - parameters->cblockh_init = 32; - parameters->csty |= 0x01; - - /*The progression order shall be CPRL*/ - parameters->prog_order = CPRL; - - /* No ROI */ - parameters->roi_compno = -1; - - parameters->subsampling_dx = 1; - parameters->subsampling_dy = 1; - - /* 9-7 transform */ - parameters->irreversible = 1; - -} - -static void cinema_setup_encoder(opj_cparameters_t *parameters, - opj_image_t *image, img_fol_t *img_fol) -{ - int i; - float temp_rate; - - switch (parameters->cp_cinema) { - case CINEMA2K_24: - case CINEMA2K_48: - if (parameters->numresolution > 6) { - parameters->numresolution = 6; - } - if (!((image->comps[0].w == 2048) | (image->comps[0].h == 1080))) { - fprintf(stdout, - "Image coordinates %d x %d is not 2K compliant.\nJPEG Digital Cinema Profile-3 " - "(2K profile) compliance requires that at least one of coordinates match 2048 x 1080\n", - image->comps[0].w, image->comps[0].h); - parameters->cp_rsiz = STD_RSIZ; - } - break; - - case CINEMA4K_24: - if (parameters->numresolution < 1) { - parameters->numresolution = 1; - } else if (parameters->numresolution > 7) { - parameters->numresolution = 7; - } - if (!((image->comps[0].w == 4096) | (image->comps[0].h == 2160))) { - fprintf(stdout, - "Image coordinates %d x %d is not 4K compliant.\nJPEG Digital Cinema Profile-4" - "(4K profile) compliance requires that at least one of coordinates match 4096 x 2160\n", - image->comps[0].w, image->comps[0].h); - parameters->cp_rsiz = STD_RSIZ; - } - parameters->numpocs = initialise_4K_poc(parameters->POC, - parameters->numresolution); - break; - default : - break; - } - - switch (parameters->cp_cinema) { - case CINEMA2K_24: - case CINEMA4K_24: - for (i = 0 ; i < parameters->tcp_numlayers ; i++) { - temp_rate = 0 ; - if (img_fol->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)) / - (img_fol->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); - } else { - parameters->tcp_rates[i] = img_fol->rates[i]; - } - } - } - parameters->max_comp_size = COMP_24_CS; - break; - - case CINEMA2K_48: - for (i = 0 ; i < parameters->tcp_numlayers ; i++) { - temp_rate = 0 ; - if (img_fol->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 { - temp_rate = ((float)(image->numcomps * image->comps[0].w * image->comps[0].h * - image->comps[0].prec)) / - (img_fol->rates[i] * 8 * image->comps[0].dx * image->comps[0].dy); - if (temp_rate > CINEMA_48_CS) { - 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 { - parameters->tcp_rates[i] = img_fol->rates[i]; - } - } - } - parameters->max_comp_size = COMP_48_CS; - break; - default: - break; - } - parameters->cp_disto_alloc = 1; -} - -/* ------------------------------------------------------------------------------------ */ - -static int parse_cmdline_encoder(int argc, char **argv, - opj_cparameters_t *parameters, - img_fol_t *img_fol, raw_cparameters_t *raw_cp, char *indexfilename) -{ - int i, j, totlen, c; - opj_option_t long_option[] = { - {"cinema2K", REQ_ARG, NULL, 'w'}, - {"cinema4K", NO_ARG, NULL, 'y'}, - {"ImgDir", REQ_ARG, NULL, 'z'}, - {"TP", REQ_ARG, NULL, 'u'}, - {"SOP", NO_ARG, NULL, 'S'}, - {"EPH", NO_ARG, NULL, 'E'}, - {"OutFor", REQ_ARG, NULL, 'O'}, - {"POC", REQ_ARG, NULL, 'P'}, - {"ROI", REQ_ARG, NULL, 'R'}, - {"jpip", NO_ARG, NULL, 'J'} - }; - - /* parse the command line */ - const char optlist[] = "i:o:r:q:n:b:c:t:p:s:SEM:x:R:d:T:If:P:C:F:u:J" -#ifdef USE_JPWL - "W:" -#endif /* USE_JPWL */ - "h"; - - totlen = sizeof(long_option); - img_fol->set_out_format = 0; - raw_cp->rawWidth = 0; - - do { - c = opj_getopt_long(argc, argv, optlist, long_option, totlen); - if (c == -1) { - break; - } - switch (c) { - case 'i': { /* input file */ - char *infile = opj_optarg; - parameters->decod_format = get_file_format(infile); - switch (parameters->decod_format) { - case PGX_DFMT: - case PXM_DFMT: - case BMP_DFMT: - case TIF_DFMT: - case RAW_DFMT: - case TGA_DFMT: - case PNG_DFMT: - break; - default: - fprintf(stderr, - "!! Unrecognized format for infile : %s " - "[accept only *.pnm, *.pgm, *.ppm, *.pgx, *png, *.bmp, *.tif, *.raw or *.tga] !!\n\n", - infile); - return 1; - } - strncpy(parameters->infile, infile, sizeof(parameters->infile) - 1); - } - break; - - /* ----------------------------------------------------- */ - - case 'o': { /* output file */ - char *outfile = opj_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, *.j2c or *.jp2]!! \n", outfile); - return 1; - } - strncpy(parameters->outfile, outfile, sizeof(parameters->outfile) - 1); - } - break; - - /* ----------------------------------------------------- */ - case 'O': { /* output format */ - char outformat[50]; - char *of = opj_optarg; - sprintf(outformat, ".%s", of); - img_fol->set_out_format = 1; - parameters->cod_format = get_file_format(outformat); - switch (parameters->cod_format) { - case J2K_CFMT: - case JP2_CFMT: - img_fol->out_format = opj_optarg; - break; - default: - fprintf(stderr, "Unknown output format image [only j2k, j2c, jp2]!! \n"); - return 1; - } - } - break; - - - /* ----------------------------------------------------- */ - - - case 'r': { /* rates rates/distorsion */ - char *s = opj_optarg; - parameters->tcp_numlayers = 0; - while (sscanf(s, "%f", ¶meters->tcp_rates[parameters->tcp_numlayers]) == - 1) { - parameters->tcp_numlayers++; - while (*s && *s != ',') { - s++; - } - if (!*s) { - break; - } - s++; - } - parameters->cp_disto_alloc = 1; - } - break; - - /* ----------------------------------------------------- */ - - - case 'F': { /* Raw image format parameters */ - char signo; - char *s = opj_optarg; - if (sscanf(s, "%d,%d,%d,%d,%c", &raw_cp->rawWidth, &raw_cp->rawHeight, - &raw_cp->rawComp, &raw_cp->rawBitDepth, &signo) == 5) { - if (signo == 's') { - raw_cp->rawSigned = OPJ_TRUE; - fprintf(stdout, "\nRaw file parameters: %d,%d,%d,%d Signed\n", raw_cp->rawWidth, - raw_cp->rawHeight, raw_cp->rawComp, raw_cp->rawBitDepth); - } else if (signo == 'u') { - raw_cp->rawSigned = OPJ_FALSE; - fprintf(stdout, "\nRaw file parameters: %d,%d,%d,%d Unsigned\n", - raw_cp->rawWidth, raw_cp->rawHeight, raw_cp->rawComp, raw_cp->rawBitDepth); - } else { - fprintf(stderr, - "\nError: invalid raw image parameters: Unknown sign of raw file\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"); - fprintf(stderr, "Aborting\n"); - } - } else { - fprintf(stderr, "\nError: 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"); - fprintf(stderr, "Aborting\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - - case 'q': { /* add fixed_quality */ - char *s = opj_optarg; - while (sscanf(s, "%f", ¶meters->tcp_distoratio[parameters->tcp_numlayers]) - == 1) { - parameters->tcp_numlayers++; - while (*s && *s != ',') { - s++; - } - if (!*s) { - break; - } - s++; - } - parameters->cp_fixed_quality = 1; - } - break; - - /* dda */ - /* ----------------------------------------------------- */ - - case 'f': { /* mod fixed_quality (before : -q) */ - int *row = NULL, *col = NULL; - int numlayers = 0, numresolution = 0, matrix_width = 0; - - char *s = opj_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 = ¶meters->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; - - /* ----------------------------------------------------- */ - - case 't': { /* tiles */ - sscanf(opj_optarg, "%d,%d", ¶meters->cp_tdx, ¶meters->cp_tdy); - parameters->tile_size_on = OPJ_TRUE; - } - break; - - /* ----------------------------------------------------- */ - - case 'n': { /* resolution */ - sscanf(opj_optarg, "%d", ¶meters->numresolution); - } - break; - - /* ----------------------------------------------------- */ - case 'c': { /* precinct dimension */ - char sep; - int res_spec = 0; - - char *s = opj_optarg; - do { - sep = 0; - sscanf(s, "[%d,%d]%c", ¶meters->prcw_init[res_spec], - ¶meters->prch_init[res_spec], &sep); - parameters->csty |= 0x01; - res_spec++; - s = strpbrk(s, "]") + 2; - } while (sep == ','); - parameters->res_spec = res_spec; - } - break; - - /* ----------------------------------------------------- */ - - case 'b': { /* code-block dimension */ - int cblockw_init = 0, cblockh_init = 0; - sscanf(opj_optarg, "%d,%d", &cblockw_init, &cblockh_init); - 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"); - return 1; - } - parameters->cblockw_init = cblockw_init; - parameters->cblockh_init = cblockh_init; - } - break; - - /* ----------------------------------------------------- */ - - case 'x': { /* creation of index file */ - char *index = opj_optarg; - strncpy(indexfilename, index, OPJ_PATH_LEN); - } - break; - - /* ----------------------------------------------------- */ - - case 'p': { /* progression order */ - char progression[4]; - - strncpy(progression, opj_optarg, 4); - parameters->prog_order = give_progression(progression); - if (parameters->prog_order == -1) { - fprintf(stderr, "Unrecognized progression order " - "[LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - - case 's': { /* subsampling factor */ - if (sscanf(opj_optarg, "%d,%d", ¶meters->subsampling_dx, - ¶meters->subsampling_dy) != 2) { - fprintf(stderr, "'-s' sub-sampling argument error ! [-s dx,dy]\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - - case 'd': { /* coordonnate of the reference grid */ - if (sscanf(opj_optarg, "%d,%d", ¶meters->image_offset_x0, - ¶meters->image_offset_y0) != 2) { - fprintf(stderr, "-d 'coordonnate of the reference grid' argument " - "error !! [-d x0,y0]\n"); - return 1; - } - } - break; - - /* ----------------------------------------------------- */ - - case 'h': /* display an help description */ - encode_help_display(); - return 1; - - /* ----------------------------------------------------- */ - - 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 = opj_optarg; - POC = parameters->POC; - - while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile, - &POC[numpocs].resno0, &POC[numpocs].compno0, - &POC[numpocs].layno1, &POC[numpocs].resno1, - &POC[numpocs].compno1, POC[numpocs].progorder) == 7) { - POC[numpocs].prg1 = give_progression(POC[numpocs].progorder); - numpocs++; - while (*s && *s != '/') { - s++; - } - if (!*s) { - break; - } - s++; - } - parameters->numpocs = numpocs; - } - break; - - /* ------------------------------------------------------ */ - - case 'S': { /* SOP marker */ - parameters->csty |= 0x02; - } - break; - - /* ------------------------------------------------------ */ - - case 'E': { /* EPH marker */ - parameters->csty |= 0x04; - } - break; - - /* ------------------------------------------------------ */ - - case 'M': { /* Mode switch pas tous au point !! */ - int value = 0; - if (sscanf(opj_optarg, "%d", &value) == 1) { - for (i = 0; i <= 5; i++) { - int cache = value & (1 << i); - if (cache) { - parameters->mode |= (1 << i); - } - } - } - } - break; - - /* ------------------------------------------------------ */ - - case 'R': { /* ROI */ - if (sscanf(opj_optarg, "c=%d,U=%d", ¶meters->roi_compno, - ¶meters->roi_shift) != 2) { - fprintf(stderr, "ROI error !! [-ROI c='compno',U='shift']\n"); - return 1; - } - } - break; - - /* ------------------------------------------------------ */ - - case 'T': { /* Tile offset */ - if (sscanf(opj_optarg, "%d,%d", ¶meters->cp_tx0, - ¶meters->cp_ty0) != 2) { - fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]"); - return 1; - } - } - break; - - /* ------------------------------------------------------ */ - - case 'C': { /* add a comment */ - parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1); - if (parameters->cp_comment) { - strcpy(parameters->cp_comment, opj_optarg); - } - } - break; - - - /* ------------------------------------------------------ */ - - case 'I': { /* reversible or not */ - parameters->irreversible = 1; - } - break; - - /* ------------------------------------------------------ */ - - case 'u': { /* Tile part generation*/ - parameters->tp_flag = opj_optarg[0]; - parameters->tp_on = 1; - } - break; - - /* ------------------------------------------------------ */ - - case 'z': { /* Image Directory path */ - img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); - strcpy(img_fol->imgdirpath, opj_optarg); - img_fol->set_imgdir = 1; - } - break; - - /* ------------------------------------------------------ */ - - case 'w': { /* Digital Cinema 2K profile compliance*/ - int fps = 0; - sscanf(opj_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; - } - fprintf(stdout, "CINEMA 2K compliant codestream\n"); - parameters->cp_rsiz = CINEMA2K; - - } - break; - - /* ------------------------------------------------------ */ - - case 'y': { /* Digital Cinema 4K profile compliance*/ - parameters->cp_cinema = CINEMA4K_24; - fprintf(stdout, "CINEMA 4K compliant codestream\n"); - parameters->cp_rsiz = CINEMA4K; - } - break; - - /* ------------------------------------------------------ */ - - /* 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 (!indexfilename || !*indexfilename) { - strncpy(indexfilename, JPWL_PRIVATEINDEX_NAME, OPJ_PATH_LEN); - } - - /* search for different protection methods */ - - /* break the option in comma points and parse the result */ - token = strtok(opj_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 part header protection method h = %d\n", - hprot); - return 1; - } - if (tile < 0) { - fprintf(stderr, - "ERROR -> invalid tile part 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 part 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; - - 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 part 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 part 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 part 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 part 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 part header sensitivity method s = %d\n", - sens); - return 1; - } - if (tile < 0) { - fprintf(stderr, - "ERROR -> invalid tile part 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 part 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') { - - - 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') { - - - 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') { - - - 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 = OPJ_TRUE; - - } - break; -#endif /* USE_JPWL */ - /* <<UniPG */ - /* ------------------------------------------------------ */ - - case 'J': { /* jpip on */ - /*parameters->jpip_on = OPJ_TRUE;*/ - } - break; - /* ------------------------------------------------------ */ - - - default: - fprintf(stderr, "ERROR -> Command line not valid\n"); - return 1; - } - } while (c != -1); - - /* check for possible errors */ - if (parameters->cp_cinema) { - if (parameters->tcp_numlayers > 1) { - parameters->cp_rsiz = STD_RSIZ; - 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"); - } - } - if (img_fol->set_imgdir == 1) { - if (!(parameters->infile[0] == 0)) { - fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n"); - return 1; - } - if (img_fol->set_out_format == 0) { - fprintf(stderr, - "Error: When -ImgDir is used, -OutFor <FORMAT> must be used !!\n"); - 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, "Specify OutputFormat using -OutFor<FORMAT> !!\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]); - return 1; - } - } - - if (parameters->decod_format == RAW_DFMT && raw_cp->rawWidth == 0) { - fprintf(stderr, "\nError: 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"); - fprintf(stderr, "Aborting\n"); - return 1; - } - - 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; -} - -/* -------------------------------------------------------------------------- */ - -/** -sample error callback expecting a FILE* client object -*/ -static void error_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); -} -/** -sample warning callback expecting a FILE* client object -*/ -static void warning_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); -} -/** -sample debug callback expecting a FILE* client object -*/ -static void info_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[INFO] %s", msg); -} - -/* -------------------------------------------------------------------------- */ - -int main(int argc, char **argv) -{ - opj_bool bSuccess; - opj_cparameters_t parameters; /* compression parameters */ - img_fol_t img_fol; - opj_event_mgr_t event_mgr; /* event manager */ - opj_image_t *image = NULL; - int i, num_images; - int imageno; - dircnt_t *dirptr = NULL; - raw_cparameters_t raw_cp; - opj_codestream_info_t cstr_info; /* Codestream information structure */ - char indexfilename[OPJ_PATH_LEN]; /* index file name */ - - /* - configure the event callbacks (not required) - setting of each callback is optional - */ - 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(¶meters); - - /* Initialize indexfilename and img_fol */ - *indexfilename = 0; - memset(&img_fol, 0, sizeof(img_fol_t)); - - /* parse input and get user encoding parameters */ - if (parse_cmdline_encoder(argc, argv, ¶meters, &img_fol, &raw_cp, - indexfilename) == 1) { - return 1; - } - - if (parameters.cp_cinema) { - img_fol.rates = (float*)malloc(parameters.tcp_numlayers * sizeof(float)); - for (i = 0; i < parameters.tcp_numlayers; i++) { - img_fol.rates[i] = parameters.tcp_rates[i]; - } - cinema_parameters(¶meters); - } - - /* 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 - /* <<UniPG */ - } - - /* Read directory if necessary */ - if (img_fol.set_imgdir == 1) { - num_images = get_num_images(img_fol.imgdirpath); - 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*/ - if (!dirptr->filename_buf) { - free(parameters.cp_comment); - free(dirptr); - return 0; - } - dirptr->filename = (char**) malloc(num_images * sizeof(char*)); - if (!dirptr->filename) { - free(parameters.cp_comment); - free(dirptr); - return 0; - } - 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) { - free(parameters.cp_comment); - free(dirptr); - return 0; - } - if (num_images == 0) { - free(parameters.cp_comment); - free(dirptr); - fprintf(stdout, "Folder is empty\n"); - return 0; - } - } else { - num_images = 1; - } - /*Encoding image one by one*/ - for (imageno = 0; imageno < num_images; imageno++) { - image = NULL; - fprintf(stderr, "\n"); - - if (img_fol.set_imgdir == 1) { - if (get_next_file(imageno, dirptr, &img_fol, ¶meters)) { - fprintf(stderr, "skipping file...\n"); - continue; - } - } - switch (parameters.decod_format) { - case PGX_DFMT: - break; - case PXM_DFMT: - break; - case BMP_DFMT: - break; - case TIF_DFMT: - break; - case RAW_DFMT: - break; - case TGA_DFMT: - break; - case PNG_DFMT: - break; - default: - fprintf(stderr, "skipping file...\n"); - continue; - } - - /* decode the source image */ - /* ----------------------- */ - - switch (parameters.decod_format) { - case PGX_DFMT: - image = pgxtoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load pgx file\n"); - return 1; - } - break; - - case PXM_DFMT: - image = pnmtoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load pnm file\n"); - return 1; - } - break; - - case BMP_DFMT: - image = bmptoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load bmp file\n"); - return 1; - } - break; -#ifdef OPJ_HAVE_LIBTIFF - case TIF_DFMT: - image = tiftoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load tiff file\n"); - return 1; - } - break; -#endif /* OPJ_HAVE_LIBTIFF */ - case RAW_DFMT: - image = rawtoimage(parameters.infile, ¶meters, &raw_cp); - if (!image) { - fprintf(stderr, "Unable to load raw file\n"); - return 1; - } - break; - - case TGA_DFMT: - image = tgatoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load tga file\n"); - return 1; - } - break; -#ifdef OPJ_HAVE_LIBPNG - case PNG_DFMT: - image = pngtoimage(parameters.infile, ¶meters); - if (!image) { - fprintf(stderr, "Unable to load png file\n"); - return 1; - } - break; -#endif /* OPJ_HAVE_LIBPNG */ - } - /* Can happen if input file is TIFF or PNG - * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined - */ - if (!image) { - fprintf(stderr, "Unable to load file: got no image\n"); - return 1; - } - /* Decide if MCT should be used */ - parameters.tcp_mct = image->numcomps == 3 ? 1 : 0; - - if (parameters.cp_cinema) { - cinema_setup_encoder(¶meters, image, &img_fol); - } - - /* encode the destination image */ - /* ---------------------------- */ - - if (parameters.cod_format == J2K_CFMT) { /* J2K format output */ - int codestream_length; - size_t res; - opj_cio_t *cio = NULL; - FILE *f = NULL; - - /* get a J2K compressor handle */ - opj_cinfo_t* cinfo = opj_create_compress(CODEC_J2K); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); - - /* setup the encoder parameters using the current image and user parameters */ - opj_setup_encoder(cinfo, ¶meters, 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 */ - if (*indexfilename) { /* If need to extract codestream information*/ - bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info); - } else { - bSuccess = opj_encode(cinfo, cio, image, NULL); - } - 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; - } - res = fwrite(cio->buffer, 1, codestream_length, f); - if (res < (size_t)codestream_length) { /* FIXME */ - fprintf(stderr, "failed to write %d (%s)\n", codestream_length, - parameters.outfile); - fclose(f); - return 1; - } - fclose(f); - - fprintf(stderr, "Generated outfile %s\n", parameters.outfile); - /* close and free the byte stream */ - opj_cio_close(cio); - - /* Write the index to disk */ - if (*indexfilename) { - bSuccess = write_index_file(&cstr_info, indexfilename); - if (bSuccess) { - fprintf(stderr, "Failed to output index file into [%s]\n", indexfilename); - } - } - - /* free remaining compression structures */ - opj_destroy_compress(cinfo); - if (*indexfilename) { - opj_destroy_cstr_info(&cstr_info); - } - } else { /* JP2 format output */ - int codestream_length; - size_t res; - opj_cio_t *cio = NULL; - FILE *f = NULL; - opj_cinfo_t *cinfo = NULL; - - /* get a JP2 compressor handle */ - cinfo = opj_create_compress(CODEC_JP2); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); - - /* setup the encoder parameters using the current image and using user parameters */ - opj_setup_encoder(cinfo, ¶meters, 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 */ - if (*indexfilename /*|| parameters.jpip_on*/) { /* If need to extract codestream information*/ - bSuccess = opj_encode_with_info(cinfo, cio, image, &cstr_info); - } else { - bSuccess = opj_encode(cinfo, cio, image, NULL); - } - 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; - } - res = fwrite(cio->buffer, 1, codestream_length, f); - if (res < (size_t)codestream_length) { /* FIXME */ - fprintf(stderr, "failed to write %d (%s)\n", codestream_length, - parameters.outfile); - fclose(f); - return 1; - } - fclose(f); - fprintf(stderr, "Generated outfile %s\n", parameters.outfile); - /* close and free the byte stream */ - opj_cio_close(cio); - - /* Write the index to disk */ - if (*indexfilename) { - bSuccess = write_index_file(&cstr_info, indexfilename); - if (bSuccess) { - fprintf(stderr, "Failed to output index file\n"); - } - } - - /* free remaining compression structures */ - opj_destroy_compress(cinfo); - if (*indexfilename) { - opj_destroy_cstr_info(&cstr_info); - } - } - - /* free image data */ - opj_image_destroy(image); - } - - /* free user parameters structure */ - if (parameters.cp_comment) { - free(parameters.cp_comment); - } - if (parameters.cp_matrice) { - free(parameters.cp_matrice); - } - - return 0; -} diff --git a/src/bin/jpwl/opj_jpwl_decompress.c b/src/bin/jpwl/opj_jpwl_decompress.c deleted file mode 100644 index a73be1c3..00000000 --- a/src/bin/jpwl/opj_jpwl_decompress.c +++ /dev/null @@ -1,900 +0,0 @@ -/* - * 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 - * Copyright (c) 2003-2014, Antonin Descampe - * Copyright (c) 2005, Herve Drolon, FreeImage Team - * Copyright (c) 2006-2007, Parvatha Elangovan - * 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> -#include <stdlib.h> -#include <math.h> - -#ifdef _WIN32 -#include "windirent.h" -#else -#include <dirent.h> -#endif /* _WIN32 */ - -#ifdef _WIN32 -#include <windows.h> -#else -#include <strings.h> -#define _stricmp strcasecmp -#define _strnicmp strncasecmp -#endif /* _WIN32 */ - -#include "opj_apps_config.h" -#include "openjpeg.h" -#include "opj_getopt.h" -#include "convert.h" -#include "index.h" - -#ifdef OPJ_HAVE_LIBLCMS2 -#include <lcms2.h> -#endif -#ifdef OPJ_HAVE_LIBLCMS1 -#include <lcms.h> -#endif -#include "color.h" - -#include "format_defs.h" - -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*/ - const char *out_format; - /** Enable option*/ - char set_imgdir; - /** Enable Cod Format for output*/ - char set_out_format; - -} img_fol_t; - -void decode_help_display(void) -{ - fprintf(stdout, "HELP for j2k_to_image\n----\n\n"); - fprintf(stdout, "- the -h option displays this help information on screen\n\n"); - - /* UniPG>> */ - fprintf(stdout, "List of parameters for the JPEG 2000 " -#ifdef USE_JPWL - "+ JPWL " -#endif /* USE_JPWL */ - "decoder:\n"); - /* <<UniPG */ - fprintf(stdout, "\n"); - fprintf(stdout, "\n"); - fprintf(stdout, " -ImgDir \n"); - fprintf(stdout, " Image file Directory path \n"); - fprintf(stdout, " -OutFor \n"); - fprintf(stdout, " REQUIRED only if -ImgDir is used\n"); - fprintf(stdout, " Need to specify only format without filename <BMP> \n"); - fprintf(stdout, - " Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA formats\n"); - fprintf(stdout, " -i <compressed file>\n"); - fprintf(stdout, - " REQUIRED only if an Input image directory not specified\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 <decompressed file>\n"); - fprintf(stdout, " REQUIRED\n"); - fprintf(stdout, - " Currently accepts PGM, PPM, PNM, PGX, PNG, BMP, TIF, RAW and TGA files\n"); - fprintf(stdout, - " 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 <reduce factor>\n"); - fprintf(stdout, - " Set the number of highest resolution levels to be discarded. The\n"); - fprintf(stdout, - " image resolution is effectively divided by 2 to the power of the\n"); - fprintf(stdout, - " number of discarded levels. The reduce factor is limited by the\n"); - fprintf(stdout, - " smallest total number of decomposition levels among tiles.\n"); - fprintf(stdout, " -l <number of quality layers to decode>\n"); - fprintf(stdout, - " Set the maximum number of quality layers to decode. If there are\n"); - fprintf(stdout, - " less quality layers than the specified number, all the quality layers\n"); - fprintf(stdout, " are decoded.\n"); - fprintf(stdout, " -x \n"); - fprintf(stdout, " Create an index file *.Idx (-x index_name.Idx) \n"); - fprintf(stdout, "\n"); - /* UniPG>> */ -#ifdef USE_JPWL - fprintf(stdout, " -W <options>\n"); - fprintf(stdout, - " Activates the JPWL correction capability, if the codestream complies.\n"); - fprintf(stdout, - " Options can be a comma separated list of <param=val> tokens:\n"); - fprintf(stdout, " c, c=numcomps\n"); - fprintf(stdout, - " numcomps is the number of expected components in the codestream\n"); - fprintf(stdout, " (search of first EPB rely upon this, default is %d)\n", - JPWL_EXPECTED_COMPONENTS); -#endif /* USE_JPWL */ - /* <<UniPG */ - fprintf(stdout, "\n"); -} - -/* -------------------------------------------------------------------------- */ - -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; - } - - 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; -} - -int get_file_format(char *filename) -{ - unsigned int i; - static const char *extension[] = {"pgx", "pnm", "pgm", "ppm", "bmp", "tif", "raw", "tga", "png", "j2k", "jp2", "jpt", "j2c", "jpc" }; - static const int format[] = { PGX_DFMT, PXM_DFMT, PXM_DFMT, PXM_DFMT, BMP_DFMT, TIF_DFMT, RAW_DFMT, TGA_DFMT, PNG_DFMT, J2K_CFMT, JP2_CFMT, JPT_CFMT, J2K_CFMT, J2K_CFMT }; - char * ext = strrchr(filename, '.'); - if (ext == NULL) { - return -1; - } - ext++; - if (ext) { - for (i = 0; i < sizeof(format) / sizeof(*format); i++) { - if (_strnicmp(ext, extension[i], 3) == 0) { - return format[i]; - } - } - } - - return -1; -} - -char get_next_file(int imageno, dircnt_t *dirptr, img_fol_t *img_fol, - opj_dparameters_t *parameters) -{ - char image_filename[OPJ_PATH_LEN], infilename[OPJ_PATH_LEN], - outfilename[OPJ_PATH_LEN], temp_ofname[OPJ_PATH_LEN]; - char *temp_p, temp1[OPJ_PATH_LEN] = ""; - - strcpy(image_filename, dirptr->filename[imageno]); - fprintf(stderr, "File Number %d \"%s\"\n", imageno, image_filename); - parameters->decod_format = get_file_format(image_filename); - if (parameters->decod_format == -1) { - return 1; - } - sprintf(infilename, "%s/%s", img_fol->imgdirpath, image_filename); - strncpy(parameters->infile, infilename, sizeof(infilename)); - - /*Set output file*/ - strcpy(temp_ofname, strtok(image_filename, ".")); - while ((temp_p = strtok(NULL, ".")) != NULL) { - strcat(temp_ofname, temp1); - sprintf(temp1, ".%s", temp_p); - } - 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)); - } - return 0; -} - -/* -------------------------------------------------------------------------- */ -int parse_cmdline_decoder(int argc, char **argv, opj_dparameters_t *parameters, - img_fol_t *img_fol, char *indexfilename) -{ - /* parse the command line */ - int totlen, c; - opj_option_t long_option[] = { - {"ImgDir", REQ_ARG, NULL, 'y'}, - {"OutFor", REQ_ARG, NULL, 'O'}, - }; - - const char optlist[] = "i:o:r:l:x:" - - /* UniPG>> */ -#ifdef USE_JPWL - "W:" -#endif /* USE_JPWL */ - /* <<UniPG */ - "h" ; - totlen = sizeof(long_option); - img_fol->set_out_format = 0; - do { - c = opj_getopt_long(argc, argv, optlist, long_option, totlen); - if (c == -1) { - break; - } - switch (c) { - case 'i': { /* input file */ - char *infile = opj_optarg; - parameters->decod_format = get_file_format(infile); - switch (parameters->decod_format) { - case J2K_CFMT: - case JP2_CFMT: - case JPT_CFMT: - break; - default: - fprintf(stderr, - "!! Unrecognized format for infile : %s [accept only *.j2k, *.jp2, *.jpc or *.jpt] !!\n\n", - infile); - return 1; - } - strncpy(parameters->infile, infile, sizeof(parameters->infile) - 1); - } - break; - - /* ----------------------------------------------------- */ - - case 'o': { /* output file */ - char *outfile = opj_optarg; - parameters->cod_format = get_file_format(outfile); - switch (parameters->cod_format) { - case PGX_DFMT: - case PXM_DFMT: - case BMP_DFMT: - case TIF_DFMT: - case RAW_DFMT: - case TGA_DFMT: - case PNG_DFMT: - break; - default: - fprintf(stderr, - "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", - outfile); - return 1; - } - strncpy(parameters->outfile, outfile, sizeof(parameters->outfile) - 1); - } - break; - - /* ----------------------------------------------------- */ - - case 'O': { /* output format */ - char outformat[50]; - char *of = opj_optarg; - sprintf(outformat, ".%s", of); - img_fol->set_out_format = 1; - parameters->cod_format = get_file_format(outformat); - switch (parameters->cod_format) { - case PGX_DFMT: - img_fol->out_format = "pgx"; - break; - case PXM_DFMT: - img_fol->out_format = "ppm"; - break; - case BMP_DFMT: - img_fol->out_format = "bmp"; - break; - case TIF_DFMT: - img_fol->out_format = "tif"; - break; - case RAW_DFMT: - img_fol->out_format = "raw"; - break; - case TGA_DFMT: - img_fol->out_format = "raw"; - break; - case PNG_DFMT: - img_fol->out_format = "png"; - break; - default: - fprintf(stderr, - "Unknown output format image %s [only *.pnm, *.pgm, *.ppm, *.pgx, *.bmp, *.tif, *.raw or *.tga]!! \n", - outformat); - return 1; - break; - } - } - break; - - /* ----------------------------------------------------- */ - - - case 'r': { /* reduce option */ - sscanf(opj_optarg, "%d", ¶meters->cp_reduce); - } - break; - - /* ----------------------------------------------------- */ - - - case 'l': { /* layering option */ - sscanf(opj_optarg, "%d", ¶meters->cp_layer); - } - break; - - /* ----------------------------------------------------- */ - - case 'h': /* display an help description */ - decode_help_display(); - return 1; - - /* ------------------------------------------------------ */ - - case 'y': { /* Image Directory path */ - img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1); - strcpy(img_fol->imgdirpath, opj_optarg); - img_fol->set_imgdir = 1; - } - break; - /* ----------------------------------------------------- */ - case 'x': { /* Creation of index file */ - char *index = opj_optarg; - strncpy(indexfilename, index, OPJ_PATH_LEN); - } - break; - /* ----------------------------------------------------- */ - /* UniPG>> */ -#ifdef USE_JPWL - - case 'W': { /* activate JPWL correction */ - char *token = NULL; - - token = strtok(opj_optarg, ","); - while (token != NULL) { - - /* search expected number of components */ - if (*token == 'c') { - - static int compno; - - compno = JPWL_EXPECTED_COMPONENTS; /* predefined no. of components */ - - if (sscanf(token, "c=%d", &compno) == 1) { - /* Specified */ - if ((compno < 1) || (compno > 256)) { - fprintf(stderr, "ERROR -> invalid number of components c = %d\n", compno); - return 1; - } - parameters->jpwl_exp_comps = compno; - - } else if (!strcmp(token, "c")) { - /* default */ - parameters->jpwl_exp_comps = compno; /* auto for default size */ - - } else { - fprintf(stderr, "ERROR -> invalid components specified = %s\n", token); - return 1; - }; - } - - /* search maximum number of tiles */ - if (*token == 't') { - - static int tileno; - - tileno = JPWL_MAXIMUM_TILES; /* maximum no. of tiles */ - - if (sscanf(token, "t=%d", &tileno) == 1) { - /* Specified */ - if ((tileno < 1) || (tileno > JPWL_MAXIMUM_TILES)) { - fprintf(stderr, "ERROR -> invalid number of tiles t = %d\n", tileno); - return 1; - } - parameters->jpwl_max_tiles = tileno; - - } else if (!strcmp(token, "t")) { - /* default */ - parameters->jpwl_max_tiles = tileno; /* auto for default size */ - - } else { - fprintf(stderr, "ERROR -> invalid tiles specified = %s\n", token); - return 1; - }; - } - - /* next token or bust */ - token = strtok(NULL, ","); - }; - parameters->jpwl_correct = OPJ_TRUE; - fprintf(stdout, "JPWL correction capability activated\n"); - fprintf(stdout, "- expecting %d components\n", parameters->jpwl_exp_comps); - } - break; -#endif /* USE_JPWL */ - /* <<UniPG */ - - /* ----------------------------------------------------- */ - - default: - fprintf(stderr, "WARNING -> this option is not valid \"-%c %s\"\n", c, - opj_optarg); - break; - } - } while (c != -1); - - /* check for possible errors */ - if (img_fol->set_imgdir == 1) { - if (!(parameters->infile[0] == 0)) { - fprintf(stderr, "Error: options -ImgDir and -i cannot be used together !!\n"); - return 1; - } - if (img_fol->set_out_format == 0) { - fprintf(stderr, - "Error: When -ImgDir is used, -OutFor <FORMAT> must be used !!\n"); - fprintf(stderr, - "Only one format allowed! Valid format PGM, PPM, PNM, PGX, BMP, TIF, RAW and TGA!!\n"); - return 1; - } - if (!((parameters->outfile[0] == 0))) { - fprintf(stderr, "Error: options -ImgDir and -o cannot be used together !!\n"); - return 1; - } - } else { - if ((parameters->infile[0] == 0) || (parameters->outfile[0] == 0)) { - fprintf(stderr, "Example: %s -i image.j2k -o image.pgm\n", argv[0]); - fprintf(stderr, " Try: %s -h\n", argv[0]); - return 1; - } - } - - return 0; -} - -/* -------------------------------------------------------------------------- */ - -/** -sample error callback expecting a FILE* client object -*/ -void error_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); -} -/** -sample warning callback expecting a FILE* client object -*/ -void warning_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); -} -/** -sample debug callback expecting no client object -*/ -void info_callback(const char *msg, void *client_data) -{ - (void)client_data; - fprintf(stdout, "[INFO] %s", msg); -} - -/* -------------------------------------------------------------------------- */ - -int main(int argc, char **argv) -{ - opj_dparameters_t parameters; /* decompression parameters */ - img_fol_t img_fol; - opj_event_mgr_t event_mgr; /* event manager */ - opj_image_t *image = NULL; - FILE *fsrc = NULL; - unsigned char *src = NULL; - int file_length; - int num_images; - int i, imageno; - dircnt_t *dirptr = NULL; - opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ - opj_cio_t *cio = NULL; - opj_codestream_info_t cstr_info; /* Codestream information structure */ - char indexfilename[OPJ_PATH_LEN]; /* index file name */ - - /* configure the event callbacks (not required) */ - memset(&event_mgr, 0, sizeof(opj_event_mgr_t)); - event_mgr.error_handler = error_callback; - event_mgr.warning_handler = warning_callback; - event_mgr.info_handler = info_callback; - - /* set decoding parameters to default values */ - opj_set_default_decoder_parameters(¶meters); - - /* Initialize indexfilename and img_fol */ - *indexfilename = 0; - memset(&img_fol, 0, sizeof(img_fol_t)); - - /* parse input and get user encoding parameters */ - if (parse_cmdline_decoder(argc, argv, ¶meters, &img_fol, - indexfilename) == 1) { - return 1; - } - - /* Initialize reading of directory */ - if (img_fol.set_imgdir == 1) { - num_images = get_num_images(img_fol.imgdirpath); - - 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*/ - if (!dirptr->filename_buf) { - free(dirptr); - return 1; - } - dirptr->filename = (char**) malloc(num_images * sizeof(char*)); - if (!dirptr->filename) { - free(dirptr); - return 1; - } - - 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 1; - } - if (num_images == 0) { - fprintf(stdout, "Folder is empty\n"); - return 1; - } - } else { - num_images = 1; - } - - /*Encoding image one by one*/ - for (imageno = 0; imageno < num_images ; imageno++) { - image = NULL; - fprintf(stderr, "\n"); - - if (img_fol.set_imgdir == 1) { - if (get_next_file(imageno, dirptr, &img_fol, ¶meters)) { - fprintf(stderr, "skipping file...\n"); - continue; - } - } - - /* read the input file and put it in memory */ - /* ---------------------------------------- */ - fsrc = fopen(parameters.infile, "rb"); - if (!fsrc) { - fprintf(stderr, "ERROR -> failed to open %s for reading\n", parameters.infile); - return 1; - } - fseek(fsrc, 0, SEEK_END); - file_length = ftell(fsrc); - fseek(fsrc, 0, SEEK_SET); - src = (unsigned char *) malloc(file_length); - if (fread(src, 1, file_length, fsrc) != (size_t)file_length) { - free(src); - fclose(fsrc); - fprintf(stderr, - "\nERROR: fread return a number of element different from the expected.\n"); - return 1; - } - fclose(fsrc); - - /* decode the code-stream */ - /* ---------------------- */ - - switch (parameters.decod_format) { - case J2K_CFMT: { - /* JPEG-2000 codestream */ - - /* get a decoder handle */ - dinfo = opj_create_decompress(CODEC_J2K); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); - - /* setup the decoder decoding parameters using user parameters */ - opj_setup_decoder(dinfo, ¶meters); - - /* open a byte stream */ - cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); - - /* decode the stream and fill the image structure */ - if (*indexfilename) { /* If need to extract codestream information*/ - image = opj_decode_with_info(dinfo, cio, &cstr_info); - } else { - image = opj_decode(dinfo, cio); - } - if (!image) { - fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); - opj_destroy_decompress(dinfo); - opj_cio_close(cio); - free(src); - return 1; - } - - /* close the byte stream */ - opj_cio_close(cio); - - /* Write the index to disk */ - if (*indexfilename) { - opj_bool bSuccess; - bSuccess = write_index_file(&cstr_info, indexfilename); - if (bSuccess) { - fprintf(stderr, "Failed to output index file\n"); - } - } - } - break; - - case JP2_CFMT: { - /* JPEG 2000 compressed image data */ - - /* get a decoder handle */ - dinfo = opj_create_decompress(CODEC_JP2); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); - - /* setup the decoder decoding parameters using the current image and user parameters */ - opj_setup_decoder(dinfo, ¶meters); - - /* open a byte stream */ - cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); - - /* decode the stream and fill the image structure */ - if (*indexfilename) { /* If need to extract codestream information*/ - image = opj_decode_with_info(dinfo, cio, &cstr_info); - } else { - image = opj_decode(dinfo, cio); - } - if (!image) { - fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); - opj_destroy_decompress(dinfo); - opj_cio_close(cio); - free(src); - return 1; - } - - /* close the byte stream */ - opj_cio_close(cio); - - /* Write the index to disk */ - if (*indexfilename) { - opj_bool bSuccess; - bSuccess = write_index_file(&cstr_info, indexfilename); - if (bSuccess) { - fprintf(stderr, "Failed to output index file\n"); - } - } - } - break; - - case JPT_CFMT: { - /* JPEG 2000, JPIP */ - - /* get a decoder handle */ - dinfo = opj_create_decompress(CODEC_JPT); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); - - /* setup the decoder decoding parameters using user parameters */ - opj_setup_decoder(dinfo, ¶meters); - - /* open a byte stream */ - cio = opj_cio_open((opj_common_ptr)dinfo, src, file_length); - - /* decode the stream and fill the image structure */ - if (*indexfilename) { /* If need to extract codestream information*/ - image = opj_decode_with_info(dinfo, cio, &cstr_info); - } else { - image = opj_decode(dinfo, cio); - } - if (!image) { - fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); - opj_destroy_decompress(dinfo); - opj_cio_close(cio); - free(src); - return 1; - } - - /* close the byte stream */ - opj_cio_close(cio); - - /* Write the index to disk */ - if (*indexfilename) { - opj_bool bSuccess; - bSuccess = write_index_file(&cstr_info, indexfilename); - if (bSuccess) { - fprintf(stderr, "Failed to output index file\n"); - } - } - } - break; - - default: - fprintf(stderr, "skipping file..\n"); - continue; - } - - /* free the memory containing the code-stream */ - free(src); - src = NULL; - - if (image->color_space == CLRSPC_SYCC) { - color_sycc_to_rgb(image); - } - - if (image->icc_profile_buf) { -#if defined(OPJ_HAVE_LIBLCMS1) || defined(OPJ_HAVE_LIBLCMS2) - color_apply_icc_profile(image); -#endif - - free(image->icc_profile_buf); - image->icc_profile_buf = NULL; - image->icc_profile_len = 0; - } - - /* create output image */ - /* ------------------- */ - switch (parameters.cod_format) { - case PXM_DFMT: /* PNM PGM PPM */ - if (imagetopnm(image, parameters.outfile)) { - fprintf(stdout, "Outfile %s not generated\n", parameters.outfile); - } else { - fprintf(stdout, "Generated Outfile %s\n", parameters.outfile); - } - break; - - case PGX_DFMT: /* PGX */ - if (imagetopgx(image, parameters.outfile)) { - fprintf(stdout, "Outfile %s not generated\n", parameters.outfile); - } else { - fprintf(stdout, "Generated Outfile %s\n", parameters.outfile); - } - break; - - case BMP_DFMT: /* BMP */ - if (imagetobmp(image, parameters.outfile)) { - fprintf(stdout, "Outfile %s not generated\n", parameters.outfile); - } else { - fprintf(stdout, "Generated Outfile %s\n", parameters.outfile); - } - break; -#ifdef OPJ_HAVE_LIBTIFF - case TIF_DFMT: /* TIFF */ - if (imagetotif(image, parameters.outfile)) { - fprintf(stdout, "Outfile %s not generated\n", parameters.outfile); - } else { - fprintf(stdout, "Generated Outfile %s\n", parameters.outfile); - } - break; -#endif /* OPJ_HAVE_LIBTIFF */ - case RAW_DFMT: /* RAW */ - if (imagetoraw(image, parameters.outfile)) { - fprintf(stdout, "Error generating raw file. Outfile %s not generated\n", - parameters.outfile); - } else { - fprintf(stdout, "Successfully generated Outfile %s\n", parameters.outfile); - } - break; - - case TGA_DFMT: /* TGA */ - if (imagetotga(image, parameters.outfile)) { - fprintf(stdout, "Error generating tga file. Outfile %s not generated\n", - parameters.outfile); - } else { - fprintf(stdout, "Successfully generated Outfile %s\n", parameters.outfile); - } - break; -#ifdef OPJ_HAVE_LIBPNG - case PNG_DFMT: /* PNG */ - if (imagetopng(image, parameters.outfile)) { - fprintf(stdout, "Error generating png file. Outfile %s not generated\n", - parameters.outfile); - } else { - fprintf(stdout, "Successfully generated Outfile %s\n", parameters.outfile); - } - break; -#endif /* OPJ_HAVE_LIBPNG */ - /* Can happen if output file is TIFF or PNG - * and OPJ_HAVE_LIBTIF or OPJ_HAVE_LIBPNG is undefined - */ - default: - fprintf(stderr, "Outfile %s not generated\n", parameters.outfile); - } - - /* free remaining structures */ - if (dinfo) { - opj_destroy_decompress(dinfo); - } - /* free codestream information structure */ - if (*indexfilename) { - opj_destroy_cstr_info(&cstr_info); - } - /* free image data structure */ - opj_image_destroy(image); - - } - return 0; -} -/*end main*/ - - - - diff --git a/src/bin/jpwl/windirent.h b/src/bin/jpwl/windirent.h deleted file mode 100644 index b7ed9a3c..00000000 --- a/src/bin/jpwl/windirent.h +++ /dev/null @@ -1,680 +0,0 @@ - -/* - * uce-dirent.h - operating system independent dirent implementation - * - * Copyright (C) 1998-2002 Toni Ronkko - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * ``Software''), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL TONI RONKKO BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * - * May 28 1998, Toni Ronkko <tronkko@messi.uku.fi> - * - * $Id: uce-dirent.h,v 1.7 2002/05/13 10:48:35 tr Exp $ - * - * $Log: uce-dirent.h,v $ - * Revision 1.7 2002/05/13 10:48:35 tr - * embedded some source code directly to the header so that no source - * modules need to be included in the MS Visual C project using the - * interface, removed all the dependencies to other headers of the `uce' - * library so that the header can be made public - * - * Revision 1.6 2002/04/12 16:22:04 tr - * Unified Compiling Environment (UCE) replaced `std' library - * - * Revision 1.5 2001/07/20 16:33:40 tr - * moved to `std' library and re-named defines accordingly - * - * Revision 1.4 2001/07/10 16:47:18 tronkko - * revised comments - * - * Revision 1.3 2001/01/11 13:16:43 tr - * using ``uce-machine.h'' for finding out defines such as `FREEBSD' - * - * Revision 1.2 2000/10/08 16:00:41 tr - * copy of FreeBSD man page - * - * Revision 1.1 2000/07/10 05:53:16 tr - * Initial revision - * - * Revision 1.2 1998/07/19 18:29:14 tr - * Added error reporting capabilities and some asserts. - * - * Revision 1.1 1998/07/04 16:27:51 tr - * Initial revision - * - * - * MSVC 1.0 scans automatic dependencies incorrectly when your project - * contains this very header. The problem is that MSVC cannot handle - * include directives inside #if..#endif block those are never entered. - * Since this header ought to compile in many different operating systems, - * there had to be several conditional blocks that are compiled only in - * operating systems for what they were designed for. MSVC 1.0 cannot - * handle inclusion of sys/dir.h in a part that is compiled only in Apollo - * operating system. To fix the problem you need to insert DIR.H into - * SYSINCL.DAT located in MSVC\BIN directory and restart visual C++. - * Consult manuals for more informaton about the problem. - * - * Since many UNIX systems have dirent.h we assume to have one also. - * However, if your UNIX system does not have dirent.h you can download one - * for example at: http://ftp.uni-mannheim.de/ftp/GNU/dirent/dirent.tar.gz. - * You can also see if you have one of dirent.h, direct.h, dir.h, ndir.h, - * sys/dir.h and sys/ndir.h somewhere. Try defining HAVE_DIRENT_H, - * HAVE_DIRECT_H, HAVE_DIR_H, HAVE_NDIR_H, HAVE_SYS_DIR_H and - * HAVE_SYS_NDIR_H according to the files found. - */ -#ifndef DIRENT_H -#define DIRENT_H -#define DIRENT_H_INCLUDED - -/* find out platform */ -#if defined(MSDOS) /* MS-DOS */ -#elif defined(__MSDOS__) /* Turbo C/Borland */ -# define MSDOS -#elif defined(__DOS__) /* Watcom */ -# define MSDOS -#endif - -#if defined(WIN32) /* MS-Windows */ -#elif defined(__NT__) /* Watcom */ -# define WIN32 -#elif defined(_WIN32) /* Microsoft */ -# define WIN32 -#elif defined(__WIN32__) /* Borland */ -# define WIN32 -#endif - -/* - * See what kind of dirent interface we have unless autoconf has already - * determinated that. - */ -#if !defined(HAVE_DIRENT_H) && !defined(HAVE_DIRECT_H) && !defined(HAVE_SYS_DIR_H) && !defined(HAVE_NDIR_H) && !defined(HAVE_SYS_NDIR_H) && !defined(HAVE_DIR_H) -# if defined(_MSC_VER) /* Microsoft C/C++ */ -/* no dirent.h */ -# elif defined(__MINGW32__) /* MinGW */ -/* no dirent.h */ -# elif defined(__BORLANDC__) /* Borland C/C++ */ -# define HAVE_DIRENT_H -# define VOID_CLOSEDIR -# elif defined(__TURBOC__) /* Borland Turbo C */ -/* no dirent.h */ -# elif defined(__WATCOMC__) /* Watcom C/C++ */ -# define HAVE_DIRECT_H -# elif defined(__apollo) /* Apollo */ -# define HAVE_SYS_DIR_H -# elif defined(__hpux) /* HP-UX */ -# define HAVE_DIRENT_H -# elif (defined(__alpha) || defined(__alpha__)) && !defined(__linux__) /* Alpha OSF1 */ -# error "not implemented" -# elif defined(__sgi) /* Silicon Graphics */ -# define HAVE_DIRENT_H -# elif defined(sun) || defined(__sun) /* Sun Solaris */ -# define HAVE_DIRENT_H -# elif defined(__FreeBSD__) /* FreeBSD */ -# define HAVE_DIRENT_H -# elif defined(__linux__) /* Linux */ -# define HAVE_DIRENT_H -# elif defined(__GNUC__) /* GNU C/C++ */ -# define HAVE_DIRENT_H -# else -# error "not implemented" -# endif -#endif - -/* include proper interface headers */ -#if defined(HAVE_DIRENT_H) -# include <dirent.h> -# ifdef FREEBSD -# define NAMLEN(dp) ((int)((dp)->d_namlen)) -# else -# define NAMLEN(dp) ((int)(strlen((dp)->d_name))) -# endif - -#elif defined(HAVE_NDIR_H) -# include <ndir.h> -# define NAMLEN(dp) ((int)((dp)->d_namlen)) - -#elif defined(HAVE_SYS_NDIR_H) -# include <sys/ndir.h> -# define NAMLEN(dp) ((int)((dp)->d_namlen)) - -#elif defined(HAVE_DIRECT_H) -# include <direct.h> -# define NAMLEN(dp) ((int)((dp)->d_namlen)) - -#elif defined(HAVE_DIR_H) -# include <dir.h> -# define NAMLEN(dp) ((int)((dp)->d_namlen)) - -#elif defined(HAVE_SYS_DIR_H) -# include <sys/types.h> -# include <sys/dir.h> -# ifndef dirent -# define dirent direct -# endif -# define NAMLEN(dp) ((int)((dp)->d_namlen)) - -#elif defined(MSDOS) || defined(WIN32) - -/* figure out type of underlaying directory interface to be used */ -# if defined(WIN32) -# define DIRENT_WIN32_INTERFACE -# elif defined(MSDOS) -# define DIRENT_MSDOS_INTERFACE -# else -# error "missing native dirent interface" -# endif - -/*** WIN32 specifics ***/ -# if defined(DIRENT_WIN32_INTERFACE) -# include <windows.h> -# if !defined(DIRENT_MAXNAMLEN) -# define DIRENT_MAXNAMLEN (MAX_PATH) -# endif - - -/*** MS-DOS specifics ***/ -# elif defined(DIRENT_MSDOS_INTERFACE) -# include <dos.h> - -/* Borland defines file length macros in dir.h */ -# if defined(__BORLANDC__) -# include <dir.h> -# if !defined(DIRENT_MAXNAMLEN) -# define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT)) -# endif -# if !defined(_find_t) -# define _find_t find_t -# endif - -/* Turbo C defines ffblk structure in dir.h */ -# elif defined(__TURBOC__) -# include <dir.h> -# if !defined(DIRENT_MAXNAMLEN) -# define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT)) -# endif -# define DIRENT_USE_FFBLK - -/* MSVC */ -# elif defined(_MSC_VER) -# if !defined(DIRENT_MAXNAMLEN) -# define DIRENT_MAXNAMLEN (12) -# endif - -/* Watcom */ -# elif defined(__WATCOMC__) -# if !defined(DIRENT_MAXNAMLEN) -# if defined(__OS2__) || defined(__NT__) -# define DIRENT_MAXNAMLEN (255) -# else -# define DIRENT_MAXNAMLEN (12) -# endif -# endif - -# endif -# endif - -/*** generic MS-DOS and MS-Windows stuff ***/ -# if !defined(NAME_MAX) && defined(DIRENT_MAXNAMLEN) -# define NAME_MAX DIRENT_MAXNAMLEN -# endif -# if NAME_MAX < DIRENT_MAXNAMLEN -# error "assertion failed: NAME_MAX >= DIRENT_MAXNAMLEN" -# endif - - -/* - * Substitute for real dirent structure. Note that `d_name' field is a - * true character array although we have it copied in the implementation - * dependent data. We could save some memory if we had declared `d_name' - * as a pointer referring the name within implementation dependent data. - * We have not done that since some code may rely on sizeof(d_name) to be - * something other than four. Besides, directory entries are typically so - * small that it takes virtually no time to copy them from place to place. - */ -typedef struct dirent { - char d_name[NAME_MAX + 1]; - - /*** Operating system specific part ***/ -# if defined(DIRENT_WIN32_INTERFACE) /*WIN32*/ - WIN32_FIND_DATA data; -# elif defined(DIRENT_MSDOS_INTERFACE) /*MSDOS*/ -# if defined(DIRENT_USE_FFBLK) - struct ffblk data; -# else - struct _find_t data; -# endif -# endif -} dirent; - -/* DIR substitute structure containing directory name. The name is - * essential for the operation of ``rewinndir'' function. */ -typedef struct DIR { - char *dirname; /* directory being scanned */ - dirent current; /* current entry */ - int dirent_filled; /* is current un-processed? */ - - /*** Operating system specific part ***/ -# if defined(DIRENT_WIN32_INTERFACE) - HANDLE search_handle; -# elif defined(DIRENT_MSDOS_INTERFACE) -# endif -} DIR; - -# ifdef __cplusplus -extern "C" { -# endif - -/* supply prototypes for dirent functions */ -static DIR *opendir(const char *dirname); -static struct dirent *readdir(DIR *dirp); -static int closedir(DIR *dirp); -static void rewinddir(DIR *dirp); - -/* - * Implement dirent interface as static functions so that the user does not - * need to change his project in any way to use dirent function. With this - * it is sufficient to include this very header from source modules using - * dirent functions and the functions will be pulled in automatically. - */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <assert.h> -#include <errno.h> - -/* use ffblk instead of _find_t if requested */ -#if defined(DIRENT_USE_FFBLK) -# define _A_ARCH (FA_ARCH) -# define _A_HIDDEN (FA_HIDDEN) -# define _A_NORMAL (0) -# define _A_RDONLY (FA_RDONLY) -# define _A_SUBDIR (FA_DIREC) -# define _A_SYSTEM (FA_SYSTEM) -# define _A_VOLID (FA_LABEL) -# define _dos_findnext(dest) findnext(dest) -# define _dos_findfirst(name,flags,dest) findfirst(name,dest,flags) -#endif - -static int _initdir(DIR *p); -static const char *_getdirname(const struct dirent *dp); -static void _setdirname(struct DIR *dirp); - -/* - * <function name="opendir"> - * <intro>open directory stream for reading - * <syntax>DIR *opendir (const char *dirname); - * - * <desc>Open named directory stream for read and return pointer to the - * internal working area that is used for retrieving individual directory - * entries. The internal working area has no fields of your interest. - * - * <ret>Returns a pointer to the internal working area or NULL in case the - * directory stream could not be opened. Global `errno' variable will set - * in case of error as follows: - * - * <table> - * [EACESS |Permission denied. - * [EMFILE |Too many open files used by the process. - * [ENFILE |Too many open files in system. - * [ENOENT |Directory does not exist. - * [ENOMEM |Insufficient memory. - * [ENOTDIR |dirname does not refer to directory. This value is not - * reliable on MS-DOS and MS-Windows platforms. Many - * implementations return ENOENT even when the name refers to a - * file.] - * </table> - * </function> - */ -static DIR *opendir(const char *dirname) -{ - DIR *dirp; - assert(dirname != NULL); - - dirp = (DIR*)malloc(sizeof(struct DIR)); - if (dirp != NULL) { - char *p; - - /* allocate room for directory name */ - dirp->dirname = (char*) malloc(strlen(dirname) + 1 + strlen("\\*.*")); - if (dirp->dirname == NULL) { - /* failed to duplicate directory name. errno set by malloc() */ - free(dirp); - return NULL; - } - /* Copy directory name while appending directory separator and "*.*". - * Directory separator is not appended if the name already ends with - * drive or directory separator. Directory separator is assumed to be - * '/' or '\' and drive separator is assumed to be ':'. */ - strcpy(dirp->dirname, dirname); - p = strchr(dirp->dirname, '\0'); - if (dirp->dirname < p && - *(p - 1) != '\\' && *(p - 1) != '/' && *(p - 1) != ':') { - strcpy(p++, "\\"); - } -# ifdef DIRENT_WIN32_INTERFACE - strcpy(p, "*"); /*scan files with and without extension in win32*/ -# else - strcpy(p, "*.*"); /*scan files with and without extension in DOS*/ -# endif - - /* open stream */ - if (_initdir(dirp) == 0) { - /* initialization failed */ - free(dirp->dirname); - free(dirp); - return NULL; - } - } - return dirp; -} - - -/* - * <function name="readdir"> - * <intro>read a directory entry - * <syntax>struct dirent *readdir (DIR *dirp); - * - * <desc>Read individual directory entry and return pointer to a structure - * containing the name of the entry. Individual directory entries returned - * include normal files, sub-directories, pseudo-directories "." and ".." - * and also volume labels, hidden files and system files in MS-DOS and - * MS-Windows. You might want to use stat(2) function to determinate which - * one are you dealing with. Many dirent implementations already contain - * equivalent information in dirent structure but you cannot depend on - * this. - * - * The dirent structure contains several system dependent fields that - * generally have no interest to you. The only interesting one is char - * d_name[] that is also portable across different systems. The d_name - * field contains the name of the directory entry without leading path. - * While d_name is portable across different systems the actual storage - * capacity of d_name varies from system to system and there is no portable - * way to find out it at compile time as different systems define the - * capacity of d_name with different macros and some systems do not define - * capacity at all (besides actual declaration of the field). If you really - * need to find out storage capacity of d_name then you might want to try - * NAME_MAX macro. The NAME_MAX is defined in POSIX standard although - * there are many MS-DOS and MS-Windows implementations those do not define - * it. There are also systems that declare d_name as "char d_name[1]" and - * then allocate suitable amount of memory at run-time. Thanks to Alain - * Decamps (Alain.Decamps@advalvas.be) for pointing it out to me. - * - * This all leads to the fact that it is difficult to allocate space - * for the directory names when the very same program is being compiled on - * number of operating systems. Therefore I suggest that you always - * allocate space for directory names dynamically. - * - * <ret> - * Returns a pointer to a structure containing name of the directory entry - * in `d_name' field or NULL if there was an error. In case of an error the - * global `errno' variable will set as follows: - * - * <table> - * [EBADF |dir parameter refers to an invalid directory stream. This value - * is not set reliably on all implementations.] - * </table> - * </function> - */ -static struct dirent * -readdir(DIR *dirp) -{ - assert(dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return NULL; - } - -#if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle == INVALID_HANDLE_VALUE) { - /* directory stream was opened/rewound incorrectly or it ended normally */ - errno = EBADF; - return NULL; - } -#endif - - if (dirp->dirent_filled != 0) { - /* - * Directory entry has already been retrieved and there is no need to - * retrieve a new one. Directory entry will be retrieved in advance - * when the user calls readdir function for the first time. This is so - * because real dirent has separate functions for opening and reading - * the stream whereas Win32 and DOS dirents open the stream - * automatically when we retrieve the first file. Therefore, we have to - * save the first file when opening the stream and later we have to - * return the saved entry when the user tries to read the first entry. - */ - dirp->dirent_filled = 0; - } else { - /* fill in entry and return that */ -#if defined(DIRENT_WIN32_INTERFACE) - if (FindNextFile(dirp->search_handle, &dirp->current.data) == FALSE) { - /* Last file has been processed or an error occurred */ - FindClose(dirp->search_handle); - dirp->search_handle = INVALID_HANDLE_VALUE; - errno = ENOENT; - return NULL; - } - -# elif defined(DIRENT_MSDOS_INTERFACE) - if (_dos_findnext(&dirp->current.data) != 0) { - /* _dos_findnext and findnext will set errno to ENOENT when no - * more entries could be retrieved. */ - return NULL; - } -# endif - - _setdirname(dirp); - assert(dirp->dirent_filled == 0); - } - return &dirp->current; -} - - -/* - * <function name="closedir"> - * <intro>close directory stream. - * <syntax>int closedir (DIR *dirp); - * - * <desc>Close directory stream opened by the `opendir' function. Close of - * directory stream invalidates the DIR structure as well as previously read - * dirent entry. - * - * <ret>The function typically returns 0 on success and -1 on failure but - * the function may be declared to return void on same systems. At least - * Borland C/C++ and some UNIX implementations use void as a return type. - * The dirent wrapper tries to define VOID_CLOSEDIR whenever closedir is - * known to return nothing. The very same definition is made by the GNU - * autoconf if you happen to use it. - * - * The global `errno' variable will set to EBADF in case of error. - * </function> - */ -static int -closedir(DIR *dirp) -{ - int retcode = 0; - - /* make sure that dirp points to legal structure */ - assert(dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return -1; - } - - /* free directory name and search handles */ - if (dirp->dirname != NULL) { - free(dirp->dirname); - } - -#if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle != INVALID_HANDLE_VALUE) { - if (FindClose(dirp->search_handle) == FALSE) { - /* Unknown error */ - retcode = -1; - errno = EBADF; - } - } -#endif - - /* clear dirp structure to make sure that it cannot be used anymore*/ - memset(dirp, 0, sizeof(*dirp)); -# if defined(DIRENT_WIN32_INTERFACE) - dirp->search_handle = INVALID_HANDLE_VALUE; -# endif - - free(dirp); - return retcode; -} - - -/* - * <function name="rewinddir"> - * <intro>rewind directory stream to the beginning - * <syntax>void rewinddir (DIR *dirp); - * - * <desc>Rewind directory stream to the beginning so that the next call of - * readdir() returns the very first directory entry again. However, note - * that next call of readdir() may not return the same directory entry as it - * did in first time. The directory stream may have been affected by newly - * created files. - * - * Almost every dirent implementation ensure that rewinddir will update - * the directory stream to reflect any changes made to the directory entries - * since the previous ``opendir'' or ``rewinddir'' call. Keep an eye on - * this if your program depends on the feature. I know at least one dirent - * implementation where you are required to close and re-open the stream to - * see the changes. - * - * <ret>Returns nothing. If something went wrong while rewinding, you will - * notice it later when you try to retrieve the first directory entry. - */ -static void -rewinddir(DIR *dirp) -{ - /* make sure that dirp is legal */ - assert(dirp != NULL); - if (dirp == NULL) { - errno = EBADF; - return; - } - assert(dirp->dirname != NULL); - - /* close previous stream */ -#if defined(DIRENT_WIN32_INTERFACE) - if (dirp->search_handle != INVALID_HANDLE_VALUE) { - if (FindClose(dirp->search_handle) == FALSE) { - /* Unknown error */ - errno = EBADF; - } - } -#endif - - /* re-open previous stream */ - if (_initdir(dirp) == 0) { - /* initialization failed but we cannot deal with error. User will notice - * error later when she tries to retrieve first directory enty. */ - /*EMPTY*/; - } -} - - -/* - * Open native directory stream object and retrieve first file. - * Be sure to close previous stream before opening new one. - */ -static int -_initdir(DIR *dirp) -{ - assert(dirp != NULL); - assert(dirp->dirname != NULL); - dirp->dirent_filled = 0; - -# if defined(DIRENT_WIN32_INTERFACE) - /* Open stream and retrieve first file */ - dirp->search_handle = FindFirstFile(dirp->dirname, &dirp->current.data); - if (dirp->search_handle == INVALID_HANDLE_VALUE) { - /* something went wrong but we don't know what. GetLastError() could - * give us more information about the error, but then we should map - * the error code into errno. */ - errno = ENOENT; - return 0; - } - -# elif defined(DIRENT_MSDOS_INTERFACE) - if (_dos_findfirst(dirp->dirname, - _A_SUBDIR | _A_RDONLY | _A_ARCH | _A_SYSTEM | _A_HIDDEN, - &dirp->current.data) != 0) { - /* _dos_findfirst and findfirst will set errno to ENOENT when no - * more entries could be retrieved. */ - return 0; - } -# endif - - /* initialize DIR and it's first entry */ - _setdirname(dirp); - dirp->dirent_filled = 1; - return 1; -} - - -/* - * Return implementation dependent name of the current directory entry. - */ -static const char * -_getdirname(const struct dirent *dp) -{ -#if defined(DIRENT_WIN32_INTERFACE) - return dp->data.cFileName; - -#elif defined(DIRENT_USE_FFBLK) - return dp->data.ff_name; - -#else - return dp->data.name; -#endif -} - - -/* - * Copy name of implementation dependent directory entry to the d_name field. - */ -static void -_setdirname(struct DIR *dirp) -{ - /* make sure that d_name is long enough */ - assert(strlen(_getdirname(&dirp->current)) <= NAME_MAX); - - strncpy(dirp->current.d_name, - _getdirname(&dirp->current), - NAME_MAX); - dirp->current.d_name[NAME_MAX] = '\0'; /*char d_name[NAME_MAX+1]*/ -} - -# ifdef __cplusplus -} -# endif -# define NAMLEN(dp) ((int)(strlen((dp)->d_name))) - -#else -# error "missing dirent interface" -#endif - - -#endif /*DIRENT_H*/ diff --git a/src/bin/mj2/CMakeLists.txt b/src/bin/mj2/CMakeLists.txt deleted file mode 100644 index 5d3e288b..00000000 --- a/src/bin/mj2/CMakeLists.txt +++ /dev/null @@ -1,47 +0,0 @@ -# Makefile for the MJ2 codecs of the OpenJPEG library: frames_to_mj2, mj2_to_frames, extract_j2k_from_mj2 and wrap_j2k_in_mj2 - -set(common_SRCS ${OPENJPEG_SOURCE_DIR}/src/bin/common/opj_getopt.c) - -if(WIN32) - if(BUILD_SHARED_LIBS) - add_definitions(-DOPJ_EXPORTS) - else() - add_definitions(-DOPJ_STATIC) - endif() -endif() - -# Headers file are located here: -include_directories( - ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h - ${OPENJPEG_BINARY_DIR}/src/bin/common # opj_apps_config.h - ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2 - ${OPENJPEG_SOURCE_DIR}/src/bin/common - ${LCMS_INCLUDE_DIRNAME} - ) - -foreach(exe - opj_mj2_wrap - opj_mj2_extract - opj_mj2_decompress - opj_mj2_compress -) - add_definitions(-DOPJ_USE_LEGACY) - add_executable(${exe} - ${exe}.c - ${common_SRCS} - ${MJ2_SRCS} - ${OPENJPEG_SOURCE_DIR}/src/bin/common/color.c - ) - set_property( - TARGET ${exe} - APPEND PROPERTY COMPILE_DEFINITIONS USE_MJ2 - ) - target_link_libraries(${exe} ${LCMS_LIBNAME} openmj2) - - if(UNIX) - target_link_libraries(${exe} m) - endif() - - install(TARGETS ${exe} - DESTINATION ${OPENJPEG_INSTALL_BIN_DIR}) -endforeach() diff --git a/src/bin/mj2/meta_out.c b/src/bin/mj2/meta_out.c deleted file mode 100644 index 139b2704..00000000 --- a/src/bin/mj2/meta_out.c +++ /dev/null @@ -1,2858 +0,0 @@ -/* meta_out.c */ -/* Dump MJ2, JP2 metadata (partial so far) to xml file */ -/* Callable from mj2_to_metadata */ -/* Contributed to Open JPEG by Glenn Pearson, contract software developer, U.S. National Library of Medicine. - -The base code in this file was developed by the author as part of a video archiving -project for the U.S. National Library of Medicine, Bethesda, MD. -It is the policy of NLM (and U.S. government) to not assert copyright. - -A non-exclusive copy of this code has been contributed to the Open JPEG project. -Except for copyright, inclusion of the code within Open JPEG for distribution and use -can be bound by the Open JPEG open-source license and disclaimer, expressed elsewhere. -*/ - -#include <windows.h> /* for time functions */ - -#include "opj_includes.h" -#include "mj2.h" - -#include <time.h> -#include "meta_out.h" - -static BOOL notes = TRUE; -static BOOL sampletables = FALSE; -static BOOL raw = TRUE; -static BOOL derived = TRUE; - -opj_tcp_t *j2k_default_tcp; - -/* Forwards */ -int xml_write_overall_header(FILE *file, FILE *xmlout, opj_mj2_t * movie, - unsigned int sampleframe, opj_event_mgr_t *event_mgr); -int xml_write_moov(FILE *file, FILE *xmlout, opj_mj2_t * movie, - unsigned int sampleframe, opj_event_mgr_t *event_mgr); - -void uint_to_chars(unsigned int value, char* buf); - -void xml_write_trak(FILE* file, FILE* xmlout, mj2_tk_t *track, - unsigned int tnum, unsigned int sampleframe, opj_event_mgr_t *event_mgr); -void xml_write_tkhd(FILE* file, FILE* xmlout, mj2_tk_t *track, - unsigned int tnum); -void xml_write_udta(FILE* file, FILE* xmlout, mj2_tk_t *track, - unsigned int tnum); -void xml_write_mdia(FILE* file, FILE* xmlout, mj2_tk_t *track, - unsigned int tnum); -void xml_write_stbl(FILE* file, FILE* xmlout, mj2_tk_t *track, - unsigned int tnum); - -void UnixTimeToFileTime(time_t t, LPFILETIME pft); -void UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst); -void xml_time_out(FILE* xmlout, time_t t); - -void int16_to_3packedchars(short int value, char* buf); - -void xml_write_moov_udta(FILE* xmlout, opj_mj2_t * movie); -void xml_write_free_and_skip(FILE* xmlout, opj_mj2_t * movie); -void xml_write_uuid(FILE* xmlout, opj_mj2_t * movie); - -int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample, - unsigned int snum, opj_event_mgr_t *event_mgr); - -void xml_out_frame_siz(FILE* xmlout, opj_image_t *img, opj_cp_t *cp); -void xml_out_frame_cod(FILE* xmlout, opj_tcp_t *tcp); -void xml_out_frame_coc(FILE* xmlout, opj_tcp_t *tcp, - int numcomps); /* opj_image_t *img); */ -BOOL same_component_style(opj_tccp_t *tccp1, opj_tccp_t *tccp2); -void xml_out_frame_qcd(FILE* xmlout, opj_tcp_t *tcp); -void xml_out_frame_qcc(FILE* xmlout, opj_tcp_t *tcp, - int numcomps); /* opj_image_t *img); */ -BOOL same_component_quantization(opj_tccp_t *tccp1, opj_tccp_t *tccp2); -void xml_out_frame_rgn(FILE* xmlout, opj_tcp_t *tcp, - int numcomps);/* opj_image_t *img);*/ -void xml_out_frame_poc(FILE* xmlout, opj_tcp_t *tcp); -void xml_out_frame_ppm(FILE* xmlout, opj_cp_t *cp); -void xml_out_frame_ppt(FILE* xmlout, opj_tcp_t *tcp); -void xml_out_frame_tlm(FILE* - xmlout); /* j2k_default_tcp is passed globally */ /* NO-OP. TLM NOT SAVED IN DATA STRUCTURE */ -void xml_out_frame_plm(FILE* - xmlout); /* j2k_default_tcp is passed globally */ /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE. opt in main; can be used in conjunction with PLT */ -void xml_out_frame_plt(FILE* xmlout, - opj_tcp_t *tcp); /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE. opt in main; can be used in conjunction with PLT */ -void xml_out_frame_crg(FILE* - xmlout); /* j2k_default_tcp is passed globally */ /* opt in main; */ -void xml_out_frame_com(FILE* xmlout, - opj_tcp_t *tcp); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ -void xml_out_dump_hex(FILE* xmlout, char *data, int data_len, char* s); -void xml_out_dump_hex_and_ascii(FILE* xmlout, char *data, int data_len, - char* s); -void xml_out_frame_jp2h(FILE* xmlout, opj_jp2_t *jp2_struct); -#ifdef NOTYET -/* Shown with cp, extended, as data structure... but it could be a new different one */ -void xml_out_frame_jp2i(FILE* xmlout, - opj_cp_t *cp);/* IntellectualProperty 'jp2i' (no restrictions on location) */ -void xml_out_frame_xml(FILE* xmlout, - opj_cp_t *cp); /* XML 'xml\040' (0x786d6c20). Can appear multiply */ -void xml_out_frame_uuid(FILE* xmlout, - opj_cp_t *cp); /* UUID 'uuid' (top level only) */ -void xml_out_frame_uinf(FILE* xmlout, - opj_cp_t *cp); /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ -void xml_out_frame_unknown_type(FILE* xmlout, opj_cp_t *cp); -#endif - - -void xml_write_init(BOOL n, BOOL t, BOOL r, BOOL d) -{ - /* Init file globals */ - notes = n; - sampletables = t; - raw = r; - derived = d; -} - -int xml_write_struct(FILE* file, FILE *xmlout, opj_mj2_t * movie, - unsigned int sampleframe, char* stringDTD, opj_event_mgr_t *event_mgr) -{ - - if (stringDTD != NULL) { - fprintf(xmlout, "<?xml version=\"1.0\" standalone=\"no\"?>\n"); - /* stringDTD is known to start with "SYSTEM " or "PUBLIC " */ - /* typical: SYSTEM mj2_to_metadata.dtd */ - stringDTD[6] = - '\0'; /* Break into two strings at space, so quotes can be inserted. */ - fprintf(xmlout, "<!DOCTYPE MJ2_File %s \"%s\">\n", stringDTD, stringDTD + 7); - stringDTD[6] = ' '; /* restore for sake of debugger or memory allocator */ - } else { - fprintf(xmlout, "<?xml version=\"1.0\" standalone=\"yes\"?>\n"); - } - - fprintf(xmlout, "<MJ2_File>\n"); - xml_write_overall_header(file, xmlout, movie, sampleframe, event_mgr); - fprintf(xmlout, "</MJ2_File>"); - return 0; -} - -/* ------------- */ - -int xml_write_overall_header(FILE *file, FILE *xmlout, opj_mj2_t * movie, - unsigned int sampleframe, opj_event_mgr_t *event_mgr) -{ - int i; - char buf[5]; - buf[4] = '\0'; - - fprintf(xmlout, - " <JP2 BoxType=\"jP[space][space]\" Signature=\"0x0d0a870a\" />\n"); - // Called after structure initialized by mj2_read_ftyp - fprintf(xmlout, " <FileType BoxType=\"ftyp\">\n"); - uint_to_chars(movie->brand, buf); - fprintf(xmlout, " <Brand>%s</Brand>\n", - buf); /* 4 character; BR */ - fprintf(xmlout, " <MinorVersion>%u</MinorVersion>\n", - movie->minversion); /* 4 char; MinV */ - fprintf(xmlout, " <CompatibilityList Count=\"%d\">\n", movie->num_cl); - for (i = movie->num_cl - 1; i > -1; - i--) { /* read routine stored in reverse order, so let's undo damage */ - uint_to_chars(movie->cl[i], buf); - fprintf(xmlout, " <CompatibleBrand>%s</CompatibleBrand>\n", - buf); /*4 characters, each CLi */ - } - fprintf(xmlout, " </CompatibilityList>\n"); - fprintf(xmlout, " </FileType>\n"); - xml_write_moov(file, xmlout, movie, sampleframe, event_mgr); - // To come? <mdat> // This is the container for media data that can also be accessed through track structures, - // so is redundant, and simply not of interest as metadata - // <moof> // Allows incremental build up of movie. Probably not in Simple Profile - xml_write_free_and_skip(xmlout, - movie); /* NO OP so far */ /* May be a place where user squirrels metadata */ - xml_write_uuid(xmlout, - movie); /* NO OP so far */ /* May be a place where user squirrels metadata */ - return 0; -} - -/* ------------- */ - -int xml_write_moov(FILE *file, FILE *xmlout, opj_mj2_t * movie, - unsigned int sampleframe, opj_event_mgr_t *event_mgr) -{ - unsigned int tnum; - mj2_tk_t *track; - - fprintf(xmlout, " <MovieBox BoxType=\"moov\">\n"); - fprintf(xmlout, " <MovieHeader BoxType=\"mvhd\">\n"); - fprintf(xmlout, " <CreationTime>\n"); - if (raw) { - fprintf(xmlout, " <InSeconds>%u</InSeconds>\n", movie->creation_time); - } - if (notes) { - fprintf(xmlout, - " <!-- Seconds since start of Jan. 1, 1904 UTC (Greenwich) -->\n"); - } - /* 2082844800 = seconds between 1/1/04 and 1/1/70 */ - /* There's still a time zone offset problem not solved... but spec is ambiguous as to whether stored time - should be local or UTC */ - if (derived) { - fprintf(xmlout, " <AsLocalTime>"); - xml_time_out(xmlout, movie->creation_time - 2082844800); - fprintf(xmlout, "</AsLocalTime>\n"); - } - fprintf(xmlout, " </CreationTime>\n"); - fprintf(xmlout, " <ModificationTime>\n"); - if (raw) { - fprintf(xmlout, " <InSeconds>%u</InSeconds>\n", - movie->modification_time); - } - if (derived) { - fprintf(xmlout, " <AsLocalTime>"); - xml_time_out(xmlout, movie->modification_time - 2082844800); - fprintf(xmlout, "</AsLocalTime>\n"); - } - fprintf(xmlout, " </ModificationTime>\n"); - fprintf(xmlout, " <Timescale>%d</Timescale>\n", movie->timescale); - if (notes) { - fprintf(xmlout, " <!-- Timescale defines time units in one second -->\n"); - } - fprintf(xmlout, - " <Rate>\n"); /* Rate to play presentation (default = 0x00010000) */ - if (notes) { - fprintf(xmlout, - " <!-- Rate to play presentation is stored as fixed-point binary 16.16 value. Decimal value is approximation. -->\n"); - fprintf(xmlout, - " <!-- Rate is expressed relative to normal (default) value of 0x00010000 (1.0) -->\n"); - } - if (raw) { - fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", movie->rate); - } - if (derived) { - fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", - (double)movie->rate / (double)0x00010000); - } - fprintf(xmlout, " </Rate>\n"); - fprintf(xmlout, " <Duration>\n"); - if (raw) { - fprintf(xmlout, " <InTimeUnits>%u</InTimeUnits>\n", movie->duration); - } - if (derived) { - fprintf(xmlout, " <InSeconds>%12.3f</InSeconds>\n", - (double)movie->duration / (double) - movie->timescale); // Make this double later to get fractional seconds - } - fprintf(xmlout, " </Duration>\n"); -#ifdef CURRENTSTRUCT - movie->volume = movie->volume << 8; -#endif - fprintf(xmlout, " <Volume>\n"); - if (notes) { - fprintf(xmlout, - " <!-- Audio volume stored as fixed-point binary 8.8 value. Decimal value is approximation. -->\n"); - fprintf(xmlout, - " <!-- Full, normal (default) value is 0x0100 (1.0) -->\n"); - } - if (raw) { - fprintf(xmlout, " <AsHex>0x%04x</AsHex>\n", movie->volume); - } - if (derived) { - fprintf(xmlout, " <AsDecimal>%6.3f</AsDecimal>\n", - (double)movie->volume / (double)0x0100); - } - fprintf(xmlout, " </Volume>\n"); -#ifdef CURRENTSTRUCT - if (notes) { - fprintf(xmlout, - " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n"); - } - movie->volume = movie->volume >> 8; -#endif - /* Transformation matrix for video */ - fprintf(xmlout, " <TransformationMatrix>\n"); - if (notes) { - fprintf(xmlout, - " <!-- 3 x 3 Video Transformation Matrix {a,b,u,c,d,v,x,y,w}. Required: u=0, v=0, w=1 -->\n"); - fprintf(xmlout, - " <!-- Maps decompressed point (p,q) to rendered point (ap + cq + x, bp + dq + y) -->\n"); - fprintf(xmlout, - " <!-- Stored as Fixed Point Hex: all are binary 16.16, except u,v,w are 2.30 -->\n"); - fprintf(xmlout, - " <!-- Unity = 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 -->\n"); - } - fprintf(xmlout, " <TMa>0x%08x</TMa>\n", movie->trans_matrix[0]); - fprintf(xmlout, " <TMb>0x%08x</TMb>\n", movie->trans_matrix[1]); - fprintf(xmlout, " <TMu>0x%08x</TMu>\n", movie->trans_matrix[2]); - fprintf(xmlout, " <TMc>0x%08x</TMc>\n", movie->trans_matrix[3]); - fprintf(xmlout, " <TMd>0x%08x</TMd>\n", movie->trans_matrix[4]); - fprintf(xmlout, " <TMv>0x%08x</TMv>\n", movie->trans_matrix[5]); - fprintf(xmlout, " <TMx>0x%08x</TMx>\n", movie->trans_matrix[6]); - fprintf(xmlout, " <TMy>0x%08x</TMy>\n", movie->trans_matrix[7]); - fprintf(xmlout, " <TMw>0x%08x</TMw>\n", movie->trans_matrix[8]); - fprintf(xmlout, " </TransformationMatrix>\n"); - fprintf(xmlout, " </MovieHeader>\n"); - - fprintf(xmlout, " <Statistics>\n"); - fprintf(xmlout, " <TracksFound>\n"); - fprintf(xmlout, " <Video>%d</Video>\n", movie->num_vtk); - fprintf(xmlout, " <Audio>%d</Audio>\n", movie->num_stk); - fprintf(xmlout, " <Hint>%d</Hint>\n", movie->num_htk); - if (notes) { - fprintf(xmlout, - " <!-- Hint tracks for streaming video are not part of MJ2, but are a defined extension. -->\n"); - } - /* See Part 3 Amend 2 Section 4.2 for relation of MJ2 to Part 12 Sections 7 and 10 hints */ - fprintf(xmlout, " </TracksFound>\n"); - fprintf(xmlout, " </Statistics>\n"); - /* Idea for the future: It would be possible to add code to verify that the file values: - 1) are legal and self-consistent - 2) comply with particular JP2 and/or MJ2 profiles. - This could be reported here as additional XML elements */ - - // Find first video track - tnum = 0; - while (movie->tk[tnum].track_type != 0) { - tnum ++; - } - - track = &(movie->tk[tnum]); - // For now, output info on first video track - xml_write_trak(file, xmlout, track, tnum, sampleframe, event_mgr); - - // to come: <MovieExtends mvek> // possibly not in Simple Profile - xml_write_moov_udta(xmlout, - movie); /* NO OP so far */ /* <UserDataBox udta> contains <CopyrightBox cprt> */ - fprintf(xmlout, " </MovieBox>\n"); - return 0; -} - -/* --------------- */ - -void uint_to_chars(unsigned int value, char* buf) -{ - /* buf is at least char[5] */ - int i; - for (i = 3; i >= 0; i--) { - buf[i] = (value & 0x000000ff); - value = (value >> 8); - } - buf[4] = '\0'; /* Precautionary */ -} - -/* ------------- */ - -/* WINDOWS SPECIFIC */ - -void UnixTimeToFileTime(time_t t, LPFILETIME pft) -{ - /* Windows specific. From MS Q167296 */ - /* 'time_t' represents seconds since midnight January 1, 1970 UTC (coordinated universal time). */ - /* 64-bit FILETIME structure represents the number of 100-nanosecond intervals since January 1, 1601 UTC (coordinate universal time). */ - LONGLONG ll; /* LONGLONG is a 64-bit value. */ - ll = Int32x32To64(t, 10000000) + 116444736000000000; - pft->dwLowDateTime = (DWORD)ll; - /* pft->dwLowDateTime = (DWORD)(0x00000000ffffffff & ll); */ - pft->dwHighDateTime = (DWORD)(ll >> 32); -} -// Once the UNIX time is converted to a FILETIME structure, -// other Win32 time formats can be easily obtained by using Win32 functions such -// as FileTimeToSystemTime() and FileTimeToDosDateTime(). - -/* ------------- */ - -void UnixTimeToSystemTime(time_t t, LPSYSTEMTIME pst) -{ - /* Windows specific */ - FILETIME ft; - UnixTimeToFileTime(t, &ft); - FileTimeToLocalFileTime(&ft, &ft); /* Adjust from UTC to local time zone */ - FileTimeToSystemTime(&ft, pst); -} - -/* ------------- */ - -void xml_time_out(FILE* xmlout, time_t t) -{ - /* Windows specific */ - SYSTEMTIME st; - char szLocalDate[255], szLocalTime[255]; - UnixTimeToSystemTime(t, &st); - GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, szLocalDate, 255); - GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, szLocalTime, 255); - fprintf(xmlout, "%s %s", szLocalDate, szLocalTime); -} - -/* END WINDOWS SPECIFIC */ - -/* ------------- */ - -void xml_write_moov_udta(FILE* xmlout, opj_mj2_t * movie) -{ - /* Compare with xml_write_udta */ -#ifdef NOTYET - /* NO-OP so far. Optional UserData 'udta' (zero or one in moov or each trak) - can contain multiple Copyright 'cprt' with different language codes */ - /* There may be nested non-standard boxes within udta */ - IMAGINE movie->udta, movie->copyright_count, - movie->copyright_language[i](array of 16bit ints), - movie->copyright_notice[i](array of buffers) - PROBABLY ALSO NEED movie->udta_len or special handler for non - standard boxes - char buf[5]; - int i; - - if (movie->udta != 1) { - return; /* Not present */ - } - - fprintf(xmlout, " <UserData BoxType=\"udta\">\n"); - for (i = 0; i < movie->copyright_count; i++) { - fprintf(xmlout, " <Copyright BoxType=\"cprt\"> Instance=\"%d\">\n", - i + 1); - int16_to_3packedchars((short int)movie->copyright_languages[i], buf); - fprintf(xmlout, " <Language>%s</Language>\n", buf); /* 3 chars */ - fprintf(xmlout, " <Notice>%s</Notice>\n", movie->copyright_notices[i]); - fprintf(xmlout, " </Copyright>\n", i + 1); - } - /* TO DO: Non-standard boxes */ - fprintf(xmlout, " </UserData>\n"); -#endif -} - -void xml_write_free_and_skip(FILE* xmlout, opj_mj2_t * movie) -{ -#ifdef NOTYET - /* NO-OP so far. There can be zero or more instances of free and/or skip - at the top level of the file. This may be a place where the user squirrel's metadata. - Let's assume unstructured, and do a dump */ - IMAGINE movie->free_and_skip, movie->free_and_skip_count, - movie->free_and_skip_content[i](array of buffers), - movie->free_and_skip_len[i](array of ints), movie->is_skip[i](array of BOOL) - int i; - - if (movie->free_and_skip != 1) { - return; /* Not present */ - } - - for (i = 0; i < movie->free_and_skip_count; i++) { - if (movie->is_skip[i]) { - fprintf(xmlout, " <Skip BoxType=\"skip\">\n"); - } else { - fprintf(xmlout, " <Free BoxType=\"free\">\n"); - } - - xml_out_dump_hex_and_ascii(xmlout, movie->free_and_skip_contents[i], - movie->free_and_skip_len[i]); - - if (movie->is_skip[i]) { - fprintf(xmlout, " </Skip>\n"); - } else { - fprintf(xmlout, " </Free>\n"); - } - } -#endif -} - -void xml_write_uuid(FILE* xmlout, opj_mj2_t * movie) -{ - /* Universal Unique IDs of 16 bytes. */ -#ifdef NOTYET - /* NO-OP so far. There can be zero or more instances of private uuid boxes in a file. - This function supports the top level of the file, but uuid may be elsewhere [not yet supported]. - This may be a place where the user squirrel's metadata. Let's assume unstructured, and do a dump */ - IMAGINE movie->uuid, movie->uuid_count, - movie->uuid_content[i](array of buffers), - movie->uuid_len[i](array of ints), - movie->uuid_type[i](array of 17 - byte(16 + null termination) buffers) - int i; - - if (movie->uuid != 1) { - return; /* Not present */ - } - - for (i = 0; i < movie->uuid_count; i++) { - fprintf(xmlout, " <PrivateExtension BoxType=\"uuid\" UUID=\"%s\">\n", - movie->uuid_type[i]); - // See Part III section 5.2.1, 6.1, 6.2 - xml_out_dump_hex_and_ascii(xmlout, movie->uuid_contents[i], movie->uuid_len[i]); - fprintf(xmlout, " </PrivateExtension>\n"); - } -#endif -} - -/* ------------- */ - -void xml_write_trak(FILE* file, FILE* xmlout, mj2_tk_t *track, - unsigned int tnum, unsigned int sampleframe, opj_event_mgr_t *event_mgr) -{ - fprintf(xmlout, " <Track BoxType=\"trak\" Instance=\"%d\">\n", tnum); - xml_write_tkhd(file, xmlout, track, tnum); - // TO DO: TrackReferenceContainer 'tref' just used in hint track - // TO DO: EditListContainer 'edts', contains EditList 'elst' with media-time, segment-duration, media-rate - xml_write_mdia(file, xmlout, track, tnum); - xml_write_udta(file, xmlout, track, - tnum); // NO-OP so far. Optional UserData 'udta', can contain multiple Copyright 'cprt' - - if (track->track_type == 0) { /* Only do for visual track */ - /* sampleframe is from user option -f. 1 = first frame */ - /* sampleframe of 0 is a user requests: no jp2 header */ - /* Treat out-of-bounds values in the same way */ - if (sampleframe > 0 && sampleframe <= track->num_samples) { - mj2_sample_t *sample; - unsigned int snum; - - snum = sampleframe - 1; - // Someday maybe do a smart range scan... for (snum=0; snum < track->num_samples; snum++){ - // fprintf(stdout,"Frame %d: ",snum+1); - sample = &track->sample[snum]; - if (xml_out_frame(file, xmlout, sample, snum, event_mgr)) { - return; /* Not great error handling here */ - } - } - } - fprintf(xmlout, " </Track>\n"); -} - -/* ------------- */ - -void xml_write_tkhd(FILE* file, FILE* xmlout, mj2_tk_t *track, - unsigned int tnum) -{ - fprintf(xmlout, " <TrackHeader BoxType=\"tkhd\">\n"); - if (notes) { - fprintf(xmlout, - " <!-- Not shown here: CreationTime, ModificationTime, Duration. -->\n"); - fprintf(xmlout, - " <!-- These 3 fields are reported under MediaHeader below. When reading these 3, -->\n"); - fprintf(xmlout, - " <!-- m2j_to_metadata currently doesn't distinguish between TrackHeader and MediaHeader source. -->\n"); - fprintf(xmlout, - " <!-- If both found, value read from MediaHeader is used. -->\n"); - } - fprintf(xmlout, " <TrackID>%u</TrackID>\n", track->track_ID); - if (track->track_type == 0) { /* For visual track */ - fprintf(xmlout, " <TrackLayer>%d</TrackLayer>\n", track->layer); - if (notes) { - fprintf(xmlout, - " <!-- front-to-back ordering of video tracks. 0 = normal, -1 is closer, etc. -->\n"); - } - } - if (track->track_type != 0) { /* volume irrelevant for visual track */ -#ifdef CURRENTSTRUCT - track->volume = track->volume << 8; -#endif - fprintf(xmlout, " <Volume>\n"); - if (notes) { - fprintf(xmlout, - " <!-- Track audio volume stored as fixed-point binary 8.8 value. Decimal value is approximation. -->\n"); - fprintf(xmlout, - " <!-- Full, normal (default) value is 0x0100 (1.0) -->\n"); - } - if (raw) { - fprintf(xmlout, " <AsHex>0x%04x</AsHex>\n", track->volume); - } - if (derived) { - fprintf(xmlout, " <AsDecimal>%6.3f</AsDecimal>\n", - (double)track->volume / (double)0x0100); - } - fprintf(xmlout, " </Volume>\n"); -#ifdef CURRENTSTRUCT - if (notes) { - fprintf(xmlout, - " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n"); - } - track->volume = track->volume >> 8; -#endif - } - if (track->track_type == 0) { - /* Transformation matrix for video */ - fprintf(xmlout, " <TransformationMatrix>\n"); - if (notes) { - fprintf(xmlout, - " <!-- Comments about matrix in MovieHeader apply here as well. -->\n"); - fprintf(xmlout, - " <!-- This matrix is applied before MovieHeader one. -->\n"); - } - fprintf(xmlout, " <TMa>0x%08x</TMa>\n", track->trans_matrix[0]); - fprintf(xmlout, " <TMb>0x%08x</TMb>\n", track->trans_matrix[1]); - fprintf(xmlout, " <TMu>0x%08x</TMu>\n", track->trans_matrix[2]); - fprintf(xmlout, " <TMc>0x%08x</TMc>\n", track->trans_matrix[3]); - fprintf(xmlout, " <TMd>0x%08x</TMd>\n", track->trans_matrix[4]); - fprintf(xmlout, " <TMv>0x%08x</TMv>\n", track->trans_matrix[5]); - fprintf(xmlout, " <TMx>0x%08x</TMx>\n", track->trans_matrix[6]); - fprintf(xmlout, " <TMy>0x%08x</TMy>\n", track->trans_matrix[7]); - fprintf(xmlout, " <TMw>0x%08x</TMw>\n", track->trans_matrix[8]); - fprintf(xmlout, " </TransformationMatrix>\n"); - } -#ifdef CURRENTSTRUCT - track->w = track->w << 16; - track->h = track->h << 16; -#endif - if (notes) { - fprintf(xmlout, - " <!-- Width and Height in pixels are for the presentation; frames will be scaled to this. -->\n"); - fprintf(xmlout, - " <!-- Both stored as fixed-point binary 16.16 values. Decimal values are approximations. -->\n"); - } - fprintf(xmlout, " <Width>\n"); - if (raw) { - fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", track->w); - } - if (derived) { - fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", - (double)track->w / (double) - 0x00010000); /* Rate to play presentation (default = 0x00010000) */ - } - fprintf(xmlout, " </Width>\n"); - fprintf(xmlout, " <Height>\n"); - if (raw) { - fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", track->h); - } - if (derived) { - fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", - (double)track->h / (double) - 0x00010000); /* Rate to play presentation (default = 0x00010000) */ - } - fprintf(xmlout, " </Height>\n"); -#ifdef CURRENTSTRUCT - if (notes) { - fprintf(xmlout, - " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n"); - fprintf(xmlout, - " <!-- Also, width and height values shown here will actually be those read from track's <VisualSampleEntry> if given. -->\n"); - } - track->w = track->w >> 16; - track->h = track->h >> 16; -#endif - fprintf(xmlout, " </TrackHeader>\n"); -} - -/* ------------- */ - -void xml_write_udta(FILE* file, FILE* xmlout, mj2_tk_t *track, - unsigned int tnum) -{ - /* NO-OP so far. Optional UserData 'udta' (zero or one in moov or each trak) - can contain multiple Copyright 'cprt' with different language codes */ - /* There may be nested non-standard boxes within udta */ -#ifdef NOTYET - IMAGINE track->udta, track->copyright_count, - track->copyright_language[i](array of 16bit ints), - track->copyright_notice[i](array of buffers) - PROBABLY ALSO NEED track->udta_len or special handler for non - standard boxes - char buf[5]; - int i; - - if (track->udta != 1) { - return; /* Not present */ - } - - fprintf(xmlout, " <UserData BoxType=\"udta\">\n"); - for (i = 0; i < track->copyright_count; i++) { - fprintf(xmlout, " <Copyright BoxType=\"cprt\"> Instance=\"%d\">\n", - i + 1); - int16_to_3packedchars((short int)track->copyright_languages[i], buf); - fprintf(xmlout, " <Language>%s</Language>\n", buf); /* 3 chars */ - fprintf(xmlout, " <Notice>%s</Notice>\n", - track->copyright_notices[i]); - fprintf(xmlout, " </Copyright>\n", i + 1); - } - /* TO DO: Non-standard boxes */ - fprintf(xmlout, " </UserData>\n"); -#endif -} - -/* ------------- */ - -void xml_write_mdia(FILE* file, FILE* xmlout, mj2_tk_t *track, - unsigned int tnum) -{ - char buf[5]; - int i, k; - buf[4] = '\0'; - - fprintf(xmlout, " <Media BoxType=\"mdia\">\n"); - fprintf(xmlout, " <MediaHeader BoxType=\"mdhd\">\n"); - fprintf(xmlout, " <CreationTime>\n"); - if (raw) { - fprintf(xmlout, " <InSeconds>%u</InSeconds>\n", - track->creation_time); - } - if (notes) { - fprintf(xmlout, - " <!-- Seconds since start of Jan. 1, 1904 UTC (Greenwich) -->\n"); - } - /* 2082844800 = seconds between 1/1/04 and 1/1/70 */ - /* There's still a time zone offset problem not solved... but spec is ambiguous as to whether stored time - should be local or UTC */ - if (derived) { - fprintf(xmlout, " <AsLocalTime>"); - xml_time_out(xmlout, track->creation_time - 2082844800); - fprintf(xmlout, "</AsLocalTime>\n"); - } - fprintf(xmlout, " </CreationTime>\n"); - fprintf(xmlout, " <ModificationTime>\n"); - if (raw) { - fprintf(xmlout, " <InSeconds>%u</InSeconds>\n", - track->modification_time); - } - if (derived) { - fprintf(xmlout, " <AsLocalTime>"); - xml_time_out(xmlout, track->modification_time - 2082844800); - fprintf(xmlout, "</AsLocalTime>\n"); - } - fprintf(xmlout, " </ModificationTime>\n"); - fprintf(xmlout, " <Timescale>%d</Timescale>\n", track->timescale); - if (notes) { - fprintf(xmlout, - " <!-- Timescale defines time units in one second -->\n"); - } - fprintf(xmlout, " <Duration>\n"); - if (raw) { - fprintf(xmlout, " <InTimeUnits>%u</InTimeUnits>\n", - track->duration); - } - if (derived) { - fprintf(xmlout, " <InSeconds>%12.3f</InSeconds>\n", - (double)track->duration / (double) - track->timescale); // Make this double later to get fractional seconds - } - fprintf(xmlout, " </Duration>\n"); - int16_to_3packedchars((short int)track->language, buf); - fprintf(xmlout, " <Language>%s</Language>\n", buf); /* 3 chars */ - fprintf(xmlout, " </MediaHeader>\n"); - fprintf(xmlout, " <HandlerReference BoxType=\"hdlr\">\n"); - switch (track->track_type) { - case 0: - fprintf(xmlout, - " <HandlerType Code=\"vide\">video media track</HandlerType>\n"); - break; - case 1: - fprintf(xmlout, " <HandlerType Code=\"soun\">Sound</HandlerType>\n"); - break; - case 2: - fprintf(xmlout, " <HandlerType Code=\"hint\">Hint</HandlerType>\n"); - break; - } - if (notes) { - fprintf(xmlout, - " <!-- String value shown is not actually read from file. -->\n"); - fprintf(xmlout, - " <!-- Shown value is one used for our encode. -->\n"); - } - fprintf(xmlout, " </HandlerReference>\n"); - fprintf(xmlout, " <MediaInfoContainer BoxType=\"minf\">\n"); - switch (track->track_type) { - case 0: - fprintf(xmlout, " <VideoMediaHeader BoxType=\"vmhd\">\n"); - fprintf(xmlout, " <GraphicsMode>0x%02x</GraphicsMode>\n", - track->graphicsmode); - if (notes) { - fprintf(xmlout, " <!-- Enumerated values of graphics mode: -->\n"); - fprintf(xmlout, " <!-- 0x00 = copy (over existing image); -->\n"); - fprintf(xmlout, - " <!-- 0x24 = transparent; 'blue-screen' this image using opcolor; -->\n"); - fprintf(xmlout, - " <!-- 0x100 = alpha; alpha-blend this image -->\n"); - /* fprintf(xmlout," <!-- 0x101 = whitealpha; alpha-blend this image, which has been blended with white; -->\n"); This was evidently dropped upon amendment */ - fprintf(xmlout, - " <!-- 0x102 = pre-multiplied black alpha; image has been already been alpha-blended with black. -->\n"); - fprintf(xmlout, - " <!-- 0x110 = component alpha; blend alpha channel(s) and color channels individually. -->\n"); - } - fprintf(xmlout, " <Opcolor>\n"); - fprintf(xmlout, " <Red>0x%02x</Red>\n", track->opcolor[0]); - fprintf(xmlout, " <Green>0x%02x</Green>\n", track->opcolor[1]); - fprintf(xmlout, " <Blue>0x%02x</Blue>\n", track->opcolor[2]); - fprintf(xmlout, " </Opcolor>\n"); - fprintf(xmlout, " </VideoMediaHeader>\n"); - break; - case 1: - fprintf(xmlout, " <SoundMediaHeader BoxType=\"smhd\">\n"); -#ifdef CURRENTSTRUCT - track->balance = track->balance << 8; -#endif - fprintf(xmlout, " <Balance>\n"); - if (notes) { - fprintf(xmlout, - " <!-- Track audio balance fixes mono track in stereo space. -->\n"); - fprintf(xmlout, - " <!-- Stored as fixed-point binary 8.8 value. Decimal value is approximation. -->\n"); - fprintf(xmlout, - " <!-- 0.0 = center, -1.0 = full left, 1.0 = full right -->\n"); - } - if (raw) { - fprintf(xmlout, " <AsHex>0x%04x</AsHex>\n", track->balance); - } - if (derived) { - fprintf(xmlout, " <AsDecimal>%6.3f</AsDecimal>\n", - (double)track->balance / (double)0x0100); - } - fprintf(xmlout, " </Balance>\n"); -#ifdef CURRENTSTRUCT - if (notes) { - fprintf(xmlout, - " <!-- Current m2j_to_metadata implementation always shows bits to right of decimal as zeroed. -->\n"); - } - track->balance = track->balance >> 8; -#endif - fprintf(xmlout, " </SoundMediaHeader>\n"); - break; - case 2: - fprintf(xmlout, " <HintMediaHeader BoxType=\"hmhd\">\n"); - fprintf(xmlout, " <MaxPDU_Size>%d</MaxPDU_Size>\n", - track->maxPDUsize); - if (notes) { - fprintf(xmlout, - " <!-- Size in bytes of largest PDU in this hint stream. -->\n"); - } - fprintf(xmlout, " <AvgPDU_Size>%d</AvgPDU_Size>\n", - track->avgPDUsize); - if (notes) { - fprintf(xmlout, - " <!-- Average size in bytes of a PDU over the entire presentation. -->\n"); - } - fprintf(xmlout, " <MaxBitRate>%d</MaxBitRate>\n", - track->maxbitrate); - if (notes) { - fprintf(xmlout, - " <!-- Maximum rate in bits per second over any window of 1 second. -->\n"); - } - fprintf(xmlout, " <AvgBitRate>%d</AvgBitRate>\n", - track->avgbitrate); - if (notes) { - fprintf(xmlout, - " <!-- Averate rate in bits per second over the entire presentation. -->\n"); - } - fprintf(xmlout, " <SlidingAvgBit>%d</SlidingAvgBitRate>\n", - track->slidingavgbitrate); - if (notes) { - fprintf(xmlout, - " <!-- Maximum rate in bits per second over any window of one minute. -->\n"); - } - fprintf(xmlout, " </HintMediaHeader>\n"); - break; - } - fprintf(xmlout, " <DataInfo BoxType=\"dinf\">\n"); - fprintf(xmlout, - " <DataReference BoxType=\"dref\" URL_Count=\"%d\" URN_Count=\"%d\">\n", - track->num_url, track->num_urn); // table w. flags, URLs, URNs - // Data structure does not distinguish between single URL, single URN, or DREF table or URLs & URNs. - // We could infer those, but for now just present everything as a DREF table. - if (notes) { - fprintf(xmlout, - " <!-- No entries here mean that file is self-contained, as required by Simple Profile. -->\n"); - } - for (k = 0; k < track->num_url; k++) { - fprintf(xmlout, - " <DataEntryUrlBox BoxType=\"url[space]\">\n"); // table w. flags, URLs, URNs - if (notes) { - fprintf(xmlout, - " <!-- Only the first 16 bytes of URL location are recorded in mj2_to_metadata data structure. -->\n"); - } - for (i = 0; i < 4; i++) { - uint_to_chars(track->url[track->num_url].location[i], buf); - fprintf(xmlout, " <Location>%s</Location>\n", buf); - } - fprintf(xmlout, - " </DataEntryUrlBox>\n"); // table w. flags, URLs, URNs - } - for (k = 0; k < track->num_urn; k++) { - fprintf(xmlout, - " <DataEntryUrnBox BoxType=\"urn[space]\">\n"); // table w. flags, URLs, URNs - // Only the first 16 bytes are recorded in the data structure currently. - if (notes) { - fprintf(xmlout, - " <!-- Only the first 16 bytes each of URN name and optional location are recorded in mj2_to_metadata data structure. -->\n"); - } - fprintf(xmlout, " <Name>"); - for (i = 0; i < 4; i++) { - uint_to_chars(track->urn[track->num_urn].name[i], buf); - fprintf(xmlout, "%s", buf); - } - fprintf(xmlout, "</Name>\n"); - fprintf(xmlout, " <Location>"); - for (i = 0; i < 4; i++) { - uint_to_chars(track->urn[track->num_urn].location[i], buf); - fprintf(xmlout, "%s", buf); - } - fprintf(xmlout, "</Location>\n"); - fprintf(xmlout, " </DataEntryUrnBox>\n"); - } - fprintf(xmlout, " </DataReference>\n"); - fprintf(xmlout, " </DataInfo>\n"); - - xml_write_stbl(file, xmlout, track, tnum); /* SampleTable */ - - fprintf(xmlout, " </MediaInfoContainer>\n"); - fprintf(xmlout, " </Media>\n"); -} - -/* ------------- */ - -void xml_write_stbl(FILE* file, FILE* xmlout, mj2_tk_t *track, - unsigned int tnum) -{ - char buf[5], buf33[33]; - int i, len; - buf[4] = '\0'; - - fprintf(xmlout, " <SampleTable BoxType=\"stbl\">\n"); - if (notes) { - fprintf(xmlout, - " <!-- What follows are specific instances of generic SampleDescription BoxType=\"stsd\" -->\n"); - } - switch (track->track_type) { - case 0: - // There could be multiple instances of this, but "entry_count" is just a local at read-time. - // And it's used wrong, too, as count of just visual type, when it's really all 3 types. - // This is referred to as "smj2" within mj2.c - fprintf(xmlout, " <VisualSampleEntry BoxType=\"mjp2\">\n"); - if (notes) { - fprintf(xmlout, - " <!-- If multiple instances of this box, only first is shown here. -->\n"); - fprintf(xmlout, - " <!-- Width and Height are in pixels. Unlike the Track Header, there is no fractional part. -->\n"); - fprintf(xmlout, - " <!-- In mj2_to_metadata implementation, the values are not represented separately from Track Header's values. -->\n"); - } - /* No shifting required. If CURRENTSTRUCT gets changed, then may need to revisit treatment of these */ - fprintf(xmlout, " <WidthAsInteger>%d</WidthAsInteger>\n", - track->w); - fprintf(xmlout, " <HeightAsInteger>%d</HeightAsInteger>\n", - track->h); -// Horizresolution and vertresolution don't require shifting, already stored right in CURRENTSTRUCT - if (notes) { - fprintf(xmlout, - " <!-- Resolutions are in pixels per inch, for the highest-resolution component (typically luminance). -->\n"); - fprintf(xmlout, - " <!-- Both stored as fixed-point binary 16.16 values. Decimal values are approximations. -->\n"); - fprintf(xmlout, - " <!-- Typical value for both resolutions is 0x00480000 (72.0) -->\n"); - } - fprintf(xmlout, " <HorizontalRes>\n"); - if (raw) { - fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", - track->horizresolution); - } - if (derived) { - fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", - (double)track->horizresolution / (double) - 0x00010000); /* Rate to play presentation (default = 0x00010000) */ - } - fprintf(xmlout, " </HorizontalRes>\n"); - fprintf(xmlout, " <VerticalRes>\n"); - if (raw) { - fprintf(xmlout, " <AsHex>0x%08x</AsHex>\n", - track->vertresolution); - } - if (derived) { - fprintf(xmlout, " <AsDecimal>%12.6f</AsDecimal>\n", - (double)track->vertresolution / (double) - 0x00010000); /* Rate to play presentation (default = 0x00010000) */ - } - fprintf(xmlout, " </VerticalRes>\n"); - - buf33[0] = '\0'; - for (i = 0; i < 8; i++) { - uint_to_chars((unsigned int)track->compressorname[i], buf); - strcat(buf33, - buf); /* This loads up (4 * 8) + 1 chars, but trailing ones are usually junk */ - } - len = (int) - buf33[0]; /* First byte has string length in bytes. There may be garbage beyond it. */ - buf33[len + 1] = '\0'; /* Suppress it */ - fprintf(xmlout, " <CompressorName>%s</CompressorName>\n", - buf33 + 1); /* Start beyond first byte */ - if (notes) { - fprintf(xmlout, - " <!-- Compressor name for debugging. Standard restricts max length to 31 bytes. -->\n"); - fprintf(xmlout, - " <!-- Usually blank or \"Motion JPEG2000\" -->\n"); - } - fprintf(xmlout, " <Depth>0x%02x</Depth>\n", track->depth); - if (notes) { - fprintf(xmlout, " <!-- Depth is: -->\n"); - fprintf(xmlout, - " <!-- 0x20: alpha channels present (color or grayscale) -->\n"); - fprintf(xmlout, " <!-- 0x28: grayscale without alpha -->\n"); - fprintf(xmlout, " <!-- 0x18: color without alpha -->\n"); - } - - xml_out_frame_jp2h(xmlout, &(track->jp2_struct)); /* JP2 Header */ - - /* Following subboxes are optional */ - fprintf(xmlout, " <FieldCoding BoxType=\"fiel\">\n"); - fprintf(xmlout, " <FieldCount>%d</FieldCount>\n", - (unsigned int)track->fieldcount); /* uchar as 1 byte uint */ - if (notes) { - fprintf(xmlout, " <!-- Must be either 1 or 2 -->\n"); - } - fprintf(xmlout, " <FieldOrder>%d</FieldOrder>\n", - (unsigned int)track->fieldorder); /* uchar as 1 byte uint */ - if (notes) { - fprintf(xmlout, - " <!-- When FieldCount=2, FieldOrder means: -->\n"); - fprintf(xmlout, " <!-- 0: Field coding unknown -->\n"); - fprintf(xmlout, - " <!-- 1: Field with topmost line is stored first in sample; fields are in temporal order -->\n"); - fprintf(xmlout, - " <!-- 6: Field with topmost line is stored second in sample; fields are in temporal order -->\n"); - fprintf(xmlout, - " <!-- Defaults: FieldCount=1, FieldOrder=0 if FieldCoding box not present -->\n"); - fprintf(xmlout, - " <!-- Current implementation doesn't retain whether box was actually present. -->\n"); - } - fprintf(xmlout, " </FieldCoding>\n"); - - fprintf(xmlout, - " <MJP2_Profile BoxType=\"jp2p\" Count=\"%d\">\n", track->num_br); - for (i = 0; i < track->num_br; - i++) { /* read routine stored in reverse order, so let's undo damage */ - uint_to_chars(track->br[i], buf); - fprintf(xmlout, " <CompatibleBrand>%s</CompatibleBrand>\n", - buf); /*4 characters, each CLi */ - } - fprintf(xmlout, " </MJP2_Profile>\n"); - - fprintf(xmlout, - " <MJP2_Prefix BoxType=\"jp2x\" Count=\"%d\">\n", track->num_jp2x); - for (i = 0; i < track->num_jp2x; i++) { - // We'll probably need better formatting than this - fprintf(xmlout, " <Data>0x%02x</Data>\n", - track->jp2xdata[i]); /* Each entry is single byte */ - } - fprintf(xmlout, " </MJP2_Prefix>\n"); - - fprintf(xmlout, - " <MJP2_SubSampling BoxType=\"jsub\">\n"); /* These values are all 1 byte */ - if (notes) { - fprintf(xmlout, - " <!-- Typical subsample value is 2 for 4:2:0 -->\n"); - } - fprintf(xmlout, " <HorizontalSub>%d</HorizontalSub>\n", - track->hsub); - fprintf(xmlout, " <VerticalSub>%d</VerticalSub>\n", - track->vsub); - fprintf(xmlout, " <HorizontalOffset>%d</HorizontalOffset>\n", - track->hoff); - fprintf(xmlout, " <VerticalOffset>%d</VerticalOffset>\n", - track->voff); - if (notes) { - fprintf(xmlout, - " <!-- Typical {horizontal, vertical} chroma offset values: -->\n"); - fprintf(xmlout, - " <!-- 4:2:2 format (CCIR601, H.262, MPEG2, MPEG4, recom. Exif): {0, 0} -->\n"); - fprintf(xmlout, - " <!-- 4:2:2 format (JFIF): {1, 0} -->\n"); - fprintf(xmlout, - " <!-- 4:2:0 format (H.262, MPEG2, MPEG4): {0, 1} -->\n"); - fprintf(xmlout, - " <!-- 4:2:0 format (MPEG1, H.261, JFIF, recom. Exif): {1, 1} -->\n"); - } - fprintf(xmlout, - " </MJP2_SubSampling>\n"); /* These values are all 1 byte */ - - fprintf(xmlout, - " <MJP2_OriginalFormat BoxType=\"orfo\">\n"); /* Part III Appx. 2 */ - fprintf(xmlout, - " <OriginalFieldCount>%u</OriginalFieldCount>\n", - (unsigned int)track->or_fieldcount); /* uchar as 1-byte uint */ - if (notes) { - fprintf(xmlout, - " <!-- In original material before encoding. Must be either 1 or 2 -->\n"); - } - fprintf(xmlout, - " <OriginalFieldOrder>%u</OriginalFieldOrder>\n", - (unsigned int)track->or_fieldorder); /* uchar as 1-byte uint */ - if (notes) { - fprintf(xmlout, - " <!-- When FieldCount=2, FieldOrder means: -->\n"); - fprintf(xmlout, " <!-- 0: Field coding unknown -->\n"); - fprintf(xmlout, - " <!-- 11: Topmost line came from the earlier field; -->\n"); - fprintf(xmlout, - " <!-- 16: Topmost line came form the later field. -->\n"); - fprintf(xmlout, - " <!-- Defaults: FieldCount=1, FieldOrder=0 if FieldCoding box not present -->\n"); - fprintf(xmlout, - " <!-- Current implementation doesn't retain whether box was actually present. -->\n"); - } - fprintf(xmlout, " </MJP2_OriginalFormat>\n"); - fprintf(xmlout, " </VisualSampleEntry>\n"); - break; - case 1: - case 2: - if (notes) { - fprintf(xmlout, - " <!-- mj2_to_metadata's data structure doesn't record this currently. -->\n"); - } - break; - } - fprintf(xmlout, " <TimeToSample BoxType=\"stts\">\n"); - fprintf(xmlout, " <SampleStatistics>\n"); - fprintf(xmlout, " <TotalSamples>%d</TotalSamples>\n", - track->num_samples); - if (notes) { - fprintf(xmlout, - " <!-- For video, gives the total frames in the track, by summing all entries in the Sample Table -->\n"); - } - fprintf(xmlout, " </SampleStatistics>\n"); - fprintf(xmlout, " <SampleEntries EntryCount=\"%d\">\n", - track->num_tts); - for (i = 0; i < track->num_tts; i++) { - fprintf(xmlout, - " <Table Entry=\"%u\" SampleCount=\"%d\" SampleDelta=\"%u\" />\n", - i + 1, track->tts[i].sample_count, track->tts[i].sample_delta); - } - fprintf(xmlout, " </SampleEntries>\n"); - fprintf(xmlout, " </TimeToSample>\n"); - - fprintf(xmlout, - " <SampleToChunk BoxType=\"stsc\" Count=\"%d\">\n", - track->num_samplestochunk); - for (i = 0; i < track->num_samplestochunk; i++) { - fprintf(xmlout, " <FirstChunk>%u</FirstChunk>\n", - track->sampletochunk[i].first_chunk); /* 4 bytes */ - fprintf(xmlout, " <SamplesPerChunk>%u</SamplesPerChunk>\n", - track->sampletochunk[i].samples_per_chunk); /* 4 bytes */ - fprintf(xmlout, " <SampleDescrIndex>%u</SampleDescrIndex>\n", - track->sampletochunk[i].sample_descr_idx); /* 4 bytes */ - } - fprintf(xmlout, " </SampleToChunk>\n"); - // After reading this info in, track->num_chunks is calculated and a decompressed table established internally. - - fprintf(xmlout, " <SampleSize BoxType=\"stsz\">\n"); - if (track->same_sample_size) { - // all values in track->sample[i].sample_size are equal. Grab the first one. - fprintf(xmlout, " <Sample_Size>%u</Sample_Size>\n", - track->sample[0].sample_size); - if (notes) { - fprintf(xmlout, - " <!-- Non-zero value means all samples have that size. -->\n"); - fprintf(xmlout, - " <!-- So <Sample_Count> (aka Entry_Count in std.) has no meaning, is suppressed from this output, and no table follows. -->\n"); - } - } else { - fprintf(xmlout, " <Sample_Size>0</Sample_Size>\n"); - if (notes) - if (sampletables) { - fprintf(xmlout, - " <!-- Zero value means samples have different sizes, given in table next of length Sample_Count (aka Entry_Count in std). -->\n"); - } else { - fprintf(xmlout, - " <!-- Zero value means samples have different sizes, given in table (not shown) of length Sample_Count (aka Entry_Count in std). -->\n"); - } - fprintf(xmlout, " <Sample_Count>%u</Sample_Count>\n", - track->num_samples); - if (sampletables) - for (i = 0; i < (int)track->num_samples; i++) { - fprintf(xmlout, " <EntrySize Num=\"%u\">%u</EntrySize>\n", i + 1, - track->sample[i].sample_size); - } - } - fprintf(xmlout, " </SampleSize>\n"); - - fprintf(xmlout, " <ChunkOffset BoxType=\"stco\">\n"); - // Structure not yet - Variant ChunkLargeOffset 'co64' - fprintf(xmlout, " <EntryCount>%u</EntryCount>\n", - track->num_chunks); - if (notes) { - fprintf(xmlout, - " <!-- For this implementation, EntryCount shown is one calculated during file read of <SampleToChunk> data. -->\n"); - fprintf(xmlout, - " <!-- Implementation will report failure during file read of <ChunkOffset> data if read entry-count disagrees. -->\n"); - } - if (sampletables) - for (i = 0; i < (int)track->num_chunks; i++) { - fprintf(xmlout, " <Chunk_Offset Num=\"%d\">%u</Chunk_Offset>\n", - i + 1, track->chunk[i].offset); - } - fprintf(xmlout, " </ChunkOffset>\n"); - - fprintf(xmlout, " </SampleTable>\n"); -} - -/* ------------- */ - -int xml_out_frame(FILE* file, FILE* xmlout, mj2_sample_t *sample, - unsigned int snum, opj_event_mgr_t *event_mgr) -{ - opj_dparameters_t parameters; /* decompression parameters */ - opj_image_t *img; - opj_cp_t *cp; - int i; - int numcomps; - unsigned char* frame_codestream; - opj_dinfo_t* dinfo = NULL; /* handle to a decompressor */ - opj_cio_t *cio = NULL; - opj_j2k_t *j2k; - - /* JPEG 2000 compressed image data */ - - /* get a decoder handle */ - dinfo = opj_create_decompress(CODEC_J2K); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, event_mgr, stderr); - - /* setup the decoder decoding parameters using the current image and user parameters */ - parameters.cp_limit_decoding = DECODE_ALL_BUT_PACKETS; - opj_setup_decoder(dinfo, ¶meters); - - frame_codestream = (unsigned char*) malloc(sample->sample_size - - 8); /* Skipping JP2C marker */ - if (frame_codestream == NULL) { - return 1; - } - - fseek(file, sample->offset + 8, SEEK_SET); - fread(frame_codestream, sample->sample_size - 8, 1, - file); /* Assuming that jp and ftyp markers size do */ - - /* open a byte stream */ - cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, - sample->sample_size - 8); - - /* Decode J2K to image: */ - img = opj_decode(dinfo, cio); - if (!img) { - fprintf(stderr, "ERROR -> j2k_to_image: failed to decode image!\n"); - opj_destroy_decompress(dinfo); - opj_cio_close(cio); - return 1; - } - - j2k = (opj_j2k_t*)dinfo->j2k_handle; - j2k_default_tcp = j2k->default_tcp; - cp = j2k->cp; - - numcomps = img->numcomps; - /* Alignments: " < To help maintain xml pretty-printing */ - fprintf(xmlout, " <JP2_Frame Num=\"%d\">\n", snum + 1); - fprintf(xmlout, " <MainHeader>\n"); - /* There can be multiple codestreams; a particular image is entirely within a single codestream */ - /* TO DO: A frame can be represented by two I-guess-contiguous codestreams if its interleaved. */ - fprintf(xmlout, " <StartOfCodestream Marker=\"SOC\" />\n"); - /* "cp" stands for "coding parameter"; "tcp" is tile coding parameters, "tccp" is tile-component coding parameters */ - xml_out_frame_siz(xmlout, img, cp); /* reqd in main */ - xml_out_frame_cod(xmlout, j2k_default_tcp); /* reqd in main */ - xml_out_frame_coc(xmlout, j2k_default_tcp, - numcomps); /* opt in main, at most 1 per component */ - xml_out_frame_qcd(xmlout, j2k_default_tcp); /* reqd in main */ - xml_out_frame_qcc(xmlout, j2k_default_tcp, - numcomps); /* opt in main, at most 1 per component */ - xml_out_frame_rgn(xmlout, j2k_default_tcp, - numcomps); /* opt, at most 1 per component */ - xml_out_frame_poc(xmlout, - j2k_default_tcp); /* opt (but reqd in main or tile for any progression order changes) */ - /* Next four get j2k_default_tcp passed globally: */ -#ifdef SUPPRESS_FOR_NOW - xml_out_frame_ppm(xmlout, - cp); /* opt (but either PPM or PPT [distributed in tile headers] or codestream packet header reqd) */ -#endif - xml_out_frame_tlm( - xmlout); /* NO-OP. TLM NOT SAVED IN DATA STRUCTURE */ /* opt */ - xml_out_frame_plm( - xmlout); /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE */ /* opt in main; can be used in conjunction with PLT */ - xml_out_frame_crg( - xmlout); /* NO-OP. CRG NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ - xml_out_frame_com(xmlout, - j2k_default_tcp); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main; */ - - fprintf(xmlout, " </MainHeader>\n"); - - /* TO DO: all the tile headers (sigh) */ - fprintf(xmlout, " <TilePartHeaders Count=\"%d\">\n", - cp->tileno_size); /* size of the vector tileno */ - for (i = 0; i < cp->tileno_size; - i++) { /* I think cp->tileno_size will be same number as (cp->tw * cp->th) or as global j2k_curtileno */ - // Standard seems to use zero-based # for tile-part. - fprintf(xmlout, " <TilePartHeader Num=\"%d\" ID=\"%d\">\n", i, - cp->tileno[i]); /* ID number of the tiles present in the codestream */ - fprintf(xmlout, " <StartOfTilePart Marker=\"SOT\" />\n"); - /* All markers in tile-part headers (between SOT and SOD) are optional, unless structure requires. */ - if (i == 0) { - xml_out_frame_cod(xmlout, &(cp->tcps[i])); /* No more than 1 per tile */ - xml_out_frame_coc(xmlout, &(cp->tcps[i]), - numcomps); /* No more than 1 per component */ - xml_out_frame_qcd(xmlout, &(cp->tcps[i])); /* No more than 1 per tile */ - xml_out_frame_qcc(xmlout, &(cp->tcps[i]), - numcomps); /* No more than 1 per component */ - xml_out_frame_rgn(xmlout, &(cp->tcps[i]), - numcomps); /* No more than 1 per component */ - } - xml_out_frame_poc(xmlout, - &(cp->tcps[i])); /* Reqd only if any progression order changes different from main POC */ -#ifdef SUPPRESS_FOR_NOW - xml_out_frame_ppt(xmlout, - &(cp->tcps[i])); /* Either PPT [distributed in tile headers] or PPM or codestream packet header reqd. */ -#endif - xml_out_frame_plt(xmlout, - &(cp->tcps[i])); /* NO-OP. PLT NOT SAVED IN DATA STRUCTURE */ /* Can be used in conjunction with main's PLM */ - xml_out_frame_com(xmlout, - &(cp->tcps[i])); /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ - /* opj_tcp_t * cp->tcps; "tile coding parameters" */ - /* Maybe not: fprintf(xmlout, " <>%d</>, cp->matrice[i]; */ /* Fixed layer */ - fprintf(xmlout, " <StartOfData Marker=\"SOD\" />\n"); - if (notes) { - fprintf(xmlout, - " <!-- Tile-part bitstream, not shown, follows tile-part header and SOD marker. -->\n"); - } - fprintf(xmlout, " </TilePartHeader>\n"); - } - fprintf(xmlout, - " </TilePartHeaders>\n"); /* size of the vector tileno */ - -#ifdef NOTYET - IMAGINE the cp object has data to support the following... but we could use an - new different data structure instead - /* I'm unclear if the span of the original fread(frame_codestream...) included the following items if they're trailing. */ - /* ALSO TO DO, BUT DATA STRUCTURE DOESN'T HANDLE YET: boxes (anywhere in file except before the Filetype box): */ - xml_out_frame_jp2i(xmlout, - &cp); /* IntellectualProperty 'jp2i' (no restrictions on location) */ - xml_out_frame_xml(xmlout, - &cp); /* XML 'xml\040' (0x786d6c20). Can appear multiply */ - xml_out_frame_uuid(xmlout, &cp); /* UUID 'uuid' (top level only) */ - xml_out_frame_uinf(xmlout, - &cp); /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ -#endif - - fprintf(xmlout, " </JP2_Frame>\n"); - - /* Extra commentary: */ - if (notes) { - fprintf(xmlout, - " <!-- Given the number and size of components, mj2_to_frame would try to convert this -->\n"); - if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2) - && (img->comps[0].dx == img->comps[2].dx / 2) && (img->comps[0].dx == 1)) - || (img->numcomps == 1)) { - fprintf(xmlout, " <!-- file to a YUV movie in the normal manner. -->\n"); - } else if ((img->numcomps == 3) && - (img->comps[0].dx == 1) && (img->comps[1].dx == 1) && - (img->comps[2].dx == 1)) {// If YUV 4:4:4 input --> to bmp - fprintf(xmlout, " <!-- YUV 4:4:4 file to a series of .bmp files. -->\n"); - } else { - fprintf(xmlout, - " <!-- file whose image component dimension are unknown, to a series of .j2k files. -->\n"); - } - } - - opj_destroy_decompress(dinfo); - opj_cio_close(cio); - free(frame_codestream); - - return 0; -} - -/* ------------- */ - -void int16_to_3packedchars(short int value, char* buf) -{ - /* This is to retrieve the 3-letter ASCII language code */ - /* Each char is packed into 5 bits, as difference from 0x60 */ - int i; - for (i = 2; i >= 0; i--) { - buf[i] = (value & 0x001f) + 0x60; - value = (value >> 5); - } - buf[3] = '\0'; -} - -/* ------------- */ - -void xml_out_frame_siz(FILE* xmlout, opj_image_t *img, opj_cp_t *cp) -{ - opj_image_comp_t *comp; - int i; - - fprintf(xmlout, " <ImageAndFileSize Marker=\"SIZ\">\n"); - // This is similar to j2k.c's j2k_dump_image. - // Not of interest: Lsiz, Rsiz - fprintf(xmlout, " <Xsiz>%d</Xsiz>\n", img->x1); - fprintf(xmlout, " <Ysiz>%d</Ysiz>\n", img->y1); - if (notes) { - fprintf(xmlout, - " <!-- Xsiz, Ysiz is the size of the reference grid. -->\n"); - } - fprintf(xmlout, " <XOsiz>%d</XOsiz>\n", img->x0); - fprintf(xmlout, " <YOsiz>%d</YOsiz>\n", img->y0); - if (notes) { - fprintf(xmlout, - " <!-- XOsiz, YOsiz are offsets from grid origin to image origin. -->\n"); - } - fprintf(xmlout, " <XTsiz>%d</XTsiz>\n", cp->tdx); - fprintf(xmlout, " <YTsiz>%d</YTsiz>\n", cp->tdy); - if (notes) { - fprintf(xmlout, - " <!-- XTsiz, YTsiz is the size of one tile with respect to the grid. -->\n"); - } - fprintf(xmlout, " <XTOsiz>%d</XTOsiz>\n", cp->tx0); - fprintf(xmlout, " <YTOsiz>%d</YTOsiz>\n", cp->ty0); - if (notes) { - fprintf(xmlout, - " <!-- XTOsiz, YTOsiz are offsets from grid origin to first tile origin. -->\n"); - } - fprintf(xmlout, " <Csiz>%d</Csiz>\n", img->numcomps); - if (notes) { - fprintf(xmlout, - " <!-- Csiz is the number of components in the image. -->\n"); - fprintf(xmlout, " <!-- For image components next: -->\n"); - fprintf(xmlout, - " <!-- XRsiz, YRsiz denote pixel-sample-spacing on the grid, per Part I Annex B. -->\n"); - //fprintf(xmlout," <!-- XO, YO is offset of the component compared to the whole image. -->\n"); - fprintf(xmlout, - " <!-- Bits per pixel (bpp) is the pixel depth. -->\n"); - fprintf(xmlout, - " <!-- WidthOfData and HeightOfData are calculated values, e.g.: w = roundup((Xsiz - XOsiz)/ XRsiz) -->\n"); - } - - for (i = 0; i < img->numcomps; i++) {/* image-components */ - comp = &(img->comps[i]); - fprintf(xmlout, " <Component Num=\"%d\">\n", i + 1); - fprintf(xmlout, " <Ssiz>\n"); - if (raw) { - fprintf(xmlout, " <AsHex>0x%02x</AsHex>\n", - (comp->sgnd << 7) & (comp->prec - 1)); - } - if (derived) { - fprintf(xmlout, " <Signed>%d</Signed>\n", comp->sgnd); - fprintf(xmlout, " <PrecisionInBits>%d</PrecisionInBits>\n", - comp->prec); - } - fprintf(xmlout, " </Ssiz>\n"); - fprintf(xmlout, " <XRsiz>%d</XRsiz>\n", comp->dx); - fprintf(xmlout, " <YRsiz>%d</YRsiz>\n", comp->dy); - fprintf(xmlout, " <WidthOfData>%d</WidthOfData>\n", comp->w); - fprintf(xmlout, " <HeightOfData>%d</HeightOfData>\n", comp->h); - /* Rest of these aren't calculated when SIZ is read: - fprintf(xmlout, " <XO>%d</XO>\n", comp->x0); - fprintf(xmlout, " <YO>%d</YO>\n", comp->y0); - if(notes) - fprintf(xmlout," <!-- XO, YO is offset of the component compared to the whole image. -->\n"); - fprintf(xmlout, " <BitsPerPixel>%d</BitsPerPixel>\n", comp->bpp); - fprintf(xmlout, " <NumberOfDecodedResolution>%d</NumberOfDecodedResolution>\n", comp->resno_decoded); */ - // SUPPRESS: n/a to mj2_to_metadata. fprintf(xmlout," <Factor>%d</Factor\n", comp->factor); - /* factor = number of division by 2 of the out image compare to the original size of image */ - // TO DO comp->data: int *data; /* image-component data */ - - fprintf(xmlout, " </Component>\n"); - } - fprintf(xmlout, " </ImageAndFileSize>\n"); -} - -/* ------------- */ - -void xml_out_frame_cod(FILE* xmlout, opj_tcp_t *tcp) -{ - /* Could be called with tcp = &j2k_default_tcp; - /* Or, for tile-part header, with &j2k_cp->tcps[j2k_curtileno] - /* Alignment for main:" < < < < To help maintain xml pretty-printing */ - /* Alignment for tile:" < < < To help maintain xml pretty-printing */ - opj_tccp_t *tccp; - int i; - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if (tcp == j2k_default_tcp) { - s++; - s++; /* shorten s to 10 spaces if main */ - } - tccp = &(tcp->tccps[0]); - - fprintf(xmlout, "%s<CodingStyleDefault Marker=\"COD\">\n", - s); /* Required in main header */ - /* Not retained or of interest: Lcod */ - fprintf(xmlout, "%s <Scod>0x%02x</Scod>\n", s, tcp->csty); /* 1 byte */ - if (notes) { - fprintf(xmlout, - "%s <!-- For Scod, specific bits mean (where bit 0 is lowest or rightmost): -->\n", - s); - fprintf(xmlout, "%s <!-- bit 0: Defines entropy coder precincts -->\n", s); - fprintf(xmlout, - "%s <!-- 0 = (PPx=15, PPy=15); 1 = precincts defined below. -->\n", s); - fprintf(xmlout, "%s <!-- bit 1: 1 = SOP marker may be used; 0 = not. -->\n", - s); - fprintf(xmlout, "%s <!-- bit 2: 1 = EPH marker may be used; 0 = not. -->\n", - s); - } - fprintf(xmlout, "%s <SGcod>\n", s); - fprintf(xmlout, "%s <ProgressionOrder>%d</ProgressionOrder>\n", s, - tcp->prg); /* 1 byte, SGcod (A) */ - if (notes) { - fprintf(xmlout, "%s <!-- Defined Progression Order Values are: -->\n", s); - fprintf(xmlout, - "%s <!-- 0 = LRCP; 1 = RLCP; 2 = RPCL; 3 = PCRL; 4 = CPRL -->\n", s); - fprintf(xmlout, - "%s <!-- where L = \"layer\", R = \"resolution level\", C = \"component\", P = \"position\". -->\n", - s); - } - fprintf(xmlout, "%s <NumberOfLayers>%d</NumberOfLayers>\n", s, - tcp->numlayers); /* 2 bytes, SGcod (B) */ - fprintf(xmlout, - "%s <MultipleComponentTransformation>%d</MultipleComponentTransformation>\n", - s, tcp->mct); /* 1 byte, SGcod (C). More or less boolean */ - if (notes) { - fprintf(xmlout, - "%s <!-- For MCT, 0 = none, 1 = transform first 3 components for efficiency, per Part I Annex G -->\n", - s); - } - fprintf(xmlout, "%s </SGcod>\n", s); - /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ - fprintf(xmlout, "%s <SPcod>\n", s); - /* Internal data structure tccp defines separate defaults for each component, but they all get the same values */ - /* So we only have to report the first component's values here. */ - /* Compare j2k_read_cox(...) */ - fprintf(xmlout, - "%s <NumberOfDecompositionLevels>%d</NumberOfDecompositionLevels>\n", s, - tccp->numresolutions - 1); /* 1 byte, SPcox (D) */ - fprintf(xmlout, "%s <CodeblockWidth>%d</CodeblockWidth>\n", s, - tccp->cblkw - 2); /* 1 byte, SPcox (E) */ - fprintf(xmlout, "%s <CodeblockHeight>%d</CodeblockHeight>\n", s, - tccp->cblkh - 2); /* 1 byte, SPcox (F) */ - if (notes) { - fprintf(xmlout, - "%s <!-- CBW and CBH are non-negative, and summed cannot exceed 8 -->\n", s); - fprintf(xmlout, "%s <!-- Codeblock dimension is 2^(value + 2) -->\n", s); - } - fprintf(xmlout, "%s <CodeblockStyle>0x%02x</CodeblockStyle>\n", s, - tccp->cblksty); /* 1 byte, SPcox (G) */ - if (notes) { - fprintf(xmlout, - "%s <!-- For CodeblockStyle, bits mean (with value 1=feature on, 0=off): -->\n", - s); - fprintf(xmlout, - "%s <!-- bit 0: Selective arithmetic coding bypass. -->\n", s); - fprintf(xmlout, - "%s <!-- bit 1: Reset context probabilities on coding pass boundaries. -->\n", - s); - fprintf(xmlout, "%s <!-- bit 2: Termination on each coding pass. -->\n", - s); - fprintf(xmlout, "%s <!-- bit 3: Vertically causal context. -->\n", s); - fprintf(xmlout, "%s <!-- bit 4: Predictable termination. -->\n", s); - fprintf(xmlout, "%s <!-- bit 5: Segmentation symbols are used. -->\n", s); - } - fprintf(xmlout, "%s <Transformation>%d</Transformation>\n", s, - tccp->qmfbid); /* 1 byte, SPcox (H) */ - if (notes) { - fprintf(xmlout, - "%s <!-- For Transformation, 0=\"9-7 irreversible filter\", 1=\"5-3 reversible filter\" -->\n", - s); - } - if (tccp->csty & J2K_CP_CSTY_PRT) { - fprintf(xmlout, "%s <PrecinctSize>\n", s); /* 1 byte, SPcox (I_i) */ - if (notes) { - fprintf(xmlout, - "%s <!-- These are size exponents PPx and PPy. May be zero only for first level (aka N(L)LL subband)-->\n", - s); - } - for (i = 0; i < tccp->numresolutions; i++) { - fprintf(xmlout, "%s <PrecinctHeightAndWidth ResolutionLevel=\"%d\">\n", - s, i); - if (raw) { - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, - (tccp->prch[i] << 4) | tccp->prcw[i]); /* packed into 1 byte, SPcox (G) */ - } - if (derived) { - fprintf(xmlout, "%s <WidthAsDecimal>%d</WidthAsDecimal>\n", s, - tccp->prcw[i]); - fprintf(xmlout, "%s <HeightAsDecimal>%d</HeightAsDecimal>\n", s, - tccp->prch[i]); - } - fprintf(xmlout, "%s </PrecinctHeightAndWidth>\n", s, i); - } - fprintf(xmlout, "%s </PrecinctSize>\n", s); /* 1 byte, SPcox (I_i) */ - } - fprintf(xmlout, "%s </SPcod>\n", s); - fprintf(xmlout, "%s</CodingStyleDefault>\n", s); -} - -/* ------------- */ - -void xml_out_frame_coc(FILE* xmlout, opj_tcp_t *tcp, - int numcomps) /* Optional in main & tile-part headers */ -{ - /* Uses global j2k_default_tcp */ - opj_tccp_t *tccp, *firstcomp_tccp; - int i, compno; - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if (tcp == j2k_default_tcp) { - s++; - s++; /* shorten s to 10 spaces if main */ - } - - firstcomp_tccp = &(tcp->tccps[0]); - /* Internal data structure tccp defines separate defaults for each component, set from main */ - /* default, then selectively overwritten. */ - /* Compare j2k_read_cox(...) */ - /* We don't really know which was the default, and which were not */ - /* Let's pretend that [0] is the default and all others are not */ - if (notes) { - fprintf(xmlout, - "%s<!-- mj2_to_metadata implementation always reports component[0] as using default COD, -->\n", - s); - if (tcp == j2k_default_tcp) { - fprintf(xmlout, - "%s<!-- and any other component, with main-header style values different from [0], as COC. -->\n", - s); - } else { - fprintf(xmlout, - "%s<!-- and any other component, with tile-part-header style values different from [0], as COC. -->\n", - s); - } - } - for (compno = 1; compno < numcomps; - compno++) { /* spec says components are zero-based */ - tccp = &tcp->tccps[compno]; - if (same_component_style(firstcomp_tccp, tccp)) { - continue; - } - - /* Alignments: " < < < < < To help maintain xml pretty-printing */ - fprintf(xmlout, "%s<CodingStyleComponent Marker=\"COC\">\n", - s); /* Optional in main header, at most 1 per component */ - if (notes) { - fprintf(xmlout, - "%s <!-- See Ccoc below for zero-based component number. -->\n", s); - } - /* Overrides the main COD for the specific component */ - /* Not retained or of interest: Lcod */ - fprintf(xmlout, "%s <Scoc>0x%02x</Scoc>\n", s, tccp->csty); /* 1 byte */ - if (notes) { - fprintf(xmlout, "%s <!-- Scoc defines entropy coder precincts: -->\n", s); - fprintf(xmlout, - "%s <!-- 0 = maximum, namely (PPx=15, PPy=15); 1 = precincts defined below. -->\n", - s); - } - fprintf(xmlout, "%s <Ccoc>%d</Ccoc>\n", s, compno); /* 1 or 2 bytes */ - /* Unfortunately compo isn't retained in j2k_read_coc: compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2); /* Ccoc */ - /*if(j2k_img_numcomps <=256) - component is 1 byte - else - compno is 2 byte */ - - /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ - fprintf(xmlout, "%s <SPcoc>\n", s); - fprintf(xmlout, - "%s <NumberOfDecompositionLevels>%d</NumberOfDecompositionLevels>\n", s, - tccp->numresolutions - 1); /* 1 byte, SPcox (D) */ - fprintf(xmlout, "%s <CodeblockWidth>%d</CodeblockWidth>\n", s, - tccp->cblkw - 2); /* 1 byte, SPcox (E) */ - fprintf(xmlout, "%s <CodeblockHeight>%d</CodeblockHeight>\n", s, - tccp->cblkh - 2); /* 1 byte, SPcox (F) */ - if (notes) { - fprintf(xmlout, - "%s <!-- CBW and CBH are non-negative, and summed cannot exceed 8 -->\n", s); - fprintf(xmlout, "%s <!-- Codeblock dimension is 2^(value + 2) -->\n", s); - } - fprintf(xmlout, "%s <CodeblockStyle>0x%02x</CodeblockStyle>\n", s, - tccp->cblksty); /* 1 byte, SPcox (G) */ - if (notes) { - fprintf(xmlout, - "%s <!-- For CodeblockStyle, bits mean (with value 1=feature on, 0=off): -->\n", - s); - fprintf(xmlout, - "%s <!-- bit 0: Selective arithmetic coding bypass. -->\n", s); - fprintf(xmlout, - "%s <!-- bit 1: Reset context probabilities on coding pass boundaries. -->\n", - s); - fprintf(xmlout, "%s <!-- bit 2: Termination on each coding pass. -->\n", - s); - fprintf(xmlout, "%s <!-- bit 3: Vertically causal context. -->\n", s); - fprintf(xmlout, "%s <!-- bit 4: Predictable termination. -->\n", s); - fprintf(xmlout, "%s <!-- bit 5: Segmentation symbols are used. -->\n", s); - } - fprintf(xmlout, "%s <Transformation>%d</Transformation>\n", s, - tccp->qmfbid); /* 1 byte, SPcox (H) */ - if (notes) { - fprintf(xmlout, - "%s <!-- For Transformation, 0=\"9-7 irreversible filter\", 1=\"5-3 reversible filter\" -->\n", - s); - } - if (tccp->csty & J2K_CP_CSTY_PRT) { - fprintf(xmlout, "%s <PrecinctSize>\n", s); /* 1 byte, SPcox (I_i) */ - if (notes) { - fprintf(xmlout, - "%s <!-- These are size exponents PPx and PPy. May be zero only for first level (aka N(L)LL subband)-->\n", - s); - } - for (i = 0; i < tccp->numresolutions - 1; - i++) { /* subtract 1 to get # of decomposition levels */ - fprintf(xmlout, "%s <PrecinctHeightAndWidth ResolutionLevel=\"%d\">\n", - s, i); - if (raw) { - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, - (tccp->prch[i] << 4) | tccp->prcw[i]); /* packed into 1 byte, SPcox (G) */ - } - if (derived) { - fprintf(xmlout, "%s <WidthAsDecimal>%d</WidthAsDecimal>\n", s, - tccp->prcw[i]); - fprintf(xmlout, "%s <HeightAsDecimal>%d</HeightAsDecimal>\n", s, - tccp->prch[i]); - } - fprintf(xmlout, "%s </PrecinctHeightAndWidth>\n", s, i); - } - fprintf(xmlout, "%s </PrecinctSize>\n", s); /* 1 byte, SPcox (I_i) */ - } - fprintf(xmlout, "%s </SPcoc>\n", s); - fprintf(xmlout, "%s</CodingStyleComponent>\n", s); - } -} - -/* ------------- */ - -BOOL same_component_style(opj_tccp_t *tccp1, opj_tccp_t *tccp2) -{ - int i; - - if (tccp1->numresolutions != tccp2->numresolutions) { - return FALSE; - } - if (tccp1->cblkw != tccp2->cblkw) { - return FALSE; - } - if (tccp1->cblkh != tccp2->cblkh) { - return FALSE; - } - if (tccp1->cblksty != tccp2->cblksty) { - return FALSE; - } - if (tccp1->csty != tccp2->csty) { - return FALSE; - } - - if (tccp1->csty & J2K_CP_CSTY_PRT) { - for (i = 0; i < tccp1->numresolutions; i++) { - if (tccp1->prcw[i] != tccp2->prcw[i] || tccp1->prch[i] != tccp2->prch[i]) { - return FALSE; - } - } - } - return TRUE; -} - -/* ------------- */ - -void xml_out_frame_qcd(FILE* xmlout, opj_tcp_t *tcp) -{ - /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ - opj_tccp_t *tccp; - int bandno, numbands; - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if (tcp == j2k_default_tcp) { - s++; - s++; /* shorten s to 10 spaces if main */ - } - - /* Compare j2k_read_qcx */ - fprintf(xmlout, "%s<QuantizationDefault Marker=\"QCD\">\n", - s); /* Required in main header, single occurrence */ - tccp = &(tcp->tccps[0]); - /* Not retained or of interest: Lqcd */ - fprintf(xmlout, "%s <Sqcd>\n", s); /* 1 byte */ - if (notes) { - fprintf(xmlout, - "%s <!-- Default quantization style for all components. -->\n", s); - } - if (raw) { - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, - (tccp->numgbits) << 5 | tccp->qntsty); - } - if (derived) { - fprintf(xmlout, "%s <QuantizationStyle>%d</QuantizationStyle>\n", s, - tccp->qntsty); - } - if (notes) { - fprintf(xmlout, - "%s <!-- Quantization style (in Sqcd's low 5 bits) may be: -->\n", s); - fprintf(xmlout, "%s <!-- 0 = No quantization. SPqcd size = 8 bits-->\n", - s); - fprintf(xmlout, - "%s <!-- 1 = Scalar derived (values signaled for N(L)LL subband only). Use Eq. E.5. SPqcd size = 16. -->\n", - s); - fprintf(xmlout, - "%s <!-- 2 = Scalar expounded (values signaled for each subband). SPqcd size = 16. -->\n", - s); - } - if (derived) { - fprintf(xmlout, "%s <NumberOfGuardBits>%d</NumberOfGuardBits>\n", s, - tccp->numgbits); - } - if (notes) { - fprintf(xmlout, - "%s <!-- 0-7 guard bits allowed (stored in Sqcd's high 3 bits) -->\n", s); - } - fprintf(xmlout, "%s </Sqcd>\n", s); - - /* Problem: numbands in some cases is calculated from len, which is not retained or available here at this time */ - /* So we'll just dump all internal values */ - /* We could calculate it, but I'm having trouble believing the length equations in the standard */ - - fprintf(xmlout, "%s <SPqcd>\n", s); - switch (tccp->qntsty) { - case J2K_CCP_QNTSTY_NOQNT: /* no quantization */ - /* This is what standard says, but I don't believe it: len = 4 + (3*decomp); */ - numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ - /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ - /* Instead look for first zero exponent, quit there. Adequate? */ - fprintf(xmlout, "%s <ReversibleStepSizeValue>\n", s); - if (notes) { - fprintf(xmlout, - "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", - s); - fprintf(xmlout, - "%s <!-- until an exponent with zero value is reached. -->\n", s); - fprintf(xmlout, - "%s <!-- Exponent epsilon(b) of reversible dynamic range. -->\n", s); - fprintf(xmlout, - "%s <!-- Hex value is as stored, in high-order 5 bits. -->\n", s); - } - for (bandno = 0; bandno < numbands; bandno++) { - if (tccp->stepsizes[bandno].expn == 0) { - break; /* Remove when we have real numbands */ - } - fprintf(xmlout, "%s <DynamicRangeExponent Subband=\"%d\">\n", s, bandno); - if (raw) { - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, - tccp->stepsizes[bandno].expn << 3); - } - if (derived) { - fprintf(xmlout, "%s <AsDecimal>%d</AsDecimal>\n", s, - tccp->stepsizes[bandno].expn); - } - fprintf(xmlout, "%s </DynamicRangeExponent>\n", s); - } - fprintf(xmlout, "%s </ReversibleStepSizeValue>\n", s); - break; - case J2K_CCP_QNTSTY_SIQNT: /* scalar quantization derived */ - /* This is what standard says. Should I believe it:: len = 5; - /* numbands = 1; */ - fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s); - if (notes) { - fprintf(xmlout, - "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n", - s); - } - fprintf(xmlout, "%s <QuantizationValues Subband=\"0\">\n", s); - if (notes) { - fprintf(xmlout, "%s <!-- For N(L)LL subband: >\n", s); - } - if (raw) { - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, - (tccp->stepsizes[0].expn << 11) | tccp->stepsizes[0].mant); - } - if (derived) { - fprintf(xmlout, "%s <Exponent>%d</Exponent>\n", s, - tccp->stepsizes[0].expn); - fprintf(xmlout, "%s <Mantissa>%d</Mantissa>\n", s, - tccp->stepsizes[0].mant); - } - fprintf(xmlout, "%s </QuantizationValues>\n", s); - if (notes) { - fprintf(xmlout, - "%s <!-- Exponents for subbands beyond 0 are not from header, but calculated per Eq. E.5 -->\n", - s); - fprintf(xmlout, - "%s <!-- The mantissa for all subbands is the same, given by the value above. -->\n", - s); - fprintf(xmlout, - "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", - s); - fprintf(xmlout, - "%s <!-- until a subband with exponent of zero value is reached. -->\n", - s); - } - - for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { - if (tccp->stepsizes[bandno].expn == 0) { - break; - } - - fprintf(xmlout, - "%s <CalculatedExponent Subband=\"%d\">%d</CalculatedExponent>\n", s, - bandno, tccp->stepsizes[bandno].expn); - } - - fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s); - break; - - default: /* J2K_CCP_QNTSTY_SEQNT */ /* scalar quantization expounded */ - /* This is what standard says, but should I believe it: len = 5 + 6*decomp; */ - numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ - /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ - fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s); - if (notes) { - fprintf(xmlout, - "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n", - s); - fprintf(xmlout, - "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", - s); - fprintf(xmlout, - "%s <!-- until a subband with mantissa and exponent of zero values is reached. -->\n", - s); - } - for (bandno = 0; bandno < numbands; bandno++) { - if (tccp->stepsizes[bandno].expn == 0 && tccp->stepsizes[bandno].mant == 0) { - break; /* Remove when we have real numbands */ - } - - fprintf(xmlout, "%s <QuantizationValues Subband=\"%d\">\n", s, bandno); - if (raw) { - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, - (tccp->stepsizes[bandno].expn << 11) | tccp->stepsizes[bandno].mant); - } - if (derived) { - fprintf(xmlout, "%s <Exponent>%d</Exponent>\n", s, - tccp->stepsizes[bandno].expn); - fprintf(xmlout, "%s <Mantissa>%d</Mantissa>\n", s, - tccp->stepsizes[bandno].mant); - } - fprintf(xmlout, "%s </QuantizationValues>\n", s); - } - fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s); - break; - } /* switch */ - fprintf(xmlout, "%s </SPqcd>\n", s); - fprintf(xmlout, "%s</QuantizationDefault>\n", s); - - /* Alignments: " < < < < < To help maintain xml pretty-printing */ -} - -/* ------------- */ - -void xml_out_frame_qcc(FILE* xmlout, opj_tcp_t *tcp, int numcomps) -{ - /* Uses global j2k_default_tcp */ - /* This code will compile only if declaration of j2k_default_tcp is changed from static (to implicit extern) in j2k.c */ - opj_tccp_t *tccp, *firstcomp_tccp; - int bandno, numbands; - int compno; - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if (tcp == j2k_default_tcp) { - s++; - s++; /* shorten s to 10 spaces if main */ - } - - firstcomp_tccp = &(tcp->tccps[0]); - /* Internal data structure tccp defines separate defaults for each component, set from main */ - /* default, then selectively overwritten. */ - /* Compare j2k_read_qcx(...) */ - /* We don't really know which was the default, and which were not */ - /* Let's pretend that [0] is the default and all others are not */ - if (notes) { - fprintf(xmlout, - "%s<!-- mj2_to_metadata implementation always reports component[0] as using default QCD, -->\n", - s); - if (tcp == j2k_default_tcp) { - fprintf(xmlout, - "%s<!-- and any other component, with main-header quantization values different from [0], as QCC. -->\n", - s); - } else { - fprintf(xmlout, - "%s<!-- and any other component, with tile-part-header quantization values different from [0], as QCC. -->\n", - s); - } - } - for (compno = 1; compno < numcomps; - compno++) { /* spec says components are zero-based */ - tccp = &(tcp->tccps[compno]); - if (same_component_quantization(firstcomp_tccp, tccp)) { - continue; - } - - /* Compare j2k_read_qcx */ - fprintf(xmlout, - "%s<QuantizationComponent Marker=\"QCC\" Component=\"%d\">\n", s, - compno); /* Required in main header, single occurrence */ - tccp = &j2k_default_tcp->tccps[0]; - /* Not retained or perhaps of interest: Lqcd It maybe can be calculated. */ - fprintf(xmlout, "%s <Sqcc>\n", s); /* 1 byte */ - if (notes) { - fprintf(xmlout, "%s <!-- Quantization style for this component. -->\n", s); - } - if (raw) { - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, - (tccp->numgbits) << 5 | tccp->qntsty); - } - if (derived) { - fprintf(xmlout, "%s <QuantizationStyle>%d</QuantizationStyle>\n", s, - tccp->qntsty); - } - if (notes) { - fprintf(xmlout, - "%s <!-- Quantization style (in Sqcc's low 5 bits) may be: -->\n", s); - fprintf(xmlout, "%s <!-- 0 = No quantization. SPqcc size = 8 bits-->\n", - s); - fprintf(xmlout, - "%s <!-- 1 = Scalar derived (values signaled for N(L)LL subband only). Use Eq. E.5. SPqcc size = 16. -->\n", - s); - fprintf(xmlout, - "%s <!-- 2 = Scalar expounded (values signaled for each subband). SPqcc size = 16. -->\n", - s); - } - if (derived) { - fprintf(xmlout, "%s <NumberOfGuardBits>%d</NumberOfGuardBits>\n", s, - tccp->numgbits); - } - if (notes) { - fprintf(xmlout, - "%s <!-- 0-7 guard bits allowed (stored in Sqcc's high 3 bits) -->\n", s); - } - fprintf(xmlout, "%s </Sqcc>\n", s); - - /* Problem: numbands in some cases is calculated from len, which is not retained or available here at this time */ - /* So we'll just dump all internal values */ - fprintf(xmlout, "%s <SPqcc>\n", s); - switch (tccp->qntsty) { - case J2K_CCP_QNTSTY_NOQNT: - numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ - /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ - - /* Instead look for first zero exponent, quit there. Adequate? */ - fprintf(xmlout, "%s <ReversibleStepSizeValue>\n", s); - if (notes) { - fprintf(xmlout, - "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", - s); - fprintf(xmlout, - "%s <!-- until an exponent with zero value is reached. -->\n", s); - fprintf(xmlout, - "%s <!-- Exponent epsilon(b) of reversible dynamic range. -->\n", s); - fprintf(xmlout, - "%s <!-- Hex value is as stored, in high-order 5 bits. -->\n", s); - } - for (bandno = 0; bandno < numbands; bandno++) { - if (tccp->stepsizes[bandno].expn == 0) { - break; /* Remove this once we have real numbands */ - } - fprintf(xmlout, "%s <Exponent Subband=\"%d\">\n", s, bandno); - if (raw) { - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, - tccp->stepsizes[bandno].expn << 3); - } - if (derived) { - fprintf(xmlout, "%s <AsDecimal>%d</AsDecimal>\n", s, - tccp->stepsizes[bandno].expn); - } - fprintf(xmlout, "%s </Exponent>\n", s); - } - fprintf(xmlout, "%s </ReversibleStepSizeValue>\n", s); - break; - case J2K_CCP_QNTSTY_SIQNT: - /* numbands = 1; */ - fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s); - if (notes) { - fprintf(xmlout, - "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n", - s); - } - fprintf(xmlout, "%s <QuantizationValuesForSubband0>\n", s); - if (notes) { - fprintf(xmlout, "%s <!-- For N(L)LL subband: >\n", s); - } - if (raw) { - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, - (tccp->stepsizes[0].expn << 11) | tccp->stepsizes[0].mant); - } - if (derived) { - fprintf(xmlout, "%s <Exponent>%d</Exponent>\n", s, - tccp->stepsizes[0].expn); - fprintf(xmlout, "%s <Mantissa>%d</Mantissa>\n", s, - tccp->stepsizes[0].mant); - } - fprintf(xmlout, "%s </QuantizationValuesForSubband0>\n", s); - if (notes) { - fprintf(xmlout, - "%s <!-- Exponents for subbands beyond 0 are not from header, but calculated per Eq. E.5 -->\n", - s); - fprintf(xmlout, - "%s <!-- The mantissa for all subbands is the same, given by the value above. -->\n", - s); - fprintf(xmlout, - "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", - s); - fprintf(xmlout, - "%s <!-- until a subband with exponent of zero value is reached. -->\n", - s); - } - - for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) { - if (tccp->stepsizes[bandno].expn == 0) { - break; - } - - fprintf(xmlout, - "%s <CalculatedExponent Subband=\"%d\">%d</CalculatedExponent>\n", s, - bandno, tccp->stepsizes[bandno].expn); - } - fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s); - break; - - default: /* J2K_CCP_QNTSTY_SEQNT */ - numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ - /* Better: IMAGINE numbands = tccp->stepsize_numbands; */ - fprintf(xmlout, "%s <QuantizationStepSizeValues>\n", s); - if (notes) { - fprintf(xmlout, - "%s <!-- For irreversible transformation only. See Part I Annex E Equation E.3 -->\n", - s); - fprintf(xmlout, - "%s <!-- Current mj2_to_metadata implementation dumps entire internal table, -->\n", - s); - fprintf(xmlout, - "%s <!-- until a subband with mantissa and exponent of zero values is reached. -->\n", - s); - } - for (bandno = 0; bandno < numbands; bandno++) { - if (tccp->stepsizes[bandno].expn == 0 && tccp->stepsizes[bandno].mant == 0) { - break; /* Remove this once we have real numbands count */ - } - fprintf(xmlout, "%s <QuantizationValues Subband=\"%d\">\n", s, bandno); - if (raw) { - fprintf(xmlout, "%s <AsHex>0x%02x</AsHex>\n", s, - (tccp->stepsizes[bandno].expn << 11) | tccp->stepsizes[bandno].mant); - } - if (derived) { - fprintf(xmlout, "%s <Exponent>%d</Exponent>\n", s, - tccp->stepsizes[bandno].expn); - fprintf(xmlout, "%s <Mantissa>%d</Mantissa>\n", s, - tccp->stepsizes[bandno].mant); - } - fprintf(xmlout, "%s </QuantizationValues>\n", s); - } - fprintf(xmlout, "%s </QuantizationStepSizeValues>\n", s); - break; - } /* switch */ - fprintf(xmlout, "%s </SPqcc>\n", s); - fprintf(xmlout, "%s</QuantizationComponent>\n", s); - } - /* Alignments: " < < < < < To help maintain xml pretty-printing */ -} - -/* ------------- */ - -BOOL same_component_quantization(opj_tccp_t *tccp1, opj_tccp_t *tccp2) -{ - int bandno, numbands; - - if (tccp1->qntsty != tccp2->qntsty) { - return FALSE; - } - if (tccp1->numgbits != tccp2->numgbits) { - return FALSE; - } - - switch (tccp1->qntsty) { - case J2K_CCP_QNTSTY_NOQNT: - numbands = J2K_MAXBANDS; /* should be: numbands = len - 1; */ - /* Instead look for first zero exponent, quit there. Adequate? */ - for (bandno = 0; bandno < numbands; bandno++) { - if (tccp1->stepsizes[bandno].expn == 0) { - break; - } - if (tccp1->stepsizes[bandno].expn != tccp2->stepsizes[bandno].expn) { - return FALSE; - } - } - break; - case J2K_CCP_QNTSTY_SIQNT: - /* numbands = 1; */ - if (tccp1->stepsizes[0].expn != tccp2->stepsizes[0].expn || - tccp1->stepsizes[0].mant != tccp2->stepsizes[0].mant) { - return FALSE; - } - /* Don't need to check remainder, since they are calculated from [0] */ - break; - - default: /* J2K_CCP_QNTSTY_SEQNT */ - numbands = J2K_MAXBANDS; /* should be: (len - 1) / 2;*/ - /* This comparison may cause us problems with trailing junk values. */ - for (bandno = 0; bandno < numbands; bandno++) { - if (tccp1->stepsizes[bandno].expn != tccp2->stepsizes[bandno].expn || - tccp1->stepsizes[bandno].mant != tccp2->stepsizes[bandno].mant); - return FALSE; - } - break; - } /* switch */ - return TRUE; -} - -/* ------------- */ - -void xml_out_frame_rgn(FILE* xmlout, opj_tcp_t *tcp, int numcomps) -{ - int compno, SPrgn; - /* MJ2 files can have regions of interest if hybridized with JPX Part II */ - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if (tcp == j2k_default_tcp) { - s++; - s++; /* shorten s to 10 spaces if main */ - } - - for (compno = 0; compno < numcomps; compno++) { - SPrgn = tcp->tccps[compno].roishift; /* 1 byte; SPrgn */ - if (SPrgn == 0) { - continue; /* Yet another kludge */ - } - - fprintf(xmlout, "%s<RegionOfInterest Marker=\"RGN\">\n", - s); /* Optional in main header, at most 1 per component */ - if (notes) { - fprintf(xmlout, "%s<!-- See Crgn below for zero-based component number. -->\n", - s); - } - /* Not retained or of interest: Lrgd */ - fprintf(xmlout, "%s <Srgn>0</Srgn>\n", s); /* 1 byte */ - if (notes) { - fprintf(xmlout, - "%s <!-- Srgn is ROI style. Only style=0 defined: Implicit ROI (max. shift) -->\n", - s); - } - fprintf(xmlout, "%s <Crgn>%d</Crgn>\n", s, compno); /* 1 or 2 bytes */ - fprintf(xmlout, "%s <SPrgn>%d</SPrgn>\n", s, SPrgn); /* 1 byte */ - if (notes) { - fprintf(xmlout, - "%s <!-- SPrgn is implicit ROI shift, i.e., binary shifting of ROI coefficients above background. -->\n", - s); - } - fprintf(xmlout, "</RegionOfInterest\n", - s); /* Optional in main header, at most 1 per component */ - } -} - -/* ------------- */ - -void xml_out_frame_poc(FILE* xmlout, - opj_tcp_t *tcp) /* Progression Order Change */ -{ - /* Compare j2k_read_poc() */ - int i; - opj_poc_t *poc; - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if (tcp == j2k_default_tcp) { - s++; - s++; /* shorten s to 10 spaces if main */ - } - - if (tcp->POC != 1) { - return; /* Not present */ - } - - fprintf(xmlout, "%s<ProgressionOrderChange Marker=\"POC\">\n", - s); /* Optional in main header, at most 1 per component */ - /* j2k_read_poc seems to allow accumulation of default pocs from multiple POC segments, but does - the spec really allow that? */ - /* 2 bytes, not retained; Lpoc */ - /* I probably didn't get this dump precisely right. */ - for (i = 0; i < tcp->numpocs; i++) { - poc = &tcp->pocs[i]; - fprintf(xmlout, "%s <Progression Num=\"%d\">\n", s, i + 1); - fprintf(xmlout, "%S <RSpoc>%d</RSpoc>\n", s, - poc->resno0); /* 1 byte, RSpoc_i */ - if (notes) { - fprintf(xmlout, - "%s <!-- Resolution level index (inclusive) for progression start. Range: 0 to 33 -->\n", - s); - } - fprintf(xmlout, "%s <CSpoc>%d</CSpoc>\n", s, - poc->compno0);/* j2k_img->numcomps <= 256 ? 1 byte : 2 bytes; CSpoc_i */ - if (notes) { - fprintf(xmlout, - "%s <!-- Component index (inclusive) for progression start. -->\n", s); - } - fprintf(xmlout, "%s <LYEpoc>%d</LYEpoc>\n", s, - poc->layno1); /* int_min(cio_read(2), tcp->numlayers); /* 2 bytes; LYEpoc_i */ - if (notes) { - fprintf(xmlout, "%s <!-- Layer index (exclusive) for progression end. -->\n", - s); - } - fprintf(xmlout, "%s <REpoc>%d</REpoc>\n", s, - poc->resno1); /*int_min(cio_read(1), tccp->numresolutions); /* REpoc_i */ - if (notes) { - fprintf(xmlout, - "%s <!-- Resolution level index (exclusive) for progression end. Range: RSpoc to 33 -->\n", - s); - } - fprintf(xmlout, "%s <CEpoc>%d</CEpoc>\n", s, - poc->compno1); /* int_min(cio_read(j2k_img->numcomps <= 256 ? 1 : 2), j2k_img->numcomps); /* CEpoc_i */ - if (notes) { - fprintf(xmlout, - "%s <!-- Component index (exclusive) for progression end. Minimum: CSpoc -->\n", - s); - } - fprintf(xmlout, "%s <Ppoc>%d</Ppoc>\n", s, poc->prg); /* 1 byte Ppoc_i */ - if (notes) { - fprintf(xmlout, "%s <!-- Defined Progression Order Values are: -->\n", s); - fprintf(xmlout, - "%s <!-- 0 = LRCP; 1 = RLCP; 2 = RPCL; 3 = PCRL; 4 = CPRL -->\n", s); - fprintf(xmlout, - "%s <!-- where L = \"layer\", R = \"resolution level\", C = \"component\", P = \"position\". -->\n", - s); - } - fprintf(xmlout, "%s </Progression>\n", s); - } - fprintf(xmlout, "%s</ProgressionOrderChange\n", s); -} - -/* ------------- */ - -#ifdef SUPPRESS_FOR_NOW -/* Suppress PPM and PPT since we're not showing data from the third option, namely within the codestream, and -that's evidently what frames_to_mj2 uses. And a hex dump isn't so useful anyway */ - -void xml_out_frame_ppm(FILE *xmlout, - opj_cp_t *cp) /* For main header, not tile-part (which uses PPT instead). */ -{ - /* Either the PPM or PPT is required if the packet headers are not distributed in the bit stream */ - /* Use of PPM and PPT are mutually exclusive. */ - /* Compare j2k_read_ppm() */ - int j; - - if (cp->ppm != 1) { - return; /* Not present */ - } - /* Main header uses indent of 10 spaces */ - fprintf(xmlout, - " <PackedPacketHeadersMainHeader Marker=\"PPM\">\n"); /* Optional in main header, but if not, must be in PPT or codestream */ - /* 2 bytes Lppm not saved */ - if (notes) { - fprintf(xmlout, - " <!-- If there are multiple PPM marker segments in the main header, -->\n"); - fprintf(xmlout, - " <!-- this mj2_to_metadata implementation will report them as a single consolidated PPM header. -->\n"); - fprintf(xmlout, - " <!-- The implementation can't currently segregate by tile-part. -->\n"); - fprintf(xmlout, - " <!-- TO DO? further map the packet headers to xml. -->\n"); - } - - /* 1 byte, not retained ; Zppm is sequence # of this PPM header */ - /* 4 bytes, possibly overwritten multiple times in j2k_cp->ppm_previous: Nppm */ - /* Use j symbol for index instead of i, to make comparable with j2k_read_ppm */ - /* Not real clear whether to use ppm->store or ppm_len as upper bound */ - fprintf(xmlout, " <PackedData>\n"); - xml_out_dump_hex(xmlout, cp->ppm_data, cp->ppm_len); - /* Dump packet headers 1 byte at a time: lppm[i][j] */ - fprintf(xmlout, " </PackedData>\n"); - fprintf(xmlout, - " </PackedPacketHeadersMainHeader>\n"); /* Optional in main header, but if not, must be in PPT or codestream */ -} - -/* ------------- */ - -void xml_out_frame_ppt(FILE *xmlout, - opj_tcp_t *tcp) /* For tile-part header, not main (which uses PPM instead). */ -{ - /* Either the PPM or PPT is required if the packet headers are not distributed in the bit stream */ - /* Use of PPM and PPT are mutually exclusive. */ - /* Compare j2k_read_ppt() */ - int j; - - if (tcp->ppt != 1) { - return; /* Not present */ - } - - /* Tile-part indents are 12 spaces */ - fprintf(xmlout, - " <PackedPacketHeadersTilePartHeader Marker=\"PPT\">\n"); /* Optional in main header, but if not, must be in PPT or codestream */ - /* 2 bytes Lppm not saved */ - if (notes) { - fprintf(xmlout, - " <!-- If there are multiple PPT marker segments in the tile-part header, -->\n"); - fprintf(xmlout, - " <!-- this mj2_to_metadata implementation will report them as a single consolidated PPT header. -->\n"); - fprintf(xmlout, - " <!-- The implementation can't currently segregate by tile-part. -->\n"); - fprintf(xmlout, - " <!-- TO DO? further map the packet headers to xml. -->\n"); - } - - /* 1 byte, not retained ; Zppt is sequence # of this PPT header */ - /* 4 bytes, possibly overwritten multiple times in j2k_cp->ppt_previous: Nppt */ - /* Use j symbol for index instead of i, to make comparable with j2k_read_ppt */ - /* Not real clear whether to use ppt->store or ppt_len as upper bound */ - fprintf(xmlout, " <PackedData>\n"); - xml_out_dump_hex(xmlout, tcp->ppt_data, tcp->ppt_len); - /* Dump packet headers 1 byte at a time: lppt[i][j] */ - fprintf(xmlout, " </PackedData>\n"); - fprintf(xmlout, - " </PackedPacketHeadersTileHeader>\n"); /* Optional in tile-part header, but if not, must be in PPM or codestream */ -} -#endif SUPPRESS_FOR_NOW - -/* ------------- */ - -void xml_out_frame_tlm(FILE* - xmlout) /* opt, main header only. May be multiple. */ -{ - /* Compare j2k_read_tlm()... which doesn't retain anything! */ - /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ - /* Main header indents are 10 spaces */ -} - -/* ------------- */ - -void xml_out_frame_plm(FILE* - xmlout) /* opt, main header only; can be used in conjunction with tile-part's PLT */ -{ - /* NO-OP. PLM NOT SAVED IN DATA STRUCTURE */ - /* Compare j2k_read_plm()... which doesn't retain anything! */ - /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ - /* Main header indents are 10 spaces */ -} - -/* ------------- */ - -void xml_out_frame_plt(FILE* xmlout, - opj_tcp_t *tcp) /* opt, tile-part headers only; can be used in conjunction with main header's PLM */ -{ - /* NO-OP. PLT NOT SAVED IN DATA STRUCTURE */ - /* Compare j2k_read_plt()... which doesn't retain anything! */ - /* Tile-part header indents are 12 spaces */ -} - -/* ------------- */ - -void xml_out_frame_crg(FILE* xmlout) -{ - /* NO-OP. CRG NOT SAVED IN DATA STRUCTURE */ /* opt, main header only; */ - /* Compare j2k_read_crg()... which doesn't retain anything! */ - /* Plan: Since this is only called from main header, not tilepart, use global j2k_default_tcp rather than parameter */ -#ifdef NOTYET -THIS PSEUDOCODE IMAGINES THESE EXIST: - j2k_default_tcp->crg, j2k_default_tcp->crg_i, j2k_default_tcp->crg_xcrg*, - j2k_default_tcp->crg_ycrg* - (POSSIBLY DON'T NEED crg_i, CAN GET NUMBER OR COMPONENTS FROM ELSEWHERE) - if (j2k_default_tcp->crg != 1 || j2k_default_tcp->crg_i == 0) - return; /* Not present */ - - /* Main header indents are 10 spaces */ - fprintf(xmlout, - " <ComponentRegistration Marker=\"RG\" Count=\"%d\">\n", - j2k_default_tcp->crg_i); - if (notes) { - fprintf(xmlout, - " <!-- Fine tuning of registration of components with respect to each other, -->\n"); - fprintf(xmlout, - " <!-- not required but potentially helpful for decoder. -->\n"); - fprintf(xmlout, - " <!-- These supplementary fractional offsets are in units of 1/65536 of the horizontal -->\n"); - fprintf(xmlout, - " <!-- or vertical separation (e.g., XRsiz[i] or YRsiz[i] for component i). -->\n"); - } - /* This isn't the most compact form of table, but is OK when number of components is small, as is likely. */ - for (i = 0; i < j2k_default_tcp->crg_i; i++) { - fprintf(xmlout, " <Component Num=\"%d\">\n", i + 1); - fprintf(xmlout, " <Xcrg>\n"); - if (raw) { - fprintf(xmlout, " <AsNumerator>%d</AsNumerator>\n", - j2k_default_tcp->crg_xcrg[i]); - } - if (derived) { - /* Calculate n * 100%/65536; 4 digits after decimal point is sufficiently accurate */ - fprintf(xmlout, " <AsPercentage>%.4f</AsPercentage>\n", - ((double)j2k_default_tcp->crg_xcrg[i]) / 655.36); - /* We could do another calculation that include XRsiz[i]; maybe later. */ - } - fprintf(xmlout, " </Xcrg>\n"); - fprintf(xmlout, " <Ycrg>\n"); - if (raw) { - fprintf(xmlout, " <AsNumerator>%d</AsNumerator>\n", - j2k_default_tcp->crg_ycrg[i]); - } - if (derived) { - fprintf(xmlout, " <AsPercentage>%f</AsPercentage>\n", - ((double)j2k_default_tcp->crg_ycrg[i]) / 655.36); - } - fprintf(xmlout, " </Ycrg>\n"); - fprintf(xmlout, " </Component>\n"); - } - - fprintf(xmlout, " </ComponentRegistration>\n"); - -#endif -} - -/* ------------- */ - -/* Regrettably from a metadata point of view, j2k_read_com() skips over any comments in main header or tile-part-header */ -void xml_out_frame_com(FILE* xmlout, opj_tcp_t *tcp) -{ - /* NO-OP. COM NOT SAVED IN DATA STRUCTURE */ /* opt in main or tile-part headers; */ - /* Compare j2k_read_com()... which doesn't retain anything! */ -#ifdef NOTYET - char spaces[13] = " "; /* 12 spaces if tilepart*/ - char* s = spaces; - if (tcp == &j2k_default_tcp) { - s++; - s++; /* shorten s to 10 spaces if main */ - } -THIS PSEUDOCODE IMAGINES THESE EXIST: - tcp->com, tcp->com_len, tcp->com_data array - if (tcp->com != 1) { - return; /* Not present */ - } - - fprintf(xmlout, "%s<Comment Marker=\"COM\">\n", - s); /* Optional in main or tile-part header */ - xml_out_dump_hex_and_ascii(tcp->com_data, tcp->com_len, s); - fprintf(xmlout, "%s</Comment>\n", s); -#endif -} - -void xml_out_dump_hex(FILE* xmlout, char *data, int data_len, char* s) -{ - /* s is a string of spaces for indent */ - int i; - - /* This is called when raw is true, or there is no appropriate derived form */ - fprintf(xmlout, "%s<AsHex>\n", s); - fprintf(xmlout, "%s ", s); /* Inadequate for pretty printing */ - for (i = 0; i < data_len; i++) { /* Dump packet headers */ - fprintf(xmlout, "%02x", data[i]); - } - fprintf(xmlout, "%s</AsHex>\n", s); -} - -/* Define this as an even number: */ -#define BYTES_PER_DUMP_LINE 40 -/* Current total width for Hex and ASCII is : 11 spaces lead + (3 * BPDL) + 2 spaces + BPDL */ -void xml_out_dump_hex_and_ascii(FILE* xmlout, char *data, int data_len, - char* s) -{ - /* s is a string of spaces for indent */ - int i, j; - - if (raw) { - xml_out_dump_hex(xmlout, data, data_len, s); - } - - if (derived) { - fprintf(xmlout, "%s<AsHexAndASCII>\n", s); - for (i = 0; i < data_len;) { - fprintf(xmlout, "%s ", s); /* Additional leading space added in loop */ - /* First column: hex */ - for (j = 0; j < BYTES_PER_DUMP_LINE; j++) { /* Dump bytes */ - fprintf(xmlout, " %02x", data[i + j]); - } - /* Space between columns... */ fprintf(xmlout, " "); - /* Second column: ASCII */ - for (j = 0; j < BYTES_PER_DUMP_LINE; j++, i++) { - if (isprint((int)data[i]) && i < data_len) { - fprintf(xmlout, "%c", data[i]); - } else { - fprintf(xmlout, " "); - } - } - /* If we also wanted to output UCS-2 Unicode as a third column, then entire document - must use fwprintf. Forget about it for now. As it stands, if data is UCS-2 format but still - the ASCII set, then we'll be able to read every other byte as ASCII in column 2. If - data is UTF-8 format but still ASCII, then we'll be able to read every byte as ASCII - in column 2. */ - } - fprintf(xmlout, "%s</AsHexAndASCII>\n", s); - } -} - - -/* ------------- */ - -void xml_out_frame_jp2h(FILE* xmlout, opj_jp2_t *jp2_struct) /* JP2 Header */ -{ - /* Compare jp2_read_jp2h(opj_jp2_t * jp2_struct) */ - int i; - - fprintf(xmlout, " <JP2Header BoxType=\"jp2h\">\n"); - - /* Compare jp2_read_ihdr(jp2_struct)) */ - fprintf(xmlout, " <ImageHeader BoxType=\"ihdr\">\n"); - fprintf(xmlout, " <HEIGHT>%d</HEIGHT>\n", - jp2_struct->h); /* 4 bytes */ - fprintf(xmlout, " <WIDTH>%d</WIDTH>\n", - jp2_struct->w); /* 4 bytes */ - if (notes) { - fprintf(xmlout, - " <!-- HEIGHT here, if 2 fields per image, is of total deinterlaced height. -->\n"); - } - fprintf(xmlout, " <NC>%d</NC>\n", - jp2_struct->numcomps); /* 2 bytes */ - if (notes) { - fprintf(xmlout, - " <!-- NC is number of components -->\n"); /* 2 bytes */ - } - fprintf(xmlout, " <BPC>\n"); /* 1 byte */ - if (jp2_struct->bpc == 255) { - fprintf(xmlout, " <AsHex>0x%02x</AsHex>\n", - jp2_struct->bpc); /* 1 byte */ - if (notes) { - fprintf(xmlout, - " <!-- BPC = 0xff means bits per pixel varies with component; see table below. -->\n"); - } - } else { /* Not 0xff */ - if (raw) { - fprintf(xmlout, " <AsHex>0x%02x</AsHex>\n", - jp2_struct->bpc); /* 1 byte */ - if (notes) { - fprintf(xmlout, - " <!-- BPC = 0xff means bits per pixel varies with component; see table below. -->\n"); - } - } - if (derived) { - fprintf(xmlout, " <BitsPerPixel>%d</BitsPerPixel>\n", - jp2_struct->bpc & 0x7f); - fprintf(xmlout, " <Signed>%d</Signed>\n", - jp2_struct->bpc >> 7); - } - } - fprintf(xmlout, " </BPC>\n"); - fprintf(xmlout, " <C>%d</C>\n", - jp2_struct->C); /* 1 byte */ - if (notes) { - fprintf(xmlout, - " <!-- C is compression type. Only \"7\" is allowed to date. -->\n"); /* 2 bytes */ - } - fprintf(xmlout, " <UnkC>%d</UnkC>\n", - jp2_struct->UnkC); /* 1 byte */ - if (notes) { - fprintf(xmlout, - " <!-- Colourspace Unknown. 1 = unknown, 0 = known (e.g., colourspace spec is accurate) -->\n"); /* 1 byte */ - } - fprintf(xmlout, " <IPR>%d</IPR>\n", - jp2_struct->IPR); /* 1 byte */ - if (notes) { - fprintf(xmlout, - " <!-- IPR is 1 if frame contains an Intellectual Property box; 0 otherwise. -->\n"); /* 2 bytes */ - } - fprintf(xmlout, " </ImageHeader>\n"); - - if (jp2_struct->bpc == 255) { - fprintf(xmlout, " <BitsPerComponent BoxType=\"bpcc\">\n"); - if (notes) { - fprintf(xmlout, - " <!-- Pixel depth (range 1 to 38) is low 7 bits of hex value + 1 -->\n"); - } - /* Bits per pixel varies with components */ - /* Compare jp2_read_bpcc(jp2_struct) */ - for (i = 0; i < (int)jp2_struct->numcomps; i++) { - if (raw) { - fprintf(xmlout, " <AsHex>0x%02x</AsHex>\n", - jp2_struct->comps[i].bpcc); /* 1 byte */ - } - if (derived) { - fprintf(xmlout, " <BitsPerPixel>%d</BitsPerPixel>\n", - (jp2_struct->comps[i].bpcc & 0x7f) + 1); - fprintf(xmlout, " <Signed>%d</Signed>\n", - jp2_struct->comps[i].bpcc >> 7); - } - } - fprintf(xmlout, " </BitsPerComponent>\n"); - } - - /* Compare jp2_read_colr(jp2_struct) */ - fprintf(xmlout, - " <ColourSpecification BoxType=\"colr\">\n"); - fprintf(xmlout, " <METH>%d</METH>\n", - jp2_struct->meth); /* 1 byte */ - if (notes) { - fprintf(xmlout, - " <!-- Valid values of specification method so far: -->\n"); - fprintf(xmlout, - " <!-- 1 = Enumerated colourspace, in EnumCS field -->\n"); - fprintf(xmlout, - " <!-- 2 = Restricted ICC Profile, in PROFILE field -->\n"); - } - fprintf(xmlout, " <PREC>%d</PREC>\n", - jp2_struct->precedence); /* 1 byte */ - if (notes) { - fprintf(xmlout, - " <!-- 0 is only valid value of precedence so far. -->\n"); - } - fprintf(xmlout, " <APPROX>%d</APPROX>\n", - jp2_struct->approx); /* 1 byte */ - if (notes) { - fprintf(xmlout, - " <!-- 0 is only valid value of colourspace approximation so far. -->\n"); - } - - if (jp2_struct->meth == 1) { - fprintf(xmlout, " <EnumCS>%d</EnumCS>\n", - jp2_struct->enumcs); /* 4 bytes */ - if (notes) { - fprintf(xmlout, - " <!-- Valid values of enumerated MJ2 colourspace so far: -->\n"); - fprintf(xmlout, - " <!-- 16: sRGB as defined by IEC 61966-2-1. -->\n"); - fprintf(xmlout, - " <!-- 17: greyscale (related to sRGB). -->\n"); - fprintf(xmlout, - " <!-- 18: sRGB YCC (from JPEG 2000 Part II). -->\n"); - fprintf(xmlout, - " <!-- (Additional JPX values are defined in Part II). -->\n"); - } - } else if (notes) { - fprintf(xmlout, - " <!-- PROFILE is not handled by current OpenJPEG implementation. -->\n"); - } - /* only 1 byte is read and nothing stored */ - fprintf(xmlout, " </ColourSpecification>\n"); - - /* TO DO? No OpenJPEG support. - Palette 'pclr' - ComponentMapping 'cmap' - ChannelDefinition 'cdef' - Resolution 'res' - */ - fprintf(xmlout, " </JP2Header>\n"); -} -/* ------------- */ - -#ifdef NOTYET -IMAGE these use cp structure, - extended... but we could use a new data structure instead - void xml_out_frame_jp2i(FILE* xmlout, opj_cp_t *cp) -{ - /* IntellectualProperty 'jp2i' (no restrictions on location) */ - int i; - IMAGE cp->jp2i, cp->jp2i_count, cp->jp2i_data(array of chars), - cp->cp2i_len(array of ints) - if (cp->jp2i != 1) { - return; /* Not present */ - } - - for (i = 0; i < cp->jp2i_count; i++) { - fprintf(xmlout, " <IntellectualProperty BoxType=\"jp2i\">\n"); - /* I think this can be anything, including binary, so do a dump */ - /* Is it better to indent or not indent this content? Indent is better for reading, but - worse for cut/paste. */ - xml_out_dump_hex_and_ascii(xmlout, cp->jp2i_data[i], cp->jp2i_len[i]); - fprintf(xmlout, " </IntellectualProperty>\n"); - } -} - -void xml_out_frame_xml(FILE* xmlout, opj_cp_t *cp) -{ - /* XML 'xml\040' (0x786d6c20). Can appear multiply, before or after jp2c codestreams */ - IMAGE cp->xml, cp->xml_count, cp->xml_data(array of chars) - MAYBE WE DON'T NEED cp->xml_len (array of ints) IF WE ASSUME xml_data IS NULL-TERMINATED. - ASSUME ASSUME EACH LINE IS ENDED BY \n. - int i; - if (cp->xml != 1) { - return; /* Not present */ - } - - for (i = 0; i < cp->xml_count; i++) { - fprintf(xmlout, " <TextFormXML BoxType=\"xml[space]" Instance = - \"%d\">\n", i + 1); - /* Is it better to indent or not indent this content? Indent is better for reading, but - worse for cut/paste. Being lazy, didn't indent here. */ - fprintf(xmlout, - cp->xml_data[i]); /* May be multiple lines */ /* Could check if this is well-formed */ - fprintf(xmlout, " </TextFormXML>\n"); - } -} - -void xml_out_frame_uuid(FILE* xmlout, opj_cp_t *cp) -{ - /* UUID 'uuid' (top level only) */ - /* Part I 1.7.2 says: may appear multiply in JP2 file, anywhere except before File Type box */ - /* Part III 5.2.1 says: Private extensions shall be achieved through the 'uuid' type. */ - /* A UUID is a 16-byte value. There is a conventional string representation for it: - "0x12345678-9ABC-DEF0-1234-567890ABCDEF". Let's assume that is what is stored in uuid_value */ - - /* Part III 6.1 Any other MJ2 box type could be alternatively written as a 'uuid' box, with value given - as : 0xXXXXXXXX-0011-0010-8000-00AA00389B71, where the Xs are the boxtype in hex. However, - such a file is "not compliant; systems may choose to read [such] objects ... as equivalent to the box of - the same type, or not." Here, we choose not to. */ - int i; - IMAGE cp->uuid, cp->uuid_count, - cp->uuid_value(array of uuids... - let's say fixed-length strings) cp->uuid_data (array of char buffers), cp->uuid_len (array of ints) - if (cp->juuid != 1) - return; /* Not present */ - - for (i = 0; i < cp->uuid_count; i++) { - fprintf(xmlout, " <UniversalUniqueID BoxType=\"uuid\"> - fprintf(xmlout, " <UUID>%s</UUDI>\n", cp->uuid_value[i]); - fprintf(xmlout, " <Data>\n"); - /* I think this can be anything, including binary, so do a dump */ - /* Is it better to indent or not indent this content? Indent is better for reading, but - worse for cut/paste. */ - xml_out_dump_hex_and_ascii(xmlout, cp->uuid_data[i], cp->uuid_len[i]); - fprintf(xmlout, " </Data>\n"); - fprintf(xmlout, " </UniversalUniqueID>\n"); - } -} - -void xml_out_frame_uinf(FILE* xmlout, opj_cp_t *cp) -{ - /* UUIDInfo 'uinf', includes UUIDList 'ulst' and URL 'url\40' */ - /* Part I 1.7.3 says: may appear multiply in JP2 file, anywhere at the top level except before File Type box */ - /* So there may be multiple ulst's, and each can have multiple UUIDs listed (with a single URL) */ - /* This is not quite as vendor-specific as UUIDs, or at least is meant to be generally readable */ - /* Assume UUIDs stored in canonical string format */ - int i, j; - IMAGE cp->uinf, cp->uinf_count, cp->uinf_ulst_nu(array of ints) - cp->uinf_uuid(2 dimensional array of uuids... let's say fixed-length strings), - cp->uinf_url(array of char buffers) - - if (cp->uinf != 1) - return; /* Not present */ - - for (i = 0; i < cp->uuid_count; i++) { - fprintf(xmlout, " <UUIDInfo BoxType=\"uinf\">\n"); - fprintf(xmlout, " <UUIDList BoxType=\"ulst\" Count=\"%d\">\n", - cp->cp->uinf_ulst_nu[i]); - for (j = 0; j < cp->uinf_ulst_nu[i]; j++) { - fprintf(xmlout, " <ID Instance=\"%s\">%s</ID>\n", - cp->uuif_uuid[i][j], j + 1); - } - fprintf(xmlout, " </UUIDList>\n"); - fprintf(xmlout, " <DataEntryURL>\n"); - /* Could add VERS and FLAG here */ - fprintf(xmlout, " <LOC>\n"); - fprintf(xmlout, " %s", - cp->uinf_url[i]); /* Probably single line, so indent works */ /* In theory, could check if this is well-formed, or good live link */ - fprintf(xmlout, " </LOC>\n"); - fprintf(xmlout, " </DataEntryURL>\n"); - fprintf(xmlout, " </UUIDInfo>\n"); - } -} - -IMAGE these use cp structure, -extended... but we could use a new data structure instead -void xml_out_frame_unknown_type(FILE* xmlout, opj_cp_t *cp) -{ - /* Part III 5.2.1 says "Type fields not defined here are reserved. Private extensions - shall be acieved through the 'uuid' type." [This implies an unknown - type would be an error, but then...] "Boxes not explicitly defined in this standard, - or otherwise unrecognized by a reader, may be ignored." - Also, it says "the following types are not and will not be used, or used only in - their existing sense, in future versions of this specification, to avoid conflict - with existing content using earlier pre-standard versions of this format: - clip, crgn, matt, kmat, pnot, ctab, load, imap; - track reference types tmcd, chap, sync,scpt, ssrc" - [But good luck figuring out the mapping.] - Part III Amend. 2 4.1 is stronger: "All these specifications [of this family, e.g., - JP2 Part I, ISO Base format (Part 12) leading to MP4, Quicktime, and possibly including - MJ2] require that readers ignore objects that are unrecognizable to them". - */ - int i; - IMAGE cp->unknown_type, cp->unknown_type_count, - cp->unknown_type_boxtype(array of buf[5]s), - cp->unknown_type_data(array of chars), cp->unknown_type_len(array of ints) - if (cp->unknown_type != 1) { - return; /* Not present */ - } - - for (i = 0; i < cp->unknown_type_count; i++) { - fprintf(xmlout, " <UnknownType BoxType=\"%s\">\n", - cp->unknown_type_boxtype[i]); - /* Can be anything, including binary, so do a dump */ - /* Is it better to indent or not indent this content? Indent is better for reading, but - worse for cut/paste. */ - xml_out_dump_hex_and_ascii(xmlout, cp->unknown_type_data[i], - cp->unknown_type_len[i]); - fprintf(xmlout, " </UnknownType>\n"); - } -} - -#endif diff --git a/src/bin/mj2/meta_out.h b/src/bin/mj2/meta_out.h deleted file mode 100644 index 769ff391..00000000 --- a/src/bin/mj2/meta_out.h +++ /dev/null @@ -1,14 +0,0 @@ -/* meta_out.h */ -/* Dump MJ2, JP2 metadata (partial so far) to xml file */ -/* Callable from mj2_to_metadata */ -/* Contributed to Open JPEG by Glenn Pearson, U.S. National Library of Medicine */ - -#define BOOL int -#define FALSE 0 -#define TRUE 1 - -void xml_write_init(BOOL n, BOOL t, BOOL r, BOOL d); - -int xml_write_struct(FILE *file, FILE *xmlout, opj_mj2_t * movie, - unsigned int sampleframe, char* stringDTD, opj_event_mgr_t *event_mgr); - diff --git a/src/bin/mj2/mj2_to_metadata.c b/src/bin/mj2/mj2_to_metadata.c deleted file mode 100644 index 27f164d7..00000000 --- a/src/bin/mj2/mj2_to_metadata.c +++ /dev/null @@ -1,350 +0,0 @@ -/* mj2_to_metadata.c */ -/* Dump MJ2, JP2 metadata (partial so far) to xml file */ -/* Contributed to Open JPEG by Glenn Pearson, contract software developer, U.S. National Library of Medicine. - -The base code in this file was developed by the author as part of a video archiving -project for the U.S. National Library of Medicine, Bethesda, MD. -It is the policy of NLM (and U.S. government) to not assert copyright. - -A non-exclusive copy of this code has been contributed to the Open JPEG project. -Except for copyright, inclusion of the code within Open JPEG for distribution and use -can be bound by the Open JPEG open-source license and disclaimer, expressed elsewhere. -*/ - -#include "opj_includes.h" -#include "mj2.h" - -#include "mj2_to_metadata.h" -#include <string.h> -#include "opj_getopt.h" - -/* -------------------------------------------------------------------------- */ - -/** -sample error callback expecting a FILE* client object -*/ -void error_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); -} -/** -sample warning callback expecting a FILE* client object -*/ -void warning_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); -} -/** -sample debug callback expecting a FILE* client object -*/ -void info_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[INFO] %s", msg); -} - -/* -------------------------------------------------------------------------- */ - - - -/* ------------- */ - -void help_display() -{ - /* "1234567890123456789012345678901234567890123456789012345678901234567890123456789" */ - fprintf(stdout, " Help for the 'mj2_to_metadata' Program\n"); - fprintf(stdout, " ======================================\n"); - fprintf(stdout, "The -h option displays this information on screen.\n\n"); - - fprintf(stdout, - "mj2_to_metadata generates an XML file from a Motion JPEG 2000 file.\n"); - fprintf(stdout, - "The generated XML shows the structural, but not (yet) curatorial,\n"); - fprintf(stdout, - "metadata from the movie header and from the JPEG 2000 image and tile\n"); - fprintf(stdout, - "headers of a sample frame. Excluded: low-level packed-bits image data.\n\n"); - - fprintf(stdout, "By Default\n"); - fprintf(stdout, "----------\n"); - fprintf(stdout, - "The metadata includes the jp2 image and tile headers of the first frame.\n"); - fprintf(stdout, "\n"); - fprintf(stdout, - "Metadata values are shown in 'raw' form (e.g., hexadecimal) as stored in the\n"); - fprintf(stdout, - "file, and, if apt, in a 'derived' form that is more quickly grasped.\n"); - fprintf(stdout, "\n"); - fprintf(stdout, - "Notes explaining the XML are embedded as terse comments. These include\n"); - fprintf(stdout, " meaning of non-obvious tag abbreviations;\n"); - fprintf(stdout, " range and precision of valid values;\n"); - fprintf(stdout, " interpretations of values, such as enumerations; and\n"); - fprintf(stdout, " current implementation limitations.\n"); - fprintf(stdout, "\n"); - fprintf(stdout, - "The sample-size and chunk-offset tables, each with 1 row per frame, are not reported.\n"); - fprintf(stdout, "\n"); - fprintf(stdout, - "The file is self-contained and no verification (e.g., against a DTD) is requested.\n"); - fprintf(stdout, "\n"); - fprintf(stdout, "Required Parameters (except with -h)\n"); - fprintf(stdout, "------------------------------------\n"); - fprintf(stdout, - "[Caution: file strings that contain spaces should be wrapped with quotes.]\n"); - fprintf(stdout, - "-i input.mj2 : where 'input' is any source file name or path.\n"); - fprintf(stdout, - " MJ2 files created with 'frames_to_mj2' are supported so far.\n"); - fprintf(stdout, - " These are silent, single-track, 'MJ2 Simple Profile' videos.\n"); - fprintf(stdout, - "-o output.xml : where 'output' is any destination file name or path.\n"); - fprintf(stdout, "\n"); - fprintf(stdout, "Optional Parameters\n"); - fprintf(stdout, "-------------------\n"); - fprintf(stdout, "-h : Display this help information.\n"); - fprintf(stdout, "-n : Suppress all mj2_to_metadata notes.\n"); - fprintf(stdout, - "-t : Include sample-size and chunk-offset tables.\n"); - fprintf(stdout, - "-f n : where n > 0. Include jp2 header info for frame n [default=1].\n"); - fprintf(stdout, "-f 0 : No jp2 header info.\n"); - fprintf(stdout, - "-r : Suppress all 'raw' data for which a 'derived' form exists.\n"); - fprintf(stdout, "-d : Suppress all 'derived' data.\n"); - fprintf(stdout, - " (If both -r and -d given, -r will be ignored.)\n"); - fprintf(stdout, - "-v string : Verify against the DTD file located by the string.\n"); - fprintf(stdout, - " Prepend quoted 'string' with either SYSTEM or PUBLIC keyword.\n"); - fprintf(stdout, - " Thus, for the distributed DTD placed in the same directory as\n"); - fprintf(stdout, - " the output file: -v \"SYSTEM mj2_to_metadata.dtd\"\n"); - fprintf(stdout, - " \"PUBLIC\" is used with an access protocol (e.g., http:) + URL.\n"); - /* More to come */ - fprintf(stdout, "\n"); - /* "1234567890123456789012345678901234567890123456789012345678901234567890123456789" */ -} - -/* ------------- */ - -int main(int argc, char *argv[]) -{ - - opj_dinfo_t* dinfo; - opj_event_mgr_t event_mgr; /* event manager */ - - FILE *file, *xmlout; - /* char xmloutname[50]; */ - opj_mj2_t *movie; - - char* infile = 0; - char* outfile = 0; - char* s, S1, S2, S3; - int len; - unsigned int sampleframe = 1; /* First frame */ - char* stringDTD = NULL; - BOOL notes = TRUE; - BOOL sampletables = FALSE; - BOOL raw = TRUE; - BOOL derived = TRUE; - mj2_dparameters_t parameters; - - while (TRUE) { - /* ':' after letter means it takes an argument */ - int c = getopt(argc, argv, "i:o:f:v:hntrd"); - /* FUTURE: Reserve 'p' for pruning file (which will probably make -t redundant) */ - if (c == -1) { - break; - } - switch (c) { - case 'i': /* IN file */ - infile = optarg; - s = optarg; - while (*s) { - s++; /* Run to filename end */ - } - s--; - S3 = *s; - s--; - S2 = *s; - s--; - S1 = *s; - - if ((S1 == 'm' && S2 == 'j' && S3 == '2') - || (S1 == 'M' && S2 == 'J' && S3 == '2')) { - break; - } - fprintf(stderr, "Input file name must have .mj2 extension, not .%c%c%c.\n", S1, - S2, S3); - return 1; - - /* ----------------------------------------------------- */ - case 'o': /* OUT file */ - outfile = optarg; - while (*outfile) { - outfile++; /* Run to filename end */ - } - outfile--; - S3 = *outfile; - outfile--; - S2 = *outfile; - outfile--; - S1 = *outfile; - - outfile = optarg; - - if ((S1 == 'x' && S2 == 'm' && S3 == 'l') - || (S1 == 'X' && S2 == 'M' && S3 == 'L')) { - break; - } - - fprintf(stderr, - "Output file name must have .xml extension, not .%c%c%c\n", S1, S2, S3); - return 1; - - /* ----------------------------------------------------- */ - case 'f': /* Choose sample frame. 0 = none */ - sscanf(optarg, "%u", &sampleframe); - break; - - /* ----------------------------------------------------- */ - case 'v': /* Verification by DTD. */ - stringDTD = optarg; - /* We will not insist upon last 3 chars being "dtd", since non-file - access protocol may be used. */ - if (strchr(stringDTD, '"') != NULL) { - fprintf(stderr, - "-D's string must not contain any embedded double-quote characters.\n"); - return 1; - } - - if (strncmp(stringDTD, "PUBLIC ", 7) == 0 || - strncmp(stringDTD, "SYSTEM ", 7) == 0) { - break; - } - - fprintf(stderr, "-D's string must start with \"PUBLIC \" or \"SYSTEM \"\n"); - return 1; - - /* ----------------------------------------------------- */ - case 'n': /* Suppress comments */ - notes = FALSE; - break; - - /* ----------------------------------------------------- */ - case 't': /* Show sample size and chunk offset tables */ - sampletables = TRUE; - break; - - /* ----------------------------------------------------- */ - case 'h': /* Display an help description */ - help_display(); - return 0; - - /* ----------------------------------------------------- */ - case 'r': /* Suppress raw data */ - raw = FALSE; - break; - - /* ----------------------------------------------------- */ - case 'd': /* Suppress derived data */ - derived = FALSE; - break; - - /* ----------------------------------------------------- */ - default: - return 1; - } /* switch */ - } /* while */ - - if (!raw && !derived) { - raw = TRUE; /* At least one of 'raw' and 'derived' must be true */ - } - - /* Error messages */ - /* -------------- */ - if (!infile || !outfile) { - fprintf(stderr, - "Correct usage: mj2_to_metadata -i mj2-file -o xml-file (plus options)\n"); - return 1; - } - - /* was: - if (argc != 3) { - printf("Bad syntax: Usage: MJ2_to_metadata inputfile.mj2 outputfile.xml\n"); - printf("Example: MJ2_to_metadata foreman.mj2 foreman.xml\n"); - return 1; - } - */ - len = strlen(infile); - if (infile[0] == ' ') { - infile++; /* There may be a leading blank if user put space after -i */ - } - - file = fopen(infile, "rb"); /* was: argv[1] */ - - if (!file) { - fprintf(stderr, "Failed to open %s for reading.\n", infile); /* was: argv[1] */ - return 1; - } - - len = strlen(outfile); - if (outfile[0] == ' ') { - outfile++; /* There may be a leading blank if user put space after -o */ - } - - // Checking output file - xmlout = fopen(outfile, "w"); /* was: argv[2] */ - if (!xmlout) { - fprintf(stderr, "Failed to open %s for writing.\n", outfile); /* was: argv[2] */ - fclose(file); - return 1; - } - // Leave it open - - /* - configure the event callbacks (not required) - setting of each callback is optional - */ - 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; - - /* get a MJ2 decompressor handle */ - dinfo = mj2_create_decompress(); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); - - /* setup the decoder decoding parameters using user parameters */ - movie = (opj_mj2_t*) dinfo->mj2_handle; - mj2_setup_decoder(dinfo->mj2_handle, ¶meters); - - if (mj2_read_struct(file, movie)) { // Creating the movie structure - fclose(xmlout); - return 1; - } - - xml_write_init(notes, sampletables, raw, derived); - xml_write_struct(file, xmlout, movie, sampleframe, stringDTD, &event_mgr); - fclose(xmlout); - - fprintf(stderr, "Metadata correctly extracted to XML file \n");; - - /* free remaining structures */ - if (dinfo) { - mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); - } - - return 0; -} - - diff --git a/src/bin/mj2/mj2_to_metadata.dtd b/src/bin/mj2/mj2_to_metadata.dtd deleted file mode 100644 index 249de1a0..00000000 --- a/src/bin/mj2/mj2_to_metadata.dtd +++ /dev/null @@ -1,425 +0,0 @@ -<!-- -Preliminary DTD for Open JPEG "mj2_to_metadata" function. -Last revised: April 20, 2005 -Author: Glenn Pearson, at U.S. National Library of Medicine. -See mj2_to_metadata.c regarding copyright, license, disclaimer status. - -While the vocabulary of this DTD is based on the relevant portions of the -ISO/IEC JPEG 200 standard, the detailed representation is the author's own. -It is neither an ISO/IEC nor NLM official or consensus representation. -Furthermore, it deviates from a pure representation of the ISO/IEC standard -in these aspects: - - - it is incomplete in a number of ways (which to some extent may be - addressed over time); - - it has extensions for "derived" data and "statistics"; - - it is more flexible. That is, some elements are marked as optional - not because they are optional in an MJ2 file, but because reporting - of them is optional based on current or projected mj2_to_metadata - command-line flags. ---> -<!ELEMENT MJ2_File (JP2?, FileType?, MovieBox?)> -<!ELEMENT JP2 EMPTY> -<!ATTLIST JP2 BoxType CDATA #FIXED "jP[space][space]"> -<!ATTLIST JP2 Signature CDATA #FIXED "0x0d0a870a"> -<!ELEMENT FileType (Brand, MinorVersion, CompatibilityList)> -<!ATTLIST FileType BoxType CDATA #FIXED "ftyp"> -<!ELEMENT Brand (#PCDATA)> <!-- 4 characters max --> -<!ELEMENT MinorVersion (#PCDATA)> <!-- 4 chararcters max --> -<!ELEMENT CompatibilityList (CompatibleBrand)*> -<!ATTLIST CompatibilityList Count CDATA #REQUIRED> <!-- Count >= 0 --> -<!ELEMENT CompatibleBrand (#PCDATA)> <!-- 4 characters max --> -<!ELEMENT MovieBox (MovieHeader, Statistics?, Track*)> -<!ATTLIST MovieBox BoxType CDATA #FIXED "moov"> -<!ELEMENT MovieHeader (CreationTime, ModificationTime, Timescale, Rate, Duration, Volume, TransformationMatrix)> -<!ATTLIST MovieHeader BoxType CDATA #FIXED "mvhd"> -<!ELEMENT CreationTime (InSeconds?,AsLocalTime?)> -<!ELEMENT InSeconds (#PCDATA)> -<!ELEMENT AsLocalTime (#PCDATA)> -<!ELEMENT ModificationTime (InSeconds?,AsLocalTime?)> -<!ELEMENT Timescale (#PCDATA)> <!-- Timescale defines time units in one second --> -<!ELEMENT Rate (AsHex | (AsHex, AsDecimal) | AsDecimal)> <!-- Decimal is Approximation; Optional on input. --> -<!ELEMENT AsHex (#PCDATA)> -<!ELEMENT AsDecimal (#PCDATA)> -<!ELEMENT Duration (InTimeUnits | (InTimeUnits, InSeconds) | InSeconds)> <!-- InSeconds Optional on input. --> -<!ELEMENT InTimeUnits (#PCDATA)> -<!ELEMENT Volume (AsHex | (AsHex, AsDecimal) | AsDecimal)> <!-- hex default = 0x0100 --> -<!-- Fixed 8.8 value of audio volume. Full, normal value is 1.0 (0x0100) --> -<!ELEMENT TransformationMatrix (TMa,TMb,TMu,TMc,TMd,TMv,TMx,TMy,TMw)> <!-- for video --> -<!-- 3 x 3 Video Transformation Matrix {a,b,u,c,d,v,x,y,w}. Required: u=0, v=0, w=1 --> -<!-- Maps decompressed point (p,q) to rendered point (ap + cq + x, bp + dq + y) --> -<!-- Stored as Fixed Point Hex: all are 16.16, except u,v,w are 2.30 --> -<!-- Unity = 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 --> -<!ELEMENT TMa (#PCDATA)> -<!ELEMENT TMb (#PCDATA)> -<!ELEMENT TMu (#PCDATA)> <!--Always "0x00000000" --> -<!ELEMENT TMc (#PCDATA)> -<!ELEMENT TMd (#PCDATA)> -<!ELEMENT TMv (#PCDATA)> <!--Always "0x00000000" --> -<!ELEMENT TMx (#PCDATA)> -<!ELEMENT TMy (#PCDATA)> -<!ELEMENT TMw (#PCDATA)> <!--Always "0x40000000" --> - -<!ELEMENT Statistics (TracksFound)> -<!ELEMENT TracksFound (Video,Audio,Hint)> -<!ELEMENT Video (#PCDATA)> -<!ELEMENT Audio (#PCDATA)> -<!ELEMENT Hint (#PCDATA)> - - -<!-- For now, output info on at most one video track --> - - -<!ELEMENT Track (TrackHeader, TrackReferenceContainer?, EditListContainer?, Media, JP2_Frame?)> <!-- JP2_Frame is mj2_to_metadata extension --> -<!ATTLIST Track BoxType CDATA #FIXED "trak"> -<!ATTLIST Track Instance CDATA #REQUIRED> -<!ELEMENT TrackHeader (TrackID, TrackLayer?, Volume?, TransformationMatrix?, Width?, Height?)> -<!ATTLIST TrackHeader BoxType CDATA #FIXED "tkhd"> -<!-- Not shown here: CreationTime, ModificationTime, Duration. --> -<!-- These 3 fields are reported under MediaHeader below. When reading these 3, --> -<!-- m2j_to_metadata currently doesn't distinguish between TrackHeader and MediaHeader source. --> -<!-- If both found, value read from MediaHeader is used. --> -<!ELEMENT TrackID (#PCDATA)> -<!ELEMENT TrackLayer (#PCDATA)> <!-- front-to-back ordering of video tracks. 0 = normal, -1 is closer, etc. --> -<!-- "Volume" element described above; here it is for particular audio track. Full, normal (default = 0x0100) --> -<!-- "TransformationMatrix" element described above; matrix here is applied before MovieHeader one. --> -<!ELEMENT Width (AsHex | (AsHex, AsDecimal) | AsDecimal)> -<!ELEMENT Height (AsHex | (AsHex, AsDecimal) | AsDecimal)> -<!-- AsHex, AsDecimal already defined above --> - <!-- Width and Height are for the presentation; frames will be scaled to this --> -<!-- /TrackHeader --> -<!ELEMENT TrackReferenceContainer ANY> <!-- TO DO: TrackReferenceContainer 'tref' just used in hint track --> -<!ELEMENT EditListContainer ANY> <!-- TO DO: EditListContainer 'edts', contains EditList 'elst' with media-time, segment-duration, media-rate --> -<!ELEMENT Media (MediaHeader, HandlerReference,MediaInfoContainer)> -<!ATTLIST Media BoxType CDATA #FIXED "mdia"> -<!ELEMENT MediaHeader (CreationTime,ModificationTime,Timescale,Duration,Language)> -<!ATTLIST MediaHeader BoxType CDATA #FIXED "mdhd"> -<!-- Elements already defined above: CreationTime, ModificationTime, Timescale, Duration --> -<!ELEMENT Language (#PCDATA)> <!-- 3 chars max. There's an enumeration available --> -<!ELEMENT HandlerReference (HandlerType)> -<!ATTLIST HandlerReference BoxType CDATA #FIXED "hdlr"> -<!ELEMENT HandlerType (#PCDATA)> -<!ATTLIST HandlerType Code ( vide | soun | hint ) "vide"> - -<!-- make the media headers multiple? --> -<!ELEMENT MediaInfoContainer ((VideoMediaHeader | SoundMediaHeader | HintMediaHeader), DataInfo, SampleTable)> -<!ATTLIST MediaInfoContainer BoxType CDATA #FIXED "minf"> -<!ELEMENT VideoMediaHeader (GraphicsMode, Opcolor)> -<!ATTLIST VideoMediaHeader BoxType CDATA #FIXED "vmhd"> -<!ELEMENT GraphicsMode (#PCDATA)> - <!-- Enumerated values of graphics mode: --> - <!-- 0x00 = copy (over existing image); --> - <!-- 0x24 = transparent; 'blue-screen' this image using opcolor; --> - <!-- 0x100 = alpha; alpha-blend this image --> - <!-- 0x101 = whitealpha; alpha-blend this image, which has been blended with white; --> - <!-- 0x102 = blackalpha; alpha-blend this image, which has been blended with black. --> -<!ELEMENT Opcolor (Red,Green,Blue)> -<!ELEMENT Red (#PCDATA)> -<!ELEMENT Green (#PCDATA)> -<!ELEMENT Blue (#PCDATA)> -<!ELEMENT SoundMediaHeader (Balance)> -<!ATTLIST SoundMediaHeader BoxType CDATA #FIXED "smhd"> -<!ELEMENT Balance (#PCDATA)> - <!-- Fixed Point 8.8, fixes mono track in stereo space. --> - <!-- 0.0 = center, -1.0 = full left, 1.0 = full right --> -<!ELEMENT HintMediaHeader (MaxPDU_Size, AvgPDU_Size, MaxBitRate, AvgBitRate, SlidingAvgBitRate)> -<!ATTLIST HintMediaHeader BoxType CDATA #FIXED "hmhd"> -<!ELEMENT MaxPDU_Size (#PCDATA)> - <!-- Size in bytes of largest PDU in this hint stream. --> -<!ELEMENT AvgPDU_Size (#PCDATA)> - <!-- Average size in bytes of a PDU over the entire presentation. --> -<!ELEMENT MaxBitRate (#PCDATA)> - <!-- Maximum rate in bits per second over any window of 1 second. --> -<!ELEMENT AvgBitRate (#PCDATA)> - <!-- Averate rate in bits per second over the entire presentation. --> -<!ELEMENT SlidingAvgBit (#PCDATA)> - <!-- Maximum rate in bits per second over any window of one minute. --> - -<!ELEMENT DataInfo (DataReference)> -<!ATTLIST DataInfo BoxType CDATA #FIXED "dinf"> -<!ELEMENT DataReference (DataEntryUrlBox | DataEntryUrnBox )*> -<!ATTLIST DataReference BoxType CDATA #FIXED "dref"> -<!ATTLIST DataReference URL_Count CDATA #REQUIRED> -<!ATTLIST DataReference URN_Count CDATA #REQUIRED> <!-- table w. flags, URLs, URNs --> -<!-- // Data structure does not distinguish between single URL, single URN, or DREF table or URLs & URNs. - // We could infer those, but for now just present everything as a DREF table. ---> - <!-- No entries here mean that file is self-contained, as required by Simple Profile. --> - -<!ELEMENT DataEntryUrlBox (Location)> -<!ATTLIST DataEntryUrlBox BoxType CDATA #FIXED "url[space]"> <!-- table w. flags, URLs, URNs --> - <!-- Only the first 16 bytes of URL location are recorded in mj2_to_metadata data structure. --> -<!ELEMENT DataEntryUrnBox (Name, Location?)> -<!ATTLIST DataEntryUrnBox BoxType CDATA #FIXED "urn[space]\"> - <!-- Only the first 16 bytes each of URN name and optional location are recorded in mj2_to_metadata data structure. --> - -<!ELEMENT SampleTable (VisualSampleEntry,TimeToSample,SampleToChunk,SampleSize,ChunkOffset)> <!-- structure doesn't do non-visual sample entry yet --> -<!ATTLIST SampleTable BoxType CDATA #FIXED "stbl"> <!-- to add: entry count --> - <!-- Next are instances of generic SampleDescription BoxType=\"stsd\" --> - - <!-- There could be multiple instances of this, but "entry_count" is just a local at read-time. - And it's used wrong, too, as count of just visual type, when it's really all 3 types. - This is referred to as "smj2" within mj2.c --> -<!ELEMENT VisualSampleEntry (WidthAsInteger, HeightAsInteger, HorizontalRes, VerticalRes, CompressorName, Depth, JP2Header?, FieldCoding?, MJP2_Profile?, MJP2_Prefix?, MJP2_SubSampling?, MJP2_OriginalFormat?)> -<!ATTLIST VisualSampleEntry BoxType CDATA #FIXED "mjp2"> - <!-- If multiple instances of this, only first is shown here. --> -<!ELEMENT WidthAsInteger (#PCDATA)> -<!ELEMENT HeightAsInteger (#PCDATA)> -<!ELEMENT HorizontalRes (AsHex | (AsHex, AsDecimal) | AsDecimal)> -<!ELEMENT VerticalRes (AsHex | (AsHex, AsDecimal) | AsDecimal)> -<!-- Typical value for both resolution is 72 (0x00480000) --> -<!ELEMENT CompressorName (#PCDATA)> - <!-- Compressor name for debugging. Standard restricts max length to 31 bytes. --> - <!-- Usually blank or \"Motion JPEG2000\" --> -<!ELEMENT Depth (#PCDATA)> - <!-- Depth is: --> - <!-- 0x20: alpha channels present (color or grayscale) --> - <!-- 0x28: grayscale without alpha --> - <!-- 0x18: color without alpha --> - -<!-- TODO somewhere: tk->jp2_struct.numcomps --> -<!ELEMENT JP2Header (ImageHeader, ColourSpecification)> -<!ATTLIST JP2Header BoxType CDATA #FIXED "jp2h"> -<!ELEMENT ImageHeader (HEIGHT, WIDTH, NC, BPC, C, UnkC, IPR)> -<!ATTLIST ImageHeader BoxType CDATA #FIXED "ihdr"> -<!ELEMENT HEIGHT (#PCDATA)> <!-- If 2 fields/frame, total deinterlaced height --> -<!ELEMENT WIDTH (#PCDATA)> -<!ELEMENT NC (#PCDATA)> <!-- number of components --> -<!ELEMENT BPC (AsHex | (AsHex,BitsPerPixel,Signed) | (BitsPerPixel,Signed))> -<!ELEMENT BitsPerPixel (#PCDATA)> -<!ELEMENT Signed (#PCDATA)> -<!ELEMENT C (#PCDATA)> <!-- Compression type. Only "7" defined --> -<!ELEMENT UnkC (#PCDATA)> <!-- Colourspace Unknown. 1 = unknown, 0 = known --> -<!ELEMENT IPR (#PCDATA)> <!-- 1 = frame has Intellectual Prop. box; otherwise 0 --> -<!ELEMENT ColourSpecification (METH, PREC, APPROX, EnumCS)> -<!ATTLIST ColourSpecification BoxType CDATA #FIXED "colr"> -<!ELEMENT METH (#PCDATA)> <!-- 1 = EnumCS field; 2 = PROFILE field (not yet generated) --> -<!ELEMENT PREC (#PCDATA)> <!-- precedence must be 0 so far --> -<!ELEMENT APPROX (#PCDATA)> <!-- colourspace approximation must be 0 so far --> -<!ELEMENT EnumCS (#PCDATA)> <!-- Valid enumerated MJ2 colourspaces: 16 (sRGB), 17 (grey sRGB), 18 (YCC) --> - -<!-- Following subboxes are optional --> -<!ELEMENT FieldCoding (FieldCount, FieldOrder)> -<!ATTLIST FieldCoding BoxType CDATA #FIXED "fiel"> -<!ELEMENT FieldCount (#PCDATA)> - <!-- Must be either 1 or 2 --> -<!ELEMENT FieldOrder (#PCDATA)> - <!-- When FieldCount=2, FieldOrder means: --> - <!-- 0: Field coding unknown --> - <!-- 1: Field with topmost line is stored first in sample; fields are in temporal order --> - <!-- 6: Field with topmost line is stored second in sample; fields are in temporal order --> - <!-- Defaults: FieldCount=1, FieldOrder=0 if FieldCoding box not present --> - <!-- Current implementation doesn't retain whether box was actually present. --> - -<!ELEMENT MJP2_Profile (CompatibleBrand*)> -<!ATTLIST MJP2_Profile BoxType CDATA #FIXED "jp2p"> -<!ATTLIST MJP2_Profile Count CDATA #REQUIRED> - -<!ELEMENT MJP2_Prefix (Data*)> -<!ATTLIST MJP2_Prefix BoxType CDATA #FIXED "jp2x"> -<!ATTLIST MJP2_Prefix Count CDATA #REQUIRED> -<!-- We'll probably need better formatting than this --> -<!ELEMENT Data (#PCDATA)> <!-- Multiple. Each entry is single byte --> - -<!ELEMENT MJP2_SubSampling (HorizontalSub, VerticalSub, HorizontalOffset, VerticalOffset)> -<!ATTLIST MJP2_SubSampling BoxType CDATA #FIXED "jsub"> -<!-- These values are all 1 byte --> - <!-- Typical subsample value is 2 for 4:2:0 --> -<!ELEMENT HorizontalSub (#PCDATA)> -<!ELEMENT VerticalSub (#PCDATA)> -<!ELEMENT HorizontalOffset (#PCDATA)> -<!ELEMENT VerticalOffset (#PCDATA)> - -<!ELEMENT MJP2_OriginalFormat (OriginalFieldCount, OriginalFieldOrder)> -<!ATTLIST MJP2_OriginalFormat BoxType CDATA #FIXED "orfo"> <!-- Part III Appx. 2 --> -<!ELEMENT OriginalFieldCount (#PCDATA)> - <!-- In original material before encoding. Must be either 1 or 2 --> -<!ELEMENT OriginalFieldOrder (#PCDATA)> - <!-- When FieldCount=2, FieldOrder means: --> - <!-- 0: Field coding unknown --> - <!-- 11: Topmost line came from the earlier field; --> - <!-- 16: Topmost line came form the later field. --> - <!-- Defaults: FieldCount=1, FieldOrder=0 if FieldCoding box not present --> - <!-- Current implementation doesn't retain whether box was actually present. --> - - - <!-- mj2_to_metadata's data structure doesn't record Audio and Hint sample data currently. --> - -<!-- Within SampleTable: --> -<!ELEMENT TimeToSample (SampleStatistics, SampleEntries)> -<!ATTLIST TimeToSample BoxType CDATA #FIXED "stts"> -<!ELEMENT SampleStatistics (TotalSamples)> <!-- Not part of standard --> -<!ELEMENT TotalSamples (#PCDATA)> - <!-- For video, gives the total frames in the track, by summing all entries in the Sample Table --> - -<!ELEMENT SampleEntries (Table*)> -<!ATTLIST SampleEntries EntryCount CDATA #REQUIRED> -<!ELEMENT Table EMPTY> <!-- Multiple. Attributes have values --> -<!ATTLIST Table Entry CDATA #REQUIRED> -<!ATTLIST Table SampleCount CDATA #REQUIRED> -<!ATTLIST Table SampleDelta CDATA #REQUIRED> - -<!-- Within SampleTable: --> -<!ELEMENT SampleToChunk (FirstChunk,SamplesPerChunk,SampleDescrIndex)> -<!ATTLIST SampleToChunk BoxType CDATA #FIXED "stsc"> -<!ATTLIST SampleToChunk Count CDATA #REQUIRED> -<!ELEMENT FirstChunk (#PCDATA)> -<!ELEMENT SamplesPerChunk (#PCDATA)> -<!ELEMENT SampleDescrIndex (#PCDATA)> -<!ELEMENT SampleSize (Sample_Size,Sample_Count,EntrySize*)> -<!ATTLIST SampleSize BoxType CDATA #FIXED "stsz"> -<!ELEMENT Sample_Size (#PCDATA)> -<!ELEMENT Sample_Count (#PCDATA)> -<!ELEMENT EntrySize (#PCDATA)> <!-- appears multiply, but only with mj2_to_metadata option -t --> -<!ATTLIST EntrySize Num CDATA #REQUIRED> -<!ELEMENT ChunkOffset (EntryCount, Chunk_Offset*)> -<!ATTLIST ChunkOffset BoxType CDATA #FIXED "stco"> -<!ELEMENT EntryCount (#PCDATA)> -<!ELEMENT Chunk_Offset (#PCDATA)> <!-- appears multiply, but only with mj2_to_metadata option -t --> -<!ATTLIST Chunk_Offset Num CDATA #REQUIRED> -<!-- </SampleTable> </MediaInfoContainer> </Media> --> - -<!-- TO DO: optional UserData 'udat', can contain multiple Copyright 'cprt' --> - - -<!-- Optional, and only for Visual Track: given individual frame --> -<!ELEMENT JP2_Frame (MainHeader, TilePartHeaders)> -<!ATTLIST JP2_Frame Num CDATA #REQUIRED> -<!ELEMENT MainHeader (StartOfCodestream,ImageAndFileSize,CodingStyleDefault,QuantizationDefault,QuantizationComponent*,RegionOfInterest?,ProgressionOrderChange*)> -<!ELEMENT StartOfCodestream EMPTY> -<!ATTLIST StartOfCodestream Marker CDATA #FIXED "SOC"> -<!ELEMENT ImageAndFileSize (Xsiz,Ysiz,XOsiz,YOsiz,XTsiz,YTsiz,XTOsiz,YTOsiz,Csiz,Component+)> -<!ATTLIST ImageAndFileSize Marker CDATA #FIXED "SIZ"> -<!ELEMENT Xsiz (#PCDATA)> -<!ELEMENT Ysiz (#PCDATA)> <!-- Xsiz, Ysiz is the size of the reference grid. --> -<!ELEMENT XOsiz (#PCDATA)> -<!ELEMENT YOsiz (#PCDATA)> <!-- XOsiz, YOsiz are offsets from grid origin to image origin. --> -<!ELEMENT XTsiz (#PCDATA)> -<!ELEMENT YTsiz (#PCDATA)> <!-- XTsiz, YTsiz is the size of one tile with respect to the grid. --> -<!ELEMENT XTOsiz (#PCDATA)> -<!ELEMENT YTOsiz (#PCDATA)> <!-- XTOsiz, YTOsiz are offsets from grid origin to first tile origin. --> -<!ELEMENT Csiz (#PCDATA)> <!-- Csiz is the number of components in the image. --> -<!-- For image components next --> -<!ELEMENT Component (Ssiz,XRsiz,YRsiz,WidthOfData,HeightOfData)> -<!ATTLIST Component Num CDATA #REQUIRED> -<!ELEMENT Ssiz (AsHex | (AsHex,Signed,PrecisionInBits) | (Signed,PrecisionInBits))> -<!-- Signed already defined --> -<!ELEMENT PrecisionInBits (#PCDATA)> <!-- Bits per pixel (bpp) or pixel depth. --> -<!ELEMENT XRsiz (#PCDATA)> -<!ELEMENT YRsiz (#PCDATA)> <!-- XRsiz, YRsiz denote pixel-sample-spacing on the grid, per Part I Annex B. --> -<!ELEMENT WidthOfData (#PCDATA)> -<!ELEMENT HeightOfData (#PCDATA)> <!-- WidthOfData and HeightOfData are calculated values, e.g.: w = roundup((Xsiz - XOsiz)/ XRsiz) --> -<!-- --> -<!ELEMENT CodingStyleDefault (Scod,SGcod,SPcod)> -<!ATTLIST CodingStyleDefault Marker CDATA #FIXED "COD"> -<!ELEMENT Scod (#PCDATA)> - <!-- For Scod, specific bits mean (where bit 0 is lowest or rightmost): --> - <!-- bit 0: Defines entropy coder precincts --> - <!-- 0 = (PPx=15, PPy=15); 1 = precincts defined below. --> - <!-- bit 1: 1 = SOP marker may be used; 0 = not. --> - <!-- bit 2: 1 = EPH marker may be used; 0 = not. --> -<!ELEMENT SGcod (ProgressionOrder,NumberOfLayers,MultipleComponentTransformation)> -<!ELEMENT ProgressionOrder (#PCDATA)> - <!-- Defined Progression Order Values are: --> - <!-- 0 = LRCP; 1 = RLCP; 2 = RPCL; 3 = PCRL; 4 = CPRL --> - <!-- where L = "layer", R = "resolution level", C = "component", P = "position". --> -<!ELEMENT NumberOfLayers (#PCDATA)> -<!ELEMENT MultipleComponentTransformation (#PCDATA)> - <!-- For MCT, 0 = none, 1 = transform first 3 components for efficiency, per Part I Annex G --> -<!ELEMENT SPcod (NumberOfDecompositionLevels,CodeblockWidth,CodeblockHeight,CodeblockStyle,Transformation)> -<!ELEMENT NumberOfDecompositionLevels (#PCDATA)> -<!ELEMENT CodeblockWidth (#PCDATA)> <!-- CBW and CBH are non-negative, and summed cannot exceed 8 --> -<!ELEMENT CodeblockHeight (#PCDATA)> <!-- Codeblock dimension is 2^(value + 2) --> -<!ELEMENT CodeblockStyle (#PCDATA)> - <!-- For CodeblockStyle, bits mean (with value 1=feature on, 0=off): --> - <!-- bit 0: Selective arithmetic coding bypass. --> - <!-- bit 1: Reset context probabilities on coding pass boundaries. --> - <!-- bit 2: Termination on each coding pass. --> - <!-- bit 3: Vertically causal context. --> - <!-- bit 4: Predictable termination. --> - <!-- bit 5: Segmentation symbols are used. --> -<!ELEMENT Transformation (#PCDATA)> <!-- For Transformation, 0="9-7 irreversible filter", 1="5-3 reversible filter" --> - <!-- mj2_to_metadata implementation always reports component[0] as using default COD, --> - <!-- and any other component, with main-header style values different from [0], as COC. --> -<!ELEMENT QuantizationDefault (Sqcd,SPqcd)> -<!ATTLIST QuantizationDefault Marker CDATA #FIXED "QCD"> -<!ELEMENT Sqcd (AsHex | (AsHex,QuantizationStyle,NumberOfGuardBits) | (QuantizationStyle,NumberOfGuardBits))> -<!ELEMENT QuantizationStyle (#PCDATA)> <!-- Default quantization style for all components. --> - <!-- Quantization style (in Sqcd's low 5 bits) may be: --> - <!-- 0 = No quantization. SPqcd size = 8 bits--> - <!-- 1 = Scalar derived (values signaled for N(L)LL subband only). Use Eq. E.5. SPqcd size = 16. --> - <!-- 2 = Scalar expounded (values signaled for each subband). SPqcd size = 16. --> -<!ELEMENT NumberOfGuardBits (#PCDATA)> <!-- 0-7 guard bits allowed (stored in Sqcd's high 3 bits) --> -<!ELEMENT SPqcd (ReversibleStepSizeValue | QuantizationStepSizeValues )> <!-- TO DO: Irreversible choices --> -<!ELEMENT ReversibleStepSizeValue (DynamicRangeExponent+)> - <!-- Current mj2_to_metadata implementation dumps entire internal table, --> - <!-- until an exponent with zero value is reached. --> - <!-- Exponent epsilon(b) of reversible dynamic range. --> - <!-- Hex value is as stored, in high-order 5 bits. --> -<!ELEMENT DynamicRangeExponent (AsHex | (AsHex, AsDecimal) | AsDecimal)> -<!ATTLIST DynamicRangeExponent Subband CDATA #REQUIRED> -<!ELEMENT QuantizationStepSizeValues (QuantizationValues+, CalculatedExponent*)> <!-- Calculated exponents iff only subband 0 reported --> -<!ELEMENT QuantizationValues (AsHex | (AsHex,Exponent,Mantissa) | (Exponent,Mantissa))> -<!ATTLIST QuantizationValues Subband CDATA #REQUIRED> -<!ELEMENT Exponent (#PCDATA)> -<!ELEMENT Mantissa (#PCDATA)> -<!ELEMENT CalculatedExponent (#PCDATA)> -<!ATTLIST CalculatedExponent Subband CDATA #REQUIRED> -<!-- /QuantizationDefault --> - <!-- mj2_to_metadata implementation always reports component[0] as using default QCD, --> - <!-- and any other component, with main-header quantization values different from [0], as QCC. --> -<!ELEMENT QuantizationComponent (Sqcc,SPqcc)> -<!ATTLIST QuantizationComponent Marker CDATA #FIXED "QCC"> -<!ATTLIST QuantizationComponent Component CDATA #REQUIRED> -<!ELEMENT Sqcc (AsHex | (AsHex,QuantizationStyle,NumberOfGuardBits) | (QuantizationStyle,NumberOfGuardBits))> -<!ELEMENT SPqcc (ReversibleStepSizeValue | QuantizationStepSizeValues )> <!-- TO DO: Irreversible choices --> -<!-- /QuantizationComponent --> -<!-- Don't know if MJ2 files can have regions of interest. Assume yes --> -<!ELEMENT RegionOfInterest (Srgn,Crgn,Sprgn)> <!-- Optional in main header, at most 1 per component --> -<!ATTLIST RegionOfInterest Marker CDATA #FIXED "RGN"> -<!ELEMENT Srgn (#PCDATA)> <!-- ROI style. Only style=0 defined: Implicit ROI (max. shift) --> -<!ELEMENT Crgn (#PCDATA)> <!-- Zero-based component number. --> -<!ELEMENT SPrgn (#PCDATA)> <!-- Implicit ROI shift, i.e., binary shifting of ROI coefficients above background. --> -<!-- </RegionOfInterest> --> -<!ELEMENT ProgressionOrderChange (Progression+)> <!-- Optional in main header, at most 1 per component (but impl allows more?) --> -<!ATTLIST ProgressionOrderChange Marker CDATA #REQUIRED> -<!ELEMENT Progression (RSpoc,CSpoc,LYEpoc,REpoc,CEpoc,Ppoc)> -<!ATTLIST Progression Num CDATA #REQUIRED> -<!ELEMENT RSpoc (#PCDATA)> <!-- Resolution level index (inclusive) for progression start. Range: 0 to 33 --> -<!ELEMENT CSpoc (#PCDATA)> <!-- Component index (inclusive) for progression start. --> -<!ELEMENT LYEpoc (#PCDATA)> <!-- Layer index (exclusive) for progression end. --> -<!ELEMENT REpoc (#PCDATA)> <!-- Resolution level index (exclusive) for progression end. Range: RSpoc to 33 --> -<!ELEMENT CEpoc (#PCDATA)> <!-- Component index (exclusive) for progression end. Minimum: CSpoc --> -<!ELEMENT Ppoc (#PCDATA)> <!-- Defined Progression Order Values are: --> - <!-- 0 = LRCP; 1 = RLCP; 2 = RPCL; 3 = PCRL; 4 = CPRL --> - <!-- where L = "layer", R = "resolution level", C = "component", P = "position". --> -<!-- </Progression>, </ProgressionOrderChange --> -<!-- /MainHeader --> -<!ELEMENT TilePartHeaders (TilePartHeader+)> -<!ATTLIST TilePartHeaders Count CDATA #REQUIRED> -<!ELEMENT TilePartHeader (StartOfTilePart,CodingStyleDefault,QuantizationDefault,QuantizationComponent*,RegionOfInterest?,ProgressionOrderChange*,StartOfData)> -<!ATTLIST TilePartHeader Num CDATA #REQUIRED> -<!ATTLIST TilePartHeader ID CDATA #REQUIRED> -<!ELEMENT StartOfTilePart EMPTY> -<!ATTLIST StartOfTilePart Marker CDATA #FIXED "SOT"> -<!-- CodingStyleDefault, QuantizationDefault, QuantizationComponent already defined --> - <!-- mj2_to_metadata implementation always reports component[0] as using default QCD, --> - <!-- and any other component, with tile-part-header quantization values different from [0], as QCC. --> -<!ELEMENT StartOfData EMPTY> <!-- always empty for now --> -<!ATTLIST StartOfData Marker CDATA #FIXED "SOD"> - <!-- Tile-part bitstream, not shown, follows tile-part header and SOD marker. --> -<!-- /TilePartHeader, /TilePartHeaders, /JP2_Frame --> -<!-- </Track> --> - -<!-- to come: - <MovieExtends mvek> // possibly not in Simple Profile - <UserDataBox udat> contains <CopyrightBox cprt> - --> -<!-- /MovieBox --> -<!-- To come: - <mdat> - <moof> // probably not in Simple Profile - <free> - <skip> - --> -<!-- </MJ2_File> -->
\ No newline at end of file diff --git a/src/bin/mj2/mj2_to_metadata.h b/src/bin/mj2/mj2_to_metadata.h deleted file mode 100644 index f4c34919..00000000 --- a/src/bin/mj2/mj2_to_metadata.h +++ /dev/null @@ -1,9 +0,0 @@ -/* mj2_to_metadata.h */ -/* Dump MJ2, JP2 metadata (partial so far) to xml file */ -/* Contributed to Open JPEG by Glenn Pearson, U.S. National Library of Medicine */ - -#define BOOL int -#define FALSE 0 -#define TRUE 1 - -#include "meta_out.h" diff --git a/src/bin/mj2/mj2_to_metadata.sln b/src/bin/mj2/mj2_to_metadata.sln deleted file mode 100644 index 32b926d4..00000000 --- a/src/bin/mj2/mj2_to_metadata.sln +++ /dev/null @@ -1,29 +0,0 @@ -
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mj2_to_metadata", "mj2_to_metadata.vcproj", "{69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}"
- ProjectSection(ProjectDependencies) = postProject
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD} = {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibOpenJPEG", "..\LibOpenJPEG.vcproj", "{0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Win32 = Debug|Win32
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Debug|Win32.ActiveCfg = Debug|Win32
- {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Debug|Win32.Build.0 = Debug|Win32
- {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Release|Win32.ActiveCfg = Release|Win32
- {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Release|Win32.Build.0 = Release|Win32
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Debug|Win32.ActiveCfg = Debug|Win32
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Debug|Win32.Build.0 = Debug|Win32
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Release|Win32.ActiveCfg = Release|Win32
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/src/bin/mj2/mj2_to_metadata.vcproj b/src/bin/mj2/mj2_to_metadata.vcproj deleted file mode 100644 index b280bfe5..00000000 --- a/src/bin/mj2/mj2_to_metadata.vcproj +++ /dev/null @@ -1,349 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8,00"
- Name="mj2_to_metadata"
- ProjectGUID="{69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\mj2_to_metadata___Win32_Debug0"
- IntermediateDirectory=".\mj2_to_metadata___Win32_Debug0"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TypeLibraryName=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.tlb"
- HeaderFileName=""
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../libopenjpeg"
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;OPJ_STATIC;_CRT_SECURE_NO_DEPRECATE"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- PrecompiledHeaderFile=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.pch"
- AssemblerListingLocation=".\mj2_to_metadata___Win32_Debug0/"
- ObjectFile=".\mj2_to_metadata___Win32_Debug0/"
- ProgramDataBaseFileName=".\mj2_to_metadata___Win32_Debug0/"
- BrowseInformation="1"
- WarningLevel="3"
- SuppressStartupBanner="true"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="2057"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- OutputFile=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.exe"
- LinkIncremental="2"
- SuppressStartupBanner="true"
- IgnoreDefaultLibraryNames="LIBCMT"
- GenerateDebugInformation="true"
- ProgramDatabaseFile=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.pdb"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\Release"
- IntermediateDirectory=".\Release"
- ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- TypeLibraryName=".\Release/mj2_to_metadata.tlb"
- HeaderFileName=""
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="../libopenjpeg"
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;OPJ_STATIC;_CRT_SECURE_NO_DEPRECATE"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- PrecompiledHeaderFile=".\Release/mj2_to_metadata.pch"
- AssemblerListingLocation=".\Release/"
- ObjectFile=".\Release/"
- ProgramDataBaseFileName=".\Release/"
- WarningLevel="3"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="2057"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLinkerTool"
- OutputFile=".\Release/mj2_to_metadata.exe"
- LinkIncremental="1"
- SuppressStartupBanner="true"
- IgnoreDefaultLibraryNames="libcmtd"
- ProgramDatabaseFile=".\Release/mj2_to_metadata.pdb"
- SubSystem="1"
- TargetMachine="1"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCManifestTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- SuppressStartupBanner="true"
- OutputFile=".\Release/mj2_to_metadata.bsc"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCAppVerifierTool"
- />
- <Tool
- Name="VCWebDeploymentTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="MJ2"
- >
- <Filter
- Name="MJ2 Header Files"
- >
- <File
- RelativePath="compat\opj_getopt.h"
- >
- </File>
- <File
- RelativePath="meta_out.h"
- >
- </File>
- <File
- RelativePath="mj2.h"
- >
- </File>
- <File
- RelativePath="mj2_convert.h"
- >
- </File>
- <File
- RelativePath="mj2_to_metadata.h"
- >
- </File>
- </Filter>
- <Filter
- Name="MJ2 Source Files"
- >
- <File
- RelativePath="compat\opj_getopt.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="meta_out.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="mj2.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="mj2_convert.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="mj2_to_metadata.c"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- </File>
- </Filter>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/src/bin/mj2/mj2_to_metadata_Notes.doc b/src/bin/mj2/mj2_to_metadata_Notes.doc Binary files differdeleted file mode 100644 index 05ccec20..00000000 --- a/src/bin/mj2/mj2_to_metadata_Notes.doc +++ /dev/null diff --git a/src/bin/mj2/opj_mj2_compress.c b/src/bin/mj2/opj_mj2_compress.c deleted file mode 100644 index 8386ba0e..00000000 --- a/src/bin/mj2/opj_mj2_compress.c +++ /dev/null @@ -1,853 +0,0 @@ -/* -* Copyright (c) 2003-2004, Francois-Olivier Devaux -* Copyright (c) 2002-2004, 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. -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "opj_apps_config.h" -#include "openjpeg.h" -#include "j2k_lib.h" -#include "cio.h" -#include "j2k.h" -#include "jp2.h" -#include "mj2.h" -#include "mj2_convert.h" -#include "opj_getopt.h" - -/** -Size of memory first allocated for MOOV box -*/ -#define TEMP_BUF 10000 - - -/* -------------------------------------------------------------------------- */ - -/** -sample error callback expecting a FILE* client object -*/ -static void error_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); -} -/** -sample warning callback expecting a FILE* client object -*/ -static void warning_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); -} - -/* -------------------------------------------------------------------------- */ - - -static void help_display() -{ - fprintf(stdout, "HELP for frames_to_mj2\n----\n\n"); - fprintf(stdout, "- the -h option displays this help information on screen\n\n"); - - - fprintf(stdout, "List of parameters for the MJ2 encoder:\n"); - 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, "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"); - fprintf(stdout, "\n"); - fprintf(stdout, "Parameters:\n"); - fprintf(stdout, "------------\n"); - fprintf(stdout, "\n"); - fprintf - (stdout, "Required Parameters (except with -h):\n"); - fprintf - (stdout, "-i : source file (-i source.yuv) \n"); - fprintf - (stdout, "-o : destination file (-o dest.mj2) \n"); - fprintf - (stdout, "Optional Parameters:\n"); - fprintf(stdout, "-h : display the help information \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, " (options -r and -q cannot be used together)\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 : number of resolutions (-n 3) \n"); - fprintf(stdout, "-b : size of code block (-b 32,32) \n"); - fprintf(stdout, "-c : size of precinct (-c 128,128) \n"); - fprintf(stdout, "-t : size of tile (-t 512,512) \n"); - fprintf - (stdout, "-p : progression order (-p LRCP) [LRCP, RLCP, RPCL, PCRL, CPRL] \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, "-S : write SOP marker before each packet \n"); - fprintf - (stdout, "-E : write EPH marker after each header packet \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, " Example: RESTART(4) + RESET(2) + SEGMARK(32) = -M 38\n"); - fprintf - (stdout, "-R : 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, "-d : offset of the origin of the image (-d 150,300) \n"); - fprintf - (stdout, "-T : offset of the origin of the tiles (-T 100,75) \n"); - fprintf(stdout, "-I : use the irreversible DWT 9-7 (-I) \n"); - fprintf(stdout, "-W : image width, height and the dx and dy subsampling \n"); - fprintf(stdout, " of the Cb and Cr components for YUV files \n"); - fprintf(stdout, - " (default is '352,288,2,2' for CIF format's 352x288 and 4:2:0)\n"); - fprintf(stdout, "-F : video frame rate (set to 25 by default)\n"); - fprintf(stdout, "-D : depth, precision in bits [8 .. 16]; default:8\n"); - fprintf(stdout, "-C : comment\n"); - fprintf(stdout, "\n"); - 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"); - 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"); -} - -static OPJ_PROG_ORDER give_progression(const char progression[5]) -{ - if (progression[0] == 'L' && progression[1] == 'R' - && progression[2] == 'C' && progression[3] == 'P') { - return LRCP; - } else { - if (progression[0] == 'R' && progression[1] == 'L' - && progression[2] == 'C' && progression[3] == 'P') { - return RLCP; - } else { - if (progression[0] == 'R' && progression[1] == 'P' - && progression[2] == 'C' && progression[3] == 'L') { - return RPCL; - } else { - if (progression[0] == 'P' && progression[1] == 'C' - && progression[2] == 'R' && progression[3] == 'L') { - return PCRL; - } else { - if (progression[0] == 'C' && progression[1] == 'P' - && progression[2] == 'R' && progression[3] == 'L') { - return CPRL; - } else { - return PROG_UNKNOWN; - } - } - } - } - } -} - - - - -int main(int argc, char **argv) -{ - mj2_cparameters_t mj2_parameters; /* MJ2 compression parameters */ - opj_cparameters_t *j2k_parameters; /* J2K compression parameters */ - opj_event_mgr_t event_mgr; /* event manager */ - opj_cio_t *cio; - int value; - opj_mj2_t *movie; - opj_image_t *img; - int i, j; - char *s, S1, S2, S3; - unsigned char *buf; - int x1, y1, len; - long mdat_initpos, offset; - FILE *mj2file; - int sampleno; - opj_cinfo_t* cinfo; - opj_bool bSuccess; - int numframes; - int prec = 8;/* DEFAULT */ - double total_time = 0; - - memset(&mj2_parameters, 0, sizeof(mj2_cparameters_t)); - /* default value */ - /* ------------- */ - mj2_parameters.w = 352; /* CIF default value*/ - mj2_parameters.h = 288; /* CIF default value*/ - mj2_parameters.CbCr_subsampling_dx = 2; /* CIF default value*/ - mj2_parameters.CbCr_subsampling_dy = 2; /* CIF default value*/ - mj2_parameters.frame_rate = 25; - mj2_parameters.prec = 8; /* DEFAULT */ - mj2_parameters.enumcs = ENUMCS_SYCC; /* FIXME: ENUMCS_YUV420 */ - mj2_parameters.meth = 1; /* enumerated color space */ - - /* - configure the event callbacks (not required) - setting of each callback is optional - */ - 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 = NULL; - - /* set J2K encoding parameters to default values */ - opj_set_default_encoder_parameters(&mj2_parameters.j2k_parameters); - j2k_parameters = &mj2_parameters.j2k_parameters; - - /* Create comment for codestream */ - if (j2k_parameters->cp_comment == NULL) { - const char comment[] = "Created by OpenJPEG version "; - const size_t clen = strlen(comment); - const char *version = opj_version(); - j2k_parameters->cp_comment = (char*)malloc(clen + strlen(version) + 1); - sprintf(j2k_parameters->cp_comment, "%s%s", comment, version); - } - - while (1) { - int c = opj_getopt(argc, argv, - "i:o:r:q:f:t:n:c:b:p:s:d:P:S:E:M:R:T:C:I:W:F:D:h"); - if (c == -1) { - break; - } - switch (c) { - case 'i': { /* IN fill */ - char *infile = opj_optarg; - s = opj_optarg; - while (*s) { - s++; - } - s--; - S3 = *s; - s--; - S2 = *s; - s--; - S1 = *s; - - if ((S1 == 'y' && S2 == 'u' && S3 == 'v') - || (S1 == 'Y' && S2 == 'U' && S3 == 'V')) { - mj2_parameters.decod_format = YUV_DFMT; - } else { - fprintf(stderr, - "!! Unrecognized format for infile : %c%c%c [accept only *.yuv] !!\n\n", - S1, S2, S3); - return 1; - } - strncpy(mj2_parameters.infile, infile, sizeof(mj2_parameters.infile) - 1); - } - break; - /* ----------------------------------------------------- */ - case 'o': { /* OUT fill */ - char *outfile = opj_optarg; - while (*outfile) { - outfile++; - } - outfile--; - S3 = *outfile; - outfile--; - S2 = *outfile; - outfile--; - S1 = *outfile; - - outfile = opj_optarg; - - if ((S1 == 'm' && S2 == 'j' && S3 == '2') - || (S1 == 'M' && S2 == 'J' && S3 == '2')) { - mj2_parameters.cod_format = MJ2_CFMT; - } else { - fprintf(stderr, - "Unknown output format image *.%c%c%c [only *.mj2]!! \n", - S1, S2, S3); - return 1; - } - strncpy(mj2_parameters.outfile, outfile, sizeof(mj2_parameters.outfile) - 1); - } - break; - /* ----------------------------------------------------- */ - case 'r': { /* rates rates/distorsion */ - float rate; - s = opj_optarg; - while (sscanf(s, "%f", &rate) == 1) { - j2k_parameters->tcp_rates[j2k_parameters->tcp_numlayers] = rate * 2; - j2k_parameters->tcp_numlayers++; - while (*s && *s != ',') { - s++; - } - if (!*s) { - break; - } - s++; - } - j2k_parameters->cp_disto_alloc = 1; - } - break; - /* ----------------------------------------------------- */ - case 'q': /* add fixed_quality */ - s = opj_optarg; - while (sscanf(s, "%f", - &j2k_parameters->tcp_distoratio[j2k_parameters->tcp_numlayers]) == 1) { - j2k_parameters->tcp_numlayers++; - while (*s && *s != ',') { - s++; - } - if (!*s) { - break; - } - s++; - } - j2k_parameters->cp_fixed_quality = 1; - break; - /* dda */ - /* ----------------------------------------------------- */ - case 'f': { /* mod fixed_quality (before : -q) */ - int *row = NULL, *col = NULL; - int numlayers = 0, numresolution = 0, matrix_width = 0; - - s = opj_optarg; - sscanf(s, "%d", &numlayers); - s++; - if (numlayers > 9) { - s++; - } - - j2k_parameters->tcp_numlayers = numlayers; - numresolution = j2k_parameters->numresolution; - matrix_width = numresolution * 3; - j2k_parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof( - int)); - s = s + 2; - - for (i = 0; i < numlayers; i++) { - row = &j2k_parameters->cp_matrice[i * matrix_width]; - col = row; - j2k_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++; - } - } - j2k_parameters->cp_fixed_alloc = 1; - } - break; - /* ----------------------------------------------------- */ - case 't': /* tiles */ - sscanf(opj_optarg, "%d,%d", &j2k_parameters->cp_tdx, &j2k_parameters->cp_tdy); - j2k_parameters->tile_size_on = OPJ_TRUE; - break; - /* ----------------------------------------------------- */ - case 'n': /* resolution */ - sscanf(opj_optarg, "%d", &j2k_parameters->numresolution); - break; - /* ----------------------------------------------------- */ - case 'c': { /* precinct dimension */ - char sep; - int res_spec = 0; - - char *s = opj_optarg; - do { - sep = 0; - sscanf(s, "[%d,%d]%c", &j2k_parameters->prcw_init[res_spec], - &j2k_parameters->prch_init[res_spec], &sep); - j2k_parameters->csty |= 0x01; - res_spec++; - s = strpbrk(s, "]") + 2; - } while (sep == ','); - j2k_parameters->res_spec = res_spec; - } - break; - - /* ----------------------------------------------------- */ - 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) { - fprintf(stderr, - "!! Size of code_block error (option -b) !!\n\nRestriction :\n" - " * width*height<=4096\n * 4<=width,height<= 1024\n\n"); - return 1; - } - j2k_parameters->cblockw_init = cblockw_init; - j2k_parameters->cblockh_init = cblockh_init; - } - break; - /* ----------------------------------------------------- */ - case 'p': { /* progression order */ - char progression[5]; - - strncpy(progression, opj_optarg, 5); - j2k_parameters->prog_order = give_progression(progression); - if (j2k_parameters->prog_order == -1) { - fprintf(stderr, "Unrecognized progression order " - "[LRCP, RLCP, RPCL, PCRL, CPRL] !!\n"); - return 1; - } - } - break; - /* ----------------------------------------------------- */ - case 's': { /* subsampling factor */ - if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->subsampling_dx, - &j2k_parameters->subsampling_dy) != 2) { - fprintf(stderr, "'-s' sub-sampling argument error ! [-s dx,dy]\n"); - return 1; - } - } - break; - /* ----------------------------------------------------- */ - case 'd': { /* coordonnate of the reference grid */ - if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->image_offset_x0, - &j2k_parameters->image_offset_y0) != 2) { - fprintf(stderr, "-d 'coordonnate of the reference grid' argument " - "error !! [-d x0,y0]\n"); - return 1; - } - } - break; - /* ----------------------------------------------------- */ - case 'h': /* Display an help description */ - help_display(); - return 0; - break; - /* ----------------------------------------------------- */ - 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 = opj_optarg; - POC = j2k_parameters->POC; - - while (sscanf(s, "T%d=%d,%d,%d,%d,%d,%4s", &POC[numpocs].tile, - &POC[numpocs].resno0, &POC[numpocs].compno0, - &POC[numpocs].layno1, &POC[numpocs].resno1, - &POC[numpocs].compno1, POC[numpocs].progorder) == 7) { - POC[numpocs].prg1 = give_progression(POC[numpocs].progorder); - numpocs++; - while (*s && *s != '/') { - s++; - } - if (!*s) { - break; - } - s++; - } - j2k_parameters->numpocs = numpocs; - } - break; - /* ------------------------------------------------------ */ - case 'S': /* SOP marker */ - j2k_parameters->csty |= 0x02; - break; - /* ------------------------------------------------------ */ - case 'E': /* EPH marker */ - j2k_parameters->csty |= 0x04; - break; - /* ------------------------------------------------------ */ - case 'M': /* Mode switch pas tous au point !! */ - if (sscanf(opj_optarg, "%d", &value) == 1) { - for (i = 0; i <= 5; i++) { - int cache = value & (1 << i); - if (cache) { - j2k_parameters->mode |= (1 << i); - } - } - } - break; - /* ------------------------------------------------------ */ - case 'R': { /* ROI */ - if (sscanf(opj_optarg, "OI:c=%d,U=%d", &j2k_parameters->roi_compno, - &j2k_parameters->roi_shift) != 2) { - fprintf(stderr, "ROI error !! [-ROI:c='compno',U='shift']\n"); - return 1; - } - } - break; - /* ------------------------------------------------------ */ - case 'T': { /* Tile offset */ - if (sscanf(opj_optarg, "%d,%d", &j2k_parameters->cp_tx0, - &j2k_parameters->cp_ty0) != 2) { - fprintf(stderr, "-T 'tile offset' argument error !! [-T X0,Y0]"); - return 1; - } - } - break; - /* ------------------------------------------------------ */ - case 'C': { /* Add a comment */ - j2k_parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1); - if (j2k_parameters->cp_comment) { - strcpy(j2k_parameters->cp_comment, opj_optarg); - } - } - break; - /* ------------------------------------------------------ */ - case 'I': { /* reversible or not */ - j2k_parameters->irreversible = 1; - } - break; - /* ------------------------------------------------------ */ - case 'W': /* Width and Height and Cb and Cr subsampling in case of YUV format files */ - if (sscanf - (opj_optarg, "%d,%d,%d,%d", &mj2_parameters.w, &mj2_parameters.h, - &mj2_parameters.CbCr_subsampling_dx, - &mj2_parameters.CbCr_subsampling_dy) != 4) { - fprintf(stderr, "-W argument error"); - return 1; - } - break; - /* ------------------------------------------------------ */ - case 'F': /* Video frame rate */ - if (sscanf(opj_optarg, "%d", &mj2_parameters.frame_rate) != 1) { - fprintf(stderr, "-F argument error"); - return 1; - } - break; - /* ------------------------------------------------------ */ - case 'D': /* Depth: the precision */ - if (sscanf(opj_optarg, "%d", &prec) != 1) { - prec = 0; - } - break; - - default: - return 1; - } - } - - /* Error messages */ - /* -------------- */ - if (!mj2_parameters.cod_format || !mj2_parameters.decod_format) { - fprintf(stderr, - "Usage: %s -i yuv-file -o mj2-file (+ options)\n", argv[0]); - return 1; - } - if (prec < 1 || prec > 16) { - fprintf(stderr, "Error: Depth %d must be in the range 8 .. 16\n", prec); - return 1; - } - if ((j2k_parameters->cp_disto_alloc || j2k_parameters->cp_fixed_alloc || - j2k_parameters->cp_fixed_quality) - && (!(j2k_parameters->cp_disto_alloc ^ j2k_parameters->cp_fixed_alloc ^ - j2k_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 (j2k_parameters->tcp_numlayers == 0) { - j2k_parameters->tcp_rates[0] = 0; /* MOD antonin : losslessbug */ - j2k_parameters->tcp_numlayers++; - j2k_parameters->cp_disto_alloc = 1; - } - - if ((j2k_parameters->cp_tx0 > j2k_parameters->image_offset_x0) || - (j2k_parameters->cp_ty0 > j2k_parameters->image_offset_y0)) { - fprintf(stderr, - "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", - j2k_parameters->cp_tx0, j2k_parameters->image_offset_x0, j2k_parameters->cp_ty0, - j2k_parameters->image_offset_y0); - return 1; - } - - for (i = 0; i < j2k_parameters->numpocs; i++) { - if (j2k_parameters->POC[i].prg == -1) { - fprintf(stderr, - "Unrecognized progression order in option -P (POC n %d) [LRCP, RLCP, RPCL, PCRL, CPRL] !!\n", - i + 1); - } - } - - if (j2k_parameters->cp_tdx > mj2_parameters.Dim[0] || - j2k_parameters->cp_tdy > mj2_parameters.Dim[1]) { - fprintf(stderr, - "Error: Tile offset dimension is unnappropriate --> TX0(%d)<=IMG_X0(%d) TYO(%d)<=IMG_Y0(%d) \n", - j2k_parameters->cp_tdx, mj2_parameters.Dim[0], j2k_parameters->cp_tdy, - mj2_parameters.Dim[1]); - return 1; - } - - /* to respect profile - 0 */ - /* ---------------------- */ - - x1 = !mj2_parameters.Dim[0] ? (mj2_parameters.w - 1) * - j2k_parameters->subsampling_dx - + 1 : mj2_parameters.Dim[0] + (mj2_parameters.w - 1) * - j2k_parameters->subsampling_dx + 1; - y1 = !mj2_parameters.Dim[1] ? (mj2_parameters.h - 1) * - j2k_parameters->subsampling_dy - + 1 : mj2_parameters.Dim[1] + (mj2_parameters.h - 1) * - j2k_parameters->subsampling_dy + 1; - mj2_parameters.numcomps = 3; /* YUV files only have 3 components */ - - mj2_parameters.prec = prec; - - j2k_parameters->tcp_mct = 0; - - mj2file = fopen(mj2_parameters.outfile, "wb"); - - if (!mj2file) { - fprintf(stderr, "failed to open %s for writing\n", argv[2]); - return 1; - } - - /* get a MJ2 decompressor handle */ - cinfo = mj2_create_compress(); - movie = (opj_mj2_t*)cinfo->mj2_handle; - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); - - /* setup encoder parameters */ - mj2_setup_encoder(movie, &mj2_parameters); - - movie->tk[0].num_samples = - yuv_num_frames(&movie->tk[0], mj2_parameters.infile); - - if (movie->tk[0].num_samples == 0) { - fclose(mj2file); - return 1; - } - - /* One sample per chunk*/ - movie->tk[0].chunk = (mj2_chunk_t*) - malloc(movie->tk[0].num_samples * sizeof(mj2_chunk_t)); - movie->tk[0].sample = (mj2_sample_t*) - malloc(movie->tk[0].num_samples * sizeof(mj2_sample_t)); - - if (mj2_init_stdmovie(movie)) { - fprintf(stderr, "Error with movie initialization"); - return 1; - } - - /* Writing JP, FTYP and MDAT boxes */ - /* Assuming that the JP and FTYP boxes won't be longer than 300 bytes:*/ - buf = (unsigned char*) - malloc(300 * sizeof(unsigned char)); - - cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, 300); - - mj2_write_jp(cio); - mj2_write_ftyp(movie, cio); - - mdat_initpos = cio_tell(cio); - cio_skip(cio, 4); - - cio_write(cio, MJ2_MDAT, 4); - - fwrite(buf, cio_tell(cio), 1, mj2file); - - offset = cio_tell(cio); - opj_cio_close(cio); - free(buf); - - for (i = 0; i < movie->num_stk + movie->num_htk + movie->num_vtk; i++) { - if (movie->tk[i].track_type != 0) { - fprintf(stderr, "Unable to write sound or hint tracks\n"); - } else { - mj2_tk_t *tk; - int buflen = 0; - - tk = &movie->tk[i]; - tk->num_chunks = tk->num_samples; - numframes = tk->num_samples; - tk->depth = prec; - - fprintf(stderr, "Video Track number %d\n", i); - - img = mj2_image_create(tk, j2k_parameters); - - buflen = 2 * (tk->w * tk->h * 8); - buf = (unsigned char *) malloc(buflen * sizeof(unsigned char)); - - for (sampleno = 0; sampleno < numframes; sampleno++) { - double init_time = opj_clock(); - double elapsed_time; - - if (yuvtoimage(tk, img, sampleno, j2k_parameters, - mj2_parameters.infile)) { - fprintf(stderr, "Error with frame number %d in YUV file\n", sampleno); - return 1; - } - - /* setup the encoder parameters using the current image and user parameters */ - opj_setup_encoder(cinfo, j2k_parameters, img); - - cio = opj_cio_open((opj_common_ptr)movie->cinfo, buf, buflen); - - cio_skip(cio, 4); - cio_write(cio, JP2_JP2C, 4); /* JP2C*/ - - /* encode the image */ - bSuccess = opj_encode(cinfo, cio, img, NULL); - - if (!bSuccess) { - opj_cio_close(cio); - fprintf(stderr, "failed to encode image\n"); - return 1; - } - - len = cio_tell(cio) - 8; - cio_seek(cio, 0); - cio_write(cio, len + 8, 4); - opj_cio_close(cio); - - tk->sample[sampleno].sample_size = len + 8; - tk->sample[sampleno].offset = offset; - tk->chunk[sampleno].offset = offset; /* There is one sample per chunk */ - fwrite(buf, 1, len + 8, mj2file); - offset += len + 8; - - elapsed_time = opj_clock() - init_time; - fprintf(stderr, "Frame number %d/%d encoded in %.2f mseconds\n", - sampleno + 1, numframes, elapsed_time * 1000); - total_time += elapsed_time; - } /* for(sampleno */ - - free(buf); - opj_image_destroy(img); - } - }/* for(i */ - - fseek(mj2file, mdat_initpos, SEEK_SET); - - buf = (unsigned char*) malloc(4 * sizeof(unsigned char)); - - /* Init a cio to write box length variable in a little endian way */ - cio = opj_cio_open(NULL, buf, 4); - cio_write(cio, offset - mdat_initpos, 4); - fwrite(buf, 4, 1, mj2file); - fseek(mj2file, 0, SEEK_END); - free(buf); - - /* Writing MOOV box */ - buf = (unsigned char*) - malloc((TEMP_BUF + numframes * 20) * sizeof(unsigned char)); - cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF + numframes * 20)); - mj2_write_moov(movie, cio); - fwrite(buf, cio_tell(cio), 1, mj2file); - free(buf); - - fprintf(stdout, "Total encoding time: %.2f s for %d frames (%.1f fps)\n", - total_time, numframes, (float)numframes / total_time); - - /* Ending program */ - - fclose(mj2file); - /* free remaining compression structures */ - mj2_destroy_compress(movie); - free(cinfo); - - if (j2k_parameters->cp_comment) { - free(j2k_parameters->cp_comment); - } - if (j2k_parameters->cp_matrice) { - free(j2k_parameters->cp_matrice); - } - opj_cio_close(cio); - - return 0; -} diff --git a/src/bin/mj2/opj_mj2_decompress.c b/src/bin/mj2/opj_mj2_decompress.c deleted file mode 100644 index 6d1a9616..00000000 --- a/src/bin/mj2/opj_mj2_decompress.c +++ /dev/null @@ -1,260 +0,0 @@ -/* -* Copyright (c) 2003-2004, Francois-Olivier Devaux -* Copyright (c) 2002-2004, 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. -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "opj_apps_config.h" -#include "openjpeg.h" -#include "j2k_lib.h" -#include "cio.h" -#include "j2k.h" -#include "jp2.h" -#include "mj2.h" -#include "mj2_convert.h" - -#ifdef OPJ_HAVE_LIBLCMS2 -#include <lcms2.h> -#endif -#ifdef OPJ_HAVE_LIBLCMS1 -#include <lcms.h> -#endif -#include "color.h" -/* -------------------------------------------------------------------------- */ - -/** -sample error callback expecting a FILE* client object -*/ -static void error_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); -} -/** -sample warning callback expecting a FILE* client object -*/ -static void warning_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); -} - -/* -------------------------------------------------------------------------- */ - - -int main(int argc, char *argv[]) -{ - mj2_dparameters_t mj2_parameters; /* decompression parameters */ - opj_dinfo_t* dinfo; - opj_event_mgr_t event_mgr; /* event manager */ - opj_cio_t *cio = NULL; - unsigned int tnum, snum; - opj_mj2_t *movie; - mj2_tk_t *track; - mj2_sample_t *sample; - unsigned char* frame_codestream; - FILE *file, *outfile; - char outfilename[50]; - opj_image_t *img = NULL; - unsigned int max_codstrm_size = 0; - double total_time = 0; - unsigned int numframes = 0; - - if (argc != 3) { - printf("Usage: %s inputfile.mj2 outputfile.yuv\n", argv[0]); - return 1; - } - - file = fopen(argv[1], "rb"); - - if (!file) { - fprintf(stderr, "failed to open %s for reading\n", argv[1]); - return 1; - } - - /* Checking output file */ - outfile = fopen(argv[2], "w"); - if (!outfile) { - fprintf(stderr, "failed to open %s for writing\n", argv[2]); - fclose(file); - return 1; - } - fclose(outfile); - - /* - configure the event callbacks (not required) - setting of each callback is optional - */ - 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 = NULL; - - /* get a MJ2 decompressor handle */ - dinfo = mj2_create_decompress(); - movie = (opj_mj2_t*)dinfo->mj2_handle; - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); - - memset(&mj2_parameters, 0, sizeof(mj2_dparameters_t)); - /* set J2K decoding parameters to default values */ - opj_set_default_decoder_parameters(&mj2_parameters.j2k_parameters); - - /* setup the decoder decoding parameters using user parameters */ - mj2_setup_decoder(movie, &mj2_parameters); - - if (mj2_read_struct(file, movie)) { /* Creating the movie structure */ - return 1; - } - - /* Decode first video track */ - for (tnum = 0; - tnum < (unsigned int)(movie->num_htk + movie->num_stk + movie->num_vtk); - tnum++) { - if (movie->tk[tnum].track_type == 0) { - break; - } - } - - if (movie->tk[tnum].track_type != 0) { - printf("Error. Movie does not contain any video track\n"); - return 1; - } - - track = &movie->tk[tnum]; - - /* Output info on first video tracl */ - fprintf(stdout, - "The first video track contains %d frames.\nWidth: %d, Height: %d \n\n", - track->num_samples, track->w, track->h); - - max_codstrm_size = track->sample[0].sample_size - 8; - frame_codestream = (unsigned char*) malloc(max_codstrm_size * sizeof( - unsigned char)); - - numframes = track->num_samples; - - for (snum = 0; snum < numframes; snum++) { - double init_time = opj_clock(); - double elapsed_time; - - sample = &track->sample[snum]; - if (sample->sample_size - 8 > max_codstrm_size) { - max_codstrm_size = sample->sample_size - 8; - if ((frame_codestream = (unsigned char*) - realloc(frame_codestream, max_codstrm_size)) == NULL) { - printf("Error reallocation memory\n"); - free(frame_codestream); - return 1; - }; - } - fseek(file, sample->offset + 8, SEEK_SET); - fread(frame_codestream, sample->sample_size - 8, 1, - file); /* Assuming that jp and ftyp markers size do */ - - /* open a byte stream */ - cio = opj_cio_open((opj_common_ptr)dinfo, frame_codestream, - sample->sample_size - 8); - - img = opj_decode(dinfo, cio); /* Decode J2K to image */ - -#ifdef WANT_SYCC_TO_RGB - if (img->color_space == CLRSPC_SYCC) { - color_sycc_to_rgb(img); - } -#endif - - if (img->icc_profile_buf) { -#if defined(OPJ_HAVE_LIBLCMS1) || defined(OPJ_HAVE_LIBLCMS2) - color_apply_icc_profile(img); -#endif - - free(img->icc_profile_buf); - img->icc_profile_buf = NULL; - img->icc_profile_len = 0; - } - - if (((img->numcomps == 3) && (img->comps[0].dx == img->comps[1].dx / 2) - && (img->comps[0].dx == img->comps[2].dx / 2) && (img->comps[0].dx == 1)) - || (img->numcomps == 1)) { - - if (!imagetoyuv(img, argv[2])) { /* Convert image to YUV */ - return 1; - } - } else if ((img->numcomps == 3) && - (img->comps[0].dx == 1) && (img->comps[1].dx == 1) && - (img->comps[2].dx == 1)) { /* If YUV 4:4:4 input --> to bmp */ - fprintf(stdout, - "The frames will be output in a bmp format (output_1.bmp, ...)\n"); - sprintf(outfilename, "output_%d.bmp", snum); - if (imagetobmp(img, outfilename)) { /* Convert image to BMP */ - return 1; - } - - } else { - fprintf(stdout, - "Image component dimensions are unknown. Unable to output image\n"); - fprintf(stdout, - "The frames will be output in a j2k file (output_1.j2k, ...)\n"); - - sprintf(outfilename, "output_%d.j2k", snum); - outfile = fopen(outfilename, "wb"); - if (!outfile) { - fprintf(stderr, "failed to open %s for writing\n", outfilename); - return 1; - } - fwrite(frame_codestream, sample->sample_size - 8, 1, outfile); - fclose(outfile); - } - /* close the byte stream */ - opj_cio_close(cio); - /* free image data structure */ - opj_image_destroy(img); - elapsed_time = opj_clock() - init_time; - fprintf(stderr, "Frame number %d/%d decoded in %.2f mseconds\n", snum + 1, - numframes, elapsed_time * 1000); - total_time += elapsed_time; - - } - - free(frame_codestream); - fclose(file); - - /* free remaining structures */ - if (dinfo) { - mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); - } - free(dinfo); - - fprintf(stdout, "%d frame(s) correctly decompressed\n", snum); - fprintf(stdout, "Total decoding time: %.2f seconds (%.1f fps)\n", total_time, - (float)numframes / total_time); - - return 0; -} diff --git a/src/bin/mj2/opj_mj2_extract.c b/src/bin/mj2/opj_mj2_extract.c deleted file mode 100644 index 74fbedaf..00000000 --- a/src/bin/mj2/opj_mj2_extract.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - * 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) 2003-2007, Francois-Olivier Devaux - * 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 <stdlib.h> -#include <string.h> - -#include "openjpeg.h" -#include "cio.h" -#include "j2k.h" -#include "jp2.h" -#include "mj2.h" - -/* -------------------------------------------------------------------------- */ - -/** -sample error callback expecting a FILE* client object -*/ -void error_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); -} -/** -sample warning callback expecting a FILE* client object -*/ -void warning_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); -} -/** -sample debug callback expecting a FILE* client object -*/ -void info_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[INFO] %s", msg); -} - -/* -------------------------------------------------------------------------- */ - - -int main(int argc, char *argv[]) -{ - opj_dinfo_t* dinfo; - opj_event_mgr_t event_mgr; /* event manager */ - int tnum; - unsigned int snum; - opj_mj2_t *movie; - mj2_tk_t *track; - mj2_sample_t *sample; - unsigned char* frame_codestream; - FILE *file, *outfile; - char outfilename[FILENAME_MAX]; - mj2_dparameters_t parameters; - - if (argc != 3) { - printf("Usage: %s mj2filename output_prefix\n", argv[0]); - printf("Example: %s foreman.mj2 output/foreman\n", argv[0]); - return 1; - } - - if (strlen(argv[2]) + 11 > sizeof(outfilename)) { - fprintf(stderr, "filename %d too long\n", strlen(argv[2]) + 11); - return 1; - } - - file = fopen(argv[1], "rb"); - - if (!file) { - fprintf(stderr, "failed to open %s for reading\n", argv[1]); - return 1; - } - - /* - configure the event callbacks (not required) - setting of each callback is optional - */ - 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; - - /* get a MJ2 decompressor handle */ - dinfo = mj2_create_decompress(); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr); - - /* setup the decoder decoding parameters using user parameters */ - memset(¶meters, 0, sizeof(mj2_dparameters_t)); - movie = (opj_mj2_t*) dinfo->mj2_handle; - mj2_setup_decoder(movie, ¶meters); - - if (mj2_read_struct(file, movie)) { /* Creating the movie structure*/ - return 1; - } - - /* Decode first video track */ - tnum = 0; - while (movie->tk[tnum].track_type != 0) { - tnum ++; - } - - track = &movie->tk[tnum]; - - fprintf(stdout, "Extracting %d frames from file...\n", track->num_samples); - - for (snum = 0; snum < track->num_samples; snum++) { - sample = &track->sample[snum]; - frame_codestream = (unsigned char*) malloc(sample->sample_size - - 8); /* Skipping JP2C marker*/ - fseek(file, sample->offset + 8, SEEK_SET); - fread(frame_codestream, sample->sample_size - 8, 1, - file); /* Assuming that jp and ftyp markers size do*/ - - { - int num = snprintf(outfilename, sizeof(outfilename), - "%s_%05d.j2k", argv[2], - snum); - if (num >= sizeof(outfilename)) { - fprintf(stderr, "maximum length of output prefix exceeded\n"); - free(frame_codestream); - return 1; - } - } - - outfile = fopen(outfilename, "wb"); - if (!outfile) { - fprintf(stderr, "failed to open %s for writing\n", outfilename); - free(frame_codestream); - return 1; - } - fwrite(frame_codestream, sample->sample_size - 8, 1, outfile); - fclose(outfile); - free(frame_codestream); - } - fclose(file); - fprintf(stdout, "%d frames correctly extracted\n", snum); - - /* free remaining structures */ - if (dinfo) { - mj2_destroy_decompress((opj_mj2_t*)dinfo->mj2_handle); - } - - return 0; -} diff --git a/src/bin/mj2/opj_mj2_wrap.c b/src/bin/mj2/opj_mj2_wrap.c deleted file mode 100644 index 84a066e2..00000000 --- a/src/bin/mj2/opj_mj2_wrap.c +++ /dev/null @@ -1,537 +0,0 @@ -/* - * 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) 2003-2007, Francois-Olivier Devaux - * 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 <stdlib.h> -#include <string.h> - -#include "openjpeg.h" -#include "cio.h" -#include "j2k.h" -#include "jp2.h" -#include "mj2.h" - -static int int_ceildiv(int a, int b) -{ - return (a + b - 1) / b; -} - -/** -Size of memory first allocated for MOOV box -*/ -#define TEMP_BUF 10000 - -#define J2K_CODESTREAM_MAGIC "\xff\x4f\xff\x51" - -/* -------------------------------------------------------------------------- */ - -static int test_image(const char *fname, mj2_cparameters_t *cp) -{ - FILE *reader; - opj_image_t *image; - unsigned char *src; - opj_dinfo_t *dinfo; - opj_cio_t *cio; - opj_dparameters_t dparameters; - int success; - long src_len; - - success = 0; - - if ((reader = fopen(fname, "rb")) == NULL) { - return success; - } - - fseek(reader, 0, SEEK_END); - src_len = ftell(reader); - fseek(reader, 0, SEEK_SET); - src = (unsigned char*) malloc(src_len); - fread(src, 1, src_len, reader); - fclose(reader); - - if (memcmp(src, J2K_CODESTREAM_MAGIC, 4) != 0) { - free(src); - return success; - } - memset(&dparameters, 0, sizeof(opj_dparameters_t)); - - opj_set_default_decoder_parameters(&dparameters); - - dinfo = opj_create_decompress(CODEC_J2K); - - opj_setup_decoder(dinfo, &dparameters); - - cio = opj_cio_open((opj_common_ptr)dinfo, src, src_len); - - image = opj_decode(dinfo, cio); - - free(src); - cio->buffer = NULL; - opj_cio_close(cio); - - if (image == NULL) { - goto fin; - } - - cp->numcomps = image->numcomps; - cp->w = image->comps[0].w; - cp->h = image->comps[0].h; - cp->prec = image->comps[0].prec; - - if (image->numcomps > 2) { - if ((image->comps[0].dx == 1) - && (image->comps[1].dx == 2) - && (image->comps[2].dx == 2) - && (image->comps[0].dy == 1) - && (image->comps[1].dy == 2) - && (image->comps[2].dy == 2)) { /* horizontal and vertical*/ - /* Y420*/ - cp->enumcs = ENUMCS_SYCC; - cp->CbCr_subsampling_dx = 2; - cp->CbCr_subsampling_dy = 2; - } else if ((image->comps[0].dx == 1) - && (image->comps[1].dx == 2) - && (image->comps[2].dx == 2) - && (image->comps[0].dy == 1) - && (image->comps[1].dy == 1) - && (image->comps[2].dy == 1)) { /* horizontal only*/ - /* Y422*/ - cp->enumcs = ENUMCS_SYCC; - cp->CbCr_subsampling_dx = 2; - cp->CbCr_subsampling_dy = 1; - } else if ((image->comps[0].dx == 1) - && (image->comps[1].dx == 1) - && (image->comps[2].dx == 1) - && (image->comps[0].dy == 1) - && (image->comps[1].dy == 1) - && (image->comps[2].dy == 1)) { - /* Y444 or RGB */ - - if (image->color_space == CLRSPC_SRGB) { - cp->enumcs = ENUMCS_SRGB; - - /* cp->CbCr_subsampling_dx = 0; */ - /* cp->CbCr_subsampling_dy = 0; */ - } else { - cp->enumcs = ENUMCS_SYCC; - - cp->CbCr_subsampling_dx = 1; - cp->CbCr_subsampling_dy = 1; - } - } else { - goto fin; - } - } else { - cp->enumcs = ENUMCS_GRAY; - /* cp->CbCr_subsampling_dx = 0; */ - /* cp->CbCr_subsampling_dy = 0; */ - } - if (image->icc_profile_buf) { - cp->meth = 2; - free(image->icc_profile_buf); - image->icc_profile_buf = NULL; - } else { - cp->meth = 1; - } - - success = 1; -fin: - if (dinfo) { - opj_destroy_decompress(dinfo); - } - - if (image) { - opj_image_destroy(image); - } - - return success; -} - -/** -sample error callback expecting a FILE* client object -*/ -static void error_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[ERROR] %s", msg); -} -/** -sample warning callback expecting a FILE* client object -*/ -static void warning_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[WARNING] %s", msg); -} -/** -sample debug callback expecting a FILE* client object -*/ -static void info_callback(const char *msg, void *client_data) -{ - FILE *stream = (FILE*)client_data; - fprintf(stream, "[INFO] %s", msg); -} - -/* -------------------------------------------------------------------------- */ - - - -static void read_siz_marker(FILE *file, opj_image_t *image) -{ - int len, i; - char buf, buf2[2]; - unsigned char *siz_buffer; - opj_cio_t *cio; - - fseek(file, 0, SEEK_SET); - do { - fread(&buf, 1, 1, file); - if (buf == (char)0xff) { - fread(&buf, 1, 1, file); - } - } while (!(buf == (char)0x51)); - - fread(buf2, 2, 1, file); /* Lsiz */ - len = ((buf2[0]) << 8) + buf2[1]; - - siz_buffer = (unsigned char*) malloc(len * sizeof(unsigned char)); - fread(siz_buffer, len, 1, file); - cio = opj_cio_open(NULL, siz_buffer, len); - - cio_read(cio, 2); /* Rsiz (capabilities) */ - image->x1 = cio_read(cio, 4); /* Xsiz */ - image->y1 = cio_read(cio, 4); /* Ysiz */ - image->x0 = cio_read(cio, 4); /* X0siz */ - image->y0 = cio_read(cio, 4); /* Y0siz */ - cio_skip(cio, 16); /* XTsiz, YTsiz, XT0siz, YT0siz */ - - image->numcomps = cio_read(cio, 2); /* Csiz */ - image->comps = - (opj_image_comp_t *) malloc(image->numcomps * sizeof(opj_image_comp_t)); - - for (i = 0; i < image->numcomps; i++) { - int tmp; - tmp = cio_read(cio, 1); /* Ssiz_i */ - image->comps[i].prec = (tmp & 0x7f) + 1; - image->comps[i].sgnd = tmp >> 7; - image->comps[i].dx = cio_read(cio, 1); /* XRsiz_i */ - image->comps[i].dy = cio_read(cio, 1); /* YRsiz_i */ - image->comps[i].resno_decoded = 0; /* number of resolution decoded */ - image->comps[i].factor = 0; /* reducing factor by component */ - } - fseek(file, 0, SEEK_SET); - opj_cio_close(cio); - free(siz_buffer); -} - -static void setparams(opj_mj2_t *movie, opj_image_t *image) -{ - int i, depth_0, depth, sign; - - movie->tk[0].w = int_ceildiv(image->x1 - image->x0, image->comps[0].dx); - movie->tk[0].h = int_ceildiv(image->y1 - image->y0, image->comps[0].dy); - mj2_init_stdmovie(movie); - - movie->tk[0].depth = image->comps[0].prec; - - if (image->numcomps == 3) { - if ((image->comps[0].dx == 1) - && (image->comps[1].dx == 1) - && (image->comps[2].dx == 1)) { - movie->tk[0].CbCr_subsampling_dx = 1; - } else if ((image->comps[0].dx == 1) - && (image->comps[1].dx == 2) - && (image->comps[2].dx == 2)) { - movie->tk[0].CbCr_subsampling_dx = 2; - } else { - fprintf(stderr, "Image component sizes are incoherent\n"); - } - - if ((image->comps[0].dy == 1) - && (image->comps[1].dy == 1) - && (image->comps[2].dy == 1)) { - movie->tk[0].CbCr_subsampling_dy = 1; - } else if ((image->comps[0].dy == 1) - && (image->comps[1].dy == 2) - && (image->comps[2].dy == 2)) { - movie->tk[0].CbCr_subsampling_dy = 2; - } else { - fprintf(stderr, "Image component sizes are incoherent\n"); - } - } - - movie->tk[0].sample_rate = 25; - - movie->tk[0].jp2_struct.numcomps = image->numcomps; /* NC */ - - /* Init Standard jp2 structure */ - - movie->tk[0].jp2_struct.comps = - (opj_jp2_comps_t *) malloc(movie->tk[0].jp2_struct.numcomps * sizeof( - opj_jp2_comps_t)); - movie->tk[0].jp2_struct.precedence = 0; /* PRECEDENCE*/ - movie->tk[0].jp2_struct.approx = 0; /* APPROX*/ - movie->tk[0].jp2_struct.brand = JP2_JP2; /* BR */ - movie->tk[0].jp2_struct.minversion = 0; /* MinV */ - movie->tk[0].jp2_struct.numcl = 1; - movie->tk[0].jp2_struct.cl = (unsigned int *) malloc( - movie->tk[0].jp2_struct.numcl * sizeof(int)); - movie->tk[0].jp2_struct.cl[0] = JP2_JP2; /* CL0 : JP2 */ - movie->tk[0].jp2_struct.C = 7; /* C : Always 7*/ - movie->tk[0].jp2_struct.UnkC = - 0; /* UnkC, colorspace specified in colr box*/ - movie->tk[0].jp2_struct.IPR = 0; /* IPR, no intellectual property*/ - movie->tk[0].jp2_struct.w = int_ceildiv(image->x1 - image->x0, - image->comps[0].dx); - movie->tk[0].jp2_struct.h = int_ceildiv(image->y1 - image->y0, - image->comps[0].dy); - - depth_0 = image->comps[0].prec - 1; - sign = image->comps[0].sgnd; - movie->tk[0].jp2_struct.bpc = depth_0 + (sign << 7); - - for (i = 1; i < image->numcomps; i++) { - depth = image->comps[i].prec - 1; - sign = image->comps[i].sgnd; - if (depth_0 != depth) { - movie->tk[0].jp2_struct.bpc = 255; - } - } - - for (i = 0; i < image->numcomps; i++) - movie->tk[0].jp2_struct.comps[i].bpcc = - image->comps[i].prec - 1 + (image->comps[i].sgnd << 7); - - if ((image->numcomps == 1 || image->numcomps == 3) - && (movie->tk[0].jp2_struct.bpc != 255)) { - movie->tk[0].jp2_struct.meth = 1; - } else { - movie->tk[0].jp2_struct.meth = 2; - } - - if (image->numcomps == 1) { - movie->tk[0].jp2_struct.enumcs = 17; /* Grayscale */ - } - - else if ((image->comps[0].dx == 1) - && (image->comps[1].dx == 1) - && (image->comps[2].dx == 1) - && (image->comps[0].dy == 1) - && (image->comps[1].dy == 1) - && (image->comps[2].dy == 1)) { - movie->tk[0].jp2_struct.enumcs = 16; /* RGB */ - } - - else if ((image->comps[0].dx == 1) - && (image->comps[1].dx == 2) - && (image->comps[2].dx == 2) - && (image->comps[0].dy == 1) - && (image->comps[1].dy == 2) - && (image->comps[2].dy == 2)) { - movie->tk[0].jp2_struct.enumcs = 18; /* YUV */ - } - - else { - movie->tk[0].jp2_struct.enumcs = 0; /* Unknown profile */ - } -} - -int main(int argc, char *argv[]) -{ - opj_cinfo_t* cinfo; - opj_event_mgr_t event_mgr; /* event manager */ - unsigned int snum; - opj_mj2_t *movie; - mj2_sample_t *sample; - unsigned char* frame_codestream; - FILE *mj2file, *j2kfile; - char *j2kfilename; - unsigned char *buf; - int offset, mdat_initpos; - opj_image_t img; - opj_cio_t *cio; - mj2_cparameters_t parameters; - - if (argc != 3) { - printf("Usage: %s source_location mj2_filename\n", argv[0]); - printf("Example: %s input/input output.mj2\n", argv[0]); - return 1; - } - - mj2file = fopen(argv[2], "wb"); - - if (!mj2file) { - fprintf(stderr, "failed to open %s for writing\n", argv[2]); - return 1; - } - memset(&img, 0, sizeof(opj_image_t)); - /* - configure the event callbacks (not required) - setting of each callback is optional - */ - 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; - - /* get a MJ2 decompressor handle */ - cinfo = mj2_create_compress(); - - /* catch events using our callbacks and give a local context */ - opj_set_event_mgr((opj_common_ptr)cinfo, &event_mgr, stderr); - - /* setup the decoder encoding parameters using user parameters */ - memset(¶meters, 0, sizeof(mj2_cparameters_t)); - movie = (opj_mj2_t*) cinfo->mj2_handle; - - j2kfilename = (char*)malloc(strlen(argv[1]) + 12);/* max. '%6d' */ - sprintf(j2kfilename, "%s_00001.j2k", argv[1]); - - if (test_image(j2kfilename, ¶meters) == 0) { - goto fin; - } - - parameters.frame_rate = 25; /* DEFAULT */ - - mj2_setup_encoder(movie, ¶meters); - - - /* Writing JP, FTYP and MDAT boxes - Assuming that the JP and FTYP boxes won't be longer than 300 bytes */ - - buf = (unsigned char*) malloc(300 * sizeof(unsigned char)); - cio = opj_cio_open(movie->cinfo, buf, 300); - mj2_write_jp(cio); - mj2_write_ftyp(movie, cio); - mdat_initpos = cio_tell(cio); - cio_skip(cio, 4); - cio_write(cio, MJ2_MDAT, 4); - fwrite(buf, cio_tell(cio), 1, mj2file); - free(buf); - - /* Insert each j2k codestream in a JP2C box */ - snum = 0; - offset = 0; - while (1) { - mj2_sample_t * new_sample; - mj2_chunk_t * new_chunk; - sample = &movie->tk[0].sample[snum]; - sprintf(j2kfilename, "%s_%05d.j2k", argv[1], snum); - j2kfile = fopen(j2kfilename, "rb"); - if (!j2kfile) { - if (snum == 0) { /* Could not open a single codestream */ - fprintf(stderr, "failed to open %s for reading\n", j2kfilename); - return 1; - } else { /* Tried to open a inexistent codestream */ - fprintf(stdout, "%d frames are being added to the MJ2 file\n", snum); - break; - } - } - - /* Calculating offset for samples and chunks */ - offset += cio_tell(cio); - sample->offset = offset; - movie->tk[0].chunk[snum].offset = - offset; /* There will be one sample per chunk */ - - /* Calculating sample size */ - fseek(j2kfile, 0, SEEK_END); - sample->sample_size = ftell(j2kfile) + - 8; /* Sample size is codestream + JP2C box header */ - fseek(j2kfile, 0, SEEK_SET); - - /* Reading siz marker of j2k image for the first codestream */ - if (snum == 0) { - read_siz_marker(j2kfile, &img); - } - - /* Writing JP2C box header */ - frame_codestream = (unsigned char*) malloc(sample->sample_size + 8); - cio = opj_cio_open(movie->cinfo, frame_codestream, sample->sample_size); - cio_write(cio, sample->sample_size, 4); /* Sample size */ - cio_write(cio, JP2_JP2C, 4); /* JP2C */ - - /* Writing codestream from J2K file to MJ2 file */ - fread(frame_codestream + 8, sample->sample_size - 8, 1, j2kfile); - fwrite(frame_codestream, sample->sample_size, 1, mj2file); - cio_skip(cio, sample->sample_size - 8); - - /* Ending loop */ - fclose(j2kfile); - snum++; - new_sample = (mj2_sample_t*) - realloc(movie->tk[0].sample, (snum + 1) * sizeof(mj2_sample_t)); - new_chunk = (mj2_chunk_t*) - realloc(movie->tk[0].chunk, (snum + 1) * sizeof(mj2_chunk_t)); - if (new_sample && new_chunk) { - movie->tk[0].sample = new_sample; - movie->tk[0].chunk = new_chunk; - } else { - fprintf(stderr, "Failed to allocate enough memory to read %s\n", j2kfilename); - return 1; - } - free(frame_codestream); - } - - /* Writing the MDAT box length in header */ - offset += cio_tell(cio); - buf = (unsigned char*) malloc(4 * sizeof(unsigned char)); - cio = opj_cio_open(movie->cinfo, buf, 4); - cio_write(cio, offset - mdat_initpos, 4); - fseek(mj2file, (long)mdat_initpos, SEEK_SET); - fwrite(buf, 4, 1, mj2file); - fseek(mj2file, 0, SEEK_END); - free(buf); - - /* Setting movie parameters */ - movie->tk[0].num_samples = snum; - movie->tk[0].num_chunks = snum; - setparams(movie, &img); - - /* Writing MOOV box */ - buf = (unsigned char*) malloc((TEMP_BUF + snum * 20) * sizeof(unsigned char)); - cio = opj_cio_open(movie->cinfo, buf, (TEMP_BUF + snum * 20)); - mj2_write_moov(movie, cio); - fwrite(buf, cio_tell(cio), 1, mj2file); - - /* Ending program */ - free(img.comps); - opj_cio_close(cio); - -fin: - fclose(mj2file); - mj2_destroy_compress(movie); - free(j2kfilename); - - return 0; -} diff --git a/src/bin/mj2/readme.txt b/src/bin/mj2/readme.txt deleted file mode 100644 index 9419d2a2..00000000 --- a/src/bin/mj2/readme.txt +++ /dev/null @@ -1,3 +0,0 @@ -Attention : the motion jpeg 2000 files currently only work with OpenJPEG v0.97 that you can find here : - -http://www.openjpeg.org/openjpeg_v097.tar.gz
\ No newline at end of file |
