#-----------------------------------------------------------------------------
# Build Applications
option(BUILD_CODEC "Build the CODEC executables" ON)
-option(BUILD_MJ2 "Build the MJ2 executables." OFF)
-option(BUILD_JPWL "Build the JPWL library and executables" OFF)
option(BUILD_JPIP "Build the JPIP library and executables." OFF)
if(BUILD_JPIP)
option(BUILD_JPIP_SERVER "Build the JPIP server." OFF)
endif()
option(BUILD_VIEWER "Build the OPJViewer executable (C++)" OFF)
option(BUILD_JAVA "Build the openjpeg jar (Java)" OFF)
-option(BUILD_JP3D "Build the JP3D comp" OFF)
mark_as_advanced(BUILD_VIEWER)
mark_as_advanced(BUILD_JAVA)
-mark_as_advanced(BUILD_JP3D)
-if(BUILD_CODEC OR BUILD_MJ2)
+if(BUILD_CODEC)
# OFF: It will only build 3rd party libs if they are not found on the system
# ON: 3rd party libs will ALWAYS be build, and used
option(BUILD_THIRDPARTY "Build the thirdparty executables if it is needed" OFF)
${CMAKE_CURRENT_BINARY_DIR}/libopenjp2.pc @ONLY)
install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjp2.pc DESTINATION
${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig )
-#
- if(BUILD_JPWL)
- # install in lib and not share (see multi-arch note above)
- configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjpwl/libopenjpwl.pc.cmake.in
- ${CMAKE_CURRENT_BINARY_DIR}/libopenjpwl.pc @ONLY)
- install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjpwl.pc DESTINATION
- ${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig )
- endif()
#
if(BUILD_JPIP)
# install in lib and not share (see multi-arch note above)
install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjpip.pc DESTINATION
${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig )
endif()
-#
- if(BUILD_JP3D)
- # install in lib and not share (see multi-arch note above)
- configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/lib/openjp3d/libopenjp3d.pc.cmake.in
- ${CMAKE_CURRENT_BINARY_DIR}/libopenjp3d.pc @ONLY)
- install( FILES ${CMAKE_CURRENT_BINARY_DIR}/libopenjp3d.pc DESTINATION
- ${OPENJPEG_INSTALL_LIB_DIR}/pkgconfig )
- endif()
endif()
#-----------------------------------------------------------------------------
* src
* lib
* openjp2: contains the sources of the openjp2 library (Part 1 & 2)
- * openjpwl: contains the additional sources if you want to build a JPWL-flavoured library.
* openjpip: complete client-server architecture for remote browsing of jpeg 2000 images.
- * openjp3d: JP3D implementation
- * openmj2: MJ2 implementation
* bin: contains all applications that use the openjpeg library
* common: common files to all applications
* jp2: a basic codec
- * mj2: motion jpeg 2000 executables
* jpip: OpenJPIP applications (server and dec server)
* java: a Java client viewer for JPIP
- * jp3d: JP3D applications
- * tcltk: a test tool for JP3D
* wx
* OPJViewer: gui for displaying j2k files (based on wxWidget)
* wrapping
See [NEWS](https://github.com/uclouvain/openjpeg/blob/master/NEWS.md) for user visible changes in successive releases.
+## Deprecated components
+
+The openjpwl, openjp3d and openmj2 components have been removed after the
+2.4.0 release. Their building and working state is unknown. People interested
+in them should start from the 2.4.0 tag.
+
## API/ABI
An API/ABI timeline is automatically updated [here][link-api-timeline].
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)
+++ /dev/null
-# 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()
+++ /dev/null
-/*
- * 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;
-}
-
+++ /dev/null
-/*
- * 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 */
-
+++ /dev/null
-/*
- * 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 */
-}
+++ /dev/null
-/* 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_ */
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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;
-}
-
+++ /dev/null
-#!/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 .]
+++ /dev/null
-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
+++ /dev/null
-\r
-namespace eval VMDecoder {\r
- variable var\r
- variable JP3Ddecoder "../bin/jp3d_to_volume.exe"\r
- #variable JP3Ddecoder "jp3d_to_volume.exe"\r
-}\r
-\r
-\r
-proc VMDecoder::create { nb } {\r
- variable var\r
-\r
- set frameD [$nb insert end VMDecoder -text "Decoder"]\r
- set topfD [frame $frameD.topfD]\r
- set medfD [frame $frameD.medfD]\r
- set bottomfD [frame $frameD.bottomfD]\r
- set srcfD [TitleFrame $topfD.srcfD -text "Source"]\r
- set dstfD [TitleFrame $topfD.dstfD -text "Destination"]\r
- set paramfD [TitleFrame $medfD.paramfD -text "Decoding parameters"]\r
- set infofD [TitleFrame $medfD.infofD -text "Distortion measures"]\r
-\r
- set frame1 [$srcfD getframe]\r
- _sourceD $frame1\r
- set frame2 [$dstfD getframe]\r
- _destinationD $frame2\r
- set frame3 [$infofD getframe]\r
- _originalD $frame3\r
- set frame4 [$paramfD getframe]\r
- _paramsD $frame4\r
-\r
- set butD [Button $bottomfD.butD -text "Decode!" \\r
- -command "VMDecoder::_decode $frame1 $frame2 $frame3" \\r
- -helptext "Decoding trigger button"]\r
- set butR [Button $bottomfD.butR -text "Save info" \\r
- -command "VMDecoder::_save $frame3" \\r
- -helptext "Save information"]\r
- \r
- pack $srcfD $dstfD -side left -fill both -padx 10 -ipadx 5 -expand yes\r
- pack $topfD -pady 4 -fill x\r
- \r
- pack $paramfD $infofD -side left -fill both -padx 10 -pady 2 -ipadx 5 -expand yes\r
- pack $medfD -pady 4 -fill x \r
-\r
- pack $butD $butR -side left -padx 4 -pady 5 -expand yes\r
- pack $bottomfD -pady 4 -fill x\r
-\r
-return $frameD\r
-}\r
-\r
-\r
-proc fileDialogD {w ent operation} {\r
-\r
- variable file\r
- \r
- if {$operation == "open"} {\r
- #-----Type names---------Extension(s)---\r
- set types {\r
- {"JP3D Files" {.jp3d} }\r
- {"All files" *}\r
- }\r
- set file [tk_getOpenFile -filetypes $types -parent $w ]\r
- } elseif {$operation == "original"} {\r
- #-----Type names---------Extension(s)---\r
- set types {\r
- {"BIN Raw Image Files" {.bin} }\r
- {"PGX Raw Image Files" {.pgx} }\r
- {"All files" *}\r
- }\r
- set file [tk_getOpenFile -filetypes $types -parent $w ]\r
- } else {\r
- #-----Type names---------Extension(s)---\r
- set types {\r
- {"BIN Raw Image Files" {.bin} }\r
- {"PGX Raw Image Files" {.pgx} }\r
- {"All files" *}\r
- }\r
- set file [tk_getSaveFile -filetypes $types -parent $w -initialfile Untitled -defaultextension "*.bin"]\r
- }\r
- if {[string compare $file ""]} {\r
- $ent delete 0 end\r
- $ent insert end $file\r
- $ent xview moveto 1\r
- }\r
-}\r
-\r
-proc VMDecoder::_sourceD { parent } {\r
- \r
- variable var\r
- \r
- set labsrcD [LabelFrame $parent.labsrcD -text "Select compressed file: " -side top \\r
- -anchor w -relief flat -borderwidth 0]\r
- set subsrcD [$labsrcD getframe]\r
- set listD [entry $subsrcD.entrysrcD -width 40 -textvariable VMDecoder::var(sourceD)]\r
- \r
- set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0]\r
- set subbrw [$labbrw getframe]\r
- set butbrw [button $subbrw.butbrw -image [Bitmap::get open] \\r
- -relief raised -borderwidth 1 -padx 1 -pady 1 \\r
- -command "fileDialogD . $subsrcD.entrysrcD open"]\r
- \r
- pack $listD -side top\r
- pack $butbrw -side top\r
- pack $labsrcD $labbrw -side left -fill both -expand yes\r
-\r
-\r
-}\r
-\r
-proc VMDecoder::_destinationD { parent } {\r
- \r
- variable var\r
- \r
- set labdstD [LabelFrame $parent.labdstD -text "Save decompressed volume file(s) as: " -side top \\r
- -anchor w -relief flat -borderwidth 0]\r
- set subdstD [$labdstD getframe]\r
- set listD [entry $subdstD.entrydstD -width 40 -textvariable VMDecoder::var(destinationD)]\r
- \r
- set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0]\r
- set subbrw [$labbrw getframe]\r
- set butbrw [button $subbrw.butbrw -image [Bitmap::get save] \\r
- -relief raised -borderwidth 1 -padx 1 -pady 1 \\r
- -command "fileDialogD . $subdstD.entrydstD save"]\r
-\r
- pack $listD -side top\r
- pack $butbrw -side top\r
- pack $labdstD $labbrw -side left -fill both -expand yes\r
-}\r
-\r
-proc VMDecoder::_originalD { parent } {\r
- \r
- variable var\r
- \r
- set laborgD [LabelFrame $parent.laborgD -text "Select original file: " -side top \\r
- -anchor w -relief flat -borderwidth 0]\r
- set suborgD [$laborgD getframe]\r
- set listorgD [entry $suborgD.entryorgD -width 30 -textvariable VMDecoder::var(originalD)]\r
- \r
- set labbrw2 [LabelFrame $parent.labbrw2 -side top -anchor w -relief flat -borderwidth 0]\r
- set subbrw2 [$labbrw2 getframe]\r
- set butbrw2 [button $subbrw2.butbrw2 -image [Bitmap::get open] \\r
- -relief raised -borderwidth 1 -padx 1 -pady 1 \\r
- -command "fileDialogD . $suborgD.entryorgD original"]\r
- \r
- set infoD [Label $parent.infoD -relief sunken -textvariable VMDecoder::var(decodinfo) -justify left]\r
-\r
- pack $listorgD -side left -anchor n\r
- pack $butbrw2 -side left -anchor n\r
- pack $infoD -side bottom -anchor nw -pady 4 -ipadx 150 -ipady 20 -expand yes\r
- pack $laborgD $labbrw2 -side left -fill both \r
-\r
-\r
-}\r
-\r
-proc VMDecoder::_paramsD { parent } {\r
- \r
- variable var\r
- \r
- ########### DECODING #############\r
- set labcod [LabelFrame $parent.labcod -side top -anchor w -relief sunken -borderwidth 1]\r
- set subcod [$labcod getframe]\r
-\r
- set frameres [frame $subcod.frameres -borderwidth 1]\r
- set labres [LabelEntry $frameres.labres -label "Resolutions to discard: " -labelwidth 20 -labelanchor w \\r
- -textvariable VMDecoder::var(resdiscard) -editable 1 \\r
- -helptext "Number of highest resolution levels to be discarded on each dimension" ]\r
- set VMDecoder::var(resdiscard) "0,0,0"\r
- \r
- set framelayer [frame $subcod.framelayer -borderwidth 1]\r
- set lablayer [LabelEntry $framelayer.lablayer -label "Layers to decode: " -labelwidth 20 -labelanchor w \\r
- -textvariable VMDecoder::var(layer) -editable 1 \\r
- -helptext "Maximum number of quality layers to decode" ]\r
- set VMDecoder::var(layer) "All"\r
-\r
- set framebe [frame $subcod.framebe -borderwidth 1]\r
- set chkbe [checkbutton $framebe.chkbe -text "Write decoded file with BigEndian byte order" \\r
- -variable VMDecoder::var(be) -onvalue 1 -offvalue 0 ]\r
-\r
- pack $labres -side left -padx 2 -anchor n\r
- pack $lablayer -side left -padx 2 -anchor n\r
- pack $chkbe -side left -padx 2 -anchor w\r
- pack $frameres $framelayer $framebe -side top -anchor w\r
-\r
- pack $subcod -anchor n\r
- pack $labcod -side left -fill both -padx 4 -expand yes\r
-}\r
-\r
-\r
-proc VMDecoder::_decode { framesrc framedst frameinfo} {\r
-\r
- variable var\r
-\r
- set sourceD [$framesrc.labsrcD.f.entrysrcD get ]\r
- set destinationD [$framedst.labdstD.f.entrydstD get ]\r
- set originD [$frameinfo.laborgD.f.entryorgD get ]\r
- set cond1 [string match *.pgx [string tolower $destinationD]]\r
- set cond2 [string match *\**.pgx [string tolower $destinationD]]\r
- set cond3 [string match *.bin [string tolower $destinationD]]\r
- \r
- #comprobamos datos son correctos\r
- if {($cond1 == 1) && ($cond2 == 0)} {\r
- set pgx "*.pgx"\r
- set pattern [string range $destinationD 0 [expr [string length $destinationD]-5]]\r
- set destinationD $pattern$img\r
- } elseif {$sourceD == ""} {\r
- MessageDlg .msgdlg -parent . -message "Error : Source file is not defined !" -type ok -icon error \r
- } elseif {$destinationD == ""} {\r
- MessageDlg .msgdlg -parent . -message "Error : Destination file is not defined !" -type ok -icon error \r
- } else {\r
-\r
- #creamos datain a partir de los parametros de entrada\r
- #set dirJP3Ddecoder [mk_relativepath $VMDecoder::JP3Ddecoder]\r
- set dirJP3Ddecoder $VMDecoder::JP3Ddecoder\r
- set datain [concat " $dirJP3Ddecoder -i [mk_relativepath $sourceD] "]\r
- set datain [concat " $datain -o [mk_relativepath $destinationD] "]\r
- if {$originD != ""} {\r
- set datain [concat " $datain -O [mk_relativepath $originD] "]\r
- if {$cond3 == 1} {\r
- set img ".img"\r
- set pattern [string range $originD 0 [expr [string length $originD]-5]]\r
- set pattern $pattern$img\r
- if {[file exists $pattern]} {\r
- set datain [concat " $datain -m [mk_relativepath $pattern] "]\r
- } else {\r
- MessageDlg .msgdlg -parent . -message "Error : IMG file associated to original BIN volume file not found in same directory !" -type ok -icon info \r
- }\r
- }\r
- }\r
- if {$VMDecoder::var(resdiscard) != "0,0,0"} {\r
- set datain [concat " $datain -r $VMDecoder::var(resdiscard) "]\r
- }\r
- if {$VMDecoder::var(layer) != "All" && $VMDecoder::var(layer) > 0} {\r
- set datain [concat " $datain -l $VMDecoder::var(layer) "]\r
- }\r
- if {$VMDecoder::var(be) == 1} {\r
- set datain [concat " $datain -BE"]\r
- }\r
- \r
- set VMDecoder::var(progval) 10\r
- ProgressDlg .progress -parent . -title "Wait..." \\r
- -type infinite \\r
- -width 20 \\r
- -textvariable "Compute in progress..."\\r
- -variable VMDecoder::progval \\r
- -stop "Stop" \\r
- -command {destroy .progress}\r
-\r
- after 200 set VMDecoder::var(progval) 2\r
-\r
- set fp [open "| $datain " r+] \r
- fconfigure $fp -buffering line \r
- set jp3dVM::dataout [concat "EXECUTED PROGRAM:\n\t$datain"]\r
- while {-1 != [gets $fp tmp]} {\r
- set jp3dVM::dataout [concat "$jp3dVM::dataout\n$tmp"]\r
- }\r
- close $fp\r
- destroy .progress\r
- set cond [string first "ERROR" $jp3dVM::dataout]\r
- set cond2 [string first "PSNR" $jp3dVM::dataout]\r
- set cond3 [string first "RESULT" $jp3dVM::dataout]\r
- if {$cond != -1} {\r
- MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond-1] end] -type ok -icon error\r
- } elseif {$cond3 != -1} {\r
- if {$cond2 != -1} {\r
- set VMDecoder::var(decodinfo) [string range $jp3dVM::dataout [expr $cond2-1] end]\r
- }\r
- MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond3-1] end] -type ok -icon info\r
- }\r
- }\r
-}\r
-\r
-proc VMDecoder::_save { frameinfo } {\r
-\r
-}\r
-\r
+++ /dev/null
-
-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
- }
-}
+++ /dev/null
-/*
- * 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*/
+++ /dev/null
-# 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()
+++ /dev/null
-/*
- * 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 */
+++ /dev/null
-/*
- * 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 */
-
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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 */
-
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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*/
-
-
-
-
+++ /dev/null
-
-/*
- * 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*/
+++ /dev/null
-# 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()
+++ /dev/null
-/* 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
+++ /dev/null
-/* 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);
-
+++ /dev/null
-/* 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;
-}
-
-
+++ /dev/null
-<!--
-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
+++ /dev/null
-/* 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"
+++ /dev/null
-\r
-Microsoft Visual Studio Solution File, Format Version 9.00\r
-# Visual Studio 2005\r
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mj2_to_metadata", "mj2_to_metadata.vcproj", "{69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}"\r
- ProjectSection(ProjectDependencies) = postProject\r
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD} = {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}\r
- EndProjectSection\r
-EndProject\r
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibOpenJPEG", "..\LibOpenJPEG.vcproj", "{0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}"\r
-EndProject\r
-Global\r
- GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
- Debug|Win32 = Debug|Win32\r
- Release|Win32 = Release|Win32\r
- EndGlobalSection\r
- GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
- {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Debug|Win32.ActiveCfg = Debug|Win32\r
- {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Debug|Win32.Build.0 = Debug|Win32\r
- {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Release|Win32.ActiveCfg = Release|Win32\r
- {69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}.Release|Win32.Build.0 = Release|Win32\r
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Debug|Win32.ActiveCfg = Debug|Win32\r
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Debug|Win32.Build.0 = Debug|Win32\r
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Release|Win32.ActiveCfg = Release|Win32\r
- {0B1B7713-35B6-40A7-9BFF-A7D0EB06A8BD}.Release|Win32.Build.0 = Release|Win32\r
- EndGlobalSection\r
- GlobalSection(SolutionProperties) = preSolution\r
- HideSolutionNode = FALSE\r
- EndGlobalSection\r
-EndGlobal\r
+++ /dev/null
-<?xml version="1.0" encoding="Windows-1252"?>\r
-<VisualStudioProject\r
- ProjectType="Visual C++"\r
- Version="8,00"\r
- Name="mj2_to_metadata"\r
- ProjectGUID="{69BE42AB-E7CE-4DA1-BBD2-39FEA2C91E0B}"\r
- >\r
- <Platforms>\r
- <Platform\r
- Name="Win32"\r
- />\r
- </Platforms>\r
- <ToolFiles>\r
- </ToolFiles>\r
- <Configurations>\r
- <Configuration\r
- Name="Debug|Win32"\r
- OutputDirectory=".\mj2_to_metadata___Win32_Debug0"\r
- IntermediateDirectory=".\mj2_to_metadata___Win32_Debug0"\r
- ConfigurationType="1"\r
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
- UseOfMFC="0"\r
- ATLMinimizesCRunTimeLibraryUsage="false"\r
- CharacterSet="2"\r
- >\r
- <Tool\r
- Name="VCPreBuildEventTool"\r
- />\r
- <Tool\r
- Name="VCCustomBuildTool"\r
- />\r
- <Tool\r
- Name="VCXMLDataGeneratorTool"\r
- />\r
- <Tool\r
- Name="VCWebServiceProxyGeneratorTool"\r
- />\r
- <Tool\r
- Name="VCMIDLTool"\r
- TypeLibraryName=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.tlb"\r
- HeaderFileName=""\r
- />\r
- <Tool\r
- Name="VCCLCompilerTool"\r
- Optimization="0"\r
- AdditionalIncludeDirectories="../libopenjpeg"\r
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;OPJ_STATIC;_CRT_SECURE_NO_DEPRECATE"\r
- MinimalRebuild="true"\r
- BasicRuntimeChecks="3"\r
- RuntimeLibrary="1"\r
- PrecompiledHeaderFile=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.pch"\r
- AssemblerListingLocation=".\mj2_to_metadata___Win32_Debug0/"\r
- ObjectFile=".\mj2_to_metadata___Win32_Debug0/"\r
- ProgramDataBaseFileName=".\mj2_to_metadata___Win32_Debug0/"\r
- BrowseInformation="1"\r
- WarningLevel="3"\r
- SuppressStartupBanner="true"\r
- DebugInformationFormat="4"\r
- />\r
- <Tool\r
- Name="VCManagedResourceCompilerTool"\r
- />\r
- <Tool\r
- Name="VCResourceCompilerTool"\r
- PreprocessorDefinitions="_DEBUG"\r
- Culture="2057"\r
- />\r
- <Tool\r
- Name="VCPreLinkEventTool"\r
- />\r
- <Tool\r
- Name="VCLinkerTool"\r
- OutputFile=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.exe"\r
- LinkIncremental="2"\r
- SuppressStartupBanner="true"\r
- IgnoreDefaultLibraryNames="LIBCMT"\r
- GenerateDebugInformation="true"\r
- ProgramDatabaseFile=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.pdb"\r
- SubSystem="1"\r
- TargetMachine="1"\r
- />\r
- <Tool\r
- Name="VCALinkTool"\r
- />\r
- <Tool\r
- Name="VCManifestTool"\r
- />\r
- <Tool\r
- Name="VCXDCMakeTool"\r
- />\r
- <Tool\r
- Name="VCBscMakeTool"\r
- SuppressStartupBanner="true"\r
- OutputFile=".\mj2_to_metadata___Win32_Debug0/mj2_to_metadata.bsc"\r
- />\r
- <Tool\r
- Name="VCFxCopTool"\r
- />\r
- <Tool\r
- Name="VCAppVerifierTool"\r
- />\r
- <Tool\r
- Name="VCWebDeploymentTool"\r
- />\r
- <Tool\r
- Name="VCPostBuildEventTool"\r
- />\r
- </Configuration>\r
- <Configuration\r
- Name="Release|Win32"\r
- OutputDirectory=".\Release"\r
- IntermediateDirectory=".\Release"\r
- ConfigurationType="1"\r
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"\r
- UseOfMFC="0"\r
- ATLMinimizesCRunTimeLibraryUsage="false"\r
- CharacterSet="2"\r
- >\r
- <Tool\r
- Name="VCPreBuildEventTool"\r
- />\r
- <Tool\r
- Name="VCCustomBuildTool"\r
- />\r
- <Tool\r
- Name="VCXMLDataGeneratorTool"\r
- />\r
- <Tool\r
- Name="VCWebServiceProxyGeneratorTool"\r
- />\r
- <Tool\r
- Name="VCMIDLTool"\r
- TypeLibraryName=".\Release/mj2_to_metadata.tlb"\r
- HeaderFileName=""\r
- />\r
- <Tool\r
- Name="VCCLCompilerTool"\r
- Optimization="2"\r
- InlineFunctionExpansion="1"\r
- AdditionalIncludeDirectories="../libopenjpeg"\r
- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;OPJ_STATIC;_CRT_SECURE_NO_DEPRECATE"\r
- StringPooling="true"\r
- RuntimeLibrary="0"\r
- EnableFunctionLevelLinking="true"\r
- PrecompiledHeaderFile=".\Release/mj2_to_metadata.pch"\r
- AssemblerListingLocation=".\Release/"\r
- ObjectFile=".\Release/"\r
- ProgramDataBaseFileName=".\Release/"\r
- WarningLevel="3"\r
- SuppressStartupBanner="true"\r
- />\r
- <Tool\r
- Name="VCManagedResourceCompilerTool"\r
- />\r
- <Tool\r
- Name="VCResourceCompilerTool"\r
- PreprocessorDefinitions="NDEBUG"\r
- Culture="2057"\r
- />\r
- <Tool\r
- Name="VCPreLinkEventTool"\r
- />\r
- <Tool\r
- Name="VCLinkerTool"\r
- OutputFile=".\Release/mj2_to_metadata.exe"\r
- LinkIncremental="1"\r
- SuppressStartupBanner="true"\r
- IgnoreDefaultLibraryNames="libcmtd"\r
- ProgramDatabaseFile=".\Release/mj2_to_metadata.pdb"\r
- SubSystem="1"\r
- TargetMachine="1"\r
- />\r
- <Tool\r
- Name="VCALinkTool"\r
- />\r
- <Tool\r
- Name="VCManifestTool"\r
- />\r
- <Tool\r
- Name="VCXDCMakeTool"\r
- />\r
- <Tool\r
- Name="VCBscMakeTool"\r
- SuppressStartupBanner="true"\r
- OutputFile=".\Release/mj2_to_metadata.bsc"\r
- />\r
- <Tool\r
- Name="VCFxCopTool"\r
- />\r
- <Tool\r
- Name="VCAppVerifierTool"\r
- />\r
- <Tool\r
- Name="VCWebDeploymentTool"\r
- />\r
- <Tool\r
- Name="VCPostBuildEventTool"\r
- />\r
- </Configuration>\r
- </Configurations>\r
- <References>\r
- </References>\r
- <Files>\r
- <Filter\r
- Name="MJ2"\r
- >\r
- <Filter\r
- Name="MJ2 Header Files"\r
- >\r
- <File\r
- RelativePath="compat\opj_getopt.h"\r
- >\r
- </File>\r
- <File\r
- RelativePath="meta_out.h"\r
- >\r
- </File>\r
- <File\r
- RelativePath="mj2.h"\r
- >\r
- </File>\r
- <File\r
- RelativePath="mj2_convert.h"\r
- >\r
- </File>\r
- <File\r
- RelativePath="mj2_to_metadata.h"\r
- >\r
- </File>\r
- </Filter>\r
- <Filter\r
- Name="MJ2 Source Files"\r
- >\r
- <File\r
- RelativePath="compat\opj_getopt.c"\r
- >\r
- <FileConfiguration\r
- Name="Debug|Win32"\r
- >\r
- <Tool\r
- Name="VCCLCompilerTool"\r
- AdditionalIncludeDirectories=""\r
- PreprocessorDefinitions=""\r
- />\r
- </FileConfiguration>\r
- <FileConfiguration\r
- Name="Release|Win32"\r
- >\r
- <Tool\r
- Name="VCCLCompilerTool"\r
- AdditionalIncludeDirectories=""\r
- PreprocessorDefinitions=""\r
- />\r
- </FileConfiguration>\r
- </File>\r
- <File\r
- RelativePath="meta_out.c"\r
- >\r
- <FileConfiguration\r
- Name="Debug|Win32"\r
- >\r
- <Tool\r
- Name="VCCLCompilerTool"\r
- AdditionalIncludeDirectories=""\r
- PreprocessorDefinitions=""\r
- />\r
- </FileConfiguration>\r
- <FileConfiguration\r
- Name="Release|Win32"\r
- >\r
- <Tool\r
- Name="VCCLCompilerTool"\r
- AdditionalIncludeDirectories=""\r
- PreprocessorDefinitions=""\r
- />\r
- </FileConfiguration>\r
- </File>\r
- <File\r
- RelativePath="mj2.c"\r
- >\r
- <FileConfiguration\r
- Name="Debug|Win32"\r
- >\r
- <Tool\r
- Name="VCCLCompilerTool"\r
- AdditionalIncludeDirectories=""\r
- PreprocessorDefinitions=""\r
- />\r
- </FileConfiguration>\r
- <FileConfiguration\r
- Name="Release|Win32"\r
- >\r
- <Tool\r
- Name="VCCLCompilerTool"\r
- AdditionalIncludeDirectories=""\r
- PreprocessorDefinitions=""\r
- />\r
- </FileConfiguration>\r
- </File>\r
- <File\r
- RelativePath="mj2_convert.c"\r
- >\r
- <FileConfiguration\r
- Name="Debug|Win32"\r
- >\r
- <Tool\r
- Name="VCCLCompilerTool"\r
- AdditionalIncludeDirectories=""\r
- PreprocessorDefinitions=""\r
- />\r
- </FileConfiguration>\r
- <FileConfiguration\r
- Name="Release|Win32"\r
- >\r
- <Tool\r
- Name="VCCLCompilerTool"\r
- AdditionalIncludeDirectories=""\r
- PreprocessorDefinitions=""\r
- />\r
- </FileConfiguration>\r
- </File>\r
- <File\r
- RelativePath="mj2_to_metadata.c"\r
- >\r
- <FileConfiguration\r
- Name="Debug|Win32"\r
- >\r
- <Tool\r
- Name="VCCLCompilerTool"\r
- AdditionalIncludeDirectories=""\r
- PreprocessorDefinitions=""\r
- />\r
- </FileConfiguration>\r
- <FileConfiguration\r
- Name="Release|Win32"\r
- >\r
- <Tool\r
- Name="VCCLCompilerTool"\r
- AdditionalIncludeDirectories=""\r
- PreprocessorDefinitions=""\r
- />\r
- </FileConfiguration>\r
- </File>\r
- </Filter>\r
- </Filter>\r
- </Files>\r
- <Globals>\r
- </Globals>\r
-</VisualStudioProject>\r
+++ /dev/null
-/*
-* 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;
-}
+++ /dev/null
-/*
-* 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;
-}
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-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
# Part 1 & 2:
add_subdirectory(openjp2)
-# optionals components:
-if(BUILD_JPWL)
- add_subdirectory(openjpwl)
-endif()
-if(BUILD_MJ2)
- add_subdirectory(openmj2)
-endif()
if(BUILD_JPIP)
add_subdirectory(openjpip)
endif()
-if(BUILD_JP3D)
- add_subdirectory(openjp3d)
-endif()
+++ /dev/null
-# openjp3d
-include_regular_expression("^.*$")
-
-include_directories(
- ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h
- )
-
-set(OPENJP3D_LIBRARY_NAME openjp3d)
-# Defines the source code for the library
-set(OPENJP3D_SRCS
-bio.c cio.c dwt.c event.c jp3d.c jp3d_lib.c mct.c mqc.c openjp3d.c
-pi.c raw.c t1.c t1_3d.c t2.c tcd.c tgt.c volume.c
-)
-
-# Build the library
-if(WIN32)
- if(BUILD_SHARED_LIBS)
- add_definitions(-DOPJ_EXPORTS)
- else()
- add_definitions(-DOPJ_STATIC)
- endif()
-endif()
-
-# build jp3d lib:
-add_library(${OPENJP3D_LIBRARY_NAME} ${OPENJP3D_SRCS})
-if(UNIX)
- target_link_libraries(${OPENJP3D_LIBRARY_NAME} m)
-endif()
-set_target_properties(${OPENJP3D_LIBRARY_NAME} PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES})
-if(NOT ${CMAKE_VERSION} VERSION_LESS "2.8.12")
- target_compile_options(${OPENJP3D_LIBRARY_NAME} PRIVATE ${OPENJPEG_LIBRARY_COMPILE_OPTIONS})
-endif()
-
-# Install library
-install(TARGETS ${OPENJP3D_LIBRARY_NAME}
- EXPORT OpenJP3DTargets
- DESTINATION ${OPENJPEG_INSTALL_LIB_DIR}
- COMPONENT Libraries
-)
-
-# Install includes files
-install(FILES openjp3d.h
- DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR}
- COMPONENT Headers
-)
+++ /dev/null
-/*
- * 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
- * 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_includes.h"
-
-/** @defgroup BIO BIO - Individual bit input-output stream */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Write a bit
-@param bio BIO handle
-@param b Bit to write (0 or 1)
-*/
-static void bio_putbit(opj_bio_t *bio, int b);
-/**
-Read a bit
-@param bio BIO handle
-@return Returns the read bit
-*/
-static int bio_getbit(opj_bio_t *bio);
-/**
-Write a byte
-@param bio BIO handle
-@return Returns 0 if successful, returns 1 otherwise
-*/
-static int bio_byteout(opj_bio_t *bio);
-/**
-Read a byte
-@param bio BIO handle
-@return Returns 0 if successful, returns 1 otherwise
-*/
-static int bio_bytein(opj_bio_t *bio);
-
-/*@}*/
-
-/*@}*/
-
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-static int bio_byteout(opj_bio_t *bio)
-{
- bio->buf = (bio->buf << 8) & 0xffff;
- bio->ct = bio->buf == 0xff00 ? 7 : 8;
- if (bio->bp >= bio->end) {
- return 1;
- }
- *bio->bp++ = bio->buf >> 8;
- return 0;
-}
-
-static int bio_bytein(opj_bio_t *bio)
-{
- bio->buf = (bio->buf << 8) & 0xffff;
- bio->ct = bio->buf == 0xff00 ? 7 : 8;
- if (bio->bp >= bio->end) {
- return 1;
- }
- bio->buf |= *bio->bp++;
- return 0;
-}
-
-static void bio_putbit(opj_bio_t *bio, int b)
-{
- if (bio->ct == 0) {
- bio_byteout(bio);
- }
- bio->ct--;
- bio->buf |= b << bio->ct;
-}
-
-/* MOD antonin */
-static int bio_getbit(opj_bio_t *bio)
-{
- /* DOM */
- if (bio->ct == 0) {
- bio_bytein(bio);
- }
- bio->ct--;
- return (bio->buf >> bio->ct) & 1;
-}
-
-/*
-==========================================================
- Bit Input/Output interface
-==========================================================
-*/
-
-opj_bio_t* bio_create()
-{
- opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
- return bio;
-}
-
-void bio_destroy(opj_bio_t *bio)
-{
- if (bio) {
- opj_free(bio);
- }
-}
-
-int bio_numbytes(opj_bio_t *bio)
-{
- return (bio->bp - bio->start);
-}
-
-void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len)
-{
- bio->start = bp;
- bio->end = bp + len;
- bio->bp = bp;
- bio->buf = 0;
- bio->ct = 8;
-}
-
-void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len)
-{
- bio->start = bp;
- bio->end = bp + len;
- bio->bp = bp;
- bio->buf = 0;
- bio->ct = 0;
-}
-
-void bio_write(opj_bio_t *bio, int v, int n)
-{
- int i;
- for (i = n - 1; i >= 0; i--) {
- bio_putbit(bio, (v >> i) & 1);
- }
-}
-
-int bio_read(opj_bio_t *bio, int n)
-{
- int i, v;
- v = 0;
- for (i = n - 1; i >= 0; i--) {
- v += bio_getbit(bio) << i;
- }
- return v;
-}
-
-int bio_flush(opj_bio_t *bio)
-{
- bio->ct = 0;
- if (bio_byteout(bio)) {
- return 1;
- }
- if (bio->ct == 7) {
- bio->ct = 0;
- if (bio_byteout(bio)) {
- return 1;
- }
- }
- return 0;
-}
-
-int bio_inalign(opj_bio_t *bio)
-{
- bio->ct = 0;
- if ((bio->buf & 0xff) == 0xff) {
- if (bio_bytein(bio)) {
- return 1;
- }
- bio->ct = 0;
- }
- return 0;
-}
+++ /dev/null
-/*
- * 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
- * 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 __BIO_H
-#define __BIO_H
-/**
-@file bio.h
-@brief Implementation of an individual bit input-output (BIO)
-
-The functions in BIO.C have for goal to realize an individual bit input - output.
-*/
-
-/** @defgroup BIO BIO - Individual bit input-output stream */
-/*@{*/
-
-/**
-Individual bit input-output stream (BIO)
-*/
-typedef struct opj_bio {
- /** pointer to the start of the buffer */
- unsigned char *start;
- /** pointer to the end of the buffer */
- unsigned char *end;
- /** pointer to the present position in the buffer */
- unsigned char *bp;
- /** temporary place where each byte is read or written */
- unsigned int buf;
- /** coder : number of bits free to write. decoder : number of bits read */
- int ct;
-} opj_bio_t;
-
-/** @name Funciones generales */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a new BIO handle
-@return Returns a new BIO handle if successful, returns NULL otherwise
-*/
-opj_bio_t* bio_create(void);
-/**
-Destroy a previously created BIO handle
-@param bio BIO handle to destroy
-*/
-void bio_destroy(opj_bio_t *bio);
-/**
-Number of bytes written.
-@param bio BIO handle
-@return Returns the number of bytes written
-*/
-int bio_numbytes(opj_bio_t *bio);
-/**
-Init encoder
-@param bio BIO handle
-@param bp Output buffer
-@param len Output buffer length
-*/
-void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len);
-/**
-Init decoder
-@param bio BIO handle
-@param bp Input buffer
-@param len Input buffer length
-*/
-void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len);
-/**
-Write bits
-@param bio BIO handle
-@param v Value of bits
-@param n Number of bits to write
-*/
-void bio_write(opj_bio_t *bio, int v, int n);
-/**
-Read bits
-@param bio BIO handle
-@param n Number of bits to read
-@return Returns the corresponding read number
-*/
-int bio_read(opj_bio_t *bio, int n);
-/**
-Flush bits
-@param bio BIO handle
-@return Returns 1 if successful, returns 0 otherwise
-*/
-int bio_flush(opj_bio_t *bio);
-/**
-Passes the ending bits (coming from flushing)
-@param bio BIO handle
-@return Returns 1 if successful, returns 0 otherwise
-*/
-int bio_inalign(opj_bio_t *bio);
-/**
-Read a bit
-@param bio BIO handle
-@return Returns the read bit
-*/
-/* MOD antonin */
-/*int bio_getbit(opj_bio_t *bio);*/
-/* DOM */
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __BIO_H */
-
+++ /dev/null
-/*
- * 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
- * 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_includes.h"
-
-/* ----------------------------------------------------------------------- */
-
-opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo,
- unsigned char *buffer, int length)
-{
- opj_cp_t *cp = NULL;
- opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t));
- if (!cio) {
- return NULL;
- }
- cio->cinfo = cinfo;
- if (buffer && length) {
- /* wrap a user buffer containing the encoded image */
- cio->openmode = OPJ_STREAM_READ;
- cio->buffer = buffer;
- cio->length = length;
- } else if (!buffer && !length && cinfo) {
- /* allocate a buffer for the encoded image */
- cio->openmode = OPJ_STREAM_WRITE;
- switch (cinfo->codec_format) {
- case CODEC_J3D:
- case CODEC_J2K:
- cp = ((opj_j3d_t*)cinfo->j3d_handle)->cp;
- break;
- default:
- opj_free(cio);
- return NULL;
- }
- cio->length = cp->tdx * cp->tdy * cp->tdz * cp->tw * cp->th * cp->tl * 4;
- cio->buffer = (unsigned char *)opj_malloc(cio->length);
- if (!cio->buffer) {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error allocating memory for compressed bitstream\n");
- opj_free(cio);
- return NULL;
- }
- } else {
- opj_free(cio);
- return NULL;
- }
-
- /* Initialize byte IO */
- cio->start = cio->buffer;
- cio->end = cio->buffer + cio->length;
- cio->bp = cio->buffer;
-
- return cio;
-}
-
-void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio)
-{
- if (cio) {
- if (cio->openmode == OPJ_STREAM_WRITE) {
- /* destroy the allocated buffer */
- opj_free(cio->buffer);
- }
- /* destroy the cio */
- opj_free(cio);
- }
-}
-
-
-/* ----------------------------------------------------------------------- */
-
-/*
- * Get position in byte stream.
- */
-int OPJ_CALLCONV cio_tell(opj_cio_t *cio)
-{
- return cio->bp - cio->start;
-}
-
-/*
- * Set position in byte stream.
- *
- * pos : position, in number of bytes, from the beginning of the stream
- */
-void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos)
-{
- cio->bp = cio->start + pos;
-}
-
-/*
- * Number of bytes left before the end of the stream.
- */
-int cio_numbytesleft(opj_cio_t *cio)
-{
- return cio->end - cio->bp;
-}
-
-/*
- * Get pointer to the current position in the stream.
- */
-unsigned char *cio_getbp(opj_cio_t *cio)
-{
- return cio->bp;
-}
-
-/*
- * Write a byte.
- */
-static bool cio_byteout(opj_cio_t *cio, unsigned char v)
-{
- if (cio->bp >= cio->end) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n");
- return false;
- }
- *cio->bp++ = v;
- return true;
-}
-
-/*
- * Read a byte.
- */
-static unsigned char cio_bytein(opj_cio_t *cio)
-{
- if (cio->bp >= cio->end) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "read error\n");
- return 0;
- }
- return *cio->bp++;
-}
-
-/*
- * Write some bytes.
- *
- * v : value to write
- * n : number of bytes to write
- */
-unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n)
-{
- int i;
- for (i = n - 1; i >= 0; i--) {
- if (!cio_byteout(cio, (unsigned char)((v >> (i << 3)) & 0xff))) {
- return 0;
- }
- }
- return n;
-}
-
-/*
- * Read some bytes.
- *
- * n : number of bytes to read
- *
- * return : value of the n bytes read
- */
-unsigned int cio_read(opj_cio_t *cio, int n)
-{
- int i;
- unsigned int v;
- v = 0;
- for (i = n - 1; i >= 0; i--) {
- v += cio_bytein(cio) << (i << 3);
- }
- return v;
-}
-
-/*
- * Skip some bytes.
- *
- * n : number of bytes to skip
- */
-void cio_skip(opj_cio_t *cio, int n)
-{
- cio->bp += n;
-}
-
-/*
- * Write some bytes.
- *
- * v : value to write
- * n : number of bytes to write
- */
-int cio_write_int(opj_cio_t *cio, int v, int n)
-{
- int i;
- for (i = n - 1; i >= 0; i--) {
- if (!cio_byteout(cio, (char)((v >> (i << 3)) & 0xff))) {
- return 0;
- }
- }
- return n;
-}
-
-/*
- * Read some bytes.
- *
- * n : number of bytes to read
- *
- * return : value of the n bytes read
- */
-int cio_read_int(opj_cio_t *cio, int n)
-{
- int i;
- int v;
- v = 0;
- for (i = n - 1; i >= 0; i--) {
- v += cio_bytein(cio) << (i << 3);
- }
- return v;
-}
-
+++ /dev/null
-/*
- * 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
- * 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 __CIO_H
-#define __CIO_H
-/**
-@file cio.h
-@brief Implementation of a byte input-output process (CIO)
-
-The functions in CIO.C have for goal to realize a byte input / output process.
-*/
-
-/** @defgroup CIO CIO - byte input-output stream */
-/*@{*/
-
-/** @name Funciones generales (see also openjp3d.h) */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Number of bytes left before the end of the stream
-@param cio CIO handle
-@return Returns the number of bytes before the end of the stream
-*/
-int cio_numbytesleft(opj_cio_t *cio);
-/**
-Get pointer to the current position in the stream
-@param cio CIO handle
-@return Returns a pointer to the current position
-*/
-unsigned char *cio_getbp(opj_cio_t *cio);
-/**
-Write some bytes
-@param cio CIO handle
-@param v Value to write
-@param n Number of bytes to write
-@return Returns the number of bytes written or 0 if an error occurred
-*/
-unsigned int cio_write(opj_cio_t *cio, unsigned int v, int n);
-/**
-Read some bytes
-@param cio CIO handle
-@param n Number of bytes to read
-@return Returns the value of the n bytes read
-*/
-unsigned int cio_read(opj_cio_t *cio, int n);
-/**
-Skip some bytes
-@param cio CIO handle
-@param n Number of bytes to skip
-*/
-void cio_skip(opj_cio_t *cio, int n);
-/**
-Write some bytes
-@param cio CIO handle
-@param v Signed integer value to write
-@param n Number of bytes to write
-@return Returns the number of bytes written or 0 if an error occurred
-*/
-int cio_write_int(opj_cio_t *cio, int v, int n);
-/**
-Read some bytes
-@param cio CIO handle
-@param n Number of bytes to read
-@return Returns the value of the n bytes read
-*/
-int cio_read_int(opj_cio_t *cio, int n);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __CIO_H */
-
+++ /dev/null
-/*
- * 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
- * Copyrigth (c) 2006, Mónica DÃez, LPI-UVA, 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.
- */
-
-/*
- * NOTE:
- * This is a modified version of the openjpeg dwt.c file.
- * Average speed improvement compared to the original file (measured on
- * my own machine, a P4 running at 3.0 GHz):
- * 5x3 wavelets about 2 times faster
- * 9x7 wavelets about 3 times faster
- * for both, encoding and decoding.
- *
- * The better performance is caused by doing the 1-dimensional DWT
- * within a temporary buffer where the data can be accessed sequential
- * for both directions, horizontal and vertical. The 2d vertical DWT was
- * the major bottleneck in the former version.
- *
- * I have also removed the "Add Patrick" part because it is not longer
- * needed.
- *
- * 6/6/2005
- * -Ive (aka Reiner Wahler)
- * mail: ive@lilysoft.com
- */
-
-#include "opj_includes.h"
-
-/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-/*unsigned int ops;*/
-/**
-Forward lazy transform (horizontal)
-*/
-static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas);
-/**
-Forward lazy transform (vertical)
-*/
-static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas);
-/**
-Forward lazy transform (axial)
-*/
-static void dwt_deinterleave_z(int *a, int *b, int dn, int sn, int xy, int cas);
-/**
-Inverse lazy transform (horizontal)
-*/
-static void dwt_interleave_h(int *a, int *b, int dn, int sn, int cas);
-/**
-Inverse lazy transform (vertical)
-*/
-static void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas);
-/**
-Inverse lazy transform (axial)
-*/
-static void dwt_interleave_z(int *a, int *b, int dn, int sn, int xy, int cas);
-/**
-Forward 5-3 wavelet transform in 1-D
-*/
-static void dwt_encode_53(int *a, int dn, int sn, int cas);
-static void dwt_encode_97(int *a, int dn, int sn, int cas);
-/**
-Inverse 5-3 wavelet transform in 1-D
-*/
-static void dwt_decode_53(int *a, int dn, int sn, int cas);
-static void dwt_decode_97(int *a, int dn, int sn, int cas);
-/**
-Computing of wavelet transform L2 norms for arbitrary transforms
-*/
-static double dwt_calc_wtnorms(int orient, int level[3], int dwtid[3],
- opj_wtfilt_t *wtfiltx, opj_wtfilt_t *wtfilty, opj_wtfilt_t *wtfiltz);
-/**
-Encoding of quantification stepsize
-*/
-static void dwt_encode_stepsize(int stepsize, int numbps,
- opj_stepsize_t *bandno_stepsize);
-/*@}*/
-
-/*@}*/
-
-#define S(i) a[(i)*2]
-#define D(i) a[(1+(i)*2)]
-#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i)))
-#define D_(i) ((i)<0?D(0):((i)>=dn?D(dn-1):D(i)))
-/* new */
-#define SS_(i) ((i)<0?S(0):((i)>=dn?S(dn-1):S(i)))
-#define DD_(i) ((i)<0?D(0):((i)>=sn?D(sn-1):D(i)))
-
-/* <summary> */
-/* This table contains the norms of the 5-3 wavelets for different bands. */
-/* </summary> */
-static double dwt_norm[10][10][10][8];
-static int flagnorm[10][10][10][8];
-
-/*static const double dwt_norms[5][8][10] = {
- {//ResZ=1
- {1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},
- {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
- {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
- {.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}
- },{//ResZ=2
- {1.000, 1.8371, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},
- {1.2717, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
- {1.2717, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
- {.8803, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93},
- {1.2717},
- {.8803},
- {.8803},
- {.6093},
- },{ //ResZ=3
- {1.000, 1.8371, 4.5604, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},
- {1.2717, 2.6403, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
- {1.2717, 2.6403, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
- {.8803, 1.5286, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93},
- {1.2717, 2.6403},
- {.8803, 1.5286},
- {.8803, 1.5286},
- {.6093, 0.8850},
- },{ //ResZ=4
- {1.000, 1.8371, 4.5604, 12.4614, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},
- {1.2717, 2.6403, 6.7691 , 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
- {1.2717, 2.6403, 6.7691 , 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
- {.8803, 1.5286, 3.6770 , 3.043, 6.019, 12.01, 24.00, 47.97, 95.93},
- {1.2717, 2.6403, 6.7691 },
- {.8803, 1.5286, 3.6770 },
- {.8803, 1.5286, 3.6770 },
- {.6093, 0.8850, 1.9974 },
- },{ //ResZ=5
- {1.000, 1.8371, 4.5604, 12.4614, 34.9025, 21.34, 42.67, 85.33, 170.7, 341.3},
- {1.2717, 2.6403, 6.7691 , 18.6304 , 11.33, 22.64, 45.25, 90.48, 180.9},
- {1.2717, 2.6403, 6.7691 , 18.6304, 11.33, 22.64, 45.25, 90.48, 180.9},
- {.8803, 1.5286, 3.6770 , 9.9446, 6.019, 12.01, 24.00, 47.97, 95.93},
- {1.2717, 2.6403, 6.7691, 18.6304},
- {.8803, 1.5286, 3.6770, 9.9446 },
- {.8803, 1.5286, 3.6770, 9.9446 },
- {.6093, 0.8850, 1.9974, 5.3083 },
- }
-};*/
-
-/* <summary> */
-/* This table contains the norms of the 9-7 wavelets for different bands. */
-/* </summary> */
-/*static const double dwt_norms_real[5][8][10] = {
- {//ResZ==1
- {1.000, 1.9659, 4.1224, 8.4167, 16.9356, 33.9249, 67.8772, 135.7680, 271.5430, 543.0894},
- {1.0113, 1.9968, 4.1834, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196},
- {1.0113, 1.9968, 4.1834, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196},
- {0.5202, 0.9672, 2.0793, 4.3005, 8.6867, 17.4188, 34.8608, 69.7332, 139.4722}
- }, { //ResZ==2
- {1.000, 2.7564, 4.1224, 8.4167, 16.9356, 33.9249, 67.8772, 135.7680, 271.5430, 543.0894},
- {1.4179, 1.9968, 4.1834, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196},
- {1.4179, 1.9968, 4.1834, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196},
- {0.7294, 0.9672, 2.0793, 4.3005, 8.6867, 17.4188, 34.8608, 69.7332, 139.4722},
- {1.4179},
- {0.7294},
- {0.7294},
- {0.3752} //HHH
- },{ //ResZ==3
- {1.000, 2.7564, 8.3700, 8.4167, 16.9356, 33.9249, 67.8772, 135.7680, 271.5430, 543.0894},
- {1.4179, 4.0543, 4.1834, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196},
- {1.4179, 4.0543, 4.1834, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196},
- {0.7294, 1.9638, 2.0793, 4.3005, 8.6867, 17.4188, 34.8608, 69.7332, 139.4722},
- {1.4179, 4.0543},
- {0.7294, 1.9638},
- {0.7294, 1.9638},
- {0.3752, 0.9512} //HHH
- },{ //ResZ==4
- {1.000, 2.7564, 8.3700, 24.4183, 16.9356, 33.9249, 67.8772, 135.7680, 271.5430, 543.0894},
- {1.4179, 4.0543, 12.1366, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196},
- {1.4179, 4.0543, 12.1366, 8.5341, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196},
- {0.7294, 1.9638, 6.0323, 4.3005, 8.6867, 17.4188, 34.8608, 69.7332, 139.4722},
- {1.4179, 4.0543, 12.1366},
- {0.7294, 1.9638, 6.0323},
- {0.7294, 1.9638, 6.0323},
- {0.3752, 0.9512, 2.9982} //HHH
- },{ //ResZ==5
- {1.000, 2.7564, 8.3700, 24.4183, 69.6947, 33.9249, 67.8772, 135.7680, 271.5430, 543.0894},
- {1.4179, 4.0543, 12.1366, 35.1203, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196},
- {1.4179, 4.0543, 12.1366, 35.1203, 17.1667, 34.3852, 68.7967, 137.6065, 275.2196},
- {0.7294, 1.9638, 6.0323, 17.6977, 8.6867, 17.4188, 34.8608, 69.7332, 139.4722},
- {1.4179, 4.0543, 12.1366, 35.1203},
- {0.7294, 1.9638, 6.0323, 17.6977},
- {0.7294, 1.9638, 6.0323, 17.6977},
- {0.3752, 0.9512, 2.9982, 8.9182} //HHH
- }
-};*/
-
-static opj_atk_t atk_info_wt[] = {
- {0, 1, J3D_ATK_WS, J3D_ATK_IRR, 0, J3D_ATK_WS, 1.230174104, 4, {0}, {0}, {0}, {1, 1, 1, 1}, {-1.586134342059924, -0.052980118572961, 0.882911075530934, 0.443506852043971}}, /* WT 9-7 IRR*/
- {1, 0, J3D_ATK_WS, J3D_ATK_REV, 0, J3D_ATK_WS, 0, 2, {0}, {1, 2}, {1, 2}, {1, 1}, {-1, 1}}, /* WT 5-3 REV*/
- {2, 0, J3D_ATK_ARB, J3D_ATK_REV, 0, J3D_ATK_CON, 0, 2, {0, 0}, {0, 1}, {0, 1}, {1, 1}, {{-1}, {1}}}, /* WT 2-2 REV*/
- {3, 0, J3D_ATK_ARB, J3D_ATK_REV, 1, J3D_ATK_CON, 0, 3, {0, 0, -1}, {0, 1, 2}, {0, 1, 2}, {1, 1, 3}, {{-1}, {1}, {1, 0, -1}}}, /* WT 2-6 REV*/
- {4, 0, J3D_ATK_ARB, J3D_ATK_REV, 1, J3D_ATK_CON, 0, 3, {0, 0, -2}, {0, 1, 6}, {0, 1, 32}, {1, 1, 5}, {{-1}, {1}, {-3, 22, 0, -22, 3}}}, /* WT 2-10 REV*/
- {5, 1, J3D_ATK_ARB, J3D_ATK_IRR, 1, J3D_ATK_WS, 1, 7, {0}, {0}, {0}, {1, 1, 2, 1, 2, 1, 3}, {{-1}, {1.58613434206}, {-0.460348209828, 0.460348209828}, {0.25}, {0.374213867768, -0.374213867768}, {-1.33613434206}, {0.29306717103, 0, -0.29306717103}}}, /* WT 6-10 IRR*/
- {
- 6, 1, J3D_ATK_ARB, J3D_ATK_IRR, 0, J3D_ATK_WS, 1, 11, {0}, {0}, {0}, {1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 5}, {{-1}, {0, 99715069105}, {-1.00573127827, 1.00573127827}, {-0.27040357631}, {2.20509972343, -2.20509972343}, {0.08059995736},
- {-1.62682532350, 1.62682532350}, {0.52040357631}, {0.60404664250, -0.60404664250}, {-0.82775064841}, {-0.06615812964, 0.29402137720, 0, -0.29402137720, 0.06615812964}
- }
- }, /* WT 10-18 IRR*/
- {7, 1, J3D_ATK_WS, J3D_ATK_IRR, 0, J3D_ATK_WS, 1, 2, {0}, {0}, {0}, {1, 1}, {-0.5, 0.25}}, /* WT 5-3 IRR*/
- {8, 0, J3D_ATK_WS, J3D_ATK_REV, 0, J3D_ATK_WS, 0, 2, {0}, {4, 4}, {8, 8}, {2, 2}, {{-9, 1}, {5, -1}}} /* WT 13-7 REV*/
-};
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-/* <summary> */
-/* Forward lazy transform (horizontal). */
-/* </summary> */
-static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas)
-{
- int i;
- for (i = 0; i < sn; i++) {
- b[i] = a[2 * i + cas];
- }
- for (i = 0; i < dn; i++) {
- b[sn + i] = a[(2 * i + 1 - cas)];
- }
-}
-
-/* <summary> */
-/* Forward lazy transform (vertical). */
-/* </summary> */
-static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas)
-{
- int i;
- for (i = 0; i < sn; i++) {
- b[i * x] = a[2 * i + cas];
- }
- for (i = 0; i < dn; i++) {
- b[(sn + i)*x] = a[(2 * i + 1 - cas)];
- }
-}
-
-/* <summary> */
-/* Forward lazy transform (axial). */
-/* </summary> */
-static void dwt_deinterleave_z(int *a, int *b, int dn, int sn, int xy, int cas)
-{
- int i;
- for (i = 0; i < sn; i++) {
- b[i * xy] = a[2 * i + cas];
- }
- for (i = 0; i < dn; i++) {
- b[(sn + i)*xy] = a[(2 * i + 1 - cas)];
- }
-}
-
-/* <summary> */
-/* Inverse lazy transform (horizontal). */
-/* </summary> */
-static void dwt_interleave_h(int *a, int *b, int dn, int sn, int cas)
-{
- int i;
- int *ai = NULL;
- int *bi = NULL;
- ai = a;
- bi = b + cas;
- for (i = 0; i < sn; i++) {
- *bi = *ai;
- bi += 2;
- ai++;
- }
- ai = a + sn;
- bi = b + 1 - cas;
- for (i = 0; i < dn; i++) {
- *bi = *ai;
- bi += 2;
- ai++;
- }
-}
-
-/* <summary> */
-/* Inverse lazy transform (vertical). */
-/* </summary> */
-static void dwt_interleave_v(int *a, int *b, int dn, int sn, int x, int cas)
-{
- int i;
- int *ai = NULL;
- int *bi = NULL;
- ai = a;
- bi = b + cas;
- for (i = 0; i < sn; i++) {
- *bi = *ai;
- bi += 2;
- ai += x;
- }
- ai = a + (sn * x);
- bi = b + 1 - cas;
- for (i = 0; i < dn; i++) {
- *bi = *ai;
- bi += 2;
- ai += x;
- }
-}
-
-/* <summary> */
-/* Inverse lazy transform (axial). */
-/* </summary> */
-static void dwt_interleave_z(int *a, int *b, int dn, int sn, int xy, int cas)
-{
- int i;
- int *ai = NULL;
- int *bi = NULL;
- ai = a;
- bi = b + cas;
- for (i = 0; i < sn; i++) {
- *bi = *ai;
- bi += 2;
- ai += xy;
- }
- ai = a + (sn * xy);
- bi = b + 1 - cas;
- for (i = 0; i < dn; i++) {
- *bi = *ai;
- bi += 2;
- ai += xy;
- }
-}
-
-
-/* <summary> */
-/* Forward 5-3 or 9-7 wavelet transform in 1-D. */
-/* </summary> */
-static void dwt_encode_53(int *a, int dn, int sn, int cas)
-{
- int i;
-
- if (!cas) {
- if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
- /*for (i = 0; i < dn; i++) D(i) -= (S_(i) + S_(i + 1)) >> 1;*/
- /*for (i = 0; i < sn; i++) S(i) += (D_(i - 1) + D_(i) + 2) >> 2;*/
- for (i = 0; i < dn; i++) {
- D(i) -= (S_(i) + S_(i + 1)) >> 1;
- /*ops += 2;*/
- }
- for (i = 0; i < sn; i++) {
- S(i) += (D_(i - 1) + D_(i) + 2) >> 2;
- /*ops += 3;*/
- }
- }
- } else {
- /*if (!sn && dn == 1)
- S(0) *= 2;
- else {
- for (i = 0; i < dn; i++) S(i) -= (DD_(i) + DD_(i - 1)) >> 1;
- for (i = 0; i < sn; i++) D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2;
- }*/
- if (!sn && dn == 1) {
- S(0) *= 2;
- /*ops++;*/
- } else {
- for (i = 0; i < dn; i++) {
- S(i) -= (DD_(i) + DD_(i - 1)) >> 1;
- /* ops += 2;*/
- }
- for (i = 0; i < sn; i++) {
- D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2;
- /* ops += 3;*/
- }
- }
- }
-}
-static void dwt_encode_97(int *a, int dn, int sn, int cas)
-{
- int i;
-
- if (!cas) {
- if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
- for (i = 0; i < dn; i++) {
- D(i) -= fix_mul(S_(i) + S_(i + 1), 12993);
- }
- for (i = 0; i < sn; i++) {
- S(i) -= fix_mul(D_(i - 1) + D_(i), 434);
- }
- for (i = 0; i < dn; i++) {
- D(i) += fix_mul(S_(i) + S_(i + 1), 7233);
- }
- for (i = 0; i < sn; i++) {
- S(i) += fix_mul(D_(i - 1) + D_(i), 3633);
- }
- for (i = 0; i < dn; i++) {
- D(i) = fix_mul(D(i), 5038); /*5038 */
- }
- for (i = 0; i < sn; i++) {
- S(i) = fix_mul(S(i), 6659); /*6660 */
- }
- }
- } else {
- if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
- for (i = 0; i < dn; i++) {
- S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993);
- }
- for (i = 0; i < sn; i++) {
- D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434);
- }
- for (i = 0; i < dn; i++) {
- S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233);
- }
- for (i = 0; i < sn; i++) {
- D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633);
- }
- for (i = 0; i < dn; i++) {
- S(i) = fix_mul(S(i), 5038); /*5038 */
- }
- for (i = 0; i < sn; i++) {
- D(i) = fix_mul(D(i), 6659); /*6660 */
- }
- }
- }
-}
-/* <summary> */
-/* Inverse 5-3 or 9-7 wavelet transform in 1-D. */
-/* </summary> */
-static void dwt_decode_53(int *a, int dn, int sn, int cas)
-{
- int i;
- if (!cas) {
- if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
- for (i = 0; i < sn; i++) {
- S(i) -= (D_(i - 1) + D_(i) + 2) >> 2;
- }
- for (i = 0; i < dn; i++) {
- D(i) += (S_(i) + S_(i + 1)) >> 1;
- }
- }
- } else {
- if (!sn && dn == 1) { /* NEW : CASE ONE ELEMENT */
- S(0) /= 2;
- } else {
- for (i = 0; i < sn; i++) {
- D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2;
- }
- for (i = 0; i < dn; i++) {
- S(i) += (DD_(i) + DD_(i - 1)) >> 1;
- }
- }
- }
-}
-static void dwt_decode_97(int *a, int dn, int sn, int cas)
-{
- int i;
-
- if (!cas) {
- if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
- for (i = 0; i < sn; i++) {
- S(i) = fix_mul(S(i), 10078); /* 10076 */
- }
- for (i = 0; i < dn; i++) {
- D(i) = fix_mul(D(i), 13318); /* 13320 */
- }
- for (i = 0; i < sn; i++) {
- S(i) -= fix_mul(D_(i - 1) + D_(i), 3633);
- }
- for (i = 0; i < dn; i++) {
- D(i) -= fix_mul(S_(i) + S_(i + 1), 7233);
- }
- for (i = 0; i < sn; i++) {
- S(i) += fix_mul(D_(i - 1) + D_(i), 434);
- }
- for (i = 0; i < dn; i++) {
- D(i) += fix_mul(S_(i) + S_(i + 1), 12994); /* 12993 */
- }
- }
- } else {
- if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
- for (i = 0; i < sn; i++) {
- D(i) = fix_mul(D(i), 10078); /* 10076 */
- }
- for (i = 0; i < dn; i++) {
- S(i) = fix_mul(S(i), 13318); /* 13320 */
- }
- for (i = 0; i < sn; i++) {
- D(i) -= fix_mul(SS_(i) + SS_(i + 1), 3633);
- }
- for (i = 0; i < dn; i++) {
- S(i) -= fix_mul(DD_(i) + DD_(i - 1), 7233);
- }
- for (i = 0; i < sn; i++) {
- D(i) += fix_mul(SS_(i) + SS_(i + 1), 434);
- }
- for (i = 0; i < dn; i++) {
- S(i) += fix_mul(DD_(i) + DD_(i - 1), 12994); /* 12993 */
- }
- }
- }
-}
-
-
-/* <summary> */
-/* Get norm of arbitrary wavelet transform. */
-/* </summary> */
-static int upandconv(double *nXPS, double *LPS, int lenXPS, int lenLPS)
-{
- /* Perform the convolution of the vectors. */
- int i, j;
- double *tmp = (double *)opj_malloc(2 * lenXPS * sizeof(double));
- /*Upsample*/
- memset(tmp, 0, 2 * lenXPS * sizeof(double));
- for (i = 0; i < lenXPS; i++) {
- *(tmp + 2 * i) = *(nXPS + i);
- *(nXPS + i) = 0;
- }
- /*Convolution*/
- for (i = 0; i < 2 * lenXPS; i++) {
- for (j = 0; j < lenLPS; j++) {
- *(nXPS + i + j) = *(nXPS + i + j) + *(tmp + i) * *(LPS + j);
- /*fprintf(stdout,"*(tmp + %d) * *(LPS + %d) = %f * %f \n",i,j,*(tmp + i),*(LPS + j));*/
- }
- }
- free(tmp);
- return 2 * lenXPS + lenLPS - 1;
-}
-
-static double dwt_calc_wtnorms(int orient, int level[3], int dwtid[3],
- opj_wtfilt_t *wtfiltX, opj_wtfilt_t *wtfiltY, opj_wtfilt_t *wtfiltZ)
-{
- int i, lenLPS, lenHPS;
- double Lx = 0, Ly = 0, Hx = 0, Hy = 0, Lz = 0, Hz = 0;
- double *nLPSx, *nHPSx, *nLPSy, *nHPSy, *nLPSz, *nHPSz;
- int levelx, levely, levelz;
-
- levelx = (orient == 0) ? level[0] - 1 : level[0];
- levely = (orient == 0) ? level[1] - 1 : level[1];
- levelz = (orient == 0) ? level[2] - 1 : level[2];
-
- /*X axis*/
- lenLPS = wtfiltX->lenLPS;
- lenHPS = wtfiltX->lenHPS;
- for (i = 0; i < levelx; i++) {
- lenLPS *= 2;
- lenHPS *= 2;
- lenLPS += wtfiltX->lenLPS - 1;
- lenHPS += wtfiltX->lenLPS - 1;
- }
- nLPSx = (double *)opj_malloc(lenLPS * sizeof(double));
- nHPSx = (double *)opj_malloc(lenHPS * sizeof(double));
-
- memcpy(nLPSx, wtfiltX->LPS, wtfiltX->lenLPS * sizeof(double));
- memcpy(nHPSx, wtfiltX->HPS, wtfiltX->lenHPS * sizeof(double));
- lenLPS = wtfiltX->lenLPS;
- lenHPS = wtfiltX->lenHPS;
- for (i = 0; i < levelx; i++) {
- lenLPS = upandconv(nLPSx, wtfiltX->LPS, lenLPS, wtfiltX->lenLPS);
- lenHPS = upandconv(nHPSx, wtfiltX->LPS, lenHPS, wtfiltX->lenLPS);
- }
- for (i = 0; i < lenLPS; i++) {
- Lx += nLPSx[i] * nLPSx[i];
- }
- for (i = 0; i < lenHPS; i++) {
- Hx += nHPSx[i] * nHPSx[i];
- }
- Lx = sqrt(Lx);
- Hx = sqrt(Hx);
- free(nLPSx);
- free(nHPSx);
-
- /*Y axis*/
- if (dwtid[0] != dwtid[1] || level[0] != level[1]) {
- lenLPS = wtfiltY->lenLPS;
- lenHPS = wtfiltY->lenHPS;
- for (i = 0; i < levely; i++) {
- lenLPS *= 2;
- lenHPS *= 2;
- lenLPS += wtfiltY->lenLPS - 1;
- lenHPS += wtfiltY->lenLPS - 1;
- }
- nLPSy = (double *)opj_malloc(lenLPS * sizeof(double));
- nHPSy = (double *)opj_malloc(lenHPS * sizeof(double));
-
- memcpy(nLPSy, wtfiltY->LPS, wtfiltY->lenLPS * sizeof(double));
- memcpy(nHPSy, wtfiltY->HPS, wtfiltY->lenHPS * sizeof(double));
- lenLPS = wtfiltY->lenLPS;
- lenHPS = wtfiltY->lenHPS;
- for (i = 0; i < levely; i++) {
- lenLPS = upandconv(nLPSy, wtfiltY->LPS, lenLPS, wtfiltY->lenLPS);
- lenHPS = upandconv(nHPSy, wtfiltY->LPS, lenHPS, wtfiltY->lenLPS);
- }
- for (i = 0; i < lenLPS; i++) {
- Ly += nLPSy[i] * nLPSy[i];
- }
- for (i = 0; i < lenHPS; i++) {
- Hy += nHPSy[i] * nHPSy[i];
- }
- Ly = sqrt(Ly);
- Hy = sqrt(Hy);
- free(nLPSy);
- free(nHPSy);
- } else {
- Ly = Lx;
- Hy = Hx;
- }
- /*Z axis*/
- if (levelz >= 0) {
- lenLPS = wtfiltZ->lenLPS;
- lenHPS = wtfiltZ->lenHPS;
- for (i = 0; i < levelz; i++) {
- lenLPS *= 2;
- lenHPS *= 2;
- lenLPS += wtfiltZ->lenLPS - 1;
- lenHPS += wtfiltZ->lenLPS - 1;
- }
- nLPSz = (double *)opj_malloc(lenLPS * sizeof(double));
- nHPSz = (double *)opj_malloc(lenHPS * sizeof(double));
-
- memcpy(nLPSz, wtfiltZ->LPS, wtfiltZ->lenLPS * sizeof(double));
- memcpy(nHPSz, wtfiltZ->HPS, wtfiltZ->lenHPS * sizeof(double));
- lenLPS = wtfiltZ->lenLPS;
- lenHPS = wtfiltZ->lenHPS;
- for (i = 0; i < levelz; i++) {
- lenLPS = upandconv(nLPSz, wtfiltZ->LPS, lenLPS, wtfiltZ->lenLPS);
- lenHPS = upandconv(nHPSz, wtfiltZ->LPS, lenHPS, wtfiltZ->lenLPS);
- }
- for (i = 0; i < lenLPS; i++) {
- Lz += nLPSz[i] * nLPSz[i];
- }
- for (i = 0; i < lenHPS; i++) {
- Hz += nHPSz[i] * nHPSz[i];
- }
- Lz = sqrt(Lz);
- Hz = sqrt(Hz);
- free(nLPSz);
- free(nHPSz);
- } else {
- Lz = 1.0;
- Hz = 1.0;
- }
- switch (orient) {
- case 0:
- return Lx * Ly * Lz;
- case 1:
- return Lx * Hy * Lz;
- case 2:
- return Hx * Ly * Lz;
- case 3:
- return Hx * Hy * Lz;
- case 4:
- return Lx * Ly * Hz;
- case 5:
- return Lx * Hy * Hz;
- case 6:
- return Hx * Ly * Hz;
- case 7:
- return Hx * Hy * Hz;
- default:
- return -1;
- }
-
-}
-static void dwt_getwtfilters(opj_wtfilt_t *wtfilt, int dwtid)
-{
- if (dwtid == 0) { /*DWT 9-7 */
- wtfilt->lenLPS = 7;
- wtfilt->lenHPS = 9;
- wtfilt->LPS = (double *)opj_malloc(wtfilt->lenLPS * sizeof(double));
- wtfilt->HPS = (double *)opj_malloc(wtfilt->lenHPS * sizeof(double));
- wtfilt->LPS[0] = -0.091271763114;
- wtfilt->HPS[0] = 0.026748757411;
- wtfilt->LPS[1] = -0.057543526228;
- wtfilt->HPS[1] = 0.016864118443;
- wtfilt->LPS[2] = 0.591271763114;
- wtfilt->HPS[2] = -0.078223266529;
- wtfilt->LPS[3] = 1.115087052457;
- wtfilt->HPS[3] = -0.266864118443;
- wtfilt->LPS[4] = 0.591271763114;
- wtfilt->HPS[4] = 0.602949018236;
- wtfilt->LPS[5] = -0.057543526228;
- wtfilt->HPS[5] = -0.266864118443;
- wtfilt->LPS[6] = -0.091271763114;
- wtfilt->HPS[6] = -0.078223266529;
- wtfilt->HPS[7] = 0.016864118443;
- wtfilt->HPS[8] = 0.026748757411;
- } else if (dwtid == 1) { /*DWT 5-3 */
- wtfilt->lenLPS = 3;
- wtfilt->lenHPS = 5;
- wtfilt->LPS = (double *)opj_malloc(wtfilt->lenLPS * sizeof(double));
- wtfilt->HPS = (double *)opj_malloc(wtfilt->lenHPS * sizeof(double));
- wtfilt->LPS[0] = 0.5;
- wtfilt->HPS[0] = -0.125;
- wtfilt->LPS[1] = 1;
- wtfilt->HPS[1] = -0.25;
- wtfilt->LPS[2] = 0.5;
- wtfilt->HPS[2] = 0.75;
- wtfilt->HPS[3] = -0.25;
- wtfilt->HPS[4] = -0.125;
- } else {
- fprintf(stdout,
- "[ERROR] Sorry, this wavelet hasn't been implemented so far ... Try another one :-)\n");
- exit(1);
- }
-}
-/* <summary> */
-/* Encoding of quantization stepsize for each subband. */
-/* </summary> */
-static void dwt_encode_stepsize(int stepsize, int numbps,
- opj_stepsize_t *bandno_stepsize)
-{
- int p, n;
- p = int_floorlog2(stepsize) - 13;
- n = 11 - int_floorlog2(stepsize);
- bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;
- bandno_stepsize->expn = numbps - p;
- /*if J3D_CCP_QNTSTY_NOQNT --> stepsize = 8192.0 --> p = 0, n = -2 --> mant = 0; expn = (prec+gain)*/
- /*else --> bandno_stepsize = (1<<(numbps - expn)) + (1<<(numbps - expn - 11)) * Ub*/
-}
-
-/*
-==========================================================
- DWT interface
-==========================================================
-*/
-/* <summary> */
-/* Forward 5-3 wavelet transform in 3-D. */
-/* </summary> */
-void dwt_encode(opj_tcd_tilecomp_t * tilec, int dwtid[3])
-{
- int i, j, k;
- int x, y, z;
- int w, h, wh, d;
- int level, levelx, levely, levelz, diff;
- int *a = NULL;
- int *aj = NULL;
- int *bj = NULL;
- int *cj = NULL;
-
- /*ops = 0;*/
-
- memset(flagnorm, 0, 8000 * sizeof(int));
- w = tilec->x1 - tilec->x0;
- h = tilec->y1 - tilec->y0;
- d = tilec->z1 - tilec->z0;
- wh = w * h;
- levelx = tilec->numresolution[0] - 1;
- levely = tilec->numresolution[1] - 1;
- levelz = tilec->numresolution[2] - 1;
- level = int_max(levelx, int_max(levely, levelz));
- diff = tilec->numresolution[0] - tilec->numresolution[2];
-
- a = tilec->data;
-
- for (x = 0, y = 0, z = 0; (x < levelx) && (y < levely); x++, y++, z++) {
- int rw; /* width of the resolution level computed */
- int rh; /* heigth of the resolution level computed */
- int rd; /* depth of the resolution level computed */
- int rw1; /* width of the resolution level once lower than computed one */
- int rh1; /* height of the resolution level once lower than computed one */
- int rd1; /* depth of the resolution level once lower than computed one */
- int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
- int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
- int cas_axl; /* 0 = non inversion on axial filtering 1 = inversion between low-pass and high-pass filtering */
- int dn, sn;
-
- rw = tilec->resolutions[level - x].x1 - tilec->resolutions[level - x].x0;
- rh = tilec->resolutions[level - y].y1 - tilec->resolutions[level - y].y0;
- rd = tilec->resolutions[level - z].z1 - tilec->resolutions[level - z].z0;
- rw1 = tilec->resolutions[level - x - 1].x1 - tilec->resolutions[level - x -
- 1].x0;
- rh1 = tilec->resolutions[level - y - 1].y1 - tilec->resolutions[level - y -
- 1].y0;
- rd1 = tilec->resolutions[level - z - 1].z1 - tilec->resolutions[level - z -
- 1].z0;
-
- cas_col = tilec->resolutions[level - x].x0 %
- 2; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
- cas_row = tilec->resolutions[level - y].y0 %
- 2; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
- cas_axl = tilec->resolutions[level - z].z0 % 2;
-
- /*fprintf(stdout," x %d y %d z %d \n",x,y,z);
- fprintf(stdout," levelx %d levely %d levelz %d \n",levelx,levely,levelz);
- fprintf(stdout," z1 %d z0 %d\n",tilec->resolutions[level - z].z1,tilec->resolutions[level - z].z0);
- fprintf(stdout," rw %d rh %d rd %d \n rw1 %d rh1 %d rd1 %d \n",rw,rh,rd,rw1,rh1,rd1);*/
-
- for (i = 0; i < rd; i++) {
-
- cj = a + (i * wh);
-
- /*Horizontal*/
- sn = rw1;
- dn = rw - rw1;
- bj = (int*)opj_malloc(rw * sizeof(int));
- if (dwtid[0] == 0) {
- for (j = 0; j < rh; j++) {
- aj = cj + j * w;
- for (k = 0; k < rw; k++) {
- bj[k] = aj[k];
- }
- dwt_encode_97(bj, dn, sn, cas_row);
- dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
- }
- } else if (dwtid[0] == 1) {
- for (j = 0; j < rh; j++) {
- aj = cj + j * w;
- for (k = 0; k < rw; k++) {
- bj[k] = aj[k];
- }
- dwt_encode_53(bj, dn, sn, cas_row);
- dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
- }
- }
- opj_free(bj);
-
- /*Vertical*/
- sn = rh1;
- dn = rh - rh1;
- bj = (int*)opj_malloc(rh * sizeof(int));
- if (dwtid[1] == 0) { /*DWT 9-7*/
- for (j = 0; j < rw; j++) {
- aj = cj + j;
- for (k = 0; k < rh; k++) {
- bj[k] = aj[k * w];
- }
- dwt_encode_97(bj, dn, sn, cas_col);
- dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
- }
- } else if (dwtid[1] == 1) { /*DWT 5-3*/
- for (j = 0; j < rw; j++) {
- aj = cj + j;
- for (k = 0; k < rh; k++) {
- bj[k] = aj[k * w];
- }
- dwt_encode_53(bj, dn, sn, cas_col);
- dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
- }
- }
- opj_free(bj);
- }
-
- if (z < levelz) {
- /*Axial fprintf(stdout,"Axial DWT Transform %d %d %d\n",z,rd,rd1);*/
- sn = rd1;
- dn = rd - rd1;
- bj = (int*)opj_malloc(rd * sizeof(int));
- if (dwtid[2] == 0) {
- for (j = 0; j < (rw * rh); j++) {
- aj = a + j;
- for (k = 0; k < rd; k++) {
- bj[k] = aj[k * wh];
- }
- dwt_encode_97(bj, dn, sn, cas_axl);
- dwt_deinterleave_z(bj, aj, dn, sn, wh, cas_axl);
- }
- } else if (dwtid[2] == 1) {
- for (j = 0; j < (rw * rh); j++) {
- aj = a + j;
- for (k = 0; k < rd; k++) {
- bj[k] = aj[k * wh];
- }
- dwt_encode_53(bj, dn, sn, cas_axl);
- dwt_deinterleave_z(bj, aj, dn, sn, wh, cas_axl);
- }
- }
- opj_free(bj);
- }
- }
-
- /*fprintf(stdout,"[INFO] Ops: %d \n",ops);*/
-}
-
-
-/* <summary> */
-/* Inverse 5-3 wavelet transform in 3-D. */
-/* </summary> */
-void dwt_decode(opj_tcd_tilecomp_t * tilec, int stops[3], int dwtid[3])
-{
- int i, j, k;
- int x, y, z;
- int w, h, wh, d;
- int level, levelx, levely, levelz, diff;
- int *a = NULL;
- int *aj = NULL;
- int *bj = NULL;
- int *cj = NULL;
-
- a = tilec->data;
-
- w = tilec->x1 - tilec->x0;
- h = tilec->y1 - tilec->y0;
- d = tilec->z1 - tilec->z0;
- wh = w * h;
- levelx = tilec->numresolution[0] - 1;
- levely = tilec->numresolution[1] - 1;
- levelz = tilec->numresolution[2] - 1;
- level = int_max(levelx, int_max(levely, levelz));
- diff = tilec->numresolution[0] - tilec->numresolution[2];
-
- /* General lifting framework -- DCCS-LIWT */
- for (x = level - 1, y = level - 1, z = level - 1; (x >= stops[0]) &&
- (y >= stops[1]); x--, y--, z--) {
- int rw; /* width of the resolution level computed */
- int rh; /* heigth of the resolution level computed */
- int rd; /* depth of the resolution level computed */
- int rw1; /* width of the resolution level once lower than computed one */
- int rh1; /* height of the resolution level once lower than computed one */
- int rd1; /* depth of the resolution level once lower than computed one */
- int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
- int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
- int cas_axl; /* 0 = non inversion on axial filtering 1 = inversion between low-pass and high-pass filtering */
- int dn, sn;
-
- rw = tilec->resolutions[level - x].x1 - tilec->resolutions[level - x].x0;
- rh = tilec->resolutions[level - y].y1 - tilec->resolutions[level - y].y0;
- rd = tilec->resolutions[level - z].z1 - tilec->resolutions[level - z].z0;
- rw1 = tilec->resolutions[level - x - 1].x1 - tilec->resolutions[level - x -
- 1].x0;
- rh1 = tilec->resolutions[level - y - 1].y1 - tilec->resolutions[level - y -
- 1].y0;
- rd1 = tilec->resolutions[level - z - 1].z1 - tilec->resolutions[level - z -
- 1].z0;
-
- cas_col = tilec->resolutions[level - x].x0 %
- 2; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
- cas_row = tilec->resolutions[level - y].y0 %
- 2; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
- cas_axl = tilec->resolutions[level - z].z0 % 2;
-
- /*fprintf(stdout," x %d y %d z %d \n",x,y,z);
- fprintf(stdout," levelx %d levely %d levelz %d \n",levelx,levely,levelz);
- fprintf(stdout," dwtid[0] %d [1] %d [2] %d \n",dwtid[0],dwtid[1],dwtid[2]);
- fprintf(stdout," rw %d rh %d rd %d \n rw1 %d rh1 %d rd1 %d \n",rw,rh,rd,rw1,rh1,rd1);
- fprintf(stdout,"IDWT Transform %d %d %d %d\n",level, z, rd,rd1);*/
-
- if (z >= stops[2] && rd != rd1) {
- /*fprintf(stdout,"Axial Transform %d %d %d %d\n",levelz, z, rd,rd1);*/
- sn = rd1;
- dn = rd - rd1;
- bj = (int*)opj_malloc(rd * sizeof(int));
- if (dwtid[2] == 0) {
- for (j = 0; j < (rw * rh); j++) {
- aj = a + j;
- dwt_interleave_z(aj, bj, dn, sn, wh, cas_axl);
- dwt_decode_97(bj, dn, sn, cas_axl);
- for (k = 0; k < rd; k++) {
- aj[k * wh] = bj[k];
- }
- }
- } else if (dwtid[2] == 1) {
- for (j = 0; j < (rw * rh); j++) {
- aj = a + j;
- dwt_interleave_z(aj, bj, dn, sn, wh, cas_axl);
- dwt_decode_53(bj, dn, sn, cas_axl);
- for (k = 0; k < rd; k++) {
- aj[k * wh] = bj[k];
- }
- }
- }
- opj_free(bj);
- }
-
- for (i = 0; i < rd; i++) {
- /*Fetch corresponding slice for doing DWT-2D*/
- cj = tilec->data + (i * wh);
-
- /*Vertical*/
- sn = rh1;
- dn = rh - rh1;
- bj = (int*)opj_malloc(rh * sizeof(int));
- if (dwtid[1] == 0) {
- for (j = 0; j < rw; j++) {
- aj = cj + j;
- dwt_interleave_v(aj, bj, dn, sn, w, cas_col);
- dwt_decode_97(bj, dn, sn, cas_col);
- for (k = 0; k < rh; k++) {
- aj[k * w] = bj[k];
- }
- }
- } else if (dwtid[1] == 1) {
- for (j = 0; j < rw; j++) {
- aj = cj + j;
- dwt_interleave_v(aj, bj, dn, sn, w, cas_col);
- dwt_decode_53(bj, dn, sn, cas_col);
- for (k = 0; k < rh; k++) {
- aj[k * w] = bj[k];
- }
- }
- }
- opj_free(bj);
-
- /*Horizontal*/
- sn = rw1;
- dn = rw - rw1;
- bj = (int*)opj_malloc(rw * sizeof(int));
- if (dwtid[0] == 0) {
- for (j = 0; j < rh; j++) {
- aj = cj + j * w;
- dwt_interleave_h(aj, bj, dn, sn, cas_row);
- dwt_decode_97(bj, dn, sn, cas_row);
- for (k = 0; k < rw; k++) {
- aj[k] = bj[k];
- }
- }
- } else if (dwtid[0] == 1) {
- for (j = 0; j < rh; j++) {
- aj = cj + j * w;
- dwt_interleave_h(aj, bj, dn, sn, cas_row);
- dwt_decode_53(bj, dn, sn, cas_row);
- for (k = 0; k < rw; k++) {
- aj[k] = bj[k];
- }
- }
- }
- opj_free(bj);
-
- }
-
- }
-
-}
-
-
-/* <summary> */
-/* Get gain of wavelet transform. */
-/* </summary> */
-int dwt_getgain(int orient, int reversible)
-{
- if (reversible == 1) {
- if (orient == 0) {
- return 0;
- } else if (orient == 1 || orient == 2 || orient == 4) {
- return 1;
- } else if (orient == 3 || orient == 5 || orient == 6) {
- return 2;
- } else {
- return 3;
- }
- }
- /*else if (reversible == 0){*/
- return 0;
-}
-
-/* <summary> */
-/* Get norm of wavelet transform. */
-/* </summary> */
-double dwt_getnorm(int orient, int level[3], int dwtid[3])
-{
- int levelx = level[0];
- int levely = level[1];
- int levelz = (level[2] < 0) ? 0 : level[2];
- double norm;
-
- if (flagnorm[levelx][levely][levelz][orient] == 1) {
- norm = dwt_norm[levelx][levely][levelz][orient];
- /*fprintf(stdout,"[INFO] Level: %d %d %d Orient %d Dwt_norm: %f \n",level[0],level[1],level[2],orient,norm);*/
- } else {
- opj_wtfilt_t *wtfiltx = (opj_wtfilt_t *) opj_malloc(sizeof(opj_wtfilt_t));
- opj_wtfilt_t *wtfilty = (opj_wtfilt_t *) opj_malloc(sizeof(opj_wtfilt_t));
- opj_wtfilt_t *wtfiltz = (opj_wtfilt_t *) opj_malloc(sizeof(opj_wtfilt_t));
- /*Fetch equivalent filters for each dimension*/
- dwt_getwtfilters(wtfiltx, dwtid[0]);
- dwt_getwtfilters(wtfilty, dwtid[1]);
- dwt_getwtfilters(wtfiltz, dwtid[2]);
- /*Calculate the corresponding norm */
- norm = dwt_calc_wtnorms(orient, level, dwtid, wtfiltx, wtfilty, wtfiltz);
- /*Save norm in array (no recalculation)*/
- dwt_norm[levelx][levely][levelz][orient] = norm;
- flagnorm[levelx][levely][levelz][orient] = 1;
- /*Free reserved space*/
- opj_free(wtfiltx->LPS);
- opj_free(wtfilty->LPS);
- opj_free(wtfiltz->LPS);
- opj_free(wtfiltx->HPS);
- opj_free(wtfilty->HPS);
- opj_free(wtfiltz->HPS);
- opj_free(wtfiltx);
- opj_free(wtfilty);
- opj_free(wtfiltz);
- /*fprintf(stdout,"[INFO] Dwtid: %d %d %d Level: %d %d %d Orient %d Norm: %f \n",dwtid[0],dwtid[1],dwtid[2],level[0],level[1],level[2],orient,norm);*/
- }
- return norm;
-}
-/* <summary> */
-/* Calculate explicit stepsizes for DWT. */
-/* </summary> */
-void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec)
-{
- int totnumbands, bandno, diff;
-
- assert(tccp->numresolution[0] >= tccp->numresolution[2]);
- diff = tccp->numresolution[0] -
- tccp->numresolution[2]; /*if RESx=RESy != RESz */
- totnumbands = (7 * tccp->numresolution[0] - 6) - 4 * diff; /* 3-D */
-
- for (bandno = 0; bandno < totnumbands; bandno++) {
- double stepsize;
- int resno, level[3], orient, gain;
-
- /* Bandno: 0 - LLL 1 - LHL
- 2 - HLL 3 - HHL
- 4 - LLH 5 - LHH
- 6 - HLH 7 - HHH */
-
- resno = (bandno == 0) ? 0 : ((bandno <= 3 * diff) ? ((bandno - 1) / 3 + 1) : ((
- bandno + 4 * diff - 1) / 7 + 1));
- orient = (bandno == 0) ? 0 : ((bandno <= 3 * diff) ? ((bandno - 1) % 3 + 1) : ((
- bandno + 4 * diff - 1) % 7 + 1));
- level[0] = tccp->numresolution[0] - 1 - resno;
- level[1] = tccp->numresolution[1] - 1 - resno;
- level[2] = tccp->numresolution[2] - 1 - resno;
-
- /* Gain: 0 - LLL 1 - LHL
- 1 - HLL 2 - HHL
- 1 - LLH 2 - LHH
- 2 - HLH 3 - HHH */
- gain = (tccp->reversible == 0) ? 0 : ((orient == 0) ? 0 :
- (((orient == 1) || (orient == 2) || (orient == 4)) ? 1 :
- (((orient == 3) || (orient == 5) || (orient == 6)) ? 2 : 3)));
-
- if (tccp->qntsty == J3D_CCP_QNTSTY_NOQNT) {
- stepsize = 1.0;
- } else {
- double norm = dwt_getnorm(orient, level,
- tccp->dwtid); /*Fetch norms if irreversible transform (by the moment only I9.7)*/
- stepsize = (1 << (gain + 1)) / norm;
- }
- /*fprintf(stdout,"[INFO] Bandno: %d Orient: %d Level: %d %d %d Stepsize: %f\n",bandno,orient,level[0],level[1],level[2],stepsize);*/
- dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain,
- &tccp->stepsizes[bandno]);
- }
-}
-
-
-
+++ /dev/null
-/*
- * 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
- * Copyrigth (c) 2006, Mónica DÃez, LPI-UVA, 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 __DWT_H
-#define __DWT_H
-/**
-@file dwt.h
-@brief Implementation of a discrete wavelet transform (DWT)
-
-The functions in DWT.C have for goal to realize forward and inverse discret wavelet
-transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in
-DWT.C are used by some function in TCD.C.
-*/
-
-/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
-/*@{*/
-
-/**
-DCCS-LIWT properties
-*/
-
-
-typedef struct opj_wtfilt {
- double *LPS;
- int lenLPS;
- double *HPS;
- int lenHPS;
-} opj_wtfilt_t;
-/** @name Funciones generales */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Forward 5-3 wavelet transform in 3-D.
-Apply a reversible DWT transform to a component of an volume.
-@param tilec Tile component information (current tile)
-@param dwtid Number of identification of wavelet kernel(s) used in DWT in each direction
-*/
-void dwt_encode(opj_tcd_tilecomp_t * tilec, int dwtid[3]);
-/**
-Inverse 5-3 wavelet transform in 3-D.
-Apply a reversible inverse DWT transform to a component of an volume.
-@param tilec Tile component information (current tile)
-@param stops Number of decoded resolution levels in each dimension
-@param dwtid Number of identification of wavelet kernel(s) used in DWT in each dimension
-*/
-void dwt_decode(opj_tcd_tilecomp_t * tilec, int stops[3], int dwtid[3]);
-/* ----------------------------------------------------------------------- */
-/**
-Get the gain of a subband for the reversible 3-D DWT.
-@param orient Number that identifies the subband (0->LLL, 1->HLL, 2->LHL, 3->HHL, 4->LLH, 5->HLH, 6->LHH, 7->HHH)
-@param reversible Wavelet transformation type
-@return Returns 0 if orient = 0, returns 1 if orient = 1,2 or 4, returns 2 if orient = 3,5 or 6, returns 3 otherwise
-*/
-int dwt_getgain(int orient, int reversible);
-/**
-Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT or irreversible 9-7 in 3-D.
-@param orient Band of the wavelet function
-@param level Levels of the wavelet function in X,Y,Z axis
-@param dwtid Wavelet transformation identifier
-@return Returns the norm of the wavelet function
-*/
-double dwt_getnorm(int orient, int level[3], int dwtid[3]);
-/* ----------------------------------------------------------------------- */
-/**
-Calcula el valor del escalón de cuantificación correspondiente a cada subbanda.
-@param tccp Tile component coding parameters
-@param prec Precision of data
-*/
-void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec);
-/*@}*/
-/*@}*/
-
-#endif /* __DWT_H */
+++ /dev/null
-/*
- * 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) 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.
- */
-
-#include "opj_includes.h"
-
-/* ==========================================================
-// Utility functions
-// ==========================================================*/
-
-#ifndef _WIN32
-static char*
-i2a(unsigned i, char *a, unsigned r)
-{
- if (i / r > 0) {
- a = i2a(i / r, a, r);
- }
- *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i % r];
- return a + 1;
-}
-
-/**
- Transforms integer i into an ascii string and stores the result in a;
- string is encoded in the base indicated by r.
- @param i Number to be converted
- @param a String result
- @param r Base of value; must be in the range 2 - 36
- @return Returns a
-*/
-static char *
-_itoa(int i, char *a, int r)
-{
- r = ((r < 2) || (r > 36)) ? 10 : r;
- if (i < 0) {
- *a = '-';
- *i2a(-i, a + 1, r) = 0;
- } else {
- *i2a(i, a, r) = 0;
- }
- return a;
-}
-
-#endif /* !_WIN32 */
-
-/* ----------------------------------------------------------------------- */
-
-opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo,
- opj_event_mgr_t *event_mgr, void *context)
-{
- if (cinfo) {
- opj_event_mgr_t *previous = cinfo->event_mgr;
- cinfo->event_mgr = event_mgr;
- cinfo->client_data = context;
- return previous;
- }
-
- return NULL;
-}
-
-bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...)
-{
-#define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */
- opj_msg_callback msg_handler = NULL;
-
- opj_event_mgr_t *event_mgr = cinfo->event_mgr;
- if (event_mgr != NULL) {
- switch (event_type) {
- case EVT_ERROR:
- msg_handler = event_mgr->error_handler;
- break;
- case EVT_WARNING:
- msg_handler = event_mgr->warning_handler;
- break;
- case EVT_INFO:
- msg_handler = event_mgr->info_handler;
- break;
- default:
- break;
- }
- if (msg_handler == NULL) {
- return false;
- }
- } else {
- return false;
- }
-
- if ((fmt != NULL) && (event_mgr != NULL)) {
- va_list arg;
- int str_length, i, j;
- char message[MSG_SIZE];
- memset(message, 0, MSG_SIZE);
- /* initialize the optional parameter list */
- va_start(arg, fmt);
- /* check the length of the format string */
- str_length = (strlen(fmt) > MSG_SIZE) ? MSG_SIZE : strlen(fmt);
- /* parse the format string and put the result in 'message' */
- for (i = 0, j = 0; i < str_length; ++i) {
- if (fmt[i] == '%') {
- if (i + 1 < str_length) {
- switch (tolower(fmt[i + 1])) {
- case '%' :
- message[j++] = '%';
- break;
- case 'o' : { /* octal numbers */
- char tmp[16];
- _itoa(va_arg(arg, int), tmp, 8);
- strcat(message, tmp);
- j += strlen(tmp);
- ++i;
- break;
- }
- case 'i' : /* decimal numbers */
- case 'd' : {
- char tmp[16];
- _itoa(va_arg(arg, int), tmp, 10);
- strcat(message, tmp);
- j += strlen(tmp);
- ++i;
- break;
- }
- case 'x' : { /* hexadecimal numbers */
- char tmp[16];
- _itoa(va_arg(arg, int), tmp, 16);
- strcat(message, tmp);
- j += strlen(tmp);
- ++i;
- break;
- }
- case 's' : { /* strings */
- char *tmp = va_arg(arg, char*);
- strcat(message, tmp);
- j += strlen(tmp);
- ++i;
- break;
- }
- case 'f' : { /* floats */
- char tmp[16];
- double value = va_arg(arg, double);
- sprintf(tmp, "%f", value);
- strcat(message, tmp);
- j += strlen(tmp);
- ++i;
- break;
- }
- };
- } else {
- message[j++] = fmt[i];
- }
- } else {
- message[j++] = fmt[i];
- };
- }
- /* deinitialize the optional parameter list */
- va_end(arg);
-
- /* output the message to the user program */
- msg_handler(message, cinfo->client_data);
- }
-
- return true;
-}
-
+++ /dev/null
-/*
- * 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) 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 __EVENT_H
-#define __EVENT_H
-/**
-@file event.h
-@brief Implementation of a event callback system
-
-The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user.
-*/
-
-#define EVT_ERROR 1 /**< Error event type */
-#define EVT_WARNING 2 /**< Warning event type */
-#define EVT_INFO 4 /**< Debug event type */
-
-/** @defgroup EVENT EVENT - Implementation of a event callback system */
-/*@{*/
-
-/** @name Funciones generales (see also openjp3d.h) */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Write formatted data to a string and send the string to a user callback.
-@param cinfo Codec context info
-@param event_type Event type or callback to use to send the message
-@param fmt Format-control string (plus optional arguments)
-@return Returns true if successful, returns false otherwise
-*/
-bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt, ...);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __EVENT_H */
+++ /dev/null
-/*
- * 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
- * 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 __FIX_H
-#define __FIX_H
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#define int64 __int64
-#else
-#define int64 long long
-#endif
-
-/**
-@file fix.h
-@brief Implementation of operations of specific multiplication (FIX)
-
-The functions in FIX.H have for goal to realize specific multiplication.
-*/
-
-/** @defgroup FIX FIX - Implementation of operations of specific multiplication */
-/*@{*/
-
-/**
-Multiply two fixed-precision rational numbers.
-@param a
-@param b
-@return Returns a * b
-*/
-static int fix_mul(int a, int b)
-{
- int64 temp = (int64) a * (int64) b >> 12;
- return (int)((temp >> 1) + (temp & 1)) ;
-}
-
-/*@}*/
-
-#endif /* __FIX_H */
+++ /dev/null
-/*
- * 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
- * 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 __INT_H
-#define __INT_H
-/**
-@file int.h
-@brief Implementation of operations on integers (INT)
-
-The functions in INT.H have for goal to realize operations on integers.
-*/
-
-/** @defgroup INT INT - Implementation of operations on integers */
-/*@{*/
-
-/** @name Funciones generales (see also openjp3d.h) */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Get the minimum of two integers
-@return Returns a if a < b else b
-*/
-static int int_min(int a, int b)
-{
- return a < b ? a : b;
-}
-/**
-Get the maximum of two integers
-@return Returns a if a > b else b
-*/
-static int int_max(int a, int b)
-{
- return (a > b) ? a : b;
-}
-/**
-Clamp an integer inside an interval
-@return
-<ul>
-<li>Returns a if (min < a < max)
-<li>Returns max if (a > max)
-<li>Returns min if (a < min)
-</ul>
-*/
-static int int_clamp(int a, int min, int max)
-{
- if (a < min) {
- return min;
- }
- if (a > max) {
- return max;
- }
- return a;
-}
-/**
-@return Get absolute value of integer
-*/
-static int int_abs(int a)
-{
- return a < 0 ? -a : a;
-}
-
-static double dbl_abs(double a)
-{
- return a < 0 ? -a : a;
-}
-/**
-Divide an integer and round upwards
-@return Returns a divided by b
-*/
-static int int_ceildiv(int a, int b)
-{
- return (a + b - 1) / b;
-}
-/**
-Divide an integer by a power of 2 and round upwards
-@return Returns a divided by 2^b
-*/
-static int int_ceildivpow2(int a, int b)
-{
- return (a + (1 << b) - 1) >> b;
-}
-/**
-Divide an integer by a power of 2 and round downwards
-@return Returns a divided by 2^b
-*/
-static int int_floordivpow2(int a, int b)
-{
- return a >> b;
-}
-/**
-Get logarithm of an integer and round downwards
-@return Returns log2(a)
-*/
-static int int_floorlog2(int a)
-{
- int l;
- for (l = 0; a > 1; l++) {
- a >>= 1;
- }
- return l;
-}
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif
+++ /dev/null
-/*
- * 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 "opj_includes.h"
-
-/** @defgroup J3D J3D - JPEG-2000 PART 10 codestream reader/writer */
-/*@{*/
-
-/** @name Funciones locales */
-/*@{*/
-
-/**
-Write the SOC marker (Start Of Codestream)
-@param j3d J3D handle
-*/
-static void j3d_write_soc(opj_j3d_t *j3d);
-/**
-Read the SOC marker (Start of Codestream)
-@param j3d J3D handle
-*/
-static void j3d_read_soc(opj_j3d_t *j3d);
-/**
-Write the SIZ marker (2D volume and tile size)
-@param j3d J3D handle
-*/
-static void j3d_write_siz(opj_j3d_t *j3d);
-/**
-Read the SIZ marker (2D volume and tile size)
-@param j3d J3D handle
-*/
-static void j3d_read_siz(opj_j3d_t *j3d);
-/**
-Write the NSI marker (3rd volume and tile size)
-@param j3d J3D handle
-*/
-static void j3d_write_nsi(opj_j3d_t *j3d);
-/**
-Read the NSI marker (3rd volume and tile size)
-@param j3d J3D handle
-*/
-static void j3d_read_nsi(opj_j3d_t *j3d);
-/**
-Write the COM marker (comment)
-@param j3d J3D handle
-*/
-static void j3d_write_com(opj_j3d_t *j3d);
-/**
-Read the COM marker (comment)
-@param j3d J3D handle
-*/
-static void j3d_read_com(opj_j3d_t *j3d);
-/**
-Write the value concerning the specified component in the marker COD and COC
-@param j3d J3D handle
-@param compno Number of the component concerned by the information written
-*/
-static void j3d_write_cox(opj_j3d_t *j3d, int compno);
-/**
-Read the value concerning the specified component in the marker COD and COC
-@param j3d J3D handle
-@param compno Number of the component concerned by the information read
-*/
-static void j3d_read_cox(opj_j3d_t *j3d, int compno);
-/**
-Write the COD marker (coding style default)
-@param j3d J3D handle
-*/
-static void j3d_write_cod(opj_j3d_t *j3d);
-/**
-Read the COD marker (coding style default)
-@param j3d J3D handle
-*/
-static void j3d_read_cod(opj_j3d_t *j3d);
-/**
-Write the COC marker (coding style component)
-@param j3d J3D handle
-@param compno Number of the component concerned by the information written
-*/
-static void j3d_write_coc(opj_j3d_t *j3d, int compno);
-/**
-Read the COC marker (coding style component)
-@param j3d J3D handle
-*/
-static void j3d_read_coc(opj_j3d_t *j3d);
-/**
-Write the value concerning the specified component in the marker QCD and QCC
-@param j3d J3D handle
-@param compno Number of the component concerned by the information written
-*/
-static void j3d_write_qcx(opj_j3d_t *j3d, int compno);
-/**
-Read the value concerning the specified component in the marker QCD and QCC
-@param j3d J3D handle
-@param compno Number of the component concern by the information read
-@param len Length of the information in the QCX part of the marker QCD/QCC
-*/
-static void j3d_read_qcx(opj_j3d_t *j3d, int compno, int len);
-/**
-Write the QCD marker (quantization default)
-@param j3d J3D handle
-*/
-static void j3d_write_qcd(opj_j3d_t *j3d);
-/**
-Read the QCD marker (quantization default)
-@param j3d J3D handle
-*/
-static void j3d_read_qcd(opj_j3d_t *j3d);
-/**
-Write the QCC marker (quantization component)
-@param j3d J3D handle
-@param compno Number of the component concerned by the information written
-*/
-static void j3d_write_qcc(opj_j3d_t *j3d, int compno);
-/**
-Read the QCC marker (quantization component)
-@param j3d J3D handle
-*/
-static void j3d_read_qcc(opj_j3d_t *j3d);
-/**
-Write the POC marker (progression order change)
-@param j3d J3D handle
-*/
-static void j3d_write_poc(opj_j3d_t *j3d);
-/**
-Read the POC marker (progression order change)
-@param j3d J3D handle
-*/
-static void j3d_read_poc(opj_j3d_t *j3d);
-/**
-Read the CRG marker (component registration)
-@param j3d J3D handle
-*/
-static void j3d_read_crg(opj_j3d_t *j3d);
-/**
-Read the TLM marker (tile-part lengths)
-@param j3d J3D handle
-*/
-static void j3d_read_tlm(opj_j3d_t *j3d);
-/**
-Read the PLM marker (packet length, main header)
-@param j3d J3D handle
-*/
-static void j3d_read_plm(opj_j3d_t *j3d);
-/**
-Read the PLT marker (packet length, tile-part header)
-@param j3d J3D handle
-*/
-static void j3d_read_plt(opj_j3d_t *j3d);
-/**
-Read the PPM marker (packet packet headers, main header)
-@param j3d J3D handle
-*/
-static void j3d_read_ppm(opj_j3d_t *j3d);
-/**
-Read the PPT marker (packet packet headers, tile-part header)
-@param j3d J3D handle
-*/
-static void j3d_read_ppt(opj_j3d_t *j3d);
-/**
-Write the SOT marker (start of tile-part)
-@param j3d J3D handle
-*/
-static void j3d_write_sot(opj_j3d_t *j3d);
-/**
-Read the SOT marker (start of tile-part)
-@param j3d J3D handle
-*/
-static void j3d_read_sot(opj_j3d_t *j3d);
-/**
-Write the SOD marker (start of data)
-@param j3d J3D handle
-@param tile_coder Pointer to a TCD handle
-*/
-static void j3d_write_sod(opj_j3d_t *j3d, void *tile_coder);
-/**
-Read the SOD marker (start of data)
-@param j3d J3D handle
-*/
-static void j3d_read_sod(opj_j3d_t *j3d);
-/**
-Write the RGN marker (region-of-interest)
-@param j3d J3D handle
-@param compno Number of the component concerned by the information written
-@param tileno Number of the tile concerned by the information written
-*/
-static void j3d_write_rgn(opj_j3d_t *j3d, int compno, int tileno);
-/**
-Read the RGN marker (region-of-interest)
-@param j3d J3D handle
-*/
-static void j3d_read_rgn(opj_j3d_t *j3d);
-/**
-Write the EOC marker (end of codestream)
-@param j3d J3D handle
-*/
-static void j3d_write_eoc(opj_j3d_t *j3d);
-/**
-Read the EOC marker (end of codestream)
-@param j3d J3D handle
-*/
-static void j3d_read_eoc(opj_j3d_t *j3d);
-/**
-Read an unknown marker
-@param j3d J3D handle
-*/
-static void j3d_read_unk(opj_j3d_t *j3d);
-/**
-Write the CAP marker (extended capabilities)
-@param j3d J3D handle
-*/
-static void j3d_write_cap(opj_j3d_t *j3d);
-/**
-Read the CAP marker (extended capabilities)
-@param j3d J3D handle
-*/
-static void j3d_read_cap(opj_j3d_t *j3d);
-/**
-Write the DCO marker (Variable DC offset)
-@param j3d J3D handle
-*/
-static void j3d_write_dco(opj_j3d_t *j3d);
-/**
-Read the DCO marker (Variable DC offset)
-@param j3d J3D handle
-*/
-static void j3d_read_dco(opj_j3d_t *j3d);
-/**
-Write the ATK marker (arbitrary transformation kernel)
-@param j3d J3D handle
-*/
-static void j3d_write_atk(opj_j3d_t *j3d);
-/**
-Read the ATK marker (arbitrary transformation kernel)
-@param j3d J3D handle
-*/
-static void j3d_read_atk(opj_j3d_t *j3d);
-/**
-Write the CBD marker (component bit depth definition)
-@param j3d J3D handle
-*/
-static void j3d_write_cbd(opj_j3d_t *j3d);
-/**
-Read the CBD marker (component bit depth definition)
-@param j3d J3D handle
-*/
-static void j3d_read_cbd(opj_j3d_t *j3d);
-/**
-Write the MCT marker (multiple component transfomation definition)
-@param j3d J3D handle
-*/
-static void j3d_write_mct(opj_j3d_t *j3d);
-/**
-Read the MCT marker (multiple component transfomation definition)
-@param j3d J3D handle
-*/
-static void j3d_read_mct(opj_j3d_t *j3d);
-/**
-Write the MCC marker (multiple component transfomation collection)
-@param j3d J3D handle
-*/
-static void j3d_write_mcc(opj_j3d_t *j3d);
-/**
-Read the MCC marker (multiple component transfomation collection)
-@param j3d J3D handle
-*/
-static void j3d_read_mcc(opj_j3d_t *j3d);
-/**
-Write the MCO marker (multiple component transfomation ordering)
-@param j3d J3D handle
-*/
-static void j3d_write_mco(opj_j3d_t *j3d);
-/**
-Read the MCO marker (multiple component transfomation ordering)
-@param j3d J3D handle
-*/
-static void j3d_read_mco(opj_j3d_t *j3d);
-/**
-Write the NLT marker (non-linearity point transformation)
-@param j3d J3D handle
-*/
-static void j3d_write_nlt(opj_j3d_t *j3d);
-/**
-Read the NLT marker (non-linearity point transformation)
-@param j3d J3D handle
-*/
-static void j3d_read_nlt(opj_j3d_t *j3d);
-/*@}*/
-
-/* ----------------------------------------------------------------------- */
-
-static void j3d_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");
-}
-
-static void j3d_dump_cp(FILE *fd, opj_volume_t * vol, opj_cp_t * cp)
-{
- int tileno, compno, layno, bandno, resno, numbands;
- fprintf(fd, "coding parameters {\n");
- fprintf(fd, " tx0=%d, ty0=%d, tz0=%d\n", cp->tx0, cp->ty0, cp->tz0);
- fprintf(fd, " tdx=%d, tdy=%d, tdz=%d\n", cp->tdx, cp->tdy, cp->tdz);
- fprintf(fd, " tw=%d, th=%d, tl=%d\n", cp->tw, cp->th, cp->tl);
- fprintf(fd, " transform format: %d\n", cp->transform_format);
- fprintf(fd, " encoding format: %d\n", cp->encoding_format);
- for (tileno = 0; tileno < cp->tw * cp->th * cp->tl; tileno++) {
- opj_tcp_t *tcp = &cp->tcps[tileno];
- fprintf(fd, " tile %d {\n", tileno);
- fprintf(fd, " csty=%x\n", tcp->csty);
- fprintf(fd, " prg=%d\n", tcp->prg);
- fprintf(fd, " numlayers=%d\n", tcp->numlayers);
- fprintf(fd, " mct=%d\n", tcp->mct);
- fprintf(fd, " rates=");
- for (layno = 0; layno < tcp->numlayers; layno++) {
- fprintf(fd, "%f ", tcp->rates[layno]);
- }
- fprintf(fd, "\n");
- fprintf(fd, " first=%d\n", tcp->first);
- for (compno = 0; compno < vol->numcomps; compno++) {
- opj_tccp_t *tccp = &tcp->tccps[compno];
- fprintf(fd, " comp %d {\n", compno);
- fprintf(fd, " csty=%x\n", tccp->csty);
- fprintf(fd, " numresx=%d, numresy=%d, numresz=%d\n",
- tccp->numresolution[0], tccp->numresolution[1], tccp->numresolution[2]);
- fprintf(fd, " cblkw=%d, cblkh=%d, cblkl=%d\n", tccp->cblk[0],
- tccp->cblk[1], tccp->cblk[2]);
- fprintf(fd, " cblksty=%x\n", tccp->cblksty);
- fprintf(fd, " qntsty=%d\n", tccp->qntsty);
- fprintf(fd, " numgbits=%d\n", tccp->numgbits);
- fprintf(fd, " roishift=%d\n", tccp->roishift);
- fprintf(fd, " reversible=%d\n", tccp->reversible);
- fprintf(fd, " dwtidx=%d dwtidy=%d dwtidz=%d\n", tccp->dwtid[0],
- tccp->dwtid[1], tccp->dwtid[2]);
- if (tccp->atk != NULL) {
- fprintf(fd, " atk.index=%d\n", tccp->atk->index);
- fprintf(fd, " atk.coeff_typ=%d\n", tccp->atk->coeff_typ);
- fprintf(fd, " atk.filt_cat=%d\n", tccp->atk->filt_cat);
- fprintf(fd, " atk.exten=%d\n", tccp->atk->exten);
- fprintf(fd, " atk.minit=%d\n", tccp->atk->minit);
- fprintf(fd, " atk.wt_typ=%d\n", tccp->atk->wt_typ);
- }
- fprintf(fd, " stepsizes of bands=");
- numbands = (tccp->qntsty == J3D_CCP_QNTSTY_SIQNT) ? 1 :
- ((cp->transform_format == TRF_2D_DWT) ? (tccp->numresolution[0] * 3 - 2) :
- (tccp->numresolution[0] * 7 - 6) - 4 * (tccp->numresolution[0] -
- tccp->numresolution[2]));
- for (bandno = 0; bandno < numbands; bandno++) {
- fprintf(fd, "(%d,%d) ", tccp->stepsizes[bandno].mant,
- tccp->stepsizes[bandno].expn);
- }
- fprintf(fd, "\n");
-
- if (tccp->csty & J3D_CCP_CSTY_PRT) {
- fprintf(fd, " prcw=");
- for (resno = 0; resno < tccp->numresolution[0]; resno++) {
- fprintf(fd, "%d ", tccp->prctsiz[0][resno]);
- }
- fprintf(fd, "\n");
- fprintf(fd, " prch=");
- for (resno = 0; resno < tccp->numresolution[0]; resno++) {
- fprintf(fd, "%d ", tccp->prctsiz[1][resno]);
- }
- fprintf(fd, "\n");
- fprintf(fd, " prcl=");
- for (resno = 0; resno < tccp->numresolution[0]; resno++) {
- fprintf(fd, "%d ", tccp->prctsiz[2][resno]);
- }
- fprintf(fd, "\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, "}\n");
-}
-
-/* -----------------------------------------------------------------------
-Extended capabilities
-------------------------------------------------------------------------*/
-
-static void j3d_write_cap(opj_j3d_t *j3d)
-{
- int len, lenp;
-
- opj_cio_t *cio = j3d->cio;
- cio_write(cio, J3D_MS_CAP, 2); /* CAP */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, J3D_CAP_10, 4);
- if (J3D_CAP_10) {
- cio_write(cio, 0x0, 2);
- }
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lsiz */
- cio_seek(cio, lenp + len);
-
-}
-static void j3d_read_cap(opj_j3d_t *j3d)
-{
- int len, Cap;
- opj_cio_t *cio = j3d->cio;
- /*cio_read(cio, 2); CAP */
- len = cio_read(cio, 2);
- Cap = cio_read(cio, 4);
- if (Cap) {
- cio_read(cio, 2);
- }
- assert(len == 2 + 4 + 2);
-}
-static void j3d_write_nsi(opj_j3d_t *j3d)
-{
- int i;
- int lenp, len;
- int ndim = 3;
-
- opj_cio_t *cio = j3d->cio;
- opj_volume_t *volume = j3d->volume;
- opj_cp_t *cp = j3d->cp;
-
- cio_write(cio, J3D_MS_NSI, 2); /* NSI */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, ndim, 1); /* Ndim */
- cio_write(cio, volume->z1, 4); /* Zsiz */
- cio_write(cio, volume->z0, 4); /* Z0siz */
- cio_write(cio, cp->tdz, 4); /* ZTsiz */
- cio_write(cio, cp->tz0, 4); /* ZT0siz */
- for (i = 0; i < volume->numcomps; i++) {
- cio_write(cio, volume->comps[i].dz, 1); /* ZRsiz_i */
- }
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lsiz */
- cio_seek(cio, lenp + len);
-}
-
-static void j3d_read_nsi(opj_j3d_t *j3d)
-{
- int ndim;
- int len, i;
-
- opj_cio_t *cio = j3d->cio;
- opj_volume_t *volume = j3d->volume;
- opj_cp_t *cp = j3d->cp;
-
- len = cio_read(cio, 2); /* Lnsi */
- ndim = cio_read(cio, 1); /* Ndim */
- assert(ndim == 3);
- volume->z1 = cio_read(cio, 4); /* Zsiz */
- volume->z0 = cio_read(cio, 4); /* Z0siz */
- cp->tdz = cio_read(cio, 4); /* ZTsiz */
- cp->tz0 = cio_read(cio, 4); /* ZT0siz */
- for (i = 0; i < volume->numcomps; i++) {
- volume->comps[i].dz = cio_read(cio, 1); /* ZRsiz_i */
- }
-
- /*Initialization of volume*/
- cp->tw = int_ceildiv(volume->x1 - cp->tx0, cp->tdx);
- cp->th = int_ceildiv(volume->y1 - cp->ty0, cp->tdy);
- cp->tl = int_ceildiv(volume->z1 - cp->tz0, cp->tdz);
- cp->tcps = (opj_tcp_t *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof(
- opj_tcp_t));
- cp->tileno = (int *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof(int));
- cp->tileno_size = 0;
-
- for (i = 0; i < cp->tw * cp->th * cp->tl ; i++) {
- cp->tcps[i].POC = 0;
- cp->tcps[i].numpocs = 0;
- cp->tcps[i].first = 1;
- }
-
- /* Initialization for PPM marker (Packets header)*/
- cp->ppm = 0;
- cp->ppm_data = NULL;
- cp->ppm_data_first = NULL;
- cp->ppm_previous = 0;
- cp->ppm_store = 0;
-
- j3d->default_tcp->tccps = (opj_tccp_t *) opj_malloc(sizeof(
- opj_tccp_t) * volume->numcomps);
- for (i = 0; i < cp->tw * cp->th * cp->tl ; i++) {
- cp->tcps[i].tccps = (opj_tccp_t *) opj_malloc(sizeof(opj_tccp_t) *
- volume->numcomps);
- }
- j3d->tile_data = (unsigned char **) opj_malloc(cp->tw * cp->th * cp->tl *
- sizeof(unsigned char *));
- j3d->tile_len = (int *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof(int));
- j3d->state = J3D_STATE_MH;
-
-}
-static void j3d_write_dco(opj_j3d_t *j3d)
-{
- int lenp, len, i;
- int dcotype;
-
- opj_cio_t *cio = j3d->cio;
- opj_volume_t *volume = j3d->volume;
- opj_cp_t *cp = j3d->cp;
-
- dcotype = 1; /* Offsets are 16bit signed integers Table A21 15444-2 */
- cio_write(cio, J3D_MS_DCO, 2); /* DCO */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, dcotype, 1);
- if (dcotype == 0) {
- for (i = 0; i < volume->numcomps; i++) {
- cio_write(cio, volume->comps[i].dcoffset, 1); /* SPdco_i */
- }
- } else if (dcotype == 1) {
- for (i = 0; i < volume->numcomps; i++) {
- cio_write(cio, volume->comps[i].dcoffset, 1); /* SPdco_i */
- opj_event_msg(j3d->cinfo, EVT_INFO, "dcotype %d DCO %d \n", dcotype,
- volume->comps[i].dcoffset);
- }
- }
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Ldco */
- cio_seek(cio, lenp + len);
-
-}
-static void j3d_read_dco(opj_j3d_t *j3d)
-{
- int len, i;
- int dcotype;
-
- opj_cio_t *cio = j3d->cio;
- opj_volume_t *volume = j3d->volume;
- opj_cp_t *cp = j3d->cp;
-
- len = cio_read(cio, 2); /* Lsiz */
- dcotype = cio_read(cio, 1); /*offset 8bit unsigned / 16bit signed integers*/
- if (dcotype == 0) {
- for (i = 0; i < volume->numcomps; i++) {
- volume->comps[i].dcoffset = cio_read(cio, 1);
- if (volume->comps[i].dcoffset > 128) {
- volume->comps[i].dcoffset = volume->comps[i].dcoffset - 256;
- }
- }
- } else if (dcotype == 1) {
- for (i = 0; i < volume->numcomps; i++) {
- volume->comps[i].dcoffset = cio_read(cio, 1);
- if (volume->comps[i].dcoffset > 128) {
- volume->comps[i].dcoffset = volume->comps[i].dcoffset - 256;
- }
- }
- }
-
-}
-static void j3d_write_atk(opj_j3d_t *j3d)
-{
- int lenp, len, s, k;
-
- opj_cio_t *cio = j3d->cio;
- opj_volume_t *volume = j3d->volume;
- opj_atk_t *atk = j3d->cp->tcps->tccps->atk;
-
- cio_write(cio, J3D_MS_ATK, 2); /* ATK */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, atk->index + (atk->coeff_typ << 8) + (atk->filt_cat << 11)
- + (atk->wt_typ << 12) + (atk->minit << 13) + (atk->exten << 14),
- 2); /* Satk */
- if (atk->wt_typ == J3D_ATK_IRR) {
- cio_write(cio, (unsigned int)(atk->Katk * 8192.0), 1 << atk->coeff_typ);
- }
- cio_write(cio, atk->Natk, 1);
- for (s = 0; s < atk->Natk; s++) {
- if (atk->filt_cat == J3D_ATK_ARB) {
- cio_write(cio, atk->Oatk[s], 1);
- }
- if (atk->wt_typ == J3D_ATK_REV) {
- cio_write(cio, atk->Eatk[s], 1);
- cio_write(cio, atk->Batk[s], 1);
- }
- cio_write(cio, atk->LCatk[s], 1);
- for (k = 0; k < atk->LCatk[s]; k++) {
- cio_write(cio, (unsigned int)(atk->Aatk[s][k] * 8192.0), 1 << atk->coeff_typ);
- }
- }
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Latk */
- cio_seek(cio, lenp + len);
-}
-static void j3d_read_atk(opj_j3d_t *j3d)
-{
- int len, i, Satk, k;
-
- opj_cio_t *cio = j3d->cio;
- opj_volume_t *volume = j3d->volume;
- opj_cp_t *cp = j3d->cp;
- opj_atk_t *atk = cp->tcps->tccps->atk;
-
- len = cio_read(cio, 2); /* Latk */
- Satk = cio_read(cio, 2);
- atk->index = Satk & 0x00ff;
- atk->coeff_typ = Satk >> 8 & 0x0007;
- atk->filt_cat = Satk >> 11 & 0x0001;
- atk->wt_typ = Satk >> 12 & 0x0001;
- atk->minit = Satk >> 13 & 0x0001;
- atk->exten = Satk >> 14 & 0x0001;
- if (atk->wt_typ == J3D_ATK_IRR) {
- atk->Katk = ((double) cio_read(cio, 1 << atk->coeff_typ) / 8192.0);
- }
- atk->Natk = cio_read(cio, 1);
- for (i = 0; i < atk->Natk; i++) {
- if (atk->filt_cat == J3D_ATK_ARB) {
- atk->Oatk[i] = cio_read(cio, 1);
- }
- if (atk->wt_typ == J3D_ATK_REV) {
- atk->Eatk[i] = cio_read(cio, 1);
- atk->Batk[i] = cio_read(cio, 1);
- }
- atk->LCatk[i] = cio_read(cio, 1);
- for (k = 0; k < atk->LCatk[i]; k++) {
- atk->Aatk[i][k] = ((double) cio_read(cio, 1 << atk->coeff_typ) / 8192.0);
- }
- }
-}
-static void j3d_write_cbd(opj_j3d_t *j3d)
-{
-}
-static void j3d_read_cbd(opj_j3d_t *j3d)
-{
-}
-static void j3d_write_mct(opj_j3d_t *j3d)
-{
-}
-static void j3d_read_mct(opj_j3d_t *j3d)
-{
-}
-static void j3d_write_mcc(opj_j3d_t *j3d)
-{
-}
-static void j3d_read_mcc(opj_j3d_t *j3d)
-{
-}
-static void j3d_write_mco(opj_j3d_t *j3d)
-{
-}
-static void j3d_read_mco(opj_j3d_t *j3d)
-{
-}
-static void j3d_write_nlt(opj_j3d_t *j3d)
-{
-}
-static void j3d_read_nlt(opj_j3d_t *j3d)
-{
-}
-/* -----------------------------------------------------------------------
-15444-1 codestream syntax
-------------------------------------------------------------------------*/
-static void j3d_write_soc(opj_j3d_t *j3d)
-{
- opj_cio_t *cio = j3d->cio;
- cio_write(cio, J3D_MS_SOC, 2);
-}
-
-static void j3d_read_soc(opj_j3d_t *j3d)
-{
- j3d->state = J3D_STATE_MHSIZ;
-}
-
-static void j3d_write_siz(opj_j3d_t *j3d)
-{
- int i;
- int lenp, len;
- int Rsiz;
-
- opj_cio_t *cio = j3d->cio;
- opj_volume_t *volume = j3d->volume;
- opj_cp_t *cp = j3d->cp;
-
- cio_write(cio, J3D_MS_SIZ, 2); /* SIZ */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- /*cio_write(cio, 0, 2);*/ /* Rsiz (capabilities of 15444-1 only) */
- Rsiz = J3D_RSIZ_DCO |
- J3D_RSIZ_ATK; /** | J3D_RSIZ_MCT | J3D_RSIZ_NONLT (not implemented yet)*/
- cio_write(cio, Rsiz, 2); /* capabilities of WDv5.2*/
- cio_write(cio, volume->x1, 4); /* Xsiz */
- cio_write(cio, volume->y1, 4); /* Ysiz */
- cio_write(cio, volume->x0, 4); /* X0siz */
- cio_write(cio, volume->y0, 4); /* Y0siz */
- cio_write(cio, cp->tdx, 4); /* XTsiz */
- cio_write(cio, cp->tdy, 4); /* YTsiz */
- cio_write(cio, cp->tx0, 4); /* XT0siz */
- cio_write(cio, cp->ty0, 4); /* YT0siz */
- cio_write(cio, volume->numcomps, 2); /* Csiz */
- for (i = 0; i < volume->numcomps; i++) {
- cio_write(cio, volume->comps[i].prec - 1 + (volume->comps[i].sgnd << 7),
- 1); /* Ssiz_i */
- cio_write(cio, volume->comps[i].dx, 1); /* XRsiz_i */
- cio_write(cio, volume->comps[i].dy, 1); /* YRsiz_i */
- }
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lsiz */
- cio_seek(cio, lenp + len);
-}
-
-static void j3d_read_siz(opj_j3d_t *j3d)
-{
- int len, i;
-
- opj_cio_t *cio = j3d->cio;
- opj_volume_t *volume = j3d->volume;
- opj_cp_t *cp = j3d->cp;
-
- len = cio_read(cio, 2); /* Lsiz */
- cp->rsiz = cio_read(cio, 2); /* Rsiz (capabilities) */
- volume->x1 = cio_read(cio, 4); /* Xsiz */
- volume->y1 = cio_read(cio, 4); /* Ysiz */
- volume->x0 = cio_read(cio, 4); /* X0siz */
- volume->y0 = cio_read(cio, 4); /* Y0siz */
- cp->tdx = cio_read(cio, 4); /* XTsiz */
- cp->tdy = cio_read(cio, 4); /* YTsiz */
- cp->tx0 = cio_read(cio, 4); /* XT0siz */
- cp->ty0 = cio_read(cio, 4); /* YT0siz */
-
- volume->numcomps = cio_read(cio, 2); /* Csiz */
- volume->comps = (opj_volume_comp_t *) opj_malloc(volume->numcomps * sizeof(
- opj_volume_comp_t));
- for (i = 0; i < volume->numcomps; i++) {
- int tmp, j;
- tmp = cio_read(cio, 1); /* Ssiz_i */
- volume->comps[i].prec = (tmp & 0x7f) + 1;
- volume->comps[i].sgnd = tmp >> 7;
- volume->comps[i].dx = cio_read(cio, 1); /* XRsiz_i */
- volume->comps[i].dy = cio_read(cio, 1); /* YRsiz_i */
- for (j = 0; j < 3; j++) {
- volume->comps[i].resno_decoded[j] = 0; /* number of resolution decoded */
- volume->comps[i].factor[j] = 0; /* reducing factor per component */
- }
- }
-
- if (j3d->cinfo->codec_format == CODEC_J2K) {
- volume->z1 = 1;
- volume->z0 = 0;
- volume->numslices = 1;
- cp->tdz = 1;
- cp->tz0 = 0;
- for (i = 0; i < volume->numcomps; i++) {
- volume->comps[i].dz = 1;
- }
-
- /*Initialization of volume*/
- cp->tw = int_ceildiv(volume->x1 - cp->tx0, cp->tdx);
- cp->th = int_ceildiv(volume->y1 - cp->ty0, cp->tdy);
- cp->tl = int_ceildiv(volume->z1 - cp->tz0, cp->tdz);
- cp->tcps = (opj_tcp_t *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof(
- opj_tcp_t));
- cp->tileno = (int *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof(int));
- cp->tileno_size = 0;
-
- for (i = 0; i < cp->tw * cp->th * cp->tl ; i++) {
- cp->tcps[i].POC = 0;
- cp->tcps[i].numpocs = 0;
- cp->tcps[i].first = 1;
- }
-
- /* Initialization for PPM marker (Packets header)*/
- cp->ppm = 0;
- cp->ppm_data = NULL;
- cp->ppm_data_first = NULL;
- cp->ppm_previous = 0;
- cp->ppm_store = 0;
-
- j3d->default_tcp->tccps = (opj_tccp_t *) opj_malloc(sizeof(
- opj_tccp_t) * volume->numcomps);
- for (i = 0; i < cp->tw * cp->th * cp->tl ; i++) {
- cp->tcps[i].tccps = (opj_tccp_t *) opj_malloc(sizeof(opj_tccp_t) *
- volume->numcomps);
- }
- j3d->tile_data = (unsigned char **) opj_malloc(cp->tw * cp->th * cp->tl *
- sizeof(unsigned char *));
- j3d->tile_len = (int *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof(int));
- j3d->state = J3D_STATE_MH;
- }
-}
-
-
-
-static void j3d_write_com(opj_j3d_t *j3d)
-{
- unsigned int i;
- int lenp, len;
-
- opj_cio_t *cio = j3d->cio;
-
- cio_write(cio, J3D_MS_COM, 2);
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, 1, 2);
- /*opj_event_msg(j3d->cinfo, EVT_INFO, "TRF %D ENCOD %d\n",j3d->cp->transform_format,j3d->cp->encoding_format);*/
- if (j3d->cp->comment != NULL) {
- char *comment = j3d->cp->comment;
- for (i = 0; i < strlen(comment); i++) {
- cio_write(cio, comment[i], 1);
- }
- }
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2);
- cio_seek(cio, lenp + len);
-}
-
-static void j3d_read_com(opj_j3d_t *j3d)
-{
- int len;
- opj_cio_t *cio = j3d->cio;
-
- len = cio_read(cio, 2);
- cio_read(cio, 2); // read registration
-
- /*opj_event_msg(j3d->cinfo, EVT_INFO, "TRF %D ENCOD %d\n",j3d->cp->transform_format,j3d->cp->encoding_format);*/
-
- cio_skip(cio, len - 4); /*possible comments*/
-}
-
-static void j3d_write_cox(opj_j3d_t *j3d, int compno)
-{
- int i;
- int shift = 2;
-
- opj_cp_t *cp = j3d->cp;
- opj_tcp_t *tcp = &cp->tcps[j3d->curtileno];
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_cio_t *cio = j3d->cio;
-
- cio_write(cio, tccp->numresolution[0] - 1,
- 1); /* SPcox (D) No of decomposition levels in x-axis*/
- if (j3d->cinfo->codec_format == CODEC_J3D) {
- cio_write(cio, tccp->numresolution[1] - 1,
- 1); /* SPcox (E) No of decomposition levels in y-axis*/
- cio_write(cio, tccp->numresolution[2] - 1,
- 1); /* SPcox (F) No of decomposition levels in z-axis*/
- }
- if (j3d->cinfo->codec_format == CODEC_J3D) {
- /* Table A.7 */
- shift = 0;
- }
- /* (cblkw - 2) + (cblkh - 2) + (cblkl - 2) <= 18*/
- cio_write(cio, tccp->cblk[0] - shift,
- 1); /* SPcox (G) Cblk width entre 10 y 2 (8 y 0)*/
- cio_write(cio, tccp->cblk[1] - shift,
- 1); /* SPcox (H) Cblk height*/
- if (j3d->cinfo->codec_format == CODEC_J3D) {
- cio_write(cio, tccp->cblk[2] - shift, 1); /* SPcox (I) Cblk depth*/
- }
- cio_write(cio, tccp->cblksty, 1); /* SPcox (J) Cblk style*/
- cio_write(cio, tccp->dwtid[0],
- 1); /* SPcox (K) WT in x-axis 15444-2 Table A10*/
- if (j3d->cinfo->codec_format == CODEC_J3D) {
- cio_write(cio, tccp->dwtid[1],
- 1); /* SPcox (L) WT in y-axis 15444-2 Table A10*/
- cio_write(cio, tccp->dwtid[2],
- 1); /* SPcox (M) WT in z-axis 15444-2 Table A10*/
- }
-
- if (tccp->csty & J3D_CCP_CSTY_PRT) {
- for (i = 0; i < tccp->numresolution[0]; i++) {
- if (i < tccp->numresolution[2]) {
- cio_write(cio, tccp->prctsiz[0][i] + (tccp->prctsiz[1][i] << 4) +
- (tccp->prctsiz[2][i] << 8), 2); /* SPcox (N_i) Table A9*/
- } else if (j3d->cinfo->codec_format == CODEC_J3D) {
- cio_write(cio, tccp->prctsiz[0][i] + (tccp->prctsiz[1][i] << 4),
- 2); /* SPcox (N_i) Table A9*/
- } else {
- cio_write(cio, tccp->prctsiz[0][i] + (tccp->prctsiz[1][i] << 4), 1);
- } /* SPcox (N_i) Table A9*/
- }
- }
-}
-
-static void j3d_read_cox(opj_j3d_t *j3d, int compno)
-{
- int i;
- int shift = 2;
-
- opj_cp_t *cp = j3d->cp;
- opj_tcp_t *tcp = j3d->state == J3D_STATE_TPH ? &cp->tcps[j3d->curtileno] :
- j3d->default_tcp;
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_cio_t *cio = j3d->cio;
-
- tccp->numresolution[0] = cio_read(cio,
- 1) + 1; /* SPcox (D) No of decomposition levels in x-axis*/
- if (j3d->cinfo->codec_format == CODEC_J3D) {
- tccp->numresolution[1] = cio_read(cio,
- 1) + 1; /* SPcox (E) No of decomposition levels in y-axis*/
- tccp->numresolution[2] = cio_read(cio,
- 1) + 1; /* SPcox (F) No of decomposition levels in z-axis*/
- } else if (j3d->cinfo->codec_format == CODEC_J2K) {
- tccp->numresolution[1] = tccp->numresolution[0];
- tccp->numresolution[2] = 1;
- }
- /* check the reduce value */
- cp->reduce[0] = int_min((tccp->numresolution[0]) - 1, cp->reduce[0]);
- cp->reduce[1] = int_min((tccp->numresolution[1]) - 1, cp->reduce[1]);
- cp->reduce[2] = int_min((tccp->numresolution[2]) - 1, cp->reduce[2]);
-
- if (j3d->cinfo->codec_format == CODEC_J3D) {
- /* Table A.7 */
- shift = 0;
- }
- tccp->cblk[0] = cio_read(cio, 1) + shift; /* SPcox (G) */
- tccp->cblk[1] = cio_read(cio, 1) + shift; /* SPcox (H) */
- if (j3d->cinfo->codec_format == CODEC_J3D) {
- tccp->cblk[2] = cio_read(cio, 1) + shift; /* SPcox (I) */
- } else {
- tccp->cblk[2] = tccp->cblk[0];
- }
-
- tccp->cblksty = cio_read(cio, 1); /* SPcox (J) */
- tccp->dwtid[0] = cio_read(cio, 1); /* SPcox (K) */
- if (j3d->cinfo->codec_format == CODEC_J3D) {
- tccp->dwtid[1] = cio_read(cio, 1); /* SPcox (L) */
- tccp->dwtid[2] = cio_read(cio, 1); /* SPcox (M) */
- } else {
- tccp->dwtid[1] = tccp->dwtid[0]; /* SPcox (L) */
- tccp->dwtid[2] = tccp->dwtid[0]; /* SPcox (M) */
- }
- tccp->reversible = (tccp->dwtid[0] >= 1 && tccp->dwtid[1] >= 1 &&
- tccp->dwtid[2] >= 1); /*TODO: only valid for irreversible 9x7 WTs*/
- if (tccp->csty & J3D_CP_CSTY_PRT) {
- for (i = 0; i < tccp->numresolution[0]; i++) {
- int tmp = cio_read(cio, 2); /* SPcox (N_i) */
- tccp->prctsiz[0][i] = tmp & 0xf;
- tccp->prctsiz[1][i] = tmp >> 4;
- tccp->prctsiz[2][i] = tmp >> 8;
- }
- }
-}
-
-static void j3d_write_cod(opj_j3d_t *j3d)
-{
- opj_cp_t *cp = NULL;
- opj_tcp_t *tcp = NULL;
- int lenp, len;
-
- opj_cio_t *cio = j3d->cio;
-
- cio_write(cio, J3D_MS_COD, 2); /* COD */
-
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
-
- cp = j3d->cp;
- tcp = &cp->tcps[j3d->curtileno];
-
- /* Scod : Table A-4*/
- cio_write(cio, tcp->csty, 1); /* Scod : Coding style parameters */
- /* SGcod : Table A-5*/
- cio_write(cio, tcp->prg, 1); /* SGcod (A) : Progression order */
- cio_write(cio, tcp->numlayers, 2); /* SGcod (B) : No of layers */
- cio_write(cio, tcp->mct,
- 1); /* SGcod (C) : Multiple component transformation usage */
- /* SPcod : Table A-6*/
- j3d_write_cox(j3d, 0);
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lcod */
- cio_seek(cio, lenp + len);
-}
-
-static void j3d_read_cod(opj_j3d_t *j3d)
-{
- int len, i, pos;
-
- opj_cio_t *cio = j3d->cio;
- opj_cp_t *cp = j3d->cp;
- opj_tcp_t *tcp = j3d->state == J3D_STATE_TPH ? &cp->tcps[j3d->curtileno] :
- j3d->default_tcp;
- opj_volume_t *volume = j3d->volume;
-
- /* Lcod */
- len = cio_read(cio, 2);
- /* Scod : Table A-4*/
- tcp->csty = cio_read(cio, 1);
- /* SGcod : Table A-5*/
- tcp->prg = (OPJ_PROG_ORDER)cio_read(cio, 1);
- tcp->numlayers = cio_read(cio, 2);
- tcp->mct = cio_read(cio, 1);
-
- pos = cio_tell(cio);
- for (i = 0; i < volume->numcomps; i++) {
- tcp->tccps[i].csty = tcp->csty & J3D_CP_CSTY_PRT;
- cio_seek(cio, pos);
- j3d_read_cox(j3d, i);
- }
-}
-
-static void j3d_write_coc(opj_j3d_t *j3d, int compno)
-{
- int lenp, len;
-
- opj_cp_t *cp = j3d->cp;
- opj_tcp_t *tcp = &cp->tcps[j3d->curtileno];
- opj_volume_t *volume = j3d->volume;
- opj_cio_t *cio = j3d->cio;
-
- cio_write(cio, J3D_MS_COC, 2); /* COC */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, compno, volume->numcomps <= 256 ? 1 : 2); /* Ccoc */
- cio_write(cio, tcp->tccps[compno].csty, 1); /* Scoc */
-
- j3d_write_cox(j3d, compno);
-
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lcoc */
- cio_seek(cio, lenp + len);
-}
-
-static void j3d_read_coc(opj_j3d_t *j3d)
-{
- int len, compno;
-
- opj_cp_t *cp = j3d->cp;
- opj_tcp_t *tcp = j3d->state == J3D_STATE_TPH ? &cp->tcps[j3d->curtileno] :
- j3d->default_tcp;
- opj_volume_t *volume = j3d->volume;
- opj_cio_t *cio = j3d->cio;
-
- len = cio_read(cio, 2); /* Lcoc */
- compno = cio_read(cio, volume->numcomps <= 256 ? 1 : 2); /* Ccoc */
- tcp->tccps[compno].csty = cio_read(cio, 1); /* Scoc */
- j3d_read_cox(j3d, compno);
-}
-
-static void j3d_write_qcx(opj_j3d_t *j3d, int compno)
-{
- int bandno, numbands;
- int expn, mant;
-
- opj_cp_t *cp = j3d->cp;
- opj_tcp_t *tcp = &cp->tcps[j3d->curtileno];
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_cio_t *cio = j3d->cio;
-
- cio_write(cio, tccp->qntsty + (tccp->numgbits << 5),
- 1); /* Sqcx : Table A28 de 15444-1*/
-
- numbands = 0; // compiler warning
- if (j3d->cinfo->codec_format == CODEC_J2K) {
- numbands = tccp->qntsty == J3D_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolution[0] * 3
- - 2;
- } else if (j3d->cinfo->codec_format == CODEC_J3D) {
- int diff = tccp->numresolution[0] - tccp->numresolution[2];
- numbands = (tccp->qntsty == J3D_CCP_QNTSTY_SIQNT) ? 1 :
- (tccp->numresolution[0] * 7 - 6) - 4 * diff; /* SIQNT vs. SEQNT */
- }
-
- for (bandno = 0; bandno < numbands; bandno++) {
- expn = tccp->stepsizes[bandno].expn;
- mant = tccp->stepsizes[bandno].mant;
-
- if (tccp->qntsty == J3D_CCP_QNTSTY_NOQNT) {
- cio_write(cio, expn << 3, 1); /* SPqcx_i */
- } else {
- cio_write(cio, (expn << 11) + mant, 2); /* SPqcx_i */
- }
- }
-}
-
-static void j3d_read_qcx(opj_j3d_t *j3d, int compno, int len)
-{
- int tmp;
- int bandno, numbands;
-
- opj_cp_t *cp = j3d->cp;
- opj_tcp_t *tcp = j3d->state == J3D_STATE_TPH ? &cp->tcps[j3d->curtileno] :
- j3d->default_tcp;
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_cio_t *cio = j3d->cio;
-
- tmp = cio_read(cio, 1); /* Sqcx */
- tccp->qntsty = tmp & 0x1f;
- tccp->numgbits = tmp >> 5;
-
- /*Numbands = 1 si SIQNT
- len - 1 si NOQNT
- (len - 1) / 2 si SEQNT */
- numbands = tccp->qntsty == J3D_CCP_QNTSTY_SIQNT ? 1 : ((
- tccp->qntsty == J3D_CCP_QNTSTY_NOQNT) ? len - 1 : (len - 1) / 2);
-
- for (bandno = 0; bandno < numbands; bandno++) {
- int expn, mant;
- if (tccp->qntsty == J3D_CCP_QNTSTY_NOQNT) {
- expn = cio_read(cio, 1) >> 3; /* SPqcx_i */
- mant = 0;
- } else {
- tmp = cio_read(cio, 2); /* SPqcx_i */
- expn = tmp >> 11;
- mant = tmp & 0x7ff;
- }
- tccp->stepsizes[bandno].expn = expn;
- tccp->stepsizes[bandno].mant = mant;
- }
-
- /* Add Antonin : if scalar_derived -> compute other stepsizes */
- if (tccp->qntsty == J3D_CCP_QNTSTY_SIQNT) {
- for (bandno = 1; bandno < J3D_MAXBANDS; bandno++) {
- int numbands = (cp->transform_format == TRF_2D_DWT) ? 3 : 7;
- tccp->stepsizes[bandno].expn = tccp->stepsizes[0].expn - ((
- bandno - 1) / numbands);
- tccp->stepsizes[bandno].mant = tccp->stepsizes[0].mant;
- }
- }
- /* ddA */
-}
-
-static void j3d_write_qcd(opj_j3d_t *j3d)
-{
- int lenp, len;
-
- opj_cio_t *cio = j3d->cio;
-
- cio_write(cio, J3D_MS_QCD, 2); /* QCD */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- j3d_write_qcx(j3d, 0); /* Sqcd*/
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lqcd */
- cio_seek(cio, lenp + len);
-}
-
-static void j3d_read_qcd(opj_j3d_t *j3d)
-{
- int len, i, pos;
-
- opj_cio_t *cio = j3d->cio;
- opj_volume_t *volume = j3d->volume;
-
- len = cio_read(cio, 2); /* Lqcd */
- pos = cio_tell(cio);
- for (i = 0; i < volume->numcomps; i++) {
- cio_seek(cio, pos);
- j3d_read_qcx(j3d, i, len - 2);
- }
-}
-
-static void j3d_write_qcc(opj_j3d_t *j3d, int compno)
-{
- int lenp, len;
-
- opj_cio_t *cio = j3d->cio;
-
- cio_write(cio, J3D_MS_QCC, 2); /* QCC */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, compno, j3d->volume->numcomps <= 256 ? 1 : 2); /* Cqcc */
- j3d_write_qcx(j3d, compno);
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lqcc */
- cio_seek(cio, lenp + len);
-}
-
-static void j3d_read_qcc(opj_j3d_t *j3d)
-{
- int len, compno;
- int numcomp = j3d->volume->numcomps;
- opj_cio_t *cio = j3d->cio;
-
- len = cio_read(cio, 2); /* Lqcc */
- compno = cio_read(cio, numcomp <= 256 ? 1 : 2); /* Cqcc */
- j3d_read_qcx(j3d, compno, len - 2 - (numcomp <= 256 ? 1 : 2));
-}
-
-static void j3d_write_poc(opj_j3d_t *j3d)
-{
- int len, numpchgs, i;
-
- int numcomps = j3d->volume->numcomps;
-
- opj_cp_t *cp = j3d->cp;
- opj_tcp_t *tcp = &cp->tcps[j3d->curtileno];
- opj_tccp_t *tccp = &tcp->tccps[0];
- opj_cio_t *cio = j3d->cio;
-
- numpchgs = tcp->numpocs;
- cio_write(cio, J3D_MS_POC, 2); /* POC */
- len = 2 + (5 + 2 * (numcomps <= 256 ? 1 : 2)) * numpchgs;
- cio_write(cio, len, 2); /* Lpoc */
- for (i = 0; i < numpchgs; i++) {
- opj_poc_t *poc = &tcp->pocs[i];
- cio_write(cio, poc->resno0, 1); /* RSpoc_i */
- cio_write(cio, poc->compno0, (numcomps <= 256 ? 1 : 2)); /* CSpoc_i */
- cio_write(cio, poc->layno1, 2); /* LYEpoc_i */
- poc->layno1 = int_min(poc->layno1, tcp->numlayers);
- cio_write(cio, poc->resno1, 1); /* REpoc_i */
- poc->resno1 = int_min(poc->resno1, tccp->numresolution[0]);
- cio_write(cio, poc->compno1, (numcomps <= 256 ? 1 : 2)); /* CEpoc_i */
- poc->compno1 = int_min(poc->compno1, numcomps);
- cio_write(cio, poc->prg, 1); /* Ppoc_i */
- }
-}
-
-static void j3d_read_poc(opj_j3d_t *j3d)
-{
- int len, numpchgs, i, old_poc;
-
- int numcomps = j3d->volume->numcomps;
-
- opj_cp_t *cp = j3d->cp;
- opj_tcp_t *tcp = j3d->state == J3D_STATE_TPH ? &cp->tcps[j3d->curtileno] :
- j3d->default_tcp;
- opj_tccp_t *tccp = &tcp->tccps[0];
- opj_cio_t *cio = j3d->cio;
-
- old_poc = tcp->POC ? tcp->numpocs + 1 : 0;
- tcp->POC = 1;
- len = cio_read(cio, 2); /* Lpoc */
- numpchgs = (len - 2) / (5 + 2 * (numcomps <= 256 ? 1 : 2));
-
- for (i = old_poc; i < numpchgs + old_poc; i++) {
- opj_poc_t *poc;
- poc = &tcp->pocs[i];
- poc->resno0 = cio_read(cio, 1); /* RSpoc_i */
- poc->compno0 = cio_read(cio, numcomps <= 256 ? 1 : 2); /* CSpoc_i */
- poc->layno1 = int_min(cio_read(cio, 2),
- (unsigned int) tcp->numlayers); /* LYEpoc_i */
- poc->resno1 = int_min(cio_read(cio, 1),
- (unsigned int) tccp->numresolution[0]); /* REpoc_i */
- poc->compno1 = int_min(
- cio_read(cio, numcomps <= 256 ? 1 : 2),
- (unsigned int) numcomps); /* CEpoc_i */
- poc->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* Ppoc_i */
- }
-
- tcp->numpocs = numpchgs + old_poc - 1;
-}
-
-static void j3d_read_crg(opj_j3d_t *j3d)
-{
- int len, i, Xcrg_i, Ycrg_i, Zcrg_i;
-
- opj_cio_t *cio = j3d->cio;
- int numcomps = j3d->volume->numcomps;
-
- len = cio_read(cio, 2); /* Lcrg */
- for (i = 0; i < numcomps; i++) {
- Xcrg_i = cio_read(cio, 2); /* Xcrg_i */
- Ycrg_i = cio_read(cio, 2); /* Ycrg_i */
- Zcrg_i = cio_read(cio, 2); /* Zcrg_i */
- }
-}
-
-static void j3d_read_tlm(opj_j3d_t *j3d)
-{
- int len, Ztlm, Stlm, ST, SP, tile_tlm, i;
- long int Ttlm_i, Ptlm_i;
-
- opj_cio_t *cio = j3d->cio;
-
- len = cio_read(cio, 2); /* Ltlm */
- Ztlm = cio_read(cio, 1); /* Ztlm */
- Stlm = cio_read(cio, 1); /* Stlm */
- ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
- SP = (Stlm >> 6) & 0x01;
- tile_tlm = (len - 4) / ((SP + 1) * 2 + ST);
- for (i = 0; i < tile_tlm; i++) {
- Ttlm_i = cio_read(cio, ST); /* Ttlm_i */
- Ptlm_i = cio_read(cio, SP ? 4 : 2); /* Ptlm_i */
- }
-}
-
-static void j3d_read_plm(opj_j3d_t *j3d)
-{
- int len, i, Zplm, Nplm, add, packet_len = 0;
-
- opj_cio_t *cio = j3d->cio;
-
- len = cio_read(cio, 2); /* Lplm */
- Zplm = cio_read(cio, 1); /* Zplm */
- len -= 3;
- while (len > 0) {
- Nplm = cio_read(cio, 4); /* Nplm */
- len -= 4;
- for (i = Nplm; i > 0; i--) {
- add = cio_read(cio, 1);
- len--;
- packet_len = (packet_len << 7) + add; /* Iplm_ij */
- if ((add & 0x80) == 0) {
- /* New packet */
- packet_len = 0;
- }
- if (len <= 0) {
- break;
- }
- }
- }
-}
-
-static void j3d_read_plt(opj_j3d_t *j3d)
-{
- int len, i, Zplt, packet_len = 0, add;
-
- opj_cio_t *cio = j3d->cio;
-
- len = cio_read(cio, 2); /* Lplt */
- Zplt = cio_read(cio, 1); /* Zplt */
- for (i = len - 3; i > 0; i--) {
- add = cio_read(cio, 1);
- packet_len = (packet_len << 7) + add; /* Iplt_i */
- if ((add & 0x80) == 0) {
- /* New packet */
- packet_len = 0;
- }
- }
-}
-
-static void j3d_read_ppm(opj_j3d_t *j3d)
-{
- int len, Z_ppm, i, j;
- int N_ppm;
-
- opj_cp_t *cp = j3d->cp;
- opj_cio_t *cio = j3d->cio;
-
- len = cio_read(cio, 2);
- cp->ppm = 1;
-
- Z_ppm = cio_read(cio, 1); /* Z_ppm */
- len -= 3;
- while (len > 0) {
- if (cp->ppm_previous == 0) {
- N_ppm = cio_read(cio, 4); /* N_ppm */
- len -= 4;
- } else {
- N_ppm = cp->ppm_previous;
- }
- j = cp->ppm_store;
- if (Z_ppm == 0) { /* First PPM marker */
- cp->ppm_data = (unsigned char *) opj_malloc(N_ppm * sizeof(unsigned char));
- cp->ppm_data_first = cp->ppm_data;
- cp->ppm_len = N_ppm;
- } else { /* NON-first PPM marker */
- cp->ppm_data = (unsigned char *) opj_realloc(cp->ppm_data,
- (N_ppm + cp->ppm_store) * sizeof(unsigned char));
- cp->ppm_data_first = cp->ppm_data;
- cp->ppm_len = N_ppm + cp->ppm_store;
- }
- for (i = N_ppm; i > 0; i--) { /* Read packet header */
- cp->ppm_data[j] = cio_read(cio, 1);
- j++;
- len--;
- if (len == 0) {
- break; /* Case of non-finished packet header in present marker but finished in next one */
- }
- }
- cp->ppm_previous = i - 1;
- cp->ppm_store = j;
- }
-}
-
-static void j3d_read_ppt(opj_j3d_t *j3d)
-{
- int len, Z_ppt, i, j = 0;
-
- opj_cp_t *cp = j3d->cp;
- opj_tcp_t *tcp = cp->tcps + j3d->curtileno;
- opj_cio_t *cio = j3d->cio;
-
- len = cio_read(cio, 2);
- Z_ppt = cio_read(cio, 1);
- tcp->ppt = 1;
- if (Z_ppt == 0) { /* First PPT marker */
- tcp->ppt_data = (unsigned char *) opj_malloc((len - 3) * sizeof(unsigned char));
- tcp->ppt_data_first = tcp->ppt_data;
- tcp->ppt_store = 0;
- tcp->ppt_len = len - 3;
- } else { /* NON-first PPT marker */
- tcp->ppt_data = (unsigned char *) opj_realloc(tcp->ppt_data,
- (len - 3 + tcp->ppt_store) * sizeof(unsigned char));
- tcp->ppt_data_first = tcp->ppt_data;
- tcp->ppt_len = len - 3 + tcp->ppt_store;
- }
- j = tcp->ppt_store;
- for (i = len - 3; i > 0; i--) {
- tcp->ppt_data[j] = cio_read(cio, 1);
- j++;
- }
- tcp->ppt_store = j;
-}
-
-static void j3d_write_sot(opj_j3d_t *j3d)
-{
- int lenp, len;
-
- opj_cio_t *cio = j3d->cio;
-
- j3d->sot_start = cio_tell(cio);
- cio_write(cio, J3D_MS_SOT, 2); /* SOT */
- lenp = cio_tell(cio);
- cio_skip(cio, 2); /* Lsot (further) */
- cio_write(cio, j3d->curtileno, 2); /* Isot */
- cio_skip(cio, 4); /* Psot (further in j3d_write_sod) */
- cio_write(cio, 0, 1); /* TPsot */
- cio_write(cio, 1,
- 1); /* TNsot (no of tile-parts of this tile in this codestream)*/
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lsot */
- cio_seek(cio, lenp + len);
-}
-
-static void j3d_read_sot(opj_j3d_t *j3d)
-{
- int len, tileno, totlen, partno, numparts, i;
- opj_tcp_t *tcp = NULL;
- char status = 0;
-
- opj_cp_t *cp = j3d->cp;
- opj_cio_t *cio = j3d->cio;
-
- len = cio_read(cio, 2);
- tileno = cio_read(cio, 2);
-
- if (cp->tileno_size == 0) {
- cp->tileno[cp->tileno_size] = tileno;
- cp->tileno_size++;
- } else {
- i = 0;
- while (i < cp->tileno_size && status == 0) {
- status = cp->tileno[i] == tileno ? 1 : 0;
- i++;
- }
- if (status == 0) {
- cp->tileno[cp->tileno_size] = tileno;
- cp->tileno_size++;
- }
- }
-
- totlen = cio_read(cio, 4);
- if (!totlen) {
- totlen = cio_numbytesleft(cio) + 8;
- }
-
- partno = cio_read(cio, 1);
- numparts = cio_read(cio, 1);
-
- j3d->curtileno = tileno;
- j3d->eot = cio_getbp(cio) - 12 + totlen;
- j3d->state = J3D_STATE_TPH;
- tcp = &cp->tcps[j3d->curtileno];
-
- if (tcp->first == 1) {
-
- /* Initialization PPT */
- opj_tccp_t *tmp = tcp->tccps;
- memcpy(tcp, j3d->default_tcp, sizeof(opj_tcp_t));
- tcp->ppt = 0;
- tcp->ppt_data = NULL;
- tcp->ppt_data_first = NULL;
- tcp->tccps = tmp;
-
- for (i = 0; i < j3d->volume->numcomps; i++) {
- tcp->tccps[i] = j3d->default_tcp->tccps[i];
- }
- cp->tcps[j3d->curtileno].first = 0;
- }
-}
-
-static void j3d_write_sod(opj_j3d_t *j3d, void *tile_coder)
-{
- int l, layno;
- int totlen;
- opj_tcp_t *tcp = NULL;
- opj_volume_info_t *volume_info = NULL;
-
- opj_tcd_t *tcd = (opj_tcd_t*)
- tile_coder; /* cast is needed because of conflicts in header inclusions */
- opj_cp_t *cp = j3d->cp;
- opj_cio_t *cio = j3d->cio;
-
- cio_write(cio, J3D_MS_SOD, 2);
- if (j3d->curtileno == 0) {
- j3d->sod_start = cio_tell(cio) + j3d->pos_correction;
- }
-
- /* INDEX >> */
- volume_info = j3d->volume_info;
- if (volume_info && volume_info->index_on) {
- volume_info->tile[j3d->curtileno].end_header = cio_tell(
- cio) + j3d->pos_correction - 1;
- }
- /* << INDEX */
-
- tcp = &cp->tcps[j3d->curtileno];
- for (layno = 0; layno < tcp->numlayers; layno++) {
- tcp->rates[layno] -= tcp->rates[layno] ? (j3d->sod_start /
- (cp->th * cp->tw * cp->tl)) : 0;
- }
-
- if (volume_info) {
- volume_info->num = 0;
- }
-
- l = tcd_encode_tile(tcd, j3d->curtileno, cio_getbp(cio),
- cio_numbytesleft(cio) - 2, volume_info);
-
- /* Writing Psot in SOT marker */
- totlen = cio_tell(cio) + l - j3d->sot_start;
- cio_seek(cio, j3d->sot_start + 6);
- cio_write(cio, totlen, 4);
- cio_seek(cio, j3d->sot_start + totlen);
-}
-
-static void j3d_read_sod(opj_j3d_t *j3d)
-{
- int len, truncate = 0, i;
- unsigned char *data = NULL, *data_ptr = NULL;
-
- opj_cio_t *cio = j3d->cio;
- int curtileno = j3d->curtileno;
-
- len = int_min(j3d->eot - cio_getbp(cio), cio_numbytesleft(cio) + 1);
-
- if (len == cio_numbytesleft(cio) + 1) {
- truncate = 1; /* Case of a truncate codestream */
- }
-
- data = (unsigned char *) opj_malloc((j3d->tile_len[curtileno] + len) * sizeof(
- unsigned char));
-
- for (i = 0; i < j3d->tile_len[curtileno]; i++) {
- data[i] = j3d->tile_data[curtileno][i];
- }
-
- data_ptr = data + j3d->tile_len[curtileno];
- for (i = 0; i < len; i++) {
- data_ptr[i] = cio_read(cio, 1);
- }
-
- j3d->tile_len[curtileno] += len;
- opj_free(j3d->tile_data[curtileno]);
- j3d->tile_data[curtileno] = data;
-
- if (!truncate) {
- j3d->state = J3D_STATE_TPHSOT;
- } else {
- j3d->state = J3D_STATE_NEOC; /* RAJOUTE !! */
- }
-}
-
-static void j3d_write_rgn(opj_j3d_t *j3d, int compno, int tileno)
-{
-
- opj_cp_t *cp = j3d->cp;
- opj_tcp_t *tcp = &cp->tcps[tileno];
- opj_cio_t *cio = j3d->cio;
- int numcomps = j3d->volume->numcomps;
-
- cio_write(cio, J3D_MS_RGN, 2); /* RGN */
- cio_write(cio, numcomps <= 256 ? 5 : 6, 2); /* Lrgn */
- cio_write(cio, compno, numcomps <= 256 ? 1 : 2); /* Crgn */
- cio_write(cio, 0, 1); /* Srgn */
- cio_write(cio, tcp->tccps[compno].roishift, 1); /* SPrgn */
-}
-
-static void j3d_read_rgn(opj_j3d_t *j3d)
-{
- int len, compno, roisty;
-
- opj_cp_t *cp = j3d->cp;
- opj_tcp_t *tcp = j3d->state == J3D_STATE_TPH ? &cp->tcps[j3d->curtileno] :
- j3d->default_tcp;
- opj_cio_t *cio = j3d->cio;
- int numcomps = j3d->volume->numcomps;
-
- len = cio_read(cio, 2); /* Lrgn */
- compno = cio_read(cio, numcomps <= 256 ? 1 : 2); /* Crgn */
- roisty = cio_read(cio, 1); /* Srgn */
- tcp->tccps[compno].roishift = cio_read(cio, 1); /* SPrgn */
-}
-
-static void j3d_write_eoc(opj_j3d_t *j3d)
-{
- opj_cio_t *cio = j3d->cio;
- /* opj_event_msg(j3d->cinfo, "%.8x: EOC\n", cio_tell(cio) + j3d->pos_correction); */
- cio_write(cio, J3D_MS_EOC, 2);
-}
-
-static void j3d_read_eoc(opj_j3d_t *j3d)
-{
- int i, tileno;
-
-#ifndef NO_PACKETS_DECODING
- opj_tcd_t *tcd = tcd_create(j3d->cinfo);
- tcd_malloc_decode(tcd, j3d->volume, j3d->cp);
- /*j3d_dump_volume(stdout, tcd->volume);
- j3d_dump_cp(stdout, tcd->volume, tcd->cp);*/
- for (i = 0; i < j3d->cp->tileno_size; i++) {
- tileno = j3d->cp->tileno[i];
- /*opj_event_msg(j3d->cinfo, EVT_INFO, "tcd_decode_tile \n");*/
- tcd_decode_tile(tcd, j3d->tile_data[tileno], j3d->tile_len[tileno], tileno);
- opj_free(j3d->tile_data[tileno]);
- j3d->tile_data[tileno] = NULL;
- }
- tcd_free_decode(tcd);
- tcd_destroy(tcd);
-#else
- for (i = 0; i < j3d->cp->tileno_size; i++) {
- tileno = j3d->cp->tileno[i];
- opj_free(j3d->tile_data[tileno]);
- j3d->tile_data[tileno] = NULL;
- }
-#endif
-
- j3d->state = J3D_STATE_MT;
-}
-
-static void j3d_read_unk(opj_j3d_t *j3d)
-{
- opj_event_msg(j3d->cinfo, EVT_WARNING, "Unknown marker\n");
-}
-
-static opj_atk_t atk_info_wt[] = {
- {0, 1, J3D_ATK_WS, J3D_ATK_IRR, 0, J3D_ATK_WS, 1.230174104, 4, {0}, {0}, {0}, {1, 1, 1, 1}, {-1.586134342059924, -0.052980118572961, 0.882911075530934, 0.443506852043971}}, /* WT 9-7 IRR*/
- {1, 0, J3D_ATK_WS, J3D_ATK_REV, 0, J3D_ATK_WS, 0, 2, {0}, {1, 2}, {1, 2}, {1, 1}, {-1.0, 1.0}}, /* WT 5-3 REV*/
- {2, 0, J3D_ATK_ARB, J3D_ATK_REV, 0, J3D_ATK_CON, 0, 2, {0, 0}, {0, 1}, {0, 1}, {1, 1}, {{-1.0}, {1.0}}}, /* WT 2-2 REV*/
- {3, 0, J3D_ATK_ARB, J3D_ATK_REV, 1, J3D_ATK_CON, 0, 3, {0, 0, -1}, {0, 1, 2}, {0, 1, 2}, {1, 1, 3}, {{-1.0}, {1.0}, {1.0, 0.0, -1.0}}}, /* WT 2-6 REV*/
- {4, 0, J3D_ATK_ARB, J3D_ATK_REV, 1, J3D_ATK_CON, 0, 3, {0, 0, -2}, {0, 1, 6}, {0, 1, 32}, {1, 1, 5}, {{-1}, {1}, {-3.0, 22.0, 0.0, -22.0, 3.0}}}, /* WT 2-10 REV*/
- {5, 1, J3D_ATK_ARB, J3D_ATK_IRR, 1, J3D_ATK_WS, 1, 7, {0}, {0}, {0}, {1, 1, 2, 1, 2, 1, 3}, {{-1}, {1.58613434206}, {-0.460348209828, 0.460348209828}, {0.25}, {0.374213867768, -0.374213867768}, {-1.33613434206}, {0.29306717103, 0, -0.29306717103}}}, /* WT 6-10 IRR*/
- {
- 6, 1, J3D_ATK_ARB, J3D_ATK_IRR, 0, J3D_ATK_WS, 1, 11, {0}, {0}, {0}, {1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 5}, {{-1}, {0, 99715069105}, {-1.00573127827, 1.00573127827}, {-0.27040357631}, {2.20509972343, -2.20509972343}, {0.08059995736},
- {-1.62682532350, 1.62682532350}, {0.52040357631}, {0.60404664250, -0.60404664250}, {-0.82775064841}, {-0.06615812964, 0.29402137720, 0, -0.29402137720, 0.06615812964}
- }
- }, /* WT 10-18 IRR*/
- {7, 1, J3D_ATK_WS, J3D_ATK_IRR, 0, J3D_ATK_WS, 1, 2, {0}, {0}, {0}, {1, 1}, {-0.5, 0.25}}, /* WT 5-3 IRR*/
- {8, 0, J3D_ATK_WS, J3D_ATK_REV, 0, J3D_ATK_WS, 0, 2, {0}, {4, 4}, {8, 8}, {2, 2}, {{-9, 1}, {5, -1}}} /* WT 13-7 REV*/
-};
-
-typedef struct opj_dec_mstabent {
- /** marker value */
- int id;
- /** value of the state when the marker can appear */
- int states;
- /** action linked to the marker */
- void (*handler)(opj_j3d_t *j3d);
-} opj_dec_mstabent_t;
-
-opj_dec_mstabent_t j3d_dec_mstab[] = {
- {J3D_MS_SOC, J3D_STATE_MHSOC, j3d_read_soc},
- {J3D_MS_SOT, J3D_STATE_MH | J3D_STATE_TPHSOT, j3d_read_sot},
- {J3D_MS_SOD, J3D_STATE_TPH, j3d_read_sod},
- {J3D_MS_EOC, J3D_STATE_TPHSOT, j3d_read_eoc},
- {J3D_MS_CAP, J3D_STATE_MHSIZ, j3d_read_cap},
- {J3D_MS_SIZ, J3D_STATE_MHSIZ, j3d_read_siz},
- {J3D_MS_NSI, J3D_STATE_MHSIZ, j3d_read_nsi},
- {J3D_MS_COD, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_cod},
- {J3D_MS_COC, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_coc},
- {J3D_MS_RGN, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_rgn},
- {J3D_MS_QCD, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_qcd},
- {J3D_MS_QCC, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_qcc},
- {J3D_MS_POC, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_poc},
- {J3D_MS_TLM, J3D_STATE_MH, j3d_read_tlm},
- {J3D_MS_PLM, J3D_STATE_MH, j3d_read_plm},
- {J3D_MS_PLT, J3D_STATE_TPH, j3d_read_plt},
- {J3D_MS_PPM, J3D_STATE_MH, j3d_read_ppm},
- {J3D_MS_PPT, J3D_STATE_TPH, j3d_read_ppt},
- {J3D_MS_SOP, 0, 0},
- {J3D_MS_CRG, J3D_STATE_MH, j3d_read_crg},
- {J3D_MS_COM, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_com},
- {J3D_MS_DCO, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_dco},
- {J3D_MS_ATK, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_atk},
- {0, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_unk}
- /*, -->must define the j3d_read functions
- {J3D_MS_CBD, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_cbd},
- {J3D_MS_MCT, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_mct},
- {J3D_MS_MCC, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_mcc},
- {J3D_MS_MCO, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_mco},
- {J3D_MS_NLT, J3D_STATE_MH | J3D_STATE_TPH, j3d_read_nlt},
- {J3D_MS_VMS, J3D_STATE_MH, j3d_read_vms},
- {J3D_MS_DFS, J3D_STATE_MH, j3d_read_dfs},
- {J3D_MS_ADS, J3D_STATE_MH, j3d_read_ads},
- {J3D_MS_QPD, J3D_STATE_MH, j3d_read_qpd},
- {J3D_MS_QPC, J3D_STATE_TPH, j3d_read_qpc}*/
-};
-
-/**
-Read the lookup table containing all the marker, status and action
-@param id Marker value
-*/
-static opj_dec_mstabent_t *j3d_dec_mstab_lookup(int id)
-{
- opj_dec_mstabent_t *e;
- for (e = j3d_dec_mstab; e->id != 0; e++) {
- if (e->id == id) {
- break;
- }
- }
- return e;
-}
-
-/* ----------------------------------------------------------------------- */
-/* J3D / JPT decoder interface */
-/* ----------------------------------------------------------------------- */
-
-opj_j3d_t* j3d_create_decompress(opj_common_ptr cinfo)
-{
- opj_j3d_t *j3d = (opj_j3d_t*)opj_malloc(sizeof(opj_j3d_t));
- if (j3d) {
- j3d->cinfo = cinfo;
- j3d->default_tcp = (opj_tcp_t*)opj_malloc(sizeof(opj_tcp_t));
- if (!j3d->default_tcp) {
- opj_free(j3d);
- return NULL;
- }
- }
- return j3d;
-}
-
-void j3d_destroy_decompress(opj_j3d_t *j3d)
-{
- int i = 0;
-
- if (j3d->tile_len != NULL) {
- opj_free(j3d->tile_len);
- }
- if (j3d->tile_data != NULL) {
- opj_free(j3d->tile_data);
- }
- if (j3d->default_tcp != NULL) {
- opj_tcp_t *default_tcp = j3d->default_tcp;
- if (default_tcp->ppt_data_first != NULL) {
- opj_free(default_tcp->ppt_data_first);
- }
- if (j3d->default_tcp->tccps != NULL) {
- opj_free(j3d->default_tcp->tccps);
- }
- opj_free(j3d->default_tcp);
- }
- if (j3d->cp != NULL) {
- opj_cp_t *cp = j3d->cp;
- if (cp->tcps != NULL) {
- for (i = 0; i < cp->tw * cp->th * cp->tl; i++) {
- if (cp->tcps[i].ppt_data_first != NULL) {
- opj_free(cp->tcps[i].ppt_data_first);
- }
- if (cp->tcps[i].tccps != NULL) {
- opj_free(cp->tcps[i].tccps);
- }
- }
- opj_free(cp->tcps);
- }
- if (cp->ppm_data_first != NULL) {
- opj_free(cp->ppm_data_first);
- }
- if (cp->tileno != NULL) {
- opj_free(cp->tileno);
- }
- if (cp->comment != NULL) {
- opj_free(cp->comment);
- }
-
- opj_free(cp);
- }
-
- opj_free(j3d);
-}
-
-void j3d_setup_decoder(opj_j3d_t *j3d, opj_dparameters_t *parameters)
-{
- if (j3d && parameters) {
- /* create and initialize the coding parameters structure */
- opj_cp_t *cp = (opj_cp_t*)opj_malloc(sizeof(opj_cp_t));
- cp->reduce[0] = parameters->cp_reduce[0];
- cp->reduce[1] = parameters->cp_reduce[1];
- cp->reduce[2] = parameters->cp_reduce[2];
- cp->layer = parameters->cp_layer;
- cp->bigendian = parameters->bigendian;
-
- /* MM: Settings of the following two member variables would take
- place during j3d_read_com. FIXME */
- cp->encoding_format = ENCOD_3EB;
- cp->transform_format = TRF_2D_DWT;
-
- /* keep a link to cp so that we can destroy it later in j3d_destroy_decompress */
- j3d->cp = cp;
- }
-}
-
-opj_volume_t* j3d_decode(opj_j3d_t *j3d, opj_cio_t *cio)
-{
- opj_volume_t *volume = NULL;
-
- opj_common_ptr cinfo = j3d->cinfo;
-
- j3d->cio = cio;
-
- /* create an empty volume */
- volume = (opj_volume_t*)opj_malloc(sizeof(opj_volume_t));
- j3d->volume = volume;
-
- j3d->state = J3D_STATE_MHSOC;
-
- for (;;) {
- opj_dec_mstabent_t *e;
- int id = cio_read(cio, 2);
- if (id >> 8 != 0xff) {
- opj_volume_destroy(volume);
- opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n",
- cio_tell(cio) - 2, id);
- return 0;
- }
- e = j3d_dec_mstab_lookup(id);
- /*opj_event_msg(cinfo, EVT_INFO, "MARKER %x PREVSTATE %d E->STATE %d\n",e->id,j3d->state,e->states);*/
- if (!(j3d->state & e->states)) {
- opj_volume_destroy(volume);
- opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n",
- cio_tell(cio) - 2, id);
- return 0;
- }
- if (e->handler) {
- (*e->handler)(j3d);
- }
- /*opj_event_msg(cinfo, EVT_INFO, "POSTSTATE %d\n",j3d->state);*/
- if (j3d->state == J3D_STATE_MT) {
- break;
- }
- if (j3d->state == J3D_STATE_NEOC) {
- break;
- }
- }
- if (j3d->state == J3D_STATE_NEOC) {
- j3d_read_eoc(j3d);
- }
-
- if (j3d->state != J3D_STATE_MT) {
- opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n");
- }
-
- return volume;
-}
-
-/* ----------------------------------------------------------------------- */
-/* J3D encoder interface */
-/* ----------------------------------------------------------------------- */
-
-opj_j3d_t* j3d_create_compress(opj_common_ptr cinfo)
-{
- opj_j3d_t *j3d = (opj_j3d_t*)opj_malloc(sizeof(opj_j3d_t));
- if (j3d) {
- j3d->cinfo = cinfo;
- }
- return j3d;
-}
-
-void j3d_destroy_compress(opj_j3d_t *j3d)
-{
- int tileno;
-
- if (!j3d) {
- return;
- }
-
- if (j3d->volume_info != NULL) {
- opj_volume_info_t *volume_info = j3d->volume_info;
- if (volume_info->index_on && j3d->cp) {
- opj_cp_t *cp = j3d->cp;
- for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
- opj_tile_info_t *tile_info = &volume_info->tile[tileno];
- opj_free(tile_info->thresh);
- opj_free(tile_info->packet);
- }
- opj_free(volume_info->tile);
- }
- opj_free(volume_info);
- }
- if (j3d->cp != NULL) {
- opj_cp_t *cp = j3d->cp;
-
- if (cp->comment) {
- opj_free(cp->comment);
- }
- if (cp->matrice) {
- opj_free(cp->matrice);
- }
- for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
- opj_free(cp->tcps[tileno].tccps);
- }
- opj_free(cp->tcps);
- opj_free(cp);
- }
-
- opj_free(j3d);
-}
-
-void j3d_setup_encoder(opj_j3d_t *j3d, opj_cparameters_t *parameters,
- opj_volume_t *volume)
-{
- int i, j, tileno, numpocs_tile;
- opj_cp_t *cp = NULL;
-
- if (!j3d || !parameters || ! volume) {
- return;
- }
-
- /* create and initialize the coding parameters structure */
- cp = (opj_cp_t*)opj_malloc(sizeof(opj_cp_t));
-
- /* keep a link to cp so that we can destroy it later in j3d_destroy_compress */
- j3d->cp = cp;
-
- /* set default values for cp */
- cp->tw = 1;
- cp->th = 1;
- cp->tl = 1;
-
- /* copy user encoding parameters */
- cp->disto_alloc = parameters->cp_disto_alloc;
- cp->fixed_alloc = parameters->cp_fixed_alloc;
- cp->fixed_quality = parameters->cp_fixed_quality;
-
- /* transform and coding method */
- cp->transform_format = parameters->transform_format;
- cp->encoding_format = parameters->encoding_format;
-
- /* mod fixed_quality */
- if (parameters->cp_matrice) {
- size_t array_size = parameters->tcp_numlayers * 3 * parameters->numresolution[0]
- * sizeof(int);
- cp->matrice = (int *) opj_malloc(array_size);
- memcpy(cp->matrice, parameters->cp_matrice, array_size);
- }
-
- /* creation of an index file ? */
- cp->index_on = parameters->index_on;
- if (cp->index_on) {
- j3d->volume_info = (opj_volume_info_t*)opj_malloc(sizeof(opj_volume_info_t));
- }
-
- /* tiles */
- cp->tdx = parameters->cp_tdx;
- cp->tdy = parameters->cp_tdy;
- cp->tdz = parameters->cp_tdz;
- /* tile offset */
- cp->tx0 = parameters->cp_tx0;
- cp->ty0 = parameters->cp_ty0;
- cp->tz0 = parameters->cp_tz0;
- /* comment string */
- if (parameters->cp_comment) {
- cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1);
- if (cp->comment) {
- strcpy(cp->comment, parameters->cp_comment);
- }
- }
-
- /*calculate other encoding parameters*/
- if (parameters->tile_size_on) {
- cp->tw = int_ceildiv(volume->x1 - cp->tx0, cp->tdx);
- cp->th = int_ceildiv(volume->y1 - cp->ty0, cp->tdy);
- cp->tl = int_ceildiv(volume->z1 - cp->tz0, cp->tdz);
- } else {
- cp->tdx = volume->x1 - cp->tx0;
- cp->tdy = volume->y1 - cp->ty0;
- cp->tdz = volume->z1 - cp->tz0;
- }
-
- /* initialize the multiple tiles */
- /* ---------------------------- */
- cp->tcps = (opj_tcp_t *) opj_malloc(cp->tw * cp->th * cp->tl * sizeof(
- opj_tcp_t));
-
- for (tileno = 0; tileno < cp->tw * cp->th * cp->tl; tileno++) {
- opj_tcp_t *tcp = &cp->tcps[tileno];
- tcp->numlayers = parameters->tcp_numlayers;
- for (j = 0; j < tcp->numlayers; j++) {
- if (cp->fixed_quality) { /* add fixed_quality */
- tcp->distoratio[j] = parameters->tcp_distoratio[j];
- } else {
- tcp->rates[j] = parameters->tcp_rates[j];
- }
- }
- tcp->csty = parameters->csty;
- tcp->prg = parameters->prog_order;
- tcp->mct = volume->numcomps == 3 ? 1 : 0;
-
- numpocs_tile = 0;
- tcp->POC = 0;
- if (parameters->numpocs) {
- /* initialisation of POC */
- tcp->POC = 1;
- for (i = 0; i < parameters->numpocs; i++) {
- if ((tileno == parameters->POC[i].tile - 1) ||
- (parameters->POC[i].tile == -1)) {
- opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
- tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0;
- tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0;
- tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1;
- tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1;
- tcp_poc->compno1 = parameters->POC[numpocs_tile].compno1;
- tcp_poc->prg = parameters->POC[numpocs_tile].prg;
- tcp_poc->tile = parameters->POC[numpocs_tile].tile;
- numpocs_tile++;
- }
- }
- }
- tcp->numpocs = numpocs_tile;
-
- tcp->tccps = (opj_tccp_t *) opj_malloc(volume->numcomps * sizeof(opj_tccp_t));
-
- for (i = 0; i < volume->numcomps; i++) {
- opj_tccp_t *tccp = &tcp->tccps[i];
- tccp->csty = parameters->csty &
- J3D_CCP_CSTY_PRT; /* 0 => standard precint || 1 => custom-defined precinct */
- tccp->numresolution[0] = parameters->numresolution[0];
- tccp->numresolution[1] = parameters->numresolution[1];
- tccp->numresolution[2] = parameters->numresolution[2];
- assert(parameters->cblock_init[0] <= T1_MAXCBLKW);
- assert(parameters->cblock_init[0] >= T1_MINCBLKW);
- assert(parameters->cblock_init[1] <= T1_MAXCBLKH);
- assert(parameters->cblock_init[1] >= T1_MINCBLKH);
- assert(parameters->cblock_init[2] <= T1_MAXCBLKD);
- assert(parameters->cblock_init[2] >= T1_MINCBLKD);
- tccp->cblk[0] = int_floorlog2(parameters->cblock_init[0]);
- tccp->cblk[1] = int_floorlog2(parameters->cblock_init[1]);
- tccp->cblk[2] = int_floorlog2(parameters->cblock_init[2]);
- assert(tccp->cblk[0] + tccp->cblk[1] + tccp->cblk[1] <= T1_MAXWHD);
- tccp->cblksty = parameters->mode; /*Codeblock style --> Table A.19 (default 0)*/
-
- /*ATK / transform */
- tccp->reversible = parameters->irreversible ? 0 :
- 1; /* 0 => DWT 9-7 || 1 => DWT 5-3 */
- for (j = 0; j < 3; j++) {
- tccp->dwtid[j] = parameters->irreversible ? 0 :
- 1; /* 0 => DWT 9-7 || 1 => DWT 5-3 */
- }
-
- /* Quantification: SEQNT (Scalar Expounded, value for each subband) / NOQNT (no quant)*/
- tccp->qntsty = parameters->irreversible ? J3D_CCP_QNTSTY_SEQNT :
- J3D_CCP_QNTSTY_NOQNT;
- tccp->numgbits = 2;
- if (i == parameters->roi_compno) {
- tccp->roishift = parameters->roi_shift;
- } else {
- tccp->roishift = 0;
- }
- /* Custom defined precints */
- if (parameters->csty & J3D_CCP_CSTY_PRT) {
- int k;
- for (k = 0; k < 3; k++) {
- int p = 0;
- for (j = tccp->numresolution[k] - 1; j >= 0; j--) {
- if (p < parameters->res_spec) {/* p < number of precinct size specifications */
- if (parameters->prct_init[k][p] < 1) {
- tccp->prctsiz[k][j] = 1;
- } else {
- tccp->prctsiz[k][j] = int_floorlog2(parameters->prct_init[k][p]);
- }
- } else {
- int res_spec = parameters->res_spec;
- int size_prct = parameters->prct_init[k][res_spec - 1] >> (p - (res_spec - 1));
- if (size_prct < 1) {
- tccp->prctsiz[k][j] = 1;
- } else {
- tccp->prctsiz[k][j] = int_floorlog2(size_prct);
- }
- }
- }
- p++;
- }
- } else {
- int k;
- for (k = 0; k < 3; k++) {
- for (j = 0; j < tccp->numresolution[k]; j++) {
- tccp->prctsiz[k][j] = 15;
- }
- }
- }
- /*Calcular stepsize for each subband (if NOQNT -->stepsize = 1.0)*/
- dwt_calc_explicit_stepsizes(tccp, volume->comps[i].prec);
- }
- }
-}
-
-/**
-Create an index file
-@param j3d
-@param cio
-@param volume_info
-@param index Index filename
-@return Returns 1 if successful, returns 0 otherwise
-*/
-static int j3d_create_index(opj_j3d_t *j3d, opj_cio_t *cio,
- opj_volume_info_t *volume_info, char *index)
-{
-
- int tileno, compno, layno, resno, precno, pack_nb, x, y, z;
- FILE *stream = NULL;
- double total_disto = 0;
-
- volume_info->codestream_size = cio_tell(cio) +
- j3d->pos_correction; /* Correction 14/4/03 suite rmq de Patrick */
-
- stream = fopen(index, "w");
- if (!stream) {
- opj_event_msg(j3d->cinfo, EVT_ERROR, "failed to open %s for writing\n", index);
- return 0;
- }
-
- fprintf(stream, "w %d\t h %d\t l %d\n", volume_info->volume_w,
- volume_info->volume_h, volume_info->volume_l);
- fprintf(stream, "TRASNFORM\t%d\n", volume_info->transform_format);
- fprintf(stream, "ENTROPY CODING\t%d\n", volume_info->encoding_format);
- fprintf(stream, "PROG\t%d\n", volume_info->prog);
- fprintf(stream, "TILE\tx %d y %d z %d\n", volume_info->tile_x,
- volume_info->tile_y, volume_info->tile_z);
- fprintf(stream, "NOTILE\tx %d y %d z %d\n", volume_info->tw, volume_info->th,
- volume_info->tl);
- fprintf(stream, "COMPONENTS\t%d\n", volume_info->comp);
- fprintf(stream, "LAYER\t%d\n", volume_info->layer);
- fprintf(stream, "RESOLUTIONS\tx %d y %d z %d\n", volume_info->decomposition[0],
- volume_info->decomposition[1], volume_info->decomposition[2]);
-
- fprintf(stream, "Precint sizes for each resolution:\n");
- for (resno = volume_info->decomposition[0]; resno >= 0; resno--) {
- fprintf(stream, "Resno %d \t [%d,%d,%d] \n", resno,
- (1 << volume_info->tile[0].prctsiz[0][resno]),
- (1 << volume_info->tile[0].prctsiz[0][resno]),
- (1 << volume_info->tile[0].prctsiz[2][resno])); /* based on tile 0 */
- }
- fprintf(stream, "HEADER_END\t%d\n", volume_info->main_head_end);
- fprintf(stream, "CODESTREAM\t%d\n", volume_info->codestream_size);
- fprintf(stream,
- "Num_tile Start_pos End_header End_pos Distotile Nbpix Ratio\n");
- for (tileno = 0; tileno < (volume_info->tw * volume_info->th * volume_info->tl);
- tileno++) {
- fprintf(stream, "%4d\t%9d\t%9d\t%9d\t%9e\t%9d\t%9e\n",
- volume_info->tile[tileno].num_tile,
- volume_info->tile[tileno].start_pos,
- volume_info->tile[tileno].end_header,
- volume_info->tile[tileno].end_pos,
- volume_info->tile[tileno].distotile, volume_info->tile[tileno].nbpix,
- volume_info->tile[tileno].distotile / volume_info->tile[tileno].nbpix);
- }
-
- for (tileno = 0; tileno < (volume_info->tw * volume_info->th * volume_info->tl);
- tileno++) {
- int start_pos, end_pos;
- double disto = 0;
- pack_nb = 0;
- if (volume_info->prog == LRCP) { /* LRCP */
- fprintf(stream,
- "pack_nb tileno layno resno compno precno start_pos end_pos disto\n");
- for (layno = 0; layno < volume_info->layer; layno++) {
- for (resno = 0; resno < volume_info->decomposition[0] + 1; resno++) {
- for (compno = 0; compno < volume_info->comp; compno++) {
- int prec_max = volume_info->tile[tileno].prctno[0][resno] *
- volume_info->tile[tileno].prctno[1][resno] *
- volume_info->tile[tileno].prctno[2][resno];
- for (precno = 0; precno < prec_max; precno++) {
- start_pos = volume_info->tile[tileno].packet[pack_nb].start_pos;
- end_pos = volume_info->tile[tileno].packet[pack_nb].end_pos;
- disto = volume_info->tile[tileno].packet[pack_nb].disto;
- fprintf(stream, "%4d %6d %7d %5d %6d %6d %9d %9d %8e\n", pack_nb, tileno, layno,
- resno, compno, precno, start_pos, end_pos, disto);
- total_disto += disto;
- pack_nb++;
- }
- }
- }
- }
- } /* LRCP */
- else if (volume_info->prog == RLCP) { /* RLCP */
- /*
- fprintf(stream, "pack_nb tileno resno layno compno precno start_pos end_pos disto");
- */
- for (resno = 0; resno < volume_info->decomposition[0] + 1; resno++) {
- for (layno = 0; layno < volume_info->layer; layno++) {
- for (compno = 0; compno < volume_info->comp; compno++) {
- int prec_max = volume_info->tile[tileno].prctno[0][resno] *
- volume_info->tile[tileno].prctno[1][resno] *
- volume_info->tile[tileno].prctno[2][resno];
- for (precno = 0; precno < prec_max; precno++) {
- start_pos = volume_info->tile[tileno].packet[pack_nb].start_pos;
- end_pos = volume_info->tile[tileno].packet[pack_nb].end_pos;
- disto = volume_info->tile[tileno].packet[pack_nb].disto;
- fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d %9d %8e\n",
- pack_nb, tileno, resno, layno, compno, precno, start_pos, end_pos, disto);
- total_disto += disto;
- pack_nb++;
- }
- }
- }
- }
- } /* RLCP */
- else if (volume_info->prog == RPCL) { /* RPCL */
- /*
- fprintf(stream, "\npack_nb tileno resno precno compno layno start_pos end_pos disto\n");
- */
- for (resno = 0; resno < volume_info->decomposition[0] + 1; resno++) {
- /* I suppose components have same XRsiz, YRsiz */
- /*int x0 = volume_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)volume_info->tw ) * volume_info->tw * volume_info->tile_x;*/
- /*int y0 = volume_info->tile_Ox + (int)floor( (float)tileno/(float)volume_info->tw ) * volume_info->tile_y;*/
- int x0 = volume_info->tile_Ox + (int)floor((float)tileno /
- (float)volume_info->tw) * volume_info->tile_x;
- int y0 = volume_info->tile_Oy + (int)floor((float)tileno /
- (float)volume_info->th) * volume_info->tile_y;
- int z0 = volume_info->tile_Ox + (int)floor((float)tileno /
- (float)volume_info->tl) * volume_info->tile_z;
- int x1 = x0 + volume_info->tile_x;
- int y1 = y0 + volume_info->tile_y;
- int z1 = z0 + volume_info->tile_z;
- for (z = z0; z < z1; z++) {
- for (y = y0; y < y1; y++) {
- for (x = x0; x < x1; x++) {
- for (compno = 0; compno < volume_info->comp; compno++) {
- int prec_max = volume_info->tile[tileno].prctno[0][resno] *
- volume_info->tile[tileno].prctno[1][resno] *
- volume_info->tile[tileno].prctno[2][resno];
- for (precno = 0; precno < prec_max; precno++) {
- int pcnx = volume_info->tile[tileno].prctno[0][resno];
- int pcx = (int) pow(2, volume_info->tile[tileno].prctsiz[0][resno] +
- volume_info->decomposition[0] - resno);
- int pcy = (int) pow(2, volume_info->tile[tileno].prctsiz[1][resno] +
- volume_info->decomposition[1] - resno);
- int pcz = (int) pow(2, volume_info->tile[tileno].prctsiz[2][resno] +
- volume_info->decomposition[2] - resno);
- int precno_x = precno - (int) floor((float)precno / (float)pcnx) * pcnx;
- int precno_y = (int) floor((float)precno / (float)pcnx);
- if (precno_y * pcy == y) {
- if (precno_x * pcx == x) {
- for (layno = 0; layno < volume_info->layer; layno++) {
- start_pos = volume_info->tile[tileno].packet[pack_nb].start_pos;
- end_pos = volume_info->tile[tileno].packet[pack_nb].end_pos;
- disto = volume_info->tile[tileno].packet[pack_nb].disto;
- fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d %9d %8e\n",
- pack_nb, tileno, resno, precno, compno, layno, start_pos, end_pos, disto);
- total_disto += disto;
- pack_nb++;
- }
- }
- }
- } /* precno */
- } /* compno */
- } /* x = x0..x1 */
- } /* y = y0..y1 */
- } /* z = z0..z1 */
- } /* resno */
- } /* RPCL */
- else if (volume_info->prog == PCRL) { /* PCRL */
- /* I suppose components have same XRsiz, YRsiz */
- int x0 = volume_info->tile_Ox + tileno - (int)floor((float)tileno /
- (float)volume_info->tw) * volume_info->tw * volume_info->tile_x;
- int y0 = volume_info->tile_Ox + (int)floor((float)tileno /
- (float)volume_info->tw) * volume_info->tile_y;
- int z0 = volume_info->tile_Oz + (int)floor((float)tileno /
- (float)volume_info->tw) * volume_info->tile_z;
- int x1 = x0 + volume_info->tile_x;
- int y1 = y0 + volume_info->tile_y;
- int z1 = z0 + volume_info->tile_z;
- /*
- fprintf(stream, "\npack_nb tileno precno compno resno layno start_pos end_pos disto\n");
- */
- for (z = z0; z < z1; z++) {
- for (y = y0; y < y1; y++) {
- for (x = x0; x < x1; x++) {
- for (compno = 0; compno < volume_info->comp; compno++) {
- for (resno = 0; resno < volume_info->decomposition[0] + 1; resno++) {
- int prec_max = volume_info->tile[tileno].prctno[0][resno] *
- volume_info->tile[tileno].prctno[1][resno];
- for (precno = 0; precno < prec_max; precno++) {
- int pcnx = volume_info->tile[tileno].prctno[0][resno];
- int pcx = (int) pow(2, volume_info->tile[tileno].prctsiz[0][resno] +
- volume_info->decomposition[0] - resno);
- int pcy = (int) pow(2, volume_info->tile[tileno].prctsiz[1][resno] +
- volume_info->decomposition[1] - resno);
- int pcz = (int) pow(2, volume_info->tile[tileno].prctsiz[2][resno] +
- volume_info->decomposition[2] - resno);
- int precno_x = precno - (int) floor((float)precno / (float)pcnx) * pcnx;
- int precno_y = (int) floor((float)precno / (float)pcnx);
- int precno_z = (int) floor((float)precno / (float)pcnx);
- if (precno_z * pcz == z) {
- if (precno_y * pcy == y) {
- if (precno_x * pcx == x) {
- for (layno = 0; layno < volume_info->layer; layno++) {
- start_pos = volume_info->tile[tileno].packet[pack_nb].start_pos;
- end_pos = volume_info->tile[tileno].packet[pack_nb].end_pos;
- disto = volume_info->tile[tileno].packet[pack_nb].disto;
- fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %8e\n",
- pack_nb, tileno, precno, compno, resno, layno, start_pos, end_pos, disto);
- total_disto += disto;
- pack_nb++;
- }
- }
- }
- }
- } /* precno */
- } /* resno */
- } /* compno */
- } /* x = x0..x1 */
- } /* y = y0..y1 */
- }
- } /* PCRL */
- else { /* CPRL */
- /*
- fprintf(stream, "\npack_nb tileno compno precno resno layno start_pos end_pos disto\n");
- */
- for (compno = 0; compno < volume_info->comp; compno++) {
- /* I suppose components have same XRsiz, YRsiz */
- int x0 = volume_info->tile_Ox + tileno - (int)floor((float)tileno /
- (float)volume_info->tw) * volume_info->tw * volume_info->tile_x;
- int y0 = volume_info->tile_Ox + (int)floor((float)tileno /
- (float)volume_info->tw) * volume_info->tile_y;
- int z0 = volume_info->tile_Oz + (int)floor((float)tileno /
- (float)volume_info->tw) * volume_info->tile_z;
- int x1 = x0 + volume_info->tile_x;
- int y1 = y0 + volume_info->tile_y;
- int z1 = z0 + volume_info->tile_z;
- for (z = z0; z < z1; z++) {
- for (y = y0; y < y1; y++) {
- for (x = x0; x < x1; x++) {
- for (resno = 0; resno < volume_info->decomposition[0] + 1; resno++) {
- int prec_max = volume_info->tile[tileno].prctno[0][resno] *
- volume_info->tile[tileno].prctno[1][resno] *
- volume_info->tile[tileno].prctno[2][resno];
- for (precno = 0; precno < prec_max; precno++) {
- int pcnx = volume_info->tile[tileno].prctno[0][resno];
- int pcny = volume_info->tile[tileno].prctno[1][resno];
- int pcx = (int) pow(2, volume_info->tile[tileno].prctsiz[0][resno] +
- volume_info->decomposition[0] - resno);
- int pcy = (int) pow(2, volume_info->tile[tileno].prctsiz[1][resno] +
- volume_info->decomposition[1] - resno);
- int pcz = (int) pow(2, volume_info->tile[tileno].prctsiz[2][resno] +
- volume_info->decomposition[2] - resno);
- int precno_x = precno - (int) floor((float)precno / (float)pcnx) * pcnx;
- int precno_y = (int) floor((float)precno / (float)pcnx);
- int precno_z = 0; /*???*/
- if (precno_z * pcz == z) {
- if (precno_y * pcy == y) {
- if (precno_x * pcx == x) {
- for (layno = 0; layno < volume_info->layer; layno++) {
- start_pos = volume_info->tile[tileno].packet[pack_nb].start_pos;
- end_pos = volume_info->tile[tileno].packet[pack_nb].end_pos;
- disto = volume_info->tile[tileno].packet[pack_nb].disto;
- fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %8e\n",
- pack_nb, tileno, compno, precno, resno, layno, start_pos, end_pos, disto);
- total_disto += disto;
- pack_nb++;
- }
- }
- }
- }
- } /* precno */
- } /* resno */
- } /* x = x0..x1 */
- } /* y = y0..y1 */
- } /* z = z0..z1 */
- } /* comno */
- } /* CPRL */
- } /* tileno */
-
- fprintf(stream, "SE_MAX\t%8e\n", volume_info->D_max); /* SE max */
- fprintf(stream, "SE_TOTAL\t%.8e\n", total_disto); /* SE totale */
-
-
- fclose(stream);
-
- return 1;
-}
-
-bool j3d_encode(opj_j3d_t *j3d, opj_cio_t *cio, opj_volume_t *volume,
- char *index)
-{
- int tileno, compno;
- opj_volume_info_t *volume_info = NULL;
- opj_cp_t *cp = NULL;
- opj_tcd_t *tcd = NULL; /* TCD component */
-
- j3d->cio = cio;
- j3d->volume = volume;
- cp = j3d->cp;
-
- /*j3d_dump_volume(stdout, volume);
- j3d_dump_cp(stdout, volume, cp);*/
-
- /* INDEX >> */
- volume_info = j3d->volume_info;
- if (volume_info && cp->index_on) {
- volume_info->index_on = cp->index_on;
- volume_info->tile = (opj_tile_info_t *) opj_malloc(cp->tw * cp->th * cp->tl *
- sizeof(opj_tile_info_t));
- volume_info->volume_w = volume->x1 - volume->x0;
- volume_info->volume_h = volume->y1 - volume->y0;
- volume_info->volume_l = volume->z1 - volume->z0;
- volume_info->prog = (&cp->tcps[0])->prg;
- volume_info->tw = cp->tw;
- volume_info->th = cp->th;
- volume_info->tl = cp->tl;
- volume_info->tile_x = cp->tdx; /* new version parser */
- volume_info->tile_y = cp->tdy; /* new version parser */
- volume_info->tile_z = cp->tdz; /* new version parser */
- volume_info->tile_Ox = cp->tx0; /* new version parser */
- volume_info->tile_Oy = cp->ty0; /* new version parser */
- volume_info->tile_Oz = cp->tz0; /* new version parser */
- volume_info->transform_format = cp->transform_format;
- volume_info->encoding_format = cp->encoding_format;
- volume_info->comp = volume->numcomps;
- volume_info->layer = (&cp->tcps[0])->numlayers;
- volume_info->decomposition[0] = (&cp->tcps[0])->tccps->numresolution[0] - 1;
- volume_info->decomposition[1] = (&cp->tcps[0])->tccps->numresolution[1] - 1;
- volume_info->decomposition[2] = (&cp->tcps[0])->tccps->numresolution[2] - 1;
- volume_info->D_max = 0; /* ADD Marcela */
- }
- /* << INDEX */
-
- j3d_write_soc(j3d);
- j3d_write_siz(j3d);
- if (j3d->cinfo->codec_format == CODEC_J3D) {
- j3d_write_cap(j3d);
- j3d_write_nsi(j3d);
- }
-
- /*if (j3d->cp->transform_format != TRF_2D_DWT || j3d->cp->encoding_format != ENCOD_2EB)*/
- j3d_write_com(j3d);
-
- j3d_write_cod(j3d);
- j3d_write_qcd(j3d);
- for (compno = 0; compno < volume->numcomps; compno++) {
- opj_tcp_t *tcp = &cp->tcps[0];
- if (tcp->tccps[compno].roishift) {
- j3d_write_rgn(j3d, compno, 0);
- }
- }
- /*Optional 15444-2 markers*/
- if (j3d->cp->tcps->tccps[0].atk != NULL) {
- j3d_write_atk(j3d);
- }
- if (j3d->volume->comps[0].dcoffset != 0) {
- j3d_write_dco(j3d);
- }
-
- /* INDEX >> */
- if (volume_info && volume_info->index_on) {
- volume_info->main_head_end = cio_tell(cio) - 1;
- }
- /* << INDEX */
-
- /* create the tile encoder */
- tcd = tcd_create(j3d->cinfo);
-
- /* encode each tile */
- for (tileno = 0; tileno < cp->tw * cp->th * cp->tl; tileno++) {
- opj_event_msg(j3d->cinfo, EVT_INFO, "tile number %d / %d\n", tileno + 1,
- cp->tw * cp->th * cp->tl);
-
- j3d->curtileno = tileno;
-
- /* initialisation before tile encoding */
- if (tileno == 0) {
- tcd_malloc_encode(tcd, volume, cp, j3d->curtileno);
- } else {
- tcd_init_encode(tcd, volume, cp, j3d->curtileno);
- }
-
- /* INDEX >> */
- if (volume_info && volume_info->index_on) {
- volume_info->tile[j3d->curtileno].num_tile = j3d->curtileno;
- volume_info->tile[j3d->curtileno].start_pos = cio_tell(cio) +
- j3d->pos_correction;
- }
- /* << INDEX */
-
- j3d_write_sot(j3d);
-
- for (compno = 1; compno < volume->numcomps; compno++) {
- j3d_write_coc(j3d, compno);
- j3d_write_qcc(j3d, compno);
- }
-
- if (cp->tcps[tileno].numpocs) {
- j3d_write_poc(j3d);
- }
- j3d_write_sod(j3d, tcd); /*--> tcd_encode_tile*/
-
- /* INDEX >> */
- if (volume_info && volume_info->index_on) {
- volume_info->tile[j3d->curtileno].end_pos = cio_tell(cio) + j3d->pos_correction
- - 1;
- }
- /* << INDEX */
- }
-
- /* destroy the tile encoder */
- tcd_free_encode(tcd);
- tcd_destroy(tcd);
-
- j3d_write_eoc(j3d);
-
- /* Creation of the index file */
- if (volume_info && volume_info->index_on) {
- if (!j3d_create_index(j3d, cio, volume_info, index)) {
- opj_event_msg(j3d->cinfo, EVT_ERROR, "failed to create index file %s\n", index);
- return false;
- }
- }
-
- return true;
-}
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
+++ /dev/null
-/*
- * 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.
- */
-#ifndef __J3D_H
-#define __J3D_H
-/**
-@file jp3d.h
-@brief The JPEG-2000 Codestream Reader/Writer (J3D)
-
-The functions in J3D.C have for goal to read/write the several parts of the codestream: markers and data.
-*/
-
-/** @defgroup J3D J3D - JPEG-2000 PART 10 codestream reader/writer */
-/*@{*/
-
-#define J3D_CP_CSTY_PRT 0x01
-#define J3D_CP_CSTY_SOP 0x02
-#define J3D_CP_CSTY_EPH 0x04
-#define J3D_CCP_CSTY_PRT 0x01
-/** Table A-8 */
-#define J3D_CCP_CBLKSTY_LAZY 0x01 /* Selective arithmetic coding bypass */
-#define J3D_CCP_CBLKSTY_RESET 0x02 /* Reset context probabilities on coding pass boundaries */
-#define J3D_CCP_CBLKSTY_TERMALL 0x04 /* Termination on each coding pass */
-#define J3D_CCP_CBLKSTY_VSC 0x08 /* Vertically causal context, add also hook for switching off and on 3D context models */
-#define J3D_CCP_CBLKSTY_PTERM 0x10 /* Predictable termination */
-#define J3D_CCP_CBLKSTY_SEGSYM 0x20 /* Segmentation symbols are used */
-#define J3D_CCP_CBLKSTY_3DCTXT 0x40 /* 3D context models (3D-EBCOT) vs 2D context models */
-
-#define J3D_CCP_QNTSTY_NOQNT 0 /* Quantization style : no quantization */
-#define J3D_CCP_QNTSTY_SIQNT 1 /* Quantization style : scalar derived (values signalled only in LLL subband) */
-#define J3D_CCP_QNTSTY_SEQNT 2 /* Quantization style : scalar expounded (values signalled for each subband) */
-
-/* ----------------------------------------------------------------------- */
-
-#define J3D_MS_SOC 0xff4f /**< SOC marker value */
-#define J3D_MS_SOT 0xff90 /**< SOT marker value */
-#define J3D_MS_SOD 0xff93 /**< SOD marker value */
-#define J3D_MS_EOC 0xffd9 /**< EOC marker value */
-#define J3D_MS_CAP 0xff50 /**< CAP marker value */
-#define J3D_MS_SIZ 0xff51 /**< SIZ marker value */
-#define J3D_MS_NSI 0xff54 /**< NSI marker value */
-#define J3D_MS_COD 0xff52 /**< COD marker value */
-#define J3D_MS_COC 0xff53 /**< COC marker value */
-#define J3D_MS_RGN 0xff5e /**< RGN marker value */
-#define J3D_MS_QCD 0xff5c /**< QCD marker value */
-#define J3D_MS_QCC 0xff5d /**< QCC marker value */
-#define J3D_MS_POC 0xff5f /**< POC marker value */
-#define J3D_MS_TLM 0xff55 /**< TLM marker value */
-#define J3D_MS_PLM 0xff57 /**< PLM marker value */
-#define J3D_MS_PLT 0xff58 /**< PLT marker value */
-#define J3D_MS_PPM 0xff60 /**< PPM marker value */
-#define J3D_MS_PPT 0xff61 /**< PPT marker value */
-#define J3D_MS_SOP 0xff91 /**< SOP marker value */
-#define J3D_MS_EPH 0xff92 /**< EPH marker value */
-#define J3D_MS_CRG 0xff63 /**< CRG marker value */
-#define J3D_MS_COM 0xff64 /**< COM marker value */
-/*15444-2*/
-#define J3D_MS_DCO 0xff70 /**< DCO marker value */
-#define J3D_MS_VMS 0xff71 /**< VMS marker value */
-#define J3D_MS_DFS 0xff72 /**< DFS marker value */
-#define J3D_MS_ADS 0xff73 /**< ADS marker value */
-#define J3D_MS_ATK 0xff79 /**< ATK marker value */
-#define J3D_MS_CBD 0xff78 /**< CBD marker value */
-#define J3D_MS_MCT 0xff74 /**< MCT marker value */
-#define J3D_MS_MCC 0xff75 /**< MCC marker value */
-#define J3D_MS_MCO 0xff77 /**< MCO marker value */
-#define J3D_MS_NLT 0xff76 /**< NLT marker value */
-#define J3D_MS_QPD 0xff5a /**< QPD marker value */
-#define J3D_MS_QPC 0xff5b /**< QPC marker value */
-
-/* ----------------------------------------------------------------------- */
-/* Capability RSIZ parameter, extended */
-#define J3D_RSIZ_BASIC 0x0000
-
-#define J3D_RSIZ_DCO 0x8001 /* Required */
-#define J3D_RSIZ_VSQNT 0x8002
-#define J3D_RSIZ_TCQNT 0x8004
-#define J3D_RSIZ_VMASK 0x8008
-#define J3D_RSIZ_SSOVL 0x8010
-#define J3D_RSIZ_ADECS 0x8020
-#define J3D_RSIZ_ATK 0x8040 /*Required*/
-#define J3D_RSIZ_SSYMK 0x8080
-#define J3D_RSIZ_MCT 0x8100 /*Not compatible with DCO*/
-#define J3D_RSIZ_NLT 0x8200 /*Required*/
-#define J3D_RSIZ_ASHAP 0x8400
-#define J3D_RSIZ_PRQNT 0x8800
-
-#define J3D_CAP_10 0x00400000
-/* Arbitrary transformation kernel, 15444-2 */
-#define J3D_ATK_IRR 0
-#define J3D_ATK_REV 1
-#define J3D_ATK_ARB 0
-#define J3D_ATK_WS 1
-#define J3D_ATK_CON 0
-/* ----------------------------------------------------------------------- */
-
-/**
-Values that specify the status of the decoding process when decoding the main header.
-These values may be combined with a | operator.
-*/
-typedef enum J3D_STATUS {
- /**< a SOC marker is expected */
- J3D_STATE_MHSOC = 0x0001,
- /**< a SIZ marker is expected */
- J3D_STATE_MHSIZ = 0x0002,
- /**< the decoding process is in the main header */
- J3D_STATE_MH = 0x0004,
- /**< the decoding process is in a tile part header and expects a SOT marker */
- J3D_STATE_TPHSOT = 0x0008,
- /**< the decoding process is in a tile part header */
- J3D_STATE_TPH = 0x0010,
- /**< the EOC marker has just been read */
- J3D_STATE_MT = 0x0020,
- /**< the decoding process must not expect a EOC marker because the codestream is truncated */
- J3D_STATE_NEOC = 0x0040
-} J3D_STATUS;
-
-
-
-/**
-Arbitrary transformation kernel
-*/
-typedef struct opj_atk {
- /** index of wavelet kernel */
- int index;
- /** Numerical type of scaling factor and lifting step parameters */
- int coeff_typ;
- /** Wavelet filter category */
- int filt_cat;
- /** Wavelet transformation type (REV/IRR) */
- int wt_typ;
- /** Initial odd/even subsequence */
- int minit;
- /** Boundary extension method (constant CON / whole-sample symmetric WS) */
- int exten;
- /** Scaling factor. Only for wt_typ=IRR */
- double Katk;
- /** Number of lifting steps */
- int Natk;
- /** Offset for lifting step s. Only for filt_cat=ARB */
- int Oatk[256];
- /** Base 2 scaling exponent for lifting step s. Only for wt_typ=REV */
- int Eatk[256];
- /** Additive residue for lifting step s. Only for wt_typ=REV */
- int Batk[256];
- /** Number of lifting coefficients signaled for lifting step s */
- int LCatk[256];
- /** Lifting coefficient k for lifting step s */
- double Aatk[256][256];
-} opj_atk_t;
-
-
-/**
-Quantization stepsize
-*/
-typedef struct opj_stepsize {
- /** exponent */
- int expn;
- /** mantissa */
- int mant;
-} opj_stepsize_t;
-
-/**
-Tile-component coding parameters
-*/
-typedef struct opj_tccp {
- /** coding style */
- int csty;
- /** number of resolutions of x, y and z-axis */
- int numresolution[3];
- /** code-blocks width height & depth*/
- int cblk[3];
- /** code-block coding style */
- int cblksty;
- /** 0: no ATK (only 9-7 or 5-3) 1: ATK defined WT*/
- int atk_wt[3];
- /** Arbitrary transformation kernel (15444-2)*/
- opj_atk_t *atk;
- /** DWT identifier for x, y and z-axis (0:WT9-7 1:WT5-3 >1:WT-atk->index) */
- int dwtid[3];
- /** reversible/irreversible wavelet transfomation (0:irrev 1:reversible)*/
- int reversible;
- /** quantisation style */
- int qntsty;
- /** stepsizes used for quantization */
- opj_stepsize_t stepsizes[J3D_MAXBANDS];
- /** number of guard bits. Table A28 de 15444-1*/
- int numgbits;
- /** Region Of Interest shift */
- int roishift;
- /** precinct width height & depth*/
- int prctsiz[3][J3D_MAXRLVLS];
-} opj_tccp_t;
-
-/**
-Tile coding parameters : coding/decoding parameters common to all tiles
-(information like COD, COC in main header)
-*/
-typedef struct opj_tcp {
- /** 1 : first part-tile of a tile */
- int first;
- /** coding style */
- int csty;
- /** progression order */
- OPJ_PROG_ORDER prg;
- /** number of layers */
- int numlayers;
- /** multi-component transform identifier */
- int mct;
- /** rates of layers */
- float rates[100];
- /** number of progression order changes */
- int numpocs;
- /** indicates if a POC marker has been used O:NO, 1:YES */
- int POC;
- /** progression order changes */
- opj_poc_t pocs[J3D_MAXRLVLS - 1];
- /** add fixed_quality */
- float distoratio[100];
- /** tile-component coding parameters */
- opj_tccp_t *tccps;
- /** packet header store there for futur use in t2_decode_packet */
- unsigned char *ppt_data;
- /** pointer remaining on the first byte of the first header if ppt is used */
- unsigned char *ppt_data_first;
- /** If ppt == 1 --> there was a PPT marker for the present tile */
- int ppt;
- /** used in case of multiple marker PPT (number of info already stored) */
- int ppt_store;
- int ppt_len;
-} opj_tcp_t;
-
-/**
-Coding parameters
-*/
-typedef struct opj_cp {
- /** transform format 0: 2DWT, 1: 2D1P, 2: 3DWT, 3: 3RLS */
- OPJ_TRANSFORM transform_format;
- /** entropy coding format 0: 2EB, 1: 3EB, 2: 2GR, 3: 3GR, 4: GRI*/
- OPJ_ENTROPY_CODING encoding_format;
- /** allocation by rate/distortion */
- int disto_alloc;
- /** allocation by fixed layer */
- int fixed_alloc;
- /** add fixed_quality */
- int fixed_quality;
- /** Rsiz: capabilities */
- int rsiz;
- /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, volume is decoded to the full resolution */
- int reduce[3];
- /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
- int layer;
- /** 0 = no index || 1 = index */
- int index_on;
- /** Big-Endian/Little-endian order */
- int bigendian;
- /** XTOsiz */
- int tx0;
- /** YTOsiz */
- int ty0;
- /** ZTOsiz */
- int tz0;
- /** XTsiz */
- int tdx;
- /** YTsiz */
- int tdy;
- /** ZTsiz */
- int tdz;
- /** comment for coding */
- char *comment;
- /** number of tiles in width, height and depth */
- int tw;
- int th;
- int tl;
- /** ID number of the tiles present in the codestream */
- int *tileno;
- /** size of the vector tileno */
- int tileno_size;
- /** tile coding parameters */
- opj_tcp_t *tcps;
- /** fixed layer */
- int *matrice;
-
- /** packet header store there for futur use in t2_decode_packet */
- unsigned char *ppm_data;
- /** pointer remaining on the first byte of the first header if ppm is used */
- unsigned char *ppm_data_first;
- /** if ppm == 1 --> there was a PPM marker for the present tile */
- int ppm;
- /** use in case of multiple marker PPM (number of info already store) */
- int ppm_store;
- /** use in case of multiple marker PPM (case on non-finished previous info) */
- int ppm_previous;
- int ppm_len;
-} opj_cp_t;
-
-/**
-Information concerning a packet inside tile
-*/
-typedef struct opj_packet_info {
- /** start position */
- int start_pos;
- /** end position */
- int end_pos;
- /** distorsion introduced */
- double disto;
-} opj_packet_info_t;
-
-/**
-Index structure : information regarding tiles inside volume
-*/
-typedef struct opj_tile_info {
- /** value of thresh for each layer by tile cfr. Marcela */
- double *thresh;
- /** number of tile */
- int num_tile;
- /** start position */
- int start_pos;
- /** end position of the header */
- int end_header;
- /** end position */
- int end_pos;
- /** precinct number for each resolution level (width, height and depth) */
- int prctno[3][J3D_MAXRLVLS];
- /** precinct size (in power of 2), in X for each resolution level */
- int prctsiz[3][J3D_MAXRLVLS];
- /** information concerning packets inside tile */
- opj_packet_info_t *packet;
-
- /** add fixed_quality */
- int nbpix;
- /** add fixed_quality */
- double distotile;
-} opj_tile_info_t;
-
-/**
-Index structure
-*/
-typedef struct opj_volume_info {
-
- /** transform format 0: 2DWT, 1: 2D1P, 2: 3DWT, 3: 3RLS */
- OPJ_TRANSFORM transform_format;
- /** output file format 0: 2EB, 1: 3EB, 2: 2GR, 3: 3GR, 4: GRI*/
- OPJ_ENTROPY_CODING encoding_format; /** 0 = no index || 1 = index */
- int index_on;
- /** 0 = wt 9-7 || 1 = wt 5-3 || >=2 wt atk defined */
- int dwtid[3];
- /** maximum distortion reduction on the whole volume (add for Marcela) */
- double D_max;
- /** packet number */
- int num;
- /** writing the packet in the index with t2_encode_packets */
- int index_write;
- /** volume width, height and depth */
- int volume_w;
- int volume_h;
- int volume_l;
- /** progression order */
- OPJ_PROG_ORDER prog;
- /** tile size in x, y and z */
- int tile_x;
- int tile_y;
- int tile_z;
- /** tile origin in x, y and z */
- int tile_Ox;
- int tile_Oy;
- int tile_Oz;
- /** number of tiles in X, Y and Z */
- int tw;
- int th;
- int tl;
- /** component numbers */
- int comp;
- /** number of layer */
- int layer;
- /** number of decomposition in X, Y and Z*/
- int decomposition[3];
- /** DC offset (15444-2) */
- int dcoffset;
- /** main header position */
- int main_head_end;
- /** codestream's size */
- int codestream_size;
- /** information regarding tiles inside volume */
- opj_tile_info_t *tile;
-} opj_volume_info_t;
-
-/**
-JPEG-2000 codestream reader/writer
-*/
-typedef struct opj_j3d {
- /** codec context */
- opj_common_ptr cinfo;
- /** locate in which part of the codestream the decoder is (main header, tile header, end) */
- int state;
- /** number of the tile currently concern by coding/decoding */
- int curtileno;
- /** locate the position of the end of the tile in the codestream, used to detect a truncated codestream (in j3d_read_sod) */
- unsigned char *eot;
- /** locate the start position of the SOT marker of the current coded tile: */
- int sot_start;
- /* after encoding the tile, a jump (in j3d_write_sod) is done to the SOT marker to store the value of its length. */
- int sod_start;
- /** as the J3D-file is written in several parts during encoding, it enables to make the right correction in position return by cio_tell */
- int pos_correction;
- /** array used to store the data of each tile */
- unsigned char **tile_data;
- /** array used to store the length of each tile */
- int *tile_len;
-
- /** decompression only : store decoding parameters common to all tiles */
- opj_tcp_t *default_tcp;
- /** pointer to the encoded / decoded volume */
- opj_volume_t *volume;
- /** pointer to the coding parameters */
- opj_cp_t *cp;
- /** helper used to write the index file */
- opj_volume_info_t *volume_info;
- /** pointer to the byte i/o stream */
- opj_cio_t *cio;
-} opj_j3d_t;
-
-/** @name Funciones generales */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Creates a J3D decompression structure
-@param cinfo Codec context info
-@return Returns a handle to a J3D decompressor if successful, returns NULL otherwise
-*/
-opj_j3d_t* j3d_create_decompress(opj_common_ptr cinfo);
-/**
-Destroy a J3D decompressor handle
-@param j3d J3D decompressor handle to destroy
-*/
-void j3d_destroy_decompress(opj_j3d_t *j3d);
-/**
-Setup the decoder decoding parameters using user parameters.
-Decoding parameters are returned in j3d->cp.
-@param j3d J3D decompressor handle
-@param parameters decompression parameters
-*/
-void j3d_setup_decoder(opj_j3d_t *j3d, opj_dparameters_t *parameters);
-/**
-Decode an volume from a JPEG-2000 codestream
-@param j3d J3D decompressor handle
-@param cio Input buffer stream
-@return Returns a decoded volume if successful, returns NULL otherwise
-*/
-opj_volume_t* j3d_decode(opj_j3d_t *j3d, opj_cio_t *cio);
-/**
-Decode an volume form a JPT-stream (JPEG 2000, JPIP)
-@param j3d J3D decompressor handle
-@param cio Input buffer stream
-@return Returns a decoded volume if successful, returns NULL otherwise
-*/
-opj_volume_t* j3d_decode_jpt_stream(opj_j3d_t *j3d, opj_cio_t *cio);
-/**
-Creates a J3D compression structure
-@param cinfo Codec context info
-@return Returns a handle to a J3D compressor if successful, returns NULL otherwise
-*/
-opj_j3d_t* j3d_create_compress(opj_common_ptr cinfo);
-/**
-Destroy a J3D compressor handle
-@param j3d J3D compressor handle to destroy
-*/
-void j3d_destroy_compress(opj_j3d_t *j3d);
-/**
-Setup the encoder parameters using the current volume and using user parameters.
-Coding parameters are returned in j3d->cp.
-@param j3d J3D compressor handle
-@param parameters compression parameters
-@param volume input filled volume
-*/
-void j3d_setup_encoder(opj_j3d_t *j3d, opj_cparameters_t *parameters,
- opj_volume_t *volume);
-/**
-Encode an volume into a JPEG-2000 codestream
-@param j3d J3D compressor handle
-@param cio Output buffer stream
-@param volume Volume to encode
-@param index Name of the index file if required, NULL otherwise
-@return Returns true if successful, returns false otherwise
-*/
-bool j3d_encode(opj_j3d_t *j3d, opj_cio_t *cio, opj_volume_t *volume,
- char *index);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __J3D_H */
+++ /dev/null
-/*
- * 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) 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.
- */
-
-#ifdef _WIN32
-#include <windows.h>
-#else
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/times.h>
-#endif /* _WIN32 */
-#include "opj_includes.h"
-
-double opj_clock()
-{
-#ifdef _WIN32
- /* WIN32: use QueryPerformance (very accurate) */
- LARGE_INTEGER freq, t ;
- /* freq is the clock speed of the CPU */
- QueryPerformanceFrequency(&freq) ;
- /* cout << "freq = " << ((double) freq.QuadPart) << endl; */
- /* t is the high resolution performance counter (see MSDN) */
- QueryPerformanceCounter(& t) ;
- return (t.QuadPart / (double) freq.QuadPart) ;
-#else
- /* Unix or Linux: use resource usage */
- struct rusage t;
- double procTime;
- /* (1) Get the rusage data structure at this moment (man getrusage) */
- getrusage(0, &t);
- /* (2) What is the elapsed time ? - CPU time = User time + System time */
- /* (2a) Get the seconds */
- procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec;
- /* (2b) More precisely! Get the microseconds part ! */
- return (procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6) ;
-#endif /* _WIN32 */
-}
-
-void* opj_malloc(size_t size)
-{
- void *memblock = malloc(size);
- if (memblock) {
- memset(memblock, 0, size);
- }
- return memblock;
-}
-
-void* opj_realloc(void *memblock, size_t size)
-{
- return realloc(memblock, size);
-}
-
-void opj_free(void *memblock)
-{
- free(memblock);
-}
-
-
+++ /dev/null
-/*
- * 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) 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 __J3D_LIB_H
-#define __J3D_LIB_H
-/**
-@file jp3d_lib.h
-@brief Internal functions
-
-The functions in JP3D_LIB.C are internal utilities mainly used for memory management.
-*/
-
-/** @defgroup MISC MISC - Miscellaneous internal functions */
-/*@{*/
-
-/** @name Funciones generales */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-
-/**
-Difference in successive opj_clock() calls tells you the elapsed time
-@return Returns time in seconds
-*/
-double opj_clock(void);
-
-/**
-Allocate a memory block with elements initialized to 0
-@param size Bytes to allocate
-@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
-*/
-void* opj_malloc(size_t size);
-
-/**
-Reallocate memory blocks.
-@param memblock Pointer to previously allocated memory block
-@param size New size in bytes
-@return Returns a void pointer to the reallocated (and possibly moved) memory block
-*/
-void* opj_realloc(void *memblock, size_t size);
-
-/**
-Deallocates or frees a memory block.
-@param memblock Previously allocated memory block to be freed
-*/
-void opj_free(void *memblock);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __J3D_LIB_H */
-
+++ /dev/null
-prefix=@CMAKE_INSTALL_PREFIX@
-bindir=${prefix}/@OPENJPEG_INSTALL_BIN_DIR@
-mandir=${prefix}/@OPENJPEG_INSTALL_MAN_DIR@
-docdir=${prefix}/@OPENJPEG_INSTALL_DOC_DIR@
-libdir=${prefix}/@OPENJPEG_INSTALL_LIB_DIR@
-includedir=${prefix}/@OPENJPEG_INSTALL_INCLUDE_DIR@
-
-Name: openjp3d
-Description: JPEG2000 Extensions for three-dimensional data (Part 10)
-URL: http://www.openjpeg.org/
-Version: @OPENJPEG_VERSION@
-Libs: -L${libdir} -lopenjp3d
-Libs.private: -lm
-Cflags: -I${includedir}
+++ /dev/null
-/*
- * 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
- * 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_includes.h"
-
-/* <summary> */
-/* This table contains the norms of the basis function of the reversible MCT. */
-/* </summary> */
-static const double mct_norms[3] = { 1.732, .8292, .8292 };
-
-/* <summary> */
-/* This table contains the norms of the basis function of the irreversible MCT. */
-/* </summary> */
-static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 };
-
-/* <summary> */
-/* Forward reversible MCT. */
-/* </summary> */
-void mct_encode(int *c0, int *c1, int *c2, int n)
-{
- int i;
- for (i = 0; i < n; i++) {
- int r, g, b, y, u, v;
- r = c0[i];
- g = c1[i];
- b = c2[i];
- y = (r + (g << 1) + b) >> 2;
- u = b - g;
- v = r - g;
- c0[i] = y;
- c1[i] = u;
- c2[i] = v;
- }
-}
-
-/* <summary> */
-/* Inverse reversible MCT. */
-/* </summary> */
-void mct_decode(int *c0, int *c1, int *c2, int n)
-{
- int i;
- for (i = 0; i < n; i++) {
- int y, u, v, r, g, b;
- y = c0[i];
- u = c1[i];
- v = c2[i];
- g = y - ((u + v) >> 2);
- r = v + g;
- b = u + g;
- c0[i] = r;
- c1[i] = g;
- c2[i] = b;
- }
-}
-
-/* <summary> */
-/* Get norm of basis function of reversible MCT. */
-/* </summary> */
-double mct_getnorm(int compno)
-{
- return mct_norms[compno];
-}
-
-/* <summary> */
-/* Forward irreversible MCT. */
-/* </summary> */
-void mct_encode_real(int *c0, int *c1, int *c2, int n)
-{
- int i;
- for (i = 0; i < n; i++) {
- int r, g, b, y, u, v;
- r = c0[i];
- g = c1[i];
- b = c2[i];
- y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934);
- u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096);
- v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666);
- c0[i] = y;
- c1[i] = u;
- c2[i] = v;
- }
-}
-
-/* <summary> */
-/* Inverse irreversible MCT. */
-/* </summary> */
-void mct_decode_real(int *c0, int *c1, int *c2, int n)
-{
- int i;
- for (i = 0; i < n; i++) {
- int y, u, v, r, g, b;
- y = c0[i];
- u = c1[i];
- v = c2[i];
- r = y + fix_mul(v, 11485);
- g = y - fix_mul(u, 2819) - fix_mul(v, 5850);
- b = y + fix_mul(u, 14516);
- c0[i] = r;
- c1[i] = g;
- c2[i] = b;
- }
-}
-
-/* <summary> */
-/* Get norm of basis function of irreversible MCT. */
-/* </summary> */
-double mct_getnorm_real(int compno)
-{
- return mct_norms_real[compno];
-}
+++ /dev/null
-/*
- * 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
- * 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 __MCT_H
-#define __MCT_H
-/**
-@file mct.h
-@brief Implementation of a multi-component transforms (MCT)
-
-The functions in MCT.C have for goal to realize reversible and irreversible multicomponent
-transform. The functions in MCT.C are used by some function in TCD.C.
-*/
-
-/** @defgroup MCT MCT - Implementation of a multi-component transform */
-/*@{*/
-
-/** @name Funciones generales */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Apply a reversible multi-component transform to an image
-@param c0 Samples for red component
-@param c1 Samples for green component
-@param c2 Samples blue component
-@param n Number of samples for each component
-*/
-void mct_encode(int *c0, int *c1, int *c2, int n);
-/**
-Apply a reversible multi-component inverse transform to an image
-@param c0 Samples for luminance component
-@param c1 Samples for red chrominance component
-@param c2 Samples for blue chrominance component
-@param n Number of samples for each component
-*/
-void mct_decode(int *c0, int *c1, int *c2, int n);
-/**
-Get norm of the basis function used for the reversible multi-component transform
-@param compno Number of the component (0->Y, 1->U, 2->V)
-@return
-*/
-double mct_getnorm(int compno);
-
-/**
-Apply an irreversible multi-component transform to an image
-@param c0 Samples for red component
-@param c1 Samples for green component
-@param c2 Samples blue component
-@param n Number of samples for each component
-*/
-void mct_encode_real(int *c0, int *c1, int *c2, int n);
-/**
-Apply an irreversible multi-component inverse transform to an image
-@param c0 Samples for luminance component
-@param c1 Samples for red chrominance component
-@param c2 Samples for blue chrominance component
-@param n Number of samples for each component
-*/
-void mct_decode_real(int *c0, int *c1, int *c2, int n);
-/**
-Get norm of the basis function used for the irreversible multi-component transform
-@param compno Number of the component (0->Y, 1->U, 2->V)
-@return
-*/
-double mct_getnorm_real(int compno);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __MCT_H */
+++ /dev/null
-/*
- * 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
- * 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_includes.h"
-
-/** @defgroup MQC MQC - Implementation of an MQ-Coder */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Output a byte, doing bit-stuffing if necessary.
-After a 0xff byte, the next byte must be smaller than 0x90.
-@param mqc MQC handle
-*/
-static void mqc_byteout(opj_mqc_t *mqc);
-/**
-Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000
-@param mqc MQC handle
-*/
-static void mqc_renorme(opj_mqc_t *mqc);
-/**
-Encode the most probable symbol
-@param mqc MQC handle
-*/
-static void mqc_codemps(opj_mqc_t *mqc);
-/**
-Encode the most least symbol
-@param mqc MQC handle
-*/
-static void mqc_codelps(opj_mqc_t *mqc);
-/**
-Fill mqc->c with 1's for flushing
-@param mqc MQC handle
-*/
-static void mqc_setbits(opj_mqc_t *mqc);
-/**
-Exchange MPS with LPS
-@param mqc MQC handle
-@return
-*/
-static int mqc_mpsexchange(opj_mqc_t *mqc);
-/**
-Exchange LPS with MPS
-@param mqc MQC handle
-@return
-*/
-static int mqc_lpsexchange(opj_mqc_t *mqc);
-/**
-Input a byte
-@param mqc MQC handle
-*/
-static void mqc_bytein(opj_mqc_t *mqc);
-/**
-Renormalize mqc->a and mqc->c while decoding
-@param mqc MQC handle
-*/
-static void mqc_renormd(opj_mqc_t *mqc);
-
-/*@}*/
-
-/*@}*/
-
-/* <summary> */
-/* This array defines all the possible states for a context. */
-/* </summary> */
-static opj_mqc_state_t mqc_states[47 * 2] = {
- {0x5601, 0, &mqc_states[2], &mqc_states[3]},
- {0x5601, 1, &mqc_states[3], &mqc_states[2]},
- {0x3401, 0, &mqc_states[4], &mqc_states[12]},
- {0x3401, 1, &mqc_states[5], &mqc_states[13]},
- {0x1801, 0, &mqc_states[6], &mqc_states[18]},
- {0x1801, 1, &mqc_states[7], &mqc_states[19]},
- {0x0ac1, 0, &mqc_states[8], &mqc_states[24]},
- {0x0ac1, 1, &mqc_states[9], &mqc_states[25]},
- {0x0521, 0, &mqc_states[10], &mqc_states[58]},
- {0x0521, 1, &mqc_states[11], &mqc_states[59]},
- {0x0221, 0, &mqc_states[76], &mqc_states[66]},
- {0x0221, 1, &mqc_states[77], &mqc_states[67]},
- {0x5601, 0, &mqc_states[14], &mqc_states[13]},
- {0x5601, 1, &mqc_states[15], &mqc_states[12]},
- {0x5401, 0, &mqc_states[16], &mqc_states[28]},
- {0x5401, 1, &mqc_states[17], &mqc_states[29]},
- {0x4801, 0, &mqc_states[18], &mqc_states[28]},
- {0x4801, 1, &mqc_states[19], &mqc_states[29]},
- {0x3801, 0, &mqc_states[20], &mqc_states[28]},
- {0x3801, 1, &mqc_states[21], &mqc_states[29]},
- {0x3001, 0, &mqc_states[22], &mqc_states[34]},
- {0x3001, 1, &mqc_states[23], &mqc_states[35]},
- {0x2401, 0, &mqc_states[24], &mqc_states[36]},
- {0x2401, 1, &mqc_states[25], &mqc_states[37]},
- {0x1c01, 0, &mqc_states[26], &mqc_states[40]},
- {0x1c01, 1, &mqc_states[27], &mqc_states[41]},
- {0x1601, 0, &mqc_states[58], &mqc_states[42]},
- {0x1601, 1, &mqc_states[59], &mqc_states[43]},
- {0x5601, 0, &mqc_states[30], &mqc_states[29]},
- {0x5601, 1, &mqc_states[31], &mqc_states[28]},
- {0x5401, 0, &mqc_states[32], &mqc_states[28]},
- {0x5401, 1, &mqc_states[33], &mqc_states[29]},
- {0x5101, 0, &mqc_states[34], &mqc_states[30]},
- {0x5101, 1, &mqc_states[35], &mqc_states[31]},
- {0x4801, 0, &mqc_states[36], &mqc_states[32]},
- {0x4801, 1, &mqc_states[37], &mqc_states[33]},
- {0x3801, 0, &mqc_states[38], &mqc_states[34]},
- {0x3801, 1, &mqc_states[39], &mqc_states[35]},
- {0x3401, 0, &mqc_states[40], &mqc_states[36]},
- {0x3401, 1, &mqc_states[41], &mqc_states[37]},
- {0x3001, 0, &mqc_states[42], &mqc_states[38]},
- {0x3001, 1, &mqc_states[43], &mqc_states[39]},
- {0x2801, 0, &mqc_states[44], &mqc_states[38]},
- {0x2801, 1, &mqc_states[45], &mqc_states[39]},
- {0x2401, 0, &mqc_states[46], &mqc_states[40]},
- {0x2401, 1, &mqc_states[47], &mqc_states[41]},
- {0x2201, 0, &mqc_states[48], &mqc_states[42]},
- {0x2201, 1, &mqc_states[49], &mqc_states[43]},
- {0x1c01, 0, &mqc_states[50], &mqc_states[44]},
- {0x1c01, 1, &mqc_states[51], &mqc_states[45]},
- {0x1801, 0, &mqc_states[52], &mqc_states[46]},
- {0x1801, 1, &mqc_states[53], &mqc_states[47]},
- {0x1601, 0, &mqc_states[54], &mqc_states[48]},
- {0x1601, 1, &mqc_states[55], &mqc_states[49]},
- {0x1401, 0, &mqc_states[56], &mqc_states[50]},
- {0x1401, 1, &mqc_states[57], &mqc_states[51]},
- {0x1201, 0, &mqc_states[58], &mqc_states[52]},
- {0x1201, 1, &mqc_states[59], &mqc_states[53]},
- {0x1101, 0, &mqc_states[60], &mqc_states[54]},
- {0x1101, 1, &mqc_states[61], &mqc_states[55]},
- {0x0ac1, 0, &mqc_states[62], &mqc_states[56]},
- {0x0ac1, 1, &mqc_states[63], &mqc_states[57]},
- {0x09c1, 0, &mqc_states[64], &mqc_states[58]},
- {0x09c1, 1, &mqc_states[65], &mqc_states[59]},
- {0x08a1, 0, &mqc_states[66], &mqc_states[60]},
- {0x08a1, 1, &mqc_states[67], &mqc_states[61]},
- {0x0521, 0, &mqc_states[68], &mqc_states[62]},
- {0x0521, 1, &mqc_states[69], &mqc_states[63]},
- {0x0441, 0, &mqc_states[70], &mqc_states[64]},
- {0x0441, 1, &mqc_states[71], &mqc_states[65]},
- {0x02a1, 0, &mqc_states[72], &mqc_states[66]},
- {0x02a1, 1, &mqc_states[73], &mqc_states[67]},
- {0x0221, 0, &mqc_states[74], &mqc_states[68]},
- {0x0221, 1, &mqc_states[75], &mqc_states[69]},
- {0x0141, 0, &mqc_states[76], &mqc_states[70]},
- {0x0141, 1, &mqc_states[77], &mqc_states[71]},
- {0x0111, 0, &mqc_states[78], &mqc_states[72]},
- {0x0111, 1, &mqc_states[79], &mqc_states[73]},
- {0x0085, 0, &mqc_states[80], &mqc_states[74]},
- {0x0085, 1, &mqc_states[81], &mqc_states[75]},
- {0x0049, 0, &mqc_states[82], &mqc_states[76]},
- {0x0049, 1, &mqc_states[83], &mqc_states[77]},
- {0x0025, 0, &mqc_states[84], &mqc_states[78]},
- {0x0025, 1, &mqc_states[85], &mqc_states[79]},
- {0x0015, 0, &mqc_states[86], &mqc_states[80]},
- {0x0015, 1, &mqc_states[87], &mqc_states[81]},
- {0x0009, 0, &mqc_states[88], &mqc_states[82]},
- {0x0009, 1, &mqc_states[89], &mqc_states[83]},
- {0x0005, 0, &mqc_states[90], &mqc_states[84]},
- {0x0005, 1, &mqc_states[91], &mqc_states[85]},
- {0x0001, 0, &mqc_states[90], &mqc_states[86]},
- {0x0001, 1, &mqc_states[91], &mqc_states[87]},
- {0x5601, 0, &mqc_states[92], &mqc_states[92]},
- {0x5601, 1, &mqc_states[93], &mqc_states[93]},
-};
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-static void mqc_byteout(opj_mqc_t *mqc)
-{
- if (*mqc->bp == 0xff) {
- mqc->bp++;
- *mqc->bp = mqc->c >> 20;
- mqc->c &= 0xfffff;
- mqc->ct = 7;
- } else {
- if ((mqc->c & 0x8000000) == 0) { /* ((mqc->c&0x8000000)==0) CHANGE */
- mqc->bp++;
- *mqc->bp = mqc->c >> 19;
- mqc->c &= 0x7ffff;
- mqc->ct = 8;
- } else {
- (*mqc->bp)++;
- if (*mqc->bp == 0xff) {
- mqc->c &= 0x7ffffff;
- mqc->bp++;
- *mqc->bp = mqc->c >> 20;
- mqc->c &= 0xfffff;
- mqc->ct = 7;
- } else {
- mqc->bp++;
- *mqc->bp = mqc->c >> 19;
- mqc->c &= 0x7ffff;
- mqc->ct = 8;
- }
- }
- }
-}
-
-static void mqc_renorme(opj_mqc_t *mqc)
-{
- do {
- mqc->a <<= 1;
- mqc->c <<= 1;
- mqc->ct--;
- if (mqc->ct == 0) {
- mqc_byteout(mqc);
- }
- } while ((mqc->a & 0x8000) == 0);
-}
-
-static void mqc_codemps(opj_mqc_t *mqc)
-{
- mqc->a -= (*mqc->curctx)->qeval;
- if ((mqc->a & 0x8000) == 0) {
- if (mqc->a < (*mqc->curctx)->qeval) {
- mqc->a = (*mqc->curctx)->qeval;
- } else {
- mqc->c += (*mqc->curctx)->qeval;
- }
- *mqc->curctx = (*mqc->curctx)->nmps;
- mqc_renorme(mqc);
- } else {
- mqc->c += (*mqc->curctx)->qeval;
- }
-}
-
-static void mqc_codelps(opj_mqc_t *mqc)
-{
- mqc->a -= (*mqc->curctx)->qeval;
- if (mqc->a < (*mqc->curctx)->qeval) {
- mqc->c += (*mqc->curctx)->qeval;
- } else {
- mqc->a = (*mqc->curctx)->qeval;
- }
- *mqc->curctx = (*mqc->curctx)->nlps;
- mqc_renorme(mqc);
-}
-
-static void mqc_setbits(opj_mqc_t *mqc)
-{
- unsigned int tempc = mqc->c + mqc->a;
- mqc->c |= 0xffff;
- if (mqc->c >= tempc) {
- mqc->c -= 0x8000;
- }
-}
-
-static int mqc_mpsexchange(opj_mqc_t *mqc)
-{
- int d;
- if (mqc->a < (*mqc->curctx)->qeval) {
- d = 1 - (*mqc->curctx)->mps;
- *mqc->curctx = (*mqc->curctx)->nlps;
- } else {
- d = (*mqc->curctx)->mps;
- *mqc->curctx = (*mqc->curctx)->nmps;
- }
-
- return d;
-}
-
-static int mqc_lpsexchange(opj_mqc_t *mqc)
-{
- int d;
- if (mqc->a < (*mqc->curctx)->qeval) {
- mqc->a = (*mqc->curctx)->qeval;
- d = (*mqc->curctx)->mps;
- *mqc->curctx = (*mqc->curctx)->nmps;
- } else {
- mqc->a = (*mqc->curctx)->qeval;
- d = 1 - (*mqc->curctx)->mps;
- *mqc->curctx = (*mqc->curctx)->nlps;
- }
-
- return d;
-}
-
-static void mqc_bytein(opj_mqc_t *mqc)
-{
- if (mqc->bp != mqc->end) {
- unsigned int c;
- if (mqc->bp + 1 != mqc->end) {
- c = *(mqc->bp + 1);
- } else {
- c = 0xff;
- }
- if (*mqc->bp == 0xff) {
- if (c > 0x8f) {
- mqc->c += 0xff00;
- mqc->ct = 8;
- } else {
- mqc->bp++;
- mqc->c += c << 9;
- mqc->ct = 7;
- }
- } else {
- mqc->bp++;
- mqc->c += c << 8;
- mqc->ct = 8;
- }
- } else {
- mqc->c += 0xff00;
- mqc->ct = 8;
- }
-}
-
-static void mqc_renormd(opj_mqc_t *mqc)
-{
- do {
- if (mqc->ct == 0) {
- mqc_bytein(mqc);
- }
- mqc->a <<= 1;
- mqc->c <<= 1;
- mqc->ct--;
- } while (mqc->a < 0x8000);
-}
-
-/*
-==========================================================
- MQ-Coder interface
-==========================================================
-*/
-
-opj_mqc_t* mqc_create()
-{
- opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
- return mqc;
-}
-
-void mqc_destroy(opj_mqc_t *mqc)
-{
- if (mqc) {
- opj_free(mqc);
- }
-}
-
-int mqc_numbytes(opj_mqc_t *mqc)
-{
- return mqc->bp - mqc->start;
-}
-
-void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp)
-{
- mqc_setcurctx(mqc, 0);
- mqc->a = 0x8000;
- mqc->c = 0;
- mqc->bp = bp - 1;
- mqc->ct = 12;
- if (*mqc->bp == 0xff) {
- mqc->ct = 13;
- }
- mqc->start = bp;
-}
-
-void mqc_setcurctx(opj_mqc_t *mqc, int ctxno)
-{
- mqc->curctx = &mqc->ctxs[ctxno];
-}
-
-void mqc_encode(opj_mqc_t *mqc, int d)
-{
- if ((*mqc->curctx)->mps == d) {
- mqc_codemps(mqc);
- } else {
- mqc_codelps(mqc);
- }
-}
-
-void mqc_flush(opj_mqc_t *mqc)
-{
- mqc_setbits(mqc);
- mqc->c <<= mqc->ct;
- mqc_byteout(mqc);
- mqc->c <<= mqc->ct;
- mqc_byteout(mqc);
-
- if (*mqc->bp != 0xff) {
- mqc->bp++;
- }
-}
-
-void mqc_bypass_init_enc(opj_mqc_t *mqc)
-{
- mqc->c = 0;
- mqc->ct = 8;
- /*if (*mqc->bp == 0xff) {
- mqc->ct = 7;
- } */
-}
-
-void mqc_bypass_enc(opj_mqc_t *mqc, int d)
-{
- mqc->ct--;
- mqc->c = mqc->c + (d << mqc->ct);
- if (mqc->ct == 0) {
- mqc->bp++;
- *mqc->bp = mqc->c;
- mqc->ct = 8;
- if (*mqc->bp == 0xff) {
- mqc->ct = 7;
- }
- mqc->c = 0;
- }
-}
-
-int mqc_bypass_flush_enc(opj_mqc_t *mqc)
-{
- unsigned char bit_padding;
-
- bit_padding = 0;
-
- if (mqc->ct != 0) {
- while (mqc->ct > 0) {
- mqc->ct--;
- mqc->c += bit_padding << mqc->ct;
- bit_padding = (bit_padding + 1) & 0x01;
- }
- mqc->bp++;
- *mqc->bp = mqc->c;
- mqc->ct = 8;
- mqc->c = 0;
- }
-
- return 1;
-}
-
-void mqc_reset_enc(opj_mqc_t *mqc)
-{
- mqc_resetstates(mqc);
- mqc_setstate(mqc, 18, 0, 46);
- mqc_setstate(mqc, 0, 0, 3);
- mqc_setstate(mqc, 1, 0, 4);
-}
-
-void mqc_reset_enc_3(opj_mqc_t *mqc)
-{
- mqc_resetstates(mqc);
- mqc_setstate(mqc, T1_3D_CTXNO_UNI, 0, 46);
- mqc_setstate(mqc, T1_3D_CTXNO_AGG, 0, 3);
- mqc_setstate(mqc, T1_3D_CTXNO_ZC, 0, 4);
-}
-
-int mqc_restart_enc(opj_mqc_t *mqc)
-{
- int correction = 1;
-
- /* <flush part> */
- int n = 27 - 15 - mqc->ct;
- mqc->c <<= mqc->ct;
- while (n > 0) {
- mqc_byteout(mqc);
- n -= mqc->ct;
- mqc->c <<= mqc->ct;
- }
- mqc_byteout(mqc);
-
- return correction;
-}
-
-void mqc_restart_init_enc(opj_mqc_t *mqc)
-{
- /* <Re-init part> */
- mqc_setcurctx(mqc, 0);
- mqc->a = 0x8000;
- mqc->c = 0;
- mqc->ct = 12;
- mqc->bp--;
- if (*mqc->bp == 0xff) {
- mqc->ct = 13;
- }
-}
-
-void mqc_erterm_enc(opj_mqc_t *mqc)
-{
- int k = 11 - mqc->ct + 1;
-
- while (k > 0) {
- mqc->c <<= mqc->ct;
- mqc->ct = 0;
- mqc_byteout(mqc);
- k -= mqc->ct;
- }
-
- if (*mqc->bp != 0xff) {
- mqc_byteout(mqc);
- }
-}
-
-void mqc_segmark_enc(opj_mqc_t *mqc)
-{
- int i;
- mqc_setcurctx(mqc, 18);
-
- for (i = 1; i < 5; i++) {
- mqc_encode(mqc, i % 2);
- }
-}
-
-void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len)
-{
- mqc_setcurctx(mqc, 0);
- mqc->start = bp;
- mqc->end = bp + len;
- mqc->bp = bp;
- if (len == 0) {
- mqc->c = 0xff << 16;
- } else {
- mqc->c = *mqc->bp << 16;
- }
- mqc_bytein(mqc);
- mqc->c <<= 7;
- mqc->ct -= 7;
- mqc->a = 0x8000;
-}
-
-int mqc_decode(opj_mqc_t *mqc)
-{
- int d;
- mqc->a -= (*mqc->curctx)->qeval;
- if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
- d = mqc_lpsexchange(mqc);
- mqc_renormd(mqc);
- } else {
- mqc->c -= (*mqc->curctx)->qeval << 16;
- if ((mqc->a & 0x8000) == 0) {
- d = mqc_mpsexchange(mqc);
- mqc_renormd(mqc);
- } else {
- d = (*mqc->curctx)->mps;
- }
- }
-
- return d;
-}
-
-void mqc_resetstates(opj_mqc_t *mqc)
-{
- int i;
- for (i = 0; i < MQC_NUMCTXS; i++) {
- mqc->ctxs[i] = mqc_states;
- }
-}
-
-void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob)
-{
- mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)];
-}
-
-
+++ /dev/null
-/*
- * 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
- * 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 __MQC_H
-#define __MQC_H
-/**
-@file mqc.h
-@brief Implementation of an MQ-Coder (MQC)
-
-The functions in MQC.C have for goal to realize the MQ-coder operations. The functions
-in MQC.C are used by some function in T1.C.
-*/
-
-/** @defgroup MQC MQC - Implementation of an MQ-Coder */
-/*@{*/
-
-/**
-This struct defines the state of a context.
-*/
-typedef struct opj_mqc_state {
- /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
- unsigned int qeval;
- /** the Most Probable Symbol (0 or 1) */
- int mps;
- /** next state if the next encoded symbol is the MPS */
- struct opj_mqc_state *nmps;
- /** next state if the next encoded symbol is the LPS */
- struct opj_mqc_state *nlps;
-} opj_mqc_state_t;
-
-#define MQC_NUMCTXS 32
-
-/**
-MQ coder
-*/
-typedef struct opj_mqc {
- unsigned int c;
- unsigned int a;
- unsigned int ct;
- unsigned char *bp;
- unsigned char *start;
- unsigned char *end;
- opj_mqc_state_t *ctxs[MQC_NUMCTXS];
- opj_mqc_state_t **curctx;
-} opj_mqc_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a new MQC handle
-@return Returns a new MQC handle if successful, returns NULL otherwise
-*/
-opj_mqc_t* mqc_create(void);
-/**
-Destroy a previously created MQC handle
-@param mqc MQC handle to destroy
-*/
-void mqc_destroy(opj_mqc_t *mqc);
-/**
-Return the number of bytes written/read since initialisation
-@param mqc MQC handle
-@return Returns the number of bytes already encoded
-*/
-int mqc_numbytes(opj_mqc_t *mqc);
-/**
-Reset the states of all the context of the coder/decoder
-(each context is set to a state where 0 and 1 are more or less equiprobable)
-@param mqc MQC handle
-*/
-void mqc_resetstates(opj_mqc_t *mqc);
-/**
-Set the state of a particular context
-@param mqc MQC handle
-@param ctxno Number that identifies the context
-@param msb The MSB of the new state of the context
-@param prob Number that identifies the probability of the symbols for the new state of the context
-*/
-void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob);
-/**
-Initialize the encoder
-@param mqc MQC handle
-@param bp Pointer to the start of the buffer where the bytes will be written
-*/
-void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp);
-/**
-Set the current context used for coding/decoding
-@param mqc MQC handle
-@param ctxno Number that identifies the context
-*/
-void mqc_setcurctx(opj_mqc_t *mqc, int ctxno);
-/**
-Encode a symbol using the MQ-coder
-@param mqc MQC handle
-@param d The symbol to be encoded (0 or 1)
-*/
-void mqc_encode(opj_mqc_t *mqc, int d);
-/**
-Flush the encoder, so that all remaining data is written
-@param mqc MQC handle
-*/
-void mqc_flush(opj_mqc_t *mqc);
-/**
-BYPASS mode switch, initialization operation.
-JPEG 2000 p 505.
-<h2>Not fully implemented and tested !!</h2>
-@param mqc MQC handle
-*/
-void mqc_bypass_init_enc(opj_mqc_t *mqc);
-/**
-BYPASS mode switch, coding operation.
-JPEG 2000 p 505.
-<h2>Not fully implemented and tested !!</h2>
-@param mqc MQC handle
-@param d The symbol to be encoded (0 or 1)
-*/
-void mqc_bypass_enc(opj_mqc_t *mqc, int d);
-/**
-BYPASS mode switch, flush operation
-<h2>Not fully implemented and tested !!</h2>
-@param mqc MQC handle
-@return Returns 1 (always)
-*/
-int mqc_bypass_flush_enc(opj_mqc_t *mqc);
-/**
-RESET mode switch
-@param mqc MQC handle
-*/
-void mqc_reset_enc(opj_mqc_t *mqc);
-/**
-RESET mode switch
-@param mqc MQC handle
-*/
-void mqc_reset_enc_3(opj_mqc_t *mqc);
-/**
-RESTART mode switch (TERMALL)
-@param mqc MQC handle
-@return Returns 1 (always)
-*/
-int mqc_restart_enc(opj_mqc_t *mqc);
-/**
-RESTART mode switch (TERMALL) reinitialisation
-@param mqc MQC handle
-*/
-void mqc_restart_init_enc(opj_mqc_t *mqc);
-/**
-ERTERM mode switch (PTERM)
-@param mqc MQC handle
-*/
-void mqc_erterm_enc(opj_mqc_t *mqc);
-/**
-SEGMARK mode switch (SEGSYM)
-@param mqc MQC handle
-*/
-void mqc_segmark_enc(opj_mqc_t *mqc);
-/**
-Initialize the decoder
-@param mqc MQC handle
-@param bp Pointer to the start of the buffer from which the bytes will be read
-@param len Length of the input buffer
-*/
-void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len);
-/**
-Decode a symbol
-@param mqc MQC handle
-@return Returns the decoded symbol (0 or 1)
-*/
-int mqc_decode(opj_mqc_t *mqc);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __MQC_H */
+++ /dev/null
-/*
- * 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) 2005, Herve Drolon, FreeImage Team
- * 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.
- */
-
-#ifdef _WIN32
-#include <windows.h>
-#endif /* _WIN32 */
-
-#include "opj_includes.h"
-#include "openjp3d.h"
-#define JP3D_VERSION "1.3.0"
-/* ---------------------------------------------------------------------- */
-#ifdef _WIN32
-#ifndef OPJ_STATIC
-BOOL APIENTRY
-DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
-{
- switch (ul_reason_for_call) {
- case DLL_PROCESS_ATTACH :
- break;
- case DLL_PROCESS_DETACH :
- break;
- case DLL_THREAD_ATTACH :
- case DLL_THREAD_DETACH :
- break;
- }
-
- return TRUE;
-}
-#endif /* OPJ_STATIC */
-#endif /* _WIN32 */
-
-/* ---------------------------------------------------------------------- */
-
-const char* OPJ_CALLCONV opj_version()
-{
- return JP3D_VERSION;
-}
-opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format)
-{
- opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_malloc(sizeof(opj_dinfo_t));
- if (!dinfo) {
- return NULL;
- }
- dinfo->is_decompressor = true;
- switch (format) {
- case CODEC_J3D:
- case CODEC_J2K:
- /* get a J3D decoder handle */
- dinfo->j3d_handle = (void*)j3d_create_decompress((opj_common_ptr)dinfo);
- if (!dinfo->j3d_handle) {
- opj_free(dinfo);
- return NULL;
- }
- break;
- default:
- opj_free(dinfo);
- return NULL;
- }
-
- dinfo->codec_format = format;
-
- return dinfo;
-}
-
-void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo)
-{
- if (dinfo) {
- /* destroy the codec */
- if (dinfo->codec_format != CODEC_UNKNOWN) {
- j3d_destroy_decompress((opj_j3d_t*)dinfo->j3d_handle);
- }
- /* destroy the decompressor */
- opj_free(dinfo);
- }
-}
-
-void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t
- *parameters)
-{
- if (parameters) {
- memset(parameters, 0, sizeof(opj_dparameters_t));
- /* default decoding parameters */
- parameters->cp_layer = 0;
- parameters->cp_reduce[0] = 0;
- parameters->cp_reduce[1] = 0;
- parameters->cp_reduce[2] = 0;
- parameters->bigendian = 0;
-
- parameters->decod_format = -1;
- parameters->cod_format = -1;
- }
-}
-
-void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo,
- opj_dparameters_t *parameters)
-{
- if (dinfo && parameters) {
- if (dinfo->codec_format != CODEC_UNKNOWN) {
- j3d_setup_decoder((opj_j3d_t*)dinfo->j3d_handle, parameters);
- }
- }
-}
-
-opj_volume_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio)
-{
- if (dinfo && cio) {
- if (dinfo->codec_format != CODEC_UNKNOWN) {
- return j3d_decode((opj_j3d_t*)dinfo->j3d_handle, cio);
- }
- }
-
- return NULL;
-}
-
-opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format)
-{
- opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_malloc(sizeof(opj_cinfo_t));
- if (!cinfo) {
- return NULL;
- }
- cinfo->is_decompressor = false;
- switch (format) {
- case CODEC_J3D:
- case CODEC_J2K:
- /* get a J3D coder handle */
- cinfo->j3d_handle = (void*)j3d_create_compress((opj_common_ptr)cinfo);
- if (!cinfo->j3d_handle) {
- opj_free(cinfo);
- return NULL;
- }
- break;
- default:
- opj_free(cinfo);
- return NULL;
- }
-
- cinfo->codec_format = format;
-
- return cinfo;
-}
-
-void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo)
-{
- if (cinfo) {
- /* destroy the codec */
- if (cinfo->codec_format != CODEC_UNKNOWN) {
- j3d_destroy_compress((opj_j3d_t*)cinfo->j3d_handle);
- }
- /* destroy the decompressor */
- opj_free(cinfo);
- }
-}
-
-void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t
- *parameters)
-{
- if (parameters) {
- memset(parameters, 0, sizeof(opj_cparameters_t));
- /* default coding parameters */
- parameters->numresolution[0] = 3;
- parameters->numresolution[1] = 3;
- parameters->numresolution[2] = 1;
- parameters->cblock_init[0] = 64;
- parameters->cblock_init[1] = 64;
- parameters->cblock_init[2] = 64;
- parameters->prog_order = LRCP;
- parameters->roi_compno = -1; /* no ROI */
- parameters->atk_wt[0] = 1; /* 5-3 WT */
- parameters->atk_wt[1] = 1; /* 5-3 WT */
- parameters->atk_wt[2] = 1; /* 5-3 WT */
- parameters->irreversible = 0;
- parameters->subsampling_dx = 1;
- parameters->subsampling_dy = 1;
- parameters->subsampling_dz = 1;
-
- parameters->decod_format = -1;
- parameters->cod_format = -1;
- parameters->encoding_format = ENCOD_2EB;
- parameters->transform_format = TRF_2D_DWT;
- }
-}
-
-void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo,
- opj_cparameters_t *parameters, opj_volume_t *volume)
-{
- if (cinfo && parameters && volume) {
- if (cinfo->codec_format != CODEC_UNKNOWN) {
- j3d_setup_encoder((opj_j3d_t*)cinfo->j3d_handle, parameters, volume);
- }
- }
-}
-
-bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio,
- opj_volume_t *volume, char *index)
-{
- if (cinfo && cio && volume) {
- if (cinfo->codec_format != CODEC_UNKNOWN) {
- return j3d_encode((opj_j3d_t*)cinfo->j3d_handle, cio, volume, index);
- }
- }
-
- return false;
-}
-
-
+++ /dev/null
-/*
- * 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.
- */
-#ifndef OPENJPEG_H
-#define OPENJPEG_H
-
-/*
-==========================================================
- Compiler directives
-==========================================================
-*/
-
-#if defined(OPJ_STATIC) || !defined(_WIN32)
-/* http://gcc.gnu.org/wiki/Visibility */
-#if __GNUC__ >= 4
-#define OPJ_API __attribute__ ((visibility ("default")))
-#define OPJ_LOCAL __attribute__ ((visibility ("hidden")))
-#else
-#define OPJ_API
-#define OPJ_LOCAL
-#endif
-#define OPJ_CALLCONV
-#else
-#define OPJ_CALLCONV __stdcall
-
-/*
-The following ifdef block is the standard way of creating macros which make exporting
-from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS
-symbol defined on the command line. this symbol should not be defined on any project
-that uses this DLL. This way any other project whose source files include this file see
-OPJ_API functions as being imported from a DLL, whereas this DLL sees symbols
-defined with this macro as being exported.
-*/
-#if defined(OPJ_EXPORTS) || defined(DLL_EXPORT)
-#define OPJ_API __declspec(dllexport)
-#else
-#define OPJ_API __declspec(dllimport)
-#endif /* OPJ_EXPORTS */
-#endif /* !OPJ_STATIC || !WIN32 */
-
-#ifndef __cplusplus
-#if defined(HAVE_STDBOOL_H)
-/*
-The C language implementation does correctly provide the standard header
-file "stdbool.h".
- */
-#include <stdbool.h>
-#else
-/*
-The C language implementation does not provide the standard header file
-"stdbool.h" as required by ISO/IEC 9899:1999. Try to compensate for this
-braindamage below.
-*/
-#if !defined(bool)
-#define bool int
-#endif
-#if !defined(true)
-#define true 1
-#endif
-#if !defined(false)
-#define false 0
-#endif
-#endif
-#endif /* __cplusplus */
-
-/*
-==========================================================
- Useful constant definitions
-==========================================================
-*/
-#ifndef MAX_SLICES
-#define MAX_SLICES 300 /**< Maximum allowed size for slices */
-#endif /* MAX_PATH */
-
-#ifndef MAX_PATH
-#define MAX_PATH 260 /**< Maximum allowed size for filenames */
-#endif /* MAX_PATH */
-
-#define J3D_MAXRLVLS 32 /**< Number of maximum resolution level authorized */
-#define J3D_MAXBANDS (7*J3D_MAXRLVLS + 1) /**< Number of maximum sub-band linked to number of resolution level */
-
-#define TINY 1.0E-20
-/*
-==========================================================
- enum definitions
-==========================================================
-*/
-
-#define J2K_CFMT 0
-#define J3D_CFMT 1
-#define LSE_CFMT 2
-
-#define BIN_DFMT 0
-#define PGX_DFMT 1
-#define IMG_DFMT 2
-/* ----------------------------------------------------------------------- */
-
-/** Progression order */
-typedef enum PROG_ORDER {
- /**< place-holder */
- PROG_UNKNOWN = -1,
- /**< layer-resolution-component-precinct order */
- LRCP = 0,
- /**< resolution-layer-component-precinct order */
- RLCP = 1,
- /**< resolution-precinct-component-layer order */
- RPCL = 2,
- /**< precinct-component-resolution-layer order */
- PCRL = 3,
- /**< component-precinct-resolution-layer order */
- CPRL = 4
-} OPJ_PROG_ORDER;
-
-/**
-Supported volume color spaces
-*/
-typedef enum COLOR_SPACE {
- /**< place-holder */
- CLRSPC_UNKNOWN = -1,
- /**< sRGB */
- CLRSPC_SRGB = 1,
- /**< grayscale */
- CLRSPC_GRAY = 2,
- /**< YUV */
- CLRSPC_SYCC = 3
-} OPJ_COLOR_SPACE;
-
-/**
-Supported codec
-*/
-typedef enum CODEC_FORMAT {
- /**< place-holder */
- CODEC_UNKNOWN = -1,
- /**< JPEG-2000 codestream : read/write */
- CODEC_J2K = 0,
- /**< JPEG-2000 Part 10 file format : read/write */
- CODEC_J3D = 1
-} OPJ_CODEC_FORMAT;
-
-/**
-Supported entropy coding algorithms
-*/
-typedef enum ENTROPY_CODING {
- /**< place-holder */
- ENCOD_UNKNOWN = -1,
- /**< 2D EBCOT encoding */
- ENCOD_2EB = 0,
- /**< 3D EBCOT encoding */
- ENCOD_3EB = 1,
- /**< Golomb-Rice coding with 2D context */
- ENCOD_2GR = 2,
- /**< Golomb-Rice coding with 3D context */
- ENCOD_3GR = 3
-} OPJ_ENTROPY_CODING;
-
-/**
-Supported transforms
-*/
-typedef enum TRANSFORM {
- /**< place-holder */
- TRF_UNKNOWN = -1,
- /**< 2D DWT, no transform in axial dim */
- TRF_2D_DWT = 0,
- /**< 3D DWT */
- TRF_3D_DWT = 1,
- /**< 3D prediction*/
- TRF_3D_RLS = 2,
- TRF_3D_LSE = 3
-} OPJ_TRANSFORM;
-/*
-==========================================================
- event manager typedef definitions
-==========================================================
-*/
-
-/**
-Callback function prototype for events
-@param msg Event message
-@param client_data
-*/
-typedef void (*opj_msg_callback)(const char *msg, void *client_data);
-
-/**
-Message handler object
-used for
-<ul>
-<li>Error messages
-<li>Warning messages
-<li>Debugging messages
-</ul>
-*/
-typedef struct opj_event_mgr {
- /** Error message callback if available, NULL otherwise */
- opj_msg_callback error_handler;
- /** Warning message callback if available, NULL otherwise */
- opj_msg_callback warning_handler;
- /** Debug message callback if available, NULL otherwise */
- opj_msg_callback info_handler;
-} opj_event_mgr_t;
-
-
-/*
-==========================================================
- codec typedef definitions
-==========================================================
-*/
-
-/**
-Progression order changes
-*/
-typedef struct opj_poc {
- int resno0, compno0;
- int layno1, resno1, compno1;
- OPJ_PROG_ORDER prg;
- int tile;
- char progorder[4];
-} opj_poc_t;
-
-
-/**
-Compression parameters
-*/
-typedef struct opj_cparameters {
- /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
- bool tile_size_on;
- /** XTOsiz */
- int cp_tx0;
- /** YTOsiz */
- int cp_ty0;
- /** ZTOsiz */
- int cp_tz0;
-
- /** XTsiz */
- int cp_tdx;
- /** YTsiz */
- int cp_tdy;
- /** ZTsiz */
- int cp_tdz;
-
- /** allocation by rate/distortion */
- int cp_disto_alloc;
- /** allocation by fixed layer */
- int cp_fixed_alloc;
- /** add fixed_quality */
- int cp_fixed_quality;
- /** fixed layer */
- int *cp_matrice;
- /** number of layers */
- int tcp_numlayers;
- /** rates for successive layers */
- float tcp_rates[100];
- /** psnr's for successive layers */
- float tcp_distoratio[100];
- /** comment for coding */
- char *cp_comment;
- /** csty : coding style */
- int csty;
- /** DC offset (DCO) */
- int dcoffset;
- /** progression order (default LRCP) */
- OPJ_PROG_ORDER prog_order;
- /** progression order changes */
- opj_poc_t POC[J3D_MAXRLVLS - 1];
- /** number of progression order changes (POC), default to 0 */
- int numpocs;
-
- /** number of resolutions */
- int numresolution[3];
- /** initial code block width, height and depth, default to 64 */
- int cblock_init[3];
- /** mode switch (1=BYPASS(LAZY) 2=RESET 4=RESTART(TERMALL) 8=VSC 16=ERTERM(SEGTERM) 32=SEGMARK(SEGSYM)) */
- int mode;
-
- /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */
- int irreversible;
- /** WT from ATK, default to 0 (false), no of atk used */
- int atk_wt[3];
- /** region of interest: affected component in [0..3], -1 means no ROI */
- int roi_compno;
- /** region of interest: upshift value */
- int roi_shift;
-
- /* number of precinct size specifications */
- int res_spec;
- /** initial precinct width */
- int prct_init[3][J3D_MAXRLVLS];
-
- /** transform format 0: 0: 2DWT, 1: 2D1P, 2: 3DWT, 3: 3RLS */
- OPJ_TRANSFORM transform_format;
- /** output file format 0: 2EB, 1: 3EB, 2: 2GR, 3: 3GR, 4: GRI */
- OPJ_ENTROPY_CODING encoding_format;
-
- /**@name command line encoder parameters (not used inside the library) */
- /*@{*/
- char infile[MAX_PATH]; /** input file name */
- char outfile[MAX_PATH]; /** output file name */
- char imgfile[MAX_PATH]; /** IMG file name for BIN volumes*/
- int index_on; /** creation of an index file, default to 0 (false) */
- char index[MAX_PATH]; /** index file name */
-
- int volume_offset_x0; /** subvolume encoding: origin volume offset in x, y and z direction */
- int volume_offset_y0;
- int volume_offset_z0;
-
- int subsampling_dx; /** subsampling value for dx */
- int subsampling_dy;
- int subsampling_dz;
-
- int decod_format; /** input file format 0: BIN, 1: PGX */
- int cod_format; /** output file format 0: JP3D */
- /*@}*/
-} opj_cparameters_t;
-
-/**
-Decompression parameters
-*/
-typedef struct opj_dparameters {
- /** Set the number of highest resolution levels to be discarded. if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, volume is decoded to the full resolution */
- int cp_reduce[3];
- /** Set the maximum number of quality layers to decode. if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
- int cp_layer;
- int bigendian;
-
- /**@name command line encoder parameters (not used inside the library) */
- /*@{*/
- /** input file name */
- char infile[MAX_PATH];
- /** output file name */
- char outfile[MAX_PATH];
- /** IMG file name for BIN volumes*/
- char imgfile[MAX_PATH];
- /** Original file name for PSNR measures*/
- char original[MAX_PATH];
- /** input file format 0: J2K, 1: JP3D */
- int decod_format;
- /** input file format 0: BIN, 1: PGM */
- int cod_format;
- /** original file format 0: BIN, 1: PGM */
- int orig_format;
- /*@}*/
-} opj_dparameters_t;
-
-/** Common fields between JPEG-2000 compression and decompression master structs. */
-#define opj_common_fields \
- opj_event_mgr_t *event_mgr; /**< pointer to the event manager */\
- void * client_data; /**< Available for use by application */\
- bool is_decompressor; /**< So common code can tell which is which */\
- OPJ_CODEC_FORMAT codec_format; /**< selected codec */\
- OPJ_ENTROPY_CODING encoding_format; /**< selected entropy coding */\
- OPJ_TRANSFORM transform_format; /**< selected transform */\
- void *j3d_handle /**< pointer to the J3D codec */
-
-/* Routines that are to be used by both halves of the library are declared
- * to receive a pointer to this structure. There are no actual instances of
- * opj_common_struct_t, only of opj_cinfo_t and opj_dinfo_t.
- */
-typedef struct opj_common_struct {
- opj_common_fields; /* Fields common to both master struct types */
- /* Additional fields follow in an actual opj_cinfo_t or
- * opj_dinfo_t. All three structs must agree on these
- * initial fields! (This would be a lot cleaner in C++.)
- */
-} opj_common_struct_t;
-
-typedef opj_common_struct_t * opj_common_ptr;
-
-/**
-Compression context info
-*/
-typedef struct opj_cinfo {
- /** Fields shared with opj_dinfo_t */
- opj_common_fields;
- /* other specific fields go here */
-} opj_cinfo_t;
-
-/**
-Decompression context info
-*/
-typedef struct opj_dinfo {
- /** Fields shared with opj_cinfo_t */
- opj_common_fields;
- /* other specific fields go here */
-} opj_dinfo_t;
-
-/*
-==========================================================
- I/O stream typedef definitions
-==========================================================
-*/
-
-/*
- * Stream open flags.
- */
-/** The stream was opened for reading. */
-#define OPJ_STREAM_READ 0x0001
-/** The stream was opened for writing. */
-#define OPJ_STREAM_WRITE 0x0002
-
-/**
-Byte input-output stream (CIO)
-*/
-typedef struct opj_cio {
- /** codec context */
- opj_common_ptr cinfo;
- /** open mode (read/write) either OPJ_STREAM_READ or OPJ_STREAM_WRITE */
- int openmode;
- /** pointer to the start of the buffer */
- unsigned char *buffer;
- /** buffer size in bytes */
- int length;
- /** pointer to the start of the stream */
- unsigned char *start;
- /** pointer to the end of the stream */
- unsigned char *end;
- /** pointer to the current position */
- unsigned char *bp;
-} opj_cio_t;
-
-/*
-==========================================================
- volume typedef definitions
-==========================================================
-*/
-
-/**
-Defines a single volume component
-*/
-typedef struct opj_volume_comp {
- /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
- int dx;
- /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
- int dy;
- /** ZRsiz: vertical separation of a sample of ith component with respect to the reference grid */
- int dz;
- /** data width */
- int w;
- /** data height */
- int h;
- /** data length : no of slices */
- int l;
- /** x component offset compared to the whole volume */
- int x0;
- /** y component offset compared to the whole volume */
- int y0;
- /** z component offset compared to the whole volume */
- int z0;
- /** precision */
- int prec;
- /** volume depth in bits */
- int bpp;
- /** DC offset (15444-2) */
- int dcoffset;
- /** signed (1) / unsigned (0) */
- int sgnd;
- /** BE byte order (1) / LE byte order (0) */
- int bigendian;
- /** number of decoded resolution */
- int resno_decoded[3];
- /** number of division by 2 of the out volume compared to the original size of volume */
- int factor[3];
- /** volume component data */
- int *data;
-} opj_volume_comp_t;
-
-/**
-Defines volume data and characteristics
-*/
-typedef struct opj_volume {
- /** XOsiz: horizontal offset from the origin of the reference grid to the left side of the volume area */
- int x0;
- /** YOsiz: vertical offset from the origin of the reference grid to the top side of the volume area */
- int y0;
- /** ZOsiz: vertical offset from the origin of the reference grid to the top side of the volume area */
- int z0;
- /** Xsiz: width of the reference grid */
- int x1;
- /** Ysiz: height of the reference grid */
- int y1;
- /** Zsiz: length of the reference grid */
- int z1;
- /** number of components in the volume */
- int numcomps;
- /** number of slices in the volume */
- int numslices;
- /** color space: sRGB, Greyscale or YUV */
- OPJ_COLOR_SPACE color_space;
- /** volume components */
- opj_volume_comp_t *comps;
-} opj_volume_t;
-
-/**
-Component parameters structure used by the opj_volume_create function
-*/
-typedef struct opj_volume_comptparm {
- /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
- int dx;
- /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
- int dy;
- /** ZRsiz: axial separation of a sample of ith component with respect to the reference grid */
- int dz;
- /** data width */
- int w;
- /** data height */
- int h;
- /** data length */
- int l;
- /** x component offset compared to the whole volume */
- int x0;
- /** y component offset compared to the whole volume */
- int y0;
- /** z component offset compared to the whole volume */
- int z0;
- /** precision */
- int prec;
- /** volume depth in bits */
- int bpp;
- /** signed (1) / unsigned (0) */
- int sgnd;
- /** DC offset*/
- int dcoffset;
- /** BE byte order (1) / LE byte order (0) */
- int bigendian;
-} opj_volume_cmptparm_t;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/*
-==========================================================
- openjpeg version
-==========================================================
-*/
-
-OPJ_API const char * OPJ_CALLCONV opj_version(void);
-
-/*
-==========================================================
- volume functions definitions
-==========================================================
-*/
-
-/**
-Create an volume
-@param numcmpts number of components
-@param cmptparms components parameters
-@param clrspc volume color space
-@return returns a new volume structure if successful, returns NULL otherwise
-*/
-OPJ_API opj_volume_t* OPJ_CALLCONV opj_volume_create(int numcmpts,
- opj_volume_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
-
-/**
-Deallocate any resources associated with an volume
-@param volume volume to be destroyed
-*/
-OPJ_API void OPJ_CALLCONV opj_volume_destroy(opj_volume_t *volume);
-
-/*
-==========================================================
- stream functions definitions
-==========================================================
-*/
-
-/**
-Open and allocate a memory stream for read / write.
-On reading, the user must provide a buffer containing encoded data. The buffer will be
-wrapped by the returned CIO handle.
-On writing, buffer parameters must be set to 0: a buffer will be allocated by the library
-to contain encoded data.
-@param cinfo Codec context info
-@param buffer Reading: buffer address. Writing: NULL
-@param length Reading: buffer length. Writing: 0
-@return Returns a CIO handle if successful, returns NULL otherwise
-*/
-OPJ_API opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo,
- unsigned char *buffer, int length);
-
-/**
-Close and free a CIO handle
-@param cio CIO handle to free
-*/
-OPJ_API void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio);
-
-/**
-Get position in byte stream
-@param cio CIO handle
-@return Returns the position in bytes
-*/
-OPJ_API int OPJ_CALLCONV cio_tell(opj_cio_t *cio);
-/**
-Set position in byte stream
-@param cio CIO handle
-@param pos Position, in number of bytes, from the beginning of the stream
-*/
-OPJ_API void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos);
-
-/*
-==========================================================
- event manager functions definitions
-==========================================================
-*/
-
-OPJ_API opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo,
- opj_event_mgr_t *event_mgr, void *context);
-
-/*
-==========================================================
- codec functions definitions
-==========================================================
-*/
-/**
-Creates a J3D decompression structure
-@param format Decoder to select
-@return Returns a handle to a decompressor if successful, returns NULL otherwise
-*/
-OPJ_API opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(
- OPJ_CODEC_FORMAT format);
-/**
-Destroy a decompressor handle
-@param dinfo decompressor handle to destroy
-*/
-OPJ_API void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo);
-/**
-Set decoding parameters to default values
-@param parameters Decompression parameters
-*/
-OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters(
- opj_dparameters_t *parameters);
-/**
-Setup the decoder decoding parameters using user parameters.
-Decoding parameters are returned in j3d->cp.
-@param dinfo decompressor handle
-@param parameters decompression parameters
-*/
-OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo,
- opj_dparameters_t *parameters);
-/**
-Decode an volume from a JPEG-2000 codestream
-@param dinfo decompressor handle
-@param cio Input buffer stream
-@return Returns a decoded volume if successful, returns NULL otherwise
-*/
-OPJ_API opj_volume_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo,
- opj_cio_t *cio);
-/**
-Creates a J3D/JP2 compression structure
-@param format Coder to select
-@return Returns a handle to a compressor if successful, returns NULL otherwise
-*/
-OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format);
-/**
-Destroy a compressor handle
-@param cinfo compressor handle to destroy
-*/
-OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo);
-/**
-Set encoding parameters to default values, that means :
-<ul>
-<li>Lossless
-<li>1 tile
-<li>Size of precinct : 2^15 x 2^15 (means 1 precinct)
-<li>Size of code-block : 64 x 64
-<li>Number of resolutions: 6
-<li>No SOP marker in the codestream
-<li>No EPH marker in the codestream
-<li>No sub-sampling in x or y direction
-<li>No mode switch activated
-<li>Progression order: LRCP
-<li>No index file
-<li>No ROI upshifted
-<li>No offset of the origin of the volume
-<li>No offset of the origin of the tiles
-<li>Reversible DWT 5-3
-</ul>
-@param parameters Compression parameters
-*/
-OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(
- opj_cparameters_t *parameters);
-/**
-Setup the encoder parameters using the current volume and using user parameters.
-@param cinfo compressor handle
-@param parameters compression parameters
-@param volume input filled volume
-*/
-OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo,
- opj_cparameters_t *parameters, opj_volume_t *volume);
-/**
-Encode an volume into a JPEG-2000 codestream
-@param cinfo compressor handle
-@param cio Output buffer stream
-@param volume Volume to encode
-@param index Name of the index file if required, NULL otherwise
-@return Returns true if successful, returns false otherwise
-*/
-OPJ_API bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio,
- opj_volume_t *volume, char *index);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* OPENJPEG_H */
+++ /dev/null
-/*
- * 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) 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 OPJ_INCLUDES_H
-#define OPJ_INCLUDES_H
-
-/*
- ==========================================================
- Standard includes used by the library
- ==========================================================
-*/
-#include <memory.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <float.h>
-#include <time.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <ctype.h>
-#include <assert.h>
-/*
- ==========================================================
- OpenJPEG interface
- ==========================================================
- */
-#include "openjp3d.h"
-
-/*
- ==========================================================
- OpenJPEG modules
- ==========================================================
-*/
-
-#include "jp3d_lib.h"
-#include "event.h"
-#include "cio.h"
-
-#include "volume.h"
-#include "jp3d.h"
-
-#include "mqc.h"
-#include "raw.h"
-#include "bio.h"
-#include "tgt.h"
-#include "tcd.h"
-#include "t1.h"
-#include "t1_3d.h"
-#include "dwt.h"
-#include "pi.h"
-#include "t2.h"
-#include "mct.h"
-#include "int.h"
-#include "fix.h"
-
-#endif /* OPJ_INCLUDES_H */
+++ /dev/null
-/*
- * 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, LPI-UVA, 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 "opj_includes.h"
-
-/** @defgroup PI PI - Implementation of a packet iterator */
-/*@{*/
-
-/** @name Funciones locales */
-/*@{*/
-
-/**
-Get next packet in layer-resolution-component-precinct order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static bool pi_next_lrcp(opj_pi_iterator_t * pi);
-/**
-Get next packet in resolution-layer-component-precinct order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static bool pi_next_rlcp(opj_pi_iterator_t * pi);
-/**
-Get next packet in resolution-precinct-component-layer order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static bool pi_next_rpcl(opj_pi_iterator_t * pi);
-/**
-Get next packet in precinct-component-resolution-layer order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static bool pi_next_pcrl(opj_pi_iterator_t * pi);
-/**
-Get next packet in component-precinct-resolution-layer order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static bool pi_next_cprl(opj_pi_iterator_t * pi);
-
-/*@}*/
-
-/*@}*/
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-static bool pi_next_lrcp(opj_pi_iterator_t * pi)
-{
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- comp = &pi->comps[pi->compno];
- res = &comp->resolutions[pi->resno];
- goto LABEL_SKIP;
- } else {
- pi->first = 0;
- }
-
- for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
- for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- comp = &pi->comps[pi->compno];
- if (pi->resno >= comp->numresolution[0]) {
- continue;
- }
- res = &comp->resolutions[pi->resno];
- /*for (pi->precno = 0; pi->precno < (res->prctno[0] * res->prctno[1]); pi->precno++) {*/
- for (pi->precno = 0;
- pi->precno < (res->prctno[0] * res->prctno[1] * res->prctno[2]); pi->precno++) {
- index = pi->layno * pi->step_l
- + pi->resno * pi->step_r
- + pi->compno * pi->step_c
- + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return true;
- }
-LABEL_SKIP:
- ;
-
- }
- }
- }
- }
-
- return false;
-}
-
-static bool pi_next_rlcp(opj_pi_iterator_t * pi)
-{
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- comp = &pi->comps[pi->compno];
- res = &comp->resolutions[pi->resno];
- goto LABEL_SKIP;
- } else {
- pi->first = 0;
- }
-
- for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
- for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- comp = &pi->comps[pi->compno];
- if (pi->resno >= comp->numresolution[0]) {
- continue;
- }
- res = &comp->resolutions[pi->resno];
- /*for (pi->precno = 0; pi->precno < (res->prctno[0] * res->prctno[1]); pi->precno++) {*/
- for (pi->precno = 0;
- pi->precno < (res->prctno[0] * res->prctno[1] * res->prctno[2]); pi->precno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno *
- pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return true;
- }
-LABEL_SKIP:
- ;
- }
- }
- }
- }
-
- return false;
-}
-
-static bool pi_next_rpcl(opj_pi_iterator_t * pi)
-{
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- goto LABEL_SKIP;
- } else {
- int compno, resno;
- pi->first = 0;
- pi->dx = 0;
- pi->dy = 0;
- for (compno = 0; compno < pi->numcomps; compno++) {
- comp = &pi->comps[compno];
- for (resno = 0; resno < comp->numresolution[0]; resno++) {
- int dx, dy, dz;
- res = &comp->resolutions[resno];
- dx = comp->dx * (1 << (res->pdx + comp->numresolution[0] - 1 - resno));
- dy = comp->dy * (1 << (res->pdy + comp->numresolution[1] - 1 - resno));
- dz = comp->dz * (1 << (res->pdz + comp->numresolution[2] - 1 - resno));
- pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
- pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
- pi->dz = !pi->dz ? dz : int_min(pi->dz, dz);
- }
- }
- }
-
- for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
- for (pi->z = pi->tz0; pi->z < pi->tz1; pi->z += pi->dz - (pi->z % pi->dz)) {
- for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) {
- for (pi->x = pi->tx0; pi->x < pi->tx1; pi->x += pi->dx - (pi->x % pi->dx)) {
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- int levelnox, levelnoy, levelnoz;
- int trx0, try0, trz0;
- int trx1, try1, trz1;
- int rpx, rpy, rpz;
- int prci, prcj, prck;
- comp = &pi->comps[pi->compno];
- if (pi->resno >= comp->numresolution[0]) {
- continue;
- }
- res = &comp->resolutions[pi->resno];
- levelnox = comp->numresolution[0] - 1 - pi->resno;
- levelnoy = comp->numresolution[1] - 1 - pi->resno;
- levelnoz = comp->numresolution[2] - 1 - pi->resno;
- trx0 = int_ceildiv(pi->tx0, comp->dx << levelnox);
- try0 = int_ceildiv(pi->ty0, comp->dy << levelnoy);
- trz0 = int_ceildiv(pi->tz0, comp->dz << levelnoz);
- trx1 = int_ceildiv(pi->tx1, comp->dx << levelnox);
- try1 = int_ceildiv(pi->ty1, comp->dy << levelnoy);
- trz1 = int_ceildiv(pi->tz1, comp->dz << levelnoz);
- rpx = res->pdx + levelnox;
- rpy = res->pdy + levelnoy;
- rpz = res->pdz + levelnoz;
-
- /* To avoid divisions by zero / undefined behaviour on shift */
- if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx ||
- rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy ||
- rpz >= 31 || ((comp->dz << rpz) >> rpz) != comp->dz) {
- continue;
- }
-
- if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 &&
- (trx0 << levelnox) % (1 << rpx)))) {
- continue;
- }
- if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 &&
- (try0 << levelnoy) % (1 << rpx)))) {
- continue;
- }
- if ((!(pi->z % (comp->dz << rpz) == 0) || (pi->z == pi->tz0 &&
- (trz0 << levelnoz) % (1 << rpx)))) {
- continue;
- }
- if ((res->prctno[0] == 0) || (res->prctno[1] == 0) || (res->prctno[2] == 0)) {
- continue;
- }
-
- if ((trx0 == trx1) || (try0 == try1) || (trz0 == trz1)) {
- continue;
- }
-
- prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelnox), res->pdx)
- - int_floordivpow2(trx0, res->pdx);
- prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelnoy), res->pdy)
- - int_floordivpow2(try0, res->pdy);
- prck = int_floordivpow2(int_ceildiv(pi->z, comp->dz << levelnoz), res->pdz)
- - int_floordivpow2(trz0, res->pdz);
- pi->precno = prci + prcj * res->prctno[0] + prck * res->prctno[0] *
- res->prctno[1];
- for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno *
- pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return true;
- }
-LABEL_SKIP:
- ;
- }
- }
- }
- }
- }
- }
-
- return false;
-}
-
-static bool pi_next_pcrl(opj_pi_iterator_t * pi)
-{
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- comp = &pi->comps[pi->compno];
- goto LABEL_SKIP;
- } else {
- int compno, resno;
- pi->first = 0;
- pi->dx = 0;
- pi->dy = 0;
- pi->dz = 0;
- for (compno = 0; compno < pi->numcomps; compno++) {
- comp = &pi->comps[compno];
- for (resno = 0; resno < comp->numresolution[0]; resno++) {
- int dx, dy, dz;
- res = &comp->resolutions[resno];
- dx = comp->dx * (1 << (res->pdx + comp->numresolution[0] - 1 - resno));
- dy = comp->dy * (1 << (res->pdy + comp->numresolution[1] - 1 - resno));
- dz = comp->dz * (1 << (res->pdy + comp->numresolution[2] - 1 - resno));
- pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
- pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
- pi->dz = !pi->dz ? dz : int_min(pi->dz, dz);
- }
- }
- }
-
- for (pi->z = pi->tz0; pi->z < pi->tz1; pi->z += pi->dz - (pi->z % pi->dz)) {
- for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) {
- for (pi->x = pi->tx0; pi->x < pi->tx1; pi->x += pi->dx - (pi->x % pi->dx)) {
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- comp = &pi->comps[pi->compno];
- for (pi->resno = pi->poc.resno0;
- pi->resno < int_min(pi->poc.resno1, comp->numresolution[0]); pi->resno++) {
- int levelnox, levelnoy, levelnoz;
- int trx0, try0, trz0;
- int trx1, try1, trz1;
- int rpx, rpy, rpz;
- int prci, prcj, prck;
- comp = &pi->comps[pi->compno];
- if (pi->resno >= comp->numresolution[0]) {
- continue;
- }
- res = &comp->resolutions[pi->resno];
- levelnox = comp->numresolution[0] - 1 - pi->resno;
- levelnoy = comp->numresolution[1] - 1 - pi->resno;
- levelnoz = comp->numresolution[2] - 1 - pi->resno;
- trx0 = int_ceildiv(pi->tx0, comp->dx << levelnox);
- try0 = int_ceildiv(pi->ty0, comp->dy << levelnoy);
- trz0 = int_ceildiv(pi->tz0, comp->dz << levelnoz);
- trx1 = int_ceildiv(pi->tx1, comp->dx << levelnox);
- try1 = int_ceildiv(pi->ty1, comp->dy << levelnoy);
- trz1 = int_ceildiv(pi->tz1, comp->dz << levelnoz);
- rpx = res->pdx + levelnox;
- rpy = res->pdy + levelnoy;
- rpz = res->pdz + levelnoz;
-
- /* To avoid divisions by zero / undefined behaviour on shift */
- if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx ||
- rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy ||
- rpz >= 31 || ((comp->dz << rpz) >> rpz) != comp->dz) {
- continue;
- }
-
- if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 &&
- (trx0 << levelnox) % (1 << rpx)))) {
- continue;
- }
- if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 &&
- (try0 << levelnoy) % (1 << rpx)))) {
- continue;
- }
- if ((!(pi->z % (comp->dz << rpz) == 0) || (pi->z == pi->tz0 &&
- (trz0 << levelnoz) % (1 << rpx)))) {
- continue;
- }
- if ((res->prctno[0] == 0) || (res->prctno[1] == 0) || (res->prctno[2] == 0)) {
- continue;
- }
-
- if ((trx0 == trx1) || (try0 == try1) || (trz0 == trz1)) {
- continue;
- }
-
- prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelnox), res->pdx)
- - int_floordivpow2(trx0, res->pdx);
- prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelnoy), res->pdy)
- - int_floordivpow2(try0, res->pdy);
- prck = int_floordivpow2(int_ceildiv(pi->z, comp->dz << levelnoz), res->pdz)
- - int_floordivpow2(trz0, res->pdz);
- pi->precno = prci + prcj * res->prctno[0] + prck * res->prctno[0] *
- res->prctno[1];
- for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno *
- pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return true;
- }
-LABEL_SKIP:
- ;
- }
- }
- }
- }
- }
- }
-
- return false;
-}
-
-static bool pi_next_cprl(opj_pi_iterator_t * pi)
-{
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- comp = &pi->comps[pi->compno];
- goto LABEL_SKIP;
- } else {
- pi->first = 0;
- }
-
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- int resno;
- comp = &pi->comps[pi->compno];
- pi->dx = 0;
- pi->dy = 0;
- pi->dz = 0;
- for (resno = 0; resno < comp->numresolution[0]; resno++) {
- int dx, dy, dz;
- res = &comp->resolutions[resno];
- dx = comp->dx * (1 << (res->pdx + comp->numresolution[0] - 1 - resno));
- dy = comp->dy * (1 << (res->pdy + comp->numresolution[1] - 1 - resno));
- dz = comp->dz * (1 << (res->pdz + comp->numresolution[2] - 1 - resno));
- pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
- pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
- pi->dz = !pi->dz ? dz : int_min(pi->dz, dz);
- }
- for (pi->z = pi->tz0; pi->z < pi->tz1; pi->z += pi->dz - (pi->z % pi->dz)) {
- for (pi->y = pi->ty0; pi->y < pi->ty1; pi->y += pi->dy - (pi->y % pi->dy)) {
- for (pi->x = pi->tx0; pi->x < pi->tx1; pi->x += pi->dx - (pi->x % pi->dx)) {
- for (pi->resno = pi->poc.resno0;
- pi->resno < int_min(pi->poc.resno1, comp->numresolution[0]); pi->resno++) {
- int levelnox, levelnoy, levelnoz;
- int trx0, try0, trz0;
- int trx1, try1, trz1;
- int rpx, rpy, rpz;
- int prci, prcj, prck;
- comp = &pi->comps[pi->compno];
- if (pi->resno >= comp->numresolution[0]) {
- continue;
- }
- res = &comp->resolutions[pi->resno];
- levelnox = comp->numresolution[0] - 1 - pi->resno;
- levelnoy = comp->numresolution[1] - 1 - pi->resno;
- levelnoz = comp->numresolution[2] - 1 - pi->resno;
- trx0 = int_ceildiv(pi->tx0, comp->dx << levelnox);
- try0 = int_ceildiv(pi->ty0, comp->dy << levelnoy);
- trz0 = int_ceildiv(pi->tz0, comp->dz << levelnoz);
- trx1 = int_ceildiv(pi->tx1, comp->dx << levelnox);
- try1 = int_ceildiv(pi->ty1, comp->dy << levelnoy);
- trz1 = int_ceildiv(pi->tz1, comp->dz << levelnoz);
- rpx = res->pdx + levelnox;
- rpy = res->pdy + levelnoy;
- rpz = res->pdz + levelnoz;
-
- /* To avoid divisions by zero / undefined behaviour on shift */
- if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx ||
- rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy ||
- rpz >= 31 || ((comp->dz << rpz) >> rpz) != comp->dz) {
- continue;
- }
-
- if ((!(pi->x % (comp->dx << rpx) == 0) || (pi->x == pi->tx0 &&
- (trx0 << levelnox) % (1 << rpx)))) {
- continue;
- }
- if ((!(pi->y % (comp->dy << rpy) == 0) || (pi->y == pi->ty0 &&
- (try0 << levelnoy) % (1 << rpx)))) {
- continue;
- }
- if ((!(pi->z % (comp->dz << rpz) == 0) || (pi->z == pi->tz0 &&
- (trz0 << levelnoz) % (1 << rpx)))) {
- continue;
- }
- if ((res->prctno[0] == 0) || (res->prctno[1] == 0) || (res->prctno[2] == 0)) {
- continue;
- }
-
- if ((trx0 == trx1) || (try0 == try1) || (trz0 == trz1)) {
- continue;
- }
-
- prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelnox), res->pdx)
- - int_floordivpow2(trx0, res->pdx);
- prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelnoy), res->pdy)
- - int_floordivpow2(try0, res->pdy);
- prck = int_floordivpow2(int_ceildiv(pi->z, comp->dz << levelnoz), res->pdz)
- - int_floordivpow2(trz0, res->pdz);
- pi->precno = prci + prcj * res->prctno[0] + prck * res->prctno[0] *
- res->prctno[1];
- for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno *
- pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return true;
- }
-LABEL_SKIP:
- ;
- }
- }
- }
- }
- }
- }
-
- return false;
-}
-
-/*
-==========================================================
- Packet iterator interface
-==========================================================
-*/
-
-opj_pi_iterator_t *pi_create(opj_volume_t *volume, opj_cp_t *cp, int tileno)
-{
- int p, q, r;
- int compno, resno, pino;
- opj_pi_iterator_t *pi = NULL;
- opj_tcp_t *tcp = NULL;
- opj_tccp_t *tccp = NULL;
- size_t array_size;
-
- tcp = &cp->tcps[tileno];
-
- array_size = (tcp->numpocs + 1) * sizeof(opj_pi_iterator_t);
- pi = (opj_pi_iterator_t *) opj_malloc(array_size);
- if (!pi) {
- fprintf(stdout, "[ERROR] Malloc of opj_pi_iterator failed \n");
- return NULL;
- }
-
- for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */
- int maxres = 0;
- int maxprec = 0;
- p = tileno % cp->tw;
- q = tileno / cp->tw;
- r = tileno / (cp->tw * cp->th);
-
- pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, volume->x0);
- pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, volume->y0);
- pi[pino].tz0 = int_max(cp->tz0 + r * cp->tdz, volume->z0);
- pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, volume->x1);
- pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, volume->y1);
- pi[pino].tz1 = int_min(cp->tz0 + (r + 1) * cp->tdz, volume->z1);
- pi[pino].numcomps = volume->numcomps;
-
- array_size = volume->numcomps * sizeof(opj_pi_comp_t);
- pi[pino].comps = (opj_pi_comp_t *) opj_malloc(array_size);
- if (!pi[pino].comps) {
- fprintf(stdout, "[ERROR] Malloc of opj_pi_comp failed \n");
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
- memset(pi[pino].comps, 0, array_size);
-
- for (compno = 0; compno < pi->numcomps; compno++) {
- int tcx0, tcx1, tcy0, tcy1, tcz0, tcz1;
- int i;
- opj_pi_comp_t *comp = &pi[pino].comps[compno];
- tccp = &tcp->tccps[compno];
-
- comp->dx = volume->comps[compno].dx;
- comp->dy = volume->comps[compno].dy;
- comp->dz = volume->comps[compno].dz;
- for (i = 0; i < 3; i++) {
- comp->numresolution[i] = tccp->numresolution[i];
- if (comp->numresolution[i] > maxres) {
- maxres = comp->numresolution[i];
- }
- }
- array_size = comp->numresolution[0] * sizeof(opj_pi_resolution_t);
- comp->resolutions = (opj_pi_resolution_t *) opj_malloc(array_size);
- if (!comp->resolutions) {
- fprintf(stdout, "[ERROR] Malloc of opj_pi_resolution failed \n");
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
-
- tcx0 = int_ceildiv(pi->tx0, comp->dx);
- tcy0 = int_ceildiv(pi->ty0, comp->dy);
- tcz0 = int_ceildiv(pi->tz0, comp->dz);
- tcx1 = int_ceildiv(pi->tx1, comp->dx);
- tcy1 = int_ceildiv(pi->ty1, comp->dy);
- tcz1 = int_ceildiv(pi->tz1, comp->dz);
-
- for (resno = 0; resno < comp->numresolution[0]; resno++) {
- int levelnox, levelnoy, levelnoz, diff;
- int rx0, ry0, rz0, rx1, ry1, rz1;
- int px0, py0, pz0, px1, py1, pz1;
- opj_pi_resolution_t *res = &comp->resolutions[resno];
- if (tccp->csty & J3D_CCP_CSTY_PRT) {
- res->pdx = tccp->prctsiz[0][resno];
- res->pdy = tccp->prctsiz[1][resno];
- res->pdz = tccp->prctsiz[2][resno];
- } else {
- res->pdx = 15;
- res->pdy = 15;
- res->pdz = 15;
- }
- levelnox = comp->numresolution[0] - 1 - resno;
- levelnoy = comp->numresolution[1] - 1 - resno;
- levelnoz = comp->numresolution[2] - 1 - resno;
- if (levelnoz < 0) {
- levelnoz = 0;
- }
- diff = comp->numresolution[0] - comp->numresolution[2];
-
- rx0 = int_ceildivpow2(tcx0, levelnox);
- ry0 = int_ceildivpow2(tcy0, levelnoy);
- rz0 = int_ceildivpow2(tcz0, levelnoz);
- rx1 = int_ceildivpow2(tcx1, levelnox);
- ry1 = int_ceildivpow2(tcy1, levelnoy);
- rz1 = int_ceildivpow2(tcz1, levelnoz);
- px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
- py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
- pz0 = int_floordivpow2(rz0, res->pdz) << res->pdz;
- px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
- py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
- pz1 = int_ceildivpow2(rz1, res->pdz) << res->pdz;
- res->prctno[0] = (rx0 == rx1) ? 0 : ((px1 - px0) >> res->pdx);
- res->prctno[1] = (ry0 == ry1) ? 0 : ((py1 - py0) >> res->pdy);
- res->prctno[2] = (rz0 == rz1) ? 0 : ((pz1 - pz0) >> res->pdz);
-
- if (res->prctno[0]*res->prctno[1]*res->prctno[2] > maxprec) {
- maxprec = res->prctno[0] * res->prctno[1] * res->prctno[2];
- }
- }
- }
-
- tccp = &tcp->tccps[0];
- pi[pino].step_p = 1;
- pi[pino].step_c = maxprec * pi[pino].step_p;
- pi[pino].step_r = volume->numcomps * pi[pino].step_c;
- pi[pino].step_l = maxres * pi[pino].step_r;
-
- if (pino == 0) {
- array_size = volume->numcomps * maxres * tcp->numlayers * maxprec * sizeof(
- short int);
- pi[pino].include = (short int *) opj_malloc(array_size);
- if (!pi[pino].include) {
- fprintf(stdout, "[ERROR] Malloc of pi[pino].include failed \n");
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
- } else {
- pi[pino].include = pi[pino - 1].include;
- }
-
- if (tcp->POC == 0) {
- pi[pino].first = 1;
- pi[pino].poc.resno0 = 0;
- pi[pino].poc.compno0 = 0;
- pi[pino].poc.layno1 = tcp->numlayers;
- pi[pino].poc.resno1 = maxres;
- pi[pino].poc.compno1 = volume->numcomps;
- pi[pino].poc.prg = tcp->prg;
- } else {
- pi[pino].first = 1;
- pi[pino].poc.resno0 = tcp->pocs[pino].resno0;
- pi[pino].poc.compno0 = tcp->pocs[pino].compno0;
- pi[pino].poc.layno1 = tcp->pocs[pino].layno1;
- pi[pino].poc.resno1 = tcp->pocs[pino].resno1;
- pi[pino].poc.compno1 = tcp->pocs[pino].compno1;
- pi[pino].poc.prg = tcp->pocs[pino].prg;
- }
- }
-
- return pi;
-}
-
-void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno)
-{
- int compno, pino;
- opj_tcp_t *tcp = &cp->tcps[tileno];
- if (pi) {
- for (pino = 0; pino < tcp->numpocs + 1; pino++) {
- if (pi[pino].comps) {
- for (compno = 0; compno < pi->numcomps; compno++) {
- opj_pi_comp_t *comp = &pi[pino].comps[compno];
- if (comp->resolutions) {
- opj_free(comp->resolutions);
- }
- }
- opj_free(pi[pino].comps);
- }
- }
- if (pi->include) {
- opj_free(pi->include);
- }
- opj_free(pi);
- }
-}
-
-bool pi_next(opj_pi_iterator_t * pi)
-{
- switch (pi->poc.prg) {
- case LRCP:
- return pi_next_lrcp(pi);
- case RLCP:
- return pi_next_rlcp(pi);
- case RPCL:
- return pi_next_rpcl(pi);
- case PCRL:
- return pi_next_pcrl(pi);
- case CPRL:
- return pi_next_cprl(pi);
- }
-
- return false;
-}
-
+++ /dev/null
-/*
- * 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.
- */
-
-#ifndef __PI_H
-#define __PI_H
-/**
-@file pi.h
-@brief Implementation of a packet iterator (PI)
-
-The functions in PI.C have for goal to realize a packet iterator that permits to get the next
-packet following the progression order and change of it. The functions in PI.C are used
-by some function in T2.C.
-*/
-
-/** @defgroup PI PI - Implementation of a packet iterator */
-/*@{*/
-
-/**
-Packet iterator : resolution level information
-*/
-typedef struct opj_pi_resolution {
- /** Size of precints in horizontal axis */
- int pdx;
- /** Size of precints in vertical axis */
- int pdy;
- /** Size of precints in axial axis */
- int pdz;
- /** Number of precints in each axis */
- int prctno[3];
-} opj_pi_resolution_t;
-
-/**
-Packet iterator : component information
-*/
-typedef struct opj_pi_comp {
- /** Size in horizontal axis */
- int dx;
- /** Size in vertical axis */
- int dy;
- /** Size in axial axis */
- int dz;
- /** Number of resolution levels */
- int numresolution[3];
- /** Packet iterator : resolution level information */
- opj_pi_resolution_t *resolutions;
-} opj_pi_comp_t;
-
-/**
-Packet iterator
-*/
-typedef struct opj_pi_iterator {
- /** precise if the packet has been already used (useful for progression order change) */
- short int *include;
- /** layer step used to localize the packet in the include vector */
- int step_l;
- /** resolution step used to localize the packet in the include vector */
- int step_r;
- /** component step used to localize the packet in the include vector */
- int step_c;
- /** precinct step used to localize the packet in the include vector */
- int step_p;
- /** component that identify the packet */
- int compno;
- /** resolution that identify the packet */
- int resno;
- /** precinct that identify the packet */
- int precno;
- /** layer that identify the packet */
- int layno;
- /** 0 if the first packet */
- int first;
- /** progression order change information */
- opj_poc_t poc;
- /** Packet iterator : component information */
- opj_pi_comp_t *comps;
-
- int numcomps;
- int tx0, ty0, tz0;
- int tx1, ty1, tz1;
- int x, y, z;
- int dx, dy, dz;
-} opj_pi_iterator_t;
-
-/** @name Funciones generales */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a packet iterator
-@param volume Raw volume for which the packets will be listed
-@param cp Coding parameters
-@param tileno Number that identifies the tile for which to list the packets
-@return Returns a packet iterator that points to the first packet of the tile
-@see pi_destroy
-*/
-opj_pi_iterator_t *pi_create(opj_volume_t * volume, opj_cp_t * cp, int tileno);
-
-/**
-Destroy a packet iterator
-@param pi Previously created packet iterator
-@param cp Coding parameters
-@param tileno Number that identifies the tile for which the packets were listed
-@see pi_create
-*/
-void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno);
-
-/**
-Modify the packet iterator to point to the next packet
-@param pi Packet iterator to modify
-@return Returns false if pi pointed to the last packet or else returns true
-*/
-bool pi_next(opj_pi_iterator_t * pi);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __PI_H */
+++ /dev/null
-/*
- * 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) 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
- * 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_includes.h"
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-
-/*
-==========================================================
- RAW encoding interface
-==========================================================
-*/
-
-opj_raw_t* raw_create()
-{
- opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t));
- return raw;
-}
-
-void raw_destroy(opj_raw_t *raw)
-{
- if (raw) {
- opj_free(raw);
- }
-}
-
-int raw_numbytes(opj_raw_t *raw)
-{
- return raw->bp - raw->start;
-}
-
-void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len)
-{
- raw->start = bp;
- raw->lenmax = len;
- raw->len = 0;
- raw->c = 0;
- raw->ct = 0;
-}
-
-int raw_decode(opj_raw_t *raw)
-{
- int d;
- if (raw->ct == 0) {
- raw->ct = 8;
- if (raw->len == raw->lenmax) {
- raw->c = 0xff;
- } else {
- if (raw->c == 0xff) {
- raw->ct = 7;
- }
- raw->c = *(raw->start + raw->len);
- raw->len++;
- }
- }
- raw->ct--;
- d = (raw->c >> raw->ct) & 0x01;
-
- return d;
-}
-
+++ /dev/null
-/*
- * 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) 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
- * 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 __RAW_H
-#define __RAW_H
-/**
-@file raw.h
-@brief Implementation of operations for raw encoding (RAW)
-
-The functions in RAW.C have for goal to realize the operation of raw encoding linked
-with the corresponding mode switch.
-*/
-
-/** @defgroup RAW RAW - Implementation of operations for raw encoding */
-/*@{*/
-
-/**
-RAW encoding operations
-*/
-typedef struct opj_raw {
- /** Temporary buffer where bits are coded or decoded */
- unsigned char c;
- /** Number of bits already read or free to write */
- unsigned int ct;
- /** Maximum length to decode */
- unsigned int lenmax;
- /** Length decoded */
- unsigned int len;
- /** Pointer to the current position in the buffer */
- unsigned char *bp;
- /** Pointer to the start of the buffer */
- unsigned char *start;
- /** Pointer to the end of the buffer */
- unsigned char *end;
-} opj_raw_t;
-
-/** @name Funciones generales */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a new RAW handle
-@return Returns a new RAW handle if successful, returns NULL otherwise
-*/
-opj_raw_t* raw_create(void);
-/**
-Destroy a previously created RAW handle
-@param raw RAW handle to destroy
-*/
-void raw_destroy(opj_raw_t *raw);
-/**
-Return the number of bytes written/read since initialisation
-@param raw RAW handle to destroy
-@return Returns the number of bytes already encoded
-*/
-int raw_numbytes(opj_raw_t *raw);
-/**
-Initialize the decoder
-@param raw RAW handle
-@param bp Pointer to the start of the buffer from which the bytes will be read
-@param len Length of the input buffer
-*/
-void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len);
-/**
-Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN
-@param raw RAW handle
-@return Returns the decoded symbol (0 or 1)
-*/
-int raw_decode(opj_raw_t *raw);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __RAW_H */
+++ /dev/null
-/*
- * 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
- * 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_includes.h"
-
-/** @defgroup T1 T1 - Implementation of the tier-1 coding */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-static int t1_getctxno_zc(opj_t1_t *t1, int f, int orient);
-static int t1_getctxno_sc(opj_t1_t *t1, int f);
-static int t1_getctxno_mag(opj_t1_t *t1, int f);
-static int t1_getspb(opj_t1_t *t1, int f);
-static int t1_getnmsedec_sig(opj_t1_t *t1, int x, int bitpos);
-static int t1_getnmsedec_ref(opj_t1_t *t1, int x, int bitpos);
-static void t1_updateflags(int *fp, int s);
-/**
-Encode significant pass
-*/
-static void t1_enc_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient,
- int bpno, int one, int *nmsedec, char type, int vsc);
-/**
-Decode significant pass
-*/
-static void t1_dec_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient,
- int oneplushalf, char type, int vsc);
-/**
-Encode significant pass
-*/
-static void t1_enc_sigpass(opj_t1_t *t1, int w, int h, int l, int bpno,
- int orient, int *nmsedec, char type, int cblksty);
-/**
-Decode significant pass
-*/
-static void t1_dec_sigpass(opj_t1_t *t1, int w, int h, int l, int bpno,
- int orient, char type, int cblksty);
-/**
-Encode refinement pass
-*/
-static void t1_enc_refpass_step(opj_t1_t *t1, int *fp, int *dp, int bpno,
- int one, int *nmsedec, char type, int vsc);
-/**
-Decode refinement pass
-*/
-static void t1_dec_refpass_step(opj_t1_t *t1, int *fp, int *dp, int poshalf,
- int neghalf, char type, int vsc);
-/**
-Encode refinement pass
-*/
-static void t1_enc_refpass(opj_t1_t *t1, int w, int h, int l, int bpno,
- int *nmsedec, char type, int cblksty);
-/**
-Decode refinement pass
-*/
-static void t1_dec_refpass(opj_t1_t *t1, int w, int h, int l, int bpno,
- char type, int cblksty);
-/**
-Encode clean-up pass
-*/
-static void t1_enc_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient,
- int bpno, int one, int *nmsedec, int partial, int vsc);
-/**
-Decode clean-up pass
-*/
-static void t1_dec_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient,
- int oneplushalf, int partial, int vsc);
-/**
-Encode clean-up pass
-*/
-static void t1_enc_clnpass(opj_t1_t *t1, int w, int h, int l, int bpno,
- int orient, int *nmsedec, int cblksty);
-/**
-Decode clean-up pass
-*/
-static void t1_dec_clnpass(opj_t1_t *t1, int w, int h, int l, int bpno,
- int orient, int cblksty);
-/**
-Encode 1 code-block
-@param t1 T1 handle
-@param cblk Code-block coding parameters
-@param orient
-@param compno Component number
-@param level
-@param dwtid
-@param stepsize
-@param cblksty Code-block style
-@param numcomps
-@param tile
-*/
-static void t1_encode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient,
- int compno, int level[3], int dwtid[3], double stepsize, int cblksty,
- int numcomps, opj_tcd_tile_t * tile);
-/**
-Decode 1 code-block
-@param t1 T1 handle
-@param cblk Code-block coding parameters
-@param orient
-@param roishift Region of interest shifting value
-@param cblksty Code-block style
-*/
-static void t1_decode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient,
- int roishift, int cblksty);
-
-static int t1_init_ctxno_zc(int f, int orient);
-static int t1_init_ctxno_sc(int f);
-static int t1_init_ctxno_mag(int f);
-static int t1_init_spb(int f);
-/**
-Initialize the look-up tables of the Tier-1 coder/decoder
-@param t1 T1 handle
-*/
-static void t1_init_luts(opj_t1_t *t1);
-
-/*@}*/
-
-/*@}*/
-
-/* ----------------------------------------------------------------------- */
-
-static int t1_getctxno_zc(opj_t1_t *t1, int f, int orient)
-{
- return t1->lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
-}
-
-static int t1_getctxno_sc(opj_t1_t *t1, int f)
-{
- return t1->lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
-}
-
-static int t1_getctxno_mag(opj_t1_t *t1, int f)
-{
- return t1->lut_ctxno_mag[(f & T1_SIG_OTH) | (((f & T1_REFINE) != 0) << 11)];
-}
-
-static int t1_getspb(opj_t1_t *t1, int f)
-{
- return t1->lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
-}
-
-static int t1_getnmsedec_sig(opj_t1_t *t1, int x, int bitpos)
-{
- if (bitpos > T1_NMSEDEC_FRACBITS) {
- return t1->lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((
- 1 << T1_NMSEDEC_BITS) - 1)];
- }
-
- return t1->lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
-}
-
-static int t1_getnmsedec_ref(opj_t1_t *t1, int x, int bitpos)
-{
- if (bitpos > T1_NMSEDEC_FRACBITS) {
- return t1->lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((
- 1 << T1_NMSEDEC_BITS) - 1)];
- }
-
- return t1->lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
-}
-
-static void t1_updateflags(int *fp, int s)
-{
- int *np = fp - (T1_MAXCBLKW + 2);
- int *sp = fp + (T1_MAXCBLKW + 2);
- np[-1] |= T1_SIG_SE;
- np[1] |= T1_SIG_SW;
- sp[-1] |= T1_SIG_NE;
- sp[1] |= T1_SIG_NW;
- *np |= T1_SIG_S;
- *sp |= T1_SIG_N;
- fp[-1] |= T1_SIG_E;
- fp[1] |= T1_SIG_W;
- if (s) {
- *np |= T1_SGN_S;
- *sp |= T1_SGN_N;
- fp[-1] |= T1_SGN_E;
- fp[1] |= T1_SGN_W;
- }
-}
-
-static void t1_enc_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient,
- int bpno, int one, int *nmsedec, char type, int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp);
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- v = int_abs(*dp) & one ? 1 : 0;
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient)); /* ESSAI */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient));
- mqc_encode(mqc, v);
- }
- if (v) {
- v = *dp < 0 ? 1 : 0;
- *nmsedec += t1_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag)); /* ESSAI */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));
- mqc_encode(mqc, v ^ t1_getspb(t1, flag));
- }
- t1_updateflags(fp, v);
- *fp |= T1_SIG;
- }
- *fp |= T1_VISIT;
- }
-}
-
-static void t1_dec_sigpass_step(opj_t1_t *t1, int *fp, int *dp, int orient,
- int oneplushalf, char type, int vsc)
-{
- int v, flag;
-
- opj_raw_t *raw = t1->raw; /* RAW component */
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp);
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- if (type == T1_TYPE_RAW) {
- if (raw_decode(raw)) {
- v = raw_decode(raw); /* ESSAI */
- *dp = v ? -oneplushalf : oneplushalf;
- t1_updateflags(fp, v);
- *fp |= T1_SIG;
- }
- } else {
- mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient));
- if (mqc_decode(mqc)) {
- mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));
- v = mqc_decode(mqc) ^ t1_getspb(t1, flag);
- *dp = v ? -oneplushalf : oneplushalf;
- t1_updateflags(fp, v);
- *fp |= T1_SIG;
- }
- }
- *fp |= T1_VISIT;
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_enc_sigpass(opj_t1_t *t1, int w, int h, int l, int bpno,
- int orient, int *nmsedec, char type, int cblksty)
-{
- int i, j, k, m, one, vsc;
- *nmsedec = 0;
- one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- for (m = 0; m < l; m++) {
- for (k = 0; k < h; k += 4) {
- for (i = 0; i < w; i++) {
- for (j = k; j < k + 4 && j < h; j++) {
- vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;
- t1_enc_sigpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->data[m][j][i],
- orient, bpno, one, nmsedec, type, vsc);
- }
- }
- }
- }
-}
-
-static void t1_dec_sigpass(opj_t1_t *t1, int w, int h, int l, int bpno,
- int orient, char type, int cblksty)
-{
- int i, j, k, m, one, half, oneplushalf, vsc;
- one = 1 << bpno;
- half = one >> 1;
- oneplushalf = one | half;
- for (m = 0; m < l; m++) {
- for (k = 0; k < h; k += 4) {
- for (i = 0; i < w; i++) {
- for (j = k; j < k + 4 && j < h; j++) {
- vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;
- t1_dec_sigpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->data[m][j][i],
- orient, oneplushalf, type, vsc);
- }
- }
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_enc_refpass_step(opj_t1_t *t1, int *fp, int *dp, int bpno,
- int one, int *nmsedec, char type, int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp);
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- *nmsedec += t1_getnmsedec_ref(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
- v = int_abs(*dp) & one ? 1 : 0;
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag)); /* ESSAI */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag));
- mqc_encode(mqc, v);
- }
- *fp |= T1_REFINE;
- }
-}
-
-static void t1_dec_refpass_step(opj_t1_t *t1, int *fp, int *dp, int poshalf,
- int neghalf, char type, int vsc)
-{
- int v, t, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
- opj_raw_t *raw = t1->raw; /* RAW component */
-
- flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp);
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- if (type == T1_TYPE_RAW) {
- mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag)); /* ESSAI */
- v = raw_decode(raw);
- } else {
- mqc_setcurctx(mqc, t1_getctxno_mag(t1, flag));
- v = mqc_decode(mqc);
- }
- t = v ? poshalf : neghalf;
- *dp += *dp < 0 ? -t : t;
- *fp |= T1_REFINE;
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_enc_refpass(opj_t1_t *t1, int w, int h, int l, int bpno,
- int *nmsedec, char type, int cblksty)
-{
- int i, j, k, m, one, vsc;
- *nmsedec = 0;
- one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- for (m = 0; m < l; m++) {
- for (k = 0; k < h; k += 4) {
- for (i = 0; i < w; i++) {
- for (j = k; j < k + 4 && j < h; j++) {
- vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;
- t1_enc_refpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->data[m][j][i],
- bpno, one, nmsedec, type, vsc);
- }
- }
- }
- }
-}
-
-static void t1_dec_refpass(opj_t1_t *t1, int w, int h, int l, int bpno,
- char type, int cblksty)
-{
- int i, j, k, m, one, poshalf, neghalf;
- int vsc;
- one = 1 << bpno;
- poshalf = one >> 1;
- neghalf = bpno > 0 ? -poshalf : -1;
- for (m = 0; m < l; m++) {
- for (k = 0; k < h; k += 4) {
- for (i = 0; i < w; i++) {
- for (j = k; j < k + 4 && j < h; j++) {
- vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;
- t1_dec_refpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->data[m][j][i],
- poshalf, neghalf, type, vsc);
- }
- }
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_enc_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient,
- int bpno, int one, int *nmsedec, int partial, int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp);
- if (partial) {
- goto LABEL_PARTIAL;
- }
- if (!(*fp & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient));
- v = int_abs(*dp) & one ? 1 : 0;
- mqc_encode(mqc, v);
- if (v) {
-LABEL_PARTIAL:
- *nmsedec += t1_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
- mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));
- v = *dp < 0 ? 1 : 0;
- mqc_encode(mqc, v ^ t1_getspb(t1, flag));
- t1_updateflags(fp, v);
- *fp |= T1_SIG;
- }
- }
- *fp &= ~T1_VISIT;
-}
-
-static void t1_dec_clnpass_step(opj_t1_t *t1, int *fp, int *dp, int orient,
- int oneplushalf, int partial, int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*fp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) : (*fp);
- if (partial) {
- goto LABEL_PARTIAL;
- }
- if (!(flag & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(t1, flag, orient));
- if (mqc_decode(mqc)) {
-LABEL_PARTIAL:
- mqc_setcurctx(mqc, t1_getctxno_sc(t1, flag));
- v = mqc_decode(mqc) ^ t1_getspb(t1, flag);
- *dp = v ? -oneplushalf : oneplushalf;
- t1_updateflags(fp, v);
- *fp |= T1_SIG;
- }
- }
- *fp &= ~T1_VISIT;
-} /* VSC and BYPASS by Antonin */
-
-static void t1_enc_clnpass(opj_t1_t *t1, int w, int h, int l, int bpno,
- int orient, int *nmsedec, int cblksty)
-{
- int i, j, k, m, one, agg, runlen, vsc;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- *nmsedec = 0;
- one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- for (m = 0; m < l; m++) {
- for (k = 0; k < h; k += 4) {
- for (i = 0; i < w; i++) {
- if (k + 3 < h) {
- if (cblksty & J3D_CCP_CBLKSTY_VSC) {
- agg = !(t1->flags[1 + m][1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || t1->flags[1 + m][1 + k + 1][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || t1->flags[1 + m][1 + k + 2][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || (t1->flags[1 + m][1 + k + 3][1 + i]
- & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT |
- T1_SIG_OTH));
- } else {
- agg = !(t1->flags[1 + m][1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || t1->flags[1 + m][1 + k + 1][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || t1->flags[1 + m][1 + k + 2][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || t1->flags[1 + m][1 + k + 3][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH));
- }
- } else {
- agg = 0;
- }
- if (agg) {
- for (runlen = 0; runlen < 4; runlen++) {
- if (int_abs(t1->data[m][k + runlen][i]) & one) {
- break;
- }
- }
- mqc_setcurctx(mqc, T1_CTXNO_AGG);
- mqc_encode(mqc, runlen != 4);
- if (runlen == 4) {
- continue;
- }
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- mqc_encode(mqc, runlen >> 1);
- mqc_encode(mqc, runlen & 1);
- } else {
- runlen = 0;
- }
- for (j = k + runlen; j < k + 4 && j < h; j++) {
- vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;
- t1_enc_clnpass_step(t1, &(t1->flags[1 + m][1 + j][1 + i]), &(t1->data[m][j][i]),
- orient, bpno, one, nmsedec, agg && (j == k + runlen), vsc);
- }
- }
- }
- }
-}
-
-static void t1_dec_clnpass(opj_t1_t *t1, int w, int h, int l, int bpno,
- int orient, int cblksty)
-{
- int i, j, k, m, one, half, oneplushalf, agg, runlen, vsc;
- int segsym = cblksty & J3D_CCP_CBLKSTY_SEGSYM;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- one = 1 << bpno;
- half = one >> 1;
- oneplushalf = one | half;
- for (m = 0; m < l; m++) {
- for (k = 0; k < h; k += 4) {
- for (i = 0; i < w; i++) {
- if (k + 3 < h) {
- if (cblksty & J3D_CCP_CBLKSTY_VSC) {
- agg = !(t1->flags[1 + m][1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || t1->flags[1 + m][1 + k + 1][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || t1->flags[1 + m][1 + k + 2][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || (t1->flags[1 + m][1 + k + 3][1 + i]
- & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT |
- T1_SIG_OTH));
- } else {
- agg = !(t1->flags[1 + m][1 + k][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || t1->flags[1 + m][1 + k + 1][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || t1->flags[1 + m][1 + k + 2][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || t1->flags[1 + m][1 + k + 3][1 + i] & (T1_SIG | T1_VISIT | T1_SIG_OTH));
- }
- } else {
- agg = 0;
- }
- if (agg) {
- mqc_setcurctx(mqc, T1_CTXNO_AGG);
- if (!mqc_decode(mqc)) {
- continue;
- }
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- runlen = mqc_decode(mqc);
- runlen = (runlen << 1) | mqc_decode(mqc);
- } else {
- runlen = 0;
- }
- for (j = k + runlen; j < k + 4 && j < h; j++) {
- vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;
- t1_dec_clnpass_step(t1, &t1->flags[1 + m][1 + j][1 + i], &t1->data[m][j][i],
- orient, oneplushalf, agg && (j == k + runlen), vsc);
- }
- }
- }
- }
- if (segsym) {
- int v = 0;
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- v = mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- /*
- if (v!=0xa) {
- opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
- }
- */
- }
-} /* VSC and BYPASS by Antonin */
-
-
-static void t1_encode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient,
- int compno, int level[3], int dwtid[3], double stepsize, int cblksty,
- int numcomps, opj_tcd_tile_t * tile)
-{
- int i, j, k;
- int w, h, l;
- int passno;
- int bpno, passtype;
- int max;
- int nmsedec = 0;
- double cumwmsedec = 0;
- char type = T1_TYPE_MQ;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- w = cblk->x1 - cblk->x0;
- h = cblk->y1 - cblk->y0;
- l = cblk->z1 - cblk->z0;
-
- max = 0;
- for (k = 0; k < l; k++) {
- for (j = 0; j < h; j++) {
- for (i = 0; i < w; i++) {
- max = int_max(max, int_abs(t1->data[k][j][i]));
- }
- }
- }
- for (k = 0; k <= l; k++) {
- for (j = 0; j <= h; j++) {
- for (i = 0; i <= w; i++) {
- t1->flags[k][j][i] = 0;
- }
- }
- }
-
- cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0;
-
- bpno = cblk->numbps - 1;
- passtype = 2;
-
- mqc_reset_enc(mqc);
- mqc_init_enc(mqc, cblk->data);
-
- for (passno = 0; bpno >= 0; passno++) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- int correction = 3;
- double tmpwmsedec;
- type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) &&
- (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
- /*fprintf(stdout,"passno %d passtype %d w %d h %d l %d bpno %d orient %d type %d cblksty %d\n",passno,passtype,w,h,l,bpno,orient,type,cblksty);*/
-
- switch (passtype) {
- case 0:
- t1_enc_sigpass(t1, w, h, l, bpno, orient, &nmsedec, type, cblksty);
- break;
- case 1:
- t1_enc_refpass(t1, w, h, l, bpno, &nmsedec, type, cblksty);
- break;
- case 2:
- /*fprintf(stdout,"w %d h %d l %d bpno %d orient %d \n",w,h,l,bpno,orient);*/
- t1_enc_clnpass(t1, w, h, l, bpno, orient, &nmsedec, cblksty);
- /* code switch SEGMARK (i.e. SEGSYM) */
- if (cblksty & J3D_CCP_CBLKSTY_SEGSYM) {
- mqc_segmark_enc(mqc);
- }
- break;
- }
-
- /* fixed_quality */
- tmpwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, stepsize,
- numcomps, dwtid);
- cumwmsedec += tmpwmsedec;
- tile->distotile += tmpwmsedec;
-
- /* Code switch "RESTART" (i.e. TERMALL) */
- if ((cblksty & J3D_CCP_CBLKSTY_TERMALL) && !((passtype == 2) &&
- (bpno - 1 < 0))) {
- if (type == T1_TYPE_RAW) {
- mqc_flush(mqc);
- correction = 1;
- /* correction = mqc_bypass_flush_enc(); */
- } else { /* correction = mqc_restart_enc(); */
- mqc_flush(mqc);
- correction = 1;
- }
- pass->term = 1;
- } else {
- if (((bpno < (cblk->numbps - 4) && (passtype > 0))
- || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) &&
- (cblksty & J3D_CCP_CBLKSTY_LAZY)) {
- if (type == T1_TYPE_RAW) {
- mqc_flush(mqc);
- correction = 1;
- /* correction = mqc_bypass_flush_enc(); */
- } else { /* correction = mqc_restart_enc(); */
- mqc_flush(mqc);
- correction = 1;
- }
- pass->term = 1;
- } else {
- pass->term = 0;
- }
- }
-
- if (++passtype == 3) {
- passtype = 0;
- bpno--;
- }
-
- if (pass->term && bpno > 0) {
- type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) &&
- (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
- if (type == T1_TYPE_RAW) {
- mqc_bypass_init_enc(mqc);
- } else {
- mqc_restart_init_enc(mqc);
- }
- }
-
- pass->distortiondec = cumwmsedec;
- pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */
- pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
-
- /* Code-switch "RESET" */
- if (cblksty & J3D_CCP_CBLKSTY_RESET) {
- mqc_reset_enc(mqc);
- }
- }
-
- /* Code switch "ERTERM" (i.e. PTERM) */
- if (cblksty & J3D_CCP_CBLKSTY_PTERM) {
- mqc_erterm_enc(mqc);
- } else /* Default coding */ if (!(cblksty & J3D_CCP_CBLKSTY_LAZY)) {
- mqc_flush(mqc);
- }
-
- cblk->totalpasses = passno;
-}
-
-static void t1_decode_cblk(opj_t1_t *t1, opj_tcd_cblk_t * cblk, int orient,
- int roishift, int cblksty)
-{
- int i, j, k, w, h, l;
- int bpno, passtype;
- int segno, passno;
- char type = T1_TYPE_MQ; /* BYPASS mode */
-
- opj_raw_t *raw = t1->raw; /* RAW component */
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- w = cblk->x1 - cblk->x0;
- h = cblk->y1 - cblk->y0;
- l = cblk->z1 - cblk->z0;
-
- for (k = 0; k < l; k++) {
- for (j = 0; j < h; j++) {
- for (i = 0; i < w; i++) {
- t1->data[k][j][i] = 0;
- }
- }
- }
-
- for (k = 0; k <= l; k++) {
- for (j = 0; j <= h; j++) {
- for (i = 0; i <= w; i++) {
- t1->flags[k][j][i] = 0;
- }
- }
- }
-
- bpno = roishift + cblk->numbps - 1;
- passtype = 2;
-
- mqc_reset_enc(mqc);
-
- for (segno = 0; segno < cblk->numsegs; segno++) {
- opj_tcd_seg_t *seg = &cblk->segs[segno];
-
- /* BYPASS mode */
- type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) &&
- (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
- if (type == T1_TYPE_RAW) {
- raw_init_dec(raw, seg->data, seg->len);
- } else {
- mqc_init_dec(mqc, seg->data, seg->len);
- }
-
- for (passno = 0; passno < seg->numpasses; passno++) {
- switch (passtype) {
- case 0:
- t1_dec_sigpass(t1, w, h, l, bpno + 1, orient, type, cblksty);
- break;
- case 1:
- t1_dec_refpass(t1, w, h, l, bpno + 1, type, cblksty);
- break;
- case 2:
- t1_dec_clnpass(t1, w, h, l, bpno + 1, orient, cblksty);
- break;
- }
-
- if ((cblksty & J3D_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
- mqc_reset_enc(mqc);
- }
- if (++passtype == 3) {
- passtype = 0;
- bpno--;
- }
- }
- }
-}
-
-static int t1_init_ctxno_zc(int f, int orient)
-{
- int h, v, d, n, t, hv;
- n = 0;
- h = ((f & T1_SIG_W) != 0) + ((f & T1_SIG_E) != 0);
- v = ((f & T1_SIG_N) != 0) + ((f & T1_SIG_S) != 0);
- d = ((f & T1_SIG_NW) != 0) + ((f & T1_SIG_NE) != 0) + ((
- f & T1_SIG_SE) != 0) + ((f & T1_SIG_SW) != 0);
-
- switch (orient) {
- case 2:
- t = h;
- h = v;
- v = t;
- case 0:
- case 1:
- if (!h) {
- if (!v) {
- if (!d) {
- n = 0;
- } else if (d == 1) {
- n = 1;
- } else {
- n = 2;
- }
- } else if (v == 1) {
- n = 3;
- } else {
- n = 4;
- }
- } else if (h == 1) {
- if (!v) {
- if (!d) {
- n = 5;
- } else {
- n = 6;
- }
- } else {
- n = 7;
- }
- } else {
- n = 8;
- }
- break;
- case 3:
- hv = h + v;
- if (!d) {
- if (!hv) {
- n = 0;
- } else if (hv == 1) {
- n = 1;
- } else {
- n = 2;
- }
- } else if (d == 1) {
- if (!hv) {
- n = 3;
- } else if (hv == 1) {
- n = 4;
- } else {
- n = 5;
- }
- } else if (d == 2) {
- if (!hv) {
- n = 6;
- } else {
- n = 7;
- }
- } else {
- n = 8;
- }
- break;
- }
-
- return (T1_CTXNO_ZC + n);
-}
-
-static int t1_init_ctxno_sc(int f)
-{
- int hc, vc, n;
- n = 0;
-
- hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
- T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
- 1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
- (T1_SIG_E | T1_SGN_E)) +
- ((f & (T1_SIG_W | T1_SGN_W)) ==
- (T1_SIG_W | T1_SGN_W)), 1);
-
- vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
- T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
- 1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
- (T1_SIG_N | T1_SGN_N)) +
- ((f & (T1_SIG_S | T1_SGN_S)) ==
- (T1_SIG_S | T1_SGN_S)), 1);
-
- if (hc < 0) {
- hc = -hc;
- vc = -vc;
- }
- if (!hc) {
- if (vc == -1) {
- n = 1;
- } else if (!vc) {
- n = 0;
- } else {
- n = 1;
- }
- } else if (hc == 1) {
- if (vc == -1) {
- n = 2;
- } else if (!vc) {
- n = 3;
- } else {
- n = 4;
- }
- }
-
- return (T1_CTXNO_SC + n);
-}
-
-static int t1_init_ctxno_mag(int f)
-{
- int n;
- if (!(f & T1_REFINE)) {
- n = (f & (T1_SIG_OTH)) ? 1 : 0;
- } else {
- n = 2;
- }
-
- return (T1_CTXNO_MAG + n);
-}
-
-static int t1_init_spb(int f)
-{
- int hc, vc, n;
-
- hc = int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
- T1_SIG_E) + ((f & (T1_SIG_W | T1_SGN_W)) == T1_SIG_W),
- 1) - int_min(((f & (T1_SIG_E | T1_SGN_E)) ==
- (T1_SIG_E | T1_SGN_E)) +
- ((f & (T1_SIG_W | T1_SGN_W)) ==
- (T1_SIG_W | T1_SGN_W)), 1);
-
- vc = int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
- T1_SIG_N) + ((f & (T1_SIG_S | T1_SGN_S)) == T1_SIG_S),
- 1) - int_min(((f & (T1_SIG_N | T1_SGN_N)) ==
- (T1_SIG_N | T1_SGN_N)) +
- ((f & (T1_SIG_S | T1_SGN_S)) ==
- (T1_SIG_S | T1_SGN_S)), 1);
-
- if (!hc && !vc) {
- n = 0;
- } else {
- n = (!(hc > 0 || (!hc && vc > 0)));
- }
-
- return n;
-}
-
-static void t1_init_luts(opj_t1_t *t1)
-{
- int i, j;
- double u, v, t;
- for (j = 0; j < 4; j++) {
- for (i = 0; i < 256; ++i) {
- t1->lut_ctxno_zc[(j << 8) | i] = t1_init_ctxno_zc(i, j);
- }
- }
- for (i = 0; i < 256; i++) {
- t1->lut_ctxno_sc[i] = t1_init_ctxno_sc(i << 4);
- }
- for (j = 0; j < 2; j++) {
- for (i = 0; i < 2048; ++i) {
- t1->lut_ctxno_mag[(j << 11) + i] = t1_init_ctxno_mag((j ? T1_REFINE : 0) | i);
- }
- }
- for (i = 0; i < 256; ++i) {
- t1->lut_spb[i] = t1_init_spb(i << 4);
- }
- /* FIXME FIXME FIXME */
- /* fprintf(stdout,"nmsedec luts:\n"); */
- for (i = 0; i < (1 << T1_NMSEDEC_BITS); i++) {
- t = i / pow(2, T1_NMSEDEC_FRACBITS);
- u = t;
- v = t - 1.5;
- t1->lut_nmsedec_sig[i] =
- int_max(0,
- (int)(floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2,
- T1_NMSEDEC_FRACBITS) * 8192.0));
- t1->lut_nmsedec_sig0[i] =
- int_max(0,
- (int)(floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2,
- T1_NMSEDEC_FRACBITS) * 8192.0));
- u = t - 1.0;
- if (i & (1 << (T1_NMSEDEC_BITS - 1))) {
- v = t - 1.5;
- } else {
- v = t - 0.5;
- }
- t1->lut_nmsedec_ref[i] =
- int_max(0,
- (int)(floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2,
- T1_NMSEDEC_FRACBITS) * 8192.0));
- t1->lut_nmsedec_ref0[i] =
- int_max(0,
- (int)(floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2,
- T1_NMSEDEC_FRACBITS) * 8192.0));
- }
-}
-
-/* ----------------------------------------------------------------------- */
-
-opj_t1_t* t1_create(opj_common_ptr cinfo)
-{
- opj_t1_t *t1 = (opj_t1_t*)opj_malloc(sizeof(opj_t1_t));
- if (t1) {
- t1->cinfo = cinfo;
- /* create MQC and RAW handles */
- t1->mqc = mqc_create();
- t1->raw = raw_create();
- /* initialize the look-up tables of the Tier-1 coder/decoder */
- t1_init_luts(t1);
- }
- return t1;
-}
-
-void t1_destroy(opj_t1_t *t1)
-{
- if (t1) {
- /* destroy MQC and RAW handles */
- mqc_destroy(t1->mqc);
- raw_destroy(t1->raw);
- /*opj_free(t1->data);*/
- /*opj_free(t1->flags);*/
- opj_free(t1);
- }
-}
-
-void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp)
-{
- int compno, resno, bandno, precno, cblkno;
- int x, y, z, i, j, k, orient;
- int n = 0;
- int level[3];
- FILE *fid = NULL;
- /* char filename[10];*/
- tile->distotile = 0; /* fixed_quality */
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-
- for (resno = 0; resno < tilec->numresolution[0]; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- /* Weighted first order entropy
- sprintf(filename,"res%d.txt",resno);
- if ((fid = fopen(filename,"w")) == 0){
- fprintf(stdout,"Error while opening %s\n", filename);
- exit(1);
- }
- */
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2];
- precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
-
- /*fprintf(stdout,"Precno %d Cblkno %d \n",precno,cblkno);*/
- if (band->bandno == 0) {
- x = cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 1) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 2) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 3) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 4) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- } else if (band->bandno == 5) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- } else if (band->bandno == 6) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- } else if (band->bandno == 7) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- }
-
- if (tcp->tccps[compno].reversible == 1) {
- for (k = 0; k < cblk->z1 - cblk->z0; k++) {
- for (j = 0; j < cblk->y1 - cblk->y0; j++) {
- for (i = 0; i < cblk->x1 - cblk->x0; i++) {
- t1->data[k][j][i] =
- tilec->data[(x + i) + (y + j) * (tilec->x1 - tilec->x0) + (z + k) *
- (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] << T1_NMSEDEC_FRACBITS;
- /*fprintf(fid," %d",t1->data[k][j][i]);*/
- }
- }
- }
- } else if (tcp->tccps[compno].reversible == 0) {
- for (k = 0; k < cblk->z1 - cblk->z0; k++) {
- for (j = 0; j < cblk->y1 - cblk->y0; j++) {
- for (i = 0; i < cblk->x1 - cblk->x0; i++) {
- t1->data[k][j][i] = fix_mul(
- tilec->data[(x + i) + (y + j) * (tilec->x1 - tilec->x0) + (z + k) *
- (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)],
- 8192 * 8192 / ((int) floor(band->stepsize * 8192))) >> (13 -
- T1_NMSEDEC_FRACBITS);
- }
- }
- }
- }
-
- orient = band->bandno; /* FIXME */
- if (orient == 2) {
- orient = 1;
- } else if (orient == 1) {
- orient = 2;
- }
- for (i = 0; i < 3; i++) {
- level[i] = tilec->numresolution[i] - 1 - resno;
- }
- /*fprintf(stdout,"t1_encode_cblk(t1, cblk, %d, %d, %d %d %d, %d, %f, %d, %d, tile);\n", orient, compno, level[0], level[1], level[2], tcp->tccps[compno].reversible, band->stepsize, tcp->tccps[compno].cblksty, tile->numcomps);*/
- t1_encode_cblk(t1, cblk, orient, compno, level, tcp->tccps[compno].dwtid,
- band->stepsize, tcp->tccps[compno].cblksty, tile->numcomps, tile);
-
- } /* cblkno */
- } /* precno */
- /*fprintf(fid,"\n");*/
- } /* bandno */
- /*fclose(fid);*/
- } /* resno */
- } /* compno */
-}
-
-void t1_decode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp)
-{
- int compno, resno, bandno, precno, cblkno;
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-
- for (resno = 0; resno < tilec->numresolution[0]; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
-
- for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2];
- precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- int x, y, k, i, j, z, orient;
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
-
- orient = band->bandno; /* FIXME */
- if (orient == 2) {
- orient = 1;
- } else if (orient == 1) {
- orient = 2;
- }
-
- t1_decode_cblk(t1, cblk, orient, tcp->tccps[compno].roishift,
- tcp->tccps[compno].cblksty);
-
- if (band->bandno == 0) {
- x = cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 1) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 2) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 3) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 4) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- } else if (band->bandno == 5) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- } else if (band->bandno == 6) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- } else if (band->bandno == 7) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- }
-
- if (tcp->tccps[compno].roishift) {
- int thresh, val, mag;
- thresh = 1 << tcp->tccps[compno].roishift;
- for (k = 0; k < cblk->z1 - cblk->z0; k++) {
- for (j = 0; j < cblk->y1 - cblk->y0; j++) {
- for (i = 0; i < cblk->x1 - cblk->x0; i++) {
- val = t1->data[k][j][i];
- mag = int_abs(val);
- if (mag >= thresh) {
- mag >>= tcp->tccps[compno].roishift;
- t1->data[k][j][i] = val < 0 ? -mag : mag;
- }
- }
- }
- }
- }
-
- if (tcp->tccps[compno].reversible == 1) {
- for (k = 0; k < cblk->z1 - cblk->z0; k++) {
- for (j = 0; j < cblk->y1 - cblk->y0; j++) {
- for (i = 0; i < cblk->x1 - cblk->x0; i++) {
- int tmp = t1->data[k][j][i];
- tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) *
- (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = tmp / 2;
- }
- }
- }
- } else { /* if (tcp->tccps[compno].reversible == 0) */
- for (k = 0; k < cblk->z1 - cblk->z0; k++) {
- for (j = 0; j < cblk->y1 - cblk->y0; j++) {
- for (i = 0; i < cblk->x1 - cblk->x0; i++) {
- double tmp = (double)(t1->data[k][j][i] * band->stepsize * 4096.0);
- if (t1->data[k][j][i] >> 1 == 0) {
- tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) *
- (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = 0;
- } else {
- int tmp2 = ((int)(floor(fabs(tmp)))) + ((int) floor(fabs(tmp * 2)) % 2);
- tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) *
- (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = ((tmp < 0) ? -tmp2 : tmp2);
- }
- }
- }
- }
- }
- } /* cblkno */
- } /* precno */
- } /* bandno */
- } /* resno */
- } /* compno */
-}
-
-
-/** mod fixed_quality */
-double t1_getwmsedec(int nmsedec, int compno, int level[3], int orient,
- int bpno, double stepsize, int numcomps, int dwtid[3])
-{
- double w1, w2, wmsedec;
-
- if (dwtid[0] == 1 || dwtid[1] == 1 || dwtid[2] == 1) {
- w1 = (numcomps > 1) ? mct_getnorm_real(compno) : 1;
- } else {
- w1 = (numcomps > 1) ? mct_getnorm(compno) : 1;
- }
- w2 = dwt_getnorm(orient, level, dwtid);
-
- /*fprintf(stdout,"nmsedec %d level %d %d %d orient %d bpno %d stepsize %f \n",nmsedec ,level[0],level[1],level[2],orient,bpno,stepsize);*/
- wmsedec = w1 * w2 * stepsize * (1 << bpno);
- wmsedec *= wmsedec * nmsedec / 8192.0;
-
- return wmsedec;
-}
-/** mod fixed_quality */
+++ /dev/null
-/*
- * 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
- * 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 __T1_H
-#define __T1_H
-/**
-@file t1.h
-@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1)
-
-The functions in T1.C have for goal to realize the tier-1 coding operation. The functions
-in T1.C are used by some function in TCD.C.
-*/
-
-/** @defgroup T1 T1 - Implementation of the tier-1 coding */
-/*@{*/
-
-/* ----------------------------------------------------------------------- */
-#define T1_NMSEDEC_BITS 7
-
-#define T1_MAXCBLKW 256 /*< Maximum size of code-block (width) */
-#define T1_MAXCBLKH 256 /*< Maximum size of code-block (height) */
-#define T1_MAXCBLKD 256 /*< Maximum size of code-block (depth) */
-#define T1_MINCBLKW 4 /*< Minimum size of code-block (width) */
-#define T1_MINCBLKH 4 /*< Minimum size of code-block (height) */
-#define T1_MINCBLKD 4 /*< Minimum size of code-block (depth) */
-#define T1_MAXWHD 18
-#define T1_CBLKW 256
-#define T1_CBLKH 256
-#define T1_CBLKD 256
-
-#define T1_SIG_NE 0x0001 /*< Context orientation : North-East direction */
-#define T1_SIG_SE 0x0002 /*< Context orientation : South-East direction */
-#define T1_SIG_SW 0x0004 /*< Context orientation : South-West direction */
-#define T1_SIG_NW 0x0008 /*< Context orientation : North-West direction */
-#define T1_SIG_N 0x0010 /*< Context orientation : North direction */
-#define T1_SIG_E 0x0020 /*< Context orientation : East direction */
-#define T1_SIG_S 0x0040 /*< Context orientation : South direction */
-#define T1_SIG_W 0x0080 /*< Context orientation : West direction */
-#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)
-#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)
-
-#define T1_SGN_N 0x0100
-#define T1_SGN_E 0x0200
-#define T1_SGN_S 0x0400
-#define T1_SGN_W 0x0800
-#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)
-
-#define T1_SIG 0x1000
-#define T1_REFINE 0x2000
-#define T1_VISIT 0x4000
-
-#define T1_NUMCTXS_AGG 1
-#define T1_NUMCTXS_ZC 9
-#define T1_NUMCTXS_MAG 3
-#define T1_NUMCTXS_SC 5
-#define T1_NUMCTXS_UNI 1
-
-#define T1_CTXNO_AGG 0
-#define T1_CTXNO_ZC (T1_CTXNO_AGG+T1_NUMCTXS_AGG)
-#define T1_CTXNO_MAG (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
-#define T1_CTXNO_SC (T1_CTXNO_MAG+T1_NUMCTXS_MAG)
-#define T1_CTXNO_UNI (T1_CTXNO_SC+T1_NUMCTXS_SC)
-#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)
-
-#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)
-
-#define T1_TYPE_MQ 0 /*< Normal coding using entropy coder */
-#define T1_TYPE_RAW 1 /*< No encoding the information is store under raw format in codestream (mode switch RAW)*/
-
-/* ----------------------------------------------------------------------- */
-
-/**
-Tier-1 coding (coding of code-block coefficients)
-*/
-typedef struct opj_t1 {
- /** codec context */
- opj_common_ptr cinfo;
-
- /** MQC component */
- opj_mqc_t *mqc;
- /** RAW component */
- opj_raw_t *raw;
- /** LUTs for context-based coding */
- int lut_ctxno_zc[1024];
- int lut_ctxno_sc[256];
- int lut_ctxno_mag[4096];
- int lut_spb[256];
- /** LUTs for decoding normalised MSE */
- int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS];
- int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS];
- int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS];
- int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS];
- /** Codeblock data */
- int data[T1_CBLKD][T1_CBLKH][T1_CBLKW];/*int ***data;*/
- /** Context information for each voxel in codeblock */
- int flags[T1_CBLKD + 2][T1_CBLKH + 2][T1_CBLKH + 2];/*int ***flags;*/
-} opj_t1_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a new T1 handle
-and initialize the look-up tables of the Tier-1 coder/decoder
-@return Returns a new T1 handle if successful, returns NULL otherwise
-@see t1_init_luts
-*/
-opj_t1_t* t1_create(opj_common_ptr cinfo);
-/**
-Destroy a previously created T1 handle
-@param t1 T1 handle to destroy
-*/
-void t1_destroy(opj_t1_t *t1);
-/**
-Encode the code-blocks of a tile
-@param t1 T1 handle
-@param tile The tile to encode
-@param tcp Tile coding parameters
-*/
-void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);
-/**
-Decode the code-blocks of a tile
-@param t1 T1 handle
-@param tile The tile to decode
-@param tcp Tile coding parameters
-*/
-void t1_decode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);
-/**
-Get weigths of MSE decoding
-@param nmsedec The normalized MSE reduction
-@param compno
-@param level
-@param orient
-@param bpno
-@param stepsize
-@param numcomps
-@param dwtid
-returns MSE associated to decoding pass
-*/
-double t1_getwmsedec(int nmsedec, int compno, int level[3], int orient,
- int bpno, double stepsize, int numcomps, int dwtid[3]);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __T1_H */
+++ /dev/null
-/*
- * Copyrigth (c) 2006, Mónica DÃez, LPI-UVA, 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 "opj_includes.h"
-
-/** @defgroup T1_3D T1_3D - Implementation of the tier-1 coding */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-static int t1_3d_getctxno_zc(unsigned int f, int orient);
-static int t1_3d_getctxno_sc(unsigned int f);
-static int t1_3d_getctxno_mag(unsigned int f, int fsvr);
-static int t1_3d_getspb(unsigned int f);
-static int t1_3d_getnmsedec_sig(opj_t1_3d_t *t1, int x, int bitpos);
-static int t1_3d_getnmsedec_ref(opj_t1_3d_t *t1, int x, int bitpos);
-static void t1_3d_updateflags(unsigned int *fp, int s);
-/**
-Encode significant pass
-*/
-static void t1_3d_enc_sigpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr,
- int *dp, int orient, int bpno, int one, int *nmsedec, char type, int vsc);
-/**
-Decode significant pass
-*/
-static void t1_3d_dec_sigpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr,
- int *dp, int orient, int oneplushalf, char type, int vsc);
-/**
-Encode significant pass
-*/
-static void t1_3d_enc_sigpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno,
- int orient, int *nmsedec, char type, int cblksty);
-/**
-Decode significant pass
-*/
-static void t1_3d_dec_sigpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno,
- int orient, char type, int cblksty);
-/**
-Encode refinement pass
-*/
-static void t1_3d_enc_refpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr,
- int *dp, int bpno, int one, int *nmsedec, char type, int vsc);
-/**
-Decode refinement pass
-*/
-static void t1_3d_dec_refpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr,
- int *dp, int poshalf, int neghalf, char type, int vsc);
-/**
-Encode refinement pass
-*/
-static void t1_3d_enc_refpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno,
- int *nmsedec, char type, int cblksty);
-/**
-Decode refinement pass
-*/
-static void t1_3d_dec_refpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno,
- char type, int cblksty);
-/**
-Encode clean-up pass
-*/
-static void t1_3d_enc_clnpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr,
- int *dp, int orient, int bpno, int one, int *nmsedec, int partial, int vsc);
-/**
-Decode clean-up pass
-*/
-static void t1_3d_dec_clnpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr,
- int *dp, int orient, int oneplushalf, int partial, int vsc);
-/**
-Encode clean-up pass
-*/
-static void t1_3d_enc_clnpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno,
- int orient, int *nmsedec, int cblksty);
-/**
-Decode clean-up pass
-*/
-static void t1_3d_dec_clnpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno,
- int orient, int cblksty);
-/**
-Encode 1 code-block
-@param t1 T1 handle
-@param cblk Code-block coding parameters
-@param orient
-@param compno Component number
-@param level[3]
-@param dwtid[3]
-@param stepsize
-@param cblksty Code-block style
-@param numcomps
-@param tile
-*/
-static void t1_3d_encode_cblk(opj_t1_3d_t *t1, opj_tcd_cblk_t * cblk,
- int orient, int compno, int level[3], int dwtid[3], double stepsize,
- int cblksty, int numcomps, opj_tcd_tile_t * tile);
-/**
-Decode 1 code-block
-@param t1 T1 handle
-@param cblk Code-block coding parameters
-@param orient
-@param roishift Region of interest shifting value
-@param cblksty Code-block style
-*/
-static void t1_3d_decode_cblk(opj_t1_3d_t *t1, opj_tcd_cblk_t * cblk,
- int orient, int roishift, int cblksty);
-static int t1_3d_init_ctxno_zc(unsigned int f, int orient);
-static int t1_3d_init_ctxno_sc(unsigned int f);
-static int t1_3d_init_ctxno_mag(unsigned int f, int f2);
-static int t1_3d_init_spb(unsigned int f);
-/**
-Initialize the look-up tables of the Tier-1 coder/decoder
-@param t1 T1 handle
-*/
-static void t1_3d_init_luts(opj_t1_3d_t *t1);
-
-/*@}*/
-
-/*@}*/
-
-/* ----------------------------------------------------------------------- */
-
-static int t1_3d_getctxno_zc(unsigned int f, int orient)
-{
- return t1_3d_init_ctxno_zc((f & T1_3D_SIG_OTH), orient);
-}
-
-static int t1_3d_getctxno_sc(unsigned int f)
-{
- return t1_3d_init_ctxno_sc((f & T1_3D_SIG_PRIM) | ((f >> 16) & T1_3D_SGN));
- /*return t1->lut_ctxno_sc[((f & T1_3D_SIG_PRIM) | ((f >> 16) & T1_3D_SGN)) >> 4];*/
-}
-
-static int t1_3d_getctxno_mag(unsigned int f, int fsvr)
-{
- return t1_3d_init_ctxno_mag((f & T1_3D_SIG_OTH), fsvr);
-}
-
-static int t1_3d_getspb(unsigned int f)
-{
- return t1_3d_init_spb((f & T1_3D_SIG_PRIM) | ((f >> 16) & T1_3D_SGN));
- /*return t1->lut_spb[((f & T1_3D_SIG_PRIM) | ((f >> 16) & T1_3D_SGN)) >> 4];*/
-}
-
-static int t1_3d_getnmsedec_sig(opj_t1_3d_t *t1, int x, int bitpos)
-{
- if (bitpos > T1_NMSEDEC_FRACBITS) {
- return t1->lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((
- 1 << T1_NMSEDEC_BITS) - 1)];
- }
-
- return t1->lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
-}
-
-static int t1_3d_getnmsedec_ref(opj_t1_3d_t *t1, int x, int bitpos)
-{
- if (bitpos > T1_NMSEDEC_FRACBITS) {
- return t1->lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((
- 1 << T1_NMSEDEC_BITS) - 1)];
- }
-
- return t1->lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
-}
-
-static void t1_3d_updateflags(unsigned int *fp, int s)
-{
- unsigned int *np = fp - (T1_MAXCBLKW + 2);
- unsigned int *sp = fp + (T1_MAXCBLKW + 2);
-
- unsigned int *bwp = fp + ((T1_MAXCBLKW + 2) * (T1_MAXCBLKH + 2));
- unsigned int *bnp = bwp - (T1_MAXCBLKW + 2);
- unsigned int *bsp = bwp + (T1_MAXCBLKW + 2);
-
- unsigned int *fwp = fp - ((T1_MAXCBLKW + 2) * (T1_MAXCBLKH + 2));
- unsigned int *fnp = fwp - (T1_MAXCBLKW + 2);
- unsigned int *fsp = fwp + (T1_MAXCBLKW + 2);
-
- np[-1] |= T1_3D_SIG_SE;
- np[1] |= T1_3D_SIG_SW;
- sp[-1] |= T1_3D_SIG_NE;
- sp[1] |= T1_3D_SIG_NW;
- *np |= T1_3D_SIG_S;
- *sp |= T1_3D_SIG_N;
- fp[-1] |= T1_3D_SIG_E;
- fp[1] |= T1_3D_SIG_W;
-
- *fwp |= T1_3D_SIG_FC;
- *bwp |= T1_3D_SIG_BC;
-
- fnp[-1] |= T1_3D_SIG_FSE;
- fnp[1] |= T1_3D_SIG_FSW;
- fsp[-1] |= T1_3D_SIG_FNE;
- fsp[1] |= T1_3D_SIG_FNW;
- *fnp |= T1_3D_SIG_FS;
- *fsp |= T1_3D_SIG_FN;
- fwp[-1] |= T1_3D_SIG_FE;
- fwp[1] |= T1_3D_SIG_FW;
-
- bnp[-1] |= T1_3D_SIG_BSE;
- bnp[1] |= T1_3D_SIG_BSW;
- bsp[-1] |= T1_3D_SIG_BNE;
- bsp[1] |= T1_3D_SIG_BNW;
- *bnp |= T1_3D_SIG_BS;
- *bsp |= T1_3D_SIG_BN;
- bwp[-1] |= T1_3D_SIG_BE;
- bwp[1] |= T1_3D_SIG_BW;
-
- if (s) {
- *np |= (T1_3D_SGN_S << 16);
- *sp |= (T1_3D_SGN_N << 16);
- fp[-1] |= (T1_3D_SGN_E << 16);
- fp[1] |= (T1_3D_SGN_W << 16);
- *fwp |= (T1_3D_SGN_F << 16);
- *bwp |= (T1_3D_SGN_B << 16);
- }
-}
-
-static void t1_3d_enc_sigpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr,
- int *dp, int orient, int bpno, int one, int *nmsedec, char type, int vsc)
-{
- int v, flagsvr;
- unsigned int flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW |
- (T1_3D_SGN_S << 16)))) : (*fp);
- flagsvr = (*fsvr);
- if ((flag & T1_3D_SIG_OTH) && !(flagsvr & (T1_3D_SIG | T1_3D_VISIT))) {
- v = int_abs(*dp) & one ? 1 : 0;
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient)); /* ESSAI */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient));
- mqc_encode(mqc, v);
- }
- if (v) {
- v = *dp < 0 ? 1 : 0;
- *nmsedec += t1_3d_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag)); /* ESSAI */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag));
- mqc_encode(mqc, v ^ t1_3d_getspb(flag));
- }
- t1_3d_updateflags(fp, v);
- *fsvr |= T1_3D_SIG;
- }
- *fsvr |= T1_3D_VISIT;
- }
-}
-
-static void t1_3d_dec_sigpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr,
- int *dp, int orient, int oneplushalf, char type, int vsc)
-{
- int v, flagsvr;
- unsigned int flag;
-
- opj_raw_t *raw = t1->raw; /* RAW component */
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW |
- (T1_3D_SGN_S << 16)))) : (*fp);
- flagsvr = (*fsvr);
- if ((flag & T1_3D_SIG_OTH) && !(flagsvr & (T1_3D_SIG | T1_3D_VISIT))) {
- if (type == T1_TYPE_RAW) {
- if (raw_decode(raw)) {
- v = raw_decode(raw); /* ESSAI */
- *dp = v ? -oneplushalf : oneplushalf;
- t1_3d_updateflags(fp, v);
- *fsvr |= T1_3D_SIG;
- }
- } else {
- mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
- mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag));
- v = mqc_decode(mqc) ^ t1_3d_getspb(flag);
- *dp = v ? -oneplushalf : oneplushalf;
- t1_3d_updateflags(fp, v);
- *fsvr |= T1_3D_SIG;
- }
- }
- *fsvr |= T1_3D_VISIT;
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_3d_enc_sigpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno,
- int orient, int *nmsedec, char type, int cblksty)
-{
- int i, j, k, m, one, vsc;
- *nmsedec = 0;
- one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- for (m = 0; m < l; m++) {
- for (k = 0; k < h; k += 4) {
- for (i = 0; i < w; i++) {
- for (j = k; j < k + 4 && j < h; j++) {
- vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;
- t1_3d_enc_sigpass_step(t1, &t1->flags[1 + m][1 + j][1 + i],
- &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], orient, bpno, one,
- nmsedec, type, vsc);
- }
- }
- }
- }
-}
-
-static void t1_3d_dec_sigpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno,
- int orient, char type, int cblksty)
-{
- int i, j, k, m, one, half, oneplushalf, vsc;
- one = 1 << bpno;
- half = one >> 1;
- oneplushalf = one | half;
- for (m = 0; m < l; m++) {
- for (k = 0; k < h; k += 4) {
- for (i = 0; i < w; i++) {
- for (j = k; j < k + 4 && j < h; j++) {
- vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;
- t1_3d_dec_sigpass_step(t1, &t1->flags[1 + m][1 + j][1 + i],
- &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], orient, oneplushalf,
- type, vsc);
- }
- }
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_3d_enc_refpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr,
- int *dp, int bpno, int one, int *nmsedec, char type, int vsc)
-{
- int v, flagsvr;
- unsigned int flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW |
- (T1_3D_SGN_S << 16)))) : (*fp);
- flagsvr = (*fsvr);
- if ((flagsvr & (T1_3D_SIG | T1_3D_VISIT)) == T1_3D_SIG) {
- *nmsedec += t1_3d_getnmsedec_ref(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
- v = int_abs(*dp) & one ? 1 : 0;
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_setcurctx(mqc, t1_3d_getctxno_mag(flag, flagsvr)); /* ESSAI */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_setcurctx(mqc, t1_3d_getctxno_mag(flag, flagsvr));
- mqc_encode(mqc, v);
- }
- *fsvr |= T1_3D_REFINE;
- }
-}
-
-static void t1_3d_dec_refpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr,
- int *dp, int poshalf, int neghalf, char type, int vsc)
-{
- int v, t, flagsvr;
- unsigned int flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
- opj_raw_t *raw = t1->raw; /* RAW component */
-
- flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW |
- (T1_3D_SGN_S << 16)))) : (*fp);
- flagsvr = (*fsvr);
- if ((flagsvr & (T1_3D_SIG | T1_3D_VISIT)) == T1_3D_SIG) {
- if (type == T1_TYPE_RAW) {
- mqc_setcurctx(mqc, t1_3d_getctxno_mag(flag, flagsvr)); /* ESSAI */
- v = raw_decode(raw);
- } else {
- mqc_setcurctx(mqc, t1_3d_getctxno_mag(flag, flagsvr));
- v = mqc_decode(mqc);
- }
- t = v ? poshalf : neghalf;
- *dp += *dp < 0 ? -t : t;
- *fsvr |= T1_3D_REFINE;
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_3d_enc_refpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno,
- int *nmsedec, char type, int cblksty)
-{
- int i, j, k, m, one, vsc;
- *nmsedec = 0;
- one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- for (m = 0; m < l; m++) {
- for (k = 0; k < h; k += 4) {
- for (i = 0; i < w; i++) {
- for (j = k; j < k + 4 && j < h; j++) {
- vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;
- t1_3d_enc_refpass_step(t1, &t1->flags[1 + m][1 + j][1 + i],
- &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], bpno, one, nmsedec, type,
- vsc);
- }
- }
- }
- }
-}
-
-static void t1_3d_dec_refpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno,
- char type, int cblksty)
-{
- int i, j, k, m, one, poshalf, neghalf;
- int vsc;
- one = 1 << bpno;
- poshalf = one >> 1;
- neghalf = bpno > 0 ? -poshalf : -1;
- for (m = 0; m < l; m++) {
- for (k = 0; k < h; k += 4) {
- for (i = 0; i < w; i++) {
- for (j = k; j < k + 4 && j < h; j++) {
- vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;
- t1_3d_dec_refpass_step(t1, &t1->flags[1 + m][1 + j][1 + i],
- &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], poshalf, neghalf, type,
- vsc);
- }
- }
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_3d_enc_clnpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr,
- int *dp, int orient, int bpno, int one, int *nmsedec, int partial, int vsc)
-{
- int v, flagsvr;
- unsigned int flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW |
- (T1_3D_SGN_S << 16)))) : (*fp);
- flagsvr = (*fsvr);
- if (partial) {
- goto LABEL_PARTIAL;
- }
- if (!(*fsvr & (T1_3D_SIG | T1_3D_VISIT))) {
- mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient));
- v = int_abs(*dp) & one ? 1 : 0;
- mqc_encode(mqc, v);
- if (v) {
-LABEL_PARTIAL:
- *nmsedec += t1_3d_getnmsedec_sig(t1, int_abs(*dp), bpno + T1_NMSEDEC_FRACBITS);
- mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag));
- v = *dp < 0 ? 1 : 0;
- mqc_encode(mqc, v ^ t1_3d_getspb(flag));
- t1_3d_updateflags(fp, v);
- *fsvr |= T1_3D_SIG;
- }
- }
- *fsvr &= ~T1_3D_VISIT;
-}
-
-static void t1_3d_dec_clnpass_step(opj_t1_3d_t *t1, unsigned int *fp, int *fsvr,
- int *dp, int orient, int oneplushalf, int partial, int vsc)
-{
- int v, flagsvr;
- unsigned int flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*fp) & (~(T1_3D_SIG_S | T1_3D_SIG_SE | T1_3D_SIG_SW |
- (T1_3D_SGN_S << 16)))) : (*fp);
- flagsvr = (*fsvr);
- if (partial) {
- goto LABEL_PARTIAL;
- }
- if (!(flagsvr & (T1_3D_SIG | T1_3D_VISIT))) {
- mqc_setcurctx(mqc, t1_3d_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
-LABEL_PARTIAL:
- mqc_setcurctx(mqc, t1_3d_getctxno_sc(flag));
- v = mqc_decode(mqc) ^ t1_3d_getspb(flag);
- *dp = v ? -oneplushalf : oneplushalf;
- t1_3d_updateflags(fp, v);
- *fsvr |= T1_3D_SIG;
- }
- }
- *fsvr &= ~T1_3D_VISIT;
-} /* VSC and BYPASS by Antonin */
-
-static void t1_3d_enc_clnpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno,
- int orient, int *nmsedec, int cblksty)
-{
- int i, j, k, m, one, agg, runlen, vsc;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- *nmsedec = 0;
- one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- for (m = 0; m < l; m++) {
- for (k = 0; k < h; k += 4) {
- for (i = 0; i < w; i++) {
- if (k + 3 < h) {
- if (cblksty & J3D_CCP_CBLKSTY_VSC) {
- agg = !(((t1->flagSVR[1 + m][1 + k][1 + i] | (T1_3D_SIG | T1_3D_VISIT)) &
- (t1->flags[1 + m][1 + k][1 + i] & T1_3D_SIG_OTH))
- || ((t1->flagSVR[1 + m][1 + k + 1][1 + i] | (T1_3D_SIG | T1_3D_VISIT)) &
- (t1->flags[1 + m][1 + k + 1][1 + i] & T1_3D_SIG_OTH))
- || ((t1->flagSVR[1 + m][1 + k + 2][1 + i] | (T1_3D_SIG | T1_3D_VISIT)) &
- (t1->flags[1 + m][1 + k + 2][1 + i] & T1_3D_SIG_OTH))
- || ((t1->flagSVR[1 + m][1 + k + 3][1 + i] | (T1_3D_SIG | T1_3D_VISIT)) & ((
- t1->flags[1 + m][1 + k + 3][1 + i] & (~(T1_3D_SIG_S | T1_3D_SIG_SE |
- T1_3D_SIG_SW | (T1_3D_SGN_S << 16)))) & (T1_3D_SIG_OTH)))
- );
- } else {
- agg = !(
- ((t1->flagSVR[1 + m][1 + k][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) |
- (t1->flags[1 + m][1 + k][1 + i] & T1_3D_SIG_OTH))
- || ((t1->flagSVR[1 + m][1 + k + 1][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) |
- (t1->flags[1 + m][1 + k + 1][1 + i] & T1_3D_SIG_OTH))
- || ((t1->flagSVR[1 + m][1 + k + 2][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) |
- (t1->flags[1 + m][1 + k + 2][1 + i] & T1_3D_SIG_OTH))
- || ((t1->flagSVR[1 + m][1 + k + 3][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) |
- (t1->flags[1 + m][1 + k + 3][1 + i] & T1_3D_SIG_OTH))
- );
- }
- } else {
- agg = 0;
- }
- if (agg) {
- for (runlen = 0; runlen < 4; runlen++) {
- if (int_abs(t1->data[m][k + runlen][i]) & one) {
- break;
- }
- }
- mqc_setcurctx(mqc, T1_CTXNO_AGG);
- mqc_encode(mqc, runlen != 4);
- if (runlen == 4) {
- continue;
- }
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- mqc_encode(mqc, runlen >> 1);
- mqc_encode(mqc, runlen & 1);
- } else {
- runlen = 0;
- }
- for (j = k + runlen; j < k + 4 && j < h; j++) {
- vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;
- t1_3d_enc_clnpass_step(t1, &t1->flags[1 + m][1 + j][1 + i],
- &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], orient, bpno, one,
- nmsedec, agg && (j == k + runlen), vsc);
- }
- }
- }
- }
-}
-
-static void t1_3d_dec_clnpass(opj_t1_3d_t *t1, int w, int h, int l, int bpno,
- int orient, int cblksty)
-{
- int i, j, k, m, one, half, oneplushalf, agg, runlen, vsc;
- int segsym = cblksty & J3D_CCP_CBLKSTY_SEGSYM;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- one = 1 << bpno;
- half = one >> 1;
- oneplushalf = one | half;
- for (m = 0; m < l; m++) {
- for (k = 0; k < h; k += 4) {
- for (i = 0; i < w; i++) {
- if (k + 3 < h) {
- if (cblksty & J3D_CCP_CBLKSTY_VSC) {
- agg = !(
- ((t1->flagSVR[1 + m][1 + k][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) |
- (t1->flags[1 + m][1 + k][1 + i] & T1_3D_SIG_OTH))
- || ((t1->flagSVR[1 + m][1 + k + 1][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) |
- (t1->flags[1 + m][1 + k + 1][1 + i] & T1_3D_SIG_OTH))
- || ((t1->flagSVR[1 + m][1 + k + 2][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) |
- (t1->flags[1 + m][1 + k + 2][1 + i] & T1_3D_SIG_OTH))
- || ((t1->flagSVR[1 + m][1 + k + 3][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) | ((
- t1->flags[1 + m][1 + k + 3][1 + i] & (~(T1_3D_SIG_S | T1_3D_SIG_SE |
- T1_3D_SIG_SW | (T1_3D_SGN_S << 16)))) & (T1_3D_SIG_OTH)))
- );
- } else {
- agg = !(
- ((t1->flagSVR[1 + m][1 + k][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) |
- (t1->flags[1 + m][1 + k][1 + i] & T1_3D_SIG_OTH))
- || ((t1->flagSVR[1 + m][1 + k + 1][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) |
- (t1->flags[1 + m][1 + k + 1][1 + i] & T1_3D_SIG_OTH))
- || ((t1->flagSVR[1 + m][1 + k + 2][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) |
- (t1->flags[1 + m][1 + k + 2][1 + i] & T1_3D_SIG_OTH))
- || ((t1->flagSVR[1 + m][1 + k + 3][1 + i] & (T1_3D_SIG | T1_3D_VISIT)) |
- (t1->flags[1 + m][1 + k + 3][1 + i] & T1_3D_SIG_OTH))
- );
- }
- } else {
- agg = 0;
- }
- if (agg) {
- mqc_setcurctx(mqc, T1_CTXNO_AGG);
- if (!mqc_decode(mqc)) {
- continue;
- }
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- runlen = mqc_decode(mqc);
- runlen = (runlen << 1) | mqc_decode(mqc);
- } else {
- runlen = 0;
- }
- for (j = k + runlen; j < k + 4 && j < h; j++) {
- vsc = ((cblksty & J3D_CCP_CBLKSTY_VSC) && (j == k + 3 || j == h - 1)) ? 1 : 0;
- t1_3d_dec_clnpass_step(t1, &t1->flags[1 + m][1 + j][1 + i],
- &t1->flagSVR[1 + m][1 + j][1 + i], &t1->data[m][j][i], orient, oneplushalf,
- agg && (j == k + runlen), vsc);
- }
- }
- }
- }
- if (segsym) {
- int v = 0;
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- v = mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- /*
- if (v!=0xa) {
- opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
- }
- */
- }
-} /* VSC and BYPASS by Antonin */
-
-
-static void t1_3d_encode_cblk(opj_t1_3d_t *t1, opj_tcd_cblk_t * cblk,
- int orient, int compno, int level[3], int dwtid[3], double stepsize,
- int cblksty, int numcomps, opj_tcd_tile_t * tile)
-{
- int i, j, k;
- int w, h, l;
- int passno;
- int bpno, passtype;
- int max;
- int nmsedec = 0;
- double cumwmsedec = 0;
- char type = T1_TYPE_MQ;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- w = cblk->x1 - cblk->x0;
- h = cblk->y1 - cblk->y0;
- l = cblk->z1 - cblk->z0;
-
- max = 0;
- for (k = 0; k < l; k++) {
- for (j = 0; j < h; j++) {
- for (i = 0; i < w; i++) {
- max = int_max(max, int_abs(t1->data[k][j][i]));
- }
- }
- }
- for (k = 0; k <= l; k++) {
- for (j = 0; j <= h; j++) {
- for (i = 0; i <= w; i++) {
- t1->flags[k][j][i] = 0;
- t1->flagSVR[k][j][i] = 0;
- }
- }
- }
-
- cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0;
-
- bpno = cblk->numbps - 1;
- passtype = 2;
-
- mqc_reset_enc(mqc);
- mqc_init_enc(mqc, cblk->data);
-
- for (passno = 0; bpno >= 0; passno++) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- int correction = 3;
- double tmpwmsedec;
- type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) &&
- (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
-
- switch (passtype) {
- case 0:
- t1_3d_enc_sigpass(t1, w, h, l, bpno, orient, &nmsedec, type, cblksty);
- break;
- case 1:
- t1_3d_enc_refpass(t1, w, h, l, bpno, &nmsedec, type, cblksty);
- break;
- case 2:
- t1_3d_enc_clnpass(t1, w, h, l, bpno, orient, &nmsedec, cblksty);
- /* code switch SEGMARK (i.e. SEGSYM) */
- if (cblksty & J3D_CCP_CBLKSTY_SEGSYM) {
- mqc_segmark_enc(mqc);
- }
- break;
- }
-
- /* fixed_quality */
- tmpwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, stepsize,
- numcomps, dwtid);
- cumwmsedec += tmpwmsedec;
- tile->distotile += tmpwmsedec;
-
- /* Code switch "RESTART" (i.e. TERMALL) */
- if ((cblksty & J3D_CCP_CBLKSTY_TERMALL) && !((passtype == 2) &&
- (bpno - 1 < 0))) {
- if (type == T1_TYPE_RAW) {
- mqc_flush(mqc);
- correction = 1;
- /* correction = mqc_bypass_flush_enc(); */
- } else { /* correction = mqc_restart_enc(); */
- mqc_flush(mqc);
- correction = 1;
- }
- pass->term = 1;
- } else {
- if (((bpno < (cblk->numbps - 4) && (passtype > 0))
- || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) &&
- (cblksty & J3D_CCP_CBLKSTY_LAZY)) {
- if (type == T1_TYPE_RAW) {
- mqc_flush(mqc);
- correction = 1;
- } else {
- mqc_flush(mqc);
- correction = 1;
- }
- pass->term = 1;
- } else {
- pass->term = 0;
- }
- }
-
- if (++passtype == 3) {
- passtype = 0;
- bpno--;
- }
-
- if (pass->term && bpno > 0) {
- type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) &&
- (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
- if (type == T1_TYPE_RAW) {
- mqc_bypass_init_enc(mqc);
- } else {
- mqc_restart_init_enc(mqc);
- }
- }
-
- pass->distortiondec = cumwmsedec;
- pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */
- pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
-
- /* Code-switch "RESET" */
- if (cblksty & J3D_CCP_CBLKSTY_RESET) {
- mqc_reset_enc(mqc);
- }
- }
-
- /* Code switch "ERTERM" (i.e. PTERM) */
- if (cblksty & J3D_CCP_CBLKSTY_PTERM) {
- mqc_erterm_enc(mqc);
- } else /* Default coding */ if (!(cblksty & J3D_CCP_CBLKSTY_LAZY)) {
- mqc_flush(mqc);
- }
-
- cblk->totalpasses = passno;
-}
-
-static void t1_3d_decode_cblk(opj_t1_3d_t *t1, opj_tcd_cblk_t * cblk,
- int orient, int roishift, int cblksty)
-{
- int i, j, k;
- int w, h, l;
- int bpno, passtype;
- int segno, passno;
- char type = T1_TYPE_MQ; /* BYPASS mode */
- opj_raw_t *raw = t1->raw; /* RAW component */
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- w = cblk->x1 - cblk->x0;
- h = cblk->y1 - cblk->y0;
- l = cblk->z1 - cblk->z0;
-
- for (k = 0; k < l; k++) {
- for (j = 0; j < h; j++) {
- for (i = 0; i < w; i++) {
- t1->data[k][j][i] = 0;
- }
- }
- }
-
- for (k = 0; k <= l; k++) {
- for (j = 0; j <= h; j++) {
- for (i = 0; i <= w; i++) {
- t1->flags[k][j][i] = 0;
- t1->flagSVR[k][j][i] = 0;
- }
- }
- }
-
-
- bpno = roishift + cblk->numbps - 1;
- passtype = 2;
-
- mqc_reset_enc(mqc);
-
- for (segno = 0; segno < cblk->numsegs; segno++) {
- opj_tcd_seg_t *seg = &cblk->segs[segno];
-
- /* BYPASS mode */
- type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) &&
- (cblksty & J3D_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
- if (type == T1_TYPE_RAW) {
- raw_init_dec(raw, seg->data, seg->len);
- } else {
- mqc_init_dec(mqc, seg->data, seg->len);
- }
-
- for (passno = 0; passno < seg->numpasses; passno++) {
- switch (passtype) {
- case 0:
- t1_3d_dec_sigpass(t1, w, h, l, bpno + 1, orient, type, cblksty);
- break;
- case 1:
- t1_3d_dec_refpass(t1, w, h, l, bpno + 1, type, cblksty);
- break;
- case 2:
- t1_3d_dec_clnpass(t1, w, h, l, bpno + 1, orient, cblksty);
- break;
- }
-
- if ((cblksty & J3D_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
- mqc_reset_enc(mqc);
- }
- if (++passtype == 3) {
- passtype = 0;
- bpno--;
- }
-
- }
- }
-}
-
-static int t1_3d_init_ctxno_zc(unsigned int f, int orient)
-{
- unsigned int h, v, c;
- unsigned int d2xy, d2xz, d2yz, d3;
- int n;
- unsigned int hvc, hc, d2, d2xy2yz, d2xy2xz;
- n = 0;
- h = ((f & T1_3D_SIG_W) != 0) + ((f & T1_3D_SIG_E) != 0);
- v = ((f & T1_3D_SIG_N) != 0) + ((f & T1_3D_SIG_S) != 0);
- c = ((f & T1_3D_SIG_FC) != 0) + ((f & T1_3D_SIG_BC) != 0);
- d2xy = ((f & T1_3D_SIG_NW) != 0) + ((f & T1_3D_SIG_NE) != 0) + ((
- f & T1_3D_SIG_SE) != 0) + ((f & T1_3D_SIG_SW) != 0);
- d2xz = ((f & T1_3D_SIG_FW) != 0) + ((f & T1_3D_SIG_BW) != 0) + ((
- f & T1_3D_SIG_FE) != 0) + ((f & T1_3D_SIG_BE) != 0);
- d2yz = ((f & T1_3D_SIG_FN) != 0) + ((f & T1_3D_SIG_FS) != 0) + ((
- f & T1_3D_SIG_BN) != 0) + ((f & T1_3D_SIG_BS) != 0);
- d3 = ((f & T1_3D_SIG_FNW) != 0) + ((f & T1_3D_SIG_FNE) != 0) + ((
- f & T1_3D_SIG_FSE) != 0) + ((f & T1_3D_SIG_FSW) != 0)
- + ((f & T1_3D_SIG_BNW) != 0) + ((f & T1_3D_SIG_BNE) != 0) + ((
- f & T1_3D_SIG_BSE) != 0) + ((f & T1_3D_SIG_BSW) != 0);
-
- switch (orient) {
- case 0: /*LLL*/
- case 7: /*HHH*/
- hvc = h + v + c;
- d2 = d2xy + d2xz + d2yz;
- if (!hvc) {
- if (!d2) {
- n = (!d3) ? 0 : 1;
- } else if (d2 == 1) {
- n = (!d3) ? 2 : 3;
- } else {
- n = (!d3) ? 4 : 5;
- }
- } else if (hvc == 1) {
- if (!d2) {
- n = (!d3) ? 6 : 7;
- } else if (d2 == 1) {
- n = (!d3) ? 8 : 9;
- } else {
- n = 10;
- }
- } else if (hvc == 2) {
- if (!d2) {
- n = (!d3) ? 11 : 12;
- } else {
- n = 13;
- }
- } else if (hvc == 3) {
- n = 14;
- } else {
- n = 15;
- }
- break;
- /*LHL, HLL, LLH*/
- case 1:
- case 2:
- case 4:
- hc = h + c;
- d2xy2yz = d2xy + d2yz;
- if (!hc) {
- if (!v) {
- if (!d2xy) {
- n = (!d2xy2yz) ? ((!d3) ? 0 : 1) : ((!d3) ? 2 : 3);
- } else if (d2xy == 1) {
- n = (!d2xy2yz) ? ((!d3) ? 4 : 5) : 6;
- } else { /*>=2*/
- n = 7;
- }
- } else {
- n = (v == 1) ? 8 : 9; /* =1 or =2*/
- }
- } else if (hc == 1) {
- n = (!v) ? ((!d2xy) ? ((!d2xy2yz) ? ((!d3) ? 10 : 11) : (12)) : (13)) : (14);
- } else { /*if (hc >= 2)*/
- n = 15;
- }
- break;
- /*HLH, HHL, LHH*/
- case 3:
- case 5:
- case 6:
- hc = h + c;
- d2xy2xz = d2xy + d2xz;
- if (!v) {
- if (!d2xz) {
- if (!hc && !d2xy2xz) {
- n = (!d3) ? 0 : 1;
- } else if (hc == 1) {
- n = (!d2xy2xz) ? 2 : 3;
- } else { /*if >= 2*/
- n = 4;
- }
- } else if (d2xz >= 1 && !hc) {
- n = 5;
- } else if (hc >= 1) {
- n = (d2xz == 1) ? 6 : 7;
- }
- } else if (v == 1) {
- if (!d2xz) {
- n = (!hc) ? 8 : 9;
- } else if (d2xz == 1) {
- n = (!hc) ? 10 : 11;
- } else if (d2xz == 2) {
- n = (!hc) ? 12 : 13;
- } else { /* if (d2xz >= 3) {*/
- n = 14;
- }
- } else if (v == 2) {
- n = 15;
- }
- break;
- }
-
- return (T1_3D_CTXNO_ZC + n);
-}
-
-static int t1_3d_init_ctxno_sc(unsigned int f)
-{
- int hc, vc, cc;
- int n = 0;
-
- hc = int_min(((f & (T1_3D_SIG_E | T1_3D_SGN_E)) == T1_3D_SIG_E)
- + ((f & (T1_3D_SIG_W | T1_3D_SGN_W)) == T1_3D_SIG_W), 1)
- - int_min(((f & (T1_3D_SIG_E | T1_3D_SGN_E)) == (T1_3D_SIG_E | T1_3D_SGN_E))
- + ((f & (T1_3D_SIG_W | T1_3D_SGN_W)) == (T1_3D_SIG_W | T1_3D_SGN_W)), 1);
-
- vc = int_min(((f & (T1_3D_SIG_N | T1_3D_SGN_N)) == T1_3D_SIG_N)
- + ((f & (T1_3D_SIG_S | T1_3D_SGN_S)) == T1_3D_SIG_S), 1)
- - int_min(((f & (T1_3D_SIG_N | T1_3D_SGN_N)) == (T1_3D_SIG_N | T1_3D_SGN_N))
- + ((f & (T1_3D_SIG_S | T1_3D_SGN_S)) == (T1_3D_SIG_S | T1_3D_SGN_S)), 1);
-
- cc = int_min(((f & (T1_3D_SIG_FC | T1_3D_SGN_F)) == T1_3D_SIG_FC)
- + ((f & (T1_3D_SIG_BC | T1_3D_SGN_B)) == T1_3D_SIG_BC), 1)
- - int_min(((f & (T1_3D_SIG_FC | T1_3D_SGN_F)) == (T1_3D_SIG_FC | T1_3D_SGN_F))
- + ((f & (T1_3D_SIG_BC | T1_3D_SGN_B)) == (T1_3D_SIG_BC | T1_3D_SGN_B)), 1);
- if (hc < 0) {
- hc = -hc;
- vc = -vc;
- cc = -cc;
- }
-
- if (!hc) {
- if (!vc) {
- n = (!cc) ? 0 : 1;
- } else if (vc == -1) {
- n = (!cc) ? 1 : ((cc > 0) ? 2 : 4);
- } else if (vc == 1) {
- n = (!cc) ? 1 : ((cc < 0) ? 2 : 4);
- }
- } else if (hc == 1) {
- if (!vc) {
- n = (!cc) ? 1 : ((cc < 0) ? 2 : 4);
- } else if (vc == 1) {
- n = (!cc) ? 4 : ((cc > 0) ? 5 : 3);
- } else if (vc == -1) {
- n = (!cc) ? 2 : 3;
- }
- } else if (hc == -1) {
- if (!vc) {
- n = (!cc) ? 1 : ((cc > 0) ? 2 : 4);
- } else if (vc == 1) {
- n = (!cc) ? 2 : 3;
- } else if (vc == -1) {
- n = (!cc) ? 4 : ((cc < 0) ? 5 : 3);
- }
- }
-
- return (T1_3D_CTXNO_SC + n);
-}
-
-static int t1_3d_init_ctxno_mag(unsigned int f, int f2)
-{
- int n;
- if (!(f2 &
- T1_3D_REFINE)) { /*First refinement for this coefficient (no previous refinement)*/
- n = (f & (T1_3D_SIG_PRIM)) ? 1 : 0;
- } else {
- n = 2;
- }
-
- return (T1_3D_CTXNO_MAG + n);
-}
-
-static int t1_3d_init_spb(unsigned int f)
-{
- int hc, vc, cc;
- int n = 0;
-
- hc = int_min(((f & (T1_3D_SIG_E | T1_3D_SGN_E)) == T1_3D_SIG_E)
- + ((f & (T1_3D_SIG_W | T1_3D_SGN_W)) == T1_3D_SIG_W), 1)
- - int_min(((f & (T1_3D_SIG_E | T1_3D_SGN_E)) == (T1_3D_SIG_E | T1_3D_SGN_E))
- + ((f & (T1_3D_SIG_W | T1_3D_SGN_W)) == (T1_3D_SIG_W | T1_3D_SGN_W)), 1);
-
- vc = int_min(((f & (T1_3D_SIG_N | T1_3D_SGN_N)) == T1_3D_SIG_N)
- + ((f & (T1_3D_SIG_S | T1_3D_SGN_S)) == T1_3D_SIG_S), 1)
- - int_min(((f & (T1_3D_SIG_N | T1_3D_SGN_N)) == (T1_3D_SIG_N | T1_3D_SGN_N))
- + ((f & (T1_3D_SIG_S | T1_3D_SGN_S)) == (T1_3D_SIG_S | T1_3D_SGN_S)), 1);
-
- cc = int_min(((f & (T1_3D_SIG_FC | T1_3D_SGN_F)) == T1_3D_SIG_FC)
- + ((f & (T1_3D_SIG_BC | T1_3D_SGN_B)) == T1_3D_SIG_BC), 1)
- - int_min(((f & (T1_3D_SIG_FC | T1_3D_SGN_F)) == (T1_3D_SIG_FC | T1_3D_SGN_F))
- + ((f & (T1_3D_SIG_BC | T1_3D_SGN_B)) == (T1_3D_SIG_BC | T1_3D_SGN_B)), 1);
-
- n = ((hc + vc + cc) < 0);
-
- return n;
-}
-
-static void t1_3d_init_luts(opj_t1_3d_t *t1)
-{
- int i;
- double u, v, t;
- /*for (j = 0; j < 4; j++) {
- for (i = 0; i < 256; ++i) {
- t1->lut_ctxno_zc[(j << 8) | i] = t1_3d_init_ctxno_zc(i, j);
- }
- }
- for (i = 0; i < 4096; i++) {
- t1->lut_ctxno_sc[i] = t1_3d_init_ctxno_sc(i << 4);
- }
- for (j = 0; j < 2; j++) {
- for (i = 0; i < 2048; ++i) {
- t1->lut_ctxno_mag[(j << 11) + i] = t1_3d_init_ctxno_mag((j ? T1_3D_REFINE : 0) | i);
- }
- }
- for (i = 0; i < 4096; ++i) {
- t1->lut_spb[i] = t1_3d_init_spb(i << 4);
- }*/
- /* FIXME FIXME FIXME */
- for (i = 0; i < (1 << T1_NMSEDEC_BITS); i++) {
- t = i / pow(2, T1_NMSEDEC_FRACBITS);
- u = t;
- v = t - 1.5;
- t1->lut_nmsedec_sig[i] =
- int_max(0,
- (int)(floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2,
- T1_NMSEDEC_FRACBITS) * 8192.0));
- t1->lut_nmsedec_sig0[i] =
- int_max(0,
- (int)(floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2,
- T1_NMSEDEC_FRACBITS) * 8192.0));
- u = t - 1.0;
- if (i & (1 << (T1_NMSEDEC_BITS - 1))) {
- v = t - 1.5;
- } else {
- v = t - 0.5;
- }
- t1->lut_nmsedec_ref[i] =
- int_max(0,
- (int)(floor((u * u - v * v) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2,
- T1_NMSEDEC_FRACBITS) * 8192.0));
- t1->lut_nmsedec_ref0[i] =
- int_max(0,
- (int)(floor((u * u) * pow(2, T1_NMSEDEC_FRACBITS) + 0.5) / pow(2,
- T1_NMSEDEC_FRACBITS) * 8192.0));
- }
-}
-
-/* ----------------------------------------------------------------------- */
-
-opj_t1_3d_t* t1_3d_create(opj_common_ptr cinfo)
-{
- opj_t1_3d_t *t1 = (opj_t1_3d_t*)opj_malloc(sizeof(opj_t1_3d_t));
- if (t1) {
- t1->cinfo = cinfo;
- /* create MQC and RAW handles */
- t1->mqc = mqc_create();
- t1->raw = raw_create();
- /* initialize the look-up tables of the Tier-1 coder/decoder */
- t1_3d_init_luts(t1);
- }
- return t1;
-}
-
-void t1_3d_destroy(opj_t1_3d_t *t1)
-{
- if (t1) {
- /* destroy MQC and RAW handles */
- mqc_destroy(t1->mqc);
- raw_destroy(t1->raw);
- opj_free(t1);
- }
-}
-
-void t1_3d_encode_cblks(opj_t1_3d_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp)
-{
- int compno, resno, bandno, precno, cblkno;
- int x, y, z, i, j, k, orient;
- int level[3];
- tile->distotile = 0; /* fixed_quality */
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-
- for (resno = 0; resno < tilec->numresolution[0]; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
-
- for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2];
- precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
-
- if (band->bandno == 0) {
- x = cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 1) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 2) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 3) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 4) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- } else if (band->bandno == 5) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- } else if (band->bandno == 6) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- } else if (band->bandno == 7) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- }
-
- if (tcp->tccps[compno].reversible == 1) {
- for (k = 0; k < cblk->z1 - cblk->z0; k++) {
- for (j = 0; j < cblk->y1 - cblk->y0; j++) {
- for (i = 0; i < cblk->x1 - cblk->x0; i++) {
- t1->data[k][j][i] =
- tilec->data[(x + i) + (y + j) * (tilec->x1 - tilec->x0) + (z + k) *
- (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] << T1_NMSEDEC_FRACBITS;
- }
- }
- }
- } else if (tcp->tccps[compno].reversible == 0) {
- for (k = 0; k < cblk->z1 - cblk->z0; k++) {
- for (j = 0; j < cblk->y1 - cblk->y0; j++) {
- for (i = 0; i < cblk->x1 - cblk->x0; i++) {
- t1->data[k][j][i] = fix_mul(
- tilec->data[(x + i) + (y + j) * (tilec->x1 - tilec->x0) + (z + k) *
- (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)],
- 8192 * 8192 / ((int) floor(band->stepsize * 8192))) >> (13 -
- T1_NMSEDEC_FRACBITS);
- }
- }
- }
- }
- orient = band->bandno; /* FIXME */
- for (i = 0; i < 3; i++) {
- level[i] = tilec->numresolution[i] - 1 - resno;
- }
-
- t1_3d_encode_cblk(t1, cblk, orient, compno, level, tcp->tccps[compno].dwtid,
- band->stepsize, tcp->tccps[compno].cblksty, tile->numcomps, tile);
-
- } /* cblkno */
- } /* precno */
- } /* bandno */
- } /* resno */
- } /* compno */
-}
-
-void t1_3d_decode_cblks(opj_t1_3d_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp)
-{
- int compno, resno, bandno, precno, cblkno;
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-
- for (resno = 0; resno < tilec->numresolution[0]; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
-
- for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2];
- precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- int x, y, z, i, j, k, orient;
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
-
- orient = band->bandno; /* FIXME */
-
- /*fprintf(stdout,"[INFO] t1_3d_decode_cblk(t1, cblk, orient(%d), tcp->tccps[compno].roishift (%d), tcp->tccps[compno].cblksty (%d));\n",orient,tcp->tccps[compno].roishift, tcp->tccps[compno].cblksty);*/
- t1_3d_decode_cblk(t1, cblk, orient, tcp->tccps[compno].roishift,
- tcp->tccps[compno].cblksty);
-
- if (band->bandno == 0) {
- x = cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 1) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 2) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 3) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = cblk->z0 - band->z0;
- } else if (band->bandno == 4) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- } else if (band->bandno == 5) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- } else if (band->bandno == 6) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- } else if (band->bandno == 7) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x = pres->x1 - pres->x0 + cblk->x0 - band->x0;
- y = pres->y1 - pres->y0 + cblk->y0 - band->y0;
- z = pres->z1 - pres->z0 + cblk->z0 - band->z0;
- }
-
- if (tcp->tccps[compno].roishift) {
- int thresh, val, mag;
- thresh = 1 << tcp->tccps[compno].roishift;
- for (k = 0; k < cblk->z1 - cblk->z0; k++) {
- for (j = 0; j < cblk->y1 - cblk->y0; j++) {
- for (i = 0; i < cblk->x1 - cblk->x0; i++) {
- val = t1->data[k][j][i];
- mag = int_abs(val);
- if (mag >= thresh) {
- mag >>= tcp->tccps[compno].roishift;
- t1->data[k][j][i] = val < 0 ? -mag : mag;
- }
- }
- }
- }
- }
-
- if (tcp->tccps[compno].reversible == 1) {
- for (k = 0; k < cblk->z1 - cblk->z0; k++) {
- for (j = 0; j < cblk->y1 - cblk->y0; j++) {
- for (i = 0; i < cblk->x1 - cblk->x0; i++) {
- int tmp = t1->data[k][j][i];
- tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) *
- (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = tmp / 2;
- }
- }
- }
- } else { /* if (tcp->tccps[compno].reversible == 0) */
- for (k = 0; k < cblk->z1 - cblk->z0; k++) {
- for (j = 0; j < cblk->y1 - cblk->y0; j++) {
- for (i = 0; i < cblk->x1 - cblk->x0; i++) {
- double tmp = (double)(t1->data[k][j][i] * band->stepsize * 4096.0);
- if (t1->data[k][j][i] >> 1 == 0) {
- tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) *
- (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = 0;
- } else {
- int tmp2 = ((int)(floor(fabs(tmp)))) + ((int) floor(fabs(tmp * 2)) % 2);
- tilec->data[x + i + (y + j) * (tilec->x1 - tilec->x0) + (z + k) *
- (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)] = ((tmp < 0) ? -tmp2 : tmp2);
- }
- }
- }
- }
- }
- } /* cblkno */
- } /* precno */
- } /* bandno */
- } /* resno */
- } /* compno */
-}
+++ /dev/null
-/*
- * Copyrigth (c) 2006, Mónica DÃez, LPI-UVA, 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 __T1_3D_H
-#define __T1_3D_H
-/**
-@file t1_3d.h
-@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1)
-
-The functions in T1_3D.C have for goal to realize the tier-1 coding operation of 3D-EBCOT.
-The functions in T1_3D.C are used by some function in TCD.C.
-*/
-
-/** @defgroup T1_3D T1_3D - Implementation of the tier-1 coding */
-/*@{*/
-
-/* ----------------------------------------------------------------------- */
-
-/* Neighbourhood of 3D EBCOT (Significance context)*/
-#define T1_3D_SIG_NE 0x00000001 /*< Context orientation : North-East direction */
-#define T1_3D_SIG_SE 0x00000002 /*< Context orientation : South-East direction */
-#define T1_3D_SIG_SW 0x00000004 /*< Context orientation : South-West direction */
-#define T1_3D_SIG_NW 0x00000008 /* Context orientation : North-West direction */
-#define T1_3D_SIG_N 0x00000010 /*< Context orientation : North direction */
-#define T1_3D_SIG_E 0x00000020 /*< Context orientation : East direction */
-#define T1_3D_SIG_S 0x00000040 /*< Context orientation : South direction */
-#define T1_3D_SIG_W 0x00000080 /*< Context orientation : West direction */
-#define T1_3D_SIG_FC 0x00000100 /*< Context orientation : Forward Central direction */
-#define T1_3D_SIG_BC 0x00000200 /*< Context orientation : Backward Central direction */
-#define T1_3D_SIG_FNE 0x00000400 /*< Context orientation : Forward North-East direction */
-#define T1_3D_SIG_FSE 0x00000800 /*< Context orientation : Forward South-East direction */
-#define T1_3D_SIG_FSW 0x00001000 /*< Context orientation : Forward South-West direction */
-#define T1_3D_SIG_FNW 0x00002000 /*< Context orientation : Forward North-West direction */
-#define T1_3D_SIG_FN 0x00004000 /*< Context orientation : Forward North direction */
-#define T1_3D_SIG_FE 0x00008000 /*< Context orientation : Forward East direction */
-#define T1_3D_SIG_FS 0x00010000 /*< Context orientation : Forward South direction */
-#define T1_3D_SIG_FW 0x00020000 /*< Context orientation : Forward West direction */
-#define T1_3D_SIG_BNE 0x00040000 /*< Context orientation : Backward North-East direction */
-#define T1_3D_SIG_BSE 0x00080000 /*< Context orientation : Backward South-East direction */
-#define T1_3D_SIG_BSW 0x00100000 /*< Context orientation : Backward South-West direction */
-#define T1_3D_SIG_BNW 0x00200000 /*< Context orientation : Backward North-West direction */
-#define T1_3D_SIG_BN 0x00400000 /*< Context orientation : Backward North direction */
-#define T1_3D_SIG_BE 0x00800000 /*< Context orientation : Backward East direction */
-#define T1_3D_SIG_BS 0x01000000 /*< Context orientation : Backward South direction */
-#define T1_3D_SIG_BW 0x02000000 /*< Context orientation : Backward West direction */
-#define T1_3D_SIG_COTH (T1_3D_SIG_N|T1_3D_SIG_NE|T1_3D_SIG_E|T1_3D_SIG_SE|T1_3D_SIG_S|T1_3D_SIG_SW|T1_3D_SIG_W|T1_3D_SIG_NW)
-#define T1_3D_SIG_BOTH (T1_3D_SIG_BN|T1_3D_SIG_BNE|T1_3D_SIG_BE|T1_3D_SIG_BSE|T1_3D_SIG_BS|T1_3D_SIG_BSW|T1_3D_SIG_BW|T1_3D_SIG_BNW|T1_3D_SIG_BC)
-#define T1_3D_SIG_FOTH (T1_3D_SIG_FN|T1_3D_SIG_FNE|T1_3D_SIG_FE|T1_3D_SIG_FSE|T1_3D_SIG_FS|T1_3D_SIG_FSW|T1_3D_SIG_FW|T1_3D_SIG_FNW|T1_3D_SIG_FC)
-#define T1_3D_SIG_OTH (T1_3D_SIG_FOTH|T1_3D_SIG_BOTH|T1_3D_SIG_COTH)
-#define T1_3D_SIG_PRIM (T1_3D_SIG_N|T1_3D_SIG_E|T1_3D_SIG_S|T1_3D_SIG_W|T1_3D_SIG_FC|T1_3D_SIG_BC)
-
-#define T1_3D_SGN_N 0x0400
-#define T1_3D_SGN_E 0x0800
-#define T1_3D_SGN_S 0x1000
-#define T1_3D_SGN_W 0x2000
-#define T1_3D_SGN_F 0x4000
-#define T1_3D_SGN_B 0x8000
-#define T1_3D_SGN (T1_3D_SGN_N|T1_3D_SGN_E|T1_3D_SGN_S|T1_3D_SGN_W|T1_3D_SGN_F|T1_3D_SGN_B)
-
-#define T1_3D_SIG 0x0001 /*Significance state*/
-#define T1_3D_REFINE 0x0002 /*Delayed significance*/
-#define T1_3D_VISIT 0x0004 /*First-pass membership*/
-
-#define T1_3D_NUMCTXS_AGG 1
-#define T1_3D_NUMCTXS_ZC 16
-#define T1_3D_NUMCTXS_MAG 3
-#define T1_3D_NUMCTXS_SC 6
-#define T1_3D_NUMCTXS_UNI 1
-
-#define T1_3D_CTXNO_AGG 0
-#define T1_3D_CTXNO_ZC (T1_3D_CTXNO_AGG+T1_3D_NUMCTXS_AGG) /*1*/
-#define T1_3D_CTXNO_MAG (T1_3D_CTXNO_ZC+T1_3D_NUMCTXS_ZC) /*17*/
-#define T1_3D_CTXNO_SC (T1_3D_CTXNO_MAG+T1_3D_NUMCTXS_MAG) /*20*/
-#define T1_3D_CTXNO_UNI (T1_3D_CTXNO_SC+T1_3D_NUMCTXS_SC) /*26*/
-#define T1_3D_NUMCTXS (T1_3D_CTXNO_UNI+T1_3D_NUMCTXS_UNI) /*27*/
-
-
-/* ----------------------------------------------------------------------- */
-
-/**
-Tier-1 coding (coding of code-block coefficients)
-*/
-typedef struct opj_t1_3d {
- /** Codec context */
- opj_common_ptr cinfo;
- /** MQC component */
- opj_mqc_t *mqc;
- /** RAW component */
- opj_raw_t *raw;
- /** LUTs for decoding normalised MSE */
- int lut_nmsedec_sig[1 << T1_NMSEDEC_BITS];
- int lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS];
- int lut_nmsedec_ref[1 << T1_NMSEDEC_BITS];
- int lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS];
- /** Codeblock data */
- int data[T1_CBLKD][T1_CBLKH][T1_CBLKW];
- /** Context information for each voxel in codeblock */
- unsigned int flags[T1_CBLKD + 2][T1_CBLKH + 2][T1_CBLKH + 2];
- /** Voxel information (significance/visited/refined) */
- int flagSVR[T1_CBLKD + 2][T1_CBLKH + 2][T1_CBLKH + 2];
-} opj_t1_3d_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a new T1_3D handle
-and initialize the look-up tables of the Tier-1 coder/decoder
-@return Returns a new T1 handle if successful, returns NULL otherwise
-@see t1_init_luts
-*/
-opj_t1_3d_t* t1_3d_create(opj_common_ptr cinfo);
-/**
-Destroy a previously created T1_3D handle
-@param t1 T1_3D handle to destroy
-*/
-void t1_3d_destroy(opj_t1_3d_t *t1);
-/**
-Encode the code-blocks of a tile
-@param t1 T1_3D handle
-@param tile The tile to encode
-@param tcp Tile coding parameters
-*/
-void t1_3d_encode_cblks(opj_t1_3d_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);
-/**
-Decode the code-blocks of a tile
-@param t1 T1_3D handle
-@param tile The tile to decode
-@param tcp Tile coding parameters
-*/
-void t1_3d_decode_cblks(opj_t1_3d_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);
-/**
-Get weigths of MSE decoding
-@param nmsedec The normalized MSE reduction
-@param compno
-@param level
-@param orient
-@param bpno
-@param reversible
-@param stepsize
-@param numcomps
-@param dwtid
-returns MSE associated to decoding pass
-double t1_3d_getwmsedec(int nmsedec, int compno, int levelxy, int levelz, int orient, int bpno, int reversible, double stepsize, int numcomps, int dwtid);
-*/
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __T1_H */
+++ /dev/null
-/*
- * 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
- * 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_includes.h"
-
-/** @defgroup T2 T2 - Implementation of a tier-2 coding */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-static void t2_putcommacode(opj_bio_t *bio, int n);
-static int t2_getcommacode(opj_bio_t *bio);
-/**
-Variable length code for signalling delta Zil (truncation point)
-@param bio Bit Input/Output component
-@param n delta Zil
-*/
-static void t2_putnumpasses(opj_bio_t *bio, int n);
-static int t2_getnumpasses(opj_bio_t *bio);
-/**
-Encode a packet of a tile to a destination buffer
-@param tile Tile for which to write the packets
-@param tcp Tile coding parameters
-@param pi Packet identity
-@param dest Destination buffer
-@param len Length of the destination buffer
-@param volume_info Structure to create an index file
-@param tileno Number of the tile encoded
-@param cp Coding parameters
-@return Number of bytes encoded from the packet
-*/
-static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp,
- opj_pi_iterator_t *pi, unsigned char *dest, int len,
- opj_volume_info_t *volume_info, int tileno, opj_cp_t *cp);
-/**
-Initialize the segment decoder
-@param seg Segment instance
-@param cblksty Codeblock style
-@param first Is first segment
-*/
-static void t2_init_seg(opj_tcd_seg_t *seg, int cblksty, int first);
-/**
-Decode a packet of a tile from a source buffer
-@param t2 T2 handle
-@param src Source buffer
-@param len Length of the source buffer
-@param tile Tile for which to write the packets
-@param tcp Tile coding parameters
-@param pi Packet identity
-@return Number of bytes decoded from the packet
-*/
-int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len,
- opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi);
-
-/*@}*/
-
-/*@}*/
-
-/* ----------------------------------------------------------------------- */
-
-/* #define RESTART 0x04 */
-static void t2_putcommacode(opj_bio_t *bio, int n)
-{
- while (--n >= 0) {
- bio_write(bio, 1, 1);
- }
- bio_write(bio, 0, 1);
-}
-
-static int t2_getcommacode(opj_bio_t *bio)
-{
- int n;
- for (n = 0; bio_read(bio, 1); n++) {
- ;
- }
- return n;
-}
-
-static void t2_putnumpasses(opj_bio_t *bio, int n)
-{
- if (n == 1) {
- bio_write(bio, 0, 1);
- } else if (n == 2) {
- bio_write(bio, 2, 2);
- } else if (n <= 5) {
- bio_write(bio, 0xc | (n - 3), 4);
- } else if (n <= 36) {
- bio_write(bio, 0x1e0 | (n - 6), 9);
- } else if (n <= 164) {
- bio_write(bio, 0xff80 | (n - 37), 16);
- }
-}
-
-static int t2_getnumpasses(opj_bio_t *bio)
-{
- int n;
- if (!bio_read(bio, 1)) {
- return 1;
- }
- if (!bio_read(bio, 1)) {
- return 2;
- }
- if ((n = bio_read(bio, 2)) != 3) {
- return (3 + n);
- }
- if ((n = bio_read(bio, 5)) != 31) {
- return (6 + n);
- }
- return (37 + bio_read(bio, 7));
-}
-
-static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp,
- opj_pi_iterator_t *pi, unsigned char *dest, int len,
- opj_volume_info_t * volume_info, int tileno, opj_cp_t *cp)
-{
- int bandno, cblkno;
- unsigned char *sop = 0, *eph = 0;
- unsigned char *c = dest;
-
- int compno = pi->compno; /* component value */
- int resno = pi->resno; /* resolution level value */
- int precno = pi->precno; /* precinct value */
- int layno = pi->layno; /* quality layer value */
-
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- opj_bio_t *bio = NULL; /* BIO component */
-
- /* <SOP 0xff91> */
- if ((tcp->csty & J3D_CP_CSTY_SOP)) {
- sop = (unsigned char *) opj_malloc(6 * sizeof(unsigned char));
- sop[0] = 255;
- sop[1] = 145;
- sop[2] = 0;
- sop[3] = 4;
- sop[4] = (volume_info) ? (volume_info->num % 65536) / 256 : (0 % 65536) / 256 ;
- sop[5] = (volume_info) ? (volume_info->num % 65536) % 256 : (0 % 65536) % 256 ;
- memcpy(c, sop, 6);
- opj_free(sop);
- c += 6;
- }
- /* </SOP> */
-
- if (!layno) {
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- tgt_reset(prc->incltree);
- tgt_reset(prc->imsbtree);
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
- cblk->numpasses = 0;
- tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps);
- }
- }
- }
-
- bio = bio_create();
- bio_init_enc(bio, c, len);
- bio_write(bio, 1, 1); /* Empty header bit */
-
- /* Writing Packet header */
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
- if (!cblk->numpasses && layer->numpasses) {
- tgt_setvalue(prc->incltree, cblkno, layno);
- }
- }
-
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
- int increment = 0;
- int nump = 0;
- int len = 0, passno;
- /* cblk inclusion bits */
- if (!cblk->numpasses) {
- tgt_encode(bio, prc->incltree, cblkno, layno + 1);
- } else {
- bio_write(bio, layer->numpasses != 0, 1);
- }
- /* if cblk not included, go to the next cblk */
- if (!layer->numpasses) {
- continue;
- }
- /* if first instance of cblk --> zero bit-planes information */
- if (!cblk->numpasses) {
- cblk->numlenbits = 3;
- tgt_encode(bio, prc->imsbtree, cblkno, 999);
- }
- /* number of coding passes included */
- t2_putnumpasses(bio, layer->numpasses);
-
- /* computation of the increase of the length indicator and insertion in the header */
- for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses;
- passno++) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- nump++;
- len += pass->len;
- if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
- increment = int_max(increment,
- int_floorlog2(len) + 1 - (cblk->numlenbits + int_floorlog2(nump)));
- len = 0;
- nump = 0;
- }
- }
- t2_putcommacode(bio, increment);
-
- /* computation of the new Length indicator */
- cblk->numlenbits += increment;
-
- /* insertion of the codeword segment length */
- for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses;
- passno++) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- nump++;
- len += pass->len;
- if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
- bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump));
- len = 0;
- nump = 0;
- }
- }
-
- }
- }
-
-
- if (bio_flush(bio)) {
- bio_destroy(bio);
- return -999; /* modified to eliminate longjmp !! */
- }
-
- c += bio_numbytes(bio);
-
- bio_destroy(bio);
-
- /* <EPH 0xff92> */
- if (tcp->csty & J3D_CP_CSTY_EPH) {
- eph = (unsigned char *) opj_malloc(2 * sizeof(unsigned char));
- eph[0] = 255;
- eph[1] = 146;
- memcpy(c, eph, 2);
- opj_free(eph);
- c += 2;
- }
- /* </EPH> */
-
- /* Writing the packet body */
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
- if (!layer->numpasses) {
- continue;
- }
- if (c + layer->len > dest + len) {
- return -999;
- }
-
- memcpy(c, layer->data, layer->len);
- cblk->numpasses += layer->numpasses;
- c += layer->len;
- /* ADD for index Cfr. Marcela --> delta disto by packet */
- if (volume_info && volume_info->index_write && volume_info->index_on) {
- opj_tile_info_t *info_TL = &volume_info->tile[tileno];
- opj_packet_info_t *info_PK = &info_TL->packet[volume_info->num];
- info_PK->disto += layer->disto;
- if (volume_info->D_max < info_PK->disto) {
- volume_info->D_max = info_PK->disto;
- }
- }
- /* </ADD> */
- }
- }
-
- return (c - dest);
-}
-
-static void t2_init_seg(opj_tcd_seg_t * seg, int cblksty, int first)
-{
- seg->numpasses = 0;
- seg->len = 0;
- if (cblksty & J3D_CCP_CBLKSTY_TERMALL) {
- seg->maxpasses = 1;
- } else if (cblksty & J3D_CCP_CBLKSTY_LAZY) {
- if (first) {
- seg->maxpasses = 10;
- } else {
- seg->maxpasses = (((seg - 1)->maxpasses == 1) ||
- ((seg - 1)->maxpasses == 10)) ? 2 : 1;
- }
- } else {
- seg->maxpasses = 109;
- }
-}
-
-int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len,
- opj_tcd_tile_t *tile, opj_tcp_t *tcp, opj_pi_iterator_t *pi)
-{
- int bandno, cblkno;
- unsigned char *c = src;
-
- opj_cp_t *cp = t2->cp;
-
- int compno = pi->compno; /* component value */
- int resno = pi->resno; /* resolution level value */
- int precno = pi->precno; /* precinct value */
- int layno = pi->layno; /* quality layer value */
-
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- unsigned char *hd = NULL;
- int present;
-
- opj_bio_t *bio = NULL; /* BIO component */
-
- if (layno == 0) {
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- if ((band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0) ||
- (band->z1 - band->z0 == 0)) {
- continue;
- }
-
- tgt_reset(prc->incltree);
- tgt_reset(prc->imsbtree);
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
- cblk->numsegs = 0;
- }
- }
- }
-
- /* SOP markers */
-
- if (tcp->csty & J3D_CP_CSTY_SOP) {
- if ((*c) != 0xff || (*(c + 1) != 0x91)) {
- opj_event_msg(t2->cinfo, EVT_WARNING, "Expected SOP marker\n");
- } else {
- c += 6;
- }
-
- /** TODO : check the Nsop value */
- }
-
- /*
- When the marker PPT/PPM is used the packet header are store in PPT/PPM marker
- This part deal with this caracteristic
- step 1: Read packet header in the saved structure
- step 2: Return to codestream for decoding
- */
-
- bio = bio_create();
-
- if (cp->ppm == 1) { /* PPM */
- hd = cp->ppm_data;
- bio_init_dec(bio, hd, cp->ppm_len);
- } else if (tcp->ppt == 1) { /* PPT */
- hd = tcp->ppt_data;
- bio_init_dec(bio, hd, tcp->ppt_len);
- } else { /* Normal Case */
- hd = c;
- bio_init_dec(bio, hd, src + len - hd);
- }
-
- present = bio_read(bio, 1);
-
- if (!present) {
- bio_inalign(bio);
- hd += bio_numbytes(bio);
- bio_destroy(bio);
-
- /* EPH markers */
-
- if (tcp->csty & J3D_CP_CSTY_EPH) {
- if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {
- printf("Error : expected EPH marker\n");
- } else {
- hd += 2;
- }
- }
-
- if (cp->ppm == 1) { /* PPM case */
- cp->ppm_len += cp->ppm_data - hd;
- cp->ppm_data = hd;
- return (c - src);
- }
- if (tcp->ppt == 1) { /* PPT case */
- tcp->ppt_len += tcp->ppt_data - hd;
- tcp->ppt_data = hd;
- return (c - src);
- }
-
- return (hd - src);
- }
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- if ((band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0) ||
- (band->z1 - band->z0 == 0)) {
- continue;
- }
-
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- int included, increment, n;
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
- opj_tcd_seg_t *seg = NULL;
- /* if cblk not yet included before --> inclusion tagtree */
- if (!cblk->numsegs) {
- included = tgt_decode(bio, prc->incltree, cblkno, layno + 1);
- /* else one bit */
- } else {
- included = bio_read(bio, 1);
- }
- /* if cblk not included */
- if (!included) {
- cblk->numnewpasses = 0;
- continue;
- }
- /* if cblk not yet included --> zero-bitplane tagtree */
- if (!cblk->numsegs) {
- int i, numimsbs;
- for (i = 0; !tgt_decode(bio, prc->imsbtree, cblkno, i); i++);
- numimsbs = i - 1;
- cblk->numbps = band->numbps - numimsbs;
- cblk->numlenbits = 3;
- }
- /* number of coding passes */
- cblk->numnewpasses = t2_getnumpasses(bio);
- increment = t2_getcommacode(bio);
- /* length indicator increment */
- cblk->numlenbits += increment;
- if (!cblk->numsegs) {
- seg = &cblk->segs[0];
- t2_init_seg(seg, tcp->tccps[compno].cblksty, 1);
- } else {
- seg = &cblk->segs[cblk->numsegs - 1];
- if (seg->numpasses == seg->maxpasses) {
- t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0);
- }
- }
- n = cblk->numnewpasses;
-
- do {
- seg->numnewpasses = int_min(seg->maxpasses - seg->numpasses, n);
- seg->newlen = bio_read(bio,
- cblk->numlenbits + int_floorlog2(seg->numnewpasses));
- n -= seg->numnewpasses;
- if (n > 0) {
- t2_init_seg(++seg, tcp->tccps[compno].cblksty, 0);
- }
- } while (n > 0);
- }
- }
-
- if (bio_inalign(bio)) {
- bio_destroy(bio);
- return -999;
- }
-
- hd += bio_numbytes(bio);
- bio_destroy(bio);
-
- /* EPH markers */
- if (tcp->csty & J3D_CP_CSTY_EPH) {
- if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {
- opj_event_msg(t2->cinfo, EVT_ERROR, "Expected EPH marker\n");
- return -999;
- } else {
- hd += 2;
- }
- }
-
- if (cp->ppm == 1) {
- cp->ppm_len += cp->ppm_data - hd;
- cp->ppm_data = hd;
- } else if (tcp->ppt == 1) {
- tcp->ppt_len += tcp->ppt_data - hd;
- tcp->ppt_data = hd;
- } else {
- c = hd;
- }
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- if ((band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0) ||
- (band->z1 - band->z0 == 0)) {
- continue;
- }
-
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
- opj_tcd_seg_t *seg = NULL;
- if (!cblk->numnewpasses) {
- continue;
- }
- if (!cblk->numsegs) {
- seg = &cblk->segs[0];
- cblk->numsegs++;
- cblk->len = 0;
- } else {
- seg = &cblk->segs[cblk->numsegs - 1];
- if (seg->numpasses == seg->maxpasses) {
- seg++;
- cblk->numsegs++;
- }
- }
-
- do {
- if (c + seg->newlen > src + len) {
- return -999;
- }
-
- memcpy(cblk->data + cblk->len, c, seg->newlen);
- if (seg->numpasses == 0) {
- seg->data = cblk->data + cblk->len;
- }
- c += seg->newlen;
- cblk->len += seg->newlen;
- seg->len += seg->newlen;
- seg->numpasses += seg->numnewpasses;
- cblk->numnewpasses -= seg->numnewpasses;
- if (cblk->numnewpasses > 0) {
- seg++;
- cblk->numsegs++;
- }
- } while (cblk->numnewpasses > 0);
- }
- }
-
- return (c - src);
-}
-
-/* ----------------------------------------------------------------------- */
-
-int t2_encode_packets(opj_t2_t* t2, int tileno, opj_tcd_tile_t *tile,
- int maxlayers, unsigned char *dest, int len, opj_volume_info_t *volume_info)
-{
- unsigned char *c = dest;
- int e = 0;
- opj_pi_iterator_t *pi = NULL;
- int pino;
-
- opj_volume_t *volume = t2->volume;
- opj_cp_t *cp = t2->cp;
-
- /* create a packet iterator */
- pi = pi_create(volume, cp, tileno);
- if (!pi) {
- fprintf(stdout, "[ERROR] Failed to create a pi structure\n");
- return -999;
- }
-
- if (volume_info) {
- volume_info->num = 0;
- }
-
- for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) {
- while (pi_next(&pi[pino])) {
- if (pi[pino].layno < maxlayers) {
- e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[pino], c, dest + len - c,
- volume_info, tileno, cp);
- /*opj_event_msg(t2->cinfo, EVT_INFO, " t2_encode_packet: %d bytes coded\n",e);*/
- if (e == -999) {
- break;
- } else {
- c += e;
- }
-
- /* INDEX >> */
- if (volume_info && volume_info->index_on) {
- if (volume_info->index_write) {
- opj_tile_info_t *info_TL = &volume_info->tile[tileno];
- opj_packet_info_t *info_PK = &info_TL->packet[volume_info->num];
- if (!volume_info->num) {
- info_PK->start_pos = info_TL->end_header + 1;
- } else {
- info_PK->start_pos = info_TL->packet[volume_info->num - 1].end_pos + 1;
- }
- info_PK->end_pos = info_PK->start_pos + e - 1;
- }
-
- volume_info->num++;
- }
- /* << INDEX */
- }
- }
- }
-
- /* don't forget to release pi */
- pi_destroy(pi, cp, tileno);
-
- if (e == -999) {
- return e;
- }
-
- return (c - dest);
-}
-
-int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno,
- opj_tcd_tile_t *tile)
-{
- unsigned char *c = src;
- opj_pi_iterator_t *pi;
- int pino, e = 0;
- int n = 0, i;
-
- opj_volume_t *volume = t2->volume;
- opj_cp_t *cp = t2->cp;
-
- /* create a packet iterator */
- pi = pi_create(volume, cp, tileno);
- if (!pi) {
- /* TODO: throw an error */
- return -999;
- }
-
- for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) {
- while (pi_next(&pi[pino])) {
- if ((cp->layer == 0) || (cp->layer >= ((pi[pino].layno) + 1))) {
- e = t2_decode_packet(t2, c, src + len - c, tile, &cp->tcps[tileno], &pi[pino]);
- } else {
- e = 0;
- }
-
- /* progression in resolution */
- for (i = 0; i < 3; i++) {
- volume->comps[pi[pino].compno].resno_decoded[i] = (e > 0) ? int_max(
- pi[pino].resno, volume->comps[pi[pino].compno].resno_decoded[i]) :
- volume->comps[pi[pino].compno].resno_decoded[i];
- }
- n++;
-
- if (e == -999) { /* ADD */
- break;
- } else {
- opj_event_msg(t2->cinfo, EVT_INFO, " t2_decode_packet: %d bytes decoded\n", e);
- c += e;
- }
- }
- }
-
- /* don't forget to release pi */
- pi_destroy(pi, cp, tileno);
-
- if (e == -999) {
- return e;
- }
-
- return (c - src);
-}
-
-/* ----------------------------------------------------------------------- */
-
-opj_t2_t* t2_create(opj_common_ptr cinfo, opj_volume_t *volume, opj_cp_t *cp)
-{
- /* create the tcd structure */
- opj_t2_t *t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t));
- if (!t2) {
- return NULL;
- }
- t2->cinfo = cinfo;
- t2->volume = volume;
- t2->cp = cp;
-
- return t2;
-}
-
-void t2_destroy(opj_t2_t *t2)
-{
- if (t2) {
- opj_free(t2);
- }
-}
-
+++ /dev/null
-/*
- * 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.
- */
-#ifndef __T2_H
-#define __T2_H
-/**
-@file t2.h
-@brief Implementation of a tier-2 coding (packetization of code-block data) (T2)
-
-*/
-
-/** @defgroup T2 T2 - Implementation of a tier-2 coding */
-/*@{*/
-
-/**
-Tier-2 coding
-*/
-typedef struct opj_t2 {
- /** Codec context */
- opj_common_ptr cinfo;
- /** Encoding: pointer to the src volume. Decoding: pointer to the dst volume. */
- opj_volume_t *volume;
- /** Pointer to the volume coding parameters */
- opj_cp_t *cp;
-} opj_t2_t;
-
-/** @name Funciones generales */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-
-/**
-Encode the packets of a tile to a destination buffer
-@param t2 T2 handle
-@param tileno number of the tile encoded
-@param tile the tile for which to write the packets
-@param maxlayers maximum number of layers
-@param dest the destination buffer
-@param len the length of the destination buffer
-@param volume_info structure to create an index file
-@return Number of bytes written from packets
-*/
-int t2_encode_packets(opj_t2_t* t2, int tileno, opj_tcd_tile_t *tile,
- int maxlayers, unsigned char *dest, int len, opj_volume_info_t *volume_info);
-
-/**
-Decode the packets of a tile from a source buffer
-@param t2 T2 handle
-@param src the source buffer
-@param len length of the source buffer
-@param tileno number that identifies the tile for which to decode the packets
-@param tile tile for which to decode the packets
-@return Number of bytes read from packets
- */
-int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno,
- opj_tcd_tile_t *tile);
-
-/**
-Create a T2 handle
-@param cinfo Codec context info
-@param volume Source or destination volume
-@param cp Volume coding parameters
-@return Returns a new T2 handle if successful, returns NULL otherwise
-*/
-opj_t2_t* t2_create(opj_common_ptr cinfo, opj_volume_t *volume, opj_cp_t *cp);
-/**
-Destroy a T2 handle
-@param t2 T2 handle to destroy
-*/
-void t2_destroy(opj_t2_t *t2);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __T2_H */
+++ /dev/null
-/*
- * 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, LPI-UVA, 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 "opj_includes.h"
-
-void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_volume_t * vol)
-{
- int tileno, compno, resno, bandno, precno, cblkno;
-
- fprintf(fd, "volume {\n");
- fprintf(fd, " tw=%d, th=%d, tl=%d, x0=%d x1=%d y0=%d y1=%d z0=%d z1=%d\n",
- vol->tw, vol->th, vol->tl, tcd->volume->x0, tcd->volume->x1, tcd->volume->y0,
- tcd->volume->y1, tcd->volume->z0, tcd->volume->z1);
-
- for (tileno = 0; tileno < vol->th * vol->tw * vol->tl; tileno++) {
- opj_tcd_tile_t *tile = &tcd->tcd_volume->tiles[tileno];
- fprintf(fd, " tile {\n");
- fprintf(fd, " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d, numcomps=%d\n",
- tile->x0, tile->y0, tile->z0, tile->x1, tile->y1, tile->z1, tile->numcomps);
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- fprintf(fd, " tilecomp %d {\n", compno);
- fprintf(fd,
- " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d, numresx=%d, numresy=%d, numresz=%d\n",
- tilec->x0, tilec->y0, tilec->z0, tilec->x1, tilec->y1, tilec->z1,
- tilec->numresolution[0], tilec->numresolution[1], tilec->numresolution[2]);
- for (resno = 0; resno < tilec->numresolution[0]; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- fprintf(fd, " res %d{\n", resno);
- fprintf(fd,
- " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d, pw=%d, ph=%d, pl=%d, numbands=%d\n",
- res->x0, res->y0, res->z0, res->x1, res->y1, res->z1, res->prctno[0],
- res->prctno[1], res->prctno[2], res->numbands);
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- fprintf(fd, " band %d{\n", bandno);
- fprintf(fd,
- " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d, stepsize=%f, numbps=%d\n",
- band->x0, band->y0, band->z0, band->x1, band->y1, band->z1, band->stepsize,
- band->numbps);
- for (precno = 0; precno < (res->prctno[0] * res->prctno[1] * res->prctno[2]);
- precno++) {
- opj_tcd_precinct_t *prec = &band->precincts[precno];
- fprintf(fd, " prec %d{\n", precno);
- fprintf(fd,
- " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d, cw=%d, ch=%d, cl=%d,\n",
- prec->x0, prec->y0, prec->z0, prec->x1, prec->y1, prec->z1, prec->cblkno[0],
- prec->cblkno[1], prec->cblkno[2]);
- for (cblkno = 0; cblkno < (prec->cblkno[0] * prec->cblkno[1] * prec->cblkno[2]);
- cblkno++) {
- opj_tcd_cblk_t *cblk = &prec->cblks[cblkno];
- fprintf(fd, " cblk %d{\n", cblkno);
- fprintf(fd, " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d\n", cblk->x0,
- cblk->y0, cblk->z0, cblk->x1, cblk->y1, cblk->z1);
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, "}\n");
-}
-
-static void tilec_dump(FILE *fd, opj_tcd_tilecomp_t *tilec)
-{
-
- int i = 0, k;
- int datalen;
- int *a;
-
- fprintf(fd, " tilecomp{\n");
- fprintf(fd,
- " x0=%d, y0=%d, z0=%d, x1=%d, y1=%d, z1=%d, numresx=%d, numresy=%d, numresz=%d\n",
- tilec->x0, tilec->y0, tilec->z0, tilec->x1, tilec->y1, tilec->z1,
- tilec->numresolution[0], tilec->numresolution[1], tilec->numresolution[2]);
- fprintf(fd, " data {\n");
- datalen = (tilec->z1 - tilec->z0) * (tilec->y1 - tilec->y0) *
- (tilec->x1 - tilec->x0);
- a = tilec->data;
- for (k = 0; k < datalen; k++) {
- if (!(k % tilec->x1)) {
- fprintf(fd, "\n");
- }
- if (!(k % (tilec->y1 * tilec->x1))) {
- fprintf(fd, "Slice %d\n", i++);
- }
- fprintf(fd, " %d", a[k]);
-
-
- }
- fprintf(fd, " }\n");
- /*i=0;
- fprintf(fd, "Slice %d\n");
- if (tilec->prediction->prederr) {
- fprintf(fd, " prederror {\n");
- a = tilec->prediction->prederr;
- for (k = 0; k < datalen; k++) {
- fprintf(fd," %d",*(a++));
- if (!(k % (tilec->y1 - tilec->y0) * (tilec->x1 - tilec->x0))){
- fprintf(fd, "\n");fprintf(fd, "Slice %d\n",i++);
- }
- if (!(k % (tilec->x1 - tilec->x0))){
- fprintf(fd, "\n");
- }
- }
- }
- fprintf(fd, " }\n");*/
- fprintf(fd, "}\n");
-}
-
-/* ----------------------------------------------------------------------- */
-
-/**
-Create a new TCD handle
-*/
-opj_tcd_t* tcd_create(opj_common_ptr cinfo)
-{
- /* create the tcd structure */
- opj_tcd_t *tcd = (opj_tcd_t*)opj_malloc(sizeof(opj_tcd_t));
- if (!tcd) {
- return NULL;
- }
- tcd->cinfo = cinfo;
- tcd->tcd_volume = (opj_tcd_volume_t*)opj_malloc(sizeof(opj_tcd_volume_t));
- if (!tcd->tcd_volume) {
- opj_free(tcd);
- return NULL;
- }
-
- return tcd;
-}
-
-/**
-Destroy a previously created TCD handle
-*/
-void tcd_destroy(opj_tcd_t *tcd)
-{
- if (tcd) {
- opj_free(tcd->tcd_volume);
- opj_free(tcd);
- }
-}
-
-/* ----------------------------------------------------------------------- */
-void tcd_malloc_encode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp,
- int curtileno)
-{
- int compno, resno, bandno, precno, cblkno, i, j;/*, k;*/
-
- opj_tcd_tile_t *tile = NULL; /* pointer to tcd->tile */
- opj_tcd_tilecomp_t *tilec = NULL; /* pointer to tcd->tilec */
- opj_tcd_resolution_t *res = NULL; /* pointer to tcd->res */
- opj_tcd_band_t *band = NULL; /* pointer to tcd->band */
- opj_tcd_precinct_t *prc = NULL; /* pointer to tcd->prc */
- opj_tcd_cblk_t *cblk = NULL; /* pointer to tcd->cblk */
- opj_tcp_t *tcp = &cp->tcps[curtileno];
- int p, q, r;
-
- tcd->volume = volume;
- tcd->cp = cp;
- tcd->tcd_volume->tw = cp->tw;
- tcd->tcd_volume->th = cp->th;
- tcd->tcd_volume->tl = cp->tl;
- tcd->tcd_volume->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t));
- tcd->tile = tcd->tcd_volume->tiles;
- tile = tcd->tile;
-
-
- /* p61 ISO/IEC IS15444-1 : 2002 */
- /* curtileno --> raster scanned index of tiles */
- /* p,q,r --> matricial index of tiles */
- p = curtileno % cp->tw;
- q = curtileno / cp->tw;
- r = curtileno / (cp->tw * cp->th); /* extension to 3-D */
-
- /* 4 borders of the tile rescale on the volume if necessary (B.3)*/
- tile->x0 = int_max(cp->tx0 + p * cp->tdx, volume->x0);
- tile->y0 = int_max(cp->ty0 + q * cp->tdy, volume->y0);
- tile->z0 = int_max(cp->tz0 + r * cp->tdz, volume->z0);
- tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, volume->x1);
- tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, volume->y1);
- tile->z1 = int_min(cp->tz0 + (r + 1) * cp->tdz, volume->z1);
- tile->numcomps = volume->numcomps;
-
- /* Modification of the RATE >> */
- for (j = 0; j < tcp->numlayers; j++) {
- if (tcp->rates[j] <= 1) {
- tcp->rates[j] = 0;
- } else {
- float num = (float)tile->numcomps * (tile->x1 - tile->x0) *
- (tile->y1 - tile->y0) * (tile->z1 - tile->z0) * volume->comps[0].prec;
- float den = 8.0f * volume->comps[0].dx * volume->comps[0].dy *
- volume->comps[0].dz;
- den = tcp->rates[j] * den;
- tcp->rates[j] = (num + den - 1) / den;
- }
- /*tcp->rates[j] = tcp->rates[j] ? int_ceildiv(
- tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * (tile->z1 - tile->z0) * volume->comps[0].prec,
- (tcp->rates[j] * 8 * volume->comps[0].dx * volume->comps[0].dy * volume->comps[0].dz)) : 0;*/
- if (tcp->rates[j]) {
- if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) {
- tcp->rates[j] = tcp->rates[j - 1] + 20;
- } else if (!j && tcp->rates[j] < 30) {
- tcp->rates[j] = 30;
- }
- }
- }
- /* << Modification of the RATE */
-
- tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(volume->numcomps * sizeof(
- opj_tcd_tilecomp_t));
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tccp_t *tccp = &tcp->tccps[compno];
- int res_max;
- int prevnumbands = 0;
-
- /* opj_tcd_tilecomp_t *tilec=&tile->comps[compno]; */
- tcd->tilec = &tile->comps[compno];
- tilec = tcd->tilec;
-
- /* border of each tile component (global) (B.3) */
- tilec->x0 = int_ceildiv(tile->x0, volume->comps[compno].dx);
- tilec->y0 = int_ceildiv(tile->y0, volume->comps[compno].dy);
- tilec->z0 = int_ceildiv(tile->z0, volume->comps[compno].dz);
- tilec->x1 = int_ceildiv(tile->x1, volume->comps[compno].dx);
- tilec->y1 = int_ceildiv(tile->y1, volume->comps[compno].dy);
- tilec->z1 = int_ceildiv(tile->z1, volume->comps[compno].dz);
-
- tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) *
- (tilec->y1 - tilec->y0) * (tilec->z1 - tilec->z0) * sizeof(int));
-
- res_max = 0;
- for (i = 0; i < 3; i++) {
- tilec->numresolution[i] = tccp->numresolution[i];
- /*Greater of 3 resolutions contains all information*/
- res_max = (tilec->numresolution[i] > res_max) ? tilec->numresolution[i] :
- res_max;
- }
-
-
- tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(res_max * sizeof(
- opj_tcd_resolution_t));
- for (resno = 0; resno < res_max; resno++) {
-
- int pdx, pdy, pdz;
- int tlprcxstart, tlprcystart, tlprczstart;
- int brprcxend, brprcyend, brprczend;
- int tlcbgxstart, tlcbgystart, tlcbgzstart;
- int brcbgxend, brcbgyend, brcbgzend;
- int cbgwidthexpn, cbgheightexpn, cbglengthexpn;
- int cblkwidthexpn, cblkheightexpn, cblklengthexpn;
-
- int diff = tccp->numresolution[0] - tccp->numresolution[2];
- int levelnox = tilec->numresolution[0] - 1 - resno;
- int levelnoy = tilec->numresolution[1] - 1 - resno;
- int levelnoz = tilec->numresolution[2] - 1 - ((resno <= diff) ? 0 :
- (resno - diff));
- if (levelnoz < 0) {
- levelnoz = 0;
- }
-
- /* opj_tcd_resolution_t *res=&tilec->resolutions[resno]; */
- tcd->res = &tilec->resolutions[resno];
- res = tcd->res;
-
- /* border for each resolution level (global) (B.14)*/
- res->x0 = int_ceildivpow2(tilec->x0, levelnox);
- res->y0 = int_ceildivpow2(tilec->y0, levelnoy);
- res->z0 = int_ceildivpow2(tilec->z0, levelnoz);
- res->x1 = int_ceildivpow2(tilec->x1, levelnox);
- res->y1 = int_ceildivpow2(tilec->y1, levelnoy);
- res->z1 = int_ceildivpow2(tilec->z1, levelnoz);
- /*if (res->z1 < 0)fprintf(stdout,"Res: %d %d/%d --> %d\n",resno,tilec->z1, levelnoz, int_ceildivpow2(tilec->z1, levelnoz));*/
-
- res->numbands = (resno == 0) ? 1 : (resno <= diff) ? 3 : 7; /* --> 3D */
-
- /* p. 30, table A-13, ISO/IEC IS154444-1 : 2002 */
- if (tccp->csty & J3D_CCP_CSTY_PRT) {
- pdx = tccp->prctsiz[0][resno];
- pdy = tccp->prctsiz[1][resno];
- pdz = tccp->prctsiz[2][resno];
- } else {
- pdx = 15;
- pdy = 15;
- pdz = 15;
- }
-
- /* p. 66, B.16, ISO/IEC IS15444-1 : 2002 */
- tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
- tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
- tlprczstart = int_floordivpow2(res->z0, pdz) << pdz;
- brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
- brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
- brprczend = int_ceildivpow2(res->z1, pdz) << pdz;
-
- res->prctno[0] = (brprcxend - tlprcxstart) >> pdx;
- res->prctno[1] = (brprcyend - tlprcystart) >> pdy;
- res->prctno[2] = (brprczend - tlprczstart) >> pdz;
- if (res->prctno[2] == 0) {
- res->prctno[2] = 1;
- }
-
- /* p. 67, B.17 & B.18, ISO/IEC IS15444-1 : 2002 */
- if (resno == 0) {
- tlcbgxstart = tlprcxstart;
- tlcbgystart = tlprcystart;
- tlcbgzstart = tlprczstart;
- brcbgxend = brprcxend;
- brcbgyend = brprcyend;
- brcbgzend = brprczend;
- cbgwidthexpn = pdx;
- cbgheightexpn = pdy;
- cbglengthexpn = pdz;
- } else {
- tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
- tlcbgystart = int_ceildivpow2(tlprcystart, 1);
- tlcbgzstart = int_ceildivpow2(tlprczstart, 1);
- brcbgxend = int_ceildivpow2(brprcxend, 1);
- brcbgyend = int_ceildivpow2(brprcyend, 1);
- brcbgzend = int_ceildivpow2(brprczend, 1);
- cbgwidthexpn = pdx - 1;
- cbgheightexpn = pdy - 1;
- cbglengthexpn = pdz - 1;
- }
-
- cblkwidthexpn = int_min(tccp->cblk[0], cbgwidthexpn); /*6*/
- cblkheightexpn = int_min(tccp->cblk[1], cbgheightexpn); /*6*/
- cblklengthexpn = int_min(tccp->cblk[2], cbglengthexpn); /*6*/
-
- res->bands = (opj_tcd_band_t *) opj_malloc(res->numbands * sizeof(
- opj_tcd_band_t));
- for (bandno = 0; bandno < res->numbands; bandno++) {
- int x0b, y0b, z0b, i;
- int gain, numbps;
- opj_stepsize_t *ss = NULL;
-
- tcd->band = &res->bands[bandno];
- band = tcd->band;
-
- band->bandno = (resno == 0) ? 0 : bandno + 1;
- /* Bandno: 0 - LLL 2 - LHL
- 1 - HLL 3 - HHL
- 4 - LLH 6 - LHH
- 5 - HLH 7 - HHH */
- x0b = (band->bandno == 1) || (band->bandno == 3) || (band->bandno == 5) ||
- (band->bandno == 7) ? 1 : 0;
- y0b = (band->bandno == 2) || (band->bandno == 3) || (band->bandno == 6) ||
- (band->bandno == 7) ? 1 : 0;
- z0b = (band->bandno == 4) || (band->bandno == 5) || (band->bandno == 6) ||
- (band->bandno == 7) ? 1 : 0;
-
- /* p. 65, B.15, ISO/IEC IS15444-1 : 2002 */
- if (band->bandno == 0) {
- /* band border (global) */
- band->x0 = int_ceildivpow2(tilec->x0, levelnox);
- band->y0 = int_ceildivpow2(tilec->y0, levelnoy);
- band->z0 = int_ceildivpow2(tilec->z0, levelnoz);
- band->x1 = int_ceildivpow2(tilec->x1, levelnox);
- band->y1 = int_ceildivpow2(tilec->y1, levelnoy);
- band->z1 = int_ceildivpow2(tilec->z1, levelnoz);
- } else {
- band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelnox) * x0b, levelnox + 1);
- band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelnoy) * y0b, levelnoy + 1);
- band->z0 = int_ceildivpow2(tilec->z0 - (1 << levelnoz) * z0b,
- (resno <= diff) ? levelnoz : levelnoz + 1);
- band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelnox) * x0b, levelnox + 1);
- band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelnoy) * y0b, levelnoy + 1);
- band->z1 = int_ceildivpow2(tilec->z1 - (1 << levelnoz) * z0b,
- (resno <= diff) ? levelnoz : levelnoz + 1);
- }
-
- ss = &tccp->stepsizes[(resno == 0) ? 0 : (prevnumbands + bandno + 1)];
- if (bandno == (res->numbands - 1)) {
- prevnumbands += (resno == 0) ? 0 : res->numbands;
- }
- gain = dwt_getgain(band->bandno, tccp->reversible);
- numbps = volume->comps[compno].prec + gain;
- band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0,
- numbps - ss->expn));
- band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */
-
- band->precincts = (opj_tcd_precinct_t *) opj_malloc((res->prctno[0] *
- res->prctno[1] * res->prctno[2]) * sizeof(opj_tcd_precinct_t));
-
- for (i = 0; i < (res->prctno[0] * res->prctno[1] * res->prctno[2]); i++) {
- band->precincts[i].imsbtree = NULL;
- band->precincts[i].incltree = NULL;
- }
-
- for (precno = 0; precno < (res->prctno[0] * res->prctno[1] * res->prctno[2]);
- precno++) {
- int tlcblkxstart, tlcblkystart, tlcblkzstart, brcblkxend, brcblkyend,
- brcblkzend;
- int cbgxstart, cbgystart, cbgzstart, cbgxend, cbgyend, cbgzend;
-
- cbgxstart = tlcbgxstart + (precno % res->prctno[0]) * (1 << cbgwidthexpn);
- cbgystart = tlcbgystart + ((precno % (res->prctno[0] * res->prctno[1])) /
- res->prctno[0]) * (1 << cbgheightexpn);
- cbgzstart = tlcbgzstart + (precno / (res->prctno[0] * res->prctno[1])) *
- (1 << cbglengthexpn);
- cbgxend = cbgxstart + (1 << cbgwidthexpn);
- cbgyend = cbgystart + (1 << cbgheightexpn);
- cbgzend = cbgzstart + (1 << cbglengthexpn);
-
- tcd->prc = &band->precincts[precno];
- prc = tcd->prc;
-
- /* precinct size (global) */
- prc->x0 = int_max(cbgxstart, band->x0);
- prc->y0 = int_max(cbgystart, band->y0);
- prc->z0 = int_max(cbgzstart, band->z0);
- prc->x1 = int_min(cbgxend, band->x1);
- prc->y1 = int_min(cbgyend, band->y1);
- prc->z1 = int_min(cbgzend, band->z1);
-
- tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
- tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
- tlcblkzstart = int_floordivpow2(prc->z0, cblklengthexpn) << cblklengthexpn;
- brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
- brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
- brcblkzend = int_ceildivpow2(prc->z1, cblklengthexpn) << cblklengthexpn;
- prc->cblkno[0] = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
- prc->cblkno[1] = (brcblkyend - tlcblkystart) >> cblkheightexpn;
- prc->cblkno[2] = (brcblkzend - tlcblkzstart) >> cblklengthexpn;
- prc->cblkno[2] = (prc->cblkno[2] == 0) ? 1 : prc->cblkno[2];
-
- prc->cblks = (opj_tcd_cblk_t *) opj_malloc((prc->cblkno[0] * prc->cblkno[1] *
- prc->cblkno[2]) * sizeof(opj_tcd_cblk_t));
- prc->incltree = tgt_create(prc->cblkno[0], prc->cblkno[1], prc->cblkno[2]);
- prc->imsbtree = tgt_create(prc->cblkno[0], prc->cblkno[1], prc->cblkno[2]);
- /*tgt_tree_dump(stdout,prc->incltree);*/
- for (cblkno = 0; cblkno < (prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]);
- cblkno++) {
- int cblkxstart = tlcblkxstart + (cblkno % prc->cblkno[0]) *
- (1 << cblkwidthexpn);
- int cblkystart = tlcblkystart + ((cblkno % (prc->cblkno[0] * prc->cblkno[1])) /
- prc->cblkno[0]) * (1 << cblkheightexpn);
- int cblkzstart = tlcblkzstart + (cblkno / (prc->cblkno[0] * prc->cblkno[1])) *
- (1 << cblklengthexpn);
- int cblkxend = cblkxstart + (1 << cblkwidthexpn);
- int cblkyend = cblkystart + (1 << cblkheightexpn);
- int cblkzend = cblkzstart + (1 << cblklengthexpn);
- int prec = ((tilec->bpp > 16) ? 3 : ((tilec->bpp > 8) ? 2 : 1));
-
- tcd->cblk = &prc->cblks[cblkno];
- cblk = tcd->cblk;
-
- /* code-block size (global) */
- cblk->x0 = int_max(cblkxstart, prc->x0);
- cblk->y0 = int_max(cblkystart, prc->y0);
- cblk->z0 = int_max(cblkzstart, prc->z0);
- cblk->x1 = int_min(cblkxend, prc->x1);
- cblk->y1 = int_min(cblkyend, prc->y1);
- cblk->z1 = int_min(cblkzend, prc->z1);
- }
- }
- }
- }
- }
- /*tcd_dump(stdout, tcd, tcd->tcd_volume);*/
-
-}
-void tcd_init_encode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp,
- int curtileno)
-{
- int compno, resno, bandno, precno, cblkno;
- int j, p, q, r;
-
- opj_tcd_tile_t *tile = NULL; /* pointer to tcd->tile */
- opj_tcd_tilecomp_t *tilec = NULL; /* pointer to tcd->tilec */
- opj_tcd_resolution_t *res = NULL; /* pointer to tcd->res */
- opj_tcd_band_t *band = NULL; /* pointer to tcd->band */
- opj_tcd_precinct_t *prc = NULL; /* pointer to tcd->prc */
- opj_tcd_cblk_t *cblk = NULL; /* pointer to tcd->cblk */
- opj_tcp_t *tcp = &cp->tcps[curtileno];
-
- tcd->tile = tcd->tcd_volume->tiles;
- tile = tcd->tile;
-
- /* p61 ISO/IEC IS15444-1 : 2002 */
- /* curtileno --> raster scanned index of tiles */
- /* p,q,r --> matricial index of tiles */
- p = curtileno % cp->tw;
- q = curtileno / cp->tw;
- r = curtileno / (cp->tw * cp->th); /* extension to 3-D */
-
- /* 4 borders of the tile rescale on the volume if necessary (B.3)*/
- tile->x0 = int_max(cp->tx0 + p * cp->tdx, volume->x0);
- tile->y0 = int_max(cp->ty0 + q * cp->tdy, volume->y0);
- tile->z0 = int_max(cp->tz0 + r * cp->tdz, volume->z0);
- tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, volume->x1);
- tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, volume->y1);
- tile->z1 = int_min(cp->tz0 + (r + 1) * cp->tdz, volume->z1);
- tile->numcomps = volume->numcomps;
-
- /* Modification of the RATE >> */
- for (j = 0; j < tcp->numlayers; j++) {
- if (tcp->rates[j] <= 1) {
- tcp->rates[j] = 0;
- } else {
- float num = (float)tile->numcomps * (tile->x1 - tile->x0) *
- (tile->y1 - tile->y0) * (tile->z1 - tile->z0) * volume->comps[0].prec;
- float den = 8.0f * volume->comps[0].dx * volume->comps[0].dy *
- volume->comps[0].dz;
- den = tcp->rates[j] * den;
- tcp->rates[j] = (num + den - 1) / den;
- }
- /*tcp->rates[j] = tcp->rates[j] ? int_ceildiv(
- tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * (tile->z1 - tile->z0) * volume->comps[0].prec,
- (tcp->rates[j] * 8 * volume->comps[0].dx * volume->comps[0].dy * volume->comps[0].dz)) : 0;*/
- if (tcp->rates[j]) {
- if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) {
- tcp->rates[j] = tcp->rates[j - 1] + 20;
- } else if (!j && tcp->rates[j] < 30) {
- tcp->rates[j] = 30;
- }
- }
- }
- /* << Modification of the RATE */
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tccp_t *tccp = &tcp->tccps[compno];
- int res_max, i;
- int prevnumbands = 0;
-
- /* opj_tcd_tilecomp_t *tilec=&tile->comps[compno]; */
- tcd->tilec = &tile->comps[compno];
- tilec = tcd->tilec;
-
- /* border of each tile component (global) (B.3) */
- tilec->x0 = int_ceildiv(tile->x0, volume->comps[compno].dx);
- tilec->y0 = int_ceildiv(tile->y0, volume->comps[compno].dy);
- tilec->z0 = int_ceildiv(tile->z0, volume->comps[compno].dz);
- tilec->x1 = int_ceildiv(tile->x1, volume->comps[compno].dx);
- tilec->y1 = int_ceildiv(tile->y1, volume->comps[compno].dy);
- tilec->z1 = int_ceildiv(tile->z1, volume->comps[compno].dz);
-
- tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) *
- (tilec->y1 - tilec->y0) * (tilec->z1 - tilec->z0) * sizeof(int));
-
- res_max = 0;
- for (i = 0; i < 3; i++) {
- tilec->numresolution[i] = tccp->numresolution[i];
- /*Greater of 3 resolutions contains all information*/
- res_max = (tilec->numresolution[i] > res_max) ? tilec->numresolution[i] :
- res_max;
- }
-
- tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(res_max * sizeof(
- opj_tcd_resolution_t));
- for (resno = 0; resno < res_max; resno++) {
- int pdx, pdy, pdz;
- int tlprcxstart, tlprcystart, tlprczstart, brprcxend, brprcyend, brprczend;
- int tlcbgxstart, tlcbgystart, tlcbgzstart, brcbgxend, brcbgyend, brcbgzend;
- int cbgwidthexpn, cbgheightexpn, cbglengthexpn;
- int cblkwidthexpn, cblkheightexpn, cblklengthexpn;
-
- int levelnox = tilec->numresolution[0] - 1 - resno;
- int levelnoy = tilec->numresolution[1] - 1 - resno;
- int diff = tccp->numresolution[0] - tccp->numresolution[2];
- int levelnoz = tilec->numresolution[2] - 1 - ((resno <= diff) ? 0 :
- (resno - diff));
- if (levelnoz < 0) {
- levelnoz = 0;
- }
-
- tcd->res = &tilec->resolutions[resno];
- res = tcd->res;
-
- /* border for each resolution level (global) (B.14)*/
- res->x0 = int_ceildivpow2(tilec->x0, levelnox);
- res->y0 = int_ceildivpow2(tilec->y0, levelnoy);
- res->z0 = int_ceildivpow2(tilec->z0, levelnoz);
- res->x1 = int_ceildivpow2(tilec->x1, levelnox);
- res->y1 = int_ceildivpow2(tilec->y1, levelnoy);
- res->z1 = int_ceildivpow2(tilec->z1, levelnoz);
-
- /* res->numbands = resno == 0 ? 1 : 3; *//* --> 2D */
-
- res->numbands = (resno == 0) ? 1 : (resno <= diff) ? 3 : 7; /* --> 3D */
-
- /* p. 30, table A-13, ISO/IEC IS154444-1 : 2002 */
- if (tccp->csty & J3D_CCP_CSTY_PRT) {
- pdx = tccp->prctsiz[0][resno];
- pdy = tccp->prctsiz[1][resno];
- pdz = tccp->prctsiz[2][resno];
- } else {
- pdx = 15;
- pdy = 15;
- pdz = 15;
- }
- /* p. 66, B.16, ISO/IEC IS15444-1 : 2002 */
- tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
- tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
- tlprczstart = int_floordivpow2(res->z0, pdz) << pdz;
- brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
- brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
- brprczend = int_ceildivpow2(res->z1, pdz) << pdz;
-
- res->prctno[0] = (brprcxend - tlprcxstart) >> pdx;
- res->prctno[1] = (brprcyend - tlprcystart) >> pdy;
- res->prctno[2] = (brprczend - tlprczstart) >> pdz;
- if (res->prctno[2] == 0) {
- res->prctno[2] = 1;
- }
-
- /* p. 67, B.17 & B.18, ISO/IEC IS15444-1 : 2002 */
- if (resno == 0) {
- tlcbgxstart = tlprcxstart;
- tlcbgystart = tlprcystart;
- tlcbgzstart = tlprczstart;
- brcbgxend = brprcxend;
- brcbgyend = brprcyend;
- brcbgzend = brprczend;
- cbgwidthexpn = pdx;
- cbgheightexpn = pdy;
- cbglengthexpn = pdz;
- } else {
- tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
- tlcbgystart = int_ceildivpow2(tlprcystart, 1);
- tlcbgzstart = int_ceildivpow2(tlprczstart, 1);
- brcbgxend = int_ceildivpow2(brprcxend, 1);
- brcbgyend = int_ceildivpow2(brprcyend, 1);
- brcbgzend = int_ceildivpow2(brprczend, 1);
- cbgwidthexpn = pdx - 1;
- cbgheightexpn = pdy - 1;
- cbglengthexpn = pdz - 1;
- }
-
- cblkwidthexpn = int_min(tccp->cblk[0], cbgwidthexpn);
- cblkheightexpn = int_min(tccp->cblk[1], cbgheightexpn);
- cblklengthexpn = int_min(tccp->cblk[2], cbglengthexpn);
-
- res->bands = (opj_tcd_band_t *) opj_malloc(res->numbands * sizeof(
- opj_tcd_band_t));
- for (bandno = 0; bandno < res->numbands; bandno++) {
- int x0b, y0b, z0b;
- int gain, numbps;
- opj_stepsize_t *ss = NULL;
-
- tcd->band = &res->bands[bandno];
- band = tcd->band;
-
- band->bandno = resno == 0 ? 0 : bandno + 1;
- /* Bandno: 0 - LLL 2 - LHL
- 1 - HLL 3 - HHL
- 4 - LLH 6 - LHH
- 5 - HLH 7 - HHH */
- x0b = (band->bandno == 1) || (band->bandno == 3) || (band->bandno == 5) ||
- (band->bandno == 7) ? 1 : 0;
- y0b = (band->bandno == 2) || (band->bandno == 3) || (band->bandno == 6) ||
- (band->bandno == 7) ? 1 : 0;
- z0b = (band->bandno == 4) || (band->bandno == 5) || (band->bandno == 6) ||
- (band->bandno == 7) ? 1 : 0;
-
- /* p. 65, B.15, ISO/IEC IS15444-1 : 2002 */
- if (band->bandno == 0) {
- /* band border (global) */
- band->x0 = int_ceildivpow2(tilec->x0, levelnox);
- band->y0 = int_ceildivpow2(tilec->y0, levelnoy);
- band->z0 = int_ceildivpow2(tilec->z0, levelnoz);
- band->x1 = int_ceildivpow2(tilec->x1, levelnox);
- band->y1 = int_ceildivpow2(tilec->y1, levelnoy);
- band->z1 = int_ceildivpow2(tilec->z1, levelnoz);
- } else {
- band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelnox) * x0b, levelnox + 1);
- band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelnoy) * y0b, levelnoy + 1);
- band->z0 = int_ceildivpow2(tilec->z0 - (1 << levelnoz) * z0b,
- (resno <= diff) ? levelnoz : levelnoz + 1);
- band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelnox) * x0b, levelnox + 1);
- band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelnoy) * y0b, levelnoy + 1);
- band->z1 = int_ceildivpow2(tilec->z1 - (1 << levelnoz) * z0b,
- (resno <= diff) ? levelnoz : levelnoz + 1);
- }
-
- ss = &tccp->stepsizes[(resno == 0) ? 0 : (prevnumbands + bandno + 1)];
- if (bandno == (res->numbands - 1)) {
- prevnumbands += (resno == 0) ? 0 : res->numbands;
- }
- gain = dwt_getgain(band->bandno, tccp->reversible);
- numbps = volume->comps[compno].prec + gain;
-
- band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0,
- numbps - ss->expn));
- band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */
-
- for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2];
- precno++) {
- int tlcblkxstart, tlcblkystart, tlcblkzstart, brcblkxend, brcblkyend,
- brcblkzend;
-
- int cbgxstart = tlcbgxstart + (precno % res->prctno[0]) * (1 << cbgwidthexpn);
- int cbgystart = tlcbgystart + ((precno / (res->prctno[0] * res->prctno[1])) /
- res->prctno[0]) * (1 << cbgheightexpn);
- int cbgzstart = tlcbgzstart + (precno / (res->prctno[0] * res->prctno[1])) *
- (1 << cbglengthexpn);
- int cbgxend = cbgxstart + (1 << cbgwidthexpn);
- int cbgyend = cbgystart + (1 << cbgheightexpn);
- int cbgzend = cbgzstart + (1 << cbglengthexpn);
-
- /* opj_tcd_precinct_t *prc=&band->precincts[precno]; */
- tcd->prc = &band->precincts[precno];
- prc = tcd->prc;
-
- /* precinct size (global) */
- prc->x0 = int_max(cbgxstart, band->x0);
- prc->y0 = int_max(cbgystart, band->y0);
- prc->z0 = int_max(cbgzstart, band->z0);
- prc->x1 = int_min(cbgxend, band->x1);
- prc->y1 = int_min(cbgyend, band->y1);
- prc->z1 = int_min(cbgzend, band->z1);
-
- tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
- tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
- tlcblkzstart = int_floordivpow2(prc->z0, cblklengthexpn) << cblklengthexpn;
- brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
- brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
- brcblkzend = int_ceildivpow2(prc->z1, cblklengthexpn) << cblklengthexpn;
- prc->cblkno[0] = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
- prc->cblkno[1] = (brcblkyend - tlcblkystart) >> cblkheightexpn;
- prc->cblkno[2] = (brcblkzend - tlcblkzstart) >> cblklengthexpn;
- prc->cblkno[2] = (prc->cblkno[2] == 0) ? 1 : prc->cblkno[2];
-
- opj_free(prc->cblks);
- prc->cblks = (opj_tcd_cblk_t *) opj_malloc((prc->cblkno[0] * prc->cblkno[1] *
- prc->cblkno[2]) * sizeof(opj_tcd_cblk_t));
- prc->incltree = tgt_create(prc->cblkno[0], prc->cblkno[1], prc->cblkno[2]);
- prc->imsbtree = tgt_create(prc->cblkno[0], prc->cblkno[1], prc->cblkno[2]);
-
- for (cblkno = 0; cblkno < (prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2]);
- cblkno++) {
- int cblkxstart = tlcblkxstart + (cblkno % prc->cblkno[0]) *
- (1 << cblkwidthexpn);
- int cblkystart = tlcblkystart + ((cblkno % (prc->cblkno[0] * prc->cblkno[1])) /
- prc->cblkno[0]) * (1 << cblkheightexpn);
- int cblkzstart = tlcblkzstart + (cblkno / (prc->cblkno[0] * prc->cblkno[1])) *
- (1 << cblklengthexpn);
- int cblkxend = cblkxstart + (1 << cblkwidthexpn);
- int cblkyend = cblkystart + (1 << cblkheightexpn);
- int cblkzend = cblkzstart + (1 << cblklengthexpn);
- int prec = ((tilec->bpp > 16) ? 3 : ((tilec->bpp > 8) ? 2 : 1));
-
- tcd->cblk = &prc->cblks[cblkno];
- cblk = tcd->cblk;
-
- /* code-block size (global) */
- cblk->x0 = int_max(cblkxstart, prc->x0);
- cblk->y0 = int_max(cblkystart, prc->y0);
- cblk->z0 = int_max(cblkzstart, prc->z0);
- cblk->x1 = int_min(cblkxend, prc->x1);
- cblk->y1 = int_min(cblkyend, prc->y1);
- cblk->z1 = int_min(cblkzend, prc->z1);
- }
- } /* precno */
- } /* bandno */
- } /* resno */
- } /* compno */
- /*tcd_dump(stdout, tcd, tcd->tcd_volume);*/
-}
-
-
-void tcd_free_encode(opj_tcd_t *tcd)
-{
- int tileno, compno, resno, bandno, precno;
-
- opj_tcd_tile_t *tile = NULL; /* pointer to tcd->tile */
- /* opj_tcd_slice_t *slice = NULL; */ /* pointer to tcd->slice */
- opj_tcd_tilecomp_t *tilec = NULL; /* pointer to tcd->tilec */
- opj_tcd_resolution_t *res = NULL; /* pointer to tcd->res */
- opj_tcd_band_t *band = NULL; /* pointer to tcd->band */
- opj_tcd_precinct_t *prc = NULL; /* pointer to tcd->prc */
-
- for (tileno = 0; tileno < 1; tileno++) {
- tcd->tile = tcd->tcd_volume->tiles;
- tile = tcd->tile;
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- tcd->tilec = &tile->comps[compno];
- tilec = tcd->tilec;
-
- for (resno = 0; resno < tilec->numresolution[0]; resno++) {
- tcd->res = &tilec->resolutions[resno];
- res = tcd->res;
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- tcd->band = &res->bands[bandno];
- band = tcd->band;
-
- for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2];
- precno++) {
- tcd->prc = &band->precincts[precno];
- prc = tcd->prc;
-
- if (prc->incltree != NULL) {
- tgt_destroy(prc->incltree);
- prc->incltree = NULL;
- }
- if (prc->imsbtree != NULL) {
- tgt_destroy(prc->imsbtree);
- prc->imsbtree = NULL;
- }
- opj_free(prc->cblks);
- prc->cblks = NULL;
- } /* for (precno */
- opj_free(band->precincts);
- band->precincts = NULL;
- } /* for (bandno */
- } /* for (resno */
- opj_free(tilec->resolutions);
- tilec->resolutions = NULL;
- } /* for (compno */
- opj_free(tile->comps);
- tile->comps = NULL;
- } /* for (tileno */
- opj_free(tcd->tcd_volume->tiles);
- tcd->tcd_volume->tiles = NULL;
-}
-
-/* ----------------------------------------------------------------------- */
-void tcd_malloc_decode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp)
-{
- int tileno, compno, resno, bandno, precno, cblkno, res_max,
- i, j, p, q, r;
- unsigned int x0 = 0, y0 = 0, z0 = 0,
- x1 = 0, y1 = 0, z1 = 0,
- w, h, l;
-
- tcd->volume = volume;
- tcd->cp = cp;
- tcd->tcd_volume->tw = cp->tw;
- tcd->tcd_volume->th = cp->th;
- tcd->tcd_volume->tl = cp->tl;
- tcd->tcd_volume->tiles = (opj_tcd_tile_t *) opj_malloc(cp->tw * cp->th * cp->tl
- * sizeof(opj_tcd_tile_t));
-
- for (i = 0; i < cp->tileno_size; i++) {
- opj_tcp_t *tcp = &(cp->tcps[cp->tileno[i]]);
- opj_tcd_tile_t *tile = &(tcd->tcd_volume->tiles[cp->tileno[i]]);
-
- /* p61 ISO/IEC IS15444-1 : 2002 */
- /* curtileno --> raster scanned index of tiles */
- /* p,q,r --> matricial index of tiles */
- tileno = cp->tileno[i];
- p = tileno % cp->tw;
- q = tileno / cp->tw;
- r = tileno / (cp->tw * cp->th); /* extension to 3-D */
-
- /* 4 borders of the tile rescale on the volume if necessary (B.3)*/
- tile->x0 = int_max(cp->tx0 + p * cp->tdx, volume->x0);
- tile->y0 = int_max(cp->ty0 + q * cp->tdy, volume->y0);
- tile->z0 = int_max(cp->tz0 + r * cp->tdz, volume->z0);
- tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, volume->x1);
- tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, volume->y1);
- tile->z1 = int_min(cp->tz0 + (r + 1) * cp->tdz, volume->z1);
- tile->numcomps = volume->numcomps;
-
- tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(volume->numcomps * sizeof(
- opj_tcd_tilecomp_t));
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- int prevnumbands = 0;
-
- /* border of each tile component (global) */
- tilec->x0 = int_ceildiv(tile->x0, volume->comps[compno].dx);
- tilec->y0 = int_ceildiv(tile->y0, volume->comps[compno].dy);
- tilec->z0 = int_ceildiv(tile->z0, volume->comps[compno].dz);
- tilec->x1 = int_ceildiv(tile->x1, volume->comps[compno].dx);
- tilec->y1 = int_ceildiv(tile->y1, volume->comps[compno].dy);
- tilec->z1 = int_ceildiv(tile->z1, volume->comps[compno].dz);
-
- tilec->data = (int *) opj_malloc((tilec->x1 - tilec->x0) *
- (tilec->y1 - tilec->y0) * (tilec->z1 - tilec->z0) * sizeof(int));
-
- res_max = 0;
- for (i = 0; i < 3; i++) {
- tilec->numresolution[i] = tccp->numresolution[i];
- /*Greater of 3 resolutions contains all information*/
- res_max = (tilec->numresolution[i] > res_max) ? tilec->numresolution[i] :
- res_max;
- }
-
- tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(res_max * sizeof(
- opj_tcd_resolution_t));
-
- for (resno = 0; resno < res_max; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- int pdx, pdy, pdz;
- int tlprcxstart, tlprcystart, tlprczstart, brprcxend, brprcyend, brprczend;
- int tlcbgxstart, tlcbgystart, tlcbgzstart, brcbgxend, brcbgyend, brcbgzend;
- int cbgwidthexpn, cbgheightexpn, cbglengthexpn;
- int cblkwidthexpn, cblkheightexpn, cblklengthexpn;
- int levelnox = tilec->numresolution[0] - 1 - resno;
- int levelnoy = tilec->numresolution[1] - 1 - resno;
- int diff = tccp->numresolution[0] - tccp->numresolution[2];
- int levelnoz = tilec->numresolution[2] - 1 - ((resno <= diff) ? 0 :
- (resno - diff));
- if (levelnoz < 0) {
- levelnoz = 0;
- }
-
- /* border for each resolution level (global) */
- res->x0 = int_ceildivpow2(tilec->x0, levelnox);
- res->y0 = int_ceildivpow2(tilec->y0, levelnoy);
- res->z0 = int_ceildivpow2(tilec->z0, levelnoz);
- res->x1 = int_ceildivpow2(tilec->x1, levelnox);
- res->y1 = int_ceildivpow2(tilec->y1, levelnoy);
- res->z1 = int_ceildivpow2(tilec->z1, levelnoz);
- res->numbands = (resno == 0) ? 1 : (resno <= diff) ? 3 : 7; /* --> 3D */
-
- /* p. 30, table A-13, ISO/IEC IS154444-1 : 2002 */
- if (tccp->csty & J3D_CCP_CSTY_PRT) {
- pdx = tccp->prctsiz[0][resno];
- pdy = tccp->prctsiz[1][resno];
- pdz = tccp->prctsiz[2][resno];
- } else {
- pdx = 15;
- pdy = 15;
- pdz = 15;
- }
-
- /* p. 66, B.16, ISO/IEC IS15444-1 : 2002 */
- tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
- tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
- tlprczstart = int_floordivpow2(res->z0, pdz) << pdz;
- brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
- brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
- brprczend = int_ceildivpow2(res->z1, pdz) << pdz;
-
- res->prctno[0] = (brprcxend - tlprcxstart) >> pdx;
- res->prctno[1] = (brprcyend - tlprcystart) >> pdy;
- res->prctno[2] = (brprczend - tlprczstart) >> pdz;
-
- /* p. 67, B.17 & B.18, ISO/IEC IS15444-1 : 2002 */
- if (resno == 0) {
- tlcbgxstart = tlprcxstart;/*0*/
- tlcbgystart = tlprcystart;
- tlcbgzstart = tlprczstart;
- brcbgxend = brprcxend;/*1*/
- brcbgyend = brprcyend;
- brcbgzend = brprczend;
- cbgwidthexpn = pdx; /*15*/
- cbgheightexpn = pdy;
- cbglengthexpn = pdz;
- } else {
- tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
- tlcbgystart = int_ceildivpow2(tlprcystart, 1);
- tlcbgzstart = int_ceildivpow2(tlprczstart, 1);
- brcbgxend = int_ceildivpow2(brprcxend, 1);
- brcbgyend = int_ceildivpow2(brprcyend, 1);
- brcbgzend = int_ceildivpow2(brprczend, 1);
- cbgwidthexpn = pdx - 1;
- cbgheightexpn = pdy - 1;
- cbglengthexpn = pdz - 1;
- }
-
- cblkwidthexpn = int_min(tccp->cblk[0], cbgwidthexpn); /*6*/
- cblkheightexpn = int_min(tccp->cblk[1], cbgheightexpn); /*6*/
- cblklengthexpn = int_min(tccp->cblk[2], cbglengthexpn); /*6*/
-
- res->bands = (opj_tcd_band_t *) opj_malloc(res->numbands * sizeof(
- opj_tcd_band_t));
- for (bandno = 0; bandno < res->numbands; bandno++) {
- int x0b, y0b, z0b;
- int gain, numbps;
- opj_stepsize_t *ss = NULL;
-
- opj_tcd_band_t *band = &res->bands[bandno];
- band->bandno = resno == 0 ? 0 : bandno + 1;
- /* Bandno: 0 - LLL 2 - LHL
- 1 - HLL 3 - HHL
- 4 - LLH 6 - LHH
- 5 - HLH 7 - HHH */
- x0b = (band->bandno == 1) || (band->bandno == 3) || (band->bandno == 5) ||
- (band->bandno == 7) ? 1 : 0;
- y0b = (band->bandno == 2) || (band->bandno == 3) || (band->bandno == 6) ||
- (band->bandno == 7) ? 1 : 0;
- z0b = (band->bandno == 4) || (band->bandno == 5) || (band->bandno == 6) ||
- (band->bandno == 7) ? 1 : 0;
-
- /* p. 65, B.15, ISO/IEC IS15444-1 : 2002 */
- if (band->bandno == 0) {
- /* band border (global) */
- band->x0 = int_ceildivpow2(tilec->x0, levelnox);
- band->y0 = int_ceildivpow2(tilec->y0, levelnoy);
- band->z0 = int_ceildivpow2(tilec->z0, levelnoz);
- band->x1 = int_ceildivpow2(tilec->x1, levelnox);
- band->y1 = int_ceildivpow2(tilec->y1, levelnoy);
- band->z1 = int_ceildivpow2(tilec->z1, levelnoz);
- } else {
- band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelnox) * x0b, levelnox + 1);
- band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelnoy) * y0b, levelnoy + 1);
- band->z0 = int_ceildivpow2(tilec->z0 - (1 << levelnoz) * z0b,
- (resno <= diff) ? levelnoz : levelnoz + 1);
- band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelnox) * x0b, levelnox + 1);
- band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelnoy) * y0b, levelnoy + 1);
- band->z1 = int_ceildivpow2(tilec->z1 - (1 << levelnoz) * z0b,
- (resno <= diff) ? levelnoz : levelnoz + 1);
- }
-
- ss = &tccp->stepsizes[(resno == 0) ? 0 : (prevnumbands + bandno + 1)];
- if (bandno == (res->numbands - 1)) {
- prevnumbands += (resno == 0) ? 0 : res->numbands;
- }
- gain = dwt_getgain(band->bandno, tccp->reversible);
- numbps = volume->comps[compno].prec + gain;
-
- band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0,
- numbps - ss->expn));
- band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */
-
- band->precincts = (opj_tcd_precinct_t *) opj_malloc(res->prctno[0] *
- res->prctno[1] * res->prctno[2] * sizeof(opj_tcd_precinct_t));
-
- for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2];
- precno++) {
- int tlcblkxstart, tlcblkystart, tlcblkzstart, brcblkxend, brcblkyend,
- brcblkzend;
-
- int cbgxstart = tlcbgxstart + (precno % res->prctno[0]) * (1 << cbgwidthexpn);
- int cbgystart = tlcbgystart + (precno / res->prctno[0]) * (1 << cbgheightexpn);
- int cbgzstart = tlcbgzstart + (precno / (res->prctno[0] * res->prctno[1])) *
- (1 << cbglengthexpn);
- int cbgxend = cbgxstart + (1 << cbgwidthexpn);
- int cbgyend = cbgystart + (1 << cbgheightexpn);
- int cbgzend = cbgzstart + (1 << cbglengthexpn);
-
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- /* precinct size (global) */
- prc->x0 = int_max(cbgxstart, band->x0);
- prc->y0 = int_max(cbgystart, band->y0);
- prc->z0 = int_max(cbgzstart, band->z0);
- prc->x1 = int_min(cbgxend, band->x1);
- prc->y1 = int_min(cbgyend, band->y1);
- prc->z1 = int_min(cbgzend, band->z1);
-
- tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
- tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
- tlcblkzstart = int_floordivpow2(prc->z0, cblklengthexpn) << cblklengthexpn;
- brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
- brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
- brcblkzend = int_ceildivpow2(prc->z1, cblklengthexpn) << cblklengthexpn;
- prc->cblkno[0] = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
- prc->cblkno[1] = (brcblkyend - tlcblkystart) >> cblkheightexpn;
- prc->cblkno[2] = (brcblkzend - tlcblkzstart) >> cblklengthexpn;
- prc->cblkno[2] = (prc->cblkno[2] == 0) ? 1 : prc->cblkno[2];
-
- prc->cblks = (opj_tcd_cblk_t *) opj_malloc((prc->cblkno[0] * prc->cblkno[1] *
- prc->cblkno[2]) * sizeof(opj_tcd_cblk_t));
- prc->incltree = tgt_create(prc->cblkno[0], prc->cblkno[1], prc->cblkno[2]);
- prc->imsbtree = tgt_create(prc->cblkno[0], prc->cblkno[1], prc->cblkno[2]);
-
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- int cblkxstart = tlcblkxstart + (cblkno % prc->cblkno[0]) *
- (1 << cblkwidthexpn);
- int cblkystart = tlcblkystart + ((cblkno % (prc->cblkno[0] * prc->cblkno[1])) /
- prc->cblkno[0]) * (1 << cblkheightexpn);
- int cblkzstart = tlcblkzstart + (cblkno / (prc->cblkno[0] * prc->cblkno[1])) *
- (1 << cblklengthexpn);
- int cblkxend = cblkxstart + (1 << cblkwidthexpn);
- int cblkyend = cblkystart + (1 << cblkheightexpn);
- int cblkzend = cblkzstart + (1 << cblklengthexpn);
- int prec = ((tilec->bpp > 16) ? 3 : ((tilec->bpp > 8) ? 2 : 1));
- /* code-block size (global) */
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
-
- /* code-block size (global) */
- cblk->x0 = int_max(cblkxstart, prc->x0);
- cblk->y0 = int_max(cblkystart, prc->y0);
- cblk->z0 = int_max(cblkzstart, prc->z0);
- cblk->x1 = int_min(cblkxend, prc->x1);
- cblk->y1 = int_min(cblkyend, prc->y1);
- cblk->z1 = int_min(cblkzend, prc->z1);
- }
- } /* precno */
- } /* bandno */
- } /* resno */
- } /* compno */
- } /* i = 0..cp->tileno_size */
-
- /*tcd_dump(stdout, tcd, tcd->tcd_volume);*/
-
- /*
- Allocate place to store the decoded data = final volume
- Place limited by the tile really present in the codestream
- */
-
- for (i = 0; i < volume->numcomps; i++) {
- for (j = 0; j < cp->tileno_size; j++) {
- tileno = cp->tileno[j];
- x0 = (j == 0) ? tcd->tcd_volume->tiles[tileno].comps[i].x0 : int_min(x0,
- (unsigned int) tcd->tcd_volume->tiles[tileno].comps[i].x0);
- y0 = (j == 0) ? tcd->tcd_volume->tiles[tileno].comps[i].y0 : int_min(y0,
- (unsigned int) tcd->tcd_volume->tiles[tileno].comps[i].y0);
- z0 = (j == 0) ? tcd->tcd_volume->tiles[tileno].comps[i].z0 : int_min(z0,
- (unsigned int) tcd->tcd_volume->tiles[tileno].comps[i].z0);
- x1 = (j == 0) ? tcd->tcd_volume->tiles[tileno].comps[i].x1 : int_max(x1,
- (unsigned int) tcd->tcd_volume->tiles[tileno].comps[i].x1);
- y1 = (j == 0) ? tcd->tcd_volume->tiles[tileno].comps[i].y1 : int_max(y1,
- (unsigned int) tcd->tcd_volume->tiles[tileno].comps[i].y1);
- z1 = (j == 0) ? tcd->tcd_volume->tiles[tileno].comps[i].z1 : int_max(z1,
- (unsigned int) tcd->tcd_volume->tiles[tileno].comps[i].z1);
- }
-
- w = x1 - x0;
- h = y1 - y0;
- l = z1 - z0;
-
- volume->comps[i].data = (int *) opj_malloc(w * h * l * sizeof(int));
- volume->comps[i].w = w;
- volume->comps[i].h = h;
- volume->comps[i].l = l;
- volume->comps[i].x0 = x0;
- volume->comps[i].y0 = y0;
- volume->comps[i].z0 = z0;
- volume->comps[i].bigendian = cp->bigendian;
- }
-}
-
-void tcd_free_decode(opj_tcd_t *tcd)
-{
- int tileno, compno, resno, bandno, precno;
-
- opj_tcd_volume_t *tcd_volume = tcd->tcd_volume;
-
- for (tileno = 0; tileno < tcd_volume->tw * tcd_volume->th * tcd_volume->tl;
- tileno++) {
- opj_tcd_tile_t *tile = &tcd_volume->tiles[tileno];
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- for (resno = 0; resno < tilec->numresolution[0]; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- for (precno = 0; precno < res->prctno[1] * res->prctno[0] * res->prctno[2];
- precno++) {
- opj_tcd_precinct_t *prec = &band->precincts[precno];
- if (prec->cblks != NULL) {
- opj_free(prec->cblks);
- }
- if (prec->imsbtree != NULL) {
- tgt_destroy(prec->imsbtree);
- }
- if (prec->incltree != NULL) {
- tgt_destroy(prec->incltree);
- }
- /*for (treeno = 0; treeno < prec->numtrees; treeno++){
- if (prec->imsbtree[treeno] != NULL) tgt_destroy(prec->imsbtree[treeno]);
- if (prec->incltree[treeno] != NULL) tgt_destroy(prec->incltree[treeno]);
- }*/
- }
- if (band->precincts != NULL) {
- opj_free(band->precincts);
- }
- }
- }
- if (tilec->resolutions != NULL) {
- opj_free(tilec->resolutions);
- }
- }
- if (tile->comps != NULL) {
- opj_free(tile->comps);
- }
- }
-
- if (tcd_volume->tiles != NULL) {
- opj_free(tcd_volume->tiles);
- }
-}
-
-
-
-/* ----------------------------------------------------------------------- */
-void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final)
-{
- int compno, resno, bandno, precno, cblkno;
- int value; /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolution[0]][3]; */
- int matrice[10][10][3];
- int i, j, k;
-
- opj_cp_t *cp = tcd->cp;
- opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
- opj_tcp_t *tcd_tcp = tcd->tcp;
-
- /*matrice=(int*)opj_malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolution[0]*3*sizeof(int)); */
-
- for (compno = 0; compno < tcd_tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
- for (i = 0; i < tcd_tcp->numlayers; i++) {
- for (j = 0; j < tilec->numresolution[0]; j++) {
- for (k = 0; k < 3; k++) {
- matrice[i][j][k] =
- (int)(cp->matrice[i * tilec->numresolution[0] * 3 + j * 3 + k]
- * (float)(tcd->volume->comps[compno].prec / 16.0));
- }
- }
- }
-
- for (resno = 0; resno < tilec->numresolution[0]; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2];
- precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
- int n;
- int imsb = tcd->volume->comps[compno].prec -
- cblk->numbps; /* number of bit-plan equal to zero */
- /* Correction of the matrix of coefficient to include the IMSB information */
- if (layno == 0) {
- value = matrice[layno][resno][bandno];
- if (imsb >= value) {
- value = 0;
- } else {
- value -= imsb;
- }
- } else {
- value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno];
- if (imsb >= matrice[layno - 1][resno][bandno]) {
- value -= (imsb - matrice[layno - 1][resno][bandno]);
- if (value < 0) {
- value = 0;
- }
- }
- }
-
- if (layno == 0) {
- cblk->numpassesinlayers = 0;
- }
-
- n = cblk->numpassesinlayers;
- if (cblk->numpassesinlayers == 0) {
- if (value != 0) {
- n = 3 * value - 2 + cblk->numpassesinlayers;
- } else {
- n = cblk->numpassesinlayers;
- }
- } else {
- n = 3 * value + cblk->numpassesinlayers;
- }
-
- layer->numpasses = n - cblk->numpassesinlayers;
-
- if (!layer->numpasses) {
- continue;
- }
-
- if (cblk->numpassesinlayers == 0) {
- layer->len = cblk->passes[n - 1].rate;
- layer->data = cblk->data;
- } else {
- layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers -
- 1].rate;
- layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
- }
- if (final) {
- cblk->numpassesinlayers = n;
- }
- }
- }
- }
- }
- }
-}
-
-void tcd_rateallocate_fixed(opj_tcd_t *tcd)
-{
- int layno;
- for (layno = 0; layno < tcd->tcp->numlayers; layno++) {
- tcd_makelayer_fixed(tcd, layno, 1);
- }
-}
-
-void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final)
-{
- int compno, resno, bandno, precno, cblkno, passno;
-
- opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
-
- tcd_tile->distolayer[layno] = 0; /* fixed_quality */
-
- for (compno = 0; compno < tcd_tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
- for (resno = 0; resno < tilec->numresolution[0]; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2];
- precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
-
- int n;
- if (layno == 0) {
- cblk->numpassesinlayers = 0;
- }
- n = cblk->numpassesinlayers;
- for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) {
- int dr;
- double dd;
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- if (n == 0) {
- dr = pass->rate;
- dd = pass->distortiondec;
- } else {
- dr = pass->rate - cblk->passes[n - 1].rate;
- dd = pass->distortiondec - cblk->passes[n - 1].distortiondec;
- }
- if (!dr) {
- if (dd) {
- n = passno + 1;
- }
- continue;
- }
- if (dd / dr >= thresh) {
- n = passno + 1;
- }
- }
- layer->numpasses = n - cblk->numpassesinlayers;
-
- if (!layer->numpasses) {
- layer->disto = 0;
- continue;
- }
- if (cblk->numpassesinlayers == 0) {
- layer->len = cblk->passes[n - 1].rate;
- layer->data = cblk->data;
- layer->disto = cblk->passes[n - 1].distortiondec;
- } else {
- layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers -
- 1].rate;
- layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
- layer->disto = cblk->passes[n - 1].distortiondec -
- cblk->passes[cblk->numpassesinlayers - 1].distortiondec;
- }
-
- tcd_tile->distolayer[layno] += layer->disto; /* fixed_quality */
-
- if (final) {
- cblk->numpassesinlayers = n;
- }
-
- /* fprintf(stdout,"MakeLayer : %d %f %d %d \n",layer->len, layer->disto, layer->numpasses, n);*/
- }
- }
- }
- }
- }
-}
-
-bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len,
- opj_volume_info_t * volume_info)
-{
- int compno, resno, bandno, precno, cblkno, passno, layno;
- double min, max;
- double cumdisto[100]; /* fixed_quality */
- const double K = 1; /* 1.1; // fixed_quality */
- double maxSE = 0;
-
- opj_cp_t *cp = tcd->cp;
- opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
- opj_tcp_t *tcd_tcp = tcd->tcp;
-
- min = DBL_MAX;
- max = 0;
-
- tcd_tile->nbpix = 0; /* fixed_quality */
-
- for (compno = 0; compno < tcd_tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
- tilec->nbpix = 0;
- for (resno = 0; resno < tilec->numresolution[0]; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- for (precno = 0; precno < res->prctno[0] * res->prctno[1] * res->prctno[2];
- precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- for (cblkno = 0; cblkno < prc->cblkno[0] * prc->cblkno[1] * prc->cblkno[2];
- cblkno++) {
- opj_tcd_cblk_t *cblk = &prc->cblks[cblkno];
- for (passno = 0; passno < cblk->totalpasses; passno++) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- int dr;
- double dd, rdslope;
- if (passno == 0) {
- dr = pass->rate;
- dd = pass->distortiondec;
- } else {
- dr = pass->rate - cblk->passes[passno - 1].rate;
- dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec;
- }
- if (dr == 0) {
- continue;
- }
- rdslope = dd / dr;
- if (rdslope < min) {
- min = rdslope;
- }
- if (rdslope > max) {
- max = rdslope;
- }
-
- } /* passno */
-
- /* fixed_quality */
- tcd_tile->nbpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0) *
- (cblk->z1 - cblk->z0));
- tilec->nbpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0) *
- (cblk->z1 - cblk->z0));
- } /* cbklno */
- } /* precno */
- } /* bandno */
- } /* resno */
-
- maxSE += (((double)(1 << tcd->volume->comps[compno].prec) - 1.0)
- * ((double)(1 << tcd->volume->comps[compno].prec) - 1.0))
- * ((double)(tilec->nbpix));
- } /* compno */
-
- /* add antonin index */
- if (volume_info && volume_info->index_on) {
- opj_tile_info_t *info_TL = &volume_info->tile[tcd->tcd_tileno];
- info_TL->nbpix = tcd_tile->nbpix;
- info_TL->distotile = tcd_tile->distotile;
- info_TL->thresh = (double *) opj_malloc(tcd_tcp->numlayers * sizeof(double));
- }
- /* dda */
-
- for (layno = 0; layno < tcd_tcp->numlayers; layno++) {
- double lo = min;
- double hi = max;
- int success = 0;
- int maxlen = tcd_tcp->rates[layno] ? int_min(((int) tcd_tcp->rates[layno]),
- len) : len;
- double goodthresh;
- double distotarget; /* fixed_quality */
- int i = 0;
-
- /* fixed_quality */
- distotarget = tcd_tile->distotile - ((K * maxSE) / pow((float)10,
- tcd_tcp->distoratio[layno] / 10));
-
- if ((tcd_tcp->rates[layno]) || (cp->disto_alloc == 0)) {
- opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->volume, cp);
- int oldl = 0, oldoldl = 0;
- for (i = 0; i < 128; i++) {
- double thresh = (lo + hi) / 2;
- int l = 0;
- double distoachieved = 0; /* fixed_quality -q */
-
- tcd_makelayer(tcd, layno, thresh, 0);
-
- if (cp->fixed_quality) { /* fixed_quality -q */
- distoachieved = (layno == 0) ? tcd_tile->distolayer[0] : cumdisto[layno - 1] +
- tcd_tile->distolayer[layno];
- if (distoachieved < distotarget) {
- hi = thresh;
- continue;
- }
- lo = thresh;
- } else { /* disto_alloc -r, fixed_alloc -f */
- l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen,
- volume_info);
- /*fprintf(stdout, "layno %d i %d len=%d max=%d \n",layno,i,l,maxlen);*/
- if (l == -999) {
- lo = thresh;
- continue;
- } else if (l == oldl && oldl == oldoldl && tcd_tile->distolayer[layno] > 0.0 &&
- i > 32) {
- break;
- }
- hi = thresh;
- oldoldl = oldl;
- oldl = l;
- }
- success = 1;
- goodthresh = thresh;
- }
- t2_destroy(t2);
- } else {
- success = 1;
- goodthresh = min;
- }
- if (!success) {
- return false;
- }
-
- if (volume_info && volume_info->index_on) { /* Threshold for Marcela Index */
- volume_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh;
- }
- tcd_makelayer(tcd, layno, goodthresh, 1);
-
- /* fixed_quality */
- cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] : cumdisto[layno - 1] +
- tcd_tile->distolayer[layno];
- }
-
- return true;
-}
-
-/* ----------------------------------------------------------------------- */
-int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len,
- opj_volume_info_t * volume_info)
-{
- int compno;
- int l = 0, i, npck = 0;
- double encoding_time;
-
- opj_tcd_tile_t *tile = NULL;
- opj_tcp_t *tcd_tcp = NULL;
- opj_cp_t *cp = NULL;
-
- opj_tcp_t *tcp = &tcd->cp->tcps[0];
- opj_tccp_t *tccp = &tcp->tccps[0];
- opj_volume_t *volume = tcd->volume;
- opj_t2_t *t2 = NULL; /* T2 component */
-
- tcd->tcd_tileno = tileno; /* current encoded/decoded tile */
-
- tcd->tcd_tile = tcd->tcd_volume->tiles; /* tile information */
- tile = tcd->tcd_tile;
-
- tcd->tcp = &tcd->cp->tcps[tileno]; /* coding/decoding params of tileno */
- tcd_tcp = tcd->tcp;
-
- cp = tcd->cp; /* coding parameters */
-
- /* INDEX >> */
- if (volume_info && volume_info->index_on) {
- opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /* based on component 0 */
- for (i = 0; i < tilec_idx->numresolution[0]; i++) {
- opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i];
-
- volume_info->tile[tileno].prctno[0][i] = res_idx->prctno[0];
- volume_info->tile[tileno].prctno[1][i] = res_idx->prctno[1];
- volume_info->tile[tileno].prctno[2][i] = res_idx->prctno[2];
-
- npck += res_idx->prctno[0] * res_idx->prctno[1] * res_idx->prctno[2];
-
- volume_info->tile[tileno].prctsiz[0][i] = tccp->prctsiz[0][i];
- volume_info->tile[tileno].prctsiz[1][i] = tccp->prctsiz[1][i];
- volume_info->tile[tileno].prctsiz[2][i] = tccp->prctsiz[2][i];
- }
- volume_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc(
- volume_info->comp * volume_info->layer * npck * sizeof(opj_packet_info_t));
- }
- /* << INDEX */
-
- /*---------------TILE-------------------*/
- encoding_time = opj_clock(); /* time needed to encode a tile */
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- int x, y, z;
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-
- int adjust;
- int offset_x = int_ceildiv(volume->x0,
- volume->comps[compno].dx); /*ceil(x0 / subsampling_dx)*/
- int offset_y = int_ceildiv(volume->y0, volume->comps[compno].dy);
- int offset_z = int_ceildiv(volume->z0, volume->comps[compno].dz);
-
- int tw = tilec->x1 - tilec->x0;
- int w = int_ceildiv(volume->x1 - volume->x0, volume->comps[compno].dx);
- int th = tilec->y1 - tilec->y0;
- int h = int_ceildiv(volume->y1 - volume->y0, volume->comps[compno].dy);
- int tl = tilec->z1 - tilec->z0;
- int l = int_ceildiv(volume->z1 - volume->z0, volume->comps[compno].dz);
-
-
-
- /* extract tile data from volume.comps[0].data to tile.comps[0].data */
- /*fprintf(stdout,"[INFO] Extract tile data\n");*/
- if (tcd->cp->transform_format == TRF_3D_RLS ||
- tcd->cp->transform_format == TRF_3D_LSE) {
- adjust = 0;
- } else {
- adjust = volume->comps[compno].sgnd ? 0 : 1 << (volume->comps[compno].prec -
- 1); /*sign=='+' --> 2^(prec-1)*/
- if (volume->comps[compno].dcoffset != 0) {
- adjust += volume->comps[compno].dcoffset;
- fprintf(stdout, "[INFO] DC Offset applied: DCO = %d -> adjust = %d\n",
- volume->comps[compno].dcoffset, adjust);
- }
- }
-
- if (tcd_tcp->tccps[compno].reversible ==
- 1) { /*IF perfect reconstruction (DWT.5-3)*/
- for (z = tilec->z0; z < tilec->z1; z++) {
- for (y = tilec->y0; y < tilec->y1; y++) {
- /* start of the src tile scanline */
- int *data = &volume->comps[compno].data[(tilec->x0 - offset_x) +
- (y - offset_y) * w + (z - offset_z) * w * h];
- /* start of the dst tile scanline */
- int *tile_data = &tilec->data[(y - tilec->y0) * tw + (z - tilec->z0) * tw * th];
- for (x = tilec->x0; x < tilec->x1; x++) {
- *tile_data++ = *data++ - adjust;
- }
- }
- }
- } else if (tcd_tcp->tccps[compno].reversible == 0) { /*IF not (DWT.9-7)*/
- for (z = tilec->z0; z < tilec->z1; z++) {
- for (y = tilec->y0; y < tilec->y1; y++) {
- /* start of the src tile scanline */
- int *data = &volume->comps[compno].data[(tilec->x0 - offset_x) +
- (y - offset_y) * w + (z - offset_z) * w * h];
- /* start of the dst tile scanline */
- int *tile_data = &tilec->data[(y - tilec->y0) * tw + (z - tilec->z0) * tw * th];
- for (x = tilec->x0; x < tilec->x1; x++) {
- *tile_data++ = (*data++ - adjust) << 13;
- }
- }
- }
- }
-
- }
-
- /*----------------MCT-------------------*/
- if (tcd_tcp->mct) {
- int samples = (tile->comps[0].x1 - tile->comps[0].x0) *
- (tile->comps[0].y1 - tile->comps[0].y0) * (tile->comps[0].z1 -
- tile->comps[0].z0);
- fprintf(stdout, "[INFO] Tcd_encode_tile: mct\n");
- if (tcd_tcp->tccps[0].reversible == 0) {
- mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data,
- samples);
- } else {
- mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data,
- samples);
- }
- }
- /*----------------TRANSFORM---------------------------------*/
- fprintf(stdout, "[INFO] Tcd_encode_tile: Transform\n");
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- dwt_encode(tilec, tcd_tcp->tccps[compno].dwtid);
- }
-
- /*-------------------ENTROPY CODING-----------------------------*/
- fprintf(stdout, "[INFO] Tcd_encode_tile: Entropy coding\n");
- if ((cp->encoding_format == ENCOD_2EB) || (cp->encoding_format == ENCOD_3EB)) {
- if (cp->encoding_format == ENCOD_2EB) {
- opj_t1_t *t1 = NULL;
- t1 = t1_create(tcd->cinfo);
- t1_encode_cblks(t1, tile, tcd_tcp);
- t1_destroy(t1);
- } else if (cp->encoding_format == ENCOD_3EB) {
- opj_t1_3d_t *t1 = NULL;
- t1 = t1_3d_create(tcd->cinfo);
- t1_3d_encode_cblks(t1, tile, tcd_tcp);
- t1_3d_destroy(t1);
- }
- /*-----------RATE-ALLOCATE------------------*/
- /* INDEX */
- if (volume_info) {
- volume_info->index_write = 0;
- }
- if (cp->disto_alloc || cp->fixed_quality) {
- fprintf(stdout, "[INFO] Tcd_encode_tile: Rate-allocate\n");
- tcd_rateallocate(tcd, dest, len,
- volume_info); /* Normal Rate/distortion allocation */
- } else {/* fixed_alloc */
- fprintf(stdout, "[INFO] Tcd_encode_tile: Rate-allocate fixed\n");
- tcd_rateallocate_fixed(
- tcd); /* Fixed layer allocation */
- }
-
- /*--------------TIER2------------------*/
- /* INDEX */
- if (volume_info) {
- volume_info->index_write = 1;
- }
- fprintf(stdout, "[INFO] Tcd_encode_tile: Tier - 2\n");
- t2 = t2_create(tcd->cinfo, volume, cp);
- l = t2_encode_packets(t2, tileno, tile, tcd_tcp->numlayers, dest, len,
- volume_info);
- t2_destroy(t2);
- } else if ((cp->encoding_format == ENCOD_2GR) ||
- (cp->encoding_format == ENCOD_3GR)) {
- /*if(volume_info) {
- volume_info->index_write = 1;
- }
- gr = golomb_create(tcd->cinfo, volume, cp);
- l = golomb_encode(gr, tileno, tile, dest, len, volume_info);
- golomb_destroy(gr);*/
- }
-
-
- /*---------------CLEAN-------------------*/
- fprintf(stdout, "[INFO] Tcd_encode_tile: %d bytes coded\n", l);
- encoding_time = opj_clock() - encoding_time;
- opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n", encoding_time);
-
- /* cleaning memory */
- for (compno = 0; compno < tile->numcomps; compno++) {
- tcd->tilec = &tile->comps[compno];
- opj_free(tcd->tilec->data);
- }
-
- if (l == -999) {
- fprintf(stdout, "[ERROR] Unable to perform T2 tier. Return -999.\n");
- return 0;
- }
-
- return l;
-}
-
-
-bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno)
-{
- int l, i;
- int compno, eof = 0;
- double tile_time, t1_time, dwt_time;
-
- opj_tcd_tile_t *tile = NULL;
- opj_t2_t *t2 = NULL; /* T2 component */
-
- tcd->tcd_tileno = tileno;
- tcd->tcd_tile = &(tcd->tcd_volume->tiles[tileno]);
- tcd->tcp = &(tcd->cp->tcps[tileno]);
- tile = tcd->tcd_tile;
-
- tile_time = opj_clock(); /* time needed to decode a tile */
- opj_event_msg(tcd->cinfo, EVT_INFO, "tile %d / %d\n", tileno + 1,
- tcd->cp->tw * tcd->cp->th * tcd->cp->tl);
-
- if ((tcd->cp->encoding_format == ENCOD_2EB) ||
- (tcd->cp->encoding_format == ENCOD_3EB)) {
- /*--------------TIER2------------------*/
- t2 = t2_create(tcd->cinfo, tcd->volume, tcd->cp);
- l = t2_decode_packets(t2, src, len, tileno, tile);
- t2_destroy(t2);
- opj_event_msg(tcd->cinfo, EVT_INFO, "Tcd_decode_tile: %d bytes decoded\n", l);
-
- if (l == -999) {
- eof = 1;
- opj_event_msg(tcd->cinfo, EVT_ERROR, "Tcd_decode_tile: incomplete bitstream\n");
- }
-
- /*------------------TIER1-----------------*/
- opj_event_msg(tcd->cinfo, EVT_INFO, "Tcd_decode_tile: Entropy decoding %d \n",
- tcd->cp->encoding_format);
- t1_time = opj_clock(); /* time needed to decode a tile */
- if (tcd->cp->encoding_format == ENCOD_2EB) {
- opj_t1_t *t1 = NULL; /* T1 component */
- t1 = t1_create(tcd->cinfo);
- t1_decode_cblks(t1, tile, tcd->tcp);
- t1_destroy(t1);
- } else if (tcd->cp->encoding_format == ENCOD_3EB) {
- opj_t1_3d_t *t1 = NULL; /* T1 component */
- t1 = t1_3d_create(tcd->cinfo);
- t1_3d_decode_cblks(t1, tile, tcd->tcp);
- t1_3d_destroy(t1);
- }
-
- t1_time = opj_clock() - t1_time;
-#ifdef VERBOSE
- opj_event_msg(tcd->cinfo, EVT_INFO, "- tier-1 took %f s\n", t1_time);
-#endif
- } else if ((tcd->cp->encoding_format == ENCOD_2GR) ||
- (tcd->cp->encoding_format == ENCOD_3GR)) {
- opj_event_msg(tcd->cinfo, EVT_INFO,
- "Tcd_decode_tile: Entropy decoding -- Does nothing :-D\n");
- /*
- gr = golomb_create(tcd->cinfo, tcd->volume, tcd->cp);
- l = golomb_decode(gr, tileno, tile, src, len);
- golomb_destroy(gr);
- if (l == -999) {
- eof = 1;
- opj_event_msg(tcd->cinfo, EVT_ERROR, "Tcd_decode_tile: incomplete bitstream\n");
- }
- */
- }
-
- /*----------------DWT---------------------*/
- fprintf(stdout, "[INFO] Tcd_decode_tile: Inverse DWT\n");
- dwt_time = opj_clock(); /* time needed to decode a tile */
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- int stops[3], dwtid[3];
-
- for (i = 0; i < 3; i++) {
- if (tcd->cp->reduce[i] != 0) {
- tcd->volume->comps[compno].resno_decoded[i] =
- tile->comps[compno].numresolution[i] - tcd->cp->reduce[i] - 1;
- }
- stops[i] = tilec->numresolution[i] - 1 -
- tcd->volume->comps[compno].resno_decoded[i];
- if (stops[i] < 0) {
- stops[i] = 0;
- }
- dwtid[i] = tcd->cp->tcps->tccps[compno].dwtid[i];
- }
-
- dwt_decode(tilec, stops, dwtid);
-
- for (i = 0; i < 3; i++) {
- if (tile->comps[compno].numresolution[i] > 0) {
- tcd->volume->comps[compno].factor[i] = tile->comps[compno].numresolution[i] -
- (tcd->volume->comps[compno].resno_decoded[i] + 1);
- if ((tcd->volume->comps[compno].factor[i]) < 0) {
- tcd->volume->comps[compno].factor[i] = 0;
- }
- }
- }
- }
- dwt_time = opj_clock() - dwt_time;
-#ifdef VERBOSE
- opj_event_msg(tcd->cinfo, EVT_INFO, "- dwt took %f s\n", dwt_time);
-#endif
-
- /*----------------MCT-------------------*/
-
- if (tcd->tcp->mct) {
- if (tcd->tcp->tccps[0].reversible == 1) {
- mct_decode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data,
- (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 -
- tile->comps[0].y0) * (tile->comps[0].z1 - tile->comps[0].z0));
- } else {
- mct_decode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data,
- (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 -
- tile->comps[0].y0) * (tile->comps[0].z1 - tile->comps[0].z0));
- }
- }
-
- /*---------------TILE-------------------*/
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- opj_tcd_resolution_t *res =
- &tilec->resolutions[tcd->volume->comps[compno].resno_decoded[0]];
- int adjust;
- int minval = tcd->volume->comps[compno].sgnd ? -(1 <<
- (tcd->volume->comps[compno].prec - 1)) : 0;
- int maxval = tcd->volume->comps[compno].sgnd ? (1 <<
- (tcd->volume->comps[compno].prec - 1)) - 1 : (1 <<
- tcd->volume->comps[compno].prec) - 1;
-
- int tw = tilec->x1 - tilec->x0;
- int w = tcd->volume->comps[compno].w;
- int th = tilec->y1 - tilec->y0;
- int h = tcd->volume->comps[compno].h;
-
- int i, j, k;
- int offset_x = int_ceildivpow2(tcd->volume->comps[compno].x0,
- tcd->volume->comps[compno].factor[0]);
- int offset_y = int_ceildivpow2(tcd->volume->comps[compno].y0,
- tcd->volume->comps[compno].factor[1]);
- int offset_z = int_ceildivpow2(tcd->volume->comps[compno].z0,
- tcd->volume->comps[compno].factor[2]);
-
- if (tcd->cp->transform_format == TRF_3D_RLS ||
- tcd->cp->transform_format == TRF_3D_LSE) {
- adjust = 0;
- } else {
- adjust = tcd->volume->comps[compno].sgnd ? 0 : 1 <<
- (tcd->volume->comps[compno].prec - 1); /*sign=='+' --> 2^(prec-1)*/
- if (tcd->volume->comps[compno].dcoffset != 0) {
- adjust += tcd->volume->comps[compno].dcoffset;
- fprintf(stdout, "[INFO] DC Offset applied: DCO = %d -> adjust = %d\n",
- tcd->volume->comps[compno].dcoffset, adjust);
- }
- }
-
- for (k = res->z0; k < res->z1; k++) {
- for (j = res->y0; j < res->y1; j++) {
- for (i = res->x0; i < res->x1; i++) {
- int v;
- float tmp = (float)((tilec->data[i - res->x0 + (j - res->y0) * tw +
- (k - res->z0) * tw * th]) / 8192.0);
-
- if (tcd->tcp->tccps[compno].reversible == 1) {
- v = tilec->data[i - res->x0 + (j - res->y0) * tw + (k - res->z0) * tw * th];
- } else {
- int tmp2 = ((int)(floor(fabs(tmp)))) + ((int) floor(fabs(tmp * 2)) % 2);
- v = ((tmp < 0) ? -tmp2 : tmp2);
- }
- v += adjust;
-
- tcd->volume->comps[compno].data[(i - offset_x) + (j - offset_y) * w +
- (k - offset_z) * w * h] = int_clamp(v, minval, maxval);
- }
- }
- }
- }
-
- tile_time = opj_clock() - tile_time; /* time needed to decode a tile */
- opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time);
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_free(tcd->tcd_volume->tiles[tileno].comps[compno].data);
- tcd->tcd_volume->tiles[tileno].comps[compno].data = NULL;
- }
-
- if (eof) {
- return false;
- }
-
- return true;
-}
-
+++ /dev/null
-/*
- * 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.
- */
-#ifndef __TCD_H
-#define __TCD_H
-/**
-@file tcd.h
-@brief Implementation of a tile coder/decoder (TCD)
-
-The functions in TCD.C have for goal to encode or decode each tile independently from
-each other. The functions in TCD.C are used by some function in JP3D.C.
-*/
-
-/** @defgroup TCD TCD - Implementation of a tile coder/decoder */
-/*@{*/
-
-/**
-Tile coder/decoder: segment instance
-*/
-typedef struct opj_tcd_seg {
- /** Number of passes in the segment */
- int numpasses;
- /** Length of information */
- int len;
- /** Data */
- unsigned char *data;
- /** Number of passes possible for the segment */
- int maxpasses;
- /** Number of passes added to the segment */
- int numnewpasses;
- /** New length after inclusion of segments */
- int newlen;
-} opj_tcd_seg_t;
-
-/**
-Tile coder/decoder: pass instance
-*/
-typedef struct opj_tcd_pass {
- /** Rate obtained in the pass*/
- int rate;
- /** Distorsion obtained in the pass*/
- double distortiondec;
- int term;
- /** Length of information */
- int len;
-} opj_tcd_pass_t;
-
-/**
-Tile coder/decoder: layer instance
-*/
-typedef struct opj_tcd_layer {
- /** Number of passes in the layer */
- int numpasses;
- /** Length of information */
- int len;
- /** Distortion within layer */
- double disto; /* add for index (Cfr. Marcela) */
- unsigned char *data; /* data */
-} opj_tcd_layer_t;
-
-/**
-Tile coder/decoder: codeblock instance
-*/
-typedef struct opj_tcd_cblk {
- /** Dimension of the code-blocks : left upper corner (x0, y0, z0) */
- int x0, y0, z0;
- /** Dimension of the code-blocks : right low corner (x1,y1,z1) */
- int x1, y1, z1;
- /** Number of bits per simbol in codeblock */
- int numbps;
- int numlenbits;
- int len; /* length */
- /** Number of pass already done for the code-blocks */
- int numpasses;
- /** number of pass added to the code-blocks */
- int numnewpasses;
- /** Number of segments */
- int numsegs;
- /** Segments information */
- opj_tcd_seg_t segs[100];
- /** Number of passes in the layer */
- int numpassesinlayers;
- /** Layer information */
- opj_tcd_layer_t layers[100];
- /** Total number of passes */
- int totalpasses;
- /** Information about the passes */
- opj_tcd_pass_t passes[100];
- /* Data */
- unsigned char data[524288];
- /*unsigned char *data;*/
-} opj_tcd_cblk_t;
-
-/**
-Tile coder/decoder: precint instance
-*/
-typedef struct opj_tcd_precinct {
- /** Dimension of the precint : left upper corner (x0, y0, z0) */
- int x0, y0, z0;
- /** Dimension of the precint : right low corner (x1,y1,z1) */
- int x1, y1, z1;
- /** Number of codeblocks in precinct in width and height and length*/
- int cblkno[3];
- /** Information about the codeblocks */
- opj_tcd_cblk_t *cblks;
- /** Inclusion tree */
- opj_tgt_tree_t *incltree;
- /** Missing MSBs tree */
- opj_tgt_tree_t *imsbtree;
-} opj_tcd_precinct_t;
-
-/**
-Tile coder/decoder: subband instance
-*/
-typedef struct opj_tcd_band {
- /** Dimension of the subband : left upper corner (x0, y0, z0) */
- int x0, y0, z0;
- /** Dimension of the subband : right low corner (x1,y1,z1) */
- int x1, y1, z1;
- /** Information about the precints */
- opj_tcd_precinct_t *precincts; /* precinct information */
- /** Number of bits per symbol in band */
- int numbps;
- /** Quantization stepsize associated */
- float stepsize;
- /** Band orientation (O->LLL,...,7->HHH) */
- int bandno;
-} opj_tcd_band_t;
-
-/**
-Tile coder/decoder: resolution instance
-*/
-typedef struct opj_tcd_resolution {
- /** Dimension of the resolution level : left upper corner (x0, y0, z0) */
- int x0, y0, z0;
- /** Dimension of the resolution level : right low corner (x1,y1,z1) */
- int x1, y1, z1;
- /** Number of precints in each dimension for the resolution level */
- int prctno[3];
- /** Number of subbands for the resolution level */
- int numbands;
- /** Subband information */
- opj_tcd_band_t *bands;
-} opj_tcd_resolution_t;
-
-/**
-Tile coder/decoder: component instance
-*/
-typedef struct opj_tcd_tilecomp {
- /** Dimension of the component : left upper corner (x0, y0, z0) */
- int x0, y0, z0;
- /** Dimension of the component : right low corner (x1,y1,z1) */
- int x1, y1, z1;
- /** Number of resolutions level if DWT transform*/
- int numresolution[3];
- /** Resolution information */
- opj_tcd_resolution_t *resolutions;
- /** Data of the component */
- int *data;
- /** Fixed_quality related */
- int nbpix;
- /** Number of bits per voxel in component */
- int bpp;
-} opj_tcd_tilecomp_t;
-
-/**
-Tile coder/decoder: tile instance
-*/
-typedef struct opj_tcd_tile {
- /** Dimension of the tile : left upper corner (x0, y0, z0) */
- int x0, y0, z0;
- /** Dimension of the tile : right low corner (x1,y1,z1) */
- int x1, y1, z1;
- /** Number of components in tile */
- int numcomps;
- /** Components information */
- opj_tcd_tilecomp_t *comps;
- /** Fixed_quality related : no of bytes of data*/
- int nbpix;
- /** Fixed_quality related : distortion achieved in tile */
- double distotile;
- /** Fixed_quality related : distortion achieved in each layer */
- double distolayer[100];
-} opj_tcd_tile_t;
-
-/**
-Tile coder/decoder: volume instance
-*/
-typedef struct opj_tcd_volume {
- /** Number of tiles in width and height and length */
- int tw, th, tl;
- /** Tiles information */
- opj_tcd_tile_t *tiles;
-} opj_tcd_volume_t;
-
-/**
-Tile coder/decoder
-*/
-typedef struct opj_tcd {
- /** Codec context */
- opj_common_ptr cinfo;
- /** Volume information */
- opj_volume_t *volume;
- /** Coding parameters */
- opj_cp_t *cp;
- /** Coding/decoding parameters common to all tiles */
- opj_tcp_t *tcp;
- /** Info on each volume tile */
- opj_tcd_volume_t *tcd_volume;
- /** Pointer to the current encoded/decoded tile */
- opj_tcd_tile_t *tcd_tile;
- /** Current encoded/decoded tile */
- int tcd_tileno;
-
- /**@name working variables */
- /*@{*/
- opj_tcd_tile_t *tile;
- opj_tcd_tilecomp_t *tilec;
- opj_tcd_resolution_t *res;
- opj_tcd_band_t *band;
- opj_tcd_precinct_t *prc;
- opj_tcd_cblk_t *cblk;
- /*@}*/
-} opj_tcd_t;
-
-/** @name Funciones generales */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-
-/**
-Dump the content of a tcd structure
-*/
-void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_volume_t *img);
-/**
-Create a new TCD handle
-@param cinfo Codec context info
-@return Returns a new TCD handle if successful returns NULL otherwise
-*/
-opj_tcd_t* tcd_create(opj_common_ptr cinfo);
-/**
-Destroy a previously created TCD handle
-@param tcd TCD handle to destroy
-*/
-void tcd_destroy(opj_tcd_t *tcd);
-/**
-Initialize the tile coder (allocate the memory)
-@param tcd TCD handle
-@param volume Raw volume
-@param cp Coding parameters
-@param curtileno Number that identifies the tile that will be encoded
-*/
-void tcd_malloc_encode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp,
- int curtileno);
-/**
-Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode)(for 3D-DWT)
-@param tcd TCD handle
-@param volume Raw volume
-@param cp Coding parameters
-@param curtileno Number that identifies the tile that will be encoded
-*/
-void tcd_init_encode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp,
- int curtileno);
-/**
-Free the memory allocated for encoding
-@param tcd TCD handle
-*/
-void tcd_free_encode(opj_tcd_t *tcd);
-/**
-Initialize the tile decoder
-@param tcd TCD handle
-@param volume Raw volume
-@param cp Coding parameters
-*/
-void tcd_malloc_decode(opj_tcd_t *tcd, opj_volume_t * volume, opj_cp_t * cp);
-
-void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final);
-void tcd_rateallocate_fixed(opj_tcd_t *tcd);
-void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final);
-bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len,
- opj_volume_info_t * volume_info);
-/**
-Encode a tile from the raw volume into a buffer
-@param tcd TCD handle
-@param tileno Number that identifies one of the tiles to be encoded
-@param dest Destination buffer
-@param len Length of destination buffer
-@param volume_info Creation of index file
-@return
-*/
-int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len,
- opj_volume_info_t * volume_info);
-/**
-Decode a tile from a buffer into a raw volume
-@param tcd TCD handle
-@param src Source buffer
-@param len Length of source buffer
-@param tileno Number that identifies one of the tiles to be decoded
-*/
-bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len, int tileno);
-/**
-Free the memory allocated for decoding
-@param tcd TCD handle
-*/
-void tcd_free_decode(opj_tcd_t *tcd);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __TCD_H */
+++ /dev/null
-/*
- * 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
- * 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_includes.h"
-
-/*
-==========================================================
- Tag-tree coder interface
-==========================================================
-*/
-void tgt_tree_dump(FILE *fd, opj_tgt_tree_t * tree)
-{
- int nodesno;
-
- fprintf(fd, "TGT_TREE {\n");
- fprintf(fd, " numnodes: %d \n", tree->numnodes);
- fprintf(fd, " numleafsh: %d, numleafsv: %d, numleafsz: %d,\n", tree->numleafsh,
- tree->numleafsv, tree->numleafsz);
-
- for (nodesno = 0; nodesno < tree->numnodes; nodesno++) {
- fprintf(fd, "tgt_node %d {\n", nodesno);
- fprintf(fd, " value: %d \n", tree->nodes[nodesno].value);
- fprintf(fd, " low: %d \n", tree->nodes[nodesno].low);
- fprintf(fd, " known: %d \n", tree->nodes[nodesno].known);
- if (tree->nodes[nodesno].parent) {
- fprintf(fd, " parent.value: %d \n", tree->nodes[nodesno].parent->value);
- fprintf(fd, " parent.low: %d \n", tree->nodes[nodesno].parent->low);
- fprintf(fd, " parent.known: %d \n", tree->nodes[nodesno].parent->known);
- }
- fprintf(fd, "}\n");
-
- }
- fprintf(fd, "}\n");
-
-}
-
-
-opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv, int numleafsz)
-{
-
- int nplh[32];
- int nplv[32];
- int nplz[32];
- opj_tgt_node_t *node = NULL;
- opj_tgt_node_t *parentnode = NULL;
- opj_tgt_node_t *parentnode0 = NULL;
- opj_tgt_node_t *parentnode1 = NULL;
- opj_tgt_tree_t *tree = NULL;
- int i, j, k, p, p0;
- int numlvls;
- int n, z = 0;
-
- tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t));
- if (!tree) {
- return NULL;
- }
- tree->numleafsh = numleafsh;
- tree->numleafsv = numleafsv;
- tree->numleafsz = numleafsz;
-
- numlvls = 0;
- nplh[0] = numleafsh;
- nplv[0] = numleafsv;
- nplz[0] = numleafsz;
- tree->numnodes = 0;
- do {
- n = nplh[numlvls] * nplv[numlvls] * nplz[numlvls];
- nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2;
- nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2;
- nplz[numlvls + 1] = (nplz[numlvls] + 1) / 2;
- tree->numnodes += n;
- ++numlvls;
- } while (n > 1);
-
- if (tree->numnodes == 0) {
- opj_free(tree);
- return NULL;
- }
-
- tree->nodes = (opj_tgt_node_t *) opj_malloc(tree->numnodes * sizeof(
- opj_tgt_node_t));
- if (!tree->nodes) {
- opj_free(tree);
- return NULL;
- }
-
- node = tree->nodes;
- parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv * tree->numleafsz];
- parentnode0 = parentnode;
- parentnode1 = parentnode;
- /*fprintf(stdout,"\nH %d V %d Z %d numlvls %d nodes %d\n",tree->numleafsh,tree->numleafsv,tree->numleafsz,numlvls,tree->numnodes);*/
- for (i = 0; i < numlvls - 1; ++i) {
- for (z = 0; z < nplz[i]; ++z) {
- for (j = 0; j < nplv[i]; ++j) {
- k = nplh[i];
- while (--k >= 0) {
- node->parent =
- parentnode; /*fprintf(stdout,"node[%d].parent = node[%d]\n",n,p);*/
- ++node;
- if (--k >= 0) {
- node->parent =
- parentnode; /*fprintf(stdout,"node[%d].parent = node[%d]\n",n,p);*/
- ++node;
- }
- ++parentnode;
- }
- if ((j & 1) || j == nplv[i] - 1) {
- parentnode0 = parentnode;
- } else {
- parentnode = parentnode0;
- }
- }
- if ((z & 1) || z == nplz[i] - 1) {
- parentnode1 = parentnode;
- } else {
- parentnode0 = parentnode1;
- parentnode = parentnode1;
- }
- }
- }
- node->parent = 0;
-
-
- tgt_reset(tree);
-
- return tree;
-}
-
-void tgt_destroy(opj_tgt_tree_t *tree)
-{
- opj_free(tree->nodes);
- opj_free(tree);
-}
-
-void tgt_reset(opj_tgt_tree_t *tree)
-{
- int i;
-
- if (NULL == tree) {
- return;
- }
-
- for (i = 0; i < tree->numnodes; i++) {
- tree->nodes[i].value = 999;
- tree->nodes[i].low = 0;
- tree->nodes[i].known = 0;
- }
-}
-
-void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value)
-{
- opj_tgt_node_t *node;
- node = &tree->nodes[leafno];
- while (node && node->value > value) {
- node->value = value;
- node = node->parent;
- }
-}
-
-void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno,
- int threshold)
-{
- opj_tgt_node_t *stk[31];
- opj_tgt_node_t **stkptr;
- opj_tgt_node_t *node;
- int low;
-
- stkptr = stk;
- node = &tree->nodes[leafno];
- while (node->parent) {
- *stkptr++ = node;
- node = node->parent;
- }
-
- low = 0;
- for (;;) {
- if (low > node->low) {
- node->low = low;
- } else {
- low = node->low;
- }
-
- while (low < threshold) {
- if (low >= node->value) {
- if (!node->known) {
- bio_write(bio, 1, 1);
- node->known = 1;
- }
- break;
- }
- bio_write(bio, 0, 1);
- ++low;
- }
-
- node->low = low;
- if (stkptr == stk) {
- break;
- }
- node = *--stkptr;
- }
-}
-
-int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold)
-{
- opj_tgt_node_t *stk[31];
- opj_tgt_node_t **stkptr;
- opj_tgt_node_t *node;
- int low;
-
- stkptr = stk;
- node = &tree->nodes[leafno];
- while (node->parent) {
- *stkptr++ = node;
- node = node->parent;
- }
-
- low = 0;
- for (;;) {
- if (low > node->low) {
- node->low = low;
- } else {
- low = node->low;
- }
- while (low < threshold && low < node->value) {
- if (bio_read(bio, 1)) {
- node->value = low;
- } else {
- ++low;
- }
- }
- node->low = low;
- if (stkptr == stk) {
- break;
- }
- node = *--stkptr;
- }
-
- return (node->value < threshold) ? 1 : 0;
-}
+++ /dev/null
-/*
- * 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
- * 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 __TGT_H
-#define __TGT_H
-/**
-@file tgt.h
-@brief Implementation of a tag-tree coder (TGT)
-
-The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C
-are used by some function in T2.C.
-*/
-
-/** @defgroup TGT TGT - Implementation of a tag-tree coder */
-/*@{*/
-
-/**
-Tag node
-*/
-typedef struct opj_tgt_node {
- /** Node parent reference */
- struct opj_tgt_node *parent;
- /** */
- int value;
- /** */
- int low;
- /** */
- int known;
-} opj_tgt_node_t;
-
-/**
-Tag tree
-*/
-typedef struct opj_tgt_tree {
- /** Number of leaves from horizontal axis */
- int numleafsh;
- /** Number of leaves from vertical axis */
- int numleafsv;
- /** Number of leaves from axial axis */
- int numleafsz;
- /** Number of nodes */
- int numnodes;
- /** Reference to each node instance */
- opj_tgt_node_t *nodes;
-} opj_tgt_tree_t;
-
-/** @name Funciones generales */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a tag-tree
-@param numleafsh Width of the array of leafs of the tree
-@param numleafsv Height of the array of leafs of the tree
-@param numleafsz Depth of the array of leafs of the tree
-@return Returns a new tag-tree if successful, returns NULL otherwise
-*/
-opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv, int numleafsz);
-/**
-Destroy a tag-tree, liberating memory
-@param tree Tag-tree to destroy
-*/
-void tgt_destroy(opj_tgt_tree_t *tree);
-/**
-Reset a tag-tree (set all leaves to 0)
-@param tree Tag-tree to reset
-*/
-void tgt_reset(opj_tgt_tree_t *tree);
-/**
-Set the value of a leaf of a tag-tree
-@param tree Tag-tree to modify
-@param leafno Number that identifies the leaf to modify
-@param value New value of the leaf
-*/
-void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value);
-/**
-Encode the value of a leaf of the tag-tree up to a given threshold
-@param bio Pointer to a BIO handle
-@param tree Tag-tree to modify
-@param leafno Number that identifies the leaf to encode
-@param threshold Threshold to use when encoding value of the leaf
-*/
-void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno,
- int threshold);
-/**
-Decode the value of a leaf of the tag-tree up to a given threshold
-@param bio Pointer to a BIO handle
-@param tree Tag-tree to decode
-@param leafno Number that identifies the leaf to decode
-@param threshold Threshold to use when decoding value of the leaf
-@return Returns 1 if the node's value < threshold, returns 0 otherwise
-*/
-int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold);
-
-/*@}*/
-/* ----------------------------------------------------------------------- */
-void tgt_tree_dump(FILE *fd, opj_tgt_tree_t * tree);
-/*@}*/
-
-#endif /* __TGT_H */
+++ /dev/null
-/*
- * 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) 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.
- */
-
-#include "opj_includes.h"
-#include "volume.h"
-#include "openjp3d.h"
-
-opj_volume_t* OPJ_CALLCONV opj_volume_create(int numcmpts,
- opj_volume_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc)
-{
- int compno;
- opj_volume_t *volume = NULL;
-
- volume = (opj_volume_t*)opj_malloc(sizeof(opj_volume_t));
- if (volume) {
- volume->color_space = clrspc;
- volume->numcomps = numcmpts;
- /* allocate memory for the per-component information */
- volume->comps = (opj_volume_comp_t*)opj_malloc(volume->numcomps * sizeof(
- opj_volume_comp_t));
- if (!volume->comps) {
- opj_volume_destroy(volume);
- return NULL;
- }
- /* create the individual volume components */
- for (compno = 0; compno < numcmpts; compno++) {
- opj_volume_comp_t *comp = &volume->comps[compno];
- comp->dx = cmptparms[compno].dx;
- comp->dy = cmptparms[compno].dy;
- comp->dz = cmptparms[compno].dz;
- comp->w = cmptparms[compno].w;
- comp->h = cmptparms[compno].h;
- comp->l = cmptparms[compno].l;
- comp->x0 = cmptparms[compno].x0;
- comp->y0 = cmptparms[compno].y0;
- comp->z0 = cmptparms[compno].z0;
- comp->prec = cmptparms[compno].prec;
- comp->bpp = cmptparms[compno].bpp;
- comp->sgnd = cmptparms[compno].sgnd;
- comp->bigendian = cmptparms[compno].bigendian;
- comp->dcoffset = cmptparms[compno].dcoffset;
- comp->data = (int*)opj_malloc(comp->w * comp->h * comp->l * sizeof(int));
- if (!comp->data) {
- fprintf(stdout, "Unable to malloc comp->data (%d x %d x %d x bytes)", comp->w,
- comp->h, comp->l);
- opj_volume_destroy(volume);
- return NULL;
- }
- /*fprintf(stdout,"%d %d %d %d %d %d %d %d %d", comp->w,comp->h, comp->l, comp->dx, comp->dy, comp->dz, comp->prec, comp->bpp, comp->sgnd);*/
- }
- }
-
- return volume;
-}
-
-void OPJ_CALLCONV opj_volume_destroy(opj_volume_t *volume)
-{
- int i;
- if (volume) {
- if (volume->comps) {
- /* volume components */
- for (i = 0; i < volume->numcomps; i++) {
- opj_volume_comp_t *volume_comp = &volume->comps[i];
- if (volume_comp->data) {
- opj_free(volume_comp->data);
- }
- }
- opj_free(volume->comps);
- }
- opj_free(volume);
- }
-}
-
+++ /dev/null
-/*
- * 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) 2005, Herve Drolon, FreeImage Team
- * 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 __VOLUME_H
-#define __VOLUME_H
-/**
-@file volume.h
-@brief Implementation of operations on volumes (VOLUME)
-
-The functions in VOLUME.C have for goal to realize operations on volumes.
-*/
-
-/** @defgroup VOLUME VOLUME - Implementation of operations on volumes */
-/*@{*/
-
-
-/*@}*/
-
-#endif /* __VOLUME_H */
-
+++ /dev/null
-# Makefile for the main JPWL OpenJPEG codecs: JPWL_ j2k_to_image and JPWL_image_to_j2k
-
-add_definitions(-DUSE_JPWL)
-
-set(OPENJPEG_SRCS
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/bio.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/cio.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/dwt.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/event.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/image.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/j2k.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/jp2.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/jpt.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/mct.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/mqc.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/openjpeg.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/j2k_lib.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/pi.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/raw.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/t1.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/t2.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/tcd.c
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2/tgt.c
-)
-
-set(JPWL_SRCS crc.c jpwl.c jpwl_lib.c rs.c)
-if(APPLE)
- set_source_files_properties(
- rs.c
- PROPERTIES
- COMPILE_FLAGS -fno-common)
-endif()
-
-include_directories(
- ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h
- ${OPENJPEG_SOURCE_DIR}/src/lib/openmj2
- ${OPENJPEG_SOURCE_DIR}/src/lib/openjpwl
- )
-
-# Build the library
-if(WIN32)
- if(BUILD_SHARED_LIBS)
- add_definitions(-DOPJ_EXPORTS)
- else()
- add_definitions(-DOPJ_STATIC)
- endif()
-endif()
-add_library(openjpwl ${JPWL_SRCS} ${OPENJPEG_SRCS})
-if(UNIX)
- target_link_libraries(openjpwl m)
-endif()
-set_target_properties(openjpwl
- PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES})
-if(NOT ${CMAKE_VERSION} VERSION_LESS "2.8.12")
- target_compile_options(openjpwl PRIVATE ${OPENJPEG_LIBRARY_COMPILE_OPTIONS})
-endif()
-
-# Install library
-install(TARGETS openjpwl
- EXPORT OpenJPEGTargets
- RUNTIME DESTINATION ${OPENJPEG_INSTALL_BIN_DIR} COMPONENT Applications
- LIBRARY DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries
- ARCHIVE DESTINATION ${OPENJPEG_INSTALL_LIB_DIR} COMPONENT Libraries
-)
+++ /dev/null
-===============================================================================
- JPEG2000 Part 11 (ISO/IEC 15444-11 JPWL) Software
-
-
-
- Version 20061213
-===============================================================================
-
-
-
-
-
-1. Scope
-=============
-
-This document describes the installation and use of the JPWL module in the framework of OpenJPEG library.
-
-This implementation has been developed from OpenJPEG implementation of JPEG2000 standard, and for this reason it is written in C language.
-
-If you find some bugs or if you have problems using the encoder/decoder, please send an e-mail to jpwl@diei.unipg.it
-
-
-2. Installing the code
-==========================
-
-The JPWL code is integrated with the standard OpenJPEG library and codecs: it is activated by setting the macro USE_JPWL to defined in the preprocessor configuration options of your preferred C compiler.
-
-2.1. Compiling the source code in Windows
--------------------------------------------
-
-The "jpwl" directory is already populated with a couple of Visual C++ 6.0 workspaces
-
- * JPWL_image_to_j2k.dsw - Creates the encoder with JPWL functionalities
- * JPWL_j2k_to_image.dsw - Creates the decoder with JPWL functionalities
-
-2.2. Compiling the source code in Unix-like systems
------------------------------------------------------
-
-Under linux, enter the jpwl directory and type "make clean" and "make".
-
-
-3. Running the JPWL software
-=========================
-
-The options available at the command line are exactly the same of the base OpenJPEG codecs. In addition, there is a "-W" switch that activates JPWL functionalities.
-
-3.1. JPWL Encoder
--------------------
-
--W : adoption of JPWL (Part 11) capabilities (-W params)
- The parameters can be written and repeated in any order:
- [h<tile><=type>,s<tile><=method>,a=<addr>,z=<size>,g=<range>,...
- ...,p<tile:pack><=type>]
-
- h selects the header error protection (EPB): 'type' can be
- [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]
- if 'tile' is absent, it applies to main and tile headers
- if 'tile' is present, it applies from that tile
- onwards, up to the next h<tile> spec, or to the last tile
- in the codestream (max. 16 specs)
-
- p selects the packet error protection (EEP/UEP with EPBs)
- to be applied to raw data: 'type' can be
- [0=none 1,absent=predefined 16=CRC-16 32=CRC-32 37-128=RS]
- if 'tile:pack' is absent, it starts from tile 0, packet 0
- if 'tile:pack' is present, it applies from that tile
- and that packet onwards, up to the next packet spec
- or to the last packet in the last tile in the codestream
- (max. 16 specs)
-
- s enables sensitivity data insertion (ESD): 'method' can be
- [-1=NO ESD 0=RELATIVE ERROR 1=MSE 2=MSE REDUCTION 3=PSNR
- 4=PSNR INCREMENT 5=MAXERR 6=TSE 7=RESERVED]
- if 'tile' is absent, it applies to main header only
- if 'tile' is present, it applies from that tile
- onwards, up to the next s<tile> spec, or to the last tile
- in the codestream (max. 16 specs)
-
- g determines the addressing mode: <range> can be
- [0=PACKET 1=BYTE RANGE 2=PACKET RANGE]
-
- a determines the size of data addressing: <addr> can be
- 2/4 bytes (small/large codestreams). If not set, auto-mode
-
- z determines the size of sensitivity values: <size> can be
- 1/2 bytes, for the transformed pseudo-floating point value
-
- ex.:
- h,h0=64,h3=16,h5=32,p0=78,p0:24=56,p1,p3:0=0,p3:20=32,s=0,s0=6,s3=-1,a=0,g=1,z=1
- means
- predefined EPB in MH, rs(64,32) from TPH 0 to TPH 2,
- CRC-16 in TPH 3 and TPH 4, CRC-32 in remaining TPHs,
- UEP rs(78,32) for packets 0 to 23 of tile 0,
- UEP rs(56,32) for packets 24 to the last of tile 0,
- UEP rs default for packets of tile 1,
- no UEP for packets 0 to 19 of tile 3,
- UEP CRC-32 for packets 20 of tile 3 to last tile,
- relative sensitivity ESD for MH,
- TSE ESD from TPH 0 to TPH 2, byte range with automatic
- size of addresses and 1 byte for each sensitivity value
-
- ex.:
- h,s,p
- means
- default protection to headers (MH and TPHs) as well as
- data packets, one ESD in MH
-
- N.B.: use the following recommendations when specifying
- the JPWL parameters list
- - when you use UEP, always pair the 'p' option with 'h'
-
-3.2. JPWL Decoder
--------------------
-
- -W <options>
- Activates the JPWL correction capability, if the codestream complies.
- Options can be a comma separated list of <param=val> tokens:
- c, c=numcomps
- numcomps is the number of expected components in the codestream
- (search of first EPB rely upon this, default is 3)
-
-
-4. Known bugs and limitations
-===============================
-
-4.1. Bugs
------------
-
-* It is not possible to save a JPWL encoded codestream using the wrapped file format (i.e. JP2): only raw file format (i.e. J2K) is working
-
-4.2. Limitations
-------------------
-
-* When specifying an UEP protection, you need to activate even TPH protection for those tiles where there is a protection of the packets
-* RED insertion is not currently implemented at the decoder
-* JPWL at entropy coding level is not implemented
+++ /dev/null
-/*
- * 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy
- * 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.
- */
-
-#ifdef USE_JPWL
-
-#include "crc.h"
-
-/**
-@file crc.c
-@brief Functions used to compute the 16- and 32-bit CRC of byte arrays
-
-*/
-
-/** file: CRC16.CPP
- *
- * CRC - Cyclic Redundancy Check (16-bit)
- *
- * A CRC-checksum is used to be sure, the data hasn't changed or is false.
- * To create a CRC-checksum, initialise a check-variable (unsigned short),
- * and set this to zero. Than call for every byte in the file (e.g.) the
- * procedure updateCRC16 with this check-variable as the first parameter,
- * and the byte as the second. At the end, the check-variable contains the
- * CRC-checksum.
- *
- * implemented by Michael Neumann, 14.06.1998
- *
- */
-const unsigned short CRC16_table[256] = {
- 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
- 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
- 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
- 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
- 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
- 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
- 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
- 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
- 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
- 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
- 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
- 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
- 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
- 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
- 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
- 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
- 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
- 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
- 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
- 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
- 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
- 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
- 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
- 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
- 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
- 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
- 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
- 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
- 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
- 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
- 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
- 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
-};
-
-void updateCRC16(unsigned short *crc, unsigned char data)
-{
- *crc = CRC16_table[(*crc >> 8) & 0xFF] ^ (*crc << 8) ^ data;
-}
-
-
-/** file: CRC32.CPP
- *
- * CRC - Cyclic Redundancy Check (32-bit)
- *
- * A CRC-checksum is used to be sure, the data hasn't changed or is false.
- * To create a CRC-checksum, initialise a check-variable (unsigned long),
- * and set this to zero. Than call for every byte in the file (e.g.) the
- * procedure updateCRC32 with this check-variable as the first parameter,
- * and the byte as the second. At the end, the check-variable contains the
- * CRC-checksum.
- *
- * implemented by Michael Neumann, 14.06.1998
- *
- */
-const unsigned long CRC32_table[256] = {
- 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
- 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
- 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
- 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
- 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
- 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
- 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
- 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
- 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
- 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
- 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
- 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
- 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
- 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
- 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
- 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
- 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
- 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
- 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
- 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
- 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
- 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
- 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
- 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
- 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
- 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
- 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
- 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
- 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
- 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
- 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
- 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
- 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
- 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
- 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
- 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
- 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
- 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
- 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
- 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
- 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
- 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
- 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
-};
-
-void updateCRC32(unsigned long *crc, unsigned char data)
-{
- *crc = CRC32_table[(unsigned char) * crc ^ data] ^ ((*crc >> 8) & 0x00FFFFFF);
-}
-
-#endif /* USE_JPWL */
+++ /dev/null
-/*
- * 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy
- * 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.
- */
-
-#ifdef USE_JPWL
-
-/**
-@file crc.h
-@brief Functions used to compute the 16- and 32-bit CRC of byte arrays
-
-*/
-
-#ifndef __CRC16_HEADER__
-#define __CRC16_HEADER__
-
-/** file: CRC16.HPP
- *
- * CRC - Cyclic Redundancy Check (16-bit)
- *
- * A CRC-checksum is used to be sure, the data hasn't changed or is false.
- * To create a CRC-checksum, initialise a check-variable (unsigned short),
- * and set this to zero. Than call for every byte in the file (e.g.) the
- * procedure updateCRC16 with this check-variable as the first parameter,
- * and the byte as the second. At the end, the check-variable contains the
- * CRC-checksum.
- *
- * implemented by Michael Neumann, 14.06.1998
- *
- */
-void updateCRC16(unsigned short *, unsigned char);
-
-#endif /* __CRC16_HEADER__ */
-
-
-#ifndef __CRC32_HEADER__
-#define __CRC32_HEADER__
-
-/** file: CRC32.HPP
- *
- * CRC - Cyclic Redundancy Check (32-bit)
- *
- * A CRC-checksum is used to be sure, the data hasn't changed or is false.
- * To create a CRC-checksum, initialise a check-variable (unsigned short),
- * and set this to zero. Than call for every byte in the file (e.g.) the
- * procedure updateCRC32 with this check-variable as the first parameter,
- * and the byte as the second. At the end, the check-variable contains the
- * CRC-checksum.
- *
- * implemented by Michael Neumann, 14.06.1998
- *
- */
-void updateCRC32(unsigned long *, unsigned char);
-
-#endif /* __CRC32_HEADER__ */
-
-
-#endif /* USE_JPWL */
+++ /dev/null
-/*
- * 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy
- * 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_includes.h"
-
-#ifdef USE_JPWL
-
-/** @defgroup JPWL JPWL - JPEG-2000 Part11 (JPWL) codestream manager */
-/*@{*/
-
-/** @name Local static variables */
-/*@{*/
-
-/** number of JPWL prepared markers */
-static int jwmarker_num;
-/** properties of JPWL markers to insert */
-static jpwl_marker_t jwmarker[JPWL_MAX_NO_MARKERS];
-
-/*@}*/
-
-/*@}*/
-
-/** @name Local static functions */
-/*@{*/
-
-/** create an EPC marker segment
-@param j2k J2K compressor handle
-@param esd_on true if ESD is activated
-@param red_on true if RED is activated
-@param epb_on true if EPB is activated
-@param info_on true if informative techniques are activated
-@return returns the freshly created EPC
-*/
-jpwl_epc_ms_t *jpwl_epc_create(opj_j2k_t *j2k, opj_bool esd_on, opj_bool red_on,
- opj_bool epb_on, opj_bool info_on);
-
-/*@}*/
-
-/** create an EPC marker segment
-@param j2k J2K compressor handle
-@param comps considered component (-1=average, 0/1/2/...=component no.)
-@param addrm addressing mode (0=packet, 1=byte range, 2=packet range, 3=reserved)
-@param ad_size size of addresses (2/4 bytes)
-@param senst sensitivity type
-@param se_size sensitivity values size (1/2 bytes)
-@param tileno tile where this ESD lies (-1 means MH)
-@param svalnum number of sensitivity values (if 0, they will be automatically filled)
-@param sensval pointer to an array of sensitivity values (if NULL, they will be automatically filled)
-@return returns the freshly created ESD
-*/
-jpwl_esd_ms_t *jpwl_esd_create(opj_j2k_t *j2k, int comps,
- unsigned char addrm, unsigned char ad_size,
- unsigned char senst, int se_size, int tileno,
- unsigned long int svalnum, void *sensval);
-
-/** this function is used to compare two JPWL markers based on
-their relevant wishlist position
-@param arg1 pointer to first marker
-@param arg2 pointer to second marker
-@return 1 if arg1>arg2, 0 if arg1=arg2, -1 if arg1<arg2
-*/
-int jpwl_markcomp(const void *arg1, const void *arg2);
-
-/** write an EPB MS to a buffer
-@param j2k J2K compressor handle
-@param epbmark pointer to the EPB MS
-@param buf pointer to the memory buffer
-*/
-void jpwl_epb_write(opj_j2k_t *j2k, jpwl_epb_ms_t *epbmark, unsigned char *buf);
-
-/** write an EPC MS to a buffer
-@param j2k J2K compressor handle
-@param epcmark pointer to the EPC MS
-@param buf pointer to the memory buffer
-*/
-void jpwl_epc_write(opj_j2k_t *j2k, jpwl_epc_ms_t *epcmark, unsigned char *buf);
-
-/**
- * write an ESD MS to a buffer
-@param j2k J2K compressor handle
-@param esd pointer to the ESD MS
-@param buf pointer to the memory buffer
-*/
-void jpwl_esd_write(opj_j2k_t *j2k, jpwl_esd_ms_t *esdmark, unsigned char *buf);
-
-/*-----------------------------------------------------------------*/
-
-void jpwl_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image)
-{
-
- int mm;
-
- /* let's reset some settings */
-
- /* clear the existing markers */
- for (mm = 0; mm < jwmarker_num; mm++) {
-
- switch (jwmarker[mm].id) {
-
- case J2K_MS_EPB:
- opj_free(jwmarker[mm].m.epbmark);
- break;
-
- case J2K_MS_EPC:
- opj_free(jwmarker[mm].m.epcmark);
- break;
-
- case J2K_MS_ESD:
- opj_free(jwmarker[mm].m.esdmark);
- break;
-
- case J2K_MS_RED:
- opj_free(jwmarker[mm].m.redmark);
- break;
-
- default:
- break;
- }
- }
-
- /* clear the marker structure array */
- memset(jwmarker, 0, sizeof(jpwl_marker_t) * JPWL_MAX_NO_MARKERS);
-
- /* no more markers in the list */
- jwmarker_num = 0;
-
- /* let's begin creating a marker list, according to user wishes */
- jpwl_prepare_marks(j2k, cio, image);
-
- /* now we dump the JPWL markers on the codestream */
- jpwl_dump_marks(j2k, cio, image);
-
- /* do not know exactly what is this for,
- but it gets called during index creation */
- j2k->pos_correction = 0;
-
-}
-
-opj_bool j2k_add_marker(opj_codestream_info_t *cstr_info,
- unsigned short int type, int pos, int len)
-{
-
- if (!cstr_info) {
- return OPJ_FALSE;
- }
-
- /* expand the list? */
- if ((cstr_info->marknum + 1) > cstr_info->maxmarknum) {
- opj_marker_info_t* new_marker;
- cstr_info->maxmarknum += 100;
- new_marker = (opj_marker_info_t*)opj_realloc(cstr_info->marker,
- cstr_info->maxmarknum * sizeof(opj_marker_info_t));
- if (! new_marker) {
- opj_free(cstr_info->marker);
- cstr_info->marker = 0;
- cstr_info->marknum = 0;
- cstr_info->maxmarknum = 0;
- /* opj_event_msg_v2(p_manager, EVT_ERROR, "Not enough memory to add a marker\n"); */
- /* TODO_test_add_marker_result;*/
- return OPJ_FALSE;
- }
- cstr_info->marker = new_marker;
- }
-
- /* add the marker */
- cstr_info->marker[cstr_info->marknum].type = type;
- cstr_info->marker[cstr_info->marknum].pos = pos;
- cstr_info->marker[cstr_info->marknum].len = len;
- cstr_info->marknum++;
- return OPJ_TRUE;
-
-}
-
-void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image)
-{
-
- unsigned short int socsiz_len = 0;
- int ciopos = cio_tell(cio), soc_pos = j2k->cstr_info->main_head_start;
- unsigned char *socp = NULL;
-
- int tileno, acc_tpno, tpno, tilespec, hprot, sens, pprot, packspec, lastileno,
- packno;
-
- jpwl_epb_ms_t *epb_mark;
- jpwl_epc_ms_t *epc_mark;
- jpwl_esd_ms_t *esd_mark;
- (void)image;
-
- /* find (SOC + SIZ) length */
- /* I assume SIZ is always the first marker after SOC */
- cio_seek(cio, soc_pos + 4);
- socsiz_len = (unsigned short int) cio_read(cio,
- 2) + 4; /* add the 2 marks length itself */
- cio_seek(cio, soc_pos + 0);
- socp = cio_getbp(cio); /* pointer to SOC */
-
- /*
- EPC MS for Main Header: if we are here it's required
- */
- /* create the EPC */
- if ((epc_mark = jpwl_epc_create(
- j2k,
- j2k->cp->esd_on, /* is ESD present? */
- j2k->cp->red_on, /* is RED present? */
- j2k->cp->epb_on, /* is EPB present? */
- OPJ_FALSE /* are informative techniques present? */
- ))) {
-
- /* Add this marker to the 'insertanda' list */
- if (epc_mark) {
- jwmarker[jwmarker_num].id = J2K_MS_EPC; /* its type */
- jwmarker[jwmarker_num].m.epcmark = epc_mark; /* the EPC */
- jwmarker[jwmarker_num].pos = soc_pos + socsiz_len; /* after SIZ */
- jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos +
- 0.1; /* not so first */
- jwmarker[jwmarker_num].len = epc_mark->Lepc; /* its length */
- jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready */
- jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */
- jwmarker[jwmarker_num].parms_ready = OPJ_FALSE; /* not ready */
- jwmarker[jwmarker_num].data_ready = OPJ_TRUE; /* ready */
- jwmarker_num++;
- };
-
- opj_event_msg(j2k->cinfo, EVT_INFO,
- "MH EPC : setting %s%s%s\n",
- j2k->cp->esd_on ? "ESD, " : "",
- j2k->cp->red_on ? "RED, " : "",
- j2k->cp->epb_on ? "EPB, " : ""
- );
-
- } else {
- /* ooops, problems */
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create MH EPC\n");
- };
-
- /*
- ESD MS for Main Header
- */
- /* first of all, must MH have an ESD MS? */
- if (j2k->cp->esd_on && (j2k->cp->sens_MH >= 0)) {
-
- /* Create the ESD */
- if ((esd_mark = jpwl_esd_create(
- j2k, /* this encoder handle */
- -1, /* we are averaging over all components */
- (unsigned char) j2k->cp->sens_range, /* range method */
- (unsigned char) j2k->cp->sens_addr, /* sensitivity addressing */
- (unsigned char) j2k->cp->sens_MH, /* sensitivity method */
- j2k->cp->sens_size, /* sensitivity size */
- -1, /* this ESD is in main header */
- 0 /*j2k->cstr_info->num*/, /* number of packets in codestream */
- NULL /*sensval*/ /* pointer to sensitivity data of packets */
- ))) {
-
- /* Add this marker to the 'insertanda' list */
- if (jwmarker_num < JPWL_MAX_NO_MARKERS) {
- jwmarker[jwmarker_num].id = J2K_MS_ESD; /* its type */
- jwmarker[jwmarker_num].m.esdmark = esd_mark; /* the EPB */
- jwmarker[jwmarker_num].pos = soc_pos +
- socsiz_len; /* we choose to place it after SIZ */
- jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos +
- 0.2; /* not first at all! */
- jwmarker[jwmarker_num].len = esd_mark->Lesd; /* its length */
- jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* not ready, yet */
- jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */
- jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* not ready */
- jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* not ready */
- jwmarker_num++;
- }
-
- opj_event_msg(j2k->cinfo, EVT_INFO,
- "MH ESDs: method %d\n",
- j2k->cp->sens_MH
- );
-
- } else {
- /* ooops, problems */
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create MH ESD\n");
- };
-
- }
-
- /*
- ESD MSs for Tile Part Headers
- */
- /* cycle through tiles */
- sens = -1; /* default spec: no ESD */
- tilespec = 0; /* first tile spec */
- acc_tpno = 0;
- for (tileno = 0; tileno < j2k->cstr_info->tw * j2k->cstr_info->th; tileno++) {
-
- opj_event_msg(j2k->cinfo, EVT_INFO,
- "Tile %d has %d tile part(s)\n",
- tileno, j2k->cstr_info->tile[tileno].num_tps
- );
-
- /* for every tile part in the tile */
- for (tpno = 0; tpno < j2k->cstr_info->tile[tileno].num_tps;
- tpno++, acc_tpno++) {
-
- int sot_len, Psot, Psotp, mm;
- unsigned long sot_pos, post_sod_pos;
-
- unsigned long int left_THmarks_len;
-
- /******* sot_pos = j2k->cstr_info->tile[tileno].start_pos; */
- sot_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos;
- cio_seek(cio, sot_pos + 2);
- sot_len = cio_read(cio, 2); /* SOT Len */
- cio_skip(cio, 2);
- Psotp = cio_tell(cio);
- Psot = cio_read(cio, 4); /* tile length */
-
- /******* post_sod_pos = j2k->cstr_info->tile[tileno].end_header + 1; */
- post_sod_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_end_header + 1;
- left_THmarks_len = post_sod_pos - sot_pos;
-
- /* add all the lengths of the markers which are len-ready and stay within SOT and SOD */
- for (mm = 0; mm < jwmarker_num; mm++) {
- if ((jwmarker[mm].pos >= sot_pos) && (jwmarker[mm].pos < post_sod_pos)) {
- if (jwmarker[mm].len_ready) {
- left_THmarks_len += jwmarker[mm].len + 2;
- } else {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "MS %x in %f is not len-ready: could not set up TH EPB\n",
- jwmarker[mm].id, jwmarker[mm].dpos);
- exit(1);
- }
- }
- }
-
- /******* if ((tilespec < JPWL_MAX_NO_TILESPECS) && (j2k->cp->sens_TPH_tileno[tilespec] == tileno)) */
- if ((tilespec < JPWL_MAX_NO_TILESPECS) &&
- (j2k->cp->sens_TPH_tileno[tilespec] == acc_tpno))
- /* we got a specification from this tile onwards */
- {
- sens = j2k->cp->sens_TPH[tilespec++];
- }
-
- /* must this TPH have an ESD MS? */
- if (j2k->cp->esd_on && (sens >= 0)) {
-
- /* Create the ESD */
- if ((esd_mark = jpwl_esd_create(
- j2k, /* this encoder handle */
- -1, /* we are averaging over all components */
- (unsigned char) j2k->cp->sens_range, /* range method */
- (unsigned char) j2k->cp->sens_addr, /* sensitivity addressing size */
- (unsigned char) sens, /* sensitivity method */
- j2k->cp->sens_size, /* sensitivity value size */
- tileno, /* this ESD is in a tile */
- 0, /* number of packets in codestream */
- NULL /* pointer to sensitivity data of packets */
- ))) {
-
- /* Add this marker to the 'insertanda' list */
- if (jwmarker_num < JPWL_MAX_NO_MARKERS) {
- jwmarker[jwmarker_num].id = J2K_MS_ESD; /* its type */
- jwmarker[jwmarker_num].m.esdmark = esd_mark; /* the EPB */
- /****** jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].start_pos + sot_len + 2; */ /* after SOT */
- jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos
- + sot_len + 2; /* after SOT */
- jwmarker[jwmarker_num].dpos = (double) jwmarker[jwmarker_num].pos +
- 0.2; /* not first at all! */
- jwmarker[jwmarker_num].len = esd_mark->Lesd; /* its length */
- jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready, yet */
- jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */
- jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* not ready */
- jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* ready */
- jwmarker_num++;
- }
-
- /* update Psot of the tile */
- cio_seek(cio, Psotp);
- cio_write(cio, Psot + esd_mark->Lesd + 2, 4);
-
- opj_event_msg(j2k->cinfo, EVT_INFO,
- /******* "TPH ESDs: tile %02d, method %d\n", */
- "TPH ESDs: tile %02d, part %02d, method %d\n",
- /******* tileno, */
- tileno, tpno,
- sens
- );
-
- } else {
- /* ooops, problems */
- /***** opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH ESD #%d\n", tileno); */
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH ESD #%d,%d\n",
- tileno, tpno);
- };
-
- }
-
- }
-
- };
-
- /*
- EPB MS for Main Header
- */
- /* first of all, must MH have an EPB MS? */
- if (j2k->cp->epb_on && (j2k->cp->hprot_MH > 0)) {
-
- int mm;
-
- /* position of SOT */
- unsigned int sot_pos = j2k->cstr_info->main_head_end + 1;
-
- /* how much space is there between end of SIZ and beginning of SOT? */
- int left_MHmarks_len = sot_pos - socsiz_len;
-
- /* add all the lengths of the markers which are len-ready and stay within SOC and SOT */
- for (mm = 0; mm < jwmarker_num; mm++) {
- if (jwmarker[mm].pos < sot_pos) { /* jwmarker[mm].pos >=0 since ulong */
- if (jwmarker[mm].len_ready) {
- left_MHmarks_len += jwmarker[mm].len + 2;
- } else {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "MS %x in %f is not len-ready: could not set up MH EPB\n",
- jwmarker[mm].id, jwmarker[mm].dpos);
- exit(1);
- }
- }
- }
-
- /* Create the EPB */
- if ((epb_mark = jpwl_epb_create(
- j2k, /* this encoder handle */
- OPJ_TRUE, /* is it the latest? */
- OPJ_TRUE, /* is it packed? not for now */
- -1, /* we are in main header */
- 0, /* its index is 0 (first) */
- j2k->cp->hprot_MH, /* protection type parameters of data */
- socsiz_len, /* pre-data: only SOC+SIZ */
- left_MHmarks_len /* post-data: from SOC to SOT, and all JPWL markers within */
- ))) {
-
- /* Add this marker to the 'insertanda' list */
- if (jwmarker_num < JPWL_MAX_NO_MARKERS) {
- jwmarker[jwmarker_num].id = J2K_MS_EPB; /* its type */
- jwmarker[jwmarker_num].m.epbmark = epb_mark; /* the EPB */
- jwmarker[jwmarker_num].pos = soc_pos + socsiz_len; /* after SIZ */
- jwmarker[jwmarker_num].dpos = (double)
- jwmarker[jwmarker_num].pos; /* first first first! */
- jwmarker[jwmarker_num].len = epb_mark->Lepb; /* its length */
- jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready */
- jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */
- jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* ready */
- jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* not ready */
- jwmarker_num++;
- }
-
- opj_event_msg(j2k->cinfo, EVT_INFO,
- "MH EPB : prot. %d\n",
- j2k->cp->hprot_MH
- );
-
- } else {
- /* ooops, problems */
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create MH EPB\n");
- };
- }
-
- /*
- EPB MSs for Tile Parts
- */
- /* cycle through TPHs */
- hprot = j2k->cp->hprot_MH; /* default spec */
- tilespec = 0; /* first tile spec */
- lastileno = 0;
- packspec = 0;
- pprot = -1;
- acc_tpno = 0;
- for (tileno = 0; tileno < j2k->cstr_info->tw * j2k->cstr_info->th; tileno++) {
-
- opj_event_msg(j2k->cinfo, EVT_INFO,
- "Tile %d has %d tile part(s)\n",
- tileno, j2k->cstr_info->tile[tileno].num_tps
- );
-
- /* for every tile part in the tile */
- for (tpno = 0; tpno < j2k->cstr_info->tile[tileno].num_tps;
- tpno++, acc_tpno++) {
-
- int sot_len, Psot, Psotp, mm, epb_index = 0, prot_len = 0;
- unsigned long sot_pos, post_sod_pos;
- unsigned long int left_THmarks_len/*, epbs_len = 0*/;
- int startpack = 0, stoppack = j2k->cstr_info->packno;
- int first_tp_pack, last_tp_pack;
- jpwl_epb_ms_t *tph_epb = NULL;
-
- /****** sot_pos = j2k->cstr_info->tile[tileno].start_pos; */
- sot_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos;
- cio_seek(cio, sot_pos + 2);
- sot_len = cio_read(cio, 2); /* SOT Len */
- cio_skip(cio, 2);
- Psotp = cio_tell(cio);
- Psot = cio_read(cio, 4); /* tile length */
-
- /* a-priori length of the data dwelling between SOT and SOD */
- /****** post_sod_pos = j2k->cstr_info->tile[tileno].end_header + 1; */
- post_sod_pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_end_header + 1;
- left_THmarks_len = post_sod_pos - (sot_pos + sot_len + 2);
-
- /* add all the lengths of the JPWL markers which are len-ready and stay within SOT and SOD */
- for (mm = 0; mm < jwmarker_num; mm++) {
- if ((jwmarker[mm].pos >= sot_pos) && (jwmarker[mm].pos < post_sod_pos)) {
- if (jwmarker[mm].len_ready) {
- left_THmarks_len += jwmarker[mm].len + 2;
- } else {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "MS %x in %f is not len-ready: could not set up TH EPB\n",
- jwmarker[mm].id, jwmarker[mm].dpos);
- exit(1);
- }
- }
- }
-
- /****** if ((tilespec < JPWL_MAX_NO_TILESPECS) && (j2k->cp->hprot_TPH_tileno[tilespec] == tileno)) */
- if ((tilespec < JPWL_MAX_NO_TILESPECS) &&
- (j2k->cp->hprot_TPH_tileno[tilespec] == acc_tpno))
- /* we got a specification from this tile part onwards */
- {
- hprot = j2k->cp->hprot_TPH[tilespec++];
- }
-
- /* must this TPH have an EPB MS? */
- if (j2k->cp->epb_on && (hprot > 0)) {
-
- /* Create the EPB */
- if ((epb_mark = jpwl_epb_create(
- j2k, /* this encoder handle */
- OPJ_FALSE, /* is it the latest? in TPH, no for now (if huge data size in TPH, we'd need more) */
- OPJ_TRUE, /* is it packed? yes for now */
- tileno, /* we are in TPH */
- epb_index++, /* its index is 0 (first) */
- hprot, /* protection type parameters of following data */
- sot_len + 2, /* pre-data length: only SOT */
- left_THmarks_len /* post-data length: from SOT end to SOD inclusive */
- ))) {
-
- /* Add this marker to the 'insertanda' list */
- if (jwmarker_num < JPWL_MAX_NO_MARKERS) {
- jwmarker[jwmarker_num].id = J2K_MS_EPB; /* its type */
- jwmarker[jwmarker_num].m.epbmark = epb_mark; /* the EPB */
- /****** jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].start_pos + sot_len + 2; */ /* after SOT */
- jwmarker[jwmarker_num].pos = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos
- + sot_len + 2; /* after SOT */
- jwmarker[jwmarker_num].dpos = (double)
- jwmarker[jwmarker_num].pos; /* first first first! */
- jwmarker[jwmarker_num].len = epb_mark->Lepb; /* its length */
- jwmarker[jwmarker_num].len_ready = OPJ_TRUE; /* ready */
- jwmarker[jwmarker_num].pos_ready = OPJ_TRUE; /* ready */
- jwmarker[jwmarker_num].parms_ready = OPJ_TRUE; /* ready */
- jwmarker[jwmarker_num].data_ready = OPJ_FALSE; /* not ready */
- jwmarker_num++;
- }
-
- /* update Psot of the tile */
- Psot += epb_mark->Lepb + 2;
-
- opj_event_msg(j2k->cinfo, EVT_INFO,
- /***** "TPH EPB : tile %02d, prot. %d\n", */
- "TPH EPB : tile %02d, part %02d, prot. %d\n",
- /***** tileno, */
- tileno, tpno,
- hprot
- );
-
- /* save this TPH EPB address */
- tph_epb = epb_mark;
-
- } else {
- /* ooops, problems */
- /****** opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH EPB #%d\n", tileno); */
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not create TPH EPB in #%d,d\n",
- tileno, tpno);
- };
-
- }
-
- startpack = 0;
- /* EPB MSs for UEP packet data protection in Tile Parts */
- /****** for (packno = 0; packno < j2k->cstr_info->num; packno++) { */
- /*first_tp_pack = (tpno > 0) ? (first_tp_pack + j2k->cstr_info->tile[tileno].tp[tpno - 1].tp_numpacks) : 0;*/
- first_tp_pack = j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pack;
- last_tp_pack = first_tp_pack + j2k->cstr_info->tile[tileno].tp[tpno].tp_numpacks
- - 1;
- for (packno = 0; packno < j2k->cstr_info->tile[tileno].tp[tpno].tp_numpacks;
- packno++) {
-
- /******** if ((packspec < JPWL_MAX_NO_PACKSPECS) &&
- (j2k->cp->pprot_tileno[packspec] == tileno) && (j2k->cp->pprot_packno[packspec] == packno)) { */
- if ((packspec < JPWL_MAX_NO_PACKSPECS) &&
- (j2k->cp->pprot_tileno[packspec] == acc_tpno) &&
- (j2k->cp->pprot_packno[packspec] == packno)) {
-
- /* we got a specification from this tile and packet onwards */
- /* print the previous spec */
- if (packno > 0) {
- stoppack = packno - 1;
- opj_event_msg(j2k->cinfo, EVT_INFO,
- /***** "UEP EPBs: tile %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", */
- "UEP EPBs: tile %02d, part %02d, packs. %02d-%02d (B %d-%d), prot. %d\n",
- /***** tileno, */
- tileno, tpno,
- startpack,
- stoppack,
- /***** j2k->cstr_info->tile[tileno].packet[startpack].start_pos, */
- j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos,
- /***** j2k->cstr_info->tile[tileno].packet[stoppack].end_pos, */
- j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos,
- pprot);
-
- /***** prot_len = j2k->cstr_info->tile[tileno].packet[stoppack].end_pos + 1 -
- j2k->cstr_info->tile[tileno].packet[startpack].start_pos; */
- prot_len = j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos
- + 1 -
- j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos;
-
- /*
- particular case: if this is the last header and the last packet,
- then it is better to protect even the EOC marker
- */
- /****** if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) &&
- (stoppack == (j2k->cstr_info->num - 1))) */
- if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) &&
- (tpno == (j2k->cstr_info->tile[tileno].num_tps - 1)) &&
- (stoppack == last_tp_pack))
- /* add the EOC len */
- {
- prot_len += 2;
- }
-
- /* let's add the EPBs */
- Psot += jpwl_epbs_add(
- j2k, /* J2K handle */
- jwmarker, /* pointer to JPWL markers list */
- &jwmarker_num, /* pointer to the number of current markers */
- OPJ_FALSE, /* latest */
- OPJ_TRUE, /* packed */
- OPJ_FALSE, /* inside MH */
- &epb_index, /* pointer to EPB index */
- pprot, /* protection type */
- /****** (double) (j2k->cstr_info->tile[tileno].start_pos + sot_len + 2) + 0.0001, */ /* position */
- (double)(j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2) +
- 0.0001, /* position */
- tileno, /* number of tile */
- 0, /* length of pre-data */
- prot_len /*4000*/ /* length of post-data */
- );
- }
-
- startpack = packno;
- pprot = j2k->cp->pprot[packspec++];
- }
-
- /*printf("Tile %02d, pack %02d ==> %d\n", tileno, packno, pprot);*/
-
- }
-
- /* we are at the end: print the remaining spec */
- stoppack = packno - 1;
- if (pprot >= 0) {
-
- opj_event_msg(j2k->cinfo, EVT_INFO,
- /**** "UEP EPBs: tile %02d, packs. %02d-%02d (B %d-%d), prot. %d\n", */
- "UEP EPBs: tile %02d, part %02d, packs. %02d-%02d (B %d-%d), prot. %d\n",
- /**** tileno, */
- tileno, tpno,
- startpack,
- stoppack,
- /***** j2k->image_info->tile[tileno].packet[startpack].start_pos,
- j2k->image_info->tile[tileno].packet[stoppack].end_pos, */
- j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos,
- j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos,
- pprot);
-
- /***** prot_len = j2k->cstr_info->tile[tileno].packet[stoppack].end_pos + 1 -
- j2k->cstr_info->tile[tileno].packet[startpack].start_pos; */
- prot_len = j2k->cstr_info->tile[tileno].packet[first_tp_pack + stoppack].end_pos
- + 1 -
- j2k->cstr_info->tile[tileno].packet[first_tp_pack + startpack].start_pos;
-
- /*
- particular case: if this is the last header and the last packet,
- then it is better to protect even the EOC marker
- */
- /***** if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) &&
- (stoppack == (j2k->cstr_info->num - 1))) */
- if ((tileno == ((j2k->cstr_info->tw * j2k->cstr_info->th) - 1)) &&
- (tpno == (j2k->cstr_info->tile[tileno].num_tps - 1)) &&
- (stoppack == last_tp_pack))
- /* add the EOC len */
- {
- prot_len += 2;
- }
-
- /* let's add the EPBs */
- Psot += jpwl_epbs_add(
- j2k, /* J2K handle */
- jwmarker, /* pointer to JPWL markers list */
- &jwmarker_num, /* pointer to the number of current markers */
- OPJ_TRUE, /* latest */
- OPJ_TRUE, /* packed */
- OPJ_FALSE, /* inside MH */
- &epb_index, /* pointer to EPB index */
- pprot, /* protection type */
- /***** (double) (j2k->cstr_info->tile[tileno].start_pos + sot_len + 2) + 0.0001,*/ /* position */
- (double)(j2k->cstr_info->tile[tileno].tp[tpno].tp_start_pos + sot_len + 2) +
- 0.0001, /* position */
- tileno, /* number of tile */
- 0, /* length of pre-data */
- prot_len /*4000*/ /* length of post-data */
- );
- }
-
- /* we can now check if the TPH EPB was really the last one */
- if (tph_epb && (epb_index == 1)) {
- /* set the TPH EPB to be the last one in current header */
- tph_epb->Depb |= (unsigned char)((OPJ_TRUE & 0x0001) << 6);
- tph_epb = NULL;
- }
-
- /* write back Psot */
- cio_seek(cio, Psotp);
- cio_write(cio, Psot, 4);
-
- }
-
- };
-
- /* reset the position */
- cio_seek(cio, ciopos);
-
-}
-
-void jpwl_dump_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image)
-{
-
- int mm;
- unsigned long int old_size = j2k->cstr_info->codestream_size;
- unsigned long int new_size = old_size;
- int /*ciopos = cio_tell(cio),*/ soc_pos = j2k->cstr_info->main_head_start;
- unsigned char *jpwl_buf, *orig_buf;
- unsigned long int orig_pos;
- double epbcoding_time = 0.0, esdcoding_time = 0.0;
- (void)image;
-
- /* Order JPWL markers according to their wishlist position */
- qsort((void *) jwmarker, (size_t) jwmarker_num, sizeof(jpwl_marker_t),
- jpwl_markcomp);
-
- /* compute markers total size */
- for (mm = 0; mm < jwmarker_num; mm++) {
- /*printf("%x, %d, %.10f, %d long\n", jwmarker[mm].id, jwmarker[mm].pos,
- jwmarker[mm].dpos, jwmarker[mm].len);*/
- new_size += jwmarker[mm].len + 2;
- }
-
- /* allocate a new buffer of proper size */
- if (!(jpwl_buf = (unsigned char *) opj_malloc((size_t)(new_size + soc_pos) *
- sizeof(unsigned char)))) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "Could not allocate room for JPWL codestream buffer\n");
- exit(1);
- };
-
- /* copy the jp2 part, if any */
- orig_buf = jpwl_buf;
- memcpy(jpwl_buf, cio->buffer, soc_pos);
- jpwl_buf += soc_pos;
-
- /* cycle through markers */
- orig_pos = soc_pos + 0; /* start from the beginning */
- cio_seek(cio, soc_pos + 0); /* rewind the original */
- for (mm = 0; mm < jwmarker_num; mm++) {
-
- /*
- need to copy a piece of the original codestream
- if there is such
- */
- memcpy(jpwl_buf, cio_getbp(cio), jwmarker[mm].pos - orig_pos);
- jpwl_buf += jwmarker[mm].pos - orig_pos;
- orig_pos = jwmarker[mm].pos;
- cio_seek(cio, orig_pos);
-
- /*
- then write down the marker
- */
- switch (jwmarker[mm].id) {
-
- case J2K_MS_EPB:
- jpwl_epb_write(j2k, jwmarker[mm].m.epbmark, jpwl_buf);
- break;
-
- case J2K_MS_EPC:
- jpwl_epc_write(j2k, jwmarker[mm].m.epcmark, jpwl_buf);
- break;
-
- case J2K_MS_ESD:
- jpwl_esd_write(j2k, jwmarker[mm].m.esdmark, jpwl_buf);
- break;
-
- case J2K_MS_RED:
- memset(jpwl_buf, 0, jwmarker[mm].len + 2); /* placeholder */
- break;
-
- default:
- break;
- };
-
- /* we update the markers struct */
- if (j2k->cstr_info) {
- j2k->cstr_info->marker[j2k->cstr_info->marknum - 1].pos =
- (jpwl_buf - orig_buf);
- }
-
- /* we set the marker dpos to the new position in the JPWL codestream */
- jwmarker[mm].dpos = (double)(jpwl_buf - orig_buf);
-
- /* advance JPWL buffer position */
- jpwl_buf += jwmarker[mm].len + 2;
-
- }
-
- /* finish remaining original codestream */
- memcpy(jpwl_buf, cio_getbp(cio), old_size - (orig_pos - soc_pos));
- jpwl_buf += old_size - (orig_pos - soc_pos);
- cio_seek(cio, soc_pos + old_size);
-
- /*
- update info file based on added markers
- */
- if (!jpwl_update_info(j2k, jwmarker, jwmarker_num)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "Could not update OPJ cstr_info structure\n");
- }
-
- /* now we need to repass some markers and fill their data fields */
-
- /* first of all, DL and Pcrc in EPCs */
- for (mm = 0; mm < jwmarker_num; mm++) {
-
- /* find the EPCs */
- if (jwmarker[mm].id == J2K_MS_EPC) {
-
- int epc_pos = (int) jwmarker[mm].dpos, pp;
- unsigned short int mycrc = 0x0000;
-
- /* fix and fill the DL field */
- jwmarker[mm].m.epcmark->DL = new_size;
- orig_buf[epc_pos + 6] = (unsigned char)(jwmarker[mm].m.epcmark->DL >> 24);
- orig_buf[epc_pos + 7] = (unsigned char)(jwmarker[mm].m.epcmark->DL >> 16);
- orig_buf[epc_pos + 8] = (unsigned char)(jwmarker[mm].m.epcmark->DL >> 8);
- orig_buf[epc_pos + 9] = (unsigned char)(jwmarker[mm].m.epcmark->DL >> 0);
-
- /* compute the CRC field (excluding itself) */
- for (pp = 0; pp < 4; pp++) {
- jpwl_updateCRC16(&mycrc, orig_buf[epc_pos + pp]);
- }
- for (pp = 6; pp < (jwmarker[mm].len + 2); pp++) {
- jpwl_updateCRC16(&mycrc, orig_buf[epc_pos + pp]);
- }
-
- /* fix and fill the CRC */
- jwmarker[mm].m.epcmark->Pcrc = mycrc;
- orig_buf[epc_pos + 4] = (unsigned char)(jwmarker[mm].m.epcmark->Pcrc >> 8);
- orig_buf[epc_pos + 5] = (unsigned char)(jwmarker[mm].m.epcmark->Pcrc >> 0);
-
- }
- }
-
- /* then, sensitivity data in ESDs */
- esdcoding_time = opj_clock();
- for (mm = 0; mm < jwmarker_num; mm++) {
-
- /* find the ESDs */
- if (jwmarker[mm].id == J2K_MS_ESD) {
-
- /* remember that they are now in a new position (dpos) */
- int esd_pos = (int) jwmarker[mm].dpos;
-
- jpwl_esd_fill(j2k, jwmarker[mm].m.esdmark, &orig_buf[esd_pos]);
-
- }
-
- }
- esdcoding_time = opj_clock() - esdcoding_time;
- if (j2k->cp->esd_on) {
- opj_event_msg(j2k->cinfo, EVT_INFO, "ESDs sensitivities computed in %f s\n",
- esdcoding_time);
- }
-
- /* finally, RS or CRC parity in EPBs */
- epbcoding_time = opj_clock();
- for (mm = 0; mm < jwmarker_num; mm++) {
-
- /* find the EPBs */
- if (jwmarker[mm].id == J2K_MS_EPB) {
-
- /* remember that they are now in a new position (dpos) */
- int nn, accum_len;
-
- /* let's see how many EPBs are following this one, included itself */
- /* for this to work, we suppose that the markers are correctly ordered */
- /* and, overall, that they are in packed mode inside headers */
- accum_len = 0;
- for (nn = mm; (nn < jwmarker_num) && (jwmarker[nn].id == J2K_MS_EPB) &&
- (jwmarker[nn].pos == jwmarker[mm].pos); nn++) {
- accum_len += jwmarker[nn].m.epbmark->Lepb + 2;
- }
-
- /* fill the current (first) EPB with post-data starting from the computed position */
- jpwl_epb_fill(j2k, jwmarker[mm].m.epbmark, &orig_buf[(int) jwmarker[mm].dpos],
- &orig_buf[(int) jwmarker[mm].dpos + accum_len]);
-
- /* fill the remaining EPBs in the header with post-data starting from the last position */
- for (nn = mm + 1; (nn < jwmarker_num) && (jwmarker[nn].id == J2K_MS_EPB) &&
- (jwmarker[nn].pos == jwmarker[mm].pos); nn++) {
- jpwl_epb_fill(j2k, jwmarker[nn].m.epbmark, &orig_buf[(int) jwmarker[nn].dpos],
- NULL);
- }
-
- /* skip all the processed EPBs */
- mm = nn - 1;
- }
-
- }
- epbcoding_time = opj_clock() - epbcoding_time;
- if (j2k->cp->epb_on) {
- opj_event_msg(j2k->cinfo, EVT_INFO, "EPBs redundancy computed in %f s\n",
- epbcoding_time);
- }
-
- /* free original cio buffer and set it to the JPWL one */
- opj_free(cio->buffer);
- cio->cinfo = cio->cinfo; /* no change */
- cio->openmode = cio->openmode; /* no change */
- cio->buffer = orig_buf;
- cio->length = new_size + soc_pos;
- cio->start = cio->buffer;
- cio->end = cio->buffer + cio->length;
- cio->bp = cio->buffer;
- cio_seek(cio, soc_pos + new_size);
-
-}
-
-
-void j2k_read_epc(opj_j2k_t *j2k)
-{
- unsigned long int DL, Lepcp, Pcrcp, l;
- unsigned short int Lepc, Pcrc = 0x0000;
- unsigned char Pepc;
- opj_cio_t *cio = j2k->cio;
- const char *ans1;
-
- /* Simply read the EPC parameters */
- Lepcp = cio_tell(cio);
- Lepc = cio_read(cio, 2);
- Pcrcp = cio_tell(cio);
- cio_skip(cio, 2); /* Pcrc */
- DL = cio_read(cio, 4);
- Pepc = cio_read(cio, 1);
-
- /* compute Pcrc */
- cio_seek(cio, Lepcp - 2);
-
- /* Marker */
- jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1));
- jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1));
-
- /* Length */
- jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1));
- jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1));
-
- /* skip Pcrc */
- cio_skip(cio, 2);
-
- /* read all remaining */
- for (l = 4; l < Lepc; l++) {
- jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1));
- }
-
- /* check Pcrc with the result */
- cio_seek(cio, Pcrcp);
- ans1 = (Pcrc == (unsigned short int) cio_read(cio, 2)) ? "crc-ok" : "crc-ko";
-
- /* now we write them to screen */
- opj_event_msg(j2k->cinfo, EVT_INFO,
- "EPC(%u,%d): %s, DL=%d%s %s %s\n",
- Lepcp - 2,
- Lepc,
- ans1,
- DL, /* data length this EPC is referring to */
- (Pepc & 0x10) ? ", esd" : "", /* ESD is present */
- (Pepc & 0x20) ? ", red" : "", /* RED is present */
- (Pepc & 0x40) ? ", epb" : ""); /* EPB is present */
-
- cio_seek(cio, Lepcp + Lepc);
-}
-
-#if 0
-void j2k_write_epc(opj_j2k_t *j2k)
-{
-
- unsigned long int DL, Lepcp, Pcrcp, l;
- unsigned short int Lepc, Pcrc;
- unsigned char Pepc;
-
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, J2K_MS_EPC, 2); /* EPC */
- Lepcp = cio_tell(cio);
- cio_skip(cio, 2);
-
- /* CRC-16 word of the EPC */
- Pcrc = 0x0000; /* initialize */
- Pcrcp = cio_tell(cio);
- cio_write(cio, Pcrc, 2); /* Pcrc placeholder*/
-
- /* data length of the EPC protection domain */
- DL = 0x00000000; /* we leave this set to 0, as if the information is not available */
- cio_write(cio, DL, 4); /* DL */
-
- /* jpwl capabilities */
- Pepc = 0x00;
- cio_write(cio, Pepc, 1); /* Pepc */
-
- /* ID section */
- /* no ID's, as of now */
-
- Lepc = (unsigned short)(cio_tell(cio) - Lepcp);
- cio_seek(cio, Lepcp);
- cio_write(cio, Lepc, 2); /* Lepc */
-
- /* compute Pcrc */
- cio_seek(cio, Lepcp - 2);
-
- /* Marker */
- jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1));
- jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1));
-
- /* Length */
- jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1));
- jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1));
-
- /* skip Pcrc */
- cio_skip(cio, 2);
-
- /* read all remaining */
- for (l = 4; l < Lepc; l++) {
- jpwl_updateCRC16(&Pcrc, (unsigned char) cio_read(cio, 1));
- }
-
- /* fill Pcrc with the result */
- cio_seek(cio, Pcrcp);
- cio_write(cio, Pcrc, 2);
-
- cio_seek(cio, Lepcp + Lepc);
-
- /* marker struct update */
- j2k_add_marker(j2k->cstr_info, J2K_MS_EPC, Lepcp - 2, Lepc + 2);
-
-}
-#endif
-
-void j2k_read_epb(opj_j2k_t *j2k)
-{
- unsigned long int LDPepb, Pepb;
- unsigned short int Lepb;
- unsigned char Depb;
- char str1[25] = "";
- opj_bool status;
- static opj_bool first_in_tph = OPJ_TRUE;
- int type, pre_len, post_len;
- static unsigned char *redund = NULL;
-
- opj_cio_t *cio = j2k->cio;
-
- /* B/W = 45, RGB = 51 */
- /* SIZ SIZ_FIELDS SIZ_COMPS FOLLOWING_MARKER */
- int skipnum = 2 + 38 + 3 * j2k->cp->exp_comps + 2;
-
- if (j2k->cp->correct) {
-
- /* go back to EPB marker value */
- cio_seek(cio, cio_tell(cio) - 2);
-
- /* we need to understand where we are */
- if (j2k->state == J2K_STATE_MH) {
- /* we are in MH */
- type = 0; /* MH */
- pre_len = skipnum; /* SOC+SIZ */
- post_len = -1; /* auto */
-
- } else if ((j2k->state == J2K_STATE_TPH) && first_in_tph) {
- /* we are in TPH */
- type = 1; /* TPH */
- pre_len = 12; /* SOC+SIZ */
- first_in_tph = OPJ_FALSE;
- post_len = -1; /* auto */
-
- } else {
- /* we are elsewhere */
- type = 2; /* other */
- pre_len = 0; /* nada */
- post_len = -1; /* auto */
-
- }
-
- /* call EPB corrector */
- /*printf("before %x, ", redund);*/
- status = jpwl_epb_correct(j2k, /* J2K decompressor handle */
- cio->bp, /* pointer to EPB in codestream buffer */
- type, /* EPB type: MH */
- pre_len, /* length of pre-data */
- post_len, /* length of post-data: -1 means auto */
- NULL, /* do everything auto */
- &redund
- );
- /*printf("after %x\n", redund);*/
-
- /* Read the (possibly corrected) EPB parameters */
- cio_skip(cio, 2);
- Lepb = cio_read(cio, 2);
- Depb = cio_read(cio, 1);
- LDPepb = cio_read(cio, 4);
- Pepb = cio_read(cio, 4);
-
- if (!status) {
-
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL correction could not be performed\n");
-
- /* advance to EPB endpoint */
- cio_skip(cio, Lepb + 2);
-
- return;
- }
-
- /* last in current header? */
- if (Depb & 0x40) {
- redund = NULL; /* reset the pointer to L4 buffer */
- first_in_tph = OPJ_TRUE;
- }
-
- /* advance to EPB endpoint */
- cio_skip(cio, Lepb - 11);
-
- } else {
-
- /* Simply read the EPB parameters */
- Lepb = cio_read(cio, 2);
- Depb = cio_read(cio, 1);
- LDPepb = cio_read(cio, 4);
- Pepb = cio_read(cio, 4);
-
- /* What does Pepb tells us about the protection method? */
- if (((Pepb & 0xF0000000) >> 28) == 0) {
- sprintf(str1, "pred"); /* predefined */
- } else if (((Pepb & 0xF0000000) >> 28) == 1) {
- sprintf(str1, "crc-%lu", 16 * ((Pepb & 0x00000001) + 1)); /* CRC mode */
- } else if (((Pepb & 0xF0000000) >> 28) == 2) {
- sprintf(str1, "rs(%lu,32)", (Pepb & 0x0000FF00) >> 8); /* RS mode */
- } else if (Pepb == 0xFFFFFFFF) {
- sprintf(str1, "nometh"); /* RS mode */
- } else {
- sprintf(str1, "unknown"); /* unknown */
- }
-
- /* Now we write them to screen */
- opj_event_msg(j2k->cinfo, EVT_INFO,
- "EPB(%d): (%sl, %sp, %u), %lu, %s\n",
- cio_tell(cio) - 13,
- (Depb & 0x40) ? "" : "n", /* latest EPB or not? */
- (Depb & 0x80) ? "" : "n", /* packed or unpacked EPB? */
- (Depb & 0x3F), /* EPB index value */
- LDPepb, /*length of the data protected by the EPB */
- str1); /* protection method */
-
- cio_skip(cio, Lepb - 11);
- }
-}
-
-void j2k_write_epb(opj_j2k_t *j2k)
-{
- unsigned long int LDPepb, Pepb, Lepbp;
- unsigned short int Lepb;
- unsigned char Depb;
-
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, J2K_MS_EPB, 2); /* EPB */
- Lepbp = cio_tell(cio);
- cio_skip(cio, 2);
-
- /* EPB style */
- Depb = 0x00; /* test */
- cio_write(cio, Depb, 1); /* Depb */
-
- /* length of the data to be protected by this EPB */
- LDPepb = 0x00000000; /* test */
- cio_write(cio, LDPepb, 4); /* LDPepb */
-
- /* next error correction tool */
- Pepb = 0x00000000; /* test */
- cio_write(cio, Pepb, 4); /* Pepb */
-
- /* EPB data */
- /* no data, as of now */
-
- Lepb = (unsigned short)(cio_tell(cio) - Lepbp);
- cio_seek(cio, Lepbp);
- cio_write(cio, Lepb, 2); /* Lepb */
-
- cio_seek(cio, Lepbp + Lepb);
-
- /* marker struct update */
- j2k_add_marker(j2k->cstr_info, J2K_MS_EPB, Lepbp - 2, Lepb + 2);
-}
-
-void j2k_read_esd(opj_j2k_t *j2k)
-{
- unsigned short int Lesd, Cesd;
- unsigned char Pesd;
-
- int cesdsize = (j2k->image->numcomps >= 257) ? 2 : 1;
-
- char str1[4][4] = {"p", "br", "pr", "res"};
- char str2[8][8] = {"res", "mse", "mse-r", "psnr", "psnr-i", "maxerr", "tse", "res"};
-
- opj_cio_t *cio = j2k->cio;
-
- /* Simply read the ESD parameters */
- Lesd = cio_read(cio, 2);
- Cesd = cio_read(cio, cesdsize);
- Pesd = cio_read(cio, 1);
-
- /* Now we write them to screen */
- opj_event_msg(j2k->cinfo, EVT_INFO,
- "ESD(%d): c%d, %s, %s, %s, %s, %s\n",
- cio_tell(cio) - (5 + cesdsize),
- Cesd, /* component number for this ESD */
- str1[(Pesd & (unsigned char) 0xC0) >> 6], /* addressing mode */
- str2[(Pesd & (unsigned char) 0x38) >> 3], /* sensitivity type */
- ((Pesd & (unsigned char) 0x04) >> 2) ? "2Bs" : "1Bs",
- ((Pesd & (unsigned char) 0x02) >> 1) ? "4Ba" : "2Ba",
- (Pesd & (unsigned char) 0x01) ? "avgc" : "");
-
- cio_skip(cio, Lesd - (3 + cesdsize));
-}
-
-void j2k_read_red(opj_j2k_t *j2k)
-{
- unsigned short int Lred;
- unsigned char Pred;
- char str1[4][4] = {"p", "br", "pr", "res"};
-
- opj_cio_t *cio = j2k->cio;
-
- /* Simply read the RED parameters */
- Lred = cio_read(cio, 2);
- Pred = cio_read(cio, 1);
-
- /* Now we write them to screen */
- opj_event_msg(j2k->cinfo, EVT_INFO,
- "RED(%d): %s, %dc, %s, %s\n",
- cio_tell(cio) - 5,
- str1[(Pred & (unsigned char) 0xC0) >> 6], /* addressing mode */
- (Pred & (unsigned char) 0x38) >> 3, /* corruption level */
- ((Pred & (unsigned char) 0x02) >> 1) ? "4Ba" : "2Ba", /* address range */
- (Pred & (unsigned char) 0x01) ? "errs" : "free"); /* error free? */
-
- cio_skip(cio, Lred - 3);
-}
-
-opj_bool jpwl_check_tile(opj_j2k_t *j2k, opj_tcd_t *tcd, int tileno)
-{
-
-#ifdef oerhgierhgvhreit4u
- /*
- we navigate through the tile and find possible invalid parameters:
- this saves a lot of crashes!!!!!
- */
- int compno, resno, precno, /*layno,*/ bandno, blockno;
- int numprecincts, numblocks;
-
- /* this is the selected tile */
- opj_tcd_tile_t *tile = &(tcd->tcd_image->tiles[tileno]);
-
- /* will keep the component */
- opj_tcd_tilecomp_t *comp = NULL;
-
- /* will keep the resolution */
- opj_tcd_resolution_t *res;
-
- /* will keep the subband */
- opj_tcd_band_t *band;
-
- /* will keep the precinct */
- opj_tcd_precinct_t *prec;
-
- /* will keep the codeblock */
- opj_tcd_cblk_t *block;
-
- /* check all tile components */
- for (compno = 0; compno < tile->numcomps; compno++) {
- comp = &(tile->comps[compno]);
-
- /* check all component resolutions */
- for (resno = 0; resno < comp->numresolutions; resno++) {
- res = &(comp->resolutions[resno]);
- numprecincts = res->pw * res->ph;
-
- /* check all the subbands */
- for (bandno = 0; bandno < res->numbands; bandno++) {
- band = &(res->bands[bandno]);
-
- /* check all the precincts */
- for (precno = 0; precno < numprecincts; precno++) {
- prec = &(band->precincts[precno]);
- numblocks = prec->ch * prec->cw;
-
- /* check all the codeblocks */
- for (blockno = 0; blockno < numblocks; blockno++) {
- block = &(prec->cblks[blockno]);
-
- /* x-origin is invalid */
- if ((block->x0 < prec->x0) || (block->x0 > prec->x1)) {
- opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
- "JPWL: wrong x-cord of block origin %d => x-prec is (%d, %d)\n",
- block->x0, prec->x0, prec->x1);
- if (!JPWL_ASSUME) {
- return OPJ_FALSE;
- }
- };
- }
- }
- }
- }
- }
-
-#else
- (void)j2k;
- (void)tcd;
- (void)tileno;
-#endif
-
- return OPJ_TRUE;
-}
-
-/*@}*/
-
-#endif /* USE_JPWL */
-
-
-#ifdef USE_JPSEC
-
-/** @defgroup JPSEC JPSEC - JPEG-2000 Part 8 (JPSEC) codestream manager */
-/*@{*/
-
-
-/** @name Local static functions */
-/*@{*/
-
-void j2k_read_sec(opj_j2k_t *j2k)
-{
- unsigned short int Lsec;
-
- opj_cio_t *cio = j2k->cio;
-
- /* Simply read the SEC length */
- Lsec = cio_read(cio, 2);
-
- /* Now we write them to screen */
- opj_event_msg(j2k->cinfo, EVT_INFO,
- "SEC(%d)\n",
- cio_tell(cio) - 2
- );
-
- cio_skip(cio, Lsec - 2);
-}
-
-void j2k_write_sec(opj_j2k_t *j2k)
-{
- unsigned short int Lsec = 24;
- int i;
-
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, J2K_MS_SEC, 2); /* SEC */
- cio_write(cio, Lsec, 2);
-
- /* write dummy data */
- for (i = 0; i < Lsec - 2; i++) {
- cio_write(cio, 0, 1);
- }
-}
-
-void j2k_read_insec(opj_j2k_t *j2k)
-{
- unsigned short int Linsec;
-
- opj_cio_t *cio = j2k->cio;
-
- /* Simply read the INSEC length */
- Linsec = cio_read(cio, 2);
-
- /* Now we write them to screen */
- opj_event_msg(j2k->cinfo, EVT_INFO,
- "INSEC(%d)\n",
- cio_tell(cio) - 2
- );
-
- cio_skip(cio, Linsec - 2);
-}
-
-
-/*@}*/
-
-/*@}*/
-
-#endif /* USE_JPSEC */
-
+++ /dev/null
-/*
- * 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy
- * 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 __JPWL_H
-#define __JPWL_H
-
-#ifdef USE_JPWL
-
-#include "crc.h"
-#include "rs.h"
-
-/**
-@file jpwl.h
-@brief The JPEG-2000 Part11 (JPWL) marker segments manager
-
-The functions in JPWL.C have for goal to read/write the markers added by JPWL.
-*/
-
-/** @defgroup JPWL JPWL - JPEG-2000 Part11 (JPWL) codestream manager */
-/*@{*/
-
-/**
-Assume a basic codestream structure, so you can resort better from uncorrected errors
-*/
-#define JPWL_ASSUME OPJ_TRUE
-
-/**
-EPB (Error Protection Block) Marker segment
-*/
-typedef struct jpwl_epb_ms {
- /**@name Private fields set by epb_create */
- /*@{*/
- /** is the latest in header? */
- opj_bool latest;
- /** is it in packed mode? */
- opj_bool packed;
- /** TH where this marker has been placed (-1 means MH) */
- int tileno;
- /** index in current header (0-63) */
- unsigned char index;
- /** error protection method [-1=absent 0=none 1=predefined 16=CRC-16 32=CRC-32 37-128=RS] */
- int hprot;
- /** message word length of pre-data */
- int k_pre;
- /** code word length of pre-data */
- int n_pre;
- /** length of pre-data */
- int pre_len;
- /** message word length of post-data */
- int k_post;
- /** code word length of post-data */
- int n_post;
- /** length of post-data */
- int post_len;
- /*@}*/
- /**@name Marker segment fields */
- /*@{*/
- /** two bytes for the length of EPB MS, exluding the marker itself (11 to 65535 bytes) */
- unsigned short int Lepb;
- /** single byte for the style */
- unsigned char Depb;
- /** four bytes, from 0 to 2^31-1 */
- unsigned long int LDPepb;
- /** four bytes, next error management method */
- unsigned long int Pepb;
- /** EPB data, variable size */
- unsigned char *data;
- /*@}*/
-} jpwl_epb_ms_t;
-
-/**
-EPC (Error Protection Capability) Marker segment
-*/
-typedef struct jpwl_epc_ms {
- /** is ESD active? */
- opj_bool esd_on;
- /** is RED active? */
- opj_bool red_on;
- /** is EPB active? */
- opj_bool epb_on;
- /** are informative techniques active? */
- opj_bool info_on;
- /**@name Marker segment fields */
- /*@{*/
- /** two bytes for the length of EPC MS, exluding the marker itself (9 to 65535 bytes) */
- unsigned short int Lepc;
- /** two bytes, CRC for the EPC, excluding Pcrc itself */
- unsigned short int Pcrc;
- /** four bytes, the codestream length from SOC to EOC */
- unsigned long int DL;
- /** one byte, signals JPWL techniques adoption */
- unsigned char Pepc;
- /** EPC data, variable length */
- unsigned char *data;
- /*@}*/
-} jpwl_epc_ms_t;
-
-/**
-ESD (Error Sensitivity Descriptor) Marker segment
-*/
-typedef struct jpwl_esd_ms {
- /** codestream addressing mode [0=packet, 1=byte range, 2=packet range, 3=reserved] */
- unsigned char addrm;
- /** size of codestream addresses [2/4 bytes] */
- unsigned char ad_size;
- /** type of sensitivity
- [0=relative error, 1=MSE, 2=MSE reduction, 3=PSNR, 4=PSNR increment,
- 5=MAXERR (absolute peak error), 6=TSE (total squared error), 7=reserved */
- unsigned char senst;
- /** size of sensitivity data (1/2 bytes) */
- unsigned char se_size;
- /**@name Marker segment fields */
- /*@{*/
- /** two bytes for the length of ESD MS, exluding the marker itself (4 to 65535 bytes) */
- unsigned short int Lesd;
- /** two bytes, component of error sensitivity */
- unsigned short int Cesd;
- /** one byte, signals JPWL techniques adoption */
- unsigned char Pesd;
- /** ESD data, variable length */
- unsigned char *data;
- /*@}*/
- /**@name Fields set by esd_create (only internal use) */
- /*@{*/
- /** number of components in the image */
- int numcomps;
- /** tile where this marker has been placed (-1 means MH) */
- int tileno;
- /** number of sensitivity values */
- unsigned long int svalnum;
- /** size of a single sensitivity pair (address+value) */
- size_t sensval_size;
- /*@}*/
-} jpwl_esd_ms_t;
-
-/**
-RED (Residual Error Descriptor) Marker segment
-*/
-typedef struct jpwl_red_ms {
- /** two bytes for the length of RED MS, exluding the marker itself (3 to 65535 bytes) */
- unsigned short int Lred;
- /** one byte, signals JPWL techniques adoption */
- unsigned char Pred;
- /** RED data, variable length */
- unsigned char *data;
-} jpwl_red_ms_t;
-
-/**
-Structure used to store JPWL markers temporary position and readyness
-*/
-typedef struct jpwl_marker {
- /** marker value (J2K_MS_EPC, etc.) */
- int id;
- /** union keeping the pointer to the real marker struct */
- union jpwl_marks {
- /** pointer to EPB marker */
- jpwl_epb_ms_t *epbmark;
- /** pointer to EPC marker */
- jpwl_epc_ms_t *epcmark;
- /** pointer to ESD marker */
- jpwl_esd_ms_t *esdmark;
- /** pointer to RED marker */
- jpwl_red_ms_t *redmark;
- } m;
- /** position where the marker should go, in the pre-JPWL codestream */
- unsigned long int pos;
- /** same as before, only written as a double, so we can sort it better */
- double dpos;
- /** length of the marker segment (marker excluded) */
- unsigned short int len;
- /** the marker length is ready or not? */
- opj_bool len_ready;
- /** the marker position is ready or not? */
- opj_bool pos_ready;
- /** the marker parameters are ready or not? */
- opj_bool parms_ready;
- /** are the written data ready or not */
- opj_bool data_ready;
-} jpwl_marker_t;
-
-/**
-Encode according to JPWL specs
-@param j2k J2K handle
-@param cio codestream handle
-@param image image handle
-*/
-void jpwl_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image);
-
-/**
-Prepare the list of JPWL markers, after the Part 1 codestream
-has been finalized (index struct is full)
-@param j2k J2K handle
-@param cio codestream handle
-@param image image handle
-*/
-void jpwl_prepare_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image);
-
-/**
-Dump the list of JPWL markers, after it has been prepared
-@param j2k J2K handle
-@param cio codestream handle
-@param image image handle
-*/
-void jpwl_dump_marks(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image);
-
-/**
-Read the EPC marker (Error Protection Capability)
-@param j2k J2K handle
-*/
-void j2k_read_epc(opj_j2k_t *j2k);
-
-/**
-Write the EPC marker (Error Protection Capability), BUT the DL field is always set to 0
-(this simplifies the management of EPBs and it is openly stated in the standard
-as a possible value, mening that the information is not available) and the informative techniques
-are not yet implemented
-@param j2k J2K handle
-*/
-#if 0
-void j2k_write_epc(opj_j2k_t *j2k);
-#endif
-
-/**
-Read the EPB marker (Error Protection Block)
-@param j2k J2K handle
-*/
-void j2k_read_epb(opj_j2k_t *j2k);
-
-/**
-Write the EPB marker (Error Protection Block)
-@param j2k J2K handle
-*/
-void j2k_write_epb(opj_j2k_t *j2k);
-
-/**
-Read the ESD marker (Error Sensitivity Descriptor)
-@param j2k J2K handle
-*/
-void j2k_read_esd(opj_j2k_t *j2k);
-
-/**
-Read the RED marker (Residual Error Descriptor)
-@param j2k J2K handle
-*/
-void j2k_read_red(opj_j2k_t *j2k);
-
-/** create an EPB marker segment
-@param j2k J2K compressor handle
-@param latest it is the latest EPB in the header
-@param packed EPB is in packed style
-@param tileno tile number where the marker has been placed (-1 means MH)
-@param idx current EPB running index
-@param hprot applied protection type (-1/0,1,16,32,37-128)
-@param pre_len length of pre-protected data
-@param post_len length of post-protected data
-@return returns the freshly created EPB
-*/
-jpwl_epb_ms_t *jpwl_epb_create(opj_j2k_t *j2k, opj_bool latest, opj_bool packed,
- int tileno, int idx, int hprot,
- unsigned long int pre_len, unsigned long int post_len);
-
-/** add a number of EPB marker segments
-@param j2k J2K compressor handle
-@param jwmarker pointer to the JPWL markers list
-@param jwmarker_num pointer to the number of JPWL markers (gets updated)
-@param latest it is the latest group of EPBs in the header
-@param packed EPBs are in packed style
-@param insideMH it is in the MH
-@param idx pointer to the starting EPB running index (gets updated)
-@param hprot applied protection type (-1/0,1,16,32,37-128)
-@param place_pos place in original codestream where EPBs should go
-@param tileno tile number of these EPBs
-@param pre_len length of pre-protected data
-@param post_len length of post-protected data
-@return returns the length of all added markers
-*/
-int jpwl_epbs_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num,
- opj_bool latest, opj_bool packed, opj_bool insideMH, int *idx, int hprot,
- double place_pos, int tileno,
- unsigned long int pre_len, unsigned long int post_len);
-
-/** add a number of ESD marker segments
-@param j2k J2K compressor handle
-@param jwmarker pointer to the JPWL markers list
-@param jwmarker_num pointer to the number of JPWL markers (gets updated)
-@param comps considered component (-1=average, 0/1/2/...=component no.)
-@param addrm addressing mode (0=packet, 1=byte range, 2=packet range, 3=reserved)
-@param ad_size size of addresses (2/4 bytes)
-@param senst sensitivity type
-@param se_size sensitivity values size (1/2 bytes)
-@param place_pos place in original codestream where EPBs should go
-@param tileno tile number of these EPBs
-@return returns the length of all added markers
-*/
-int jpwl_esds_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num,
- int comps, unsigned char addrm, unsigned char ad_size,
- unsigned char senst, unsigned char se_size,
- double place_pos, int tileno);
-
-/** updates the information structure by modifying the positions and lengths
-@param j2k J2K compressor handle
-@param jwmarker pointer to JPWL markers list
-@param jwmarker_num number of JPWL markers
-@return returns true in case of success
-*/
-opj_bool jpwl_update_info(opj_j2k_t *j2k, jpwl_marker_t *jwmarker,
- int jwmarker_num);
-
-
-opj_bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esdmark,
- unsigned char *buf);
-
-opj_bool jpwl_epb_fill(opj_j2k_t *j2k, jpwl_epb_ms_t *epbmark,
- unsigned char *buf, unsigned char *post_buf);
-
-opj_bool j2k_add_marker(opj_codestream_info_t *cstr_info,
- unsigned short int type, int pos, int len);
-
-/** corrects the data in the JPWL codestream
-@param j2k J2K compressor handle
-@return true if correction is performed correctly
-*/
-opj_bool jpwl_correct(opj_j2k_t *j2k);
-
-/** corrects the data protected by an EPB
-@param j2k J2K compressor handle
-@param buffer pointer to the EPB position
-@param type type of EPB: 0=MH, 1=TPH, 2=other, 3=auto
-@param pre_len length of pre-data
-@param post_len length of post_data
-@param conn is a pointer to the length of all connected (packed) EPBs
-@param L4_bufp is a pointer to the buffer pointer of redundancy data
-@return returns true if correction could be successfully performed
-*/
-opj_bool jpwl_epb_correct(opj_j2k_t *j2k, unsigned char *buffer, int type,
- int pre_len, int post_len, int *conn,
- unsigned char **L4_bufp);
-
-/** check that a tile and its children have valid data
-@param j2k J2K decompressor handle
-@param tcd Tile decompressor handle
-@param tileno number of the tile to check
-*/
-opj_bool jpwl_check_tile(opj_j2k_t *j2k, opj_tcd_t *tcd, int tileno);
-
-/** Macro functions for CRC computation */
-
-/**
-Computes the CRC-16, as stated in JPWL specs
-@param CRC two bytes containing the CRC value (must be initialized with 0x0000)
-@param DATA byte for which the CRC is computed; call this on every byte of the sequence
-and get the CRC at the end
-*/
-#define jpwl_updateCRC16(CRC, DATA) updateCRC16(CRC, DATA)
-
-/**
-Computes the CRC-32, as stated in JPWL specs
-@param CRC four bytes containing the CRC value (must be initialized with 0x00000000)
-@param DATA byte for which the CRC is computed; call this on every byte of the sequence
-and get the CRC at the end
-*/
-#define jpwl_updateCRC32(CRC, DATA) updateCRC32(CRC, DATA)
-
-/**
-Computes the minimum between two integers
-@param a first integer to compare
-@param b second integer to compare
-@return returns the minimum integer between a and b
-*/
-#ifndef min
-#define min(a,b) (((a) < (b)) ? (a) : (b))
-#endif /* min */
-
-/*@}*/
-
-#endif /* USE_JPWL */
-
-#ifdef USE_JPSEC
-
-/** @defgroup JPSEC JPSEC - JPEG-2000 Part 8 (JPSEC) codestream manager */
-/*@{*/
-
-/**
-Read the SEC marker (SEcured Codestream)
-@param j2k J2K handle
-*/
-void j2k_read_sec(opj_j2k_t *j2k);
-
-/**
-Write the SEC marker (SEcured Codestream)
-@param j2k J2K handle
-*/
-void j2k_write_sec(opj_j2k_t *j2k);
-
-/**
-Read the INSEC marker (SEcured Codestream)
-@param j2k J2K handle
-*/
-void j2k_read_insec(opj_j2k_t *j2k);
-
-/*@}*/
-
-#endif /* USE_JPSEC */
-
-#endif /* __JPWL_H */
-
+++ /dev/null
-/*
- * 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy
- * 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.
- */
-
-#ifdef USE_JPWL
-
-#include "opj_includes.h"
-#include <limits.h>
-
-/** Minimum and maximum values for the double->pfp conversion */
-#define MIN_V1 0.0
-#define MAX_V1 17293822569102704640.0
-#define MIN_V2 0.000030517578125
-#define MAX_V2 131040.0
-
-/** conversion between a double precision floating point
-number and the corresponding pseudo-floating point used
-to represent sensitivity values
-@param V the double precision value
-@param bytes the number of bytes of the representation
-@return the pseudo-floating point value (cast accordingly)
-*/
-unsigned short int jpwl_double_to_pfp(double V, int bytes);
-
-/** conversion between a pseudo-floating point used
-to represent sensitivity values and the corresponding
-double precision floating point number
-@param em the pseudo-floating point value (cast accordingly)
-@param bytes the number of bytes of the representation
-@return the double precision value
-*/
-double jpwl_pfp_to_double(unsigned short int em, int bytes);
-
-/*-------------------------------------------------------------*/
-
-int jpwl_markcomp(const void *arg1, const void *arg2)
-{
- /* Compare the two markers' positions */
- double diff = (((jpwl_marker_t *) arg1)->dpos - ((jpwl_marker_t *) arg2)->dpos);
-
- if (diff == 0.0) {
- return (0);
- } else if (diff < 0) {
- return (-1);
- } else {
- return (+1);
- }
-}
-
-int jpwl_epbs_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num,
- opj_bool latest, opj_bool packed, opj_bool insideMH, int *idx, int hprot,
- double place_pos, int tileno,
- unsigned long int pre_len, unsigned long int post_len)
-{
-
- jpwl_epb_ms_t *epb_mark = NULL;
-
- int k_pre, k_post, n_pre, n_post;
-
- unsigned long int L1, L2, dL4, max_postlen, epbs_len = 0;
-
- /* We find RS(n,k) for EPB parms and pre-data, if any */
- if (insideMH && (*idx == 0)) {
- /* First EPB in MH */
- k_pre = 64;
- n_pre = 160;
- } else if (!insideMH && (*idx == 0)) {
- /* First EPB in TH */
- k_pre = 25;
- n_pre = 80;
- } else {
- /* Following EPBs in MH or TH */
- k_pre = 13;
- n_pre = 40;
- };
-
- /* Find lengths, Figs. B3 and B4 */
- /* size of pre data: pre_buf(pre_len) + EPB(2) + Lepb(2) + Depb(1) + LDPepb(4) + Pepb(4) */
- L1 = pre_len + 13;
-
- /* size of pre-data redundancy */
- /* (redundancy per codeword) * (number of codewords, rounded up) */
- L2 = (n_pre - k_pre) * (unsigned long int) ceil((double) L1 / (double) k_pre);
-
- /* Find protection type for post data and its associated redundancy field length*/
- if ((hprot == 16) || (hprot == 32)) {
- /* there is a CRC for post-data */
- k_post = post_len;
- n_post = post_len + (hprot >> 3);
- /*L3 = hprot >> 3;*/ /* 2 (CRC-16) or 4 (CRC-32) bytes */
-
- } else if ((hprot >= 37) && (hprot <= 128)) {
- /* there is a RS for post-data */
- k_post = 32;
- n_post = hprot;
-
- } else {
- /* Use predefined codes */
- n_post = n_pre;
- k_post = k_pre;
- };
-
- /* Create the EPB(s) */
- while (post_len > 0) {
-
- /* maximum postlen in order to respect EPB size
- (we use JPWL_MAXIMUM_EPB_ROOM instead of 65535 for keeping room for EPB parms)*/
- /* (message word size) * (number of containable parity words) */
- max_postlen = k_post * (unsigned long int) floor((double)
- JPWL_MAXIMUM_EPB_ROOM / (double)(n_post - k_post));
-
- /* maximum postlen in order to respect EPB size */
- if (*idx == 0)
- /* (we use (JPWL_MAXIMUM_EPB_ROOM - L2) instead of 65535 for keeping room for EPB parms + pre-data) */
- /* (message word size) * (number of containable parity words) */
- {
- max_postlen = k_post * (unsigned long int) floor((double)(
- JPWL_MAXIMUM_EPB_ROOM - L2) / (double)(n_post - k_post));
- }
-
- else
- /* (we use JPWL_MAXIMUM_EPB_ROOM instead of 65535 for keeping room for EPB parms) */
- /* (message word size) * (number of containable parity words) */
- {
- max_postlen = k_post * (unsigned long int) floor((double)
- JPWL_MAXIMUM_EPB_ROOM / (double)(n_post - k_post));
- }
-
- /* null protection case */
- /* the max post length can be as large as the LDPepb field can host */
- if (hprot == 0) {
- max_postlen = INT_MAX;
- }
-
- /* length to use */
- dL4 = min(max_postlen, post_len);
-
- if ((epb_mark = jpwl_epb_create(
- j2k, /* this encoder handle */
- latest ? (dL4 < max_postlen) : OPJ_FALSE, /* is it the latest? */
- packed, /* is it packed? */
- tileno, /* we are in TPH */
- *idx, /* its index */
- hprot, /* protection type parameters of following data */
- 0, /* pre-data: nothing for now */
- dL4 /* post-data: the stub computed previously */
- ))) {
-
- /* Add this marker to the 'insertanda' list */
- if (*jwmarker_num < JPWL_MAX_NO_MARKERS) {
- jwmarker[*jwmarker_num].id = J2K_MS_EPB; /* its type */
- jwmarker[*jwmarker_num].m.epbmark = epb_mark; /* the EPB */
- jwmarker[*jwmarker_num].pos = (int) place_pos; /* after SOT */
- jwmarker[*jwmarker_num].dpos = place_pos + 0.0000001 * (double)(
- *idx); /* not very first! */
- jwmarker[*jwmarker_num].len = epb_mark->Lepb; /* its length */
- jwmarker[*jwmarker_num].len_ready = OPJ_TRUE; /* ready */
- jwmarker[*jwmarker_num].pos_ready = OPJ_TRUE; /* ready */
- jwmarker[*jwmarker_num].parms_ready = OPJ_TRUE; /* ready */
- jwmarker[*jwmarker_num].data_ready = OPJ_FALSE; /* not ready */
- (*jwmarker_num)++;
- }
-
- /* increment epb index */
- (*idx)++;
-
- /* decrease postlen */
- post_len -= dL4;
-
- /* increase the total length of EPBs */
- epbs_len += epb_mark->Lepb + 2;
-
- } else {
- /* ooops, problems */
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "Could not create TPH EPB for UEP in tile %d\n", tileno);
- };
- }
-
- return epbs_len;
-}
-
-
-jpwl_epb_ms_t *jpwl_epb_create(opj_j2k_t *j2k, opj_bool latest, opj_bool packed,
- int tileno, int idx, int hprot,
- unsigned long int pre_len, unsigned long int post_len)
-{
-
- jpwl_epb_ms_t *epb = NULL;
- /*unsigned short int data_len = 0;*/
- unsigned short int L2, L3;
- unsigned long int L1, L4;
- /*unsigned char *predata_in = NULL;*/
-
- opj_bool insideMH = (tileno == -1);
-
- /* Alloc space */
- if (!(epb = (jpwl_epb_ms_t *) opj_malloc((size_t) 1 * sizeof(jpwl_epb_ms_t)))) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "Could not allocate room for one EPB MS\n");
- return NULL;
- };
-
- /* We set RS(n,k) for EPB parms and pre-data, if any */
- if (insideMH && (idx == 0)) {
- /* First EPB in MH */
- epb->k_pre = 64;
- epb->n_pre = 160;
- } else if (!insideMH && (idx == 0)) {
- /* First EPB in TH */
- epb->k_pre = 25;
- epb->n_pre = 80;
- } else {
- /* Following EPBs in MH or TH */
- epb->k_pre = 13;
- epb->n_pre = 40;
- };
-
- /* Find lengths, Figs. B3 and B4 */
- /* size of pre data: pre_buf(pre_len) + EPB(2) + Lepb(2) + Depb(1) + LDPepb(4) + Pepb(4) */
- L1 = pre_len + 13;
- epb->pre_len = pre_len;
-
- /* size of pre-data redundancy */
- /* (redundancy per codeword) * (number of codewords, rounded up) */
- L2 = (epb->n_pre - epb->k_pre) * (unsigned short int) ceil((double) L1 /
- (double) epb->k_pre);
-
- /* length of post-data */
- L4 = post_len;
- epb->post_len = post_len;
-
- /* Find protection type for post data and its associated redundancy field length*/
- if ((hprot == 16) || (hprot == 32)) {
- /* there is a CRC for post-data */
- epb->Pepb = 0x10000000 | ((unsigned long int) hprot >>
- 5); /* 0=CRC-16, 1=CRC-32 */
- epb->k_post = post_len;
- epb->n_post = post_len + (hprot >> 3);
- /*L3 = hprot >> 3;*/ /* 2 (CRC-16) or 4 (CRC-32) bytes */
-
- } else if ((hprot >= 37) && (hprot <= 128)) {
- /* there is a RS for post-data */
- epb->Pepb = 0x20000020 | (((unsigned long int) hprot & 0x000000FF) << 8);
- epb->k_post = 32;
- epb->n_post = hprot;
-
- } else if (hprot == 1) {
- /* Use predefined codes */
- epb->Pepb = (unsigned long int) 0x00000000;
- epb->n_post = epb->n_pre;
- epb->k_post = epb->k_pre;
-
- } else if (hprot == 0) {
- /* Placeholder EPB: only protects its parameters, no protection method */
- epb->Pepb = (unsigned long int) 0xFFFFFFFF;
- epb->n_post = 1;
- epb->k_post = 1;
-
- } else {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "Invalid protection value for EPB h = %d\n", hprot);
- return NULL;
- }
-
- epb->hprot = hprot;
-
- /* (redundancy per codeword) * (number of codewords, rounded up) */
- L3 = (epb->n_post - epb->k_post) * (unsigned short int) ceil((double) L4 /
- (double) epb->k_post);
-
- /* private fields */
- epb->tileno = tileno;
-
- /* Fill some fields of the EPB */
-
- /* total length of the EPB MS (less the EPB marker itself): */
- /* Lepb(2) + Depb(1) + LDPepb(4) + Pepb(4) + pre_redundancy + post-redundancy */
- epb->Lepb = 11 + L2 + L3;
-
- /* EPB style */
- epb->Depb = ((packed & 0x0001) << 7) | ((latest & 0x0001) << 6) |
- (idx & 0x003F);
-
- /* length of data protected by EPB: */
- epb->LDPepb = L1 + L4;
-
- return epb;
-}
-
-void jpwl_epb_write(opj_j2k_t *j2k, jpwl_epb_ms_t *epb, unsigned char *buf)
-{
-
- /* Marker */
- *(buf++) = (unsigned char)(J2K_MS_EPB >> 8);
- *(buf++) = (unsigned char)(J2K_MS_EPB >> 0);
-
- /* Lepb */
- *(buf++) = (unsigned char)(epb->Lepb >> 8);
- *(buf++) = (unsigned char)(epb->Lepb >> 0);
-
- /* Depb */
- *(buf++) = (unsigned char)(epb->Depb >> 0);
-
- /* LDPepb */
- *(buf++) = (unsigned char)(epb->LDPepb >> 24);
- *(buf++) = (unsigned char)(epb->LDPepb >> 16);
- *(buf++) = (unsigned char)(epb->LDPepb >> 8);
- *(buf++) = (unsigned char)(epb->LDPepb >> 0);
-
- /* Pepb */
- *(buf++) = (unsigned char)(epb->Pepb >> 24);
- *(buf++) = (unsigned char)(epb->Pepb >> 16);
- *(buf++) = (unsigned char)(epb->Pepb >> 8);
- *(buf++) = (unsigned char)(epb->Pepb >> 0);
-
- /* Data */
- /*memcpy(buf, epb->data, (size_t) epb->Lepb - 11);*/
- memset(buf, 0, (size_t) epb->Lepb - 11);
-
- /* update markers struct */
- j2k_add_marker(j2k->cstr_info, J2K_MS_EPB, -1, epb->Lepb + 2);
-
-}
-
-
-jpwl_epc_ms_t *jpwl_epc_create(opj_j2k_t *j2k, opj_bool esd_on, opj_bool red_on,
- opj_bool epb_on, opj_bool info_on)
-{
-
- jpwl_epc_ms_t *epc = NULL;
-
- /* Alloc space */
- if (!(epc = (jpwl_epc_ms_t *) opj_malloc((size_t) 1 * sizeof(jpwl_epc_ms_t)))) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not allocate room for EPC MS\n");
- return NULL;
- };
-
- /* Set the EPC parameters */
- epc->esd_on = esd_on;
- epc->epb_on = epb_on;
- epc->red_on = red_on;
- epc->info_on = info_on;
-
- /* Fill the EPC fields with default values */
- epc->Lepc = 9;
- epc->Pcrc = 0x0000;
- epc->DL = 0x00000000;
- epc->Pepc = ((j2k->cp->esd_on & 0x0001) << 4) | ((j2k->cp->red_on & 0x0001) <<
- 5) |
- ((j2k->cp->epb_on & 0x0001) << 6) | ((j2k->cp->info_on & 0x0001) << 7);
-
- return (epc);
-}
-
-opj_bool jpwl_epb_fill(opj_j2k_t *j2k, jpwl_epb_ms_t *epb, unsigned char *buf,
- unsigned char *post_buf)
-{
-
- unsigned long int L1, L2, L3, L4;
- int remaining;
- unsigned long int P, NN_P;
-
- /* Operating buffer */
- static unsigned char codeword[NN], *parityword;
-
- unsigned char *L1_buf, *L2_buf;
- /* these ones are static, since we need to keep memory of
- the exact place from one call to the other */
- static unsigned char *L3_buf, *L4_buf;
-
- /* some consistency check */
- if (!buf) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "There is no operating buffer for EPBs\n");
- return OPJ_FALSE;
- }
-
- if (!post_buf && !L4_buf) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "There is no operating buffer for EPBs data\n");
- return OPJ_FALSE;
- }
-
- /*
- * Compute parity bytes on pre-data, ALWAYS present (at least only for EPB parms)
- */
-
- /* Initialize RS structures */
- P = epb->n_pre - epb->k_pre;
- NN_P = NN - P;
- memset(codeword, 0, NN);
- parityword = codeword + NN_P;
- init_rs(NN_P);
-
- /* pre-data begins pre_len bytes before of EPB buf */
- L1_buf = buf - epb->pre_len;
- L1 = epb->pre_len + 13;
-
- /* redundancy for pre-data begins immediately after EPB parms */
- L2_buf = buf + 13;
- L2 = (epb->n_pre - epb->k_pre) * (unsigned short int) ceil((double) L1 /
- (double) epb->k_pre);
-
- /* post-data
- the position of L4 buffer can be:
- 1) passed as a parameter: in that case use it
- 2) null: in that case use the previous (static) one
- */
- if (post_buf) {
- L4_buf = post_buf;
- }
- L4 = epb->post_len;
-
- /* post-data redundancy begins immediately after pre-data redundancy */
- L3_buf = L2_buf + L2;
- L3 = (epb->n_post - epb->k_post) * (unsigned short int) ceil((double) L4 /
- (double) epb->k_post);
-
- /* let's check whether EPB length is sufficient to contain all these data */
- if (epb->Lepb < (11 + L2 + L3)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "There is no room in EPB data field for writing redundancy data\n");
- }
- /*printf("Env. %d, nec. %d (%d + %d)\n", epb->Lepb - 11, L2 + L3, L2, L3);*/
-
- /* Compute redundancy of pre-data message words */
- remaining = L1;
- while (remaining) {
-
- /* copy message data into codeword buffer */
- if (remaining < epb->k_pre) {
- /* the last message word is zero-padded */
- memset(codeword, 0, NN);
- memcpy(codeword, L1_buf, remaining);
- L1_buf += remaining;
- remaining = 0;
-
- } else {
- memcpy(codeword, L1_buf, epb->k_pre);
- L1_buf += epb->k_pre;
- remaining -= epb->k_pre;
-
- }
-
- /* Encode the buffer and obtain parity bytes */
- if (encode_rs(codeword, parityword))
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "Possible encoding error in codeword @ position #%d\n",
- (L1_buf - buf) / epb->k_pre);
-
- /* copy parity bytes only in redundancy buffer */
- memcpy(L2_buf, parityword, P);
-
- /* advance parity buffer */
- L2_buf += P;
- }
-
- /*
- * Compute parity bytes on post-data, may be absent if there are no data
- */
- /*printf("Hprot is %d (tileno=%d, k_pre=%d, n_pre=%d, k_post=%d, n_post=%d, pre_len=%d, post_len=%d)\n",
- epb->hprot, epb->tileno, epb->k_pre, epb->n_pre, epb->k_post, epb->n_post, epb->pre_len,
- epb->post_len);*/
- if (epb->hprot < 0) {
-
- /* there should be no EPB */
-
- } else if (epb->hprot == 0) {
-
- /* no protection for the data */
- /* advance anyway */
- L4_buf += epb->post_len;
-
- } else if (epb->hprot == 16) {
-
- /* CRC-16 */
- unsigned short int mycrc = 0x0000;
-
- /* compute the CRC field (excluding itself) */
- remaining = L4;
- while (remaining--) {
- jpwl_updateCRC16(&mycrc, *(L4_buf++));
- }
-
- /* write the CRC field */
- *(L3_buf++) = (unsigned char)(mycrc >> 8);
- *(L3_buf++) = (unsigned char)(mycrc >> 0);
-
- } else if (epb->hprot == 32) {
-
- /* CRC-32 */
- unsigned long int mycrc = 0x00000000;
-
- /* compute the CRC field (excluding itself) */
- remaining = L4;
- while (remaining--) {
- jpwl_updateCRC32(&mycrc, *(L4_buf++));
- }
-
- /* write the CRC field */
- *(L3_buf++) = (unsigned char)(mycrc >> 24);
- *(L3_buf++) = (unsigned char)(mycrc >> 16);
- *(L3_buf++) = (unsigned char)(mycrc >> 8);
- *(L3_buf++) = (unsigned char)(mycrc >> 0);
-
- } else {
-
- /* RS */
-
- /* Initialize RS structures */
- P = epb->n_post - epb->k_post;
- NN_P = NN - P;
- memset(codeword, 0, NN);
- parityword = codeword + NN_P;
- init_rs(NN_P);
-
- /* Compute redundancy of post-data message words */
- remaining = L4;
- while (remaining) {
-
- /* copy message data into codeword buffer */
- if (remaining < epb->k_post) {
- /* the last message word is zero-padded */
- memset(codeword, 0, NN);
- memcpy(codeword, L4_buf, remaining);
- L4_buf += remaining;
- remaining = 0;
-
- } else {
- memcpy(codeword, L4_buf, epb->k_post);
- L4_buf += epb->k_post;
- remaining -= epb->k_post;
-
- }
-
- /* Encode the buffer and obtain parity bytes */
- if (encode_rs(codeword, parityword))
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "Possible encoding error in codeword @ position #%d\n",
- (L4_buf - buf) / epb->k_post);
-
- /* copy parity bytes only in redundancy buffer */
- memcpy(L3_buf, parityword, P);
-
- /* advance parity buffer */
- L3_buf += P;
- }
-
- }
-
- return OPJ_TRUE;
-}
-
-
-opj_bool jpwl_correct(opj_j2k_t *j2k)
-{
-
- opj_cio_t *cio = j2k->cio;
- opj_bool status;
- static opj_bool mh_done = OPJ_FALSE;
- int mark_pos, id, len, skips, sot_pos;
- unsigned long int Psot = 0;
-
- /* go back to marker position */
- mark_pos = cio_tell(cio) - 2;
- cio_seek(cio, mark_pos);
-
- if ((j2k->state == J2K_STATE_MHSOC) && !mh_done) {
-
- int mark_val = 0, skipnum = 0;
-
- /*
- COLOR IMAGE
- first thing to do, if we are here, is to look whether
- 51 (skipnum) positions ahead there is an EPB, in case of MH
- */
- /*
- B/W IMAGE
- first thing to do, if we are here, is to look whether
- 45 (skipnum) positions ahead there is an EPB, in case of MH
- */
- /* SIZ SIZ_FIELDS SIZ_COMPS FOLLOWING_MARKER */
- skipnum = 2 + 38 + 3 * j2k->cp->exp_comps + 2;
- if ((cio->bp + skipnum) < cio->end) {
-
- cio_skip(cio, skipnum);
-
- /* check that you are not going beyond the end of codestream */
-
- /* call EPB corrector */
- status = jpwl_epb_correct(j2k, /* J2K decompressor handle */
- cio->bp, /* pointer to EPB in codestream buffer */
- 0, /* EPB type: MH */
- skipnum, /* length of pre-data */
- -1, /* length of post-data: -1 means auto */
- NULL,
- NULL
- );
-
- /* read the marker value */
- mark_val = (*(cio->bp) << 8) | *(cio->bp + 1);
-
- if (status && (mark_val == J2K_MS_EPB)) {
- /* we found it! */
- mh_done = OPJ_TRUE;
- return OPJ_TRUE;
- }
-
- /* Disable correction in case of missing or bad head EPB */
- /* We can't do better! */
- /* PATCHED: 2008-01-25 */
- /* MOVED UP: 2008-02-01 */
- if (!status) {
- j2k->cp->correct = OPJ_FALSE;
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "Couldn't find the MH EPB: disabling JPWL\n");
- }
-
- }
-
- }
-
- if (OPJ_TRUE /*(j2k->state == J2K_STATE_TPHSOT) || (j2k->state == J2K_STATE_TPH)*/) {
- /* else, look if 12 positions ahead there is an EPB, in case of TPH */
- cio_seek(cio, mark_pos);
- if ((cio->bp + 12) < cio->end) {
-
- cio_skip(cio, 12);
-
- /* call EPB corrector */
- status = jpwl_epb_correct(j2k, /* J2K decompressor handle */
- cio->bp, /* pointer to EPB in codestream buffer */
- 1, /* EPB type: TPH */
- 12, /* length of pre-data */
- -1, /* length of post-data: -1 means auto */
- NULL,
- NULL
- );
- if (status)
- /* we found it! */
- {
- return OPJ_TRUE;
- }
- }
- }
-
- return OPJ_FALSE;
-
- /* for now, don't use this code */
-
- /* else, look if here is an EPB, in case of other */
- if (mark_pos > 64) {
- /* it cannot stay before the first MH EPB */
- cio_seek(cio, mark_pos);
- cio_skip(cio, 0);
-
- /* call EPB corrector */
- status = jpwl_epb_correct(j2k, /* J2K decompressor handle */
- cio->bp, /* pointer to EPB in codestream buffer */
- 2, /* EPB type: TPH */
- 0, /* length of pre-data */
- -1, /* length of post-data: -1 means auto */
- NULL,
- NULL
- );
- if (status)
- /* we found it! */
- {
- return OPJ_TRUE;
- }
- }
-
- /* nope, no EPBs probably, or they are so damaged that we can give up */
- return OPJ_FALSE;
-
- return OPJ_TRUE;
-
- /* AN ATTEMPT OF PARSER */
- /* NOT USED ACTUALLY */
-
- /* go to the beginning of the file */
- cio_seek(cio, 0);
-
- /* let's begin */
- j2k->state = J2K_STATE_MHSOC;
-
- /* cycle all over the markers */
- while (cio_tell(cio) < cio->length) {
-
- /* read the marker */
- mark_pos = cio_tell(cio);
- id = cio_read(cio, 2);
-
- /* details */
- printf("Marker@%d: %X\n", cio_tell(cio) - 2, id);
-
- /* do an action in response to the read marker */
- switch (id) {
-
- /* short markers */
-
- /* SOC */
- case J2K_MS_SOC:
- j2k->state = J2K_STATE_MHSIZ;
- len = 0;
- skips = 0;
- break;
-
- /* EOC */
- case J2K_MS_EOC:
- j2k->state = J2K_STATE_MT;
- len = 0;
- skips = 0;
- break;
-
- /* particular case of SOD */
- case J2K_MS_SOD:
- len = Psot - (mark_pos - sot_pos) - 2;
- skips = len;
- break;
-
- /* long markers */
-
- /* SOT */
- case J2K_MS_SOT:
- j2k->state = J2K_STATE_TPH;
- sot_pos = mark_pos; /* position of SOT */
- len = cio_read(cio, 2); /* read the length field */
- cio_skip(cio, 2); /* this field is unnecessary */
- Psot = cio_read(cio, 4); /* tile length */
- skips = len - 8;
- break;
-
- /* remaining */
- case J2K_MS_SIZ:
- j2k->state = J2K_STATE_MH;
- /* read the length field */
- len = cio_read(cio, 2);
- skips = len - 2;
- break;
-
- /* remaining */
- default:
- /* read the length field */
- len = cio_read(cio, 2);
- skips = len - 2;
- break;
-
- }
-
- /* skip to marker's end */
- cio_skip(cio, skips);
-
- }
-
-
-}
-
-opj_bool jpwl_epb_correct(opj_j2k_t *j2k, unsigned char *buffer, int type,
- int pre_len, int post_len, int *conn,
- unsigned char **L4_bufp)
-{
-
- /* Operating buffer */
- unsigned char codeword[NN], *parityword;
-
- unsigned long int P, NN_P;
- unsigned long int L1, L4;
- int remaining, n_pre, k_pre, n_post, k_post;
-
- int status, tt;
-
- int orig_pos = cio_tell(j2k->cio);
-
- unsigned char *L1_buf, *L2_buf;
- unsigned char *L3_buf, *L4_buf;
-
- unsigned long int LDPepb, Pepb;
- unsigned short int Lepb;
- unsigned char Depb;
- char str1[25] = "";
- int myconn, errnum = 0;
- opj_bool errflag = OPJ_FALSE;
-
- opj_cio_t *cio = j2k->cio;
-
- /* check for common errors */
- if (!buffer) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "The EPB pointer is a NULL buffer\n");
- return OPJ_FALSE;
- }
-
- /* set bignesses */
- L1 = pre_len + 13;
-
- /* pre-data correction */
- switch (type) {
-
- case 0:
- /* MH EPB */
- k_pre = 64;
- n_pre = 160;
- break;
-
- case 1:
- /* TPH EPB */
- k_pre = 25;
- n_pre = 80;
- break;
-
- case 2:
- /* other EPBs */
- k_pre = 13;
- n_pre = 40;
- break;
-
- case 3:
- /* automatic setup */
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Auto. setup not yet implemented\n");
- return OPJ_FALSE;
- break;
-
- default:
- /* unknown type */
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Unknown expected EPB type\n");
- return OPJ_FALSE;
- break;
-
- }
-
- /* Initialize RS structures */
- P = n_pre - k_pre;
- NN_P = NN - P;
- tt = (int) floor((float) P / 2.0F); /* correction capability of the code */
- memset(codeword, 0, NN);
- parityword = codeword + NN_P;
- init_rs(NN_P);
-
- /* Correct pre-data message words */
- L1_buf = buffer - pre_len;
- L2_buf = buffer + 13;
- remaining = L1;
- while (remaining) {
-
- /* always zero-pad codewords */
- /* (this is required, since after decoding the zeros in the long codeword
- could change, and keep unchanged in subsequent calls) */
- memset(codeword, 0, NN);
-
- /* copy codeword buffer into message bytes */
- if (remaining < k_pre) {
- memcpy(codeword, L1_buf, remaining);
- } else {
- memcpy(codeword, L1_buf, k_pre);
- }
-
- /* copy redundancy buffer in parity bytes */
- memcpy(parityword, L2_buf, P);
-
- /* Decode the buffer and possibly obtain corrected bytes */
- status = eras_dec_rs(codeword, NULL, 0);
- if (status == -1) {
- /*if (conn == NULL)
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "Possible decoding error in codeword @ position #%d\n", (L1_buf - buffer) / k_pre);*/
- errflag = OPJ_TRUE;
- /* we can try to safely get out from the function:
- if we are here, either this is not an EPB or the first codeword
- is too damaged to be helpful */
- /*return OPJ_FALSE;*/
-
- } else if (status == 0) {
- /*if (conn == NULL)
- opj_event_msg(j2k->cinfo, EVT_INFO, "codeword is correctly decoded\n");*/
-
- } else if (status <= tt) {
- /* it has corrected 0 <= errs <= tt */
- /*if (conn == NULL)
- opj_event_msg(j2k->cinfo, EVT_WARNING, "%d errors corrected in codeword\n", status);*/
- errnum += status;
-
- } else {
- /*if (conn == NULL)
- opj_event_msg(j2k->cinfo, EVT_WARNING, "EPB correction capability exceeded\n");
- return OPJ_FALSE;*/
- errflag = OPJ_TRUE;
- }
-
-
- /* advance parity buffer */
- if ((status >= 0) && (status <= tt))
- /* copy back corrected parity only if all is OK */
- {
- memcpy(L2_buf, parityword, P);
- }
- L2_buf += P;
-
- /* advance message buffer */
- if (remaining < k_pre) {
- if ((status >= 0) && (status <= tt))
- /* copy back corrected data only if all is OK */
- {
- memcpy(L1_buf, codeword, remaining);
- }
- L1_buf += remaining;
- remaining = 0;
-
- } else {
- if ((status >= 0) && (status <= tt))
- /* copy back corrected data only if all is OK */
- {
- memcpy(L1_buf, codeword, k_pre);
- }
- L1_buf += k_pre;
- remaining -= k_pre;
-
- }
- }
-
- /* print summary */
- if (!conn) {
-
- /*if (errnum)
- opj_event_msg(j2k->cinfo, EVT_INFO, "+ %d symbol errors corrected (Ps=%.1e)\n", errnum,
- (float) errnum / ((float) n_pre * (float) L1 / (float) k_pre));*/
- if (errflag) {
- /*opj_event_msg(j2k->cinfo, EVT_INFO, "+ there were unrecoverable errors\n");*/
- return OPJ_FALSE;
- }
-
- }
-
- /* presumably, now, EPB parameters are correct */
- /* let's get them */
-
- /* Simply read the EPB parameters */
- if (conn) {
- cio->bp = buffer;
- }
- cio_skip(cio, 2); /* the marker */
- Lepb = cio_read(cio, 2);
- Depb = cio_read(cio, 1);
- LDPepb = cio_read(cio, 4);
- Pepb = cio_read(cio, 4);
-
- /* What does Pepb tells us about the protection method? */
- if (((Pepb & 0xF0000000) >> 28) == 0) {
- sprintf(str1, "pred"); /* predefined */
- } else if (((Pepb & 0xF0000000) >> 28) == 1) {
- sprintf(str1, "crc-%lu", 16 * ((Pepb & 0x00000001) + 1)); /* CRC mode */
- } else if (((Pepb & 0xF0000000) >> 28) == 2) {
- sprintf(str1, "rs(%lu,32)", (Pepb & 0x0000FF00) >> 8); /* RS mode */
- } else if (Pepb == 0xFFFFFFFF) {
- sprintf(str1, "nometh"); /* RS mode */
- } else {
- sprintf(str1, "unknown"); /* unknown */
- }
-
- /* Now we write them to screen */
- if (!conn && post_len)
- opj_event_msg(j2k->cinfo, EVT_INFO,
- "EPB(%d): (%sl, %sp, %u), %lu, %s\n",
- cio_tell(cio) - 13,
- (Depb & 0x40) ? "" : "n", /* latest EPB or not? */
- (Depb & 0x80) ? "" : "n", /* packed or unpacked EPB? */
- (Depb & 0x3F), /* EPB index value */
- LDPepb, /*length of the data protected by the EPB */
- str1); /* protection method */
-
-
- /* well, we need to investigate how long is the connected length of packed EPBs */
- myconn = Lepb + 2;
- if ((Depb & 0x40) == 0) /* not latest in header */
- jpwl_epb_correct(j2k, /* J2K decompressor handle */
- buffer + Lepb + 2, /* pointer to next EPB in codestream buffer */
- 2, /* EPB type: should be of other type */
- 0, /* only EPB fields */
- 0, /* do not look after */
- &myconn,
- NULL
- );
- if (conn) {
- *conn += myconn;
- }
-
- /*if (!conn)
- printf("connected = %d\n", myconn);*/
-
- /*cio_seek(j2k->cio, orig_pos);
- return OPJ_TRUE;*/
-
- /* post-data
- the position of L4 buffer is at the end of currently connected EPBs
- */
- if (!(L4_bufp)) {
- L4_buf = buffer + myconn;
- } else if (!(*L4_bufp)) {
- L4_buf = buffer + myconn;
- } else {
- L4_buf = *L4_bufp;
- }
- if (post_len == -1) {
- L4 = LDPepb - pre_len - 13;
- } else if (post_len == 0) {
- L4 = 0;
- } else {
- L4 = post_len;
- }
-
- L3_buf = L2_buf;
-
- /* Do a further check here on the read parameters */
- if (L4 > (unsigned long) cio_numbytesleft(j2k->cio))
- /* overflow */
- {
- return OPJ_FALSE;
- }
-
- /* we are ready for decoding the remaining data */
- if (((Pepb & 0xF0000000) >> 28) == 1) {
- /* CRC here */
- if ((16 * ((Pepb & 0x00000001) + 1)) == 16) {
-
- /* CRC-16 */
- unsigned short int mycrc = 0x0000, filecrc = 0x0000;
-
- /* compute the CRC field */
- remaining = L4;
- while (remaining--) {
- jpwl_updateCRC16(&mycrc, *(L4_buf++));
- }
-
- /* read the CRC field */
- filecrc = *(L3_buf++) << 8;
- filecrc |= *(L3_buf++);
-
- /* check the CRC field */
- if (mycrc == filecrc) {
- if (conn == NULL) {
- opj_event_msg(j2k->cinfo, EVT_INFO, "- CRC is OK\n");
- }
- } else {
- if (conn == NULL) {
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- CRC is KO (r=%d, c=%d)\n", filecrc,
- mycrc);
- }
- errflag = OPJ_TRUE;
- }
- }
-
- if ((16 * ((Pepb & 0x00000001) + 1)) == 32) {
-
- /* CRC-32 */
- unsigned long int mycrc = 0x00000000, filecrc = 0x00000000;
-
- /* compute the CRC field */
- remaining = L4;
- while (remaining--) {
- jpwl_updateCRC32(&mycrc, *(L4_buf++));
- }
-
- /* read the CRC field */
- filecrc = *(L3_buf++) << 24;
- filecrc |= *(L3_buf++) << 16;
- filecrc |= *(L3_buf++) << 8;
- filecrc |= *(L3_buf++);
-
- /* check the CRC field */
- if (mycrc == filecrc) {
- if (conn == NULL) {
- opj_event_msg(j2k->cinfo, EVT_INFO, "- CRC is OK\n");
- }
- } else {
- if (conn == NULL) {
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- CRC is KO (r=%d, c=%d)\n", filecrc,
- mycrc);
- }
- errflag = OPJ_TRUE;
- }
- }
-
- } else if (Pepb == 0xFFFFFFFF) {
- /* no method */
-
- /* advance without doing anything */
- remaining = L4;
- while (remaining--) {
- L4_buf++;
- }
-
- } else if ((((Pepb & 0xF0000000) >> 28) == 2) ||
- (((Pepb & 0xF0000000) >> 28) == 0)) {
- /* RS coding here */
-
- if (((Pepb & 0xF0000000) >> 28) == 0) {
-
- k_post = k_pre;
- n_post = n_pre;
-
- } else {
-
- k_post = 32;
- n_post = (Pepb & 0x0000FF00) >> 8;
- }
-
- /* Initialize RS structures */
- P = n_post - k_post;
- NN_P = NN - P;
- tt = (int) floor((float) P / 2.0F); /* again, correction capability */
- memset(codeword, 0, NN);
- parityword = codeword + NN_P;
- init_rs(NN_P);
-
- /* Correct post-data message words */
- /*L4_buf = buffer + Lepb + 2;*/
- L3_buf = L2_buf;
- remaining = L4;
- while (remaining) {
-
- /* always zero-pad codewords */
- /* (this is required, since after decoding the zeros in the long codeword
- could change, and keep unchanged in subsequent calls) */
- memset(codeword, 0, NN);
-
- /* copy codeword buffer into message bytes */
- if (remaining < k_post) {
- memcpy(codeword, L4_buf, remaining);
- } else {
- memcpy(codeword, L4_buf, k_post);
- }
-
- /* copy redundancy buffer in parity bytes */
- memcpy(parityword, L3_buf, P);
-
- /* Decode the buffer and possibly obtain corrected bytes */
- status = eras_dec_rs(codeword, NULL, 0);
- if (status == -1) {
- /*if (conn == NULL)
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "Possible decoding error in codeword @ position #%d\n", (L4_buf - (buffer + Lepb + 2)) / k_post);*/
- errflag = OPJ_TRUE;
-
- } else if (status == 0) {
- /*if (conn == NULL)
- opj_event_msg(j2k->cinfo, EVT_INFO, "codeword is correctly decoded\n");*/
-
- } else if (status <= tt) {
- /*if (conn == NULL)
- opj_event_msg(j2k->cinfo, EVT_WARNING, "%d errors corrected in codeword\n", status);*/
- errnum += status;
-
- } else {
- /*if (conn == NULL)
- opj_event_msg(j2k->cinfo, EVT_WARNING, "EPB correction capability exceeded\n");
- return OPJ_FALSE;*/
- errflag = OPJ_TRUE;
- }
-
-
- /* advance parity buffer */
- if ((status >= 0) && (status <= tt))
- /* copy back corrected data only if all is OK */
- {
- memcpy(L3_buf, parityword, P);
- }
- L3_buf += P;
-
- /* advance message buffer */
- if (remaining < k_post) {
- if ((status >= 0) && (status <= tt))
- /* copy back corrected data only if all is OK */
- {
- memcpy(L4_buf, codeword, remaining);
- }
- L4_buf += remaining;
- remaining = 0;
-
- } else {
- if ((status >= 0) && (status <= tt))
- /* copy back corrected data only if all is OK */
- {
- memcpy(L4_buf, codeword, k_post);
- }
- L4_buf += k_post;
- remaining -= k_post;
-
- }
- }
- }
-
- /* give back the L4_buf address */
- if (L4_bufp) {
- *L4_bufp = L4_buf;
- }
-
- /* print summary */
- if (!conn) {
-
- if (errnum)
- opj_event_msg(j2k->cinfo, EVT_INFO, "- %d symbol errors corrected (Ps=%.1e)\n",
- errnum,
- (float) errnum / (float) LDPepb);
- if (errflag) {
- opj_event_msg(j2k->cinfo, EVT_INFO, "- there were unrecoverable errors\n");
- }
-
- }
-
- cio_seek(j2k->cio, orig_pos);
-
- return OPJ_TRUE;
-}
-
-void jpwl_epc_write(opj_j2k_t *j2k, jpwl_epc_ms_t *epc, unsigned char *buf)
-{
-
- /* Marker */
- *(buf++) = (unsigned char)(J2K_MS_EPC >> 8);
- *(buf++) = (unsigned char)(J2K_MS_EPC >> 0);
-
- /* Lepc */
- *(buf++) = (unsigned char)(epc->Lepc >> 8);
- *(buf++) = (unsigned char)(epc->Lepc >> 0);
-
- /* Pcrc */
- *(buf++) = (unsigned char)(epc->Pcrc >> 8);
- *(buf++) = (unsigned char)(epc->Pcrc >> 0);
-
- /* DL */
- *(buf++) = (unsigned char)(epc->DL >> 24);
- *(buf++) = (unsigned char)(epc->DL >> 16);
- *(buf++) = (unsigned char)(epc->DL >> 8);
- *(buf++) = (unsigned char)(epc->DL >> 0);
-
- /* Pepc */
- *(buf++) = (unsigned char)(epc->Pepc >> 0);
-
- /* Data */
- /*memcpy(buf, epc->data, (size_t) epc->Lepc - 9);*/
- memset(buf, 0, (size_t) epc->Lepc - 9);
-
- /* update markers struct */
- j2k_add_marker(j2k->cstr_info, J2K_MS_EPC, -1, epc->Lepc + 2);
-
-}
-
-int jpwl_esds_add(opj_j2k_t *j2k, jpwl_marker_t *jwmarker, int *jwmarker_num,
- int comps, unsigned char addrm, unsigned char ad_size,
- unsigned char senst, unsigned char se_size,
- double place_pos, int tileno)
-{
-
- return 0;
-}
-
-jpwl_esd_ms_t *jpwl_esd_create(opj_j2k_t *j2k, int comp,
- unsigned char addrm, unsigned char ad_size,
- unsigned char senst, int se_size, int tileno,
- unsigned long int svalnum, void *sensval)
-{
-
- jpwl_esd_ms_t *esd = NULL;
-
- /* Alloc space */
- if (!(esd = (jpwl_esd_ms_t *) opj_malloc((size_t) 1 * sizeof(jpwl_esd_ms_t)))) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Could not allocate room for ESD MS\n");
- return NULL;
- };
-
- /* if relative sensitivity, activate byte range mode */
- if (senst == 0) {
- addrm = 1;
- }
-
- /* size of sensval's ... */
- if ((ad_size != 0) && (ad_size != 2) && (ad_size != 4)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "Address size %d for ESD MS is forbidden\n", ad_size);
- return NULL;
- }
- if ((se_size != 1) && (se_size != 2)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "Sensitivity size %d for ESD MS is forbidden\n", se_size);
- return NULL;
- }
-
- /* ... depends on the addressing mode */
- switch (addrm) {
-
- /* packet mode */
- case (0):
- ad_size = 0; /* as per the standard */
- esd->sensval_size = (unsigned int)se_size;
- break;
-
- /* byte range */
- case (1):
- /* auto sense address size */
- if (ad_size == 0)
- /* if there are more than 66% of (2^16 - 1) bytes, switch to 4 bytes
- (we keep space for possible EPBs being inserted) */
- {
- ad_size = (j2k->cstr_info->codestream_size > (1 * 65535 / 3)) ? 4 : 2;
- }
- esd->sensval_size = ad_size + ad_size + se_size;
- break;
-
- /* packet range */
- case (2):
- /* auto sense address size */
- if (ad_size == 0)
- /* if there are more than 2^16 - 1 packets, switch to 4 bytes */
- {
- ad_size = (j2k->cstr_info->packno > 65535) ? 4 : 2;
- }
- esd->sensval_size = ad_size + ad_size + se_size;
- break;
-
- case (3):
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "Address mode %d for ESD MS is unimplemented\n", addrm);
- return NULL;
-
- default:
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "Address mode %d for ESD MS is forbidden\n", addrm);
- return NULL;
- }
-
- /* set or unset sensitivity values */
- if (svalnum <= 0) {
-
- switch (senst) {
-
- /* just based on the portions of a codestream */
- case (0):
- /* MH + no. of THs + no. of packets */
- svalnum = 1 + (j2k->cstr_info->tw * j2k->cstr_info->th) *
- (1 + j2k->cstr_info->packno);
- break;
-
- /* all the ones that are based on the packets */
- default:
- if (tileno < 0)
- /* MH: all the packets and all the tiles info is written */
- {
- svalnum = j2k->cstr_info->tw * j2k->cstr_info->th * j2k->cstr_info->packno;
- } else
- /* TPH: only that tile info is written */
- {
- svalnum = j2k->cstr_info->packno;
- }
- break;
-
- }
- }
-
- /* fill private fields */
- esd->senst = senst;
- esd->ad_size = ad_size;
- esd->se_size = se_size;
- esd->addrm = addrm;
- esd->svalnum = svalnum;
- esd->numcomps = j2k->image->numcomps;
- esd->tileno = tileno;
-
- /* Set the ESD parameters */
- /* length, excluding data field */
- if (esd->numcomps < 257) {
- esd->Lesd = 4 + (unsigned short int)(esd->svalnum * esd->sensval_size);
- } else {
- esd->Lesd = 5 + (unsigned short int)(esd->svalnum * esd->sensval_size);
- }
-
- /* component data field */
- if (comp >= 0) {
- esd->Cesd = comp;
- } else
- /* we are averaging */
- {
- esd->Cesd = 0;
- }
-
- /* Pesd field */
- esd->Pesd = 0x00;
- esd->Pesd |= (esd->addrm & 0x03) << 6; /* addressing mode */
- esd->Pesd |= (esd->senst & 0x07) << 3; /* sensitivity type */
- esd->Pesd |= ((esd->se_size >> 1) & 0x01) << 2; /* sensitivity size */
- esd->Pesd |= ((esd->ad_size >> 2) & 0x01) << 1; /* addressing size */
- esd->Pesd |= (comp < 0) ? 0x01 : 0x00; /* averaging components */
-
- /* if pointer to sensval is NULL, we can fill data field by ourselves */
- if (!sensval) {
-
- /* old code moved to jpwl_esd_fill() */
- esd->data = NULL;
-
- } else {
- /* we set the data field as the sensitivity values pointer passed to the function */
- esd->data = (unsigned char *) sensval;
- }
-
- return (esd);
-}
-
-opj_bool jpwl_esd_fill(opj_j2k_t *j2k, jpwl_esd_ms_t *esd, unsigned char *buf)
-{
-
- int i;
- unsigned long int vv;
- unsigned long int addr1 = 0L, addr2 = 0L;
- double dvalue = 0.0, Omax2, tmp, TSE = 0.0, MSE, oldMSE = 0.0, PSNR,
- oldPSNR = 0.0;
- unsigned short int pfpvalue;
- unsigned long int addrmask = 0x00000000;
- opj_bool doneMH = OPJ_FALSE, doneTPH = OPJ_FALSE;
-
- /* sensitivity values in image info are as follows:
- - for each tile, distotile is the starting distortion for that tile, sum of all components
- - for each packet in a tile, disto is the distortion reduction caused by that packet to that tile
- - the TSE for a single tile should be given by distotile - sum(disto) , for all components
- - the MSE for a single tile is given by TSE / nbpix , for all components
- - the PSNR for a single tile is given by 10*log10( Omax^2 / MSE) , for all components
- (Omax is given by 2^bpp - 1 for unsigned images and by 2^(bpp - 1) - 1 for signed images
- */
-
- /* browse all components and find Omax */
- Omax2 = 0.0;
- for (i = 0; i < j2k->image->numcomps; i++) {
- tmp = pow(2.0, (double)(j2k->image->comps[i].sgnd ?
- (j2k->image->comps[i].bpp - 1) : (j2k->image->comps[i].bpp))) - 1;
- if (tmp > Omax2) {
- Omax2 = tmp;
- }
- }
- Omax2 = Omax2 * Omax2;
-
- /* if pointer of esd->data is not null, simply write down all the values byte by byte */
- if (esd->data) {
- for (i = 0; i < (int) esd->svalnum; i++) {
- *(buf++) = esd->data[i];
- }
- return OPJ_TRUE;
- }
-
- /* addressing mask */
- if (esd->ad_size == 2) {
- addrmask = 0x0000FFFF; /* two bytes */
- } else {
- addrmask = 0xFFFFFFFF; /* four bytes */
- }
-
- /* set on precise point where sensitivity starts */
- if (esd->numcomps < 257) {
- buf += 6;
- } else {
- buf += 7;
- }
-
- /* let's fill the data fields */
- for (vv = (esd->tileno < 0) ? 0 : (j2k->cstr_info->packno * esd->tileno);
- vv < esd->svalnum; vv++) {
-
- int thistile = vv / j2k->cstr_info->packno,
- thispacket = vv % j2k->cstr_info->packno;
-
- /* skip for the hack some lines below */
- if (thistile == j2k->cstr_info->tw * j2k->cstr_info->th) {
- break;
- }
-
- /* starting tile distortion */
- if (thispacket == 0) {
- TSE = j2k->cstr_info->tile[thistile].distotile;
- oldMSE = TSE / j2k->cstr_info->tile[thistile].numpix;
- oldPSNR = 10.0 * log10(Omax2 / oldMSE);
- }
-
- /* TSE */
- TSE -= j2k->cstr_info->tile[thistile].packet[thispacket].disto;
-
- /* MSE */
- MSE = TSE / j2k->cstr_info->tile[thistile].numpix;
-
- /* PSNR */
- PSNR = 10.0 * log10(Omax2 / MSE);
-
- /* fill the address range */
- switch (esd->addrm) {
-
- /* packet mode */
- case (0):
- /* nothing, there is none */
- break;
-
- /* byte range */
- case (1):
- /* start address of packet */
- addr1 = (j2k->cstr_info->tile[thistile].packet[thispacket].start_pos) &
- addrmask;
- /* end address of packet */
- addr2 = (j2k->cstr_info->tile[thistile].packet[thispacket].end_pos) & addrmask;
- break;
-
- /* packet range */
- case (2):
- /* not implemented here */
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "Addressing mode packet_range is not implemented\n");
- break;
-
- /* unknown addressing method */
- default:
- /* not implemented here */
- opj_event_msg(j2k->cinfo, EVT_WARNING, "Unknown addressing mode\n");
- break;
-
- }
-
- /* hack for writing relative sensitivity of MH and TPHs */
- if ((esd->senst == 0) && (thispacket == 0)) {
-
- /* possible MH */
- if ((thistile == 0) && !doneMH) {
- /* we have to manage MH addresses */
- addr1 = 0; /* start of MH */
- addr2 = j2k->cstr_info->main_head_end; /* end of MH */
- /* set special dvalue for this MH */
- dvalue = -10.0;
- doneMH = OPJ_TRUE; /* don't come here anymore */
- vv--; /* wrap back loop counter */
-
- } else if (!doneTPH) {
- /* we have to manage TPH addresses */
- addr1 = j2k->cstr_info->tile[thistile].start_pos;
- addr2 = j2k->cstr_info->tile[thistile].end_header;
- /* set special dvalue for this TPH */
- dvalue = -1.0;
- doneTPH = OPJ_TRUE; /* don't come here till the next tile */
- vv--; /* wrap back loop counter */
- }
-
- } else {
- doneTPH = OPJ_FALSE; /* reset TPH counter */
- }
-
- /* write the addresses to the buffer */
- switch (esd->ad_size) {
-
- case (0):
- /* do nothing */
- break;
-
- case (2):
- /* two bytes */
- *(buf++) = (unsigned char)(addr1 >> 8);
- *(buf++) = (unsigned char)(addr1 >> 0);
- *(buf++) = (unsigned char)(addr2 >> 8);
- *(buf++) = (unsigned char)(addr2 >> 0);
- break;
-
- case (4):
- /* four bytes */
- *(buf++) = (unsigned char)(addr1 >> 24);
- *(buf++) = (unsigned char)(addr1 >> 16);
- *(buf++) = (unsigned char)(addr1 >> 8);
- *(buf++) = (unsigned char)(addr1 >> 0);
- *(buf++) = (unsigned char)(addr2 >> 24);
- *(buf++) = (unsigned char)(addr2 >> 16);
- *(buf++) = (unsigned char)(addr2 >> 8);
- *(buf++) = (unsigned char)(addr2 >> 0);
- break;
-
- default:
- /* do nothing */
- break;
- }
-
-
- /* let's fill the value field */
- switch (esd->senst) {
-
- /* relative sensitivity */
- case (0):
- /* we just write down the packet ordering */
- if (dvalue == -10)
- /* MH */
- {
- dvalue = MAX_V1 + 1000.0; /* this will cause pfpvalue set to 0xFFFF */
- } else if (dvalue == -1)
- /* TPH */
- {
- dvalue = MAX_V1 + 1000.0; /* this will cause pfpvalue set to 0xFFFF */
- } else
- /* packet: first is most important, and then in decreasing order
- down to the last, which counts for 1 */
- {
- dvalue = jpwl_pfp_to_double((unsigned short)(j2k->cstr_info->packno -
- thispacket), esd->se_size);
- }
- break;
-
- /* MSE */
- case (1):
- /* !!! WRONG: let's put here disto field of packets !!! */
- dvalue = MSE;
- break;
-
- /* MSE reduction */
- case (2):
- dvalue = oldMSE - MSE;
- oldMSE = MSE;
- break;
-
- /* PSNR */
- case (3):
- dvalue = PSNR;
- break;
-
- /* PSNR increase */
- case (4):
- dvalue = PSNR - oldPSNR;
- oldPSNR = PSNR;
- break;
-
- /* MAXERR */
- case (5):
- dvalue = 0.0;
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "MAXERR sensitivity mode is not implemented\n");
- break;
-
- /* TSE */
- case (6):
- dvalue = TSE;
- break;
-
- /* reserved */
- case (7):
- dvalue = 0.0;
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "Reserved sensitivity mode is not implemented\n");
- break;
-
- default:
- dvalue = 0.0;
- break;
- }
-
- /* compute the pseudo-floating point value */
- pfpvalue = jpwl_double_to_pfp(dvalue, esd->se_size);
-
- /* write the pfp value to the buffer */
- switch (esd->se_size) {
-
- case (1):
- /* one byte */
- *(buf++) = (unsigned char)(pfpvalue >> 0);
- break;
-
- case (2):
- /* two bytes */
- *(buf++) = (unsigned char)(pfpvalue >> 8);
- *(buf++) = (unsigned char)(pfpvalue >> 0);
- break;
- }
-
- }
-
- return OPJ_TRUE;
-}
-
-opj_bool jpwl_esd_write(opj_j2k_t *j2k, jpwl_esd_ms_t *esd, unsigned char *buf)
-{
-
- /* Marker */
- *(buf++) = (unsigned char)(J2K_MS_ESD >> 8);
- *(buf++) = (unsigned char)(J2K_MS_ESD >> 0);
-
- /* Lesd */
- *(buf++) = (unsigned char)(esd->Lesd >> 8);
- *(buf++) = (unsigned char)(esd->Lesd >> 0);
-
- /* Cesd */
- if (esd->numcomps >= 257) {
- *(buf++) = (unsigned char)(esd->Cesd >> 8);
- }
- *(buf++) = (unsigned char)(esd->Cesd >> 0);
-
- /* Pesd */
- *(buf++) = (unsigned char)(esd->Pesd >> 0);
-
- /* Data */
- if (esd->numcomps < 257) {
- memset(buf, 0xAA, (size_t) esd->Lesd - 4);
- }
- /*memcpy(buf, esd->data, (size_t) esd->Lesd - 4);*/
- else {
- memset(buf, 0xAA, (size_t) esd->Lesd - 5);
- }
- /*memcpy(buf, esd->data, (size_t) esd->Lesd - 5);*/
-
- /* update markers struct */
- j2k_add_marker(j2k->cstr_info, J2K_MS_ESD, -1, esd->Lesd + 2);
-
- return OPJ_TRUE;
-}
-
-unsigned short int jpwl_double_to_pfp(double V, int bytes)
-{
-
- unsigned short int em, e, m;
-
- switch (bytes) {
-
- case (1):
-
- if (V < MIN_V1) {
- e = 0x0000;
- m = 0x0000;
- } else if (V > MAX_V1) {
- e = 0x000F;
- m = 0x000F;
- } else {
- e = (unsigned short int)(floor(log(V) * 1.44269504088896) / 4.0);
- m = (unsigned short int)(0.5 + (V / (pow(2.0, (double)(4 * e)))));
- }
- em = ((e & 0x000F) << 4) + (m & 0x000F);
- break;
-
- case (2):
-
- if (V < MIN_V2) {
- e = 0x0000;
- m = 0x0000;
- } else if (V > MAX_V2) {
- e = 0x001F;
- m = 0x07FF;
- } else {
- e = (unsigned short int) floor(log(V) * 1.44269504088896) + 15;
- m = (unsigned short int)(0.5 + 2048.0 * ((V / (pow(2.0,
- (double) e - 15.0))) - 1.0));
- }
- em = ((e & 0x001F) << 11) + (m & 0x07FF);
- break;
-
- default:
-
- em = 0x0000;
- break;
- };
-
- return em;
-}
-
-double jpwl_pfp_to_double(unsigned short int em, int bytes)
-{
-
- double V;
-
- switch (bytes) {
-
- case 1:
- V = (double)(em & 0x0F) * pow(2.0, (double)(em & 0xF0));
- break;
-
- case 2:
-
- V = pow(2.0, (double)((em & 0xF800) >> 11) - 15.0) * (1.0 + (double)(
- em & 0x07FF) / 2048.0);
- break;
-
- default:
- V = 0.0;
- break;
-
- }
-
- return V;
-
-}
-
-opj_bool jpwl_update_info(opj_j2k_t *j2k, jpwl_marker_t *jwmarker,
- int jwmarker_num)
-{
-
- int mm;
- unsigned long int addlen;
-
- opj_codestream_info_t *info = j2k->cstr_info;
- int tileno, tpno, packno, numtiles = info->th * info->tw,
- numpacks = info->packno;
-
- if (!j2k || !jwmarker) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "J2K handle or JPWL markers list badly allocated\n");
- return OPJ_FALSE;
- }
-
- /* main_head_end: how many markers are there before? */
- addlen = 0;
- for (mm = 0; mm < jwmarker_num; mm++)
- if (jwmarker[mm].pos < (unsigned long int) info->main_head_end) {
- addlen += jwmarker[mm].len + 2;
- }
- info->main_head_end += addlen;
-
- /* codestream_size: always increment with all markers */
- addlen = 0;
- for (mm = 0; mm < jwmarker_num; mm++) {
- addlen += jwmarker[mm].len + 2;
- }
- info->codestream_size += addlen;
-
- /* navigate through all the tiles */
- for (tileno = 0; tileno < numtiles; tileno++) {
-
- /* start_pos: increment with markers before SOT */
- addlen = 0;
- for (mm = 0; mm < jwmarker_num; mm++)
- if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].start_pos) {
- addlen += jwmarker[mm].len + 2;
- }
- info->tile[tileno].start_pos += addlen;
-
- /* end_header: increment with markers before of it */
- addlen = 0;
- for (mm = 0; mm < jwmarker_num; mm++)
- if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].end_header) {
- addlen += jwmarker[mm].len + 2;
- }
- info->tile[tileno].end_header += addlen;
-
- /* end_pos: increment with markers before the end of this tile */
- /* code is disabled, since according to JPWL no markers can be beyond TPH */
- addlen = 0;
- for (mm = 0; mm < jwmarker_num; mm++)
- if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].end_pos) {
- addlen += jwmarker[mm].len + 2;
- }
- info->tile[tileno].end_pos += addlen;
-
- /* navigate through all the tile parts */
- for (tpno = 0; tpno < info->tile[tileno].num_tps; tpno++) {
-
- /* start_pos: increment with markers before SOT */
- addlen = 0;
- for (mm = 0; mm < jwmarker_num; mm++)
- if (jwmarker[mm].pos < (unsigned long int)
- info->tile[tileno].tp[tpno].tp_start_pos) {
- addlen += jwmarker[mm].len + 2;
- }
- info->tile[tileno].tp[tpno].tp_start_pos += addlen;
-
- /* end_header: increment with markers before of it */
- addlen = 0;
- for (mm = 0; mm < jwmarker_num; mm++)
- if (jwmarker[mm].pos < (unsigned long int)
- info->tile[tileno].tp[tpno].tp_end_header) {
- addlen += jwmarker[mm].len + 2;
- }
- info->tile[tileno].tp[tpno].tp_end_header += addlen;
-
- /* end_pos: increment with markers before the end of this tile part */
- addlen = 0;
- for (mm = 0; mm < jwmarker_num; mm++)
- if (jwmarker[mm].pos < (unsigned long int)
- info->tile[tileno].tp[tpno].tp_end_pos) {
- addlen += jwmarker[mm].len + 2;
- }
- info->tile[tileno].tp[tpno].tp_end_pos += addlen;
-
- }
-
- /* navigate through all the packets in this tile */
- for (packno = 0; packno < numpacks; packno++) {
-
- /* start_pos: increment with markers before the packet */
- /* disabled for the same reason as before */
- addlen = 0;
- for (mm = 0; mm < jwmarker_num; mm++)
- if (jwmarker[mm].pos <= (unsigned long int)
- info->tile[tileno].packet[packno].start_pos) {
- addlen += jwmarker[mm].len + 2;
- }
- info->tile[tileno].packet[packno].start_pos += addlen;
-
- /* end_ph_pos: increment with markers before the packet */
- /* disabled for the same reason as before */
- /*addlen = 0;
- for (mm = 0; mm < jwmarker_num; mm++)
- if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].packet[packno].end_ph_pos)
- addlen += jwmarker[mm].len + 2;*/
- info->tile[tileno].packet[packno].end_ph_pos += addlen;
-
- /* end_pos: increment if marker is before the end of packet */
- /* disabled for the same reason as before */
- /*addlen = 0;
- for (mm = 0; mm < jwmarker_num; mm++)
- if (jwmarker[mm].pos < (unsigned long int) info->tile[tileno].packet[packno].end_pos)
- addlen += jwmarker[mm].len + 2;*/
- info->tile[tileno].packet[packno].end_pos += addlen;
-
- }
- }
-
- /* reorder the markers list */
-
- return OPJ_TRUE;
-}
-
-#endif /* USE_JPWL */
+++ /dev/null
-prefix=@CMAKE_INSTALL_PREFIX@
-bindir=${prefix}/@OPENJPEG_INSTALL_BIN_DIR@
-mandir=${prefix}/@OPENJPEG_INSTALL_MAN_DIR@
-docdir=${prefix}/@OPENJPEG_INSTALL_DOC_DIR@
-libdir=${prefix}/@OPENJPEG_INSTALL_LIB_DIR@
-includedir=${prefix}/@OPENJPEG_INSTALL_INCLUDE_DIR@
-
-Name: openjpwl
-Description: JPEG2000 Wireless library (Part 11)
-URL: http://www.openjpeg.org/
-Version: @OPENJPEG_VERSION@
-Requires: libopenjp2
-Libs: -L${libdir} -lopenjpwl
-Libs.private: -lm
-Cflags: -I${includedir}
+++ /dev/null
-/*
-* 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy
-* 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.
-*/
-
-#ifdef USE_JPWL
-
-/**
-@file rs.c
-@brief Functions used to compute the Reed-Solomon parity and check of byte arrays
-
-*/
-
-/**
- * Reed-Solomon coding and decoding
- * Phil Karn (karn@ka9q.ampr.org) September 1996
- *
- * This file is derived from the program "new_rs_erasures.c" by Robert
- * Morelos-Zaragoza (robert@spectra.eng.hawaii.edu) and Hari Thirumoorthy
- * (harit@spectra.eng.hawaii.edu), Aug 1995
- *
- * I've made changes to improve performance, clean up the code and make it
- * easier to follow. Data is now passed to the encoding and decoding functions
- * through arguments rather than in global arrays. The decode function returns
- * the number of corrected symbols, or -1 if the word is uncorrectable.
- *
- * This code supports a symbol size from 2 bits up to 16 bits,
- * implying a block size of 3 2-bit symbols (6 bits) up to 65535
- * 16-bit symbols (1,048,560 bits). The code parameters are set in rs.h.
- *
- * Note that if symbols larger than 8 bits are used, the type of each
- * data array element switches from unsigned char to unsigned int. The
- * caller must ensure that elements larger than the symbol range are
- * not passed to the encoder or decoder.
- *
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include "rs.h"
-
-/* This defines the type used to store an element of the Galois Field
- * used by the code. Make sure this is something larger than a char if
- * if anything larger than GF(256) is used.
- *
- * Note: unsigned char will work up to GF(256) but int seems to run
- * faster on the Pentium.
- */
-typedef int gf;
-
-/* KK = number of information symbols */
-static int KK;
-
-/* Primitive polynomials - see Lin & Costello, Appendix A,
- * and Lee & Messerschmitt, p. 453.
- */
-#if(MM == 2)/* Admittedly silly */
-int Pp[MM + 1] = { 1, 1, 1 };
-
-#elif(MM == 3)
-/* 1 + x + x^3 */
-int Pp[MM + 1] = { 1, 1, 0, 1 };
-
-#elif(MM == 4)
-/* 1 + x + x^4 */
-int Pp[MM + 1] = { 1, 1, 0, 0, 1 };
-
-#elif(MM == 5)
-/* 1 + x^2 + x^5 */
-int Pp[MM + 1] = { 1, 0, 1, 0, 0, 1 };
-
-#elif(MM == 6)
-/* 1 + x + x^6 */
-int Pp[MM + 1] = { 1, 1, 0, 0, 0, 0, 1 };
-
-#elif(MM == 7)
-/* 1 + x^3 + x^7 */
-int Pp[MM + 1] = { 1, 0, 0, 1, 0, 0, 0, 1 };
-
-#elif(MM == 8)
-/* 1+x^2+x^3+x^4+x^8 */
-int Pp[MM + 1] = { 1, 0, 1, 1, 1, 0, 0, 0, 1 };
-
-#elif(MM == 9)
-/* 1+x^4+x^9 */
-int Pp[MM + 1] = { 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 };
-
-#elif(MM == 10)
-/* 1+x^3+x^10 */
-int Pp[MM + 1] = { 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1 };
-
-#elif(MM == 11)
-/* 1+x^2+x^11 */
-int Pp[MM + 1] = { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
-
-#elif(MM == 12)
-/* 1+x+x^4+x^6+x^12 */
-int Pp[MM + 1] = { 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 };
-
-#elif(MM == 13)
-/* 1+x+x^3+x^4+x^13 */
-int Pp[MM + 1] = { 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
-
-#elif(MM == 14)
-/* 1+x+x^6+x^10+x^14 */
-int Pp[MM + 1] = { 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 };
-
-#elif(MM == 15)
-/* 1+x+x^15 */
-int Pp[MM + 1] = { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
-
-#elif(MM == 16)
-/* 1+x+x^3+x^12+x^16 */
-int Pp[MM + 1] = { 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 };
-
-#else
-#error "MM must be in range 2-16"
-#endif
-
-/* Alpha exponent for the first root of the generator polynomial */
-#define B0 0 /* Different from the default 1 */
-
-/* index->polynomial form conversion table */
-gf Alpha_to[NN + 1];
-
-/* Polynomial->index form conversion table */
-gf Index_of[NN + 1];
-
-/* No legal value in index form represents zero, so
- * we need a special value for this purpose
- */
-#define A0 (NN)
-
-/* Generator polynomial g(x)
- * Degree of g(x) = 2*TT
- * has roots @**B0, @**(B0+1), ... ,@^(B0+2*TT-1)
- */
-/*gf Gg[NN - KK + 1];*/
-gf Gg[NN - 1];
-
-/* Compute x % NN, where NN is 2**MM - 1,
- * without a slow divide
- */
-static /*inline*/ gf
-modnn(int x)
-{
- while (x >= NN) {
- x -= NN;
- x = (x >> MM) + (x & NN);
- }
- return x;
-}
-
-/*#define min(a,b) ((a) < (b) ? (a) : (b))*/
-
-#define CLEAR(a,n) {\
- int ci;\
- for(ci=(n)-1;ci >=0;ci--)\
- (a)[ci] = 0;\
- }
-
-#define COPY(a,b,n) {\
- int ci;\
- for(ci=(n)-1;ci >=0;ci--)\
- (a)[ci] = (b)[ci];\
- }
-#define COPYDOWN(a,b,n) {\
- int ci;\
- for(ci=(n)-1;ci >=0;ci--)\
- (a)[ci] = (b)[ci];\
- }
-
-void init_rs(int k)
-{
- KK = k;
- if (KK >= NN) {
- printf("KK must be less than 2**MM - 1\n");
- exit(1);
- }
-
- generate_gf();
- gen_poly();
-}
-
-/* generate GF(2**m) from the irreducible polynomial p(X) in p[0]..p[m]
- lookup tables: index->polynomial form alpha_to[] contains j=alpha**i;
- polynomial form -> index form index_of[j=alpha**i] = i
- alpha=2 is the primitive element of GF(2**m)
- HARI's COMMENT: (4/13/94) alpha_to[] can be used as follows:
- Let @ represent the primitive element commonly called "alpha" that
- is the root of the primitive polynomial p(x). Then in GF(2^m), for any
- 0 <= i <= 2^m-2,
- @^i = a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1)
- where the binary vector (a(0),a(1),a(2),...,a(m-1)) is the representation
- of the integer "alpha_to[i]" with a(0) being the LSB and a(m-1) the MSB. Thus for
- example the polynomial representation of @^5 would be given by the binary
- representation of the integer "alpha_to[5]".
- Similarly, index_of[] can be used as follows:
- As above, let @ represent the primitive element of GF(2^m) that is
- the root of the primitive polynomial p(x). In order to find the power
- of @ (alpha) that has the polynomial representation
- a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1)
- we consider the integer "i" whose binary representation with a(0) being LSB
- and a(m-1) MSB is (a(0),a(1),...,a(m-1)) and locate the entry
- "index_of[i]". Now, @^index_of[i] is that element whose polynomial
- representation is (a(0),a(1),a(2),...,a(m-1)).
- NOTE:
- The element alpha_to[2^m-1] = 0 always signifying that the
- representation of "@^infinity" = 0 is (0,0,0,...,0).
- Similarly, the element index_of[0] = A0 always signifying
- that the power of alpha which has the polynomial representation
- (0,0,...,0) is "infinity".
-
-*/
-
-void
-generate_gf(void)
-{
- register int i, mask;
-
- mask = 1;
- Alpha_to[MM] = 0;
- for (i = 0; i < MM; i++) {
- Alpha_to[i] = mask;
- Index_of[Alpha_to[i]] = i;
- /* If Pp[i] == 1 then, term @^i occurs in poly-repr of @^MM */
- if (Pp[i] != 0) {
- Alpha_to[MM] ^= mask; /* Bit-wise EXOR operation */
- }
- mask <<= 1; /* single left-shift */
- }
- Index_of[Alpha_to[MM]] = MM;
- /*
- * Have obtained poly-repr of @^MM. Poly-repr of @^(i+1) is given by
- * poly-repr of @^i shifted left one-bit and accounting for any @^MM
- * term that may occur when poly-repr of @^i is shifted.
- */
- mask >>= 1;
- for (i = MM + 1; i < NN; i++) {
- if (Alpha_to[i - 1] >= mask) {
- Alpha_to[i] = Alpha_to[MM] ^ ((Alpha_to[i - 1] ^ mask) << 1);
- } else {
- Alpha_to[i] = Alpha_to[i - 1] << 1;
- }
- Index_of[Alpha_to[i]] = i;
- }
- Index_of[0] = A0;
- Alpha_to[NN] = 0;
-}
-
-
-/*
- * Obtain the generator polynomial of the TT-error correcting, length
- * NN=(2**MM -1) Reed Solomon code from the product of (X+@**(B0+i)), i = 0,
- * ... ,(2*TT-1)
- *
- * Examples:
- *
- * If B0 = 1, TT = 1. deg(g(x)) = 2*TT = 2.
- * g(x) = (x+@) (x+@**2)
- *
- * If B0 = 0, TT = 2. deg(g(x)) = 2*TT = 4.
- * g(x) = (x+1) (x+@) (x+@**2) (x+@**3)
- */
-void
-gen_poly(void)
-{
- register int i, j;
-
- Gg[0] = Alpha_to[B0];
- Gg[1] = 1; /* g(x) = (X+@**B0) initially */
- for (i = 2; i <= NN - KK; i++) {
- Gg[i] = 1;
- /*
- * Below multiply (Gg[0]+Gg[1]*x + ... +Gg[i]x^i) by
- * (@**(B0+i-1) + x)
- */
- for (j = i - 1; j > 0; j--)
- if (Gg[j] != 0) {
- Gg[j] = Gg[j - 1] ^ Alpha_to[modnn((Index_of[Gg[j]]) + B0 + i - 1)];
- } else {
- Gg[j] = Gg[j - 1];
- }
- /* Gg[0] can never be zero */
- Gg[0] = Alpha_to[modnn((Index_of[Gg[0]]) + B0 + i - 1)];
- }
- /* convert Gg[] to index form for quicker encoding */
- for (i = 0; i <= NN - KK; i++) {
- Gg[i] = Index_of[Gg[i]];
- }
-}
-
-
-/*
- * take the string of symbols in data[i], i=0..(k-1) and encode
- * systematically to produce NN-KK parity symbols in bb[0]..bb[NN-KK-1] data[]
- * is input and bb[] is output in polynomial form. Encoding is done by using
- * a feedback shift register with appropriate connections specified by the
- * elements of Gg[], which was generated above. Codeword is c(X) =
- * data(X)*X**(NN-KK)+ b(X)
- */
-int
-encode_rs(dtype *data, dtype *bb)
-{
- register int i, j;
- gf feedback;
-
- CLEAR(bb, NN - KK);
- for (i = KK - 1; i >= 0; i--) {
-#if (MM != 8)
- if (data[i] > NN) {
- return -1; /* Illegal symbol */
- }
-#endif
- feedback = Index_of[data[i] ^ bb[NN - KK - 1]];
- if (feedback != A0) { /* feedback term is non-zero */
- for (j = NN - KK - 1; j > 0; j--)
- if (Gg[j] != A0) {
- bb[j] = bb[j - 1] ^ Alpha_to[modnn(Gg[j] + feedback)];
- } else {
- bb[j] = bb[j - 1];
- }
- bb[0] = Alpha_to[modnn(Gg[0] + feedback)];
- } else {
- /* feedback term is zero. encoder becomes a
- * single-byte shifter */
- for (j = NN - KK - 1; j > 0; j--) {
- bb[j] = bb[j - 1];
- }
- bb[0] = 0;
- }
- }
- return 0;
-}
-
-/*
- * Performs ERRORS+ERASURES decoding of RS codes. If decoding is successful,
- * writes the codeword into data[] itself. Otherwise data[] is unaltered.
- *
- * Return number of symbols corrected, or -1 if codeword is illegal
- * or uncorrectable.
- *
- * First "no_eras" erasures are declared by the calling program. Then, the
- * maximum # of errors correctable is t_after_eras = floor((NN-KK-no_eras)/2).
- * If the number of channel errors is not greater than "t_after_eras" the
- * transmitted codeword will be recovered. Details of algorithm can be found
- * in R. Blahut's "Theory ... of Error-Correcting Codes".
- */
-int
-eras_dec_rs(dtype *data, int *eras_pos, int no_eras)
-{
- int deg_lambda, el, deg_omega;
- int i, j, r;
- gf u, q, tmp, num1, num2, den, discr_r;
- gf recd[NN];
- /* Err+Eras Locator poly and syndrome poly */
- /*gf lambda[NN-KK + 1], s[NN-KK + 1];
- gf b[NN-KK + 1], t[NN-KK + 1], omega[NN-KK + 1];
- gf root[NN-KK], reg[NN-KK + 1], loc[NN-KK];*/
- gf lambda[NN + 1], s[NN + 1];
- gf b[NN + 1], t[NN + 1], omega[NN + 1];
- gf root[NN], reg[NN + 1], loc[NN];
- int syn_error, count;
-
- /* data[] is in polynomial form, copy and convert to index form */
- for (i = NN - 1; i >= 0; i--) {
-#if (MM != 8)
- if (data[i] > NN) {
- return -1; /* Illegal symbol */
- }
-#endif
- recd[i] = Index_of[data[i]];
- }
- /* first form the syndromes; i.e., evaluate recd(x) at roots of g(x)
- * namely @**(B0+i), i = 0, ... ,(NN-KK-1)
- */
- syn_error = 0;
- for (i = 1; i <= NN - KK; i++) {
- tmp = 0;
- for (j = 0; j < NN; j++)
- if (recd[j] != A0) { /* recd[j] in index form */
- tmp ^= Alpha_to[modnn(recd[j] + (B0 + i - 1) * j)];
- }
- syn_error |= tmp; /* set flag if non-zero syndrome =>
- * error */
- /* store syndrome in index form */
- s[i] = Index_of[tmp];
- }
- if (!syn_error) {
- /*
- * if syndrome is zero, data[] is a codeword and there are no
- * errors to correct. So return data[] unmodified
- */
- return 0;
- }
- CLEAR(&lambda[1], NN - KK);
- lambda[0] = 1;
- if (no_eras > 0) {
- /* Init lambda to be the erasure locator polynomial */
- lambda[1] = Alpha_to[eras_pos[0]];
- for (i = 1; i < no_eras; i++) {
- u = eras_pos[i];
- for (j = i + 1; j > 0; j--) {
- tmp = Index_of[lambda[j - 1]];
- if (tmp != A0) {
- lambda[j] ^= Alpha_to[modnn(u + tmp)];
- }
- }
- }
-#ifdef ERASURE_DEBUG
- /* find roots of the erasure location polynomial */
- for (i = 1; i <= no_eras; i++) {
- reg[i] = Index_of[lambda[i]];
- }
- count = 0;
- for (i = 1; i <= NN; i++) {
- q = 1;
- for (j = 1; j <= no_eras; j++)
- if (reg[j] != A0) {
- reg[j] = modnn(reg[j] + j);
- q ^= Alpha_to[reg[j]];
- }
- if (!q) {
- /* store root and error location
- * number indices
- */
- root[count] = i;
- loc[count] = NN - i;
- count++;
- }
- }
- if (count != no_eras) {
- printf("\n lambda(x) is WRONG\n");
- return -1;
- }
-#ifndef NO_PRINT
- printf("\n Erasure positions as determined by roots of Eras Loc Poly:\n");
- for (i = 0; i < count; i++) {
- printf("%d ", loc[i]);
- }
- printf("\n");
-#endif
-#endif
- }
- for (i = 0; i < NN - KK + 1; i++) {
- b[i] = Index_of[lambda[i]];
- }
-
- /*
- * Begin Berlekamp-Massey algorithm to determine error+erasure
- * locator polynomial
- */
- r = no_eras;
- el = no_eras;
- while (++r <= NN - KK) { /* r is the step number */
- /* Compute discrepancy at the r-th step in poly-form */
- discr_r = 0;
- for (i = 0; i < r; i++) {
- if ((lambda[i] != 0) && (s[r - i] != A0)) {
- discr_r ^= Alpha_to[modnn(Index_of[lambda[i]] + s[r - i])];
- }
- }
- discr_r = Index_of[discr_r]; /* Index form */
- if (discr_r == A0) {
- /* 2 lines below: B(x) <-- x*B(x) */
- COPYDOWN(&b[1], b, NN - KK);
- b[0] = A0;
- } else {
- /* 7 lines below: T(x) <-- lambda(x) - discr_r*x*b(x) */
- t[0] = lambda[0];
- for (i = 0 ; i < NN - KK; i++) {
- if (b[i] != A0) {
- t[i + 1] = lambda[i + 1] ^ Alpha_to[modnn(discr_r + b[i])];
- } else {
- t[i + 1] = lambda[i + 1];
- }
- }
- if (2 * el <= r + no_eras - 1) {
- el = r + no_eras - el;
- /*
- * 2 lines below: B(x) <-- inv(discr_r) *
- * lambda(x)
- */
- for (i = 0; i <= NN - KK; i++) {
- b[i] = (lambda[i] == 0) ? A0 : modnn(Index_of[lambda[i]] - discr_r + NN);
- }
- } else {
- /* 2 lines below: B(x) <-- x*B(x) */
- COPYDOWN(&b[1], b, NN - KK);
- b[0] = A0;
- }
- COPY(lambda, t, NN - KK + 1);
- }
- }
-
- /* Convert lambda to index form and compute deg(lambda(x)) */
- deg_lambda = 0;
- for (i = 0; i < NN - KK + 1; i++) {
- lambda[i] = Index_of[lambda[i]];
- if (lambda[i] != A0) {
- deg_lambda = i;
- }
- }
- /*
- * Find roots of the error+erasure locator polynomial. By Chien
- * Search
- */
- COPY(®[1], &lambda[1], NN - KK);
- count = 0; /* Number of roots of lambda(x) */
- for (i = 1; i <= NN; i++) {
- q = 1;
- for (j = deg_lambda; j > 0; j--)
- if (reg[j] != A0) {
- reg[j] = modnn(reg[j] + j);
- q ^= Alpha_to[reg[j]];
- }
- if (!q) {
- /* store root (index-form) and error location number */
- root[count] = i;
- loc[count] = NN - i;
- count++;
- }
- }
-
-#ifdef DEBUG
- printf("\n Final error positions:\t");
- for (i = 0; i < count; i++) {
- printf("%d ", loc[i]);
- }
- printf("\n");
-#endif
- if (deg_lambda != count) {
- /*
- * deg(lambda) unequal to number of roots => uncorrectable
- * error detected
- */
- return -1;
- }
- /*
- * Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo
- * x**(NN-KK)). in index form. Also find deg(omega).
- */
- deg_omega = 0;
- for (i = 0; i < NN - KK; i++) {
- tmp = 0;
- j = (deg_lambda < i) ? deg_lambda : i;
- for (; j >= 0; j--) {
- if ((s[i + 1 - j] != A0) && (lambda[j] != A0)) {
- tmp ^= Alpha_to[modnn(s[i + 1 - j] + lambda[j])];
- }
- }
- if (tmp != 0) {
- deg_omega = i;
- }
- omega[i] = Index_of[tmp];
- }
- omega[NN - KK] = A0;
-
- /*
- * Compute error values in poly-form. num1 = omega(inv(X(l))), num2 =
- * inv(X(l))**(B0-1) and den = lambda_pr(inv(X(l))) all in poly-form
- */
- for (j = count - 1; j >= 0; j--) {
- num1 = 0;
- for (i = deg_omega; i >= 0; i--) {
- if (omega[i] != A0) {
- num1 ^= Alpha_to[modnn(omega[i] + i * root[j])];
- }
- }
- num2 = Alpha_to[modnn(root[j] * (B0 - 1) + NN)];
- den = 0;
-
- /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */
- for (i = min(deg_lambda, NN - KK - 1) & ~1; i >= 0; i -= 2) {
- if (lambda[i + 1] != A0) {
- den ^= Alpha_to[modnn(lambda[i + 1] + i * root[j])];
- }
- }
- if (den == 0) {
-#ifdef DEBUG
- printf("\n ERROR: denominator = 0\n");
-#endif
- return -1;
- }
- /* Apply error to data */
- if (num1 != 0) {
- data[loc[j]] ^= Alpha_to[modnn(Index_of[num1] + Index_of[num2] + NN -
- Index_of[den])];
- }
- }
- return count;
-}
-
-
-#endif /* USE_JPWL */
+++ /dev/null
-/*
- * 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) 2005-2006, Dept. of Electronic and Information Engineering, Universita' degli Studi di Perugia, Italy
- * 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.
- */
-
-#ifdef USE_JPWL
-
-/**
-@file rs.h
-@brief Functions used to compute Reed-Solomon parity and check of byte arrays
-
-*/
-
-#ifndef __RS_HEADER__
-#define __RS_HEADER__
-
-/** Global definitions for Reed-Solomon encoder/decoder
- * Phil Karn KA9Q, September 1996
- *
- * The parameters MM and KK specify the Reed-Solomon code parameters.
- *
- * Set MM to be the size of each code symbol in bits. The Reed-Solomon
- * block size will then be NN = 2**M - 1 symbols. Supported values are
- * defined in rs.c.
- *
- * Set KK to be the number of data symbols in each block, which must be
- * less than the block size. The code will then be able to correct up
- * to NN-KK erasures or (NN-KK)/2 errors, or combinations thereof with
- * each error counting as two erasures.
- */
-#define MM 8 /* RS code over GF(2**MM) - change to suit */
-
-/* KK defined in rs.c */
-
-#define NN ((1 << MM) - 1)
-
-#if (MM <= 8)
-typedef unsigned char dtype;
-#else
-typedef unsigned int dtype;
-#endif
-
-/** Initialization function */
-void init_rs(int);
-
-/** These two functions *must* be called in this order (e.g.,
- * by init_rs()) before any encoding/decoding
- */
-void generate_gf(void); /* Generate Galois Field */
-void gen_poly(void); /* Generate generator polynomial */
-
-/** Reed-Solomon encoding
- * data[] is the input block, parity symbols are placed in bb[]
- * bb[] may lie past the end of the data, e.g., for (255,223):
- * encode_rs(&data[0],&data[223]);
- */
-int encode_rs(dtype data[], dtype bb[]);
-
-/** Reed-Solomon erasures-and-errors decoding
- * The received block goes into data[], and a list of zero-origin
- * erasure positions, if any, goes in eras_pos[] with a count in no_eras.
- *
- * The decoder corrects the symbols in place, if possible and returns
- * the number of corrected symbols. If the codeword is illegal or
- * uncorrectible, the data array is unchanged and -1 is returned
- */
-int eras_dec_rs(dtype data[], int eras_pos[], int no_eras);
-
-/**
-Computes the minimum between two integers
-@param a first integer to compare
-@param b second integer to compare
-@return returns the minimum integer between a and b
-*/
-#ifndef min
-#define min(a,b) (((a) < (b)) ? (a) : (b))
-#endif /* min */
-
-#endif /* __RS_HEADER__ */
-
-
-#endif /* USE_JPWL */
+++ /dev/null
-# openmj2:
-set(OPENMJ2_LIBRARY_NAME openmj2)
-
-include_directories(
- ${OPENJPEG_BINARY_DIR}/src/lib/openjp2 # opj_config.h
- )
-
-set(OPENMJ2_SRCS
- mj2.c
- mj2_convert.c
-# FIXME: legacy
- j2k_lib.c
- cio.c
- jp2.c
- j2k.c
- tcd.c
- mct.c
- t1.c
- t2.c
- pi.c
- bio.c
- mqc.c
- tgt.c
- dwt.c
- event.c
- image.c
- jpt.c
- raw.c
- openjpeg.c
-)
-
-# Build the library
-if(WIN32)
- if(BUILD_SHARED_LIBS)
- add_definitions(-DOPJ_EXPORTS)
- else()
- add_definitions(-DOPJ_STATIC)
- endif()
-endif()
-
-# build mj2 lib:
-add_library(${OPENMJ2_LIBRARY_NAME} ${OPENMJ2_SRCS})
-# FIXME: We are using an openjpeg 1.5 copy:
-#target_link_libraries(${OPENMJ2_LIBRARY_NAME} openjp2)
-if(UNIX)
- target_link_libraries(${OPENMJ2_LIBRARY_NAME} m)
-endif()
-set_target_properties(${OPENMJ2_LIBRARY_NAME} PROPERTIES ${OPENJPEG_LIBRARY_PROPERTIES})
-if(NOT ${CMAKE_VERSION} VERSION_LESS "2.8.12")
- target_compile_options(${OPENMJ2_LIBRARY_NAME} PRIVATE ${OPENJPEG_LIBRARY_COMPILE_OPTIONS})
-endif()
-
-# Install library
-install(TARGETS ${OPENMJ2_LIBRARY_NAME}
- EXPORT OpenMJ2Targets
- DESTINATION ${OPENJPEG_INSTALL_LIB_DIR}
- COMPONENT Libraries
-)
-
-# Install includes files
-#install(FILES mj2.h
-# DESTINATION ${OPENJPEG_INSTALL_INCLUDE_DIR}/${subdir}
-# COMPONENT Headers
-#)
+++ /dev/null
-/*
- * 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.
- */
-
-#include "opj_includes.h"
-
-/** @defgroup BIO BIO - Individual bit input-output stream */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Write a bit
-@param bio BIO handle
-@param b Bit to write (0 or 1)
-*/
-static void bio_putbit(opj_bio_t *bio, int b);
-/**
-Read a bit
-@param bio BIO handle
-@return Returns the read bit
-*/
-static int bio_getbit(opj_bio_t *bio);
-/**
-Write a byte
-@param bio BIO handle
-@return Returns 0 if successful, returns 1 otherwise
-*/
-static int bio_byteout(opj_bio_t *bio);
-/**
-Read a byte
-@param bio BIO handle
-@return Returns 0 if successful, returns 1 otherwise
-*/
-static int bio_bytein(opj_bio_t *bio);
-
-/*@}*/
-
-/*@}*/
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-static int bio_byteout(opj_bio_t *bio)
-{
- bio->buf = (bio->buf << 8) & 0xffff;
- bio->ct = bio->buf == 0xff00 ? 7 : 8;
- if (bio->bp >= bio->end) {
- return 1;
- }
- *bio->bp++ = bio->buf >> 8;
- return 0;
-}
-
-static int bio_bytein(opj_bio_t *bio)
-{
- bio->buf = (bio->buf << 8) & 0xffff;
- bio->ct = bio->buf == 0xff00 ? 7 : 8;
- if (bio->bp >= bio->end) {
- return 1;
- }
- bio->buf |= *bio->bp++;
- return 0;
-}
-
-static void bio_putbit(opj_bio_t *bio, int b)
-{
- if (bio->ct == 0) {
- bio_byteout(bio);
- }
- bio->ct--;
- bio->buf |= b << bio->ct;
-}
-
-static int bio_getbit(opj_bio_t *bio)
-{
- if (bio->ct == 0) {
- bio_bytein(bio);
- }
- bio->ct--;
- return (bio->buf >> bio->ct) & 1;
-}
-
-/*
-==========================================================
- Bit Input/Output interface
-==========================================================
-*/
-
-opj_bio_t* bio_create(void)
-{
- opj_bio_t *bio = (opj_bio_t*)opj_malloc(sizeof(opj_bio_t));
- return bio;
-}
-
-void bio_destroy(opj_bio_t *bio)
-{
- if (bio) {
- opj_free(bio);
- }
-}
-
-int bio_numbytes(opj_bio_t *bio)
-{
- return (bio->bp - bio->start);
-}
-
-void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len)
-{
- bio->start = bp;
- bio->end = bp + len;
- bio->bp = bp;
- bio->buf = 0;
- bio->ct = 8;
-}
-
-void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len)
-{
- bio->start = bp;
- bio->end = bp + len;
- bio->bp = bp;
- bio->buf = 0;
- bio->ct = 0;
-}
-
-void bio_write(opj_bio_t *bio, int v, int n)
-{
- int i;
- for (i = n - 1; i >= 0; i--) {
- bio_putbit(bio, (v >> i) & 1);
- }
-}
-
-int bio_read(opj_bio_t *bio, int n)
-{
- int i, v;
- v = 0;
- for (i = n - 1; i >= 0; i--) {
- v += bio_getbit(bio) << i;
- }
- return v;
-}
-
-int bio_flush(opj_bio_t *bio)
-{
- bio->ct = 0;
- if (bio_byteout(bio)) {
- return 1;
- }
- if (bio->ct == 7) {
- bio->ct = 0;
- if (bio_byteout(bio)) {
- return 1;
- }
- }
- return 0;
-}
-
-int bio_inalign(opj_bio_t *bio)
-{
- bio->ct = 0;
- if ((bio->buf & 0xff) == 0xff) {
- if (bio_bytein(bio)) {
- return 1;
- }
- bio->ct = 0;
- }
- return 0;
-}
+++ /dev/null
-/*
- * 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 __BIO_H
-#define __BIO_H
-/**
-@file bio.h
-@brief Implementation of an individual bit input-output (BIO)
-
-The functions in BIO.C have for goal to realize an individual bit input - output.
-*/
-
-/** @defgroup BIO BIO - Individual bit input-output stream */
-/*@{*/
-
-/**
-Individual bit input-output stream (BIO)
-*/
-typedef struct opj_bio {
- /** pointer to the start of the buffer */
- unsigned char *start;
- /** pointer to the end of the buffer */
- unsigned char *end;
- /** pointer to the present position in the buffer */
- unsigned char *bp;
- /** temporary place where each byte is read or written */
- unsigned int buf;
- /** coder : number of bits free to write. decoder : number of bits read */
- int ct;
-} opj_bio_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a new BIO handle
-@return Returns a new BIO handle if successful, returns NULL otherwise
-*/
-opj_bio_t* bio_create(void);
-/**
-Destroy a previously created BIO handle
-@param bio BIO handle to destroy
-*/
-void bio_destroy(opj_bio_t *bio);
-/**
-Number of bytes written.
-@param bio BIO handle
-@return Returns the number of bytes written
-*/
-int bio_numbytes(opj_bio_t *bio);
-/**
-Init encoder
-@param bio BIO handle
-@param bp Output buffer
-@param len Output buffer length
-*/
-void bio_init_enc(opj_bio_t *bio, unsigned char *bp, int len);
-/**
-Init decoder
-@param bio BIO handle
-@param bp Input buffer
-@param len Input buffer length
-*/
-void bio_init_dec(opj_bio_t *bio, unsigned char *bp, int len);
-/**
-Write bits
-@param bio BIO handle
-@param v Value of bits
-@param n Number of bits to write
-*/
-void bio_write(opj_bio_t *bio, int v, int n);
-/**
-Read bits
-@param bio BIO handle
-@param n Number of bits to read
-@return Returns the corresponding read number
-*/
-int bio_read(opj_bio_t *bio, int n);
-/**
-Flush bits
-@param bio BIO handle
-@return Returns 1 if successful, returns 0 otherwise
-*/
-int bio_flush(opj_bio_t *bio);
-/**
-Passes the ending bits (coming from flushing)
-@param bio BIO handle
-@return Returns 1 if successful, returns 0 otherwise
-*/
-int bio_inalign(opj_bio_t *bio);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __BIO_H */
-
+++ /dev/null
-/*
- * 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.
- */
-
-#include "opj_includes.h"
-
-/* ----------------------------------------------------------------------- */
-
-opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo,
- unsigned char *buffer, int length)
-{
- opj_cp_t *cp = NULL;
- opj_cio_t *cio = (opj_cio_t*)opj_malloc(sizeof(opj_cio_t));
- if (!cio) {
- return NULL;
- }
- cio->cinfo = cinfo;
- if (buffer && length) {
- /* wrap a user buffer containing the encoded image */
- cio->openmode = OPJ_STREAM_READ;
- cio->buffer = buffer;
- cio->length = length;
- } else if (!buffer && !length && cinfo) {
- /* allocate a buffer for the encoded image */
- cio->openmode = OPJ_STREAM_WRITE;
- switch (cinfo->codec_format) {
- case CODEC_J2K:
- cp = ((opj_j2k_t*)cinfo->j2k_handle)->cp;
- break;
- case CODEC_JP2:
- cp = ((opj_jp2_t*)cinfo->jp2_handle)->j2k->cp;
- break;
- default:
- opj_free(cio);
- return NULL;
- }
- cio->length = (unsigned int)(0.1625 * cp->img_size +
- 2000); /* 0.1625 = 1.3/8 and 2000 bytes as a minimum for headers */
- cio->buffer = (unsigned char *)opj_malloc(cio->length);
- if (!cio->buffer) {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error allocating memory for compressed bitstream\n");
- opj_free(cio);
- return NULL;
- }
- } else {
- opj_free(cio);
- return NULL;
- }
-
- /* Initialize byte IO */
- cio->start = cio->buffer;
- cio->end = cio->buffer + cio->length;
- cio->bp = cio->buffer;
-
- return cio;
-}
-
-void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio)
-{
- if (cio) {
- if (cio->openmode == OPJ_STREAM_WRITE) {
- /* destroy the allocated buffer */
- opj_free(cio->buffer);
- }
- /* destroy the cio */
- opj_free(cio);
- }
-}
-
-
-/* ----------------------------------------------------------------------- */
-
-/*
- * Get position in byte stream.
- */
-int OPJ_CALLCONV cio_tell(opj_cio_t *cio)
-{
- return cio->bp - cio->start;
-}
-
-/*
- * Set position in byte stream.
- *
- * pos : position, in number of bytes, from the beginning of the stream
- */
-void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos)
-{
- cio->bp = cio->start + pos;
-}
-
-/*
- * Number of bytes left before the end of the stream.
- */
-int cio_numbytesleft(opj_cio_t *cio)
-{
- return cio->end - cio->bp;
-}
-
-/*
- * Get pointer to the current position in the stream.
- */
-unsigned char *cio_getbp(opj_cio_t *cio)
-{
- return cio->bp;
-}
-
-/*
- * Write a byte.
- */
-opj_bool cio_byteout(opj_cio_t *cio, unsigned char v)
-{
- if (cio->bp >= cio->end) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "write error\n");
- return OPJ_FALSE;
- }
- *cio->bp++ = v;
- return OPJ_TRUE;
-}
-
-/*
- * Read a byte.
- */
-unsigned char cio_bytein(opj_cio_t *cio)
-{
- if (cio->bp >= cio->end) {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "read error: passed the end of the codestream (start = %d, current = %d, end = %d\n",
- cio->start, cio->bp, cio->end);
- return 0;
- }
- return *cio->bp++;
-}
-
-/*
- * Write some bytes.
- *
- * v : value to write
- * n : number of bytes to write
- */
-unsigned int OPJ_CALLCONV cio_write(opj_cio_t *cio, unsigned int64 v, int n)
-{
- int i;
- for (i = n - 1; i >= 0; i--) {
- if (!cio_byteout(cio, (unsigned char)((v >> (i << 3)) & 0xff))) {
- return 0;
- }
- }
- return n;
-}
-
-/*
- * Read some bytes.
- *
- * n : number of bytes to read
- *
- * return : value of the n bytes read
- */
-unsigned int OPJ_CALLCONV cio_read(opj_cio_t *cio, int n)
-{
- int i;
- unsigned int v;
- v = 0;
- for (i = n - 1; i >= 0; i--) {
- v += cio_bytein(cio) << (i << 3);
- }
- return v;
-}
-
-/*
- * Skip some bytes.
- *
- * n : number of bytes to skip
- */
-void OPJ_CALLCONV cio_skip(opj_cio_t *cio, int n)
-{
- cio->bp += n;
-}
-
-
-
+++ /dev/null
-/*
- * 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 __CIO_H
-#define __CIO_H
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#define int64 __int64
-#else
-#define int64 long long
-#endif
-
-/**
-@file cio.h
-@brief Implementation of a byte input-output process (CIO)
-
-The functions in CIO.C have for goal to realize a byte input / output process.
-*/
-
-/** @defgroup CIO CIO - byte input-output stream */
-/*@{*/
-
-/** @name Exported functions (see also openjpeg.h) */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Number of bytes left before the end of the stream
-@param cio CIO handle
-@return Returns the number of bytes before the end of the stream
-*/
-int cio_numbytesleft(opj_cio_t *cio);
-/**
-Get pointer to the current position in the stream
-@param cio CIO handle
-@return Returns a pointer to the current position
-*/
-unsigned char *cio_getbp(opj_cio_t *cio);
-/**
-Write some bytes
-@param cio CIO handle
-@param v Value to write
-@param n Number of bytes to write
-@return Returns the number of bytes written or 0 if an error occurred
-*/
-OPJ_API unsigned int OPJ_CALLCONV cio_write(opj_cio_t *cio, unsigned int64 v,
- int n);
-/**
-Read some bytes
-@param cio CIO handle
-@param n Number of bytes to read
-@return Returns the value of the n bytes read
-*/
-OPJ_API unsigned int OPJ_CALLCONV cio_read(opj_cio_t *cio, int n);
-/**
-Skip some bytes
-@param cio CIO handle
-@param n Number of bytes to skip
-*/
-OPJ_API void OPJ_CALLCONV cio_skip(opj_cio_t *cio, int n);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __CIO_H */
-
+++ /dev/null
-/*
- * 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) 2007, Jonathan Ballard <dzonatas@dzonux.net>
- * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
- * 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.
- */
-
-#ifdef __SSE__
-#include <xmmintrin.h>
-#endif
-
-#include "opj_includes.h"
-
-/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
-/*@{*/
-
-#define WS(i) v->mem[(i)*2]
-#define WD(i) v->mem[(1+(i)*2)]
-
-/** @name Local data structures */
-/*@{*/
-
-typedef struct dwt_local {
- int* mem;
- int dn;
- int sn;
- int cas;
-} dwt_t;
-
-typedef union {
- float f[4];
-} v4;
-
-typedef struct v4dwt_local {
- v4* wavelet ;
- int dn ;
- int sn ;
- int cas ;
-} v4dwt_t ;
-
-static const float dwt_alpha = 1.586134342f; /* 12994 */
-static const float dwt_beta = 0.052980118f; /* 434 */
-static const float dwt_gamma = -0.882911075f; /* -7233 */
-static const float dwt_delta = -0.443506852f; /* -3633 */
-
-static const float K = 1.230174105f; /* 10078 */
-/* FIXME: What is this constant? */
-static const float c13318 = 1.625732422f;
-
-/*@}*/
-
-/**
-Virtual function type for wavelet transform in 1-D
-*/
-typedef void (*DWT1DFN)(dwt_t* v);
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Forward lazy transform (horizontal)
-*/
-static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas);
-/**
-Forward lazy transform (vertical)
-*/
-static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas);
-/**
-Inverse lazy transform (horizontal)
-*/
-static void dwt_interleave_h(dwt_t* h, int *a);
-/**
-Inverse lazy transform (vertical)
-*/
-static void dwt_interleave_v(dwt_t* v, int *a, int x);
-/**
-Forward 5-3 wavelet transform in 1-D
-*/
-static void dwt_encode_1(int *a, int dn, int sn, int cas);
-/**
-Inverse 5-3 wavelet transform in 1-D
-*/
-static void dwt_decode_1(dwt_t *v);
-/**
-Forward 9-7 wavelet transform in 1-D
-*/
-static void dwt_encode_1_real(int *a, int dn, int sn, int cas);
-/**
-Explicit calculation of the Quantization Stepsizes
-*/
-static void dwt_encode_stepsize(int stepsize, int numbps,
- opj_stepsize_t *bandno_stepsize);
-/**
-Inverse wavelet transform in 2-D.
-*/
-static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int i, DWT1DFN fn);
-
-/*@}*/
-
-/*@}*/
-
-#define S(i) a[(i)*2]
-#define D(i) a[(1+(i)*2)]
-#define S_(i) ((i)<0?S(0):((i)>=sn?S(sn-1):S(i)))
-#define D_(i) ((i)<0?D(0):((i)>=dn?D(dn-1):D(i)))
-/* new */
-#define SS_(i) ((i)<0?S(0):((i)>=dn?S(dn-1):S(i)))
-#define DD_(i) ((i)<0?D(0):((i)>=sn?D(sn-1):D(i)))
-
-/* <summary> */
-/* This table contains the norms of the 5-3 wavelets for different bands. */
-/* </summary> */
-static const double dwt_norms[4][10] = {
- {1.000, 1.500, 2.750, 5.375, 10.68, 21.34, 42.67, 85.33, 170.7, 341.3},
- {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
- {1.038, 1.592, 2.919, 5.703, 11.33, 22.64, 45.25, 90.48, 180.9},
- {.7186, .9218, 1.586, 3.043, 6.019, 12.01, 24.00, 47.97, 95.93}
-};
-
-/* <summary> */
-/* This table contains the norms of the 9-7 wavelets for different bands. */
-/* </summary> */
-static const double dwt_norms_real[4][10] = {
- {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},
- {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
- {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
- {2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2}
-};
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-/* <summary> */
-/* Forward lazy transform (horizontal). */
-/* </summary> */
-static void dwt_deinterleave_h(int *a, int *b, int dn, int sn, int cas)
-{
- int i;
- for (i = 0; i < sn; i++) {
- b[i] = a[2 * i + cas];
- }
- for (i = 0; i < dn; i++) {
- b[sn + i] = a[(2 * i + 1 - cas)];
- }
-}
-
-/* <summary> */
-/* Forward lazy transform (vertical). */
-/* </summary> */
-static void dwt_deinterleave_v(int *a, int *b, int dn, int sn, int x, int cas)
-{
- int i;
- for (i = 0; i < sn; i++) {
- b[i * x] = a[2 * i + cas];
- }
- for (i = 0; i < dn; i++) {
- b[(sn + i)*x] = a[(2 * i + 1 - cas)];
- }
-}
-
-/* <summary> */
-/* Inverse lazy transform (horizontal). */
-/* </summary> */
-static void dwt_interleave_h(dwt_t* h, int *a)
-{
- int *ai = a;
- int *bi = h->mem + h->cas;
- int i = h->sn;
- while (i--) {
- *bi = *(ai++);
- bi += 2;
- }
- ai = a + h->sn;
- bi = h->mem + 1 - h->cas;
- i = h->dn ;
- while (i--) {
- *bi = *(ai++);
- bi += 2;
- }
-}
-
-/* <summary> */
-/* Inverse lazy transform (vertical). */
-/* </summary> */
-static void dwt_interleave_v(dwt_t* v, int *a, int x)
-{
- int *ai = a;
- int *bi = v->mem + v->cas;
- int i = v->sn;
- while (i--) {
- *bi = *ai;
- bi += 2;
- ai += x;
- }
- ai = a + (v->sn * x);
- bi = v->mem + 1 - v->cas;
- i = v->dn ;
- while (i--) {
- *bi = *ai;
- bi += 2;
- ai += x;
- }
-}
-
-
-/* <summary> */
-/* Forward 5-3 wavelet transform in 1-D. */
-/* </summary> */
-static void dwt_encode_1(int *a, int dn, int sn, int cas)
-{
- int i;
-
- if (!cas) {
- if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
- for (i = 0; i < dn; i++) {
- D(i) -= (S_(i) + S_(i + 1)) >> 1;
- }
- for (i = 0; i < sn; i++) {
- S(i) += (D_(i - 1) + D_(i) + 2) >> 2;
- }
- }
- } else {
- if (!sn && dn == 1) { /* NEW : CASE ONE ELEMENT */
- S(0) *= 2;
- } else {
- for (i = 0; i < dn; i++) {
- S(i) -= (DD_(i) + DD_(i - 1)) >> 1;
- }
- for (i = 0; i < sn; i++) {
- D(i) += (SS_(i) + SS_(i + 1) + 2) >> 2;
- }
- }
- }
-}
-
-/* <summary> */
-/* Inverse 5-3 wavelet transform in 1-D. */
-/* </summary> */
-static void dwt_decode_1_(int *a, int dn, int sn, int cas)
-{
- int i;
-
- if (!cas) {
- if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
- for (i = 0; i < sn; i++) {
- S(i) -= (D_(i - 1) + D_(i) + 2) >> 2;
- }
- for (i = 0; i < dn; i++) {
- D(i) += (S_(i) + S_(i + 1)) >> 1;
- }
- }
- } else {
- if (!sn && dn == 1) { /* NEW : CASE ONE ELEMENT */
- S(0) /= 2;
- } else {
- for (i = 0; i < sn; i++) {
- D(i) -= (SS_(i) + SS_(i + 1) + 2) >> 2;
- }
- for (i = 0; i < dn; i++) {
- S(i) += (DD_(i) + DD_(i - 1)) >> 1;
- }
- }
- }
-}
-
-/* <summary> */
-/* Inverse 5-3 wavelet transform in 1-D. */
-/* </summary> */
-static void dwt_decode_1(dwt_t *v)
-{
- dwt_decode_1_(v->mem, v->dn, v->sn, v->cas);
-}
-
-/* <summary> */
-/* Forward 9-7 wavelet transform in 1-D. */
-/* </summary> */
-static void dwt_encode_1_real(int *a, int dn, int sn, int cas)
-{
- int i;
- if (!cas) {
- if ((dn > 0) || (sn > 1)) { /* NEW : CASE ONE ELEMENT */
- for (i = 0; i < dn; i++) {
- D(i) -= fix_mul(S_(i) + S_(i + 1), 12993);
- }
- for (i = 0; i < sn; i++) {
- S(i) -= fix_mul(D_(i - 1) + D_(i), 434);
- }
- for (i = 0; i < dn; i++) {
- D(i) += fix_mul(S_(i) + S_(i + 1), 7233);
- }
- for (i = 0; i < sn; i++) {
- S(i) += fix_mul(D_(i - 1) + D_(i), 3633);
- }
- for (i = 0; i < dn; i++) {
- D(i) = fix_mul(D(i), 5038); /*5038 */
- }
- for (i = 0; i < sn; i++) {
- S(i) = fix_mul(S(i), 6659); /*6660 */
- }
- }
- } else {
- if ((sn > 0) || (dn > 1)) { /* NEW : CASE ONE ELEMENT */
- for (i = 0; i < dn; i++) {
- S(i) -= fix_mul(DD_(i) + DD_(i - 1), 12993);
- }
- for (i = 0; i < sn; i++) {
- D(i) -= fix_mul(SS_(i) + SS_(i + 1), 434);
- }
- for (i = 0; i < dn; i++) {
- S(i) += fix_mul(DD_(i) + DD_(i - 1), 7233);
- }
- for (i = 0; i < sn; i++) {
- D(i) += fix_mul(SS_(i) + SS_(i + 1), 3633);
- }
- for (i = 0; i < dn; i++) {
- S(i) = fix_mul(S(i), 5038); /*5038 */
- }
- for (i = 0; i < sn; i++) {
- D(i) = fix_mul(D(i), 6659); /*6660 */
- }
- }
- }
-}
-
-static void dwt_encode_stepsize(int stepsize, int numbps,
- opj_stepsize_t *bandno_stepsize)
-{
- int p, n;
- p = int_floorlog2(stepsize) - 13;
- n = 11 - int_floorlog2(stepsize);
- bandno_stepsize->mant = (n < 0 ? stepsize >> -n : stepsize << n) & 0x7ff;
- bandno_stepsize->expn = numbps - p;
-}
-
-/*
-==========================================================
- DWT interface
-==========================================================
-*/
-
-/* <summary> */
-/* Forward 5-3 wavelet transform in 2-D. */
-/* </summary> */
-void dwt_encode(opj_tcd_tilecomp_t * tilec)
-{
- int i, j, k;
- int *a = NULL;
- int *aj = NULL;
- int *bj = NULL;
- int w, l;
-
- w = tilec->x1 - tilec->x0;
- l = tilec->numresolutions - 1;
- a = tilec->data;
-
- for (i = 0; i < l; i++) {
- int rw; /* width of the resolution level computed */
- int rh; /* height of the resolution level computed */
- int rw1; /* width of the resolution level once lower than computed one */
- int rh1; /* height of the resolution level once lower than computed one */
- int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
- int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
- int dn, sn;
-
- rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
- rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
- rw1 = tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
- rh1 = tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
-
- cas_row = tilec->resolutions[l - i].x0 % 2;
- cas_col = tilec->resolutions[l - i].y0 % 2;
-
- sn = rh1;
- dn = rh - rh1;
- bj = (int*)opj_malloc(rh * sizeof(int));
- for (j = 0; j < rw; j++) {
- aj = a + j;
- for (k = 0; k < rh; k++) {
- bj[k] = aj[k * w];
- }
- dwt_encode_1(bj, dn, sn, cas_col);
- dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
- }
- opj_free(bj);
-
- sn = rw1;
- dn = rw - rw1;
- bj = (int*)opj_malloc(rw * sizeof(int));
- for (j = 0; j < rh; j++) {
- aj = a + j * w;
- for (k = 0; k < rw; k++) {
- bj[k] = aj[k];
- }
- dwt_encode_1(bj, dn, sn, cas_row);
- dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
- }
- opj_free(bj);
- }
-}
-
-
-/* <summary> */
-/* Inverse 5-3 wavelet transform in 2-D. */
-/* </summary> */
-void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres)
-{
- dwt_decode_tile(tilec, numres, &dwt_decode_1);
-}
-
-
-/* <summary> */
-/* Get gain of 5-3 wavelet transform. */
-/* </summary> */
-int dwt_getgain(int orient)
-{
- if (orient == 0) {
- return 0;
- }
- if (orient == 1 || orient == 2) {
- return 1;
- }
- return 2;
-}
-
-/* <summary> */
-/* Get norm of 5-3 wavelet. */
-/* </summary> */
-double dwt_getnorm(int level, int orient)
-{
- return dwt_norms[orient][level];
-}
-
-/* <summary> */
-/* Forward 9-7 wavelet transform in 2-D. */
-/* </summary> */
-
-void dwt_encode_real(opj_tcd_tilecomp_t * tilec)
-{
- int i, j, k;
- int *a = NULL;
- int *aj = NULL;
- int *bj = NULL;
- int w, l;
-
- w = tilec->x1 - tilec->x0;
- l = tilec->numresolutions - 1;
- a = tilec->data;
-
- for (i = 0; i < l; i++) {
- int rw; /* width of the resolution level computed */
- int rh; /* height of the resolution level computed */
- int rw1; /* width of the resolution level once lower than computed one */
- int rh1; /* height of the resolution level once lower than computed one */
- int cas_col; /* 0 = non inversion on horizontal filtering 1 = inversion between low-pass and high-pass filtering */
- int cas_row; /* 0 = non inversion on vertical filtering 1 = inversion between low-pass and high-pass filtering */
- int dn, sn;
-
- rw = tilec->resolutions[l - i].x1 - tilec->resolutions[l - i].x0;
- rh = tilec->resolutions[l - i].y1 - tilec->resolutions[l - i].y0;
- rw1 = tilec->resolutions[l - i - 1].x1 - tilec->resolutions[l - i - 1].x0;
- rh1 = tilec->resolutions[l - i - 1].y1 - tilec->resolutions[l - i - 1].y0;
-
- cas_row = tilec->resolutions[l - i].x0 % 2;
- cas_col = tilec->resolutions[l - i].y0 % 2;
-
- sn = rh1;
- dn = rh - rh1;
- bj = (int*)opj_malloc(rh * sizeof(int));
- for (j = 0; j < rw; j++) {
- aj = a + j;
- for (k = 0; k < rh; k++) {
- bj[k] = aj[k * w];
- }
- dwt_encode_1_real(bj, dn, sn, cas_col);
- dwt_deinterleave_v(bj, aj, dn, sn, w, cas_col);
- }
- opj_free(bj);
-
- sn = rw1;
- dn = rw - rw1;
- bj = (int*)opj_malloc(rw * sizeof(int));
- for (j = 0; j < rh; j++) {
- aj = a + j * w;
- for (k = 0; k < rw; k++) {
- bj[k] = aj[k];
- }
- dwt_encode_1_real(bj, dn, sn, cas_row);
- dwt_deinterleave_h(bj, aj, dn, sn, cas_row);
- }
- opj_free(bj);
- }
-}
-
-
-/* <summary> */
-/* Get gain of 9-7 wavelet transform. */
-/* </summary> */
-int dwt_getgain_real(int orient)
-{
- (void)orient;
- return 0;
-}
-
-/* <summary> */
-/* Get norm of 9-7 wavelet. */
-/* </summary> */
-double dwt_getnorm_real(int level, int orient)
-{
- return dwt_norms_real[orient][level];
-}
-
-void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec)
-{
- int numbands, bandno;
- numbands = 3 * tccp->numresolutions - 2;
- for (bandno = 0; bandno < numbands; bandno++) {
- double stepsize;
- int resno, level, orient, gain;
-
- resno = (bandno == 0) ? 0 : ((bandno - 1) / 3 + 1);
- orient = (bandno == 0) ? 0 : ((bandno - 1) % 3 + 1);
- level = tccp->numresolutions - 1 - resno;
- gain = (tccp->qmfbid == 0) ? 0 : ((orient == 0) ? 0 : (((orient == 1) ||
- (orient == 2)) ? 1 : 2));
- if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
- stepsize = 1.0;
- } else {
- double norm = dwt_norms_real[orient][level];
- stepsize = (1 << (gain)) / norm;
- }
- dwt_encode_stepsize((int) floor(stepsize * 8192.0), prec + gain,
- &tccp->stepsizes[bandno]);
- }
-}
-
-
-/* <summary> */
-/* Determine maximum computed resolution level for inverse wavelet transform */
-/* </summary> */
-static int dwt_decode_max_resolution(opj_tcd_resolution_t* restrict r, int i)
-{
- int mr = 1;
- int w;
- while (--i) {
- r++;
- if (mr < (w = r->x1 - r->x0)) {
- mr = w ;
- }
- if (mr < (w = r->y1 - r->y0)) {
- mr = w ;
- }
- }
- return mr ;
-}
-
-
-/* <summary> */
-/* Inverse wavelet transform in 2-D. */
-/* </summary> */
-static void dwt_decode_tile(opj_tcd_tilecomp_t* tilec, int numres,
- DWT1DFN dwt_1D)
-{
- dwt_t h;
- dwt_t v;
-
- opj_tcd_resolution_t* tr = tilec->resolutions;
-
- int rw = tr->x1 - tr->x0; /* width of the resolution level computed */
- int rh = tr->y1 - tr->y0; /* height of the resolution level computed */
-
- int w = tilec->x1 - tilec->x0;
-
- h.mem = (int*)opj_aligned_malloc(dwt_decode_max_resolution(tr,
- numres) * sizeof(int));
- v.mem = h.mem;
-
- while (--numres) {
- int * restrict tiledp = tilec->data;
- int j;
-
- ++tr;
- h.sn = rw;
- v.sn = rh;
-
- rw = tr->x1 - tr->x0;
- rh = tr->y1 - tr->y0;
-
- h.dn = rw - h.sn;
- h.cas = tr->x0 % 2;
-
- for (j = 0; j < rh; ++j) {
- dwt_interleave_h(&h, &tiledp[j * w]);
- (dwt_1D)(&h);
- memcpy(&tiledp[j * w], h.mem, rw * sizeof(int));
- }
-
- v.dn = rh - v.sn;
- v.cas = tr->y0 % 2;
-
- for (j = 0; j < rw; ++j) {
- int k;
- dwt_interleave_v(&v, &tiledp[j], w);
- (dwt_1D)(&v);
- for (k = 0; k < rh; ++k) {
- tiledp[k * w + j] = v.mem[k];
- }
- }
- }
- opj_aligned_free(h.mem);
-}
-
-static void v4dwt_interleave_h(v4dwt_t* restrict w, float* restrict a, int x,
- int size)
-{
- float* restrict bi = (float*)(w->wavelet + w->cas);
- int count = w->sn;
- int i, k;
- for (k = 0; k < 2; ++k) {
- if (count + 3 * x < size && ((size_t) a & 0x0f) == 0 &&
- ((size_t) bi & 0x0f) == 0 && (x & 0x0f) == 0) {
- /* Fast code path */
- for (i = 0; i < count; ++i) {
- int j = i;
- bi[i * 8 ] = a[j];
- j += x;
- bi[i * 8 + 1] = a[j];
- j += x;
- bi[i * 8 + 2] = a[j];
- j += x;
- bi[i * 8 + 3] = a[j];
- }
- } else {
- /* Slow code path */
- for (i = 0; i < count; ++i) {
- int j = i;
- bi[i * 8 ] = a[j];
- j += x;
- if (j > size) {
- continue;
- }
- bi[i * 8 + 1] = a[j];
- j += x;
- if (j > size) {
- continue;
- }
- bi[i * 8 + 2] = a[j];
- j += x;
- if (j > size) {
- continue;
- }
- bi[i * 8 + 3] = a[j];
- }
- }
- bi = (float*)(w->wavelet + 1 - w->cas);
- a += w->sn;
- size -= w->sn;
- count = w->dn;
- }
-}
-
-static void v4dwt_interleave_v(v4dwt_t* restrict v, float* restrict a, int x)
-{
- v4* restrict bi = v->wavelet + v->cas;
- int i;
- for (i = 0; i < v->sn; ++i) {
- memcpy(&bi[i * 2], &a[i * x], 4 * sizeof(float));
- }
- a += v->sn * x;
- bi = v->wavelet + 1 - v->cas;
- for (i = 0; i < v->dn; ++i) {
- memcpy(&bi[i * 2], &a[i * x], 4 * sizeof(float));
- }
-}
-
-#ifdef __SSE__
-
-static void v4dwt_decode_step1_sse(v4* w, int count, const __m128 c)
-{
- __m128* restrict vw = (__m128*) w;
- int i;
- /* 4x unrolled loop */
- for (i = 0; i < count >> 2; ++i) {
- *vw = _mm_mul_ps(*vw, c);
- vw += 2;
- *vw = _mm_mul_ps(*vw, c);
- vw += 2;
- *vw = _mm_mul_ps(*vw, c);
- vw += 2;
- *vw = _mm_mul_ps(*vw, c);
- vw += 2;
- }
- count &= 3;
- for (i = 0; i < count; ++i) {
- *vw = _mm_mul_ps(*vw, c);
- vw += 2;
- }
-}
-
-static void v4dwt_decode_step2_sse(v4* l, v4* w, int k, int m, __m128 c)
-{
- __m128* restrict vl = (__m128*) l;
- __m128* restrict vw = (__m128*) w;
- int i;
- __m128 tmp1, tmp2, tmp3;
- tmp1 = vl[0];
- for (i = 0; i < m; ++i) {
- tmp2 = vw[-1];
- tmp3 = vw[ 0];
- vw[-1] = _mm_add_ps(tmp2, _mm_mul_ps(_mm_add_ps(tmp1, tmp3), c));
- tmp1 = tmp3;
- vw += 2;
- }
- vl = vw - 2;
- if (m >= k) {
- return;
- }
- c = _mm_add_ps(c, c);
- c = _mm_mul_ps(c, vl[0]);
- for (; m < k; ++m) {
- __m128 tmp = vw[-1];
- vw[-1] = _mm_add_ps(tmp, c);
- vw += 2;
- }
-}
-
-#else
-
-static void v4dwt_decode_step1(v4* w, int count, const float c)
-{
- float* restrict fw = (float*) w;
- int i;
- for (i = 0; i < count; ++i) {
- float tmp1 = fw[i * 8 ];
- float tmp2 = fw[i * 8 + 1];
- float tmp3 = fw[i * 8 + 2];
- float tmp4 = fw[i * 8 + 3];
- fw[i * 8 ] = tmp1 * c;
- fw[i * 8 + 1] = tmp2 * c;
- fw[i * 8 + 2] = tmp3 * c;
- fw[i * 8 + 3] = tmp4 * c;
- }
-}
-
-static void v4dwt_decode_step2(v4* l, v4* w, int k, int m, float c)
-{
- float* restrict fl = (float*) l;
- float* restrict fw = (float*) w;
- int i;
- for (i = 0; i < m; ++i) {
- float tmp1_1 = fl[0];
- float tmp1_2 = fl[1];
- float tmp1_3 = fl[2];
- float tmp1_4 = fl[3];
- float tmp2_1 = fw[-4];
- float tmp2_2 = fw[-3];
- float tmp2_3 = fw[-2];
- float tmp2_4 = fw[-1];
- float tmp3_1 = fw[0];
- float tmp3_2 = fw[1];
- float tmp3_3 = fw[2];
- float tmp3_4 = fw[3];
- fw[-4] = tmp2_1 + ((tmp1_1 + tmp3_1) * c);
- fw[-3] = tmp2_2 + ((tmp1_2 + tmp3_2) * c);
- fw[-2] = tmp2_3 + ((tmp1_3 + tmp3_3) * c);
- fw[-1] = tmp2_4 + ((tmp1_4 + tmp3_4) * c);
- fl = fw;
- fw += 8;
- }
- if (m < k) {
- float c1;
- float c2;
- float c3;
- float c4;
- c += c;
- c1 = fl[0] * c;
- c2 = fl[1] * c;
- c3 = fl[2] * c;
- c4 = fl[3] * c;
- for (; m < k; ++m) {
- float tmp1 = fw[-4];
- float tmp2 = fw[-3];
- float tmp3 = fw[-2];
- float tmp4 = fw[-1];
- fw[-4] = tmp1 + c1;
- fw[-3] = tmp2 + c2;
- fw[-2] = tmp3 + c3;
- fw[-1] = tmp4 + c4;
- fw += 8;
- }
- }
-}
-
-#endif
-
-/* <summary> */
-/* Inverse 9-7 wavelet transform in 1-D. */
-/* </summary> */
-static void v4dwt_decode(v4dwt_t* restrict dwt)
-{
- int a, b;
- if (dwt->cas == 0) {
- if (!((dwt->dn > 0) || (dwt->sn > 1))) {
- return;
- }
- a = 0;
- b = 1;
- } else {
- if (!((dwt->sn > 0) || (dwt->dn > 1))) {
- return;
- }
- a = 1;
- b = 0;
- }
-#ifdef __SSE__
- v4dwt_decode_step1_sse(dwt->wavelet + a, dwt->sn, _mm_set1_ps(K));
- v4dwt_decode_step1_sse(dwt->wavelet + b, dwt->dn, _mm_set1_ps(c13318));
- v4dwt_decode_step2_sse(dwt->wavelet + b, dwt->wavelet + a + 1, dwt->sn,
- int_min(dwt->sn, dwt->dn - a), _mm_set1_ps(dwt_delta));
- v4dwt_decode_step2_sse(dwt->wavelet + a, dwt->wavelet + b + 1, dwt->dn,
- int_min(dwt->dn, dwt->sn - b), _mm_set1_ps(dwt_gamma));
- v4dwt_decode_step2_sse(dwt->wavelet + b, dwt->wavelet + a + 1, dwt->sn,
- int_min(dwt->sn, dwt->dn - a), _mm_set1_ps(dwt_beta));
- v4dwt_decode_step2_sse(dwt->wavelet + a, dwt->wavelet + b + 1, dwt->dn,
- int_min(dwt->dn, dwt->sn - b), _mm_set1_ps(dwt_alpha));
-#else
- v4dwt_decode_step1(dwt->wavelet + a, dwt->sn, K);
- v4dwt_decode_step1(dwt->wavelet + b, dwt->dn, c13318);
- v4dwt_decode_step2(dwt->wavelet + b, dwt->wavelet + a + 1, dwt->sn,
- int_min(dwt->sn, dwt->dn - a), dwt_delta);
- v4dwt_decode_step2(dwt->wavelet + a, dwt->wavelet + b + 1, dwt->dn,
- int_min(dwt->dn, dwt->sn - b), dwt_gamma);
- v4dwt_decode_step2(dwt->wavelet + b, dwt->wavelet + a + 1, dwt->sn,
- int_min(dwt->sn, dwt->dn - a), dwt_beta);
- v4dwt_decode_step2(dwt->wavelet + a, dwt->wavelet + b + 1, dwt->dn,
- int_min(dwt->dn, dwt->sn - b), dwt_alpha);
-#endif
-}
-
-/* <summary> */
-/* Inverse 9-7 wavelet transform in 2-D. */
-/* </summary> */
-void dwt_decode_real(opj_tcd_tilecomp_t* restrict tilec, int numres)
-{
- v4dwt_t h;
- v4dwt_t v;
-
- opj_tcd_resolution_t* res = tilec->resolutions;
-
- int rw = res->x1 - res->x0; /* width of the resolution level computed */
- int rh = res->y1 - res->y0; /* height of the resolution level computed */
-
- int w = tilec->x1 - tilec->x0;
-
- h.wavelet = (v4*) opj_aligned_malloc((dwt_decode_max_resolution(res,
- numres) + 5) * sizeof(v4));
- v.wavelet = h.wavelet;
-
- while (--numres) {
- float * restrict aj = (float*) tilec->data;
- int bufsize = (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0);
- int j;
-
- h.sn = rw;
- v.sn = rh;
-
- ++res;
-
- rw = res->x1 - res->x0; /* width of the resolution level computed */
- rh = res->y1 - res->y0; /* height of the resolution level computed */
-
- h.dn = rw - h.sn;
- h.cas = res->x0 % 2;
-
- for (j = rh; j > 3; j -= 4) {
- int k;
- v4dwt_interleave_h(&h, aj, w, bufsize);
- v4dwt_decode(&h);
- for (k = rw; --k >= 0;) {
- aj[k ] = h.wavelet[k].f[0];
- aj[k + w ] = h.wavelet[k].f[1];
- aj[k + w * 2] = h.wavelet[k].f[2];
- aj[k + w * 3] = h.wavelet[k].f[3];
- }
- aj += w * 4;
- bufsize -= w * 4;
- }
- if (rh & 0x03) {
- int k;
- j = rh & 0x03;
- v4dwt_interleave_h(&h, aj, w, bufsize);
- v4dwt_decode(&h);
- for (k = rw; --k >= 0;) {
- switch (j) {
- case 3:
- aj[k + w * 2] = h.wavelet[k].f[2];
- case 2:
- aj[k + w ] = h.wavelet[k].f[1];
- case 1:
- aj[k ] = h.wavelet[k].f[0];
- }
- }
- }
-
- v.dn = rh - v.sn;
- v.cas = res->y0 % 2;
-
- aj = (float*) tilec->data;
- for (j = rw; j > 3; j -= 4) {
- int k;
- v4dwt_interleave_v(&v, aj, w);
- v4dwt_decode(&v);
- for (k = 0; k < rh; ++k) {
- memcpy(&aj[k * w], &v.wavelet[k], 4 * sizeof(float));
- }
- aj += 4;
- }
- if (rw & 0x03) {
- int k;
- j = rw & 0x03;
- v4dwt_interleave_v(&v, aj, w);
- v4dwt_decode(&v);
- for (k = 0; k < rh; ++k) {
- memcpy(&aj[k * w], &v.wavelet[k], j * sizeof(float));
- }
- }
- }
-
- opj_aligned_free(h.wavelet);
-}
-
+++ /dev/null
-/*
- * 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 __DWT_H
-#define __DWT_H
-/**
-@file dwt.h
-@brief Implementation of a discrete wavelet transform (DWT)
-
-The functions in DWT.C have for goal to realize forward and inverse discret wavelet
-transform with filter 5-3 (reversible) and filter 9-7 (irreversible). The functions in
-DWT.C are used by some function in TCD.C.
-*/
-
-/** @defgroup DWT DWT - Implementation of a discrete wavelet transform */
-/*@{*/
-
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Forward 5-3 wavelet transform in 2-D.
-Apply a reversible DWT transform to a component of an image.
-@param tilec Tile component information (current tile)
-*/
-void dwt_encode(opj_tcd_tilecomp_t * tilec);
-/**
-Inverse 5-3 wavelet transform in 2-D.
-Apply a reversible inverse DWT transform to a component of an image.
-@param tilec Tile component information (current tile)
-@param numres Number of resolution levels to decode
-*/
-void dwt_decode(opj_tcd_tilecomp_t* tilec, int numres);
-/**
-Get the gain of a subband for the reversible 5-3 DWT.
-@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
-@return Returns 0 if orient = 0, returns 1 if orient = 1 or 2, returns 2 otherwise
-*/
-int dwt_getgain(int orient);
-/**
-Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT.
-@param level Level of the wavelet function
-@param orient Band of the wavelet function
-@return Returns the norm of the wavelet function
-*/
-double dwt_getnorm(int level, int orient);
-/**
-Forward 9-7 wavelet transform in 2-D.
-Apply an irreversible DWT transform to a component of an image.
-@param tilec Tile component information (current tile)
-*/
-void dwt_encode_real(opj_tcd_tilecomp_t * tilec);
-/**
-Inverse 9-7 wavelet transform in 2-D.
-Apply an irreversible inverse DWT transform to a component of an image.
-@param tilec Tile component information (current tile)
-@param numres Number of resolution levels to decode
-*/
-void dwt_decode_real(opj_tcd_tilecomp_t* tilec, int numres);
-/**
-Get the gain of a subband for the irreversible 9-7 DWT.
-@param orient Number that identifies the subband (0->LL, 1->HL, 2->LH, 3->HH)
-@return Returns the gain of the 9-7 wavelet transform
-*/
-int dwt_getgain_real(int orient);
-/**
-Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT
-@param level Level of the wavelet function
-@param orient Band of the wavelet function
-@return Returns the norm of the 9-7 wavelet
-*/
-double dwt_getnorm_real(int level, int orient);
-/**
-Explicit calculation of the Quantization Stepsizes
-@param tccp Tile-component coding parameters
-@param prec Precint analyzed
-*/
-void dwt_calc_explicit_stepsizes(opj_tccp_t * tccp, int prec);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __DWT_H */
+++ /dev/null
-/*
- * 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) 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.
- */
-
-#include "opj_includes.h"
-
-/* ==========================================================
- Utility functions
- ==========================================================*/
-
-#ifdef OPJ_CODE_NOT_USED
-#ifndef _WIN32
-static char*
-i2a(unsigned i, char *a, unsigned r)
-{
- if (i / r > 0) {
- a = i2a(i / r, a, r);
- }
- *a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i % r];
- return a + 1;
-}
-
-/**
- Transforms integer i into an ascii string and stores the result in a;
- string is encoded in the base indicated by r.
- @param i Number to be converted
- @param a String result
- @param r Base of value; must be in the range 2 - 36
- @return Returns a
-*/
-static char *
-_itoa(int i, char *a, int r)
-{
- r = ((r < 2) || (r > 36)) ? 10 : r;
- if (i < 0) {
- *a = '-';
- *i2a(-i, a + 1, r) = 0;
- } else {
- *i2a(i, a, r) = 0;
- }
- return a;
-}
-
-#endif /* !_WIN32 */
-#endif
-/* ----------------------------------------------------------------------- */
-
-opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo,
- opj_event_mgr_t *event_mgr, void *context)
-{
- if (cinfo) {
- opj_event_mgr_t *previous = cinfo->event_mgr;
- cinfo->event_mgr = event_mgr;
- cinfo->client_data = context;
- return previous;
- }
-
- return NULL;
-}
-
-opj_bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt,
- ...)
-{
-#define MSG_SIZE 512 /* 512 bytes should be more than enough for a short message */
- opj_msg_callback msg_handler = NULL;
-
- opj_event_mgr_t *event_mgr = cinfo->event_mgr;
- if (event_mgr != NULL) {
- switch (event_type) {
- case EVT_ERROR:
- msg_handler = event_mgr->error_handler;
- break;
- case EVT_WARNING:
- msg_handler = event_mgr->warning_handler;
- break;
- case EVT_INFO:
- msg_handler = event_mgr->info_handler;
- break;
- default:
- break;
- }
- if (msg_handler == NULL) {
- return OPJ_FALSE;
- }
- } else {
- return OPJ_FALSE;
- }
-
- if ((fmt != NULL) && (event_mgr != NULL)) {
- va_list arg;
- int str_length/*, i, j*/; /* UniPG */
- char message[MSG_SIZE];
- /* initialize the optional parameter list */
- va_start(arg, fmt);
- /* parse the format string and put the result in 'message' */
- str_length = vsnprintf(message, MSG_SIZE, fmt, arg); /* UniPG */
- /* deinitialize the optional parameter list */
- va_end(arg);
-
- /* output the message to the user program */
- if (str_length > -1 && str_length < MSG_SIZE) {
- msg_handler(message, cinfo->client_data);
- } else {
- return OPJ_FALSE;
- }
- }
-
- return OPJ_TRUE;
-}
-
+++ /dev/null
-/*
- * 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) 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 __EVENT_H
-#define __EVENT_H
-/**
-@file event.h
-@brief Implementation of a event callback system
-
-The functions in EVENT.C have for goal to send output messages (errors, warnings, debug) to the user.
-*/
-
-#define EVT_ERROR 1 /**< Error event type */
-#define EVT_WARNING 2 /**< Warning event type */
-#define EVT_INFO 4 /**< Debug event type */
-
-/** @defgroup EVENT EVENT - Implementation of a event callback system */
-/*@{*/
-
-/** @name Exported functions (see also openjpeg.h) */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Write formatted data to a string and send the string to a user callback.
-@param cinfo Codec context info
-@param event_type Event type or callback to use to send the message
-@param fmt Format-control string (plus optional arguments)
-@return Returns true if successful, returns false otherwise
-*/
-opj_bool opj_event_msg(opj_common_ptr cinfo, int event_type, const char *fmt,
- ...);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __EVENT_H */
+++ /dev/null
-/*
- * 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 __FIX_H
-#define __FIX_H
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#define int64 __int64
-#else
-#define int64 long long
-#endif
-
-/**
-@file fix.h
-@brief Implementation of operations of specific multiplication (FIX)
-
-The functions in FIX.H have for goal to realize specific multiplication.
-*/
-
-/** @defgroup FIX FIX - Implementation of operations of specific multiplication */
-/*@{*/
-
-/**
-Multiply two fixed-precision rational numbers.
-@param a
-@param b
-@return Returns a * b
-*/
-static INLINE int fix_mul(int a, int b)
-{
- int64 temp = (int64) a * (int64) b ;
- temp += temp & 4096;
- return (int)(temp >> 13) ;
-}
-
-/*@}*/
-
-#endif /* __FIX_H */
+++ /dev/null
-/*
- * 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) 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.
- */
-
-#include "opj_includes.h"
-
-opj_image_t* opj_image_create0(void)
-{
- opj_image_t *image = (opj_image_t*)opj_calloc(1, sizeof(opj_image_t));
- return image;
-}
-
-opj_image_t* OPJ_CALLCONV opj_image_create(int numcmpts,
- opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc)
-{
- int compno;
- opj_image_t *image = NULL;
-
- image = (opj_image_t*) opj_calloc(1, sizeof(opj_image_t));
- if (image) {
- image->color_space = clrspc;
- image->numcomps = numcmpts;
- /* allocate memory for the per-component information */
- image->comps = (opj_image_comp_t*)opj_malloc(image->numcomps * sizeof(
- opj_image_comp_t));
- if (!image->comps) {
- fprintf(stderr, "Unable to allocate memory for image.\n");
- opj_image_destroy(image);
- return NULL;
- }
- /* create the individual image components */
- for (compno = 0; compno < numcmpts; compno++) {
- opj_image_comp_t *comp = &image->comps[compno];
- comp->dx = cmptparms[compno].dx;
- comp->dy = cmptparms[compno].dy;
- comp->w = cmptparms[compno].w;
- comp->h = cmptparms[compno].h;
- comp->x0 = cmptparms[compno].x0;
- comp->y0 = cmptparms[compno].y0;
- comp->prec = cmptparms[compno].prec;
- comp->bpp = cmptparms[compno].bpp;
- comp->sgnd = cmptparms[compno].sgnd;
- comp->data = (int*) opj_calloc(comp->w * comp->h, sizeof(int));
- if (!comp->data) {
- fprintf(stderr, "Unable to allocate memory for image.\n");
- opj_image_destroy(image);
- return NULL;
- }
- }
- }
-
- return image;
-}
-
-void OPJ_CALLCONV opj_image_destroy(opj_image_t *image)
-{
- int i;
- if (image) {
- if (image->comps) {
- /* image components */
- for (i = 0; i < image->numcomps; i++) {
- opj_image_comp_t *image_comp = &image->comps[i];
- if (image_comp->data) {
- opj_free(image_comp->data);
- }
- }
- opj_free(image->comps);
- }
- opj_free(image);
- }
-}
-
+++ /dev/null
-/*
- * 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) 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 __IMAGE_H
-#define __IMAGE_H
-/**
-@file image.h
-@brief Implementation of operations on images (IMAGE)
-
-The functions in IMAGE.C have for goal to realize operations on images.
-*/
-
-/** @defgroup IMAGE IMAGE - Implementation of operations on images */
-/*@{*/
-
-/**
-Create an empty image
-@todo this function should be removed
-@return returns an empty image if successful, returns NULL otherwise
-*/
-opj_image_t* opj_image_create0(void);
-
-/*@}*/
-
-#endif /* __IMAGE_H */
-
+++ /dev/null
-/*
- * 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 __INT_H
-#define __INT_H
-/**
-@file int.h
-@brief Implementation of operations on integers (INT)
-
-The functions in INT.H have for goal to realize operations on integers.
-*/
-
-/** @defgroup INT INT - Implementation of operations on integers */
-/*@{*/
-
-/** @name Exported functions (see also openjpeg.h) */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Get the minimum of two integers
-@return Returns a if a < b else b
-*/
-static INLINE int int_min(int a, int b)
-{
- return a < b ? a : b;
-}
-/**
-Get the maximum of two integers
-@return Returns a if a > b else b
-*/
-static INLINE int int_max(int a, int b)
-{
- return (a > b) ? a : b;
-}
-/**
-Clamp an integer inside an interval
-@return
-<ul>
-<li>Returns a if (min < a < max)
-<li>Returns max if (a > max)
-<li>Returns min if (a < min)
-</ul>
-*/
-static INLINE int int_clamp(int a, int min, int max)
-{
- if (a < min) {
- return min;
- }
- if (a > max) {
- return max;
- }
- return a;
-}
-/**
-@return Get absolute value of integer
-*/
-static INLINE int int_abs(int a)
-{
- return a < 0 ? -a : a;
-}
-/**
-Divide an integer and round upwards
-@return Returns a divided by b
-*/
-static INLINE int int_ceildiv(int a, int b)
-{
- return (a + b - 1) / b;
-}
-/**
-Divide an integer by a power of 2 and round upwards
-@return Returns a divided by 2^b
-*/
-static INLINE int int_ceildivpow2(int a, int b)
-{
- return (a + (1 << b) - 1) >> b;
-}
-/**
-Divide an integer by a power of 2 and round downwards
-@return Returns a divided by 2^b
-*/
-static INLINE int int_floordivpow2(int a, int b)
-{
- return a >> b;
-}
-/**
-Get logarithm of an integer and round downwards
-@return Returns log2(a)
-*/
-static INLINE int int_floorlog2(int a)
-{
- int l;
- for (l = 0; a > 1; l++) {
- a >>= 1;
- }
- return l;
-}
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif
+++ /dev/null
-/*
- * 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
- * Copyright (c) 2010-2011, Kaori Hagihara
- * 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_includes.h"
-
-/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Write the SOC marker (Start Of Codestream)
-@param j2k J2K handle
-*/
-static void j2k_write_soc(opj_j2k_t *j2k);
-/**
-Read the SOC marker (Start of Codestream)
-@param j2k J2K handle
-*/
-static void j2k_read_soc(opj_j2k_t *j2k);
-/**
-Write the SIZ marker (image and tile size)
-@param j2k J2K handle
-*/
-static void j2k_write_siz(opj_j2k_t *j2k);
-/**
-Read the SIZ marker (image and tile size)
-@param j2k J2K handle
-*/
-static void j2k_read_siz(opj_j2k_t *j2k);
-/**
-Write the COM marker (comment)
-@param j2k J2K handle
-*/
-static void j2k_write_com(opj_j2k_t *j2k);
-/**
-Read the COM marker (comment)
-@param j2k J2K handle
-*/
-static void j2k_read_com(opj_j2k_t *j2k);
-/**
-Write the value concerning the specified component in the marker COD and COC
-@param j2k J2K handle
-@param compno Number of the component concerned by the information written
-*/
-static void j2k_write_cox(opj_j2k_t *j2k, int compno);
-/**
-Read the value concerning the specified component in the marker COD and COC
-@param j2k J2K handle
-@param compno Number of the component concerned by the information read
-*/
-static void j2k_read_cox(opj_j2k_t *j2k, int compno);
-/**
-Write the COD marker (coding style default)
-@param j2k J2K handle
-*/
-static void j2k_write_cod(opj_j2k_t *j2k);
-/**
-Read the COD marker (coding style default)
-@param j2k J2K handle
-*/
-static void j2k_read_cod(opj_j2k_t *j2k);
-/**
-Write the COC marker (coding style component)
-@param j2k J2K handle
-@param compno Number of the component concerned by the information written
-*/
-static void j2k_write_coc(opj_j2k_t *j2k, int compno);
-/**
-Read the COC marker (coding style component)
-@param j2k J2K handle
-*/
-static void j2k_read_coc(opj_j2k_t *j2k);
-/**
-Write the value concerning the specified component in the marker QCD and QCC
-@param j2k J2K handle
-@param compno Number of the component concerned by the information written
-*/
-static void j2k_write_qcx(opj_j2k_t *j2k, int compno);
-/**
-Read the value concerning the specified component in the marker QCD and QCC
-@param j2k J2K handle
-@param compno Number of the component concern by the information read
-@param len Length of the information in the QCX part of the marker QCD/QCC
-*/
-static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len);
-/**
-Write the QCD marker (quantization default)
-@param j2k J2K handle
-*/
-static void j2k_write_qcd(opj_j2k_t *j2k);
-/**
-Read the QCD marker (quantization default)
-@param j2k J2K handle
-*/
-static void j2k_read_qcd(opj_j2k_t *j2k);
-/**
-Write the QCC marker (quantization component)
-@param j2k J2K handle
-@param compno Number of the component concerned by the information written
-*/
-static void j2k_write_qcc(opj_j2k_t *j2k, int compno);
-/**
-Read the QCC marker (quantization component)
-@param j2k J2K handle
-*/
-static void j2k_read_qcc(opj_j2k_t *j2k);
-/**
-Write the POC marker (progression order change)
-@param j2k J2K handle
-*/
-static void j2k_write_poc(opj_j2k_t *j2k);
-/**
-Read the POC marker (progression order change)
-@param j2k J2K handle
-*/
-static void j2k_read_poc(opj_j2k_t *j2k);
-/**
-Read the CRG marker (component registration)
-@param j2k J2K handle
-*/
-static void j2k_read_crg(opj_j2k_t *j2k);
-/**
-Read the TLM marker (tile-part lengths)
-@param j2k J2K handle
-*/
-static void j2k_read_tlm(opj_j2k_t *j2k);
-/**
-Read the PLM marker (packet length, main header)
-@param j2k J2K handle
-*/
-static void j2k_read_plm(opj_j2k_t *j2k);
-/**
-Read the PLT marker (packet length, tile-part header)
-@param j2k J2K handle
-*/
-static void j2k_read_plt(opj_j2k_t *j2k);
-/**
-Read the PPM marker (packet packet headers, main header)
-@param j2k J2K handle
-*/
-static void j2k_read_ppm(opj_j2k_t *j2k);
-/**
-Read the PPT marker (packet packet headers, tile-part header)
-@param j2k J2K handle
-*/
-static void j2k_read_ppt(opj_j2k_t *j2k);
-/**
-Write the TLM marker (Mainheader)
-@param j2k J2K handle
-*/
-static void j2k_write_tlm(opj_j2k_t *j2k);
-/**
-Write the SOT marker (start of tile-part)
-@param j2k J2K handle
-*/
-static void j2k_write_sot(opj_j2k_t *j2k);
-/**
-Read the SOT marker (start of tile-part)
-@param j2k J2K handle
-*/
-static void j2k_read_sot(opj_j2k_t *j2k);
-/**
-Write the SOD marker (start of data)
-@param j2k J2K handle
-@param tile_coder Pointer to a TCD handle
-*/
-static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder);
-/**
-Read the SOD marker (start of data)
-@param j2k J2K handle
-*/
-static void j2k_read_sod(opj_j2k_t *j2k);
-/**
-Write the RGN marker (region-of-interest)
-@param j2k J2K handle
-@param compno Number of the component concerned by the information written
-@param tileno Number of the tile concerned by the information written
-*/
-static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno);
-/**
-Read the RGN marker (region-of-interest)
-@param j2k J2K handle
-*/
-static void j2k_read_rgn(opj_j2k_t *j2k);
-/**
-Write the EOC marker (end of codestream)
-@param j2k J2K handle
-*/
-static void j2k_write_eoc(opj_j2k_t *j2k);
-/**
-Read the EOC marker (end of codestream)
-@param j2k J2K handle
-*/
-static void j2k_read_eoc(opj_j2k_t *j2k);
-/**
-Read an unknown marker
-@param j2k J2K handle
-*/
-static void j2k_read_unk(opj_j2k_t *j2k);
-/**
-Add main header marker information
-@param cstr_info Codestream information structure
-@param type marker type
-@param pos byte offset of marker segment
-@param len length of marker segment
- */
-static void j2k_add_mhmarker(opj_codestream_info_t *cstr_info,
- unsigned short int type, int pos, int len);
-/**
-Add tile header marker information
-@param tileno tile index number
-@param cstr_info Codestream information structure
-@param type marker type
-@param pos byte offset of marker segment
-@param len length of marker segment
- */
-static void j2k_add_tlmarker(int tileno, opj_codestream_info_t *cstr_info,
- unsigned short int type, int pos, int len);
-
-/*@}*/
-
-/*@}*/
-
-/* ----------------------------------------------------------------------- */
-typedef struct j2k_prog_order {
- OPJ_PROG_ORDER enum_prog;
- char str_prog[5];
-} j2k_prog_order_t;
-
-j2k_prog_order_t j2k_prog_order_list[] = {
- {CPRL, "CPRL"},
- {LRCP, "LRCP"},
- {PCRL, "PCRL"},
- {RLCP, "RLCP"},
- {RPCL, "RPCL"},
- {(OPJ_PROG_ORDER) - 1, ""}
-};
-
-char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order)
-{
- j2k_prog_order_t *po;
- for (po = j2k_prog_order_list; po->enum_prog != -1; po++) {
- if (po->enum_prog == prg_order) {
- break;
- }
- }
- return po->str_prog;
-}
-
-/* ----------------------------------------------------------------------- */
-static int j2k_get_num_tp(opj_cp_t *cp, int pino, int tileno)
-{
- char *prog;
- int i;
- int tpnum = 1, tpend = 0;
- opj_tcp_t *tcp = &cp->tcps[tileno];
- prog = j2k_convert_progression_order(tcp->prg);
-
- if (cp->tp_on == 1) {
- for (i = 0; i < 4; i++) {
- if (tpend != 1) {
- if (cp->tp_flag == prog[i]) {
- tpend = 1;
- cp->tp_pos = i;
- }
- switch (prog[i]) {
- case 'C':
- tpnum = tpnum * tcp->pocs[pino].compE;
- break;
- case 'R':
- tpnum = tpnum * tcp->pocs[pino].resE;
- break;
- case 'P':
- tpnum = tpnum * tcp->pocs[pino].prcE;
- break;
- case 'L':
- tpnum = tpnum * tcp->pocs[pino].layE;
- break;
- }
- }
- }
- } else {
- tpnum = 1;
- }
- return tpnum;
-}
-
-/** mem allocation for TLM marker*/
-static int j2k_calculate_tp(opj_cp_t *cp, int img_numcomp, opj_image_t *image,
- opj_j2k_t *j2k)
-{
- int pino, tileno, totnum_tp = 0;
-
- OPJ_ARG_NOT_USED(img_numcomp);
-
- j2k->cur_totnum_tp = (int *) opj_malloc(sizeof(int) * cp->tw * cp->th);
- for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
- int cur_totnum_tp = 0;
- opj_tcp_t *tcp = &cp->tcps[tileno];
- for (pino = 0; pino <= tcp->numpocs; pino++) {
- int tp_num = 0;
- opj_pi_iterator_t *pi = pi_initialise_encode(image, cp, tileno, FINAL_PASS);
- if (!pi) {
- return -1;
- }
- tp_num = j2k_get_num_tp(cp, pino, tileno);
- totnum_tp = totnum_tp + tp_num;
- cur_totnum_tp = cur_totnum_tp + tp_num;
- pi_destroy(pi, cp, tileno);
- }
- j2k->cur_totnum_tp[tileno] = cur_totnum_tp;
- /* INDEX >> */
- if (j2k->cstr_info) {
- j2k->cstr_info->tile[tileno].num_tps = cur_totnum_tp;
- j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_malloc(
- cur_totnum_tp * sizeof(opj_tp_info_t));
- }
- /* << INDEX */
- }
- return totnum_tp;
-}
-
-static void j2k_write_soc(opj_j2k_t *j2k)
-{
- opj_cio_t *cio = j2k->cio;
- cio_write(cio, J2K_MS_SOC, 2);
-
- if (j2k->cstr_info) {
- j2k_add_mhmarker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio), 0);
- }
-
- /* UniPG>> */
-#ifdef USE_JPWL
-
- /* update markers struct */
- j2k_add_marker(j2k->cstr_info, J2K_MS_SOC, cio_tell(cio) - 2, 2);
-#endif /* USE_JPWL */
- /* <<UniPG */
-}
-
-static void j2k_read_soc(opj_j2k_t *j2k)
-{
- j2k->state = J2K_STATE_MHSIZ;
- /* Index */
- if (j2k->cstr_info) {
- j2k->cstr_info->main_head_start = cio_tell(j2k->cio) - 2;
- j2k->cstr_info->codestream_size = cio_numbytesleft(j2k->cio) + 2 -
- j2k->cstr_info->main_head_start;
- }
-}
-
-static void j2k_write_siz(opj_j2k_t *j2k)
-{
- int i;
- int lenp, len;
-
- opj_cio_t *cio = j2k->cio;
- opj_image_t *image = j2k->image;
- opj_cp_t *cp = j2k->cp;
-
- cio_write(cio, J2K_MS_SIZ, 2); /* SIZ */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, cp->rsiz, 2); /* Rsiz (capabilities) */
- cio_write(cio, image->x1, 4); /* Xsiz */
- cio_write(cio, image->y1, 4); /* Ysiz */
- cio_write(cio, image->x0, 4); /* X0siz */
- cio_write(cio, image->y0, 4); /* Y0siz */
- cio_write(cio, cp->tdx, 4); /* XTsiz */
- cio_write(cio, cp->tdy, 4); /* YTsiz */
- cio_write(cio, cp->tx0, 4); /* XT0siz */
- cio_write(cio, cp->ty0, 4); /* YT0siz */
- cio_write(cio, image->numcomps, 2); /* Csiz */
- for (i = 0; i < image->numcomps; i++) {
- cio_write(cio, image->comps[i].prec - 1 + (image->comps[i].sgnd << 7),
- 1); /* Ssiz_i */
- cio_write(cio, image->comps[i].dx, 1); /* XRsiz_i */
- cio_write(cio, image->comps[i].dy, 1); /* YRsiz_i */
- }
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lsiz */
- cio_seek(cio, lenp + len);
-
- if (j2k->cstr_info) {
- j2k_add_mhmarker(j2k->cstr_info, J2K_MS_SIZ, lenp, len);
- }
-}
-
-static void j2k_read_siz(opj_j2k_t *j2k)
-{
- int len, i;
-
- opj_cio_t *cio = j2k->cio;
- opj_image_t *image = j2k->image;
- opj_cp_t *cp = j2k->cp;
-
- len = cio_read(cio, 2); /* Lsiz */
- 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 */
- cp->tdx = cio_read(cio, 4); /* XTsiz */
- cp->tdy = cio_read(cio, 4); /* YTsiz */
- cp->tx0 = cio_read(cio, 4); /* XT0siz */
- cp->ty0 = cio_read(cio, 4); /* YT0siz */
-
- if ((image->x0 < 0) || (image->x1 < 0) || (image->y0 < 0) || (image->y1 < 0)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "%s: invalid image size (x0:%d, x1:%d, y0:%d, y1:%d)\n",
- image->x0, image->x1, image->y0, image->y1);
- return;
- }
-
- image->numcomps = cio_read(cio, 2); /* Csiz */
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
- /* if JPWL is on, we check whether TX errors have damaged
- too much the SIZ parameters */
- if (!(image->x1 * image->y1)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad image size (%d x %d)\n",
- image->x1, image->y1);
- if (!JPWL_ASSUME || JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- }
- if (image->numcomps != ((len - 38) / 3)) {
- opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
- "JPWL: Csiz is %d => space in SIZ only for %d comps.!!!\n",
- image->numcomps, ((len - 38) / 3));
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n");
- if (image->numcomps < ((len - 38) / 3)) {
- len = 38 + 3 * image->numcomps;
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "- setting Lsiz to %d => HYPOTHESIS!!!\n",
- len);
- } else {
- image->numcomps = ((len - 38) / 3);
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "- setting Csiz to %d => HYPOTHESIS!!!\n",
- image->numcomps);
- }
- }
-
- /* update components number in the jpwl_exp_comps filed */
- cp->exp_comps = image->numcomps;
- }
-#endif /* USE_JPWL */
-
- /* prevent division by zero */
- if (!(cp->tdx * cp->tdy)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: invalid tile size (tdx: %d, tdy: %d)\n", cp->tdx, cp->tdy);
- return;
- }
-
- image->comps = (opj_image_comp_t*) opj_calloc(image->numcomps,
- sizeof(opj_image_comp_t));
- for (i = 0; i < image->numcomps; i++) {
- int tmp, w, h;
- 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 */
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
- /* if JPWL is on, we check whether TX errors have damaged
- too much the SIZ parameters, again */
- if (!(image->comps[i].dx * image->comps[i].dy)) {
- opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
- "JPWL: bad XRsiz_%d/YRsiz_%d (%d x %d)\n",
- i, i, image->comps[i].dx, image->comps[i].dy);
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n");
- if (!image->comps[i].dx) {
- image->comps[i].dx = 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "- setting XRsiz_%d to %d => HYPOTHESIS!!!\n",
- i, image->comps[i].dx);
- }
- if (!image->comps[i].dy) {
- image->comps[i].dy = 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "- setting YRsiz_%d to %d => HYPOTHESIS!!!\n",
- i, image->comps[i].dy);
- }
- }
-
- }
-#endif /* USE_JPWL */
-
- /* prevent division by zero */
- if (!(image->comps[i].dx * image->comps[i].dy)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: invalid component size (dx: %d, dy: %d)\n", image->comps[i].dx,
- image->comps[i].dy);
- return;
- }
-
- /* TODO: unused ? */
- w = int_ceildiv(image->x1 - image->x0, image->comps[i].dx);
- h = int_ceildiv(image->y1 - image->y0, image->comps[i].dy);
-
- image->comps[i].resno_decoded = 0; /* number of resolution decoded */
- image->comps[i].factor = cp->reduce; /* reducing factor per component */
- }
-
- cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx);
- cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy);
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
- /* if JPWL is on, we check whether TX errors have damaged
- too much the SIZ parameters */
- if ((cp->tw < 1) || (cp->th < 1) || (cp->tw > cp->max_tiles) ||
- (cp->th > cp->max_tiles)) {
- opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
- "JPWL: bad number of tiles (%d x %d)\n",
- cp->tw, cp->th);
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n");
- if (cp->tw < 1) {
- cp->tw = 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "- setting %d tiles in x => HYPOTHESIS!!!\n",
- cp->tw);
- }
- if (cp->tw > cp->max_tiles) {
- cp->tw = 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "- too large x, increase expectance of %d\n"
- "- setting %d tiles in x => HYPOTHESIS!!!\n",
- cp->max_tiles, cp->tw);
- }
- if (cp->th < 1) {
- cp->th = 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "- setting %d tiles in y => HYPOTHESIS!!!\n",
- cp->th);
- }
- if (cp->th > cp->max_tiles) {
- cp->th = 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "- too large y, increase expectance of %d to continue\n",
- "- setting %d tiles in y => HYPOTHESIS!!!\n",
- cp->max_tiles, cp->th);
- }
- }
- }
-#endif /* USE_JPWL */
-
- cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
- if (cp->tcps == NULL) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Out of memory\n");
- return;
- }
- cp->tileno = (int*) opj_malloc(sizeof(int) * cp->tw * cp->th);
- if (cp->tileno == NULL) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Out of memory\n");
- return;
- }
- cp->tileno_size = 0;
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
- if (!cp->tcps) {
- opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
- "JPWL: could not alloc tcps field of cp\n");
- if (!JPWL_ASSUME || JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- }
- }
-#endif /* USE_JPWL */
-
- for (i = 0; i < cp->tw * cp->th; i++) {
- cp->tcps[i].POC = 0;
- cp->tcps[i].numpocs = 0;
- cp->tcps[i].first = 1;
- }
-
- /* Initialization for PPM marker */
- cp->ppm = 0;
- cp->ppm_data = NULL;
- cp->ppm_data_first = NULL;
- cp->ppm_previous = 0;
- cp->ppm_store = 0;
-
- j2k->default_tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps,
- sizeof(opj_tccp_t));
- for (i = 0; i < cp->tw * cp->th; i++) {
- cp->tcps[i].tccps = (opj_tccp_t*) opj_malloc(image->numcomps * sizeof(
- opj_tccp_t));
- }
- j2k->tile_data = (unsigned char**) opj_calloc(cp->tw * cp->th,
- sizeof(unsigned char*));
- j2k->tile_len = (int*) opj_calloc(cp->tw * cp->th, sizeof(int));
- j2k->state = J2K_STATE_MH;
-
- /* Index */
- if (j2k->cstr_info) {
- opj_codestream_info_t *cstr_info = j2k->cstr_info;
- cstr_info->image_w = image->x1 - image->x0;
- cstr_info->image_h = image->y1 - image->y0;
- cstr_info->numcomps = image->numcomps;
- cstr_info->tw = cp->tw;
- cstr_info->th = cp->th;
- cstr_info->tile_x = cp->tdx;
- cstr_info->tile_y = cp->tdy;
- cstr_info->tile_Ox = cp->tx0;
- cstr_info->tile_Oy = cp->ty0;
- cstr_info->tile = (opj_tile_info_t*) opj_calloc(cp->tw * cp->th,
- sizeof(opj_tile_info_t));
- }
-}
-
-static void j2k_write_com(opj_j2k_t *j2k)
-{
- unsigned int i;
- int lenp, len;
-
- if (j2k->cp->comment) {
- opj_cio_t *cio = j2k->cio;
- char *comment = j2k->cp->comment;
-
- cio_write(cio, J2K_MS_COM, 2);
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, 1, 2); /* General use (IS 8859-15:1999 (Latin) values) */
- for (i = 0; i < strlen(comment); i++) {
- cio_write(cio, comment[i], 1);
- }
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2);
- cio_seek(cio, lenp + len);
-
-
- if (j2k->cstr_info) {
- j2k_add_mhmarker(j2k->cstr_info, J2K_MS_COM, lenp, len);
- }
-
- }
-}
-
-static void j2k_read_com(opj_j2k_t *j2k)
-{
- int len;
-
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2);
- cio_skip(cio, len - 2);
-}
-
-static void j2k_write_cox(opj_j2k_t *j2k, int compno)
-{
- int i;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, tccp->numresolutions - 1, 1); /* SPcox (D) */
- cio_write(cio, tccp->cblkw - 2, 1); /* SPcox (E) */
- cio_write(cio, tccp->cblkh - 2, 1); /* SPcox (F) */
- cio_write(cio, tccp->cblksty, 1); /* SPcox (G) */
- cio_write(cio, tccp->qmfbid, 1); /* SPcox (H) */
-
- if (tccp->csty & J2K_CCP_CSTY_PRT) {
- for (i = 0; i < tccp->numresolutions; i++) {
- cio_write(cio, tccp->prcw[i] + (tccp->prch[i] << 4), 1); /* SPcox (I_i) */
- }
- }
-}
-
-static void j2k_read_cox(opj_j2k_t *j2k, int compno)
-{
- int i;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] :
- j2k->default_tcp;
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_cio_t *cio = j2k->cio;
-
- tccp->numresolutions = cio_read(cio, 1) + 1; /* SPcox (D) */
-
- /* If user wants to remove more resolutions than the codestream contains, return error*/
- if (cp->reduce >= tccp->numresolutions) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "Error decoding component %d.\nThe number of resolutions to remove is higher than the number "
- "of resolutions of this component\nModify the cp_reduce parameter.\n\n",
- compno);
- j2k->state |= J2K_STATE_ERR;
- }
- if (tccp->numresolutions > J2K_MAXRLVLS) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "Error decoding component %d.\nThe number of resolutions is too big: %d vs max= %d. Truncating.\n\n",
- compno, tccp->numresolutions, J2K_MAXRLVLS);
- j2k->state |= J2K_STATE_ERR;
- tccp->numresolutions = J2K_MAXRLVLS;
- }
-
- tccp->cblkw = cio_read(cio, 1) + 2; /* SPcox (E) */
- tccp->cblkh = cio_read(cio, 1) + 2; /* SPcox (F) */
- tccp->cblksty = cio_read(cio, 1); /* SPcox (G) */
- tccp->qmfbid = cio_read(cio, 1); /* SPcox (H) */
- if (tccp->csty & J2K_CP_CSTY_PRT) {
- for (i = 0; i < tccp->numresolutions; i++) {
- int tmp = cio_read(cio, 1); /* SPcox (I_i) */
- tccp->prcw[i] = tmp & 0xf;
- tccp->prch[i] = tmp >> 4;
- }
- }
-
- /* INDEX >> */
- if (j2k->cstr_info && compno == 0) {
- for (i = 0; i < tccp->numresolutions; i++) {
- if (tccp->csty & J2K_CP_CSTY_PRT) {
- j2k->cstr_info->tile[j2k->curtileno].pdx[i] = tccp->prcw[i];
- j2k->cstr_info->tile[j2k->curtileno].pdy[i] = tccp->prch[i];
- } else {
- j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15;
- j2k->cstr_info->tile[j2k->curtileno].pdx[i] = 15;
- }
- }
- }
- /* << INDEX */
-}
-
-static void j2k_write_cod(opj_j2k_t *j2k)
-{
- opj_cp_t *cp = NULL;
- opj_tcp_t *tcp = NULL;
- int lenp, len;
-
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, J2K_MS_COD, 2); /* COD */
-
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
-
- cp = j2k->cp;
- tcp = &cp->tcps[j2k->curtileno];
-
- cio_write(cio, tcp->csty, 1); /* Scod */
- cio_write(cio, tcp->prg, 1); /* SGcod (A) */
- cio_write(cio, tcp->numlayers, 2); /* SGcod (B) */
- cio_write(cio, tcp->mct, 1); /* SGcod (C) */
-
- j2k_write_cox(j2k, 0);
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lcod */
- cio_seek(cio, lenp + len);
-
- if (j2k->cstr_info) {
- j2k_add_mhmarker(j2k->cstr_info, J2K_MS_COD, lenp, len);
- }
-
-}
-
-static void j2k_read_cod(opj_j2k_t *j2k)
-{
- int len, i, pos;
-
- opj_cio_t *cio = j2k->cio;
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] :
- j2k->default_tcp;
- opj_image_t *image = j2k->image;
-
- len = cio_read(cio, 2); /* Lcod */
- tcp->csty = cio_read(cio, 1); /* Scod */
- tcp->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* SGcod (A) */
- tcp->numlayers = cio_read(cio, 2); /* SGcod (B) */
- tcp->mct = cio_read(cio, 1); /* SGcod (C) */
-
- pos = cio_tell(cio);
- for (i = 0; i < image->numcomps; i++) {
- tcp->tccps[i].csty = tcp->csty & J2K_CP_CSTY_PRT;
- cio_seek(cio, pos);
- j2k_read_cox(j2k, i);
- }
-
- /* Index */
- if (j2k->cstr_info) {
- opj_codestream_info_t *cstr_info = j2k->cstr_info;
- cstr_info->prog = tcp->prg;
- cstr_info->numlayers = tcp->numlayers;
- cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int));
- for (i = 0; i < image->numcomps; i++) {
- cstr_info->numdecompos[i] = tcp->tccps[i].numresolutions - 1;
- }
- }
-}
-
-static void j2k_write_coc(opj_j2k_t *j2k, int compno)
-{
- int lenp, len;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
- opj_image_t *image = j2k->image;
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, J2K_MS_COC, 2); /* COC */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, compno, image->numcomps <= 256 ? 1 : 2); /* Ccoc */
- cio_write(cio, tcp->tccps[compno].csty, 1); /* Scoc */
- j2k_write_cox(j2k, compno);
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lcoc */
- cio_seek(cio, lenp + len);
-}
-
-static void j2k_read_coc(opj_j2k_t *j2k)
-{
- int len, compno;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] :
- j2k->default_tcp;
- opj_image_t *image = j2k->image;
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2); /* Lcoc */
- compno = cio_read(cio, image->numcomps <= 256 ? 1 : 2); /* Ccoc */
- if (compno >= image->numcomps) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "bad component number in COC (%d out of a maximum of %d)\n",
- compno, image->numcomps);
- return;
- }
- tcp->tccps[compno].csty = cio_read(cio, 1); /* Scoc */
- j2k_read_cox(j2k, compno);
-}
-
-static void j2k_write_qcx(opj_j2k_t *j2k, int compno)
-{
- int bandno, numbands;
- int expn, mant;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, tccp->qntsty + (tccp->numgbits << 5), 1); /* Sqcx */
- numbands = tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : tccp->numresolutions * 3 -
- 2;
-
- for (bandno = 0; bandno < numbands; bandno++) {
- expn = tccp->stepsizes[bandno].expn;
- mant = tccp->stepsizes[bandno].mant;
-
- if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
- cio_write(cio, expn << 3, 1); /* SPqcx_i */
- } else {
- cio_write(cio, (expn << 11) + mant, 2); /* SPqcx_i */
- }
- }
-}
-
-static void j2k_read_qcx(opj_j2k_t *j2k, int compno, int len)
-{
- int tmp;
- int bandno, numbands;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] :
- j2k->default_tcp;
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_cio_t *cio = j2k->cio;
-
- tmp = cio_read(cio, 1); /* Sqcx */
- tccp->qntsty = tmp & 0x1f;
- tccp->numgbits = tmp >> 5;
- numbands = (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) ?
- 1 : ((tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) ? len - 1 : (len - 1) / 2);
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
-
- /* if JPWL is on, we check whether there are too many subbands */
- if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) {
- opj_event_msg(j2k->cinfo, JPWL_ASSUME ? EVT_WARNING : EVT_ERROR,
- "JPWL: bad number of subbands in Sqcx (%d)\n",
- numbands);
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- numbands = 1;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust them\n"
- "- setting number of bands to %d => HYPOTHESIS!!!\n",
- numbands);
- };
-
- };
-
-#else
- /* We check whether there are too many subbands */
- if ((numbands < 0) || (numbands >= J2K_MAXBANDS)) {
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "bad number of subbands in Sqcx (%d) regarding to J2K_MAXBANDS (%d) \n"
- "- limiting number of bands to J2K_MAXBANDS and try to move to the next markers\n",
- numbands, J2K_MAXBANDS);
- }
-
-#endif /* USE_JPWL */
-
- for (bandno = 0; bandno < numbands; bandno++) {
- int expn, mant;
- if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) {
- expn = cio_read(cio, 1) >> 3; /* SPqcx_i */
- mant = 0;
- } else {
- tmp = cio_read(cio, 2); /* SPqcx_i */
- expn = tmp >> 11;
- mant = tmp & 0x7ff;
- }
- if (bandno < J2K_MAXBANDS) {
- tccp->stepsizes[bandno].expn = expn;
- tccp->stepsizes[bandno].mant = mant;
- }
- }
-
- /* Add Antonin : if scalar_derived -> compute other stepsizes */
- if (tccp->qntsty == J2K_CCP_QNTSTY_SIQNT) {
- for (bandno = 1; bandno < J2K_MAXBANDS; bandno++) {
- tccp->stepsizes[bandno].expn =
- ((tccp->stepsizes[0].expn) - ((bandno - 1) / 3) > 0) ?
- (tccp->stepsizes[0].expn) - ((bandno - 1) / 3) : 0;
- tccp->stepsizes[bandno].mant = tccp->stepsizes[0].mant;
- }
- }
- /* ddA */
-}
-
-static void j2k_write_qcd(opj_j2k_t *j2k)
-{
- int lenp, len;
-
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, J2K_MS_QCD, 2); /* QCD */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- j2k_write_qcx(j2k, 0);
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lqcd */
- cio_seek(cio, lenp + len);
-
- if (j2k->cstr_info) {
- j2k_add_mhmarker(j2k->cstr_info, J2K_MS_QCD, lenp, len);
- }
-}
-
-static void j2k_read_qcd(opj_j2k_t *j2k)
-{
- int len, i, pos;
-
- opj_cio_t *cio = j2k->cio;
- opj_image_t *image = j2k->image;
-
- len = cio_read(cio, 2); /* Lqcd */
- pos = cio_tell(cio);
- for (i = 0; i < image->numcomps; i++) {
- cio_seek(cio, pos);
- j2k_read_qcx(j2k, i, len - 2);
- }
-}
-
-static void j2k_write_qcc(opj_j2k_t *j2k, int compno)
-{
- int lenp, len;
-
- opj_cio_t *cio = j2k->cio;
-
- cio_write(cio, J2K_MS_QCC, 2); /* QCC */
- lenp = cio_tell(cio);
- cio_skip(cio, 2);
- cio_write(cio, compno, j2k->image->numcomps <= 256 ? 1 : 2); /* Cqcc */
- j2k_write_qcx(j2k, compno);
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lqcc */
- cio_seek(cio, lenp + len);
-}
-
-static void j2k_read_qcc(opj_j2k_t *j2k)
-{
- int len, compno;
- int numcomp = j2k->image->numcomps;
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2); /* Lqcc */
- compno = cio_read(cio, numcomp <= 256 ? 1 : 2); /* Cqcc */
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
-
- static int backup_compno = 0;
-
- /* compno is negative or larger than the number of components!!! */
- if ((compno < 0) || (compno >= numcomp)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad component number in QCC (%d out of a maximum of %d)\n",
- compno, numcomp);
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- compno = backup_compno % numcomp;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"
- "- setting component number to %d\n",
- compno);
- }
-
- /* keep your private count of tiles */
- backup_compno++;
- }
-#endif /* USE_JPWL */
-
- if ((compno < 0) || (compno >= numcomp)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "bad component number in QCC (%d out of a maximum of %d)\n",
- compno, j2k->image->numcomps);
- return;
- }
-
- j2k_read_qcx(j2k, compno, len - 2 - (numcomp <= 256 ? 1 : 2));
-}
-
-static void j2k_write_poc(opj_j2k_t *j2k)
-{
- int len, numpchgs, i;
-
- int numcomps = j2k->image->numcomps;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = &cp->tcps[j2k->curtileno];
- opj_tccp_t *tccp = &tcp->tccps[0];
- opj_cio_t *cio = j2k->cio;
-
- numpchgs = 1 + tcp->numpocs;
- cio_write(cio, J2K_MS_POC, 2); /* POC */
- len = 2 + (5 + 2 * (numcomps <= 256 ? 1 : 2)) * numpchgs;
- cio_write(cio, len, 2); /* Lpoc */
- for (i = 0; i < numpchgs; i++) {
- opj_poc_t *poc = &tcp->pocs[i];
- cio_write(cio, poc->resno0, 1); /* RSpoc_i */
- cio_write(cio, poc->compno0, (numcomps <= 256 ? 1 : 2)); /* CSpoc_i */
- cio_write(cio, poc->layno1, 2); /* LYEpoc_i */
- poc->layno1 = int_min(poc->layno1, tcp->numlayers);
- cio_write(cio, poc->resno1, 1); /* REpoc_i */
- poc->resno1 = int_min(poc->resno1, tccp->numresolutions);
- cio_write(cio, poc->compno1, (numcomps <= 256 ? 1 : 2)); /* CEpoc_i */
- poc->compno1 = int_min(poc->compno1, numcomps);
- cio_write(cio, poc->prg, 1); /* Ppoc_i */
- }
-}
-
-static void j2k_read_poc(opj_j2k_t *j2k)
-{
- int len, numpchgs, i, old_poc;
-
- int numcomps = j2k->image->numcomps;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] :
- j2k->default_tcp;
- opj_cio_t *cio = j2k->cio;
-
- old_poc = tcp->POC ? tcp->numpocs + 1 : 0;
- tcp->POC = 1;
- len = cio_read(cio, 2); /* Lpoc */
- numpchgs = (len - 2) / (5 + 2 * (numcomps <= 256 ? 1 : 2));
-
- for (i = old_poc; i < numpchgs + old_poc; i++) {
- opj_poc_t *poc;
- poc = &tcp->pocs[i];
- poc->resno0 = cio_read(cio, 1); /* RSpoc_i */
- poc->compno0 = cio_read(cio, numcomps <= 256 ? 1 : 2); /* CSpoc_i */
- poc->layno1 = cio_read(cio, 2); /* LYEpoc_i */
- poc->resno1 = cio_read(cio, 1); /* REpoc_i */
- poc->compno1 = int_min(
- cio_read(cio, numcomps <= 256 ? 1 : 2),
- (unsigned int) numcomps); /* CEpoc_i */
- poc->prg = (OPJ_PROG_ORDER)cio_read(cio, 1); /* Ppoc_i */
- }
-
- tcp->numpocs = numpchgs + old_poc - 1;
-}
-
-static void j2k_read_crg(opj_j2k_t *j2k)
-{
- int len, i, Xcrg_i, Ycrg_i;
-
- opj_cio_t *cio = j2k->cio;
- int numcomps = j2k->image->numcomps;
-
- len = cio_read(cio, 2); /* Lcrg */
- for (i = 0; i < numcomps; i++) {
- Xcrg_i = cio_read(cio, 2); /* Xcrg_i */
- Ycrg_i = cio_read(cio, 2); /* Ycrg_i */
- }
-}
-
-static void j2k_read_tlm(opj_j2k_t *j2k)
-{
- int len, Ztlm, Stlm, ST, SP, tile_tlm, i;
- long int Ttlm_i, Ptlm_i;
-
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2); /* Ltlm */
- Ztlm = cio_read(cio, 1); /* Ztlm */
- Stlm = cio_read(cio, 1); /* Stlm */
- ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
- SP = (Stlm >> 6) & 0x01;
- tile_tlm = (len - 4) / ((SP + 1) * 2 + ST);
- for (i = 0; i < tile_tlm; i++) {
- Ttlm_i = cio_read(cio, ST); /* Ttlm_i */
- Ptlm_i = cio_read(cio, SP ? 4 : 2); /* Ptlm_i */
- }
-}
-
-static void j2k_read_plm(opj_j2k_t *j2k)
-{
- int len, i, Zplm, Nplm, add, packet_len = 0;
-
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2); /* Lplm */
- Zplm = cio_read(cio, 1); /* Zplm */
- len -= 3;
- while (len > 0) {
- Nplm = cio_read(cio, 4); /* Nplm */
- len -= 4;
- for (i = Nplm; i > 0; i--) {
- add = cio_read(cio, 1);
- len--;
- packet_len = (packet_len << 7) + add; /* Iplm_ij */
- if ((add & 0x80) == 0) {
- /* New packet */
- packet_len = 0;
- }
- if (len <= 0) {
- break;
- }
- }
- }
-}
-
-static void j2k_read_plt(opj_j2k_t *j2k)
-{
- int len, i, Zplt, packet_len = 0, add;
-
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2); /* Lplt */
- Zplt = cio_read(cio, 1); /* Zplt */
- for (i = len - 3; i > 0; i--) {
- add = cio_read(cio, 1);
- packet_len = (packet_len << 7) + add; /* Iplt_i */
- if ((add & 0x80) == 0) {
- /* New packet */
- packet_len = 0;
- }
- }
-}
-
-static void j2k_read_ppm(opj_j2k_t *j2k)
-{
- int len, Z_ppm, i, j;
- int N_ppm;
-
- opj_cp_t *cp = j2k->cp;
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2);
- cp->ppm = 1;
-
- Z_ppm = cio_read(cio, 1); /* Z_ppm */
- len -= 3;
- while (len > 0) {
- if (cp->ppm_previous == 0) {
- N_ppm = cio_read(cio, 4); /* N_ppm */
- len -= 4;
- } else {
- N_ppm = cp->ppm_previous;
- }
- j = cp->ppm_store;
- if (Z_ppm == 0) { /* First PPM marker */
- cp->ppm_data = (unsigned char *) opj_malloc(N_ppm * sizeof(unsigned char));
- cp->ppm_data_first = cp->ppm_data;
- cp->ppm_len = N_ppm;
- } else { /* NON-first PPM marker */
- cp->ppm_data = (unsigned char *) opj_realloc(cp->ppm_data,
- (N_ppm + cp->ppm_store) * sizeof(unsigned char));
-
-#ifdef USE_JPWL
- /* this memory allocation check could be done even in non-JPWL cases */
- if (cp->correct) {
- if (!cp->ppm_data) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: failed memory allocation during PPM marker parsing (pos. %x)\n",
- cio_tell(cio));
- if (!JPWL_ASSUME || JPWL_ASSUME) {
- opj_free(cp->ppm_data);
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- }
- }
-#endif
-
- cp->ppm_data_first = cp->ppm_data;
- cp->ppm_len = N_ppm + cp->ppm_store;
- }
- for (i = N_ppm; i > 0; i--) { /* Read packet header */
- cp->ppm_data[j] = cio_read(cio, 1);
- j++;
- len--;
- if (len == 0) {
- break; /* Case of non-finished packet header in present marker but finished in next one */
- }
- }
- cp->ppm_previous = i - 1;
- cp->ppm_store = j;
- }
-}
-
-static void j2k_read_ppt(opj_j2k_t *j2k)
-{
- int len, Z_ppt, i, j = 0;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = cp->tcps + j2k->curtileno;
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2);
- Z_ppt = cio_read(cio, 1);
- tcp->ppt = 1;
- if (Z_ppt == 0) { /* First PPT marker */
- tcp->ppt_data = (unsigned char *) opj_malloc((len - 3) * sizeof(unsigned char));
- tcp->ppt_data_first = tcp->ppt_data;
- tcp->ppt_store = 0;
- tcp->ppt_len = len - 3;
- } else { /* NON-first PPT marker */
- tcp->ppt_data = (unsigned char *) opj_realloc(tcp->ppt_data,
- (len - 3 + tcp->ppt_store) * sizeof(unsigned char));
- tcp->ppt_data_first = tcp->ppt_data;
- tcp->ppt_len = len - 3 + tcp->ppt_store;
- }
- j = tcp->ppt_store;
- for (i = len - 3; i > 0; i--) {
- tcp->ppt_data[j] = cio_read(cio, 1);
- j++;
- }
- tcp->ppt_store = j;
-}
-
-static void j2k_write_tlm(opj_j2k_t *j2k)
-{
- int lenp;
- opj_cio_t *cio = j2k->cio;
- j2k->tlm_start = cio_tell(cio);
- cio_write(cio, J2K_MS_TLM, 2);/* TLM */
- lenp = 4 + (5 * j2k->totnum_tp);
- cio_write(cio, lenp, 2); /* Ltlm */
- cio_write(cio, 0, 1); /* Ztlm=0*/
- cio_write(cio, 80,
- 1); /* Stlm ST=1(8bits-255 tiles max),SP=1(Ptlm=32bits) */
- cio_skip(cio, 5 * j2k->totnum_tp);
-}
-
-static void j2k_write_sot(opj_j2k_t *j2k)
-{
- int lenp, len;
-
- opj_cio_t *cio = j2k->cio;
-
- j2k->sot_start = cio_tell(cio);
- cio_write(cio, J2K_MS_SOT, 2); /* SOT */
- lenp = cio_tell(cio);
- cio_skip(cio, 2); /* Lsot (further) */
- cio_write(cio, j2k->curtileno, 2); /* Isot */
- cio_skip(cio, 4); /* Psot (further in j2k_write_sod) */
- cio_write(cio, j2k->cur_tp_num, 1); /* TPsot */
- cio_write(cio, j2k->cur_totnum_tp[j2k->curtileno], 1); /* TNsot */
- len = cio_tell(cio) - lenp;
- cio_seek(cio, lenp);
- cio_write(cio, len, 2); /* Lsot */
- cio_seek(cio, lenp + len);
-
- /* UniPG>> */
-#ifdef USE_JPWL
- /* update markers struct */
- j2k_add_marker(j2k->cstr_info, J2K_MS_SOT, j2k->sot_start, len + 2);
-#endif /* USE_JPWL */
- /* <<UniPG */
-
- if (j2k->cstr_info && j2k->cur_tp_num == 0) {
- j2k_add_tlmarker(j2k->curtileno, j2k->cstr_info, J2K_MS_SOT, lenp, len);
- }
-}
-
-static void j2k_read_sot(opj_j2k_t *j2k)
-{
- int len, tileno, totlen, partno, numparts, i;
- opj_tcp_t *tcp = NULL;
- char status = 0;
-
- opj_cp_t *cp = j2k->cp;
- opj_cio_t *cio = j2k->cio;
-
- len = cio_read(cio, 2);
- tileno = cio_read(cio, 2);
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
-
- static int backup_tileno = 0;
-
- /* tileno is negative or larger than the number of tiles!!! */
- if ((tileno < 0) || (tileno >= (cp->tw * cp->th))) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad tile number (%d out of a maximum of %d)\n",
- tileno, (cp->tw * cp->th));
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- tileno = backup_tileno;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"
- "- setting tile number to %d\n",
- tileno);
- }
-
- /* keep your private count of tiles */
- backup_tileno++;
- } else
-#endif /* USE_JPWL */
- {
- /* tileno is negative or larger than the number of tiles!!! */
- if ((tileno < 0) || (tileno >= (cp->tw * cp->th))) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad tile number (%d out of a maximum of %d)\n",
- tileno, (cp->tw * cp->th));
- return;
- }
- }
-
- if (cp->tileno_size == 0) {
- cp->tileno[cp->tileno_size] = tileno;
- cp->tileno_size++;
- } else {
- i = 0;
- while (i < cp->tileno_size && status == 0) {
- status = cp->tileno[i] == tileno ? 1 : 0;
- i++;
- }
- if (status == 0) {
- cp->tileno[cp->tileno_size] = tileno;
- cp->tileno_size++;
- }
- }
-
- totlen = cio_read(cio, 4);
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
-
- /* totlen is negative or larger than the bytes left!!! */
- if ((totlen < 0) || (totlen > (cio_numbytesleft(cio) + 8))) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
- totlen, cio_numbytesleft(cio) + 8);
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- /* we try to correct */
- totlen = 0;
- opj_event_msg(j2k->cinfo, EVT_WARNING, "- trying to adjust this\n"
- "- setting Psot to %d => assuming it is the last tile\n",
- totlen);
- }
-
- } else
-#endif /* USE_JPWL */
- {
- /* totlen is negative or larger than the bytes left!!! */
- if ((totlen < 0) || (totlen > (cio_numbytesleft(cio) + 8))) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad tile byte size (%d bytes against %d bytes left)\n",
- totlen, cio_numbytesleft(cio) + 8);
- return;
- }
- }
-
- if (!totlen) {
- totlen = cio_numbytesleft(cio) + 8;
- }
-
- partno = cio_read(cio, 1);
- numparts = cio_read(cio, 1);
-
- if (partno >= numparts) {
- opj_event_msg(j2k->cinfo, EVT_WARNING,
- "SOT marker inconsistency in tile %d: tile-part index greater (%d) than number of tile-parts (%d)\n",
- tileno, partno, numparts);
- numparts = partno + 1;
- }
-
- j2k->curtileno = tileno;
- j2k->cur_tp_num = partno;
- j2k->eot = cio_getbp(cio) - 12 + totlen;
- j2k->state = J2K_STATE_TPH;
- tcp = &cp->tcps[j2k->curtileno];
-
- /* Index */
- if (j2k->cstr_info) {
- if (tcp->first) {
- if (tileno == 0) {
- j2k->cstr_info->main_head_end = cio_tell(cio) - 13;
- }
- j2k->cstr_info->tile[tileno].tileno = tileno;
- j2k->cstr_info->tile[tileno].start_pos = cio_tell(cio) - 12;
- j2k->cstr_info->tile[tileno].end_pos = j2k->cstr_info->tile[tileno].start_pos +
- totlen - 1;
- } else {
- j2k->cstr_info->tile[tileno].end_pos += totlen;
- }
- j2k->cstr_info->tile[tileno].num_tps = numparts;
- if (numparts) {
- j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_realloc(
- j2k->cstr_info->tile[tileno].tp, numparts * sizeof(opj_tp_info_t));
- } else {
- j2k->cstr_info->tile[tileno].tp = (opj_tp_info_t *) opj_realloc(
- j2k->cstr_info->tile[tileno].tp, 10 * sizeof(opj_tp_info_t)); /* Fixme (10)*/
- }
- j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos = cio_tell(cio) - 12;
- j2k->cstr_info->tile[tileno].tp[partno].tp_end_pos =
- j2k->cstr_info->tile[tileno].tp[partno].tp_start_pos + totlen - 1;
- }
-
- if (tcp->first == 1) {
- /* Initialization PPT */
- opj_tccp_t *tmp = tcp->tccps;
- memcpy(tcp, j2k->default_tcp, sizeof(opj_tcp_t));
- tcp->ppt = 0;
- tcp->ppt_data = NULL;
- tcp->ppt_data_first = NULL;
- tcp->tccps = tmp;
-
- for (i = 0; i < j2k->image->numcomps; i++) {
- tcp->tccps[i] = j2k->default_tcp->tccps[i];
- }
- cp->tcps[j2k->curtileno].first = 0;
- }
-}
-
-static void j2k_write_sod(opj_j2k_t *j2k, void *tile_coder)
-{
- int l, layno;
- int totlen;
- opj_tcp_t *tcp = NULL;
- opj_codestream_info_t *cstr_info = NULL;
-
- opj_tcd_t *tcd = (opj_tcd_t*)
- tile_coder; /* cast is needed because of conflicts in header inclusions */
- opj_cp_t *cp = j2k->cp;
- opj_cio_t *cio = j2k->cio;
-
- tcd->tp_num = j2k->tp_num ;
- tcd->cur_tp_num = j2k->cur_tp_num;
-
- cio_write(cio, J2K_MS_SOD, 2);
-
- if (j2k->cstr_info && j2k->cur_tp_num == 0) {
- j2k_add_tlmarker(j2k->curtileno, j2k->cstr_info, J2K_MS_SOD, cio_tell(cio), 0);
- }
-
- if (j2k->curtileno == 0) {
- j2k->sod_start = cio_tell(cio) + j2k->pos_correction;
- }
-
- /* INDEX >> */
- cstr_info = j2k->cstr_info;
- if (cstr_info) {
- if (!j2k->cur_tp_num) {
- cstr_info->tile[j2k->curtileno].end_header = cio_tell(cio) + j2k->pos_correction
- - 1;
- j2k->cstr_info->tile[j2k->curtileno].tileno = j2k->curtileno;
- } else {
- if (cstr_info->tile[j2k->curtileno].packet[cstr_info->packno - 1].end_pos <
- cio_tell(cio)) {
- cstr_info->tile[j2k->curtileno].packet[cstr_info->packno].start_pos = cio_tell(
- cio);
- }
- }
- /* UniPG>> */
-#ifdef USE_JPWL
- /* update markers struct */
- j2k_add_marker(j2k->cstr_info, J2K_MS_SOD, j2k->sod_start, 2);
-#endif /* USE_JPWL */
- /* <<UniPG */
- }
- /* << INDEX */
-
- tcp = &cp->tcps[j2k->curtileno];
- for (layno = 0; layno < tcp->numlayers; layno++) {
- if (tcp->rates[layno] > (j2k->sod_start / (cp->th * cp->tw))) {
- tcp->rates[layno] -= (j2k->sod_start / (cp->th * cp->tw));
- } else if (tcp->rates[layno]) {
- tcp->rates[layno] = 1;
- }
- }
- if (j2k->cur_tp_num == 0) {
- tcd->tcd_image->tiles->packno = 0;
- if (cstr_info) {
- cstr_info->packno = 0;
- }
- }
-
- l = tcd_encode_tile(tcd, j2k->curtileno, cio_getbp(cio),
- cio_numbytesleft(cio) - 2, cstr_info);
-
- /* Writing Psot in SOT marker */
- totlen = cio_tell(cio) + l - j2k->sot_start;
- cio_seek(cio, j2k->sot_start + 6);
- cio_write(cio, totlen, 4);
- cio_seek(cio, j2k->sot_start + totlen);
- /* Writing Ttlm and Ptlm in TLM marker */
- if (cp->cinema) {
- cio_seek(cio, j2k->tlm_start + 6 + (5 * j2k->cur_tp_num));
- cio_write(cio, j2k->curtileno, 1);
- cio_write(cio, totlen, 4);
- }
- cio_seek(cio, j2k->sot_start + totlen);
-}
-
-static void j2k_read_sod(opj_j2k_t *j2k)
-{
- int len, truncate = 0, i;
- unsigned char *data = NULL, *data_ptr = NULL;
-
- opj_cio_t *cio = j2k->cio;
- int curtileno = j2k->curtileno;
-
- /* Index */
- if (j2k->cstr_info) {
- j2k->cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header =
- cio_tell(cio) + j2k->pos_correction - 1;
- if (j2k->cur_tp_num == 0) {
- j2k->cstr_info->tile[j2k->curtileno].end_header = cio_tell(
- cio) + j2k->pos_correction - 1;
- }
- j2k->cstr_info->packno = 0;
- }
-
- len = int_min(j2k->eot - cio_getbp(cio), cio_numbytesleft(cio) + 1);
-
- if (len == cio_numbytesleft(cio) + 1) {
- truncate = 1; /* Case of a truncate codestream */
- }
-
- data = j2k->tile_data[curtileno];
- data = (unsigned char*) opj_realloc(data,
- (j2k->tile_len[curtileno] + len) * sizeof(unsigned char));
-
- data_ptr = data + j2k->tile_len[curtileno];
- for (i = 0; i < len; i++) {
- data_ptr[i] = cio_read(cio, 1);
- }
-
- j2k->tile_len[curtileno] += len;
- j2k->tile_data[curtileno] = data;
-
- if (!truncate) {
- j2k->state = J2K_STATE_TPHSOT;
- } else {
- j2k->state = J2K_STATE_NEOC; /* RAJOUTE !! */
- }
- j2k->cur_tp_num++;
-}
-
-static void j2k_write_rgn(opj_j2k_t *j2k, int compno, int tileno)
-{
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = &cp->tcps[tileno];
- opj_cio_t *cio = j2k->cio;
- int numcomps = j2k->image->numcomps;
-
- cio_write(cio, J2K_MS_RGN, 2); /* RGN */
- cio_write(cio, numcomps <= 256 ? 5 : 6, 2); /* Lrgn */
- cio_write(cio, compno, numcomps <= 256 ? 1 : 2); /* Crgn */
- cio_write(cio, 0, 1); /* Srgn */
- cio_write(cio, tcp->tccps[compno].roishift, 1); /* SPrgn */
-}
-
-static void j2k_read_rgn(opj_j2k_t *j2k)
-{
- int len, compno, roisty;
-
- opj_cp_t *cp = j2k->cp;
- opj_tcp_t *tcp = j2k->state == J2K_STATE_TPH ? &cp->tcps[j2k->curtileno] :
- j2k->default_tcp;
- opj_cio_t *cio = j2k->cio;
- int numcomps = j2k->image->numcomps;
-
- len = cio_read(cio, 2); /* Lrgn */
- compno = cio_read(cio, numcomps <= 256 ? 1 : 2); /* Crgn */
- roisty = cio_read(cio, 1); /* Srgn */
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
- /* totlen is negative or larger than the bytes left!!! */
- if (compno >= numcomps) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: bad component number in RGN (%d when there are only %d)\n",
- compno, numcomps);
- if (!JPWL_ASSUME || JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return;
- }
- }
- };
-#endif /* USE_JPWL */
-
- if (compno >= numcomps) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "bad component number in RGN (%d out of a maximum of %d)\n",
- compno, j2k->image->numcomps);
- return;
- }
-
- tcp->tccps[compno].roishift = cio_read(cio, 1); /* SPrgn */
-}
-
-static void j2k_write_eoc(opj_j2k_t *j2k)
-{
- opj_cio_t *cio = j2k->cio;
- /* opj_event_msg(j2k->cinfo, "%.8x: EOC\n", cio_tell(cio) + j2k->pos_correction); */
- cio_write(cio, J2K_MS_EOC, 2);
-
- /* UniPG>> */
-#ifdef USE_JPWL
- /* update markers struct */
- j2k_add_marker(j2k->cstr_info, J2K_MS_EOC, cio_tell(cio) - 2, 2);
-#endif /* USE_JPWL */
- /* <<UniPG */
-}
-
-static void j2k_read_eoc(opj_j2k_t *j2k)
-{
- int i, tileno;
- opj_bool success = OPJ_FALSE;
-
- /* if packets should be decoded */
- if (j2k->cp->limit_decoding != DECODE_ALL_BUT_PACKETS) {
- opj_tcd_t *tcd = tcd_create(j2k->cinfo);
- tcd_malloc_decode(tcd, j2k->image, j2k->cp);
- for (i = 0; i < j2k->cp->tileno_size; i++) {
- tcd_malloc_decode_tile(tcd, j2k->image, j2k->cp, i, j2k->cstr_info);
- if (j2k->cp->tileno[i] != -1) {
- tileno = j2k->cp->tileno[i];
- success = tcd_decode_tile(tcd, j2k->tile_data[tileno], j2k->tile_len[tileno],
- tileno, j2k->cstr_info);
- opj_free(j2k->tile_data[tileno]);
- j2k->tile_data[tileno] = NULL;
- tcd_free_decode_tile(tcd, i);
- } else {
- success = OPJ_FALSE;
- }
- if (success == OPJ_FALSE) {
- j2k->state |= J2K_STATE_ERR;
- break;
- }
- }
- tcd_free_decode(tcd);
- tcd_destroy(tcd);
- }
- /* if packets should not be decoded */
- else {
- for (i = 0; i < j2k->cp->tileno_size; i++) {
- tileno = j2k->cp->tileno[i];
- opj_free(j2k->tile_data[tileno]);
- j2k->tile_data[tileno] = NULL;
- }
- }
- if (j2k->state & J2K_STATE_ERR) {
- j2k->state = J2K_STATE_MT + J2K_STATE_ERR;
- } else {
- j2k->state = J2K_STATE_MT;
- }
-}
-
-typedef struct opj_dec_mstabent {
- /** marker value */
- int id;
- /** value of the state when the marker can appear */
- int states;
- /** action linked to the marker */
- void (*handler)(opj_j2k_t *j2k);
-} opj_dec_mstabent_t;
-
-opj_dec_mstabent_t j2k_dec_mstab[] = {
- {J2K_MS_SOC, J2K_STATE_MHSOC, j2k_read_soc},
- {J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, j2k_read_sot},
- {J2K_MS_SOD, J2K_STATE_TPH, j2k_read_sod},
- {J2K_MS_EOC, J2K_STATE_TPHSOT, j2k_read_eoc},
- {J2K_MS_SIZ, J2K_STATE_MHSIZ, j2k_read_siz},
- {J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_cod},
- {J2K_MS_COC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_coc},
- {J2K_MS_RGN, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_rgn},
- {J2K_MS_QCD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcd},
- {J2K_MS_QCC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_qcc},
- {J2K_MS_POC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_poc},
- {J2K_MS_TLM, J2K_STATE_MH, j2k_read_tlm},
- {J2K_MS_PLM, J2K_STATE_MH, j2k_read_plm},
- {J2K_MS_PLT, J2K_STATE_TPH, j2k_read_plt},
- {J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm},
- {J2K_MS_PPT, J2K_STATE_TPH, j2k_read_ppt},
- {J2K_MS_SOP, 0, 0},
- {J2K_MS_CRG, J2K_STATE_MH, j2k_read_crg},
- {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_com},
-
-#ifdef USE_JPWL
- {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc},
- {J2K_MS_EPB, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epb},
- {J2K_MS_ESD, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_esd},
- {J2K_MS_RED, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_red},
-#endif /* USE_JPWL */
-#ifdef USE_JPSEC
- {J2K_MS_SEC, J2K_STATE_MH, j2k_read_sec},
- {J2K_MS_INSEC, 0, j2k_read_insec},
-#endif /* USE_JPSEC */
-
- {0, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_unk}
-};
-
-static void j2k_read_unk(opj_j2k_t *j2k)
-{
- opj_event_msg(j2k->cinfo, EVT_WARNING, "Unknown marker\n");
-
-#ifdef USE_JPWL
- if (j2k->cp->correct) {
- int m = 0, id, i;
- int min_id = 0, min_dist = 17, cur_dist = 0, tmp_id;
- cio_seek(j2k->cio, cio_tell(j2k->cio) - 2);
- id = cio_read(j2k->cio, 2);
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "JPWL: really don't know this marker %x\n",
- id);
- if (!JPWL_ASSUME) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "- possible synch loss due to uncorrectable codestream errors => giving up\n");
- return;
- }
- /* OK, activate this at your own risk!!! */
- /* we look for the marker at the minimum hamming distance from this */
- while (j2k_dec_mstab[m].id) {
-
- /* 1's where they differ */
- tmp_id = j2k_dec_mstab[m].id ^ id;
-
- /* compute the hamming distance between our id and the current */
- cur_dist = 0;
- for (i = 0; i < 16; i++) {
- if ((tmp_id >> i) & 0x0001) {
- cur_dist++;
- }
- }
-
- /* if current distance is smaller, set the minimum */
- if (cur_dist < min_dist) {
- min_dist = cur_dist;
- min_id = j2k_dec_mstab[m].id;
- }
-
- /* jump to the next marker */
- m++;
- }
-
- /* do we substitute the marker? */
- if (min_dist < JPWL_MAXIMUM_HAMMING) {
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "- marker %x is at distance %d from the read %x\n",
- min_id, min_dist, id);
- opj_event_msg(j2k->cinfo, EVT_ERROR,
- "- trying to substitute in place and crossing fingers!\n");
- cio_seek(j2k->cio, cio_tell(j2k->cio) - 2);
- cio_write(j2k->cio, min_id, 2);
-
- /* rewind */
- cio_seek(j2k->cio, cio_tell(j2k->cio) - 2);
-
- }
-
- };
-#endif /* USE_JPWL */
-
-}
-
-/**
-Read the lookup table containing all the marker, status and action
-@param id Marker value
-*/
-static opj_dec_mstabent_t *j2k_dec_mstab_lookup(int id)
-{
- opj_dec_mstabent_t *e;
- for (e = j2k_dec_mstab; e->id != 0; e++) {
- if (e->id == id) {
- break;
- }
- }
- return e;
-}
-
-/* ----------------------------------------------------------------------- */
-/* J2K / JPT decoder interface */
-/* ----------------------------------------------------------------------- */
-
-opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo)
-{
- opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
- if (!j2k) {
- return NULL;
- }
-
- j2k->default_tcp = (opj_tcp_t*) opj_calloc(1, sizeof(opj_tcp_t));
- if (!j2k->default_tcp) {
- opj_free(j2k);
- return NULL;
- }
-
- j2k->cinfo = cinfo;
- j2k->tile_data = NULL;
-
- return j2k;
-}
-
-void j2k_destroy_decompress(opj_j2k_t *j2k)
-{
- int i = 0;
-
- if (j2k->tile_len != NULL) {
- opj_free(j2k->tile_len);
- }
- if (j2k->tile_data != NULL) {
- if (j2k->cp != NULL) {
- for (i = 0; i < j2k->cp->tileno_size; i++) {
- int tileno = j2k->cp->tileno[i];
- opj_free(j2k->tile_data[tileno]);
- j2k->tile_data[tileno] = NULL;
- }
- }
-
- opj_free(j2k->tile_data);
- }
- if (j2k->default_tcp != NULL) {
- opj_tcp_t *default_tcp = j2k->default_tcp;
- if (default_tcp->ppt_data_first != NULL) {
- opj_free(default_tcp->ppt_data_first);
- }
- if (j2k->default_tcp->tccps != NULL) {
- opj_free(j2k->default_tcp->tccps);
- }
- opj_free(j2k->default_tcp);
- }
- if (j2k->cp != NULL) {
- opj_cp_t *cp = j2k->cp;
- if (cp->tcps != NULL) {
- for (i = 0; i < cp->tw * cp->th; i++) {
- if (cp->tcps[i].ppt_data_first != NULL) {
- opj_free(cp->tcps[i].ppt_data_first);
- }
- if (cp->tcps[i].tccps != NULL) {
- opj_free(cp->tcps[i].tccps);
- }
- }
- opj_free(cp->tcps);
- }
- if (cp->ppm_data_first != NULL) {
- opj_free(cp->ppm_data_first);
- }
- if (cp->tileno != NULL) {
- opj_free(cp->tileno);
- }
- if (cp->comment != NULL) {
- opj_free(cp->comment);
- }
-
- opj_free(cp);
- }
- opj_free(j2k);
-}
-
-void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters)
-{
- if (j2k && parameters) {
- /* create and initialize the coding parameters structure */
- opj_cp_t *cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t));
- cp->reduce = parameters->cp_reduce;
- cp->layer = parameters->cp_layer;
- cp->limit_decoding = parameters->cp_limit_decoding;
-
-#ifdef USE_JPWL
- cp->correct = parameters->jpwl_correct;
- cp->exp_comps = parameters->jpwl_exp_comps;
- cp->max_tiles = parameters->jpwl_max_tiles;
-#endif /* USE_JPWL */
-
-
- /* keep a link to cp so that we can destroy it later in j2k_destroy_decompress */
- j2k->cp = cp;
- }
-}
-
-opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio,
- opj_codestream_info_t *cstr_info)
-{
- opj_image_t *image = NULL;
-
- opj_common_ptr cinfo = j2k->cinfo;
-
- j2k->cio = cio;
- j2k->cstr_info = cstr_info;
- if (cstr_info) {
- memset(cstr_info, 0, sizeof(opj_codestream_info_t));
- }
-
- /* create an empty image */
- image = opj_image_create0();
- j2k->image = image;
-
- j2k->state = J2K_STATE_MHSOC;
-
- for (;;) {
- opj_dec_mstabent_t *e;
- int id = cio_read(cio, 2);
-
-#ifdef USE_JPWL
- /* we try to honor JPWL correction power */
- if (j2k->cp->correct) {
-
- int orig_pos = cio_tell(cio);
- opj_bool status;
-
- /* call the corrector */
- status = jpwl_correct(j2k);
-
- /* go back to where you were */
- cio_seek(cio, orig_pos - 2);
-
- /* re-read the marker */
- id = cio_read(cio, 2);
-
- /* check whether it begins with ff */
- if (id >> 8 != 0xff) {
- opj_event_msg(cinfo, EVT_ERROR,
- "JPWL: possible bad marker %x at %d\n",
- id, cio_tell(cio) - 2);
- if (!JPWL_ASSUME) {
- opj_image_destroy(image);
- opj_event_msg(cinfo, EVT_ERROR, "JPWL: giving up\n");
- return 0;
- }
- /* we try to correct */
- id = id | 0xff00;
- cio_seek(cio, cio_tell(cio) - 2);
- cio_write(cio, id, 2);
- opj_event_msg(cinfo, EVT_WARNING, "- trying to adjust this\n"
- "- setting marker to %x\n",
- id);
- }
-
- }
-#endif /* USE_JPWL */
-
- if (id >> 8 != 0xff) {
- if (cio_numbytesleft(cio) != 0) { /* not end of file reached and no EOC */
- opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n",
- cio_tell(cio) - 2, id);
- opj_image_destroy(image);
- return 0;
- }
- opj_event_msg(cinfo, EVT_WARNING, "%.8x: expected a marker instead of %x\n",
- cio_tell(cio) - 2, id);
- j2k->state = J2K_STATE_NEOC;
- break;
- }
- e = j2k_dec_mstab_lookup(id);
- /* Check if the marker is known*/
- if (!(j2k->state & e->states)) {
- opj_image_destroy(image);
- opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n",
- cio_tell(cio) - 2, id);
- return 0;
- }
- /* Check if the decoding is limited to the main header*/
- if (e->id == J2K_MS_SOT && j2k->cp->limit_decoding == LIMIT_TO_MAIN_HEADER) {
- opj_event_msg(cinfo, EVT_INFO, "Main Header decoded.\n");
- return image;
- }
-
- if (e->handler) {
- (*e->handler)(j2k);
- }
- if (j2k->state & J2K_STATE_ERR) {
- opj_image_destroy(image);
- return NULL;
- }
-
- if (j2k->state == J2K_STATE_MT) {
- break;
- }
- if (j2k->state == J2K_STATE_NEOC) {
- break;
- }
- }
- if (j2k->state == J2K_STATE_NEOC) {
- j2k_read_eoc(j2k);
- }
-
- if (j2k->state != J2K_STATE_MT) {
- opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n");
- }
- return image;
-}
-
-/*
-* Read a JPT-stream and decode file
-*
-*/
-opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio,
- opj_codestream_info_t *cstr_info)
-{
- opj_image_t *image = NULL;
- opj_jpt_msg_header_t header;
- int position;
- opj_common_ptr cinfo = j2k->cinfo;
-
- OPJ_ARG_NOT_USED(cstr_info);
-
- j2k->cio = cio;
-
- /* create an empty image */
- image = opj_image_create0();
- j2k->image = image;
-
- j2k->state = J2K_STATE_MHSOC;
-
- /* Initialize the header */
- jpt_init_msg_header(&header);
- /* Read the first header of the message */
- jpt_read_msg_header(cinfo, cio, &header);
-
- position = cio_tell(cio);
- if (header.Class_Id != 6) { /* 6 : Main header data-bin message */
- opj_image_destroy(image);
- opj_event_msg(cinfo, EVT_ERROR,
- "[JPT-stream] : Expecting Main header first [class_Id %d] !\n",
- header.Class_Id);
- return 0;
- }
-
- for (;;) {
- opj_dec_mstabent_t *e = NULL;
- int id;
-
- if (!cio_numbytesleft(cio)) {
- j2k_read_eoc(j2k);
- return image;
- }
- /* data-bin read -> need to read a new header */
- if ((unsigned int)(cio_tell(cio) - position) == header.Msg_length) {
- jpt_read_msg_header(cinfo, cio, &header);
- position = cio_tell(cio);
- if (header.Class_Id != 4) { /* 4 : Tile data-bin message */
- opj_image_destroy(image);
- opj_event_msg(cinfo, EVT_ERROR, "[JPT-stream] : Expecting Tile info !\n");
- return 0;
- }
- }
-
- id = cio_read(cio, 2);
- if (id >> 8 != 0xff) {
- if (cio_numbytesleft(cio) != 0) { /* no end of file reached and no EOC */
- opj_event_msg(cinfo, EVT_ERROR, "%.8x: expected a marker instead of %x\n",
- cio_tell(cio) - 2, id);
- opj_image_destroy(image);
- return 0;
- }
- opj_event_msg(cinfo, EVT_WARNING, "%.8x: expected a marker instead of %x\n",
- cio_tell(cio) - 2, id);
- j2k->state = J2K_STATE_NEOC;
- break;
- }
- e = j2k_dec_mstab_lookup(id);
- if (!(j2k->state & e->states)) {
- opj_image_destroy(image);
- opj_event_msg(cinfo, EVT_ERROR, "%.8x: unexpected marker %x\n",
- cio_tell(cio) - 2, id);
- return 0;
- }
- if (e->handler) {
- (*e->handler)(j2k);
- }
- if (j2k->state == J2K_STATE_MT) {
- break;
- }
- if (j2k->state == J2K_STATE_NEOC) {
- break;
- }
- }
- if (j2k->state == J2K_STATE_NEOC) {
- j2k_read_eoc(j2k);
- }
-
- if (j2k->state != J2K_STATE_MT) {
- opj_event_msg(cinfo, EVT_WARNING, "Incomplete bitstream\n");
- }
-
- return image;
-}
-
-/* ----------------------------------------------------------------------- */
-/* J2K encoder interface */
-/* ----------------------------------------------------------------------- */
-
-opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo)
-{
- opj_j2k_t *j2k = (opj_j2k_t*) opj_calloc(1, sizeof(opj_j2k_t));
- if (j2k) {
- j2k->cinfo = cinfo;
- }
- return j2k;
-}
-
-void j2k_destroy_compress(opj_j2k_t *j2k)
-{
- int tileno;
-
- if (!j2k) {
- return;
- }
- if (j2k->cp != NULL) {
- opj_cp_t *cp = j2k->cp;
-
- if (cp->comment) {
- opj_free(cp->comment);
- }
- if (cp->matrice) {
- opj_free(cp->matrice);
- }
- for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
- opj_free(cp->tcps[tileno].tccps);
- }
- opj_free(cp->tcps);
- opj_free(cp);
- }
-
- opj_free(j2k);
-}
-
-void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters,
- opj_image_t *image)
-{
- int i, j, tileno, numpocs_tile;
- opj_cp_t *cp = NULL;
-
- if (!j2k || !parameters || ! image) {
- return;
- }
-
- /* create and initialize the coding parameters structure */
- cp = (opj_cp_t*) opj_calloc(1, sizeof(opj_cp_t));
-
- /* keep a link to cp so that we can destroy it later in j2k_destroy_compress */
- j2k->cp = cp;
-
- /* set default values for cp */
- cp->tw = 1;
- cp->th = 1;
-
- /*
- copy user encoding parameters
- */
- cp->cinema = parameters->cp_cinema;
- cp->max_comp_size = parameters->max_comp_size;
- cp->rsiz = parameters->cp_rsiz;
- cp->disto_alloc = parameters->cp_disto_alloc;
- cp->fixed_alloc = parameters->cp_fixed_alloc;
- cp->fixed_quality = parameters->cp_fixed_quality;
-
- /* mod fixed_quality */
- if (parameters->cp_matrice) {
- size_t array_size = parameters->tcp_numlayers * parameters->numresolution * 3 *
- sizeof(int);
- cp->matrice = (int *) opj_malloc(array_size);
- memcpy(cp->matrice, parameters->cp_matrice, array_size);
- }
-
- /* tiles */
- cp->tdx = parameters->cp_tdx;
- cp->tdy = parameters->cp_tdy;
-
- /* tile offset */
- cp->tx0 = parameters->cp_tx0;
- cp->ty0 = parameters->cp_ty0;
-
- /* comment string */
- if (parameters->cp_comment) {
- cp->comment = (char*)opj_malloc(strlen(parameters->cp_comment) + 1);
- if (cp->comment) {
- strcpy(cp->comment, parameters->cp_comment);
- }
- }
-
- /*
- calculate other encoding parameters
- */
-
- if (parameters->tile_size_on) {
- cp->tw = int_ceildiv(image->x1 - cp->tx0, cp->tdx);
- cp->th = int_ceildiv(image->y1 - cp->ty0, cp->tdy);
- } else {
- cp->tdx = image->x1 - cp->tx0;
- cp->tdy = image->y1 - cp->ty0;
- }
-
- if (parameters->tp_on) {
- cp->tp_flag = parameters->tp_flag;
- cp->tp_on = 1;
- }
-
- cp->img_size = 0;
- for (i = 0; i < image->numcomps ; i++) {
- cp->img_size += (image->comps[i].w * image->comps[i].h * image->comps[i].prec);
- }
-
-
-#ifdef USE_JPWL
- /*
- calculate JPWL encoding parameters
- */
-
- if (parameters->jpwl_epc_on) {
- int i;
-
- /* set JPWL on */
- cp->epc_on = OPJ_TRUE;
- cp->info_on = OPJ_FALSE; /* no informative technique */
-
- /* set EPB on */
- if ((parameters->jpwl_hprot_MH > 0) || (parameters->jpwl_hprot_TPH[0] > 0)) {
- cp->epb_on = OPJ_TRUE;
-
- cp->hprot_MH = parameters->jpwl_hprot_MH;
- for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
- cp->hprot_TPH_tileno[i] = parameters->jpwl_hprot_TPH_tileno[i];
- cp->hprot_TPH[i] = parameters->jpwl_hprot_TPH[i];
- }
- /* if tile specs are not specified, copy MH specs */
- if (cp->hprot_TPH[0] == -1) {
- cp->hprot_TPH_tileno[0] = 0;
- cp->hprot_TPH[0] = parameters->jpwl_hprot_MH;
- }
- for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
- cp->pprot_tileno[i] = parameters->jpwl_pprot_tileno[i];
- cp->pprot_packno[i] = parameters->jpwl_pprot_packno[i];
- cp->pprot[i] = parameters->jpwl_pprot[i];
- }
- }
-
- /* set ESD writing */
- if ((parameters->jpwl_sens_size == 1) || (parameters->jpwl_sens_size == 2)) {
- cp->esd_on = OPJ_TRUE;
-
- cp->sens_size = parameters->jpwl_sens_size;
- cp->sens_addr = parameters->jpwl_sens_addr;
- cp->sens_range = parameters->jpwl_sens_range;
-
- cp->sens_MH = parameters->jpwl_sens_MH;
- for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
- cp->sens_TPH_tileno[i] = parameters->jpwl_sens_TPH_tileno[i];
- cp->sens_TPH[i] = parameters->jpwl_sens_TPH[i];
- }
- }
-
- /* always set RED writing to false: we are at the encoder */
- cp->red_on = OPJ_FALSE;
-
- } else {
- cp->epc_on = OPJ_FALSE;
- }
-#endif /* USE_JPWL */
-
-
- /* initialize the multiple tiles */
- /* ---------------------------- */
- cp->tcps = (opj_tcp_t*) opj_calloc(cp->tw * cp->th, sizeof(opj_tcp_t));
-
- for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
- opj_tcp_t *tcp = &cp->tcps[tileno];
- tcp->numlayers = parameters->tcp_numlayers;
- for (j = 0; j < tcp->numlayers; j++) {
- if (cp->cinema) {
- if (cp->fixed_quality) {
- tcp->distoratio[j] = parameters->tcp_distoratio[j];
- }
- tcp->rates[j] = parameters->tcp_rates[j];
- } else {
- if (cp->fixed_quality) { /* add fixed_quality */
- tcp->distoratio[j] = parameters->tcp_distoratio[j];
- } else {
- tcp->rates[j] = parameters->tcp_rates[j];
- }
- }
- }
- tcp->csty = parameters->csty;
- tcp->prg = parameters->prog_order;
- tcp->mct = parameters->tcp_mct;
-
- numpocs_tile = 0;
- tcp->POC = 0;
- if (parameters->numpocs) {
- /* initialisation of POC */
- tcp->POC = 1;
- for (i = 0; i < parameters->numpocs; i++) {
- if ((tileno == parameters->POC[i].tile - 1) ||
- (parameters->POC[i].tile == -1)) {
- opj_poc_t *tcp_poc = &tcp->pocs[numpocs_tile];
- tcp_poc->resno0 = parameters->POC[numpocs_tile].resno0;
- tcp_poc->compno0 = parameters->POC[numpocs_tile].compno0;
- tcp_poc->layno1 = parameters->POC[numpocs_tile].layno1;
- tcp_poc->resno1 = parameters->POC[numpocs_tile].resno1;
- tcp_poc->compno1 = parameters->POC[numpocs_tile].compno1;
- tcp_poc->prg1 = parameters->POC[numpocs_tile].prg1;
- tcp_poc->tile = parameters->POC[numpocs_tile].tile;
- numpocs_tile++;
- }
- }
- tcp->numpocs = numpocs_tile - 1 ;
- } else {
- tcp->numpocs = 0;
- }
-
- tcp->tccps = (opj_tccp_t*) opj_calloc(image->numcomps, sizeof(opj_tccp_t));
-
- for (i = 0; i < image->numcomps; i++) {
- opj_tccp_t *tccp = &tcp->tccps[i];
- tccp->csty = parameters->csty &
- 0x01; /* 0 => one precinct || 1 => custom precinct */
- tccp->numresolutions = parameters->numresolution;
- tccp->cblkw = int_floorlog2(parameters->cblockw_init);
- tccp->cblkh = int_floorlog2(parameters->cblockh_init);
- tccp->cblksty = parameters->mode;
- tccp->qmfbid = parameters->irreversible ? 0 : 1;
- tccp->qntsty = parameters->irreversible ? J2K_CCP_QNTSTY_SEQNT :
- J2K_CCP_QNTSTY_NOQNT;
- tccp->numgbits = 2;
- if (i == parameters->roi_compno) {
- tccp->roishift = parameters->roi_shift;
- } else {
- tccp->roishift = 0;
- }
-
- if (parameters->cp_cinema) {
- /*Precinct size for lowest frequency subband=128*/
- tccp->prcw[0] = 7;
- tccp->prch[0] = 7;
- /*Precinct size at all other resolutions = 256*/
- for (j = 1; j < tccp->numresolutions; j++) {
- tccp->prcw[j] = 8;
- tccp->prch[j] = 8;
- }
- } else {
- if (parameters->csty & J2K_CCP_CSTY_PRT) {
- int p = 0;
- for (j = tccp->numresolutions - 1; j >= 0; j--) {
- if (p < parameters->res_spec) {
-
- if (parameters->prcw_init[p] < 1) {
- tccp->prcw[j] = 1;
- } else {
- tccp->prcw[j] = int_floorlog2(parameters->prcw_init[p]);
- }
-
- if (parameters->prch_init[p] < 1) {
- tccp->prch[j] = 1;
- } else {
- tccp->prch[j] = int_floorlog2(parameters->prch_init[p]);
- }
-
- } else {
- int res_spec = parameters->res_spec;
- int size_prcw = parameters->prcw_init[res_spec - 1] >> (p - (res_spec - 1));
- int size_prch = parameters->prch_init[res_spec - 1] >> (p - (res_spec - 1));
-
- if (size_prcw < 1) {
- tccp->prcw[j] = 1;
- } else {
- tccp->prcw[j] = int_floorlog2(size_prcw);
- }
-
- if (size_prch < 1) {
- tccp->prch[j] = 1;
- } else {
- tccp->prch[j] = int_floorlog2(size_prch);
- }
- }
- p++;
- /*printf("\nsize precinct for level %d : %d,%d\n", j,tccp->prcw[j], tccp->prch[j]); */
- } /*end for*/
- } else {
- for (j = 0; j < tccp->numresolutions; j++) {
- tccp->prcw[j] = 15;
- tccp->prch[j] = 15;
- }
- }
- }
-
- dwt_calc_explicit_stepsizes(tccp, image->comps[i].prec);
- }
- }
-}
-
-opj_bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image,
- opj_codestream_info_t *cstr_info)
-{
- int tileno, compno;
- opj_cp_t *cp = NULL;
-
- opj_tcd_t *tcd = NULL; /* TCD component */
-
- j2k->cio = cio;
- j2k->image = image;
-
- cp = j2k->cp;
-
- /* INDEX >> */
- j2k->cstr_info = cstr_info;
- if (cstr_info) {
- int compno;
- cstr_info->tile = (opj_tile_info_t *) opj_malloc(cp->tw * cp->th * sizeof(
- opj_tile_info_t));
- cstr_info->image_w = image->x1 - image->x0;
- cstr_info->image_h = image->y1 - image->y0;
- cstr_info->prog = (&cp->tcps[0])->prg;
- cstr_info->tw = cp->tw;
- cstr_info->th = cp->th;
- cstr_info->tile_x = cp->tdx; /* new version parser */
- cstr_info->tile_y = cp->tdy; /* new version parser */
- cstr_info->tile_Ox = cp->tx0; /* new version parser */
- cstr_info->tile_Oy = cp->ty0; /* new version parser */
- cstr_info->numcomps = image->numcomps;
- cstr_info->numlayers = (&cp->tcps[0])->numlayers;
- cstr_info->numdecompos = (int*) opj_malloc(image->numcomps * sizeof(int));
- for (compno = 0; compno < image->numcomps; compno++) {
- cstr_info->numdecompos[compno] = (&cp->tcps[0])->tccps->numresolutions - 1;
- }
- cstr_info->D_max = 0.0; /* ADD Marcela */
- cstr_info->main_head_start = cio_tell(cio); /* position of SOC */
- cstr_info->maxmarknum = 100;
- cstr_info->marker = (opj_marker_info_t *) opj_malloc(cstr_info->maxmarknum *
- sizeof(opj_marker_info_t));
- cstr_info->marknum = 0;
- }
- /* << INDEX */
-
- j2k_write_soc(j2k);
- j2k_write_siz(j2k);
- j2k_write_cod(j2k);
- j2k_write_qcd(j2k);
-
- if (cp->cinema) {
- for (compno = 1; compno < image->numcomps; compno++) {
- j2k_write_coc(j2k, compno);
- j2k_write_qcc(j2k, compno);
- }
- }
-
- for (compno = 0; compno < image->numcomps; compno++) {
- opj_tcp_t *tcp = &cp->tcps[0];
- if (tcp->tccps[compno].roishift) {
- j2k_write_rgn(j2k, compno, 0);
- }
- }
- if (cp->comment != NULL) {
- j2k_write_com(j2k);
- }
-
- j2k->totnum_tp = j2k_calculate_tp(cp, image->numcomps, image, j2k);
- /* TLM Marker*/
- if (cp->cinema) {
- j2k_write_tlm(j2k);
- if (cp->cinema == CINEMA4K_24) {
- j2k_write_poc(j2k);
- }
- }
-
- /* uncomment only for testing JPSEC marker writing */
- /* j2k_write_sec(j2k); */
-
- /* INDEX >> */
- if (cstr_info) {
- cstr_info->main_head_end = cio_tell(cio) - 1;
- }
- /* << INDEX */
- /**** Main Header ENDS here ***/
-
- /* create the tile encoder */
- tcd = tcd_create(j2k->cinfo);
-
- /* encode each tile */
- for (tileno = 0; tileno < cp->tw * cp->th; tileno++) {
- int pino;
- int tilepartno = 0;
- /* UniPG>> */
- int acc_pack_num = 0;
- /* <<UniPG */
-
-
- opj_tcp_t *tcp = &cp->tcps[tileno];
- opj_event_msg(j2k->cinfo, EVT_INFO, "tile number %d / %d\n", tileno + 1,
- cp->tw * cp->th);
-
- j2k->curtileno = tileno;
- j2k->cur_tp_num = 0;
- tcd->cur_totnum_tp = j2k->cur_totnum_tp[j2k->curtileno];
- /* initialisation before tile encoding */
- if (tileno == 0) {
- tcd_malloc_encode(tcd, image, cp, j2k->curtileno);
- } else {
- tcd_init_encode(tcd, image, cp, j2k->curtileno);
- }
-
- /* INDEX >> */
- if (cstr_info) {
- cstr_info->tile[j2k->curtileno].start_pos = cio_tell(cio) + j2k->pos_correction;
- cstr_info->tile[j2k->curtileno].maxmarknum = 10;
- cstr_info->tile[j2k->curtileno].marker = (opj_marker_info_t *) opj_malloc(
- cstr_info->tile[j2k->curtileno].maxmarknum * sizeof(opj_marker_info_t));
- cstr_info->tile[j2k->curtileno].marknum = 0;
- }
- /* << INDEX */
-
- for (pino = 0; pino <= tcp->numpocs; pino++) {
- int tot_num_tp;
- tcd->cur_pino = pino;
-
- /*Get number of tile parts*/
- tot_num_tp = j2k_get_num_tp(cp, pino, tileno);
- tcd->tp_pos = cp->tp_pos;
-
- for (tilepartno = 0; tilepartno < tot_num_tp ; tilepartno++) {
- j2k->tp_num = tilepartno;
- /* INDEX >> */
- if (cstr_info)
- cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pos =
- cio_tell(cio) + j2k->pos_correction;
- /* << INDEX */
- j2k_write_sot(j2k);
-
- if (j2k->cur_tp_num == 0 && cp->cinema == 0) {
- for (compno = 1; compno < image->numcomps; compno++) {
- j2k_write_coc(j2k, compno);
- j2k_write_qcc(j2k, compno);
- }
- if (cp->tcps[tileno].numpocs) {
- j2k_write_poc(j2k);
- }
- }
-
- /* INDEX >> */
- if (cstr_info)
- cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_header =
- cio_tell(cio) + j2k->pos_correction + 1;
- /* << INDEX */
-
- j2k_write_sod(j2k, tcd);
-
- /* INDEX >> */
- if (cstr_info) {
- cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_end_pos =
- cio_tell(cio) + j2k->pos_correction - 1;
- cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_start_pack =
- acc_pack_num;
- cstr_info->tile[j2k->curtileno].tp[j2k->cur_tp_num].tp_numpacks =
- cstr_info->packno - acc_pack_num;
- acc_pack_num = cstr_info->packno;
- }
- /* << INDEX */
-
- j2k->cur_tp_num++;
- }
- }
- if (cstr_info) {
- cstr_info->tile[j2k->curtileno].end_pos = cio_tell(cio) + j2k->pos_correction -
- 1;
- }
-
-
- /*
- if (tile->PPT) { // BAD PPT !!!
- FILE *PPT_file;
- int i;
- PPT_file=fopen("PPT","rb");
- fprintf(stderr,"%c%c%c%c",255,97,tile->len_ppt/256,tile->len_ppt%256);
- for (i=0;i<tile->len_ppt;i++) {
- unsigned char elmt;
- fread(&elmt, 1, 1, PPT_file);
- fwrite(&elmt,1,1,f);
- }
- fclose(PPT_file);
- unlink("PPT");
- }
- */
-
- }
-
- /* destroy the tile encoder */
- tcd_free_encode(tcd);
- tcd_destroy(tcd);
-
- opj_free(j2k->cur_totnum_tp);
-
- j2k_write_eoc(j2k);
-
- if (cstr_info) {
- cstr_info->codestream_size = cio_tell(cio) + j2k->pos_correction;
- /* UniPG>> */
- /* The following adjustment is done to adjust the codestream size */
- /* if SOD is not at 0 in the buffer. Useful in case of JP2, where */
- /* the first bunch of bytes is not in the codestream */
- cstr_info->codestream_size -= cstr_info->main_head_start;
- /* <<UniPG */
- }
-
-#ifdef USE_JPWL
- /*
- preparation of JPWL marker segments
- */
- if (cp->epc_on) {
-
- /* encode according to JPWL */
- jpwl_encode(j2k, cio, image);
-
- }
-#endif /* USE_JPWL */
-
- return OPJ_TRUE;
-}
-
-static void j2k_add_mhmarker(opj_codestream_info_t *cstr_info,
- unsigned short int type, int pos, int len)
-{
-
- if (!cstr_info) {
- return;
- }
-
- /* expand the list? */
- if ((cstr_info->marknum + 1) > cstr_info->maxmarknum) {
- cstr_info->maxmarknum = 100 + (int)((float) cstr_info->maxmarknum * 1.0F);
- cstr_info->marker = (opj_marker_info_t*)opj_realloc(cstr_info->marker,
- cstr_info->maxmarknum);
- }
-
- /* add the marker */
- cstr_info->marker[cstr_info->marknum].type = type;
- cstr_info->marker[cstr_info->marknum].pos = pos;
- cstr_info->marker[cstr_info->marknum].len = len;
- cstr_info->marknum++;
-
-}
-
-static void j2k_add_tlmarker(int tileno, opj_codestream_info_t *cstr_info,
- unsigned short int type, int pos, int len)
-{
-
- opj_marker_info_t *marker;
-
- if (!cstr_info) {
- return;
- }
-
- /* expand the list? */
- if ((cstr_info->tile[tileno].marknum + 1) >
- cstr_info->tile[tileno].maxmarknum) {
- cstr_info->tile[tileno].maxmarknum = 100 + (int)((float)
- cstr_info->tile[tileno].maxmarknum * 1.0F);
- cstr_info->tile[tileno].marker = (opj_marker_info_t*)opj_realloc(
- cstr_info->tile[tileno].marker, cstr_info->maxmarknum);
- }
-
- marker = &(cstr_info->tile[tileno].marker[cstr_info->tile[tileno].marknum]);
-
- /* add the marker */
- marker->type = type;
- marker->pos = pos;
- marker->len = len;
- cstr_info->tile[tileno].marknum++;
-}
+++ /dev/null
-/*
- * 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.
- */
-#ifndef __J2K_H
-#define __J2K_H
-/**
-@file j2k.h
-@brief The JPEG-2000 Codestream Reader/Writer (J2K)
-
-The functions in J2K.C have for goal to read/write the several parts of the codestream: markers and data.
-*/
-
-/** @defgroup J2K J2K - JPEG-2000 codestream reader/writer */
-/*@{*/
-
-#define J2K_CP_CSTY_PRT 0x01
-#define J2K_CP_CSTY_SOP 0x02
-#define J2K_CP_CSTY_EPH 0x04
-#define J2K_CCP_CSTY_PRT 0x01
-#define J2K_CCP_CBLKSTY_LAZY 0x01 /**< Selective arithmetic coding bypass */
-#define J2K_CCP_CBLKSTY_RESET 0x02 /**< Reset context probabilities on coding pass boundaries */
-#define J2K_CCP_CBLKSTY_TERMALL 0x04 /**< Termination on each coding pass */
-#define J2K_CCP_CBLKSTY_VSC 0x08 /**< Vertically stripe causal context */
-#define J2K_CCP_CBLKSTY_PTERM 0x10 /**< Predictable termination */
-#define J2K_CCP_CBLKSTY_SEGSYM 0x20 /**< Segmentation symbols are used */
-#define J2K_CCP_QNTSTY_NOQNT 0
-#define J2K_CCP_QNTSTY_SIQNT 1
-#define J2K_CCP_QNTSTY_SEQNT 2
-
-/* ----------------------------------------------------------------------- */
-
-#define J2K_MS_SOC 0xff4f /**< SOC marker value */
-#define J2K_MS_SOT 0xff90 /**< SOT marker value */
-#define J2K_MS_SOD 0xff93 /**< SOD marker value */
-#define J2K_MS_EOC 0xffd9 /**< EOC marker value */
-#define J2K_MS_SIZ 0xff51 /**< SIZ marker value */
-#define J2K_MS_COD 0xff52 /**< COD marker value */
-#define J2K_MS_COC 0xff53 /**< COC marker value */
-#define J2K_MS_RGN 0xff5e /**< RGN marker value */
-#define J2K_MS_QCD 0xff5c /**< QCD marker value */
-#define J2K_MS_QCC 0xff5d /**< QCC marker value */
-#define J2K_MS_POC 0xff5f /**< POC marker value */
-#define J2K_MS_TLM 0xff55 /**< TLM marker value */
-#define J2K_MS_PLM 0xff57 /**< PLM marker value */
-#define J2K_MS_PLT 0xff58 /**< PLT marker value */
-#define J2K_MS_PPM 0xff60 /**< PPM marker value */
-#define J2K_MS_PPT 0xff61 /**< PPT marker value */
-#define J2K_MS_SOP 0xff91 /**< SOP marker value */
-#define J2K_MS_EPH 0xff92 /**< EPH marker value */
-#define J2K_MS_CRG 0xff63 /**< CRG marker value */
-#define J2K_MS_COM 0xff64 /**< COM marker value */
-/* UniPG>> */
-#ifdef USE_JPWL
-#define J2K_MS_EPC 0xff68 /**< EPC marker value (Part 11: JPEG 2000 for Wireless) */
-#define J2K_MS_EPB 0xff66 /**< EPB marker value (Part 11: JPEG 2000 for Wireless) */
-#define J2K_MS_ESD 0xff67 /**< ESD marker value (Part 11: JPEG 2000 for Wireless) */
-#define J2K_MS_RED 0xff69 /**< RED marker value (Part 11: JPEG 2000 for Wireless) */
-#endif /* USE_JPWL */
-#ifdef USE_JPSEC
-#define J2K_MS_SEC 0xff65 /**< SEC marker value (Part 8: Secure JPEG 2000) */
-#define J2K_MS_INSEC 0xff94 /**< INSEC marker value (Part 8: Secure JPEG 2000) */
-#endif /* USE_JPSEC */
-/* <<UniPG */
-
-
-/* ----------------------------------------------------------------------- */
-
-/**
-Values that specify the status of the decoding process when decoding the main header.
-These values may be combined with a | operator.
-*/
-typedef enum J2K_STATUS {
- J2K_STATE_MHSOC = 0x0001, /**< a SOC marker is expected */
- J2K_STATE_MHSIZ = 0x0002, /**< a SIZ marker is expected */
- J2K_STATE_MH = 0x0004, /**< the decoding process is in the main header */
- J2K_STATE_TPHSOT = 0x0008, /**< the decoding process is in a tile part header and expects a SOT marker */
- J2K_STATE_TPH = 0x0010, /**< the decoding process is in a tile part header */
- J2K_STATE_MT = 0x0020, /**< the EOC marker has just been read */
- J2K_STATE_NEOC = 0x0040, /**< the decoding process must not expect a EOC marker because the codestream is truncated */
- J2K_STATE_ERR = 0x0080 /**< the decoding process has encountered an error */
-} J2K_STATUS;
-
-/* ----------------------------------------------------------------------- */
-
-/**
-T2 encoding mode
-*/
-typedef enum T2_MODE {
- THRESH_CALC = 0, /** Function called in Rate allocation process*/
- FINAL_PASS = 1 /** Function called in Tier 2 process*/
-} J2K_T2_MODE;
-
-/**
-Quantization stepsize
-*/
-typedef struct opj_stepsize {
- /** exponent */
- int expn;
- /** mantissa */
- int mant;
-} opj_stepsize_t;
-
-/**
-Tile-component coding parameters
-*/
-typedef struct opj_tccp {
- /** coding style */
- int csty;
- /** number of resolutions */
- int numresolutions;
- /** code-blocks width */
- int cblkw;
- /** code-blocks height */
- int cblkh;
- /** code-block coding style */
- int cblksty;
- /** discrete wavelet transform identifier */
- int qmfbid;
- /** quantisation style */
- int qntsty;
- /** stepsizes used for quantization */
- opj_stepsize_t stepsizes[J2K_MAXBANDS];
- /** number of guard bits */
- int numgbits;
- /** Region Of Interest shift */
- int roishift;
- /** precinct width */
- int prcw[J2K_MAXRLVLS];
- /** precinct height */
- int prch[J2K_MAXRLVLS];
-} opj_tccp_t;
-
-/**
-Tile coding parameters :
-this structure is used to store coding/decoding parameters common to all
-tiles (information like COD, COC in main header)
-*/
-typedef struct opj_tcp {
- /** 1 : first part-tile of a tile */
- int first;
- /** coding style */
- int csty;
- /** progression order */
- OPJ_PROG_ORDER prg;
- /** number of layers */
- int numlayers;
- /** multi-component transform identifier */
- int mct;
- /** rates of layers */
- float rates[100];
- /** number of progression order changes */
- int numpocs;
- /** indicates if a POC marker has been used O:NO, 1:YES */
- int POC;
- /** progression order changes */
- opj_poc_t pocs[32];
- /** packet header store there for futur use in t2_decode_packet */
- unsigned char *ppt_data;
- /** pointer remaining on the first byte of the first header if ppt is used */
- unsigned char *ppt_data_first;
- /** If ppt == 1 --> there was a PPT marker for the present tile */
- int ppt;
- /** used in case of multiple marker PPT (number of info already stored) */
- int ppt_store;
- /** ppmbug1 */
- int ppt_len;
- /** add fixed_quality */
- float distoratio[100];
- /** tile-component coding parameters */
- opj_tccp_t *tccps;
-} opj_tcp_t;
-
-/**
-Coding parameters
-*/
-typedef struct opj_cp {
- /** Digital cinema profile*/
- OPJ_CINEMA_MODE cinema;
- /** Maximum rate for each component. If == 0, component size limitation is not considered */
- int max_comp_size;
- /** Size of the image in bits*/
- int img_size;
- /** Rsiz*/
- OPJ_RSIZ_CAPABILITIES rsiz;
- /** Enabling Tile part generation*/
- char tp_on;
- /** Flag determining tile part generation*/
- char tp_flag;
- /** Position of tile part flag in progression order*/
- int tp_pos;
- /** allocation by rate/distortion */
- int disto_alloc;
- /** allocation by fixed layer */
- int fixed_alloc;
- /** add fixed_quality */
- int fixed_quality;
- /** if != 0, then original dimension divided by 2^(reduce); if == 0 or not used, image is decoded to the full resolution */
- int reduce;
- /** if != 0, then only the first "layer" layers are decoded; if == 0 or not used, all the quality layers are decoded */
- int layer;
- /** if == NO_LIMITATION, decode entire codestream; if == LIMIT_TO_MAIN_HEADER then only decode the main header */
- OPJ_LIMIT_DECODING limit_decoding;
- /** XTOsiz */
- int tx0;
- /** YTOsiz */
- int ty0;
- /** XTsiz */
- int tdx;
- /** YTsiz */
- int tdy;
- /** comment for coding */
- char *comment;
- /** number of tiles in width */
- int tw;
- /** number of tiles in height */
- int th;
- /** ID number of the tiles present in the codestream */
- int *tileno;
- /** size of the vector tileno */
- int tileno_size;
- /** packet header store there for futur use in t2_decode_packet */
- unsigned char *ppm_data;
- /** pointer remaining on the first byte of the first header if ppm is used */
- unsigned char *ppm_data_first;
- /** if ppm == 1 --> there was a PPM marker for the present tile */
- int ppm;
- /** use in case of multiple marker PPM (number of info already store) */
- int ppm_store;
- /** use in case of multiple marker PPM (case on non-finished previous info) */
- int ppm_previous;
- /** ppmbug1 */
- int ppm_len;
- /** tile coding parameters */
- opj_tcp_t *tcps;
- /** fixed layer */
- int *matrice;
- /* UniPG>> */
-#ifdef USE_JPWL
- /** enables writing of EPC in MH, thus activating JPWL */
- opj_bool epc_on;
- /** enables writing of EPB, in case of activated JPWL */
- opj_bool epb_on;
- /** enables writing of ESD, in case of activated JPWL */
- opj_bool esd_on;
- /** enables writing of informative techniques of ESD, in case of activated JPWL */
- opj_bool info_on;
- /** enables writing of RED, in case of activated JPWL */
- opj_bool red_on;
- /** error protection method for MH (0,1,16,32,37-128) */
- int hprot_MH;
- /** tile number of header protection specification (>=0) */
- int hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
- /** error protection methods for TPHs (0,1,16,32,37-128) */
- int hprot_TPH[JPWL_MAX_NO_TILESPECS];
- /** tile number of packet protection specification (>=0) */
- int pprot_tileno[JPWL_MAX_NO_PACKSPECS];
- /** packet number of packet protection specification (>=0) */
- int pprot_packno[JPWL_MAX_NO_PACKSPECS];
- /** error protection methods for packets (0,1,16,32,37-128) */
- int pprot[JPWL_MAX_NO_PACKSPECS];
- /** enables writing of ESD, (0/2/4 bytes) */
- int sens_size;
- /** sensitivity addressing size (0=auto/2/4 bytes) */
- int sens_addr;
- /** sensitivity range (0-3) */
- int sens_range;
- /** sensitivity method for MH (-1,0-7) */
- int sens_MH;
- /** tile number of sensitivity specification (>=0) */
- int sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
- /** sensitivity methods for TPHs (-1,0-7) */
- int sens_TPH[JPWL_MAX_NO_TILESPECS];
- /** enables JPWL correction at the decoder */
- opj_bool correct;
- /** expected number of components at the decoder */
- int exp_comps;
- /** maximum number of tiles at the decoder */
- int max_tiles;
-#endif /* USE_JPWL */
- /* <<UniPG */
-} opj_cp_t;
-
-/**
-JPEG-2000 codestream reader/writer
-*/
-typedef struct opj_j2k {
- /** codec context */
- opj_common_ptr cinfo;
-
- /** locate in which part of the codestream the decoder is (main header, tile header, end) */
- int state;
- /** number of the tile currently concern by coding/decoding */
- int curtileno;
- /** Tile part number*/
- int tp_num;
- /** Tilepart number currently coding*/
- int cur_tp_num;
- /** Total number of tileparts of the current tile*/
- int *cur_totnum_tp;
- /**
- locate the start position of the TLM marker
- after encoding the tilepart, a jump (in j2k_write_sod) is done to the TLM marker to store the value of its length.
- */
- int tlm_start;
- /** Total num of tile parts in whole image = num tiles* num tileparts in each tile*/
- /** used in TLMmarker*/
- int totnum_tp;
- /**
- locate the position of the end of the tile in the codestream,
- used to detect a truncated codestream (in j2k_read_sod)
- */
- unsigned char *eot;
- /**
- locate the start position of the SOT marker of the current coded tile:
- after encoding the tile, a jump (in j2k_write_sod) is done to the SOT marker to store the value of its length.
- */
- int sot_start;
- int sod_start;
- /**
- as the J2K-file is written in several parts during encoding,
- it enables to make the right correction in position return by cio_tell
- */
- int pos_correction;
- /** array used to store the data of each tile */
- unsigned char **tile_data;
- /** array used to store the length of each tile */
- int *tile_len;
- /**
- decompression only :
- store decoding parameters common to all tiles (information like COD, COC in main header)
- */
- opj_tcp_t *default_tcp;
- /** pointer to the encoded / decoded image */
- opj_image_t *image;
- /** pointer to the coding parameters */
- opj_cp_t *cp;
- /** helper used to write the index file */
- opj_codestream_info_t *cstr_info;
- /** pointer to the byte i/o stream */
- opj_cio_t *cio;
-} opj_j2k_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Creates a J2K decompression structure
-@param cinfo Codec context info
-@return Returns a handle to a J2K decompressor if successful, returns NULL otherwise
-*/
-opj_j2k_t* j2k_create_decompress(opj_common_ptr cinfo);
-/**
-Destroy a J2K decompressor handle
-@param j2k J2K decompressor handle to destroy
-*/
-void j2k_destroy_decompress(opj_j2k_t *j2k);
-/**
-Setup the decoder decoding parameters using user parameters.
-Decoding parameters are returned in j2k->cp.
-@param j2k J2K decompressor handle
-@param parameters decompression parameters
-*/
-void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);
-/**
-Decode an image from a JPEG-2000 codestream
-@param j2k J2K decompressor handle
-@param cio Input buffer stream
-@param cstr_info Codestream information structure if required, NULL otherwise
-@return Returns a decoded image if successful, returns NULL otherwise
-*/
-opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio,
- opj_codestream_info_t *cstr_info);
-/**
-Decode an image form a JPT-stream (JPEG 2000, JPIP)
-@param j2k J2K decompressor handle
-@param cio Input buffer stream
-@param cstr_info Codestream information structure if required, NULL otherwise
-@return Returns a decoded image if successful, returns NULL otherwise
-*/
-opj_image_t* j2k_decode_jpt_stream(opj_j2k_t *j2k, opj_cio_t *cio,
- opj_codestream_info_t *cstr_info);
-/**
-Creates a J2K compression structure
-@param cinfo Codec context info
-@return Returns a handle to a J2K compressor if successful, returns NULL otherwise
-*/
-opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo);
-/**
-Destroy a J2K compressor handle
-@param j2k J2K compressor handle to destroy
-*/
-void j2k_destroy_compress(opj_j2k_t *j2k);
-/**
-Setup the encoder parameters using the current image and using user parameters.
-Coding parameters are returned in j2k->cp.
-@param j2k J2K compressor handle
-@param parameters compression parameters
-@param image input filled image
-*/
-void j2k_setup_encoder(opj_j2k_t *j2k, opj_cparameters_t *parameters,
- opj_image_t *image);
-/**
-Converts an enum type progression order to string type
-*/
-char *j2k_convert_progression_order(OPJ_PROG_ORDER prg_order);
-/**
-Encode an image into a JPEG-2000 codestream
-@param j2k J2K compressor handle
-@param cio Output buffer stream
-@param image Image to encode
-@param cstr_info Codestream information structure if required, NULL otherwise
-@return Returns true if successful, returns false otherwise
-*/
-opj_bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image,
- opj_codestream_info_t *cstr_info);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __J2K_H */
+++ /dev/null
-/*
- * 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) 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.
- */
-
-#ifdef _WIN32
-#include <windows.h>
-#else
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/times.h>
-#endif /* _WIN32 */
-#include "opj_includes.h"
-
-double OPJ_CALLCONV opj_clock(void)
-{
-#ifdef _WIN32
- /* _WIN32: use QueryPerformance (very accurate) */
- LARGE_INTEGER freq, t ;
- /* freq is the clock speed of the CPU */
- QueryPerformanceFrequency(&freq) ;
- /* cout << "freq = " << ((double) freq.QuadPart) << endl; */
- /* t is the high resolution performance counter (see MSDN) */
- QueryPerformanceCounter(& t) ;
- return (t.QuadPart / (double) freq.QuadPart) ;
-#else
- /* Unix or Linux: use resource usage */
- struct rusage t;
- double procTime;
- /* (1) Get the rusage data structure at this moment (man getrusage) */
- getrusage(0, &t);
- /* (2) What is the elapsed time ? - CPU time = User time + System time */
- /* (2a) Get the seconds */
- procTime = t.ru_utime.tv_sec + t.ru_stime.tv_sec;
- /* (2b) More precisely! Get the microseconds part ! */
- return (procTime + (t.ru_utime.tv_usec + t.ru_stime.tv_usec) * 1e-6) ;
-#endif
-}
-
+++ /dev/null
-/*
- * 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) 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_LIB_H
-#define __J2K_LIB_H
-/**
-@file j2k_lib.h
-@brief Internal functions
-
-The functions in J2K_LIB.C are internal utilities mainly used for timing.
-*/
-
-/** @defgroup MISC MISC - Miscellaneous internal functions */
-/*@{*/
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-
-/**
-Difference in successive opj_clock() calls tells you the elapsed time
-@return Returns time in seconds
-*/
-OPJ_API double OPJ_CALLCONV opj_clock(void);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __J2K_LIB_H */
-
+++ /dev/null
-/*
- * 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) 2010-2011, Kaori Hagihara
- * 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_includes.h"
-
-/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Read box headers
-@param cinfo Codec context info
-@param cio Input stream
-@param box
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio,
- opj_jp2_box_t *box);
-/*static void jp2_write_url(opj_cio_t *cio, char *Idx_file);*/
-/**
-Read the IHDR box - Image Header box
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio);
-static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio);
-static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio);
-static opj_bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio);
-static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio);
-/**
-Write the FTYP box - File type box
-@param jp2 JP2 handle
-@param cio Output buffer stream
-*/
-static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio);
-/**
-Read the FTYP box - File type box
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio);
-static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image,
- opj_codestream_info_t *cstr_info);
-static opj_bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio,
- unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset);
-static void jp2_write_jp(opj_cio_t *cio);
-/**
-Read the JP box - JPEG 2000 signature
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio);
-/**
-Decode the structure of a JP2 file
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@param color Collector for profile, cdef and pclr data
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_color_t *color);
-/**
-Apply collected palette data
-@param color Collector for profile, cdef and pclr data
-@param image
-*/
-static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image,
- opj_common_ptr cinfo);
-/**
-Collect palette data
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@param box
-@param color Collector for profile, cdef and pclr data
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color);
-/**
-Collect component mapping data
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@param box
-@param color Collector for profile, cdef and pclr data
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color);
-/**
-Collect colour specification data
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@param box
-@param color Collector for profile, cdef and pclr data
-@return Returns true if successful, returns false otherwise
-*/
-static opj_bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color);
-/*@}*/
-
-/*@}*/
-
-/* ----------------------------------------------------------------------- */
-
-static opj_bool jp2_read_boxhdr(opj_common_ptr cinfo, opj_cio_t *cio,
- opj_jp2_box_t *box)
-{
- box->init_pos = cio_tell(cio);
- box->length = cio_read(cio, 4);
- box->type = cio_read(cio, 4);
- if (box->length == 1) {
- if (cio_read(cio, 4) != 0) {
- opj_event_msg(cinfo, EVT_ERROR, "Cannot handle box sizes higher than 2^32\n");
- return OPJ_FALSE;
- }
- box->length = cio_read(cio, 4);
- if (box->length == 0) {
- box->length = cio_numbytesleft(cio) + 12;
- }
- } else if (box->length == 0) {
- box->length = cio_numbytesleft(cio) + 8;
- }
- if (box->length < 0) {
- opj_event_msg(cinfo, EVT_ERROR, "Integer overflow in box->length\n");
- return OPJ_FALSE; /* TODO: actually check jp2_read_boxhdr's return value */
- }
-
- return OPJ_TRUE;
-}
-
-#if 0
-static void jp2_write_url(opj_cio_t *cio, char *Idx_file)
-{
- unsigned int i;
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_URL, 4); /* DBTL */
- cio_write(cio, 0, 1); /* VERS */
- cio_write(cio, 0, 3); /* FLAG */
-
- if (Idx_file) {
- for (i = 0; i < strlen(Idx_file); i++) {
- cio_write(cio, Idx_file[i], 1);
- }
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-#endif
-
-static opj_bool jp2_read_ihdr(opj_jp2_t *jp2, opj_cio_t *cio)
-{
- opj_jp2_box_t box;
-
- opj_common_ptr cinfo = jp2->cinfo;
-
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n");
- return OPJ_FALSE;
- }
- if (JP2_IHDR != box.type) {
- opj_event_msg(cinfo, EVT_ERROR, "Expected IHDR Marker\n");
- return OPJ_FALSE;
- }
-
- jp2->h = cio_read(cio, 4); /* HEIGHT */
- jp2->w = cio_read(cio, 4); /* WIDTH */
- jp2->numcomps = cio_read(cio, 2); /* NC */
- jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(
- opj_jp2_comps_t));
-
- jp2->bpc = cio_read(cio, 1); /* BPC */
-
- jp2->C = cio_read(cio, 1); /* C */
- jp2->UnkC = cio_read(cio, 1); /* UnkC */
- jp2->IPR = cio_read(cio, 1); /* IPR */
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cinfo, EVT_ERROR, "Error with IHDR Box\n");
- return OPJ_FALSE;
- }
-
- return OPJ_TRUE;
-}
-
-static void jp2_write_ihdr(opj_jp2_t *jp2, opj_cio_t *cio)
-{
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_IHDR, 4); /* IHDR */
-
- cio_write(cio, jp2->h, 4); /* HEIGHT */
- cio_write(cio, jp2->w, 4); /* WIDTH */
- cio_write(cio, jp2->numcomps, 2); /* NC */
-
- cio_write(cio, jp2->bpc, 1); /* BPC */
-
- cio_write(cio, jp2->C, 1); /* C : Always 7 */
- cio_write(cio, jp2->UnkC, 1); /* UnkC, colorspace unknown */
- cio_write(cio, jp2->IPR, 1); /* IPR, no intellectual property */
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-static void jp2_write_bpcc(opj_jp2_t *jp2, opj_cio_t *cio)
-{
- unsigned int i;
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_BPCC, 4); /* BPCC */
-
- for (i = 0; i < jp2->numcomps; i++) {
- cio_write(cio, jp2->comps[i].bpcc, 1);
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-
-static opj_bool jp2_read_bpcc(opj_jp2_t *jp2, opj_cio_t *cio)
-{
- unsigned int i;
- opj_jp2_box_t box;
-
- opj_common_ptr cinfo = jp2->cinfo;
-
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n");
- return OPJ_FALSE;
- }
- if (JP2_BPCC != box.type) {
- opj_event_msg(cinfo, EVT_ERROR, "Expected BPCC Marker\n");
- return OPJ_FALSE;
- }
-
- for (i = 0; i < jp2->numcomps; i++) {
- jp2->comps[i].bpcc = cio_read(cio, 1);
- }
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cinfo, EVT_ERROR, "Error with BPCC Box\n");
- return OPJ_FALSE;
- }
-
- return OPJ_TRUE;
-}
-
-static void jp2_write_colr(opj_jp2_t *jp2, opj_cio_t *cio)
-{
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_COLR, 4); /* COLR */
-
- cio_write(cio, jp2->meth, 1); /* METH */
- cio_write(cio, jp2->precedence, 1); /* PRECEDENCE */
- cio_write(cio, jp2->approx, 1); /* APPROX */
-
- if (jp2->meth == 2) {
- jp2->enumcs = 0;
- }
-
- cio_write(cio, jp2->enumcs, 4); /* EnumCS */
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-static void jp2_free_pclr(opj_jp2_color_t *color)
-{
- opj_free(color->jp2_pclr->channel_sign);
- opj_free(color->jp2_pclr->channel_size);
- opj_free(color->jp2_pclr->entries);
-
- if (color->jp2_pclr->cmap) {
- opj_free(color->jp2_pclr->cmap);
- }
-
- opj_free(color->jp2_pclr);
- color->jp2_pclr = NULL;
-}
-
-static void free_color_data(opj_jp2_color_t *color)
-{
- if (color->jp2_pclr) {
- jp2_free_pclr(color);
- }
- if (color->jp2_cdef) {
- if (color->jp2_cdef->info) {
- opj_free(color->jp2_cdef->info);
- }
- opj_free(color->jp2_cdef);
- }
- if (color->icc_profile_buf) {
- opj_free(color->icc_profile_buf);
- }
-}
-
-static void jp2_apply_pclr(opj_jp2_color_t *color, opj_image_t *image,
- opj_common_ptr cinfo)
-{
- opj_image_comp_t *old_comps, *new_comps;
- unsigned char *channel_size, *channel_sign;
- unsigned int *entries;
- opj_jp2_cmap_comp_t *cmap;
- int *src, *dst;
- unsigned int j, max;
- unsigned short i, nr_channels, cmp, pcol;
- int k, top_k;
-
- channel_size = color->jp2_pclr->channel_size;
- channel_sign = color->jp2_pclr->channel_sign;
- entries = color->jp2_pclr->entries;
- cmap = color->jp2_pclr->cmap;
- nr_channels = color->jp2_pclr->nr_channels;
-
- old_comps = image->comps;
- new_comps = (opj_image_comp_t*)
- opj_malloc(nr_channels * sizeof(opj_image_comp_t));
-
- for (i = 0; i < nr_channels; ++i) {
- pcol = cmap[i].pcol;
- cmp = cmap[i].cmp;
-
- if (pcol < nr_channels) {
- new_comps[pcol] = old_comps[cmp];
- } else {
- opj_event_msg(cinfo, EVT_ERROR,
- "Error with pcol value %d (max: %d). skipping\n", pcol, nr_channels);
- continue;
- }
-
- if (cmap[i].mtyp == 0) { /* Direct use */
- old_comps[cmp].data = NULL;
- continue;
- }
- /* Palette mapping: */
- new_comps[pcol].data = (int*)
- opj_malloc(sizeof(int) * old_comps[cmp].w * old_comps[cmp].h);
- new_comps[pcol].prec = channel_size[i];
- new_comps[pcol].sgnd = channel_sign[i];
- }
- top_k = color->jp2_pclr->nr_entries - 1;
-
- for (i = 0; i < nr_channels; ++i) {
- /* Direct use: */
- if (cmap[i].mtyp == 0) {
- continue;
- }
-
- /* Palette mapping: */
- cmp = cmap[i].cmp;
- pcol = cmap[i].pcol;
- src = old_comps[cmp].data;
- dst = new_comps[pcol].data;
- max = new_comps[pcol].w * new_comps[pcol].h;
-
- for (j = 0; j < max; ++j) {
- /* The index */
- if ((k = src[j]) < 0) {
- k = 0;
- } else if (k > top_k) {
- k = top_k;
- }
- /* The colour */
- dst[j] = entries[k * nr_channels + pcol];
- }
- }
- max = image->numcomps;
- for (i = 0; i < max; ++i) {
- if (old_comps[i].data) {
- opj_free(old_comps[i].data);
- }
- }
- opj_free(old_comps);
- image->comps = new_comps;
- image->numcomps = nr_channels;
-
- jp2_free_pclr(color);
-
-}/* apply_pclr() */
-
-static opj_bool jp2_read_pclr(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color)
-{
- opj_jp2_pclr_t *jp2_pclr;
- unsigned char *channel_size, *channel_sign;
- unsigned int *entries;
- unsigned short nr_entries, nr_channels;
- unsigned short i, j;
- unsigned char uc;
-
- OPJ_ARG_NOT_USED(box);
- OPJ_ARG_NOT_USED(jp2);
-
- /* Part 1, I.5.3.4: 'There shall be at most one Palette box inside
- * a JP2 Header box' :
- */
- if (color->jp2_pclr) {
- return OPJ_FALSE;
- }
-
- nr_entries = (unsigned short)cio_read(cio, 2); /* NE */
- nr_channels = (unsigned short)cio_read(cio, 1);/* NPC */
-
- entries = (unsigned int*)
- opj_malloc(sizeof(unsigned int) * nr_channels * nr_entries);
- channel_size = (unsigned char*)opj_malloc(nr_channels);
- channel_sign = (unsigned char*)opj_malloc(nr_channels);
-
- jp2_pclr = (opj_jp2_pclr_t*)opj_malloc(sizeof(opj_jp2_pclr_t));
- jp2_pclr->channel_sign = channel_sign;
- jp2_pclr->channel_size = channel_size;
- jp2_pclr->entries = entries;
- jp2_pclr->nr_entries = nr_entries;
- jp2_pclr->nr_channels = nr_channels;
- jp2_pclr->cmap = NULL;
-
- color->jp2_pclr = jp2_pclr;
-
- for (i = 0; i < nr_channels; ++i) {
- uc = cio_read(cio, 1); /* Bi */
- channel_size[i] = (uc & 0x7f) + 1;
- channel_sign[i] = (uc & 0x80) ? 1 : 0;
- }
-
- for (j = 0; j < nr_entries; ++j) {
- for (i = 0; i < nr_channels; ++i) {
- /* Cji */
- *entries++ = cio_read(cio, (channel_size[i] + 7) >> 3);
- }
- }
-
- return OPJ_TRUE;
-}/* jp2_read_pclr() */
-
-static opj_bool jp2_read_cmap(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color)
-{
- opj_jp2_cmap_comp_t *cmap;
- unsigned short i, nr_channels;
-
- OPJ_ARG_NOT_USED(box);
- OPJ_ARG_NOT_USED(jp2);
-
- /* Need nr_channels: */
- if (color->jp2_pclr == NULL) {
- return OPJ_FALSE;
- }
-
- /* Part 1, I.5.3.5: 'There shall be at most one Component Mapping box
- * inside a JP2 Header box' :
- */
- if (color->jp2_pclr->cmap) {
- return OPJ_FALSE;
- }
-
- nr_channels = color->jp2_pclr->nr_channels;
- cmap = (opj_jp2_cmap_comp_t*)
- opj_malloc(nr_channels * sizeof(opj_jp2_cmap_comp_t));
-
- for (i = 0; i < nr_channels; ++i) {
- cmap[i].cmp = (unsigned short)cio_read(cio, 2);
- cmap[i].mtyp = cio_read(cio, 1);
- cmap[i].pcol = cio_read(cio, 1);
-
- }
- color->jp2_pclr->cmap = cmap;
-
- return OPJ_TRUE;
-}/* jp2_read_cmap() */
-
-static void jp2_apply_cdef(opj_image_t *image, opj_jp2_color_t *color)
-{
- opj_jp2_cdef_info_t *info;
- int color_space;
- unsigned short i, n, cn, typ, asoc, acn;
-
- color_space = image->color_space;
- info = color->jp2_cdef->info;
- n = color->jp2_cdef->n;
-
- for (i = 0; i < n; ++i) {
- /* WATCH: acn = asoc - 1 ! */
- if ((asoc = info[i].asoc) == 0) {
- continue;
- }
-
- cn = info[i].cn;
- typ = info[i].typ;
- acn = asoc - 1;
-
- if (cn != acn) {
- opj_image_comp_t saved;
-
- memcpy(&saved, &image->comps[cn], sizeof(opj_image_comp_t));
- memcpy(&image->comps[cn], &image->comps[acn], sizeof(opj_image_comp_t));
- memcpy(&image->comps[acn], &saved, sizeof(opj_image_comp_t));
-
- info[i].asoc = cn + 1;
- info[acn].asoc = info[acn].cn + 1;
- }
- }
- if (color->jp2_cdef->info) {
- opj_free(color->jp2_cdef->info);
- }
-
- opj_free(color->jp2_cdef);
- color->jp2_cdef = NULL;
-
-}/* jp2_apply_cdef() */
-
-static opj_bool jp2_read_cdef(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color)
-{
- opj_jp2_cdef_info_t *info;
- unsigned short i, n;
-
- OPJ_ARG_NOT_USED(box);
- OPJ_ARG_NOT_USED(jp2);
-
- /* Part 1, I.5.3.6: 'The shall be at most one Channel Definition box
- * inside a JP2 Header box.'
- */
- if (color->jp2_cdef) {
- return OPJ_FALSE;
- }
-
- if ((n = (unsigned short)cio_read(cio, 2)) == 0) {
- return OPJ_FALSE; /* szukw000: FIXME */
- }
-
- info = (opj_jp2_cdef_info_t*)
- opj_malloc(n * sizeof(opj_jp2_cdef_info_t));
-
- color->jp2_cdef = (opj_jp2_cdef_t*)opj_malloc(sizeof(opj_jp2_cdef_t));
- color->jp2_cdef->info = info;
- color->jp2_cdef->n = n;
-
- for (i = 0; i < n; ++i) {
- info[i].cn = (unsigned short)cio_read(cio, 2);
- info[i].typ = (unsigned short)cio_read(cio, 2);
- info[i].asoc = (unsigned short)cio_read(cio, 2);
-
- }
- return OPJ_TRUE;
-}/* jp2_read_cdef() */
-
-static opj_bool jp2_read_colr(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_box_t *box, opj_jp2_color_t *color)
-{
- int skip_len;
- opj_common_ptr cinfo;
-
- /* Part 1, I.5.3.3 : 'A conforming JP2 reader shall ignore all Colour
- * Specification boxes after the first.'
- */
- if (color->jp2_has_colr) {
- return OPJ_FALSE;
- }
-
- cinfo = jp2->cinfo;
-
- jp2->meth = cio_read(cio, 1); /* METH */
- jp2->precedence = cio_read(cio, 1); /* PRECEDENCE */
- jp2->approx = cio_read(cio, 1); /* APPROX */
-
- if (jp2->meth == 1) {
- jp2->enumcs = cio_read(cio, 4); /* EnumCS */
- } else if (jp2->meth == 2) {
- /* skip PROFILE */
- skip_len = box->init_pos + box->length - cio_tell(cio);
- if (skip_len < 0) {
- opj_event_msg(cinfo, EVT_ERROR, "Error with COLR box size\n");
- return OPJ_FALSE;
- }
- if (skip_len > 0) {
- unsigned char *start;
-
- start = cio_getbp(cio);
- color->icc_profile_buf = (unsigned char*)opj_malloc(skip_len);
- color->icc_profile_len = skip_len;
-
- cio_skip(cio, box->init_pos + box->length - cio_tell(cio));
-
- memcpy(color->icc_profile_buf, start, skip_len);
- }
- }
-
- if (cio_tell(cio) - box->init_pos != box->length) {
- opj_event_msg(cinfo, EVT_ERROR, "Error with COLR Box\n");
- return OPJ_FALSE;
- }
- color->jp2_has_colr = 1;
-
- return OPJ_TRUE;
-}/* jp2_read_colr() */
-
-opj_bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color)
-{
- opj_jp2_box_t box;
- int jp2h_end;
-
- opj_common_ptr cinfo = jp2->cinfo;
-
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- return OPJ_FALSE;
- }
- do {
- if (JP2_JP2H != box.type) {
- if (box.type == JP2_JP2C) {
- opj_event_msg(cinfo, EVT_ERROR, "Expected JP2H Marker\n");
- return OPJ_FALSE;
- }
- if (box.length <= 8) {
- return OPJ_FALSE;
- }
- cio_skip(cio, box.length - 8);
-
- if (cio->bp >= cio->end) {
- return OPJ_FALSE;
- }
-
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- return OPJ_FALSE;
- }
- }
- } while (JP2_JP2H != box.type);
-
- if (!jp2_read_ihdr(jp2, cio)) {
- return OPJ_FALSE;
- }
- jp2h_end = box.init_pos + box.length;
-
- if (jp2->bpc == 255) {
- if (!jp2_read_bpcc(jp2, cio)) {
- return OPJ_FALSE;
- }
- }
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- return OPJ_FALSE;
- }
-
- while (cio_tell(cio) < jp2h_end) {
- if (box.type == JP2_COLR) {
- if (!jp2_read_colr(jp2, cio, &box, color)) {
- if (box.length <= 8) {
- return OPJ_FALSE;
- }
- cio_seek(cio, box.init_pos + 8);
- cio_skip(cio, box.length - 8);
- }
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- return OPJ_FALSE;
- }
- continue;
- }
- if (box.type == JP2_CDEF && !jp2->ignore_pclr_cmap_cdef) {
- if (!jp2_read_cdef(jp2, cio, &box, color)) {
- if (box.length <= 8) {
- return OPJ_FALSE;
- }
- cio_seek(cio, box.init_pos + 8);
- cio_skip(cio, box.length - 8);
- }
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- return OPJ_FALSE;
- }
- continue;
- }
- if (box.type == JP2_PCLR && !jp2->ignore_pclr_cmap_cdef) {
- if (!jp2_read_pclr(jp2, cio, &box, color)) {
- if (box.length <= 8) {
- return OPJ_FALSE;
- }
- cio_seek(cio, box.init_pos + 8);
- cio_skip(cio, box.length - 8);
- }
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- return OPJ_FALSE;
- }
- continue;
- }
- if (box.type == JP2_CMAP && !jp2->ignore_pclr_cmap_cdef) {
- if (!jp2_read_cmap(jp2, cio, &box, color)) {
- if (box.length <= 8) {
- return OPJ_FALSE;
- }
- cio_seek(cio, box.init_pos + 8);
- cio_skip(cio, box.length - 8);
- }
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- return OPJ_FALSE;
- }
- continue;
- }
- if (box.length <= 8) {
- return OPJ_FALSE;
- }
- cio_seek(cio, box.init_pos + 8);
- cio_skip(cio, box.length - 8);
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- return OPJ_FALSE;
- }
-
- }/* while(cio_tell(cio) < box_end) */
-
- cio_seek(cio, jp2h_end);
-
- /* Part 1, I.5.3.3 : 'must contain at least one' */
- return (color->jp2_has_colr == 1);
-
-}/* jp2_read_jp2h() */
-
-opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_codestream_info_t *cstr_info)
-{
- opj_common_ptr cinfo;
- opj_image_t *image = NULL;
- opj_jp2_color_t color;
-
- if (!jp2 || !cio) {
- return NULL;
- }
- memset(&color, 0, sizeof(opj_jp2_color_t));
- cinfo = jp2->cinfo;
-
- /* JP2 decoding */
- if (!jp2_read_struct(jp2, cio, &color)) {
- free_color_data(&color);
- opj_event_msg(cinfo, EVT_ERROR, "Failed to decode jp2 structure\n");
- return NULL;
- }
-
- /* J2K decoding */
- image = j2k_decode(jp2->j2k, cio, cstr_info);
-
- if (!image) {
- free_color_data(&color);
- opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n");
- return NULL;
- }
-
- if (!jp2->ignore_pclr_cmap_cdef) {
-
- /* Set Image Color Space */
- if (jp2->enumcs == 16) {
- image->color_space = CLRSPC_SRGB;
- } else if (jp2->enumcs == 17) {
- image->color_space = CLRSPC_GRAY;
- } else if (jp2->enumcs == 18) {
- image->color_space = CLRSPC_SYCC;
- } else {
- image->color_space = CLRSPC_UNKNOWN;
- }
-
- if (color.jp2_cdef) {
- jp2_apply_cdef(image, &color);
- }
- if (color.jp2_pclr) {
- /* Part 1, I.5.3.4: Either both or none : */
- if (!color.jp2_pclr->cmap) {
- jp2_free_pclr(&color);
- } else {
- jp2_apply_pclr(&color, image, cinfo);
- }
- }
- if (color.icc_profile_buf) {
- image->icc_profile_buf = color.icc_profile_buf;
- color.icc_profile_buf = NULL;
- image->icc_profile_len = color.icc_profile_len;
- }
- }
-
- return image;
-
-}/* opj_jp2_decode() */
-
-
-void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio)
-{
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_JP2H, 4); /* JP2H */
-
- jp2_write_ihdr(jp2, cio);
-
- if (jp2->bpc == 255) {
- jp2_write_bpcc(jp2, cio);
- }
- jp2_write_colr(jp2, cio);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-static void jp2_write_ftyp(opj_jp2_t *jp2, opj_cio_t *cio)
-{
- unsigned int i;
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_FTYP, 4); /* FTYP */
-
- cio_write(cio, jp2->brand, 4); /* BR */
- cio_write(cio, jp2->minversion, 4); /* MinV */
-
- for (i = 0; i < jp2->numcl; i++) {
- cio_write(cio, jp2->cl[i], 4); /* CL */
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-static opj_bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio)
-{
- int i;
- opj_jp2_box_t box;
-
- opj_common_ptr cinfo = jp2->cinfo;
-
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n");
- return OPJ_FALSE;
- }
- if (JP2_FTYP != box.type) {
- opj_event_msg(cinfo, EVT_ERROR, "Expected FTYP Marker\n");
- return OPJ_FALSE;
- }
-
- jp2->brand = cio_read(cio, 4); /* BR */
- jp2->minversion = cio_read(cio, 4); /* MinV */
- jp2->numcl = (box.length - 16) / 4;
- jp2->cl = (unsigned int *) opj_malloc(jp2->numcl * sizeof(unsigned int));
-
- for (i = 0; i < (int)jp2->numcl; i++) {
- jp2->cl[i] = cio_read(cio, 4); /* CLi */
- }
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cinfo, EVT_ERROR, "Error with FTYP Box\n");
- return OPJ_FALSE;
- }
-
- return OPJ_TRUE;
-}
-
-static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image,
- opj_codestream_info_t *cstr_info)
-{
- unsigned int j2k_codestream_offset, j2k_codestream_length;
- opj_jp2_box_t box;
-
- opj_j2k_t *j2k = jp2->j2k;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_JP2C, 4); /* JP2C */
-
- /* J2K encoding */
- j2k_codestream_offset = cio_tell(cio);
- if (!j2k_encode(j2k, cio, image, cstr_info)) {
- opj_event_msg(j2k->cinfo, EVT_ERROR, "Failed to encode image\n");
- return 0;
- }
- j2k_codestream_length = cio_tell(cio) - j2k_codestream_offset;
-
- jp2->j2k_codestream_offset = j2k_codestream_offset;
- jp2->j2k_codestream_length = j2k_codestream_length;
-
- box.length = 8 + jp2->j2k_codestream_length;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-
- return box.length;
-}
-
-static opj_bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio,
- unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset)
-{
- opj_jp2_box_t box;
-
- opj_common_ptr cinfo = jp2->cinfo;
-
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n");
- return OPJ_FALSE;
- }
- do {
- if (JP2_JP2C != box.type) {
- if (box.length <= 8) {
- return OPJ_FALSE;
- }
- cio_skip(cio, box.length - 8);
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- return OPJ_FALSE;
- }
- }
- } while (JP2_JP2C != box.type);
-
- *j2k_codestream_offset = cio_tell(cio);
- if (box.length <= 8) {
- return OPJ_FALSE;
- }
- *j2k_codestream_length = box.length - 8;
-
- return OPJ_TRUE;
-}
-
-static void jp2_write_jp(opj_cio_t *cio)
-{
- opj_jp2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, JP2_JP, 4); /* JP2 signature */
- cio_write(cio, 0x0d0a870a, 4);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-static opj_bool jp2_read_jp(opj_jp2_t *jp2, opj_cio_t *cio)
-{
- opj_jp2_box_t box;
-
- opj_common_ptr cinfo = jp2->cinfo;
-
- if (jp2_read_boxhdr(cinfo, cio, &box) == OPJ_FALSE) {
- opj_event_msg(cinfo, EVT_ERROR, "Failed to read boxhdr\n");
- return OPJ_FALSE;
- }
- if (JP2_JP != box.type) {
- opj_event_msg(cinfo, EVT_ERROR, "Expected JP Marker\n");
- return OPJ_FALSE;
- }
- if (0x0d0a870a != cio_read(cio, 4)) {
- opj_event_msg(cinfo, EVT_ERROR, "Error with JP Marker\n");
- return OPJ_FALSE;
- }
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cinfo, EVT_ERROR, "Error with JP Box size\n");
- return OPJ_FALSE;
- }
-
- return OPJ_TRUE;
-}
-
-
-static opj_bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_jp2_color_t *color)
-{
- if (!jp2_read_jp(jp2, cio)) {
- return OPJ_FALSE;
- }
- if (!jp2_read_ftyp(jp2, cio)) {
- return OPJ_FALSE;
- }
- if (!jp2_read_jp2h(jp2, cio, color)) {
- return OPJ_FALSE;
- }
- if (!jp2_read_jp2c(jp2, cio, &jp2->j2k_codestream_length,
- &jp2->j2k_codestream_offset)) {
- return OPJ_FALSE;
- }
-
- return OPJ_TRUE;
-}
-
-
-
-
-/* ----------------------------------------------------------------------- */
-/* JP2 decoder interface */
-/* ----------------------------------------------------------------------- */
-
-opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo)
-{
- opj_jp2_t *jp2 = (opj_jp2_t*) opj_calloc(1, sizeof(opj_jp2_t));
- if (jp2) {
- jp2->cinfo = cinfo;
- /* create the J2K codec */
- jp2->j2k = j2k_create_decompress(cinfo);
- if (jp2->j2k == NULL) {
- jp2_destroy_decompress(jp2);
- return NULL;
- }
- }
- return jp2;
-}
-
-void jp2_destroy_decompress(opj_jp2_t *jp2)
-{
- if (jp2) {
- /* destroy the J2K codec */
- j2k_destroy_decompress(jp2->j2k);
-
- if (jp2->comps) {
- opj_free(jp2->comps);
- }
- if (jp2->cl) {
- opj_free(jp2->cl);
- }
- opj_free(jp2);
- }
-}
-
-void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters)
-{
- /* setup the J2K codec */
- j2k_setup_decoder(jp2->j2k, parameters);
- /* further JP2 initializations go here */
- jp2->ignore_pclr_cmap_cdef = parameters->flags &
- OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG;
-}
-
-/* ----------------------------------------------------------------------- */
-/* JP2 encoder interface */
-/* ----------------------------------------------------------------------- */
-
-opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo)
-{
- opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t));
- if (jp2) {
- jp2->cinfo = cinfo;
- /* create the J2K codec */
- jp2->j2k = j2k_create_compress(cinfo);
- if (jp2->j2k == NULL) {
- jp2_destroy_compress(jp2);
- return NULL;
- }
- }
- return jp2;
-}
-
-void jp2_destroy_compress(opj_jp2_t *jp2)
-{
- if (jp2) {
- /* destroy the J2K codec */
- j2k_destroy_compress(jp2->j2k);
-
- if (jp2->comps) {
- opj_free(jp2->comps);
- }
- if (jp2->cl) {
- opj_free(jp2->cl);
- }
- opj_free(jp2);
- }
-}
-
-void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters,
- opj_image_t *image)
-{
- int i;
- int depth_0, sign;
-
- if (!jp2 || !parameters || !image) {
- return;
- }
-
- /* setup the J2K codec */
- /* ------------------- */
-
- /* Check if number of components respects standard */
- if (image->numcomps < 1 || image->numcomps > 16384) {
- opj_event_msg(jp2->cinfo, EVT_ERROR,
- "Invalid number of components specified while setting up JP2 encoder\n");
- return;
- }
-
- j2k_setup_encoder(jp2->j2k, parameters, image);
-
- /* setup the JP2 codec */
- /* ------------------- */
-
- /* Profile box */
-
- jp2->brand = JP2_JP2; /* BR */
- jp2->minversion = 0; /* MinV */
- jp2->numcl = 1;
- jp2->cl = (unsigned int*) opj_malloc(jp2->numcl * sizeof(unsigned int));
- jp2->cl[0] = JP2_JP2; /* CL0 : JP2 */
-
- /* Image Header box */
-
- jp2->numcomps = image->numcomps; /* NC */
- jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(
- opj_jp2_comps_t));
- jp2->h = image->y1 - image->y0; /* HEIGHT */
- jp2->w = image->x1 - image->x0; /* WIDTH */
- /* BPC */
- depth_0 = image->comps[0].prec - 1;
- sign = image->comps[0].sgnd;
- jp2->bpc = depth_0 + (sign << 7);
- for (i = 1; i < image->numcomps; i++) {
- int depth = image->comps[i].prec - 1;
- sign = image->comps[i].sgnd;
- if (depth_0 != depth) {
- jp2->bpc = 255;
- }
- }
- jp2->C = 7; /* C : Always 7 */
- jp2->UnkC = 0; /* UnkC, colorspace specified in colr box */
- jp2->IPR = 0; /* IPR, no intellectual property */
-
- /* BitsPerComponent box */
-
- for (i = 0; i < image->numcomps; i++) {
- jp2->comps[i].bpcc = image->comps[i].prec - 1 + (image->comps[i].sgnd << 7);
- }
- jp2->meth = 1;
- if (image->color_space == 1) {
- jp2->enumcs = 16; /* sRGB as defined by IEC 61966-2.1 */
- } else if (image->color_space == 2) {
- jp2->enumcs = 17; /* greyscale */
- } else if (image->color_space == 3) {
- jp2->enumcs = 18; /* YUV */
- }
- jp2->precedence = 0; /* PRECEDENCE */
- jp2->approx = 0; /* APPROX */
-}
-
-opj_bool opj_jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image,
- opj_codestream_info_t *cstr_info)
-{
-
- int pos_iptr, pos_jp2c, len_jp2c;
- pos_jp2c = pos_iptr = -1; /* remove a warning */
-
- /* JP2 encoding */
-
- /* JPEG 2000 Signature box */
- jp2_write_jp(cio);
- /* File Type box */
- jp2_write_ftyp(jp2, cio);
- /* JP2 Header box */
- jp2_write_jp2h(jp2, cio);
-
- /* J2K encoding */
- if (!(len_jp2c = jp2_write_jp2c(jp2, cio, image, cstr_info))) {
- opj_event_msg(jp2->cinfo, EVT_ERROR, "Failed to encode image\n");
- return OPJ_FALSE;
- }
-
- return OPJ_TRUE;
-}
+++ /dev/null
-/*
- * 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) 2002-2003, Yannick Verschueren
- * 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 __JP2_H
-#define __JP2_H
-/**
-@file jp2.h
-@brief The JPEG-2000 file format Reader/Writer (JP2)
-
-*/
-
-/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
-/*@{*/
-
-#define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */
-#define JP2_FTYP 0x66747970 /**< File type box */
-#define JP2_JP2H 0x6a703268 /**< JP2 header box */
-#define JP2_IHDR 0x69686472 /**< Image header box */
-#define JP2_COLR 0x636f6c72 /**< Colour specification box */
-#define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */
-#define JP2_URL 0x75726c20 /**< URL box */
-#define JP2_DTBL 0x6474626c /**< Data Reference box */
-#define JP2_BPCC 0x62706363 /**< Bits per component box */
-#define JP2_JP2 0x6a703220 /**< File type fields */
-#define JP2_PCLR 0x70636c72 /**< Palette box */
-#define JP2_CMAP 0x636d6170 /**< Component Mapping box */
-#define JP2_CDEF 0x63646566 /**< Channel Definition box */
-
-/* ----------------------------------------------------------------------- */
-/**
-Channel description: channel index, type, association
-*/
-typedef struct opj_jp2_cdef_info {
- unsigned short cn, typ, asoc;
-} opj_jp2_cdef_info_t;
-
-/**
-Channel descriptions and number of descriptions
-*/
-typedef struct opj_jp2_cdef {
- opj_jp2_cdef_info_t *info;
- unsigned short n;
-} opj_jp2_cdef_t;
-
-/**
-Component mappings: channel index, mapping type, palette index
-*/
-typedef struct opj_jp2_cmap_comp {
- unsigned short cmp;
- unsigned char mtyp, pcol;
-} opj_jp2_cmap_comp_t;
-
-/**
-Palette data: table entries, palette columns
-*/
-typedef struct opj_jp2_pclr {
- unsigned int *entries;
- unsigned char *channel_sign;
- unsigned char *channel_size;
- opj_jp2_cmap_comp_t *cmap;
- unsigned short nr_entries, nr_channels;
-} opj_jp2_pclr_t;
-
-/**
-Collector for ICC profile, palette, component mapping, channel description
-*/
-typedef struct opj_jp2_color {
- unsigned char *icc_profile_buf;
- int icc_profile_len;
-
- opj_jp2_cdef_t *jp2_cdef;
- opj_jp2_pclr_t *jp2_pclr;
- unsigned char jp2_has_colr;
-} opj_jp2_color_t;
-
-/**
-JP2 component
-*/
-typedef struct opj_jp2_comps {
- int depth;
- int sgnd;
- int bpcc;
-} opj_jp2_comps_t;
-
-/**
-JPEG-2000 file format reader/writer
-*/
-typedef struct opj_jp2 {
- /** codec context */
- opj_common_ptr cinfo;
- /** handle to the J2K codec */
- opj_j2k_t *j2k;
- unsigned int w;
- unsigned int h;
- unsigned int numcomps;
- unsigned int bpc;
- unsigned int C;
- unsigned int UnkC;
- unsigned int IPR;
- unsigned int meth;
- unsigned int approx;
- unsigned int enumcs;
- unsigned int precedence;
- unsigned int brand;
- unsigned int minversion;
- unsigned int numcl;
- unsigned int *cl;
- opj_jp2_comps_t *comps;
- unsigned int j2k_codestream_offset;
- unsigned int j2k_codestream_length;
- opj_bool ignore_pclr_cmap_cdef;
-} opj_jp2_t;
-
-/**
-JP2 Box
-*/
-typedef struct opj_jp2_box {
- int length;
- int type;
- int init_pos;
-} opj_jp2_box_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Write the JP2H box - JP2 Header box (used in MJ2)
-@param jp2 JP2 handle
-@param cio Output buffer stream
-*/
-void jp2_write_jp2h(opj_jp2_t *jp2, opj_cio_t *cio);
-/**
-Read the JP2H box - JP2 Header box (used in MJ2)
-@param jp2 JP2 handle
-@param cio Input buffer stream
-@param ext Collector for profile, cdef and pclr data
-@return Returns true if successful, returns false otherwise
-*/
-opj_bool jp2_read_jp2h(opj_jp2_t *jp2, opj_cio_t *cio, opj_jp2_color_t *color);
-/**
-Creates a JP2 decompression structure
-@param cinfo Codec context info
-@return Returns a handle to a JP2 decompressor if successful, returns NULL otherwise
-*/
-opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo);
-/**
-Destroy a JP2 decompressor handle
-@param jp2 JP2 decompressor handle to destroy
-*/
-void jp2_destroy_decompress(opj_jp2_t *jp2);
-/**
-Setup the decoder decoding parameters using user parameters.
-Decoding parameters are returned in jp2->j2k->cp.
-@param jp2 JP2 decompressor handle
-@param parameters decompression parameters
-*/
-void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);
-/**
-Decode an image from a JPEG-2000 file stream
-@param jp2 JP2 decompressor handle
-@param cio Input buffer stream
-@param cstr_info Codestream information structure if required, NULL otherwise
-@return Returns a decoded image if successful, returns NULL otherwise
-*/
-opj_image_t* opj_jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio,
- opj_codestream_info_t *cstr_info);
-/**
-Creates a JP2 compression structure
-@param cinfo Codec context info
-@return Returns a handle to a JP2 compressor if successful, returns NULL otherwise
-*/
-opj_jp2_t* jp2_create_compress(opj_common_ptr cinfo);
-/**
-Destroy a JP2 compressor handle
-@param jp2 JP2 compressor handle to destroy
-*/
-void jp2_destroy_compress(opj_jp2_t *jp2);
-/**
-Setup the encoder parameters using the current image and using user parameters.
-Coding parameters are returned in jp2->j2k->cp.
-@param jp2 JP2 compressor handle
-@param parameters compression parameters
-@param image input filled image
-*/
-void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters,
- opj_image_t *image);
-/**
-Encode an image into a JPEG-2000 file stream
-@param jp2 JP2 compressor handle
-@param cio Output buffer stream
-@param image Image to encode
-@param cstr_info Codestream information structure if required, NULL otherwise
-@return Returns true if successful, returns false otherwise
-*/
-opj_bool opj_jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image,
- opj_codestream_info_t *cstr_info);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __JP2_H */
-
+++ /dev/null
-/*
- * 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) 2002-2003, Yannick Verschueren
- * 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.
- */
-
-#include "opj_includes.h"
-
-/*
- * Read the information contains in VBAS [JPP/JPT stream message header]
- * Store information (7 bits) in value
- *
- */
-static unsigned int jpt_read_VBAS_info(opj_cio_t *cio, unsigned int value)
-{
- unsigned char elmt;
-
- elmt = cio_read(cio, 1);
- while ((elmt >> 7) == 1) {
- value = (value << 7);
- value |= (elmt & 0x7f);
- elmt = cio_read(cio, 1);
- }
- value = (value << 7);
- value |= (elmt & 0x7f);
-
- return value;
-}
-
-/*
- * Initialize the value of the message header structure
- *
- */
-void jpt_init_msg_header(opj_jpt_msg_header_t * header)
-{
- header->Id = 0; /* In-class Identifier */
- header->last_byte = 0; /* Last byte information */
- header->Class_Id = 0; /* Class Identifier */
- header->CSn_Id = 0; /* CSn : index identifier */
- header->Msg_offset = 0; /* Message offset */
- header->Msg_length = 0; /* Message length */
- header->Layer_nb = 0; /* Auxiliary for JPP case */
-}
-
-/*
- * Re-initialize the value of the message header structure
- *
- * Only parameters always present in message header
- *
- */
-static void jpt_reinit_msg_header(opj_jpt_msg_header_t * header)
-{
- header->Id = 0; /* In-class Identifier */
- header->last_byte = 0; /* Last byte information */
- header->Msg_offset = 0; /* Message offset */
- header->Msg_length = 0; /* Message length */
-}
-
-/*
- * Read the message header for a JPP/JPT - stream
- *
- */
-void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio,
- opj_jpt_msg_header_t *header)
-{
- unsigned char elmt, Class = 0, CSn = 0;
- jpt_reinit_msg_header(header);
-
- /* ------------- */
- /* VBAS : Bin-ID */
- /* ------------- */
- elmt = cio_read(cio, 1);
-
- /* See for Class and CSn */
- switch ((elmt >> 5) & 0x03) {
- case 0:
- opj_event_msg(cinfo, EVT_ERROR,
- "Forbidden value encounter in message header !!\n");
- break;
- case 1:
- Class = 0;
- CSn = 0;
- break;
- case 2:
- Class = 1;
- CSn = 0;
- break;
- case 3:
- Class = 1;
- CSn = 1;
- break;
- default:
- break;
- }
-
- /* see information on bits 'c' [p 10 : A.2.1 general, ISO/IEC FCD 15444-9] */
- if (((elmt >> 4) & 0x01) == 1) {
- header->last_byte = 1;
- }
-
- /* In-class identifier */
- header->Id |= (elmt & 0x0f);
- if ((elmt >> 7) == 1) {
- header->Id = jpt_read_VBAS_info(cio, header->Id);
- }
-
- /* ------------ */
- /* VBAS : Class */
- /* ------------ */
- if (Class == 1) {
- header->Class_Id = 0;
- header->Class_Id = jpt_read_VBAS_info(cio, header->Class_Id);
- }
-
- /* ---------- */
- /* VBAS : CSn */
- /* ---------- */
- if (CSn == 1) {
- header->CSn_Id = 0;
- header->CSn_Id = jpt_read_VBAS_info(cio, header->CSn_Id);
- }
-
- /* ----------------- */
- /* VBAS : Msg_offset */
- /* ----------------- */
- header->Msg_offset = jpt_read_VBAS_info(cio, header->Msg_offset);
-
- /* ----------------- */
- /* VBAS : Msg_length */
- /* ----------------- */
- header->Msg_length = jpt_read_VBAS_info(cio, header->Msg_length);
-
- /* ---------- */
- /* VBAS : Aux */
- /* ---------- */
- if ((header->Class_Id & 0x01) == 1) {
- header->Layer_nb = 0;
- header->Layer_nb = jpt_read_VBAS_info(cio, header->Layer_nb);
- }
-}
+++ /dev/null
-/*
- * 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) 2002-2003, Yannick Verschueren
- * 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 __JPT_H
-#define __JPT_H
-/**
-@file jpt.h
-@brief JPT-stream reader (JPEG 2000, JPIP)
-
-JPT-stream functions are implemented in J2K.C.
-*/
-
-/**
-Message Header JPT stream structure
-*/
-typedef struct opj_jpt_msg_header {
- /** In-class Identifier */
- unsigned int Id;
- /** Last byte information */
- unsigned int last_byte;
- /** Class Identifier */
- unsigned int Class_Id;
- /** CSn : index identifier */
- unsigned int CSn_Id;
- /** Message offset */
- unsigned int Msg_offset;
- /** Message length */
- unsigned int Msg_length;
- /** Auxiliary for JPP case */
- unsigned int Layer_nb;
-} opj_jpt_msg_header_t;
-
-/* ----------------------------------------------------------------------- */
-
-/**
-Initialize the value of the message header structure
-@param header Message header structure
-*/
-void jpt_init_msg_header(opj_jpt_msg_header_t * header);
-
-/**
-Read the message header for a JPP/JPT - stream
-@param cinfo Codec context info
-@param cio CIO handle
-@param header Message header structure
-*/
-void jpt_read_msg_header(opj_common_ptr cinfo, opj_cio_t *cio,
- opj_jpt_msg_header_t *header);
-
-#endif
+++ /dev/null
-/*
- * 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.
- */
-
-#ifdef __SSE__
-#include <xmmintrin.h>
-#endif
-
-#include "opj_includes.h"
-
-/* <summary> */
-/* This table contains the norms of the basis function of the reversible MCT. */
-/* </summary> */
-static const double mct_norms[3] = { 1.732, .8292, .8292 };
-
-/* <summary> */
-/* This table contains the norms of the basis function of the irreversible MCT. */
-/* </summary> */
-static const double mct_norms_real[3] = { 1.732, 1.805, 1.573 };
-
-/* <summary> */
-/* Forward reversible MCT. */
-/* </summary> */
-void mct_encode(
- int* restrict c0,
- int* restrict c1,
- int* restrict c2,
- int n)
-{
- int i;
- for (i = 0; i < n; ++i) {
- int r = c0[i];
- int g = c1[i];
- int b = c2[i];
- int y = (r + (g * 2) + b) >> 2;
- int u = b - g;
- int v = r - g;
- c0[i] = y;
- c1[i] = u;
- c2[i] = v;
- }
-}
-
-/* <summary> */
-/* Inverse reversible MCT. */
-/* </summary> */
-void mct_decode(
- int* restrict c0,
- int* restrict c1,
- int* restrict c2,
- int n)
-{
- int i;
- for (i = 0; i < n; ++i) {
- int y = c0[i];
- int u = c1[i];
- int v = c2[i];
- int g = y - ((u + v) >> 2);
- int r = v + g;
- int b = u + g;
- c0[i] = r;
- c1[i] = g;
- c2[i] = b;
- }
-}
-
-/* <summary> */
-/* Get norm of basis function of reversible MCT. */
-/* </summary> */
-double mct_getnorm(int compno)
-{
- return mct_norms[compno];
-}
-
-/* <summary> */
-/* Forward irreversible MCT. */
-/* </summary> */
-void mct_encode_real(
- int* restrict c0,
- int* restrict c1,
- int* restrict c2,
- int n)
-{
- int i;
- for (i = 0; i < n; ++i) {
- int r = c0[i];
- int g = c1[i];
- int b = c2[i];
- int y = fix_mul(r, 2449) + fix_mul(g, 4809) + fix_mul(b, 934);
- int u = -fix_mul(r, 1382) - fix_mul(g, 2714) + fix_mul(b, 4096);
- int v = fix_mul(r, 4096) - fix_mul(g, 3430) - fix_mul(b, 666);
- c0[i] = y;
- c1[i] = u;
- c2[i] = v;
- }
-}
-
-/* <summary> */
-/* Inverse irreversible MCT. */
-/* </summary> */
-void mct_decode_real(
- float* restrict c0,
- float* restrict c1,
- float* restrict c2,
- int n)
-{
- int i;
-#ifdef __SSE__
- __m128 vrv, vgu, vgv, vbu;
- vrv = _mm_set1_ps(1.402f);
- vgu = _mm_set1_ps(0.34413f);
- vgv = _mm_set1_ps(0.71414f);
- vbu = _mm_set1_ps(1.772f);
- for (i = 0; i < (n >> 3); ++i) {
- __m128 vy, vu, vv;
- __m128 vr, vg, vb;
-
- vy = _mm_load_ps(c0);
- vu = _mm_load_ps(c1);
- vv = _mm_load_ps(c2);
- vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
- vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
- vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
- _mm_store_ps(c0, vr);
- _mm_store_ps(c1, vg);
- _mm_store_ps(c2, vb);
- c0 += 4;
- c1 += 4;
- c2 += 4;
-
- vy = _mm_load_ps(c0);
- vu = _mm_load_ps(c1);
- vv = _mm_load_ps(c2);
- vr = _mm_add_ps(vy, _mm_mul_ps(vv, vrv));
- vg = _mm_sub_ps(_mm_sub_ps(vy, _mm_mul_ps(vu, vgu)), _mm_mul_ps(vv, vgv));
- vb = _mm_add_ps(vy, _mm_mul_ps(vu, vbu));
- _mm_store_ps(c0, vr);
- _mm_store_ps(c1, vg);
- _mm_store_ps(c2, vb);
- c0 += 4;
- c1 += 4;
- c2 += 4;
- }
- n &= 7;
-#endif
- for (i = 0; i < n; ++i) {
- float y = c0[i];
- float u = c1[i];
- float v = c2[i];
- float r = y + (v * 1.402f);
- float g = y - (u * 0.34413f) - (v * (0.71414f));
- float b = y + (u * 1.772f);
- c0[i] = r;
- c1[i] = g;
- c2[i] = b;
- }
-}
-
-/* <summary> */
-/* Get norm of basis function of irreversible MCT. */
-/* </summary> */
-double mct_getnorm_real(int compno)
-{
- return mct_norms_real[compno];
-}
+++ /dev/null
-/*
- * 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 __MCT_H
-#define __MCT_H
-/**
-@file mct.h
-@brief Implementation of a multi-component transforms (MCT)
-
-The functions in MCT.C have for goal to realize reversible and irreversible multicomponent
-transform. The functions in MCT.C are used by some function in TCD.C.
-*/
-
-/** @defgroup MCT MCT - Implementation of a multi-component transform */
-/*@{*/
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Apply a reversible multi-component transform to an image
-@param c0 Samples for red component
-@param c1 Samples for green component
-@param c2 Samples blue component
-@param n Number of samples for each component
-*/
-void mct_encode(int *c0, int *c1, int *c2, int n);
-/**
-Apply a reversible multi-component inverse transform to an image
-@param c0 Samples for luminance component
-@param c1 Samples for red chrominance component
-@param c2 Samples for blue chrominance component
-@param n Number of samples for each component
-*/
-void mct_decode(int *c0, int *c1, int *c2, int n);
-/**
-Get norm of the basis function used for the reversible multi-component transform
-@param compno Number of the component (0->Y, 1->U, 2->V)
-@return
-*/
-double mct_getnorm(int compno);
-
-/**
-Apply an irreversible multi-component transform to an image
-@param c0 Samples for red component
-@param c1 Samples for green component
-@param c2 Samples blue component
-@param n Number of samples for each component
-*/
-void mct_encode_real(int *c0, int *c1, int *c2, int n);
-/**
-Apply an irreversible multi-component inverse transform to an image
-@param c0 Samples for luminance component
-@param c1 Samples for red chrominance component
-@param c2 Samples for blue chrominance component
-@param n Number of samples for each component
-*/
-void mct_decode_real(float* c0, float* c1, float* c2, int n);
-/**
-Get norm of the basis function used for the irreversible multi-component transform
-@param compno Number of the component (0->Y, 1->U, 2->V)
-@return
-*/
-double mct_getnorm_real(int compno);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __MCT_H */
+++ /dev/null
-/*
- * 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 "opj_includes.h"
-#include "mj2.h"
-
-/** @defgroup JP2 JP2 - JPEG-2000 file format reader/writer */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-/*
-*
-* Read box headers
-*
-*/
-
-int mj2_read_boxhdr(mj2_box_t * box, opj_cio_t *cio)
-{
- box->init_pos = cio_tell(cio);
- box->length = cio_read(cio, 4);
- box->type = cio_read(cio, 4);
- if (box->length == 1) {
- if (cio_read(cio, 4) != 0) {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Cannot handle box sizes higher than 2^32\n");
- return 1;
- };
- box->length = cio_read(cio, 4);
- if (box->length == 0) {
- box->length = cio_numbytesleft(cio) + 12;
- }
- } else if (box->length == 0) {
- box->length = cio_numbytesleft(cio) + 8;
- }
- return 0;
-}
-
-/*
-*
-* Initialisation of a Standard Movie, given a simple movie structure defined by the user
-* The movie will have one sample per chunk
-*
-* Arguments: opj_mj2_t * movie
-* Several variables of "movie" must be defined in order to enable a correct execution of
-* this function:
-* - The number of tracks of each type (movie->num_vtk, movie->num_stk, movie->num_htk)
-* - The memory for each must be allocated (movie->tk)
-* - For each track:
-* The track type (tk->track_type)
-* The number of sample (tk->num_samples)
-* The sample rate (tk->sample_rate)
-*
-*/
-
-int OPJ_CALLCONV mj2_init_stdmovie(opj_mj2_t * movie)
-{
- mj2_tk_t *tk0;
- int i, w, h, prec;
- unsigned int j;
- time_t ltime;
-
- movie->brand = MJ2_MJ2;
- movie->minversion = 0;
- movie->num_cl = 2;
- movie->cl = (unsigned int*) opj_malloc(movie->num_cl * sizeof(unsigned int));
-
- movie->cl[0] = MJ2_MJ2;
- movie->cl[1] = MJ2_MJ2S;
- time(<ime); /* Time since 1/1/70 */
- movie->creation_time = (unsigned int) ltime +
- 2082844800; /* Seconds between 1/1/04 and 1/1/70 */
- movie->timescale = 1000;
-
- movie->rate = 1 <<
- 16; /* Rate to play presentation (default = 0x00010000) */
- movie->volume = 1 <<
- 8; /* Movie volume (default = 0x0100) */
- movie->trans_matrix[0] =
- 0x00010000; /* Transformation matrix for video */
- movie->trans_matrix[1] =
- 0; /* Unity is { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 } */
- movie->trans_matrix[2] = 0;
- movie->trans_matrix[3] = 0;
- movie->trans_matrix[4] = 0x00010000;
- movie->trans_matrix[5] = 0;
- movie->trans_matrix[6] = 0;
- movie->trans_matrix[7] = 0;
- movie->trans_matrix[8] = 0x40000000;
- movie->next_tk_id = 1;
-
- tk0 = &movie->tk[0];
- w = tk0->w;
- h = tk0->h;
- prec = tk0->depth;
-
- for (i = 0; i < movie->num_htk + movie->num_stk + movie->num_vtk; i++) {
- mj2_tk_t *tk = &movie->tk[i];
-
- movie->next_tk_id++;
- tk->jp2_struct.comps = NULL;
- tk->jp2_struct.cl = NULL;
-
- if (tk->track_type == 0) { /* no sound or hint track */
- if (tk->num_samples == 0) {
- return 1;
- }
-
- tk->w = w;
- tk->h = h;
- tk->depth = prec;
- tk->Dim[0] = 0;
- tk->Dim[1] = 0;
-
- tk->timescale =
- 1000; /* Timescale = 1 ms */
-
- tk->chunk[0].num_samples = 1;
- tk->chunk[0].sample_descr_idx = 1;
-
- tk->same_sample_size = 0;
-
- tk->num_samplestochunk = 1; /* One sample per chunk */
- tk->sampletochunk = (mj2_sampletochunk_t*) opj_malloc(tk->num_samplestochunk *
- sizeof(mj2_sampletochunk_t));
- tk->sampletochunk[0].first_chunk = 1;
- tk->sampletochunk[0].samples_per_chunk = 1;
- tk->sampletochunk[0].sample_descr_idx = 1;
-
- if (tk->sample_rate == 0) {
- opj_event_msg(tk->cinfo, EVT_ERROR,
- "Error while initializing MJ2 movie: Sample rate of track"
- " %d must be different from zero\n", tk->track_ID);
- return 1;
- }
-
- for (j = 0; j < tk->num_samples; j++) {
- tk->sample[j].sample_delta = tk->timescale / tk->sample_rate;
- }
-
- tk->num_tts = 1;
- tk->tts = (mj2_tts_t*) opj_malloc(tk->num_tts * sizeof(mj2_tts_t));
- tk->tts[0].sample_count = tk->num_samples;
- tk->tts[0].sample_delta = tk->timescale / tk->sample_rate;
-
- tk->horizresolution =
- 0x00480000; /* Horizontal resolution (typically 72) */
- tk->vertresolution =
- 0x00480000; /* Vertical resolution (typically 72) */
- tk->compressorname[0] =
- 0x0f4d6f74; /* Compressor Name[]: Motion JPEG2000 */
- tk->compressorname[1] = 0x696f6e20;
- tk->compressorname[2] = 0x4a504547;
- tk->compressorname[3] = 0x32303030;
- tk->compressorname[4] = 0x00120000;
- tk->compressorname[5] = 0;
- tk->compressorname[6] = 0x00000042;
- tk->compressorname[7] = 0x000000DC;
- tk->num_url =
- 0; /* Number of URL */
- tk->num_urn =
- 0; /* Number of URN */
- tk->graphicsmode =
- 0; /* Graphicsmode */
- tk->opcolor[0] =
- 0; /* OpColor */
- tk->opcolor[1] =
- 0; /* OpColor */
- tk->opcolor[2] =
- 0; /* OpColor */
- tk->creation_time =
- movie->creation_time; /* Seconds between 1/1/04 and 1/1/70 */
- tk->language = 0; /* Language (undefined) */
- tk->layer = 0;
- tk->volume = 1 << 8; /* Movie volume (default = 0x0100) */
- tk->trans_matrix[0] = 0x00010000; /* Transformation matrix for track */
- tk->trans_matrix[1] =
- 0; /* Unity is { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 } */
- tk->trans_matrix[2] = 0;
- tk->trans_matrix[3] = 0;
- tk->trans_matrix[4] = 0x00010000;
- tk->trans_matrix[5] = 0;
- tk->trans_matrix[6] = 0;
- tk->trans_matrix[7] = 0;
- tk->trans_matrix[8] = 0x40000000;
- tk->fieldcount = 1;
- tk->fieldorder = 0;
- tk->or_fieldcount = 1;
- tk->or_fieldorder = 0;
- tk->num_br = 2;
- tk->br = (unsigned int*) opj_malloc(tk->num_br * sizeof(unsigned int));
- tk->br[0] = MJ2_JP2;
- tk->br[1] = MJ2_J2P0;
- tk->num_jp2x = 0;
- tk->hsub =
- 2; /* 4:2:0 */
- tk->vsub =
- 2; /* 4:2:0 */
- tk->hoff = 0;
- tk->voff = 0;
- tk->visual_w = tk->w << 16;
- tk->visual_h = tk->h << 16;
- } else {
- tk->num_br = 0;
- tk->jp2xdata = NULL;
- }
- }
- return 0;
-}
-
-/*
-* Time To Sample box Decompact
-*
-*/
-void mj2_tts_decompact(mj2_tk_t * tk)
-{
- int i, j;
- tk->num_samples = 0;
- for (i = 0; i < tk->num_tts; i++) {
- tk->num_samples += tk->tts[i].sample_count;
- }
-
- tk->sample = (mj2_sample_t*) opj_malloc(tk->num_samples * sizeof(mj2_sample_t));
-
- for (i = 0; i < tk->num_tts; i++) {
- for (j = 0; j < tk->tts[i].sample_count; j++) {
- tk->sample[j].sample_delta = tk->tts[i].sample_delta;
- }
- }
-}
-
-/*
-* Sample To Chunk box Decompact
-*
-*/
-void mj2_stsc_decompact(mj2_tk_t * tk)
-{
- unsigned int i, j, k, sampleno = 0;
-
- if (tk->num_samplestochunk == 1) {
- tk->num_chunks =
- (unsigned int) ceil((double) tk->num_samples /
- (double) tk->sampletochunk[0].samples_per_chunk);
- tk->chunk = (mj2_chunk_t*) opj_malloc(tk->num_chunks * sizeof(mj2_chunk_t));
- for (k = 0; k < tk->num_chunks; k++) {
- tk->chunk[k].num_samples = tk->sampletochunk[0].samples_per_chunk;
- }
-
- } else {
- tk->chunk = (mj2_chunk_t*) opj_malloc(tk->num_samples * sizeof(mj2_chunk_t));
- tk->num_chunks = 0;
- for (i = 0; i < tk->num_samplestochunk - 1 ; i++) {
- for (j = tk->sampletochunk[i].first_chunk - 1;
- j < tk->sampletochunk[i + 1].first_chunk - 1; j++) {
- tk->chunk[j].num_samples = tk->sampletochunk[i].samples_per_chunk;
- tk->num_chunks++;
- sampleno += tk->chunk[j].num_samples;
- }
- }
- tk->num_chunks += (int)(tk->num_samples - sampleno) /
- tk->sampletochunk[tk->num_samplestochunk - 1].samples_per_chunk;
- for (k = tk->sampletochunk[tk->num_samplestochunk - 1].first_chunk - 1;
- k < tk->num_chunks; k++) {
- tk->chunk[k].num_samples =
- tk->sampletochunk[tk->num_samplestochunk - 1].samples_per_chunk;
- }
- tk->chunk = (mj2_chunk_t*)
- opj_realloc(tk->chunk, tk->num_chunks * sizeof(mj2_chunk_t));
- }
-
-}
-
-
-/*
-* Chunk offset box Decompact
-*
-*/
-void mj2_stco_decompact(mj2_tk_t * tk)
-{
- unsigned int i, j, k = 0;
- unsigned int intra_chunk_offset;
-
- for (i = 0; i < tk->num_chunks; i++) {
- intra_chunk_offset = 0;
- for (j = 0; j < tk->chunk[i].num_samples; j++) {
- tk->sample[k].offset = intra_chunk_offset + tk->chunk[i].offset;
- intra_chunk_offset += tk->sample[k].sample_size;
- k++;
- }
- }
-}
-
-/*
-* Write the JP box
-*
-* JP Signature box
-*
-*/
-void OPJ_CALLCONV mj2_write_jp(opj_cio_t *cio)
-{
- mj2_box_t box;
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
-
- cio_write(cio, MJ2_JP, 4); /* JP */
- cio_write(cio, 0x0d0a870a, 4); /* 0x0d0a870a required in a JP box */
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4);
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the JP box
-*
-* JPEG 2000 signature
-*
-*/
-int mj2_read_jp(opj_cio_t *cio)
-{
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_JP != box.type) { /* Check Marker */
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected JP Marker\n");
- return 1;
- }
- if (0x0d0a870a != cio_read(cio,
- 4)) { /* read the 0x0d0a870a required in a JP box */
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JP Marker\n");
- return 1;
- }
- if (cio_tell(cio) - box.init_pos != box.length) { /* Check box length */
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JP Box size \n");
- return 1;
- }
- return 0;
-
-}
-
-/*
-* Write the FTYP box
-*
-* File type box
-*
-*/
-void OPJ_CALLCONV mj2_write_ftyp(opj_mj2_t * movie, opj_cio_t *cio)
-{
- int i;
- mj2_box_t box;
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
-
- cio_write(cio, MJ2_FTYP, 4); /* FTYP */
- cio_write(cio, movie->brand, 4); /* BR */
- cio_write(cio, movie->minversion, 4); /* MinV */
-
- for (i = 0; i < movie->num_cl; i++) {
- cio_write(cio, movie->cl[i], 4); /* CL */
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* Length */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the FTYP box
-*
-* File type box
-*
-*/
-int mj2_read_ftyp(opj_mj2_t * movie, opj_cio_t *cio)
-{
- int i;
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio); /* Box Size */
- if (MJ2_FTYP != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected FTYP Marker\n");
- return 1;
- }
-
- movie->brand = cio_read(cio, 4); /* BR */
- movie->minversion = cio_read(cio, 4); /* MinV */
- movie->num_cl = (box.length - 16) / 4;
- movie->cl = (unsigned int*) opj_malloc(movie->num_cl * sizeof(unsigned int));
-
- for (i = movie->num_cl - 1; i > -1; i--) {
- movie->cl[i] = cio_read(cio, 4); /* CLi */
- }
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with FTYP Box\n");
- return 1;
- }
- return 0;
-}
-
-
-/*
-* Write the STCO box
-*
-* Chunk Offset Box
-*
-*/
-void mj2_write_stco(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
- unsigned int i;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_STCO, 4); /* STCO */
-
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
-
- cio_write(cio, tk->num_chunks, 4); /* Entry Count */
-
- for (i = 0; i < tk->num_chunks; i++) {
- cio_write(cio, tk->chunk[i].offset, 4); /* Entry offset */
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the STCO box
-*
-* Chunk Offset Box
-*
-*/
-int mj2_read_stco(mj2_tk_t * tk, opj_cio_t *cio)
-{
- unsigned int i;
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio); /* Box Size */
- if (MJ2_STCO != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STCO Marker\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in STCO box\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 3)) { /* Flags = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in STCO box. Expected flag 0\n");
- return 1;
- }
-
-
- if (cio_read(cio, 4) != tk->num_chunks) {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error in STCO box: expecting same amount of entry-count as chunks \n");
- } else {
- for (i = 0; i < tk->num_chunks; i++) {
- tk->chunk[i].offset = cio_read(cio, 4); /* Entry offset */
- }
- }
-
- mj2_stco_decompact(tk);
-
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STCO Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the STSZ box
-*
-* Sample size box
-*
-*/
-void mj2_write_stsz(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
- unsigned int i;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_STSZ, 4); /* STSZ */
-
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
-
- if (tk->same_sample_size == 1) { /* If they all have the same size */
- cio_write(cio, tk->sample[0].sample_size, 4); /* Size */
-
- cio_write(cio, 1, 4); /* Entry count = 1 */
- }
-
- else {
- cio_write(cio, 0,
- 4); /* Sample Size = 0 because they all have different sizes */
-
- cio_write(cio, tk->num_samples, 4); /* Sample Count */
-
- for (i = 0; i < tk->num_samples; i++) {
- cio_write(cio, tk->sample[i].sample_size, 4);
- }
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the STSZ box
-*
-* Sample size box
-*
-*/
-int mj2_read_stsz(mj2_tk_t * tk, opj_cio_t *cio)
-{
- int sample_size;
- unsigned int i;
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio); /* Box Size */
- if (MJ2_STSZ != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STSZ Marker\n");
- return 1;
- }
-
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in STSZ box\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 3)) { /* Flags = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in STSZ box. Expected flag 0\n");
- return 1;
- }
-
- sample_size = cio_read(cio, 4);
-
- if (sample_size != 0) { /* Samples do have the same size */
- tk->same_sample_size = 1;
- for (i = 0; i < tk->num_samples; i++) {
- tk->sample[i].sample_size = sample_size;
- }
- cio_skip(cio, 4); /* Sample count = 1 */
- } else {
- tk->same_sample_size = 0;
- if (tk->num_samples != cio_read(cio, 4)) { /* Sample count */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error in STSZ box. Expected that sample-count is number of samples in track\n");
- return 1;
- }
- for (i = 0; i < tk->num_samples; i++) {
- tk->sample[i].sample_size = cio_read(cio, 4); /* Sample Size */
- }
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STSZ Box size\n");
- return 1;
- }
- }
- return 0;
-
-}
-
-/*
-* Write the STSC box
-*
-* Sample to Chunk
-*
-*/
-void mj2_write_stsc(mj2_tk_t * tk, opj_cio_t *cio)
-{
- unsigned int i;
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_STSC, 4); /* STSC */
-
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
-
- cio_write(cio, tk->num_samplestochunk, 4); /* Entry Count */
-
- for (i = 0; i < tk->num_samplestochunk; i++) {
- cio_write(cio, tk->sampletochunk[i].first_chunk, 4); /* First Chunk */
- cio_write(cio, tk->sampletochunk[i].samples_per_chunk,
- 4); /* Samples per chunk */
- cio_write(cio, tk->sampletochunk[i].sample_descr_idx,
- 4); /* Samples description index */
- }
-
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the STSC box
-*
-* Sample to Chunk
-*
-*/
-int mj2_read_stsc(mj2_tk_t * tk, opj_cio_t *cio)
-{
- unsigned int i;
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio); /* Box Size */
- if (MJ2_STSC != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STSC Marker\n");
- return 1;
- }
-
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in STSC box\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 3)) { /* Flags = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in STSC box. Expected flag 0\n");
- return 1;
- }
-
- tk->num_samplestochunk = cio_read(cio, 4);
-
- tk->sampletochunk = (mj2_sampletochunk_t*) opj_malloc(tk->num_samplestochunk *
- sizeof(mj2_sampletochunk_t));
-
- for (i = 0; i < tk->num_samplestochunk; i++) {
- tk->sampletochunk[i].first_chunk = cio_read(cio, 4);
- tk->sampletochunk[i].samples_per_chunk = cio_read(cio, 4);
- tk->sampletochunk[i].sample_descr_idx = cio_read(cio, 4);
- }
-
- mj2_stsc_decompact(tk); /* decompact sample to chunk box */
-
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STSC Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the STTS box
-*
-* Time to Sample Box
-*
-*/
-void mj2_write_stts(mj2_tk_t * tk, opj_cio_t *cio)
-{
-
- int i;
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_STTS, 4); /* STTS */
-
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
-
- cio_write(cio, tk->num_tts, 4); /* entry_count */
- for (i = 0; i < tk->num_tts; i++) {
- cio_write(cio, tk->tts[i].sample_count, 4); /* Sample-count */
- cio_write(cio, tk->tts[i].sample_delta, 4); /* Sample-Delta */
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the STTS box
-*
-*
-*
-*/
-int mj2_read_stts(mj2_tk_t * tk, opj_cio_t *cio)
-{
- int i;
-
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_STTS != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STTS Marker\n");
- return 1;
- }
-
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in STTS box\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 3)) { /* Flags = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in STTS box. Expected flag 0\n");
- return 1;
- }
-
- tk->num_tts = cio_read(cio, 4);
-
- tk->tts = (mj2_tts_t*) opj_malloc(tk->num_tts * sizeof(mj2_tts_t));
-
- for (i = 0; i < tk->num_tts; i++) {
- tk->tts[i].sample_count = cio_read(cio, 4);
- tk->tts[i].sample_delta = cio_read(cio, 4);
- }
-
- mj2_tts_decompact(tk);
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STTS Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the FIEL box
-*
-* Field coding Box
-*
-*/
-void mj2_write_fiel(mj2_tk_t * tk, opj_cio_t *cio)
-{
-
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_FIEL, 4); /* STTS */
-
- cio_write(cio, tk->fieldcount, 1); /* Field count */
- cio_write(cio, tk->fieldorder, 1); /* Field order */
-
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the FIEL box
-*
-* Field coding Box
-*
-*/
-int mj2_read_fiel(mj2_tk_t * tk, opj_cio_t *cio)
-{
-
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_FIEL != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected FIEL Marker\n");
- return 1;
- }
-
-
- tk->fieldcount = cio_read(cio, 1);
- tk->fieldorder = cio_read(cio, 1);
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with FIEL Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the ORFO box
-*
-* Original Format Box
-*
-*/
-void mj2_write_orfo(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_ORFO, 4);
-
- cio_write(cio, tk->or_fieldcount, 1); /* Original Field count */
- cio_write(cio, tk->or_fieldorder, 1); /* Original Field order */
-
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the ORFO box
-*
-* Original Format Box
-*
-*/
-int mj2_read_orfo(mj2_tk_t * tk, opj_cio_t *cio)
-{
-
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_ORFO != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected ORFO Marker\n");
- return 1;
- }
-
-
- tk->or_fieldcount = cio_read(cio, 1);
- tk->or_fieldorder = cio_read(cio, 1);
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with ORFO Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the JP2P box
-*
-* MJP2 Profile Box
-*
-*/
-void mj2_write_jp2p(mj2_tk_t * tk, opj_cio_t *cio)
-{
-
- int i;
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_JP2P, 4);
-
- cio_write(cio, 0, 4); /* Version 0, flags =0 */
-
- for (i = 0; i < tk->num_br; i++) {
- cio_write(cio, tk->br[i], 4);
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the JP2P box
-*
-* MJP2 Profile Box
-*
-*/
-int mj2_read_jp2p(mj2_tk_t * tk, opj_cio_t *cio)
-{
- int i;
-
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_JP2P != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected JP2P Marker\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in JP2P box\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 3)) { /* Flags = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in JP2P box. Expected flag 0\n");
- return 1;
- }
-
-
- tk->num_br = (box.length - 12) / 4;
- tk->br = (unsigned int*) opj_malloc(tk->num_br * sizeof(unsigned int));
-
- for (i = 0; i < tk->num_br; i++) {
- tk->br[i] = cio_read(cio, 4);
- }
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JP2P Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the JP2X box
-*
-* MJP2 Prefix Box
-*
-*/
-void mj2_write_jp2x(mj2_tk_t * tk, opj_cio_t *cio)
-{
-
- int i;
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_JP2X, 4);
-
- for (i = 0; i < tk->num_jp2x; i++) {
- cio_write(cio, tk->jp2xdata[i], 1);
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the JP2X box
-*
-* MJP2 Prefix Box
-*
-*/
-int mj2_read_jp2x(mj2_tk_t * tk, opj_cio_t *cio)
-{
- unsigned int i;
-
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_JP2X != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected JP2X Marker\n");
- return 1;
- }
-
-
- tk->num_jp2x = (box.length - 8);
- tk->jp2xdata = (unsigned char*) opj_malloc(tk->num_jp2x * sizeof(
- unsigned char));
-
- for (i = 0; i < tk->num_jp2x; i++) {
- tk->jp2xdata[i] = cio_read(cio, 1);
- }
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JP2X Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the JSUB box
-*
-* MJP2 Subsampling Box
-*
-*/
-void mj2_write_jsub(mj2_tk_t * tk, opj_cio_t *cio)
-{
-
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_JSUB, 4);
-
- cio_write(cio, tk->hsub, 1);
- cio_write(cio, tk->vsub, 1);
- cio_write(cio, tk->hoff, 1);
- cio_write(cio, tk->voff, 1);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the JSUB box
-*
-* MJP2 Subsampling Box
-*
-*/
-int mj2_read_jsub(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_JSUB != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected JSUB Marker\n");
- return 1;
- }
-
- tk->hsub = cio_read(cio, 1);
- tk->vsub = cio_read(cio, 1);
- tk->hoff = cio_read(cio, 1);;
- tk->voff = cio_read(cio, 1);
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with JSUB Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the SMJ2 box
-*
-* Visual Sample Entry Description
-*
-*/
-void mj2_write_smj2(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_MJ2, 4); /* MJ2 */
-
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
-
- cio_write(cio, 1, 4);
-
- cio_write(cio, 0, 2); /* Pre-defined */
-
- cio_write(cio, 0, 2); /* Reserved */
-
- cio_write(cio, 0, 4); /* Pre-defined */
- cio_write(cio, 0, 4); /* Pre-defined */
- cio_write(cio, 0, 4); /* Pre-defined */
-
- cio_write(cio, tk->w, 2); /* Width */
- cio_write(cio, tk->h, 2); /* Height */
-
- cio_write(cio, tk->horizresolution, 4); /* Horizontal resolution */
- cio_write(cio, tk->vertresolution, 4); /* Vertical resolution */
-
- cio_write(cio, 0, 4); /* Reserved */
-
- cio_write(cio, 1, 2); /* Pre-defined = 1 */
-
- cio_write(cio, tk->compressorname[0], 4); /* Compressor Name */
- cio_write(cio, tk->compressorname[1], 4);
- cio_write(cio, tk->compressorname[2], 4);
- cio_write(cio, tk->compressorname[3], 4);
- cio_write(cio, tk->compressorname[4], 4);
- cio_write(cio, tk->compressorname[5], 4);
- cio_write(cio, tk->compressorname[6], 4);
- cio_write(cio, tk->compressorname[7], 4);
-
- cio_write(cio, tk->depth, 2); /* Depth */
-
- cio_write(cio, 0xffff, 2); /* Pre-defined = -1 */
-
- jp2_write_jp2h(&tk->jp2_struct, cio);
-
- mj2_write_fiel(tk, cio);
-
- if (tk->num_br != 0) {
- mj2_write_jp2p(tk, cio);
- }
- if (tk->num_jp2x != 0) {
- mj2_write_jp2x(tk, cio);
- }
-
- mj2_write_jsub(tk, cio);
- mj2_write_orfo(tk, cio);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the SMJ2 box
-*
-* Visual Sample Entry Description
-*
-*/
-int mj2_read_smj2(opj_image_t * img, mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
- mj2_box_t box2;
- opj_jp2_color_t color;
- int i;
- opj_bool ok;
-
- mj2_read_boxhdr(&box, cio);
-
- if (MJ2_MJ2 != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error in SMJ2 box: Expected MJ2 Marker\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in MJP2 box\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 3)) { /* Flags = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in MJP2 box. Expected flag 0\n");
- return 1;
- }
-
- cio_skip(cio, 4);
-
- cio_skip(cio, 2); /* Pre-defined */
-
- cio_skip(cio, 2); /* Reserved */
-
- cio_skip(cio, 4); /* Pre-defined */
- cio_skip(cio, 4); /* Pre-defined */
- cio_skip(cio, 4); /* Pre-defined */
-
- tk->w = cio_read(cio, 2); /* Width */
- tk->h = cio_read(cio, 2); /* Height */
-
- tk->horizresolution = cio_read(cio, 4); /* Horizontal resolution */
- tk->vertresolution = cio_read(cio, 4); /* Vertical resolution */
-
- cio_skip(cio, 4); /* Reserved */
-
- cio_skip(cio, 2); /* Pre-defined = 1 */
-
- tk->compressorname[0] = cio_read(cio, 4); /* Compressor Name */
- tk->compressorname[1] = cio_read(cio, 4);
- tk->compressorname[2] = cio_read(cio, 4);
- tk->compressorname[3] = cio_read(cio, 4);
- tk->compressorname[4] = cio_read(cio, 4);
- tk->compressorname[5] = cio_read(cio, 4);
- tk->compressorname[6] = cio_read(cio, 4);
- tk->compressorname[7] = cio_read(cio, 4);
-
- tk->depth = cio_read(cio, 2); /* Depth */
-
- /* Init std value */
- tk->num_jp2x = 0;
- tk->fieldcount = 1;
- tk->fieldorder = 0;
- tk->or_fieldcount = 1;
- tk->or_fieldorder = 0;
-
- cio_skip(cio, 2); /* Pre-defined = -1 */
- memset(&color, 0, sizeof(opj_jp2_color_t));
- tk->jp2_struct.cinfo = tk->cinfo;
-
- ok = jp2_read_jp2h(&tk->jp2_struct, cio, &color);
-
- tk->jp2_struct.cinfo = NULL;
-
- if (ok == OPJ_FALSE) {
- opj_event_msg(tk->cinfo, EVT_ERROR, "Error reading JP2H Box\n");
- return 1;
- }
-
- tk->jp2_struct.comps = (opj_jp2_comps_t*) opj_malloc(tk->jp2_struct.numcomps *
- sizeof(opj_jp2_comps_t));
- tk->jp2_struct.cl = (unsigned int*) opj_malloc(sizeof(unsigned int));
-
- tk->num_br = 0;
- tk->num_jp2x = 0;
-
- for (i = 0; cio_tell(cio) - box.init_pos < box.length; i++) {
- mj2_read_boxhdr(&box2, cio);
- cio_seek(cio, box2.init_pos);
- switch (box2.type) {
- case MJ2_FIEL:
- if (mj2_read_fiel(tk, cio)) {
- return 1;
- }
- break;
-
- case MJ2_JP2P:
- if (mj2_read_jp2p(tk, cio)) {
- return 1;
- }
- break;
-
- case MJ2_JP2X:
- if (mj2_read_jp2x(tk, cio)) {
- return 1;
- }
- break;
-
- case MJ2_JSUB:
- if (mj2_read_jsub(tk, cio)) {
- return 1;
- }
- break;
-
- case MJ2_ORFO:
- if (mj2_read_orfo(tk, cio)) {
- return 1;
- }
- break;
-
- default:
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MJP2 Box size\n");
- return 1;
- break;
-
- }
- }
- return 0;
-}
-
-
-/*
-* Write the STSD box
-*
-* Sample Description
-*
-*/
-void mj2_write_stsd(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_STSD, 4); /* STSD */
-
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
-
- cio_write(cio, 1,
- 4); /* entry_count = 1 (considering same JP2 headerboxes) */
-
- if (tk->track_type == 0) {
- mj2_write_smj2(tk, cio);
- } else if (tk->track_type == 1) {
- /* Not implemented*/
- }
- if (tk->track_type == 2) {
- /* Not implemented*/
- }
-
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the STSD box
-*
-* Sample Description
-*
-*/
-int mj2_read_stsd(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio)
-{
- int i;
- int entry_count, len_2skip;
-
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
-
- if (MJ2_STSD != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STSD Marker\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in STSD box\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 3)) { /* Flags = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in STSD box. Expected flag 0\n");
- return 1;
- }
-
- entry_count = cio_read(cio, 4);
-
- if (tk->track_type == 0) {
- for (i = 0; i < entry_count; i++) {
- if (mj2_read_smj2(img, tk, cio)) {
- return 1;
- }
- }
- } else if (tk->track_type == 1) {
- len_2skip = cio_read(cio, 4); /* Not implemented -> skipping box*/
- cio_skip(cio, len_2skip - 4);
- } else if (tk->track_type == 2) {
- len_2skip = cio_read(cio, 4); /* Not implemented -> skipping box*/
- cio_skip(cio, len_2skip - 4);
- }
-
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STSD Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the STBL box
-*
-* Sample table box box
-*
-*/
-void mj2_write_stbl(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_STBL, 4); /* STBL */
-
- mj2_write_stsd(tk, cio);
- mj2_write_stts(tk, cio);
- mj2_write_stsc(tk, cio);
- mj2_write_stsz(tk, cio);
- mj2_write_stco(tk, cio);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the STBL box
-*
-* Sample table box box
-*
-*/
-int mj2_read_stbl(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_STBL != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected STBL Marker\n");
- return 1;
- }
-
- if (mj2_read_stsd(tk, img, cio)) {
- return 1;
- }
- if (mj2_read_stts(tk, cio)) {
- return 1;
- }
- if (mj2_read_stsc(tk, cio)) {
- return 1;
- }
- if (mj2_read_stsz(tk, cio)) {
- return 1;
- }
- if (mj2_read_stco(tk, cio)) {
- return 1;
- }
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with STBL Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the URL box
-*
-* URL box
-*
-*/
-void mj2_write_url(mj2_tk_t * tk, int url_num, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_URL, 4); /* URL */
-
- if (url_num == 0) {
- cio_write(cio, 1,
- 4); /* Version = 0, flags = 1 because stored in same file */
- } else {
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
- cio_write(cio, tk->url[url_num - 1].location[0], 4);
- cio_write(cio, tk->url[url_num - 1].location[1], 4);
- cio_write(cio, tk->url[url_num - 1].location[2], 4);
- cio_write(cio, tk->url[url_num - 1].location[3], 4);
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the URL box
-*
-* URL box
-*
-*/
-int mj2_read_url(mj2_tk_t * tk, int urn_num, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_URL != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected URL Marker\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in URL box\n");
- return 1;
- }
-
- if (1 != cio_read(cio, 3)) { /* If flags = 1 --> media data in file */
- tk->url[urn_num].location[0] = cio_read(cio, 4);
- tk->url[urn_num].location[1] = cio_read(cio, 4);
- tk->url[urn_num].location[2] = cio_read(cio, 4);
- tk->url[urn_num].location[3] = cio_read(cio, 4);
- } else {
- tk->num_url--;
- }
-
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with URL Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the URN box
-*
-* URN box
-*
-*/
-void mj2_write_urn(mj2_tk_t * tk, int urn_num, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_URN, 4); /* URN */
-
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
-
- cio_write(cio, tk->urn[urn_num].name[0], 4);
- cio_write(cio, tk->urn[urn_num].name[1], 4);
- cio_write(cio, tk->urn[urn_num].name[2], 4);
- cio_write(cio, tk->urn[urn_num].name[3], 4);
- cio_write(cio, tk->urn[urn_num].location[0], 4);
- cio_write(cio, tk->urn[urn_num].location[1], 4);
- cio_write(cio, tk->urn[urn_num].location[2], 4);
- cio_write(cio, tk->urn[urn_num].location[3], 4);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the URN box
-*
-* URN box
-*
-*/
-int mj2_read_urn(mj2_tk_t * tk, int urn_num, opj_cio_t *cio)
-{
-
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_URN != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected URN Marker\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in URN box\n");
- return 1;
- }
-
- if (1 != cio_read(cio, 3)) { /* If flags = 1 --> media data in file */
- tk->urn[urn_num].name[0] = cio_read(cio, 4);
- tk->urn[urn_num].name[1] = cio_read(cio, 4);
- tk->urn[urn_num].name[2] = cio_read(cio, 4);
- tk->urn[urn_num].name[3] = cio_read(cio, 4);
- tk->urn[urn_num].location[0] = cio_read(cio, 4);
- tk->urn[urn_num].location[1] = cio_read(cio, 4);
- tk->urn[urn_num].location[2] = cio_read(cio, 4);
- tk->urn[urn_num].location[3] = cio_read(cio, 4);
- }
-
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with URN Box size\n");
- return 1;
- }
- return 0;
-}
-
-
-/*
-* Write the DREF box
-*
-* Data reference box
-*
-*/
-void mj2_write_dref(mj2_tk_t * tk, opj_cio_t *cio)
-{
- int i;
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_DREF, 4); /* DREF */
-
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
-
- if (tk->num_url + tk->num_urn == 0) { /* Media data in same file */
- cio_write(cio, 1, 4); /* entry_count = 1 */
- mj2_write_url(tk, 0, cio);
- } else {
- cio_write(cio, tk->num_url + tk->num_urn, 4); /* entry_count */
-
- for (i = 0; i < tk->num_url; i++) {
- mj2_write_url(tk, i + 1, cio);
- }
-
- for (i = 0; i < tk->num_urn; i++) {
- mj2_write_urn(tk, i, cio);
- }
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the DREF box
-*
-* Data reference box
-*
-*/
-int mj2_read_dref(mj2_tk_t * tk, opj_cio_t *cio)
-{
-
- int i;
- int entry_count, marker;
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_DREF != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected DREF Marker\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in DREF box\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 3)) { /* Flags = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in DREF box. Expected flag 0\n");
- return 1;
- }
-
- entry_count = cio_read(cio, 4);
- tk->num_url = 0;
- tk->num_urn = 0;
-
- for (i = 0; i < entry_count; i++) {
- cio_skip(cio, 4);
- marker = cio_read(cio, 4);
- if (marker == MJ2_URL) {
- cio_skip(cio, -8);
- tk->num_url++;
- if (mj2_read_url(tk, tk->num_url, cio)) {
- return 1;
- }
- } else if (marker == MJ2_URN) {
- cio_skip(cio, -8);
- tk->num_urn++;
- if (mj2_read_urn(tk, tk->num_urn, cio)) {
- return 1;
- }
- } else {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with in DREF box. Expected URN or URL box\n");
- return 1;
- }
-
- }
-
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with DREF Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the DINF box
-*
-* Data information box
-*
-*/
-void mj2_write_dinf(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_DINF, 4); /* DINF */
-
- mj2_write_dref(tk, cio);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the DINF box
-*
-* Data information box
-*
-*/
-int mj2_read_dinf(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_DINF != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected DINF Marker\n");
- return 1;
- }
-
- if (mj2_read_dref(tk, cio)) {
- return 1;
- }
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with DINF Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the VMHD box
-*
-* Video Media information box
-*
-*/
-void mj2_write_vmhd(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_VMHD, 4); /* VMHD */
-
- cio_write(cio, 1, 4); /* Version = 0, flags = 1 */
-
- cio_write(cio, tk->graphicsmode, 2);
- cio_write(cio, tk->opcolor[0], 2);
- cio_write(cio, tk->opcolor[1], 2);
- cio_write(cio, tk->opcolor[2], 2);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the VMHD box
-*
-* Video Media information box
-*
-*/
-int mj2_read_vmhd(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_VMHD != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected VMHD Marker\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in VMHD box\n");
- return 1;
- }
-
- if (1 != cio_read(cio, 3)) { /* Flags = 1 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in VMHD box. Expected flag 1\n");
- return 1;
- }
-
- tk->track_type = 0;
- tk->graphicsmode = cio_read(cio, 2);
- tk->opcolor[0] = cio_read(cio, 2);
- tk->opcolor[1] = cio_read(cio, 2);
- tk->opcolor[2] = cio_read(cio, 2);
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with VMHD Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the SMHD box
-*
-* Sound Media information box
-*
-*/
-void mj2_write_smhd(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_SMHD, 4); /* SMHD */
-
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
-
- cio_write(cio, tk->balance, 2);
-
- cio_write(cio, 0, 2); /* Reserved */
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the SMHD box
-*
-* Sound Media information box
-*
-*/
-int mj2_read_smhd(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_SMHD != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected SMHD Marker\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in SMHD box\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 3)) { /* Flags = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in SMHD box. Expected flag 0\n");
- return 1;
- }
-
- tk->track_type = 1;
- tk->balance = cio_read(cio, 2);
-
- /* Init variables to zero to avoid problems when freeeing memory
- The values will possibly be overidded when decoding the track structure */
- tk->num_br = 0;
- tk->num_url = 0;
- tk->num_urn = 0;
- tk->num_chunks = 0;
- tk->num_tts = 0;
- tk->num_samplestochunk = 0;
- tk->num_samples = 0;
-
- cio_skip(cio, 2); /* Reserved */
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with SMHD Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the HMHD box
-*
-* Hint Media information box
-*
-*/
-void mj2_write_hmhd(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_HMHD, 4); /* HMHD */
-
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
-
- cio_write(cio, tk->maxPDUsize, 2);
- cio_write(cio, tk->avgPDUsize, 2);
- cio_write(cio, tk->maxbitrate, 4);
- cio_write(cio, tk->avgbitrate, 4);
- cio_write(cio, tk->slidingavgbitrate, 4);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the HMHD box
-*
-* Hint Media information box
-*
-*/
-int mj2_read_hmhd(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_HMHD != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected HMHD Marker\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in HMHD box\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 3)) { /* Flags = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in HMHD box. Expected flag 0\n");
- return 1;
- }
-
- tk->track_type = 2;
- tk->maxPDUsize = cio_read(cio, 2);
- tk->avgPDUsize = cio_read(cio, 2);
- tk->maxbitrate = cio_read(cio, 4);
- tk->avgbitrate = cio_read(cio, 4);
- tk->slidingavgbitrate = cio_read(cio, 4);
-
- /* Init variables to zero to avoid problems when freeeing memory
- The values will possibly be overidded when decoding the track structure */
- tk->num_br = 0;
- tk->num_url = 0;
- tk->num_urn = 0;
- tk->num_chunks = 0;
- tk->num_tts = 0;
- tk->num_samplestochunk = 0;
- tk->num_samples = 0;
-
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with HMHD Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the MINF box
-*
-* Media information box
-*
-*/
-void mj2_write_minf(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_MINF, 4); /* MINF */
-
- if (tk->track_type == 0) {
- mj2_write_vmhd(tk, cio);
- } else if (tk->track_type == 1) {
- mj2_write_smhd(tk, cio);
- } else if (tk->track_type == 2) {
- mj2_write_hmhd(tk, cio);
- }
-
- mj2_write_dinf(tk, cio);
- mj2_write_stbl(tk, cio);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the MINF box
-*
-* Media information box
-*
-*/
-int mj2_read_minf(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio)
-{
-
- unsigned int box_type;
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_MINF != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MINF Marker\n");
- return 1;
- }
-
- cio_skip(cio, 4);
- box_type = cio_read(cio, 4);
- cio_skip(cio, -8);
-
- if (box_type == MJ2_VMHD) {
- if (mj2_read_vmhd(tk, cio)) {
- return 1;
- }
- } else if (box_type == MJ2_SMHD) {
- if (mj2_read_smhd(tk, cio)) {
- return 1;
- }
- } else if (box_type == MJ2_HMHD) {
- if (mj2_read_hmhd(tk, cio)) {
- return 1;
- }
- } else {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error in MINF box expected vmhd, smhd or hmhd\n");
- return 1;
- }
-
- if (mj2_read_dinf(tk, cio)) {
- return 1;
- }
-
- if (mj2_read_stbl(tk, img, cio)) {
- return 1;
- }
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MINF Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the HDLR box
-*
-* Handler reference box
-*
-*/
-void mj2_write_hdlr(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_HDLR, 4); /* HDLR */
-
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
-
- cio_write(cio, 0, 4); /* Predefine */
-
- tk->name =
- 0; /* The track name is immediately determined by the track type */
-
- if (tk->track_type == 0) {
- tk->handler_type = 0x76696465; /* Handler type: vide */
- cio_write(cio, tk->handler_type, 4);
-
- cio_write(cio, 0, 4);
- cio_write(cio, 0, 4);
- cio_write(cio, 0, 4); /* Reserved */
-
- cio_write(cio, 0x76696465, 4);
- cio_write(cio, 0x6F206d65, 4);
- cio_write(cio, 0x64696120, 4);
- cio_write(cio, 0x74726163, 4);
- cio_write(cio, 0x6b00, 2); /* String: video media track */
- } else if (tk->track_type == 1) {
- tk->handler_type = 0x736F756E; /* Handler type: soun */
- cio_write(cio, tk->handler_type, 4);
-
- cio_write(cio, 0, 4);
- cio_write(cio, 0, 4);
- cio_write(cio, 0, 4); /* Reserved */
-
- cio_write(cio, 0x536F756E, 4);
- cio_write(cio, 0x6400, 2); /* String: Sound */
- } else if (tk->track_type == 2) {
- tk->handler_type = 0x68696E74; /* Handler type: hint */
- cio_write(cio, tk->handler_type, 4);
-
- cio_write(cio, 0, 4);
- cio_write(cio, 0, 4);
- cio_write(cio, 0, 4); /* Reserved */
-
- cio_write(cio, 0x48696E74, 4);
- cio_write(cio, 0, 2); /* String: Hint */
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the HDLR box
-*
-* Handler reference box
-*
-*/
-int mj2_read_hdlr(mj2_tk_t * tk, opj_cio_t *cio)
-{
- int i;
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_HDLR != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected HDLR Marker\n");
- return 1;
- }
-
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in HDLR box\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 3)) { /* Flags = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in HDLR box. Expected flag 0\n");
- return 1;
- }
-
- cio_skip(cio, 4); /* Reserved */
-
- tk->handler_type = cio_read(cio, 4);
- cio_skip(cio, 12); /* Reserved */
-
- tk->name_size = box.length - 32;
-
- tk->name = (char*) opj_malloc(tk->name_size * sizeof(char));
- for (i = 0; i < tk->name_size; i++) {
- tk->name[i] = cio_read(cio, 1); /* Name */
- }
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with HDLR Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the MDHD box
-*
-* Media Header Box
-*
-*/
-void mj2_write_mdhd(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
- unsigned int i;
- time_t ltime;
- unsigned int modification_time;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_MDHD, 4); /* MDHD */
-
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
-
- cio_write(cio, tk->creation_time, 4); /* Creation Time */
-
- time(<ime); /* Time since 1/1/70 */
- modification_time = (unsigned int)ltime +
- 2082844800; /* Seoonds between 1/1/04 and 1/1/70 */
-
- cio_write(cio, modification_time, 4); /* Modification Time */
-
- cio_write(cio, tk->timescale, 4); /* Timescale */
-
- tk->duration = 0;
-
- for (i = 0; i < tk->num_samples; i++) {
- tk->duration += tk->sample[i].sample_delta;
- }
-
- cio_write(cio, tk->duration, 4); /* Duration */
-
- cio_write(cio, tk->language, 2); /* Language */
-
- cio_write(cio, 0, 2); /* Predefined */
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the MDHD box
-*
-* Media Header Box
-*
-*/
-int mj2_read_mdhd(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (!(MJ2_MHDR == box.type ||
- MJ2_MDHD == box.type)) { /* Kakadu writes MHDR instead of MDHD*/
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MDHD Marker\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in MDHD box\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 3)) { /* Flags = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in MDHD box. Expected flag 0\n");
- return 1;
- }
-
-
- tk->creation_time = cio_read(cio, 4); /* Creation Time */
-
- tk->modification_time = cio_read(cio, 4); /* Modification Time */
-
- tk->timescale = cio_read(cio, 4); /* Timescale */
-
- tk->duration = cio_read(cio, 4); /* Duration */
-
- tk->language = cio_read(cio, 2); /* Language */
-
- cio_skip(cio, 2); /* Predefined */
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MDHD Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the MDIA box
-*
-* Media box
-*
-*/
-void mj2_write_mdia(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_MDIA, 4); /* MDIA */
-
- mj2_write_mdhd(tk, cio);
- mj2_write_hdlr(tk, cio);
- mj2_write_minf(tk, cio);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the MDIA box
-*
-* Media box
-*
-*/
-int mj2_read_mdia(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_MDIA != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MDIA Marker\n");
- return 1;
- }
-
- if (mj2_read_mdhd(tk, cio)) {
- return 1;
- }
- if (mj2_read_hdlr(tk, cio)) {
- return 1;
- }
- if (mj2_read_minf(tk, img, cio)) {
- return 1;
- }
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MDIA Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the TKHD box
-*
-* Track Header box
-*
-*/
-void mj2_write_tkhd(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
- unsigned int i;
- time_t ltime;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
-
- cio_write(cio, MJ2_TKHD, 4); /* TKHD */
-
- cio_write(cio, 3, 4); /* Version=0, flags=3 */
-
- time(<ime); /* Time since 1/1/70 */
- tk->modification_time = (unsigned int)ltime +
- 2082844800; /* Seoonds between 1/1/04 and 1/1/70 */
-
- cio_write(cio, tk->creation_time, 4); /* Creation Time */
-
- cio_write(cio, tk->modification_time, 4); /* Modification Time */
-
- cio_write(cio, tk->track_ID, 4); /* Track ID */
-
- cio_write(cio, 0, 4); /* Reserved */
-
- tk->duration = 0;
-
- for (i = 0; i < tk->num_samples; i++) {
- tk->duration += tk->sample[i].sample_delta;
- }
-
- cio_write(cio, tk->duration, 4); /* Duration */
-
- cio_write(cio, 0, 4); /* Reserved */
- cio_write(cio, 0, 4); /* Reserved */
-
- cio_write(cio, tk->layer, 2); /* Layer */
-
- cio_write(cio, 0, 2); /* Predefined */
-
- cio_write(cio, tk->volume, 2); /* Volume */
-
- cio_write(cio, 0, 2); /* Reserved */
-
- cio_write(cio, tk->trans_matrix[0], 4); /* Transformation matrix for track */
- cio_write(cio, tk->trans_matrix[1], 4);
- cio_write(cio, tk->trans_matrix[2], 4);
- cio_write(cio, tk->trans_matrix[3], 4);
- cio_write(cio, tk->trans_matrix[4], 4);
- cio_write(cio, tk->trans_matrix[5], 4);
- cio_write(cio, tk->trans_matrix[6], 4);
- cio_write(cio, tk->trans_matrix[7], 4);
- cio_write(cio, tk->trans_matrix[8], 4);
-
- cio_write(cio, tk->visual_w, 4); /* Video Visual Width */
-
- cio_write(cio, tk->visual_h, 4); /* Video Visual Height */
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the TKHD box
-*
-* Track Header box
-*
-*/
-int mj2_read_tkhd(mj2_tk_t * tk, opj_cio_t *cio)
-{
- int flag;
-
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
-
- if (MJ2_TKHD != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected TKHD Marker\n");
- return 1;
- }
-
- if (0 != cio_read(cio, 1)) { /* Version = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in TKHD box\n");
- return 1;
- }
-
- flag = cio_read(cio, 3);
-
- if (!(flag == 1 || flag == 2 || flag == 3 ||
- flag == 4)) { /* Flags = 1,2,3 or 4 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with flag in TKHD box: Expected flag 1,2,3 or 4\n");
- return 1;
- }
-
- tk->creation_time = cio_read(cio, 4); /* Creation Time */
-
- tk->modification_time = cio_read(cio, 4); /* Modification Time */
-
- tk->track_ID = cio_read(cio, 4); /* Track ID */
-
- cio_skip(cio, 4); /* Reserved */
-
- tk->duration = cio_read(cio, 4); /* Duration */
-
- cio_skip(cio, 8); /* Reserved */
-
- tk->layer = cio_read(cio, 2); /* Layer */
-
- cio_read(cio, 2); /* Predefined */
-
- tk->volume = cio_read(cio, 2); /* Volume */
-
- cio_skip(cio, 2); /* Reserved */
-
- tk->trans_matrix[0] = cio_read(cio, 4); /* Transformation matrix for track */
- tk->trans_matrix[1] = cio_read(cio, 4);
- tk->trans_matrix[2] = cio_read(cio, 4);
- tk->trans_matrix[3] = cio_read(cio, 4);
- tk->trans_matrix[4] = cio_read(cio, 4);
- tk->trans_matrix[5] = cio_read(cio, 4);
- tk->trans_matrix[6] = cio_read(cio, 4);
- tk->trans_matrix[7] = cio_read(cio, 4);
- tk->trans_matrix[8] = cio_read(cio, 4);
-
- tk->visual_w = cio_read(cio, 4); /* Video Visual Width */
-
- tk->visual_h = cio_read(cio, 4); /* Video Visual Height */
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with TKHD Box size\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the TRAK box
-*
-* Track box
-*
-*/
-void mj2_write_trak(mj2_tk_t * tk, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
-
- cio_write(cio, MJ2_TRAK, 4); /* TRAK */
-
- mj2_write_tkhd(tk, cio);
- mj2_write_mdia(tk, cio);
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the TRAK box
-*
-* Track box
-*
-*/
-int mj2_read_trak(mj2_tk_t * tk, opj_image_t * img, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_TRAK != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected TRAK Marker\n");
- return 1;
- }
- if (mj2_read_tkhd(tk, cio)) {
- return 1;
- }
- if (mj2_read_mdia(tk, img, cio)) {
- return 1;
- }
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with TRAK Box\n");
- return 1;
- }
- return 0;
-}
-
-/*
-* Write the MVHD box
-*
-* Movie header Box
-*
-*/
-void mj2_write_mvhd(opj_mj2_t * movie, opj_cio_t *cio)
-{
- int i;
- mj2_box_t box;
- unsigned j;
- time_t ltime;
- int max_tk_num = 0;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_MVHD, 4); /* MVHD */
-
- cio_write(cio, 0, 4); /* Version = 0, flags = 0 */
-
- time(<ime); /* Time since 1/1/70 */
- movie->modification_time = (unsigned int)ltime +
- 2082844800; /* Seoonds between 1/1/04 and 1/1/70 */
-
- cio_write(cio, movie->creation_time, 4); /* Creation Time */
-
- cio_write(cio, movie->modification_time, 4); /* Modification Time */
-
- cio_write(cio, movie->timescale, 4); /* Timescale */
-
- movie->duration = 0;
-
- for (i = 0; i < (movie->num_stk + movie->num_htk + movie->num_vtk); i++) {
- mj2_tk_t *tk = &movie->tk[i];
-
- for (j = 0; j < tk->num_samples; j++) {
- movie->duration += tk->sample[j].sample_delta;
- }
- }
-
- cio_write(cio, movie->duration, 4);
-
- cio_write(cio, movie->rate, 4); /* Rate to play presentation */
-
- cio_write(cio, movie->volume, 2); /* Volume */
-
- cio_write(cio, 0, 2); /* Reserved */
- cio_write(cio, 0, 4); /* Reserved */
- cio_write(cio, 0, 4); /* Reserved */
-
- cio_write(cio, movie->trans_matrix[0],
- 4); /* Transformation matrix for video */
- cio_write(cio, movie->trans_matrix[1], 4);
- cio_write(cio, movie->trans_matrix[2], 4);
- cio_write(cio, movie->trans_matrix[3], 4);
- cio_write(cio, movie->trans_matrix[4], 4);
- cio_write(cio, movie->trans_matrix[5], 4);
- cio_write(cio, movie->trans_matrix[6], 4);
- cio_write(cio, movie->trans_matrix[7], 4);
- cio_write(cio, movie->trans_matrix[8], 4);
-
- cio_write(cio, 0, 4); /* Pre-defined */
- cio_write(cio, 0, 4); /* Pre-defined */
- cio_write(cio, 0, 4); /* Pre-defined */
- cio_write(cio, 0, 4); /* Pre-defined */
- cio_write(cio, 0, 4); /* Pre-defined */
- cio_write(cio, 0, 4); /* Pre-defined */
-
-
- for (i = 0; i < movie->num_htk + movie->num_stk + movie->num_vtk; i++) {
- if (max_tk_num < movie->tk[i].track_ID) {
- max_tk_num = movie->tk[i].track_ID;
- }
- }
-
- movie->next_tk_id = max_tk_num + 1;
-
- cio_write(cio, movie->next_tk_id, 4); /* ID of Next track to be added */
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the MVHD box
-*
-* Movie header Box
-*
-*/
-int mj2_read_mvhd(opj_mj2_t * movie, opj_cio_t *cio)
-{
- mj2_box_t box;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_MVHD != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MVHD Marker\n");
- return 1;
- }
-
-
- if (0 != cio_read(cio, 4)) { /* Version = 0, flags = 0 */
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error: Only Version 0 handled in MVHD box\n");
- }
-
- movie->creation_time = cio_read(cio, 4); /* Creation Time */
-
- movie->modification_time = cio_read(cio, 4); /* Modification Time */
-
- movie->timescale = cio_read(cio, 4); /* Timescale */
-
- movie->duration = cio_read(cio, 4); /* Duration */
-
- movie->rate = cio_read(cio, 4); /* Rate to play presentation */
-
- movie->volume = cio_read(cio, 2); /* Volume */
-
- cio_skip(cio, 10); /* Reserved */
-
- movie->trans_matrix[0] = cio_read(cio,
- 4); /* Transformation matrix for video */
- movie->trans_matrix[1] = cio_read(cio, 4);
- movie->trans_matrix[2] = cio_read(cio, 4);
- movie->trans_matrix[3] = cio_read(cio, 4);
- movie->trans_matrix[4] = cio_read(cio, 4);
- movie->trans_matrix[5] = cio_read(cio, 4);
- movie->trans_matrix[6] = cio_read(cio, 4);
- movie->trans_matrix[7] = cio_read(cio, 4);
- movie->trans_matrix[8] = cio_read(cio, 4);
-
- cio_skip(cio, 24); /* Pre-defined */
-
- movie->next_tk_id = cio_read(cio, 4); /* ID of Next track to be added */
-
- if (cio_tell(cio) - box.init_pos != box.length) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error with MVHD Box Size\n");
- return 1;
- }
- return 0;
-}
-
-
-/*
-* Write the MOOV box
-*
-* Movie Box
-*
-*/
-void OPJ_CALLCONV mj2_write_moov(opj_mj2_t * movie, opj_cio_t *cio)
-{
- int i;
- mj2_box_t box;
-
- box.init_pos = cio_tell(cio);
- cio_skip(cio, 4);
- cio_write(cio, MJ2_MOOV, 4); /* MOOV */
-
- mj2_write_mvhd(movie, cio);
-
- for (i = 0; i < (movie->num_stk + movie->num_htk + movie->num_vtk); i++) {
- mj2_write_trak(&movie->tk[i], cio);
- }
-
- box.length = cio_tell(cio) - box.init_pos;
- cio_seek(cio, box.init_pos);
- cio_write(cio, box.length, 4); /* L */
- cio_seek(cio, box.init_pos + box.length);
-}
-
-/*
-* Read the MOOV box
-*
-* Movie Box
-*
-*/
-int mj2_read_moov(opj_mj2_t * movie, opj_image_t * img, opj_cio_t *cio)
-{
- unsigned int i;
- mj2_box_t box;
- mj2_box_t box2;
-
- mj2_read_boxhdr(&box, cio);
- if (MJ2_MOOV != box.type) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error: Expected MOOV Marker\n");
- return 1;
- }
-
- if (mj2_read_mvhd(movie, cio)) {
- return 1;
- }
-
- movie->tk = (mj2_tk_t*) opj_malloc((movie->next_tk_id - 1) * sizeof(mj2_tk_t));
-
- for (i = 0; cio_tell(cio) - box.init_pos < box.length; i++) {
- mj2_tk_t *tk = &movie->tk[i];
- tk->cinfo = movie->cinfo;
- mj2_read_boxhdr(&box2, cio);
- if (box2.type == MJ2_TRAK) {
- cio_seek(cio, box2.init_pos);
- if (mj2_read_trak(tk, img, cio)) {
- return 1;
- }
-
- if (tk->track_type == 0) {
- movie->num_vtk++;
- } else if (tk->track_type == 1) {
- movie->num_stk++;
- } else if (tk->track_type == 2) {
- movie->num_htk++;
- }
- } else if (box2.type == MJ2_MVEX) {
- cio_seek(cio, box2.init_pos);
- cio_skip(cio, box2.length);
- i--;
- } else {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "Error with MOOV Box: Expected TRAK or MVEX box\n");
- return 1;
- }
- }
- return 0;
-}
-
-int OPJ_CALLCONV mj2_read_struct(FILE *file, opj_mj2_t *movie)
-{
- mj2_box_t box;
- opj_image_t img;
- unsigned char * src;
- int fsresult;
- int foffset;
- opj_cio_t *cio;
-
- /* open a byte stream for reading */
- src = (unsigned char*) opj_malloc(300 * sizeof(unsigned char));
-
- /* Assuming that jp and ftyp markers size do
- not exceed 300 bytes */
- fread(src, 300, 1, file);
-
- cio = opj_cio_open((opj_common_ptr)movie->cinfo, src, 300);
-
- if (mj2_read_jp(cio)) {
- return 1;
- }
- if (mj2_read_ftyp(movie, cio)) {
- return 1;
- }
-
- fsresult = fseek(file, cio_tell(cio), SEEK_SET);
- if (fsresult) {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "End of file reached while trying to read data after FTYP box\n");
- return 1;
- }
-
- foffset = cio_tell(cio);
-
- box.type = 0;
-
- fread(src, 30, 1, file);
- cio = opj_cio_open((opj_common_ptr)movie->cinfo, src, 300);
- mj2_read_boxhdr(&box, cio);
-
- while (box.type != MJ2_MOOV) {
-
- switch (box.type) {
- case MJ2_MDAT:
- fsresult = fseek(file, foffset + box.length, SEEK_SET);
- if (fsresult) {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "End of file reached while trying to read MDAT box\n");
- return 1;
- }
- foffset += box.length;
- break;
-
- case MJ2_MOOF:
- fsresult = fseek(file, foffset + box.length, SEEK_SET);
- if (fsresult) {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "End of file reached while trying to read MOOF box\n");
- return 1;
- }
- foffset += box.length;
- break;
- case MJ2_FREE:
- fsresult = fseek(file, foffset + box.length, SEEK_SET);
- if (fsresult) {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "End of file reached while trying to read FREE box\n");
- return 1;
- }
- foffset += box.length;
- break;
- case MJ2_SKIP:
- fsresult = fseek(file, foffset + box.length, SEEK_SET);
- if (fsresult) {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "End of file reached while trying to read SKIP box\n");
- return 1;
- }
- foffset += box.length;
- break;
- default:
- opj_event_msg(cio->cinfo, EVT_ERROR, "Unknown box in MJ2 stream\n");
- fsresult = fseek(file, foffset + box.length, SEEK_SET);
- if (fsresult) {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "End of file reached while trying to read end of unknown box\n");
- return 1;
- }
- foffset += box.length;
- break;
- }
- fsresult = fread(src, 8, 1, file);
- if (fsresult != 1) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "MOOV box not found in file\n");
- return 1;
- }
- cio = opj_cio_open((opj_common_ptr)movie->cinfo, src, 8);
- mj2_read_boxhdr(&box, cio);
- }
-
- fseek(file, foffset, SEEK_SET);
- src = (unsigned char*)opj_realloc(src, box.length);
- if (src == NULL) {
- opj_event_msg(cio->cinfo, EVT_ERROR, "Error reallocation memory\n");
- opj_free(src);
- return 1;
- }
-
- fsresult = fread(src, box.length, 1, file);
- if (fsresult != 1) {
- opj_event_msg(cio->cinfo, EVT_ERROR,
- "End of file reached while trying to read MOOV box\n");
- opj_free(src);
- return 1;
- }
-
- cio = opj_cio_open((opj_common_ptr)movie->cinfo, src, box.length);
-
- if (mj2_read_moov(movie, &img, cio)) {
- opj_free(src);
- return 1;
- }
-
- opj_free(src);
- return 0;
-}
-
-/* ----------------------------------------------------------------------- */
-/* MJ2 decoder interface */
-/* ----------------------------------------------------------------------- */
-
-opj_dinfo_t* OPJ_CALLCONV mj2_create_decompress()
-{
- opj_mj2_t* mj2;
- opj_dinfo_t *dinfo = (opj_dinfo_t*) opj_calloc(1, sizeof(opj_dinfo_t));
- if (!dinfo) {
- return NULL;
- }
-
- dinfo->is_decompressor = OPJ_TRUE;
-
- mj2 = (opj_mj2_t*) opj_calloc(1, sizeof(opj_mj2_t));
- dinfo->mj2_handle = mj2;
- if (mj2) {
- mj2->cinfo = (opj_common_ptr)dinfo;
- }
- mj2->j2k = j2k_create_decompress((opj_common_ptr)dinfo);
- dinfo->j2k_handle = mj2->j2k;
-
- return dinfo;
-}
-
-void OPJ_CALLCONV mj2_setup_decoder(opj_mj2_t *movie,
- mj2_dparameters_t *mj2_parameters)
-{
- movie->num_vtk = 0;
- movie->num_stk = 0;
- movie->num_htk = 0;
-
- /* setup the J2K decoder parameters */
- j2k_setup_decoder((opj_j2k_t*)movie->cinfo->j2k_handle,
- &mj2_parameters->j2k_parameters);
-
-}
-
-void OPJ_CALLCONV mj2_destroy_decompress(opj_mj2_t *movie)
-{
- if (movie) {
- int i;
- mj2_tk_t *tk = NULL;
-
- if (movie->cinfo->j2k_handle) {
- j2k_destroy_compress(movie->j2k);
- }
-
- if (movie->num_cl != 0) {
- opj_free(movie->cl);
- }
-
- for (i = 0; i < movie->num_vtk + movie->num_stk + movie->num_htk; i++) {
- tk = &movie->tk[i];
- if (tk->name_size != 0) {
- opj_free(tk->name);
- }
- if (tk->track_type == 0) {/* Video track*/
- if (tk->jp2_struct.comps != NULL) {
- opj_free(tk->jp2_struct.comps);
- }
- if (tk->jp2_struct.cl != NULL) {
- opj_free(tk->jp2_struct.cl);
- }
- if (tk->num_jp2x != 0) {
- opj_free(tk->jp2xdata);
- }
-
- }
- if (tk->num_url != 0) {
- opj_free(tk->url);
- }
- if (tk->num_urn != 0) {
- opj_free(tk->urn);
- }
- if (tk->num_br != 0) {
- opj_free(tk->br);
- }
- if (tk->num_tts != 0) {
- opj_free(tk->tts);
- }
- if (tk->num_chunks != 0) {
- opj_free(tk->chunk);
- }
- if (tk->num_samplestochunk != 0) {
- opj_free(tk->sampletochunk);
- }
- if (tk->num_samples != 0) {
- opj_free(tk->sample);
- }
- }
-
- opj_free(movie->tk);
- }
- opj_free(movie);
-}
-
-/* ----------------------------------------------------------------------- */
-/* MJ2 encoder interface */
-/* ----------------------------------------------------------------------- */
-
-opj_cinfo_t* OPJ_CALLCONV mj2_create_compress()
-{
- opj_mj2_t* mj2;
- opj_cinfo_t *cinfo = (opj_cinfo_t*) opj_calloc(1, sizeof(opj_cinfo_t));
- if (!cinfo) {
- return NULL;
- }
-
- mj2 = (opj_mj2_t*) opj_calloc(1, sizeof(opj_mj2_t));
- cinfo->mj2_handle = mj2;
- if (mj2) {
- mj2->cinfo = (opj_common_ptr)cinfo;
- }
-
- mj2->j2k = j2k_create_compress(mj2->cinfo);
- cinfo->j2k_handle = mj2->j2k;
-
- return cinfo;
-}
-
-void OPJ_CALLCONV mj2_setup_encoder(opj_mj2_t *movie,
- mj2_cparameters_t *parameters)
-{
- if (movie && parameters) {
- opj_jp2_t *jp2_struct;
-
- movie->num_htk = 0; /* No hint tracks*/
- movie->num_stk = 0; /* No sound tracks*/
- movie->num_vtk = 1; /* One video track*/
-
- movie->brand = MJ2_MJ2; /* One brand: MJ2*/
- movie->num_cl = 2; /* Two compatible brands: MJ2 and MJ2S*/
- movie->cl = (unsigned int*) opj_malloc(movie->num_cl * sizeof(unsigned int));
- movie->cl[0] = MJ2_MJ2;
- movie->cl[1] = MJ2_MJ2S;
- movie->minversion = 0; /* Minimum version: 0 */
-
- movie->tk = (mj2_tk_t*) opj_malloc(sizeof(
- mj2_tk_t)); /*Memory allocation for the video track*/
- movie->tk[0].track_ID = 1; /* Track ID = 1 */
- movie->tk[0].track_type = 0; /* Video track */
- movie->tk[0].Dim[0] = parameters->Dim[0];
- movie->tk[0].Dim[1] = parameters->Dim[1];
- movie->tk[0].w = parameters->w;
- movie->tk[0].h = parameters->h;
- movie->tk[0].CbCr_subsampling_dx = parameters->CbCr_subsampling_dx;
- movie->tk[0].CbCr_subsampling_dy = parameters->CbCr_subsampling_dy;
- movie->tk[0].sample_rate = parameters->frame_rate;
- movie->tk[0].name_size = 0;
- movie->tk[0].chunk = (mj2_chunk_t*) opj_malloc(sizeof(mj2_chunk_t));
- movie->tk[0].sample = (mj2_sample_t*) opj_malloc(sizeof(mj2_sample_t));
- movie->tk[0].depth = parameters->prec;
-
- jp2_struct = &movie->tk[0].jp2_struct;
- jp2_struct->numcomps = parameters->numcomps; /* NC */
- jp2_struct->comps = (opj_jp2_comps_t*) opj_malloc(jp2_struct->numcomps * sizeof(
- opj_jp2_comps_t));
- jp2_struct->precedence = 0; /* PRECEDENCE*/
- jp2_struct->approx = 0; /* APPROX*/
- jp2_struct->brand = JP2_JP2; /* BR */
- jp2_struct->minversion = 0; /* MinV */
- jp2_struct->numcl = 1;
- jp2_struct->cl = (unsigned int*) opj_malloc(jp2_struct->numcl * sizeof(
- unsigned int));
- jp2_struct->cl[0] = JP2_JP2; /* CL0 : JP2 */
- jp2_struct->C = 7; /* C : Always 7*/
- jp2_struct->UnkC = 0; /* UnkC, colorspace specified in colr box*/
- jp2_struct->IPR = 0; /* IPR, no intellectual property*/
- jp2_struct->w = parameters->w;
- jp2_struct->h = parameters->h;
- jp2_struct->bpc = 7;
- jp2_struct->meth = parameters->meth;
- jp2_struct->enumcs = parameters->enumcs;
- }
-}
-
-void OPJ_CALLCONV mj2_destroy_compress(opj_mj2_t *movie)
-{
- if (movie) {
- int i;
- mj2_tk_t *tk = NULL;
-
- if (movie->cinfo->j2k_handle) {
- j2k_destroy_compress(movie->j2k);
- }
-
- if (movie->num_cl != 0) {
- opj_free(movie->cl);
- }
-
- for (i = 0; i < movie->num_vtk + movie->num_stk + movie->num_htk; i++) {
- tk = &movie->tk[i];
- if (tk->name_size != 0) {
- opj_free(tk->name);
- }
- if (tk->track_type == 0) {/* Video track*/
- if (tk->jp2_struct.comps != NULL) {
- opj_free(tk->jp2_struct.comps);
- }
- if (tk->jp2_struct.cl != NULL) {
- opj_free(tk->jp2_struct.cl);
- }
- if (tk->num_jp2x != 0) {
- opj_free(tk->jp2xdata);
- }
-
- }
- if (tk->num_url != 0) {
- opj_free(tk->url);
- }
- if (tk->num_urn != 0) {
- opj_free(tk->urn);
- }
- if (tk->num_br != 0) {
- opj_free(tk->br);
- }
- if (tk->num_tts != 0) {
- opj_free(tk->tts);
- }
- if (tk->num_chunks != 0) {
- opj_free(tk->chunk);
- }
- if (tk->num_samplestochunk != 0) {
- opj_free(tk->sampletochunk);
- }
- if (tk->num_samples != 0) {
- opj_free(tk->sample);
- }
- }
-
- opj_free(movie->tk);
- }
- opj_free(movie);
-}
-
-/*@}*/
-
-/*@}*/
-
+++ /dev/null
-/*
-* Copyright (c) 2003-2004, Francois-Olivier Devaux
-* Copyright (c) 2003-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.
- */
-
-#ifndef __MJ2_H
-#define __MJ2_H
-/**
-@file mj2.h
-@brief The Motion JPEG 2000 file format Reader/Writer (MJ22)
-
-*/
-
-/** @defgroup MJ2 MJ2 - Motion JPEG 2000 file format reader/writer */
-/*@{*/
-
-#define MJ2_JP 0x6a502020
-#define MJ2_FTYP 0x66747970
-#define MJ2_MJ2 0x6d6a7032
-#define MJ2_MJ2S 0x6d6a3273
-#define MJ2_MDAT 0x6d646174
-#define MJ2_MOOV 0x6d6f6f76
-#define MJ2_MVHD 0x6d766864
-#define MJ2_TRAK 0x7472616b
-#define MJ2_TKHD 0x746b6864
-#define MJ2_MDIA 0x6d646961
-#define MJ2_MDHD 0x6d646864
-#define MJ2_MHDR 0x6d686472
-#define MJ2_HDLR 0x68646C72
-#define MJ2_MINF 0x6d696e66
-#define MJ2_VMHD 0x766d6864
-#define MJ2_SMHD 0x736d6864
-#define MJ2_HMHD 0x686d6864
-#define MJ2_DINF 0x64696e66
-#define MJ2_DREF 0x64726566
-#define MJ2_URL 0x75726c20
-#define MJ2_URN 0x75726e20
-#define MJ2_STBL 0x7374626c
-#define MJ2_STSD 0x73747364
-#define MJ2_STTS 0x73747473
-#define MJ2_STSC 0x73747363
-#define MJ2_STSZ 0x7374737a
-#define MJ2_STCO 0x7374636f
-#define MJ2_MOOF 0x6d6f6f66
-#define MJ2_FREE 0x66726565
-#define MJ2_SKIP 0x736b6970
-#define MJ2_JP2C 0x6a703263
-#define MJ2_FIEL 0x6669656c
-#define MJ2_JP2P 0x6a703270
-#define MJ2_JP2X 0x6a703278
-#define MJ2_JSUB 0x6a737562
-#define MJ2_ORFO 0x6f72666f
-#define MJ2_MVEX 0x6d766578
-#define MJ2_JP2 0x6a703220
-#define MJ2_J2P0 0x4a325030
-
-/**
-Decompressed format used in parameters
-YUV = 0
-*/
-#define YUV_DFMT 1
-
-/**
-Compressed format used in parameters
-MJ2 = 0
-*/
-#define MJ2_CFMT 2
-
-
-/* ----------------------------------------------------------------------- */
-
-/**
-Time To Sample
-*/
-typedef struct mj2_tts {
- int sample_count;
- int sample_delta;
-} mj2_tts_t;
-
-/**
-Chunk
-*/
-typedef struct mj2_chunk {
- unsigned int num_samples;
- int sample_descr_idx;
- int offset;
-} mj2_chunk_t;
-
-/**
-Sample to chunk
-*/
-typedef struct mj2_sampletochunk {
- unsigned int first_chunk;
- unsigned int samples_per_chunk;
- int sample_descr_idx;
-} mj2_sampletochunk_t;
-
-/**
-Sample
-*/
-typedef struct mj2_sample {
- unsigned int sample_size;
- unsigned int offset;
- unsigned int sample_delta;
-} mj2_sample_t;
-
-/**
-URL
-*/
-typedef struct mj2_url {
- int location[4];
-} mj2_url_t;
-
-/**
-URN
-*/
-typedef struct mj2_urn {
- int name[2];
- int location[4];
-} mj2_urn_t;
-
-/**
-Video Track Parameters
-*/
-typedef struct mj2_tk {
- /** codec context */
- opj_common_ptr cinfo;
- int track_ID;
- int track_type;
- unsigned int creation_time;
- unsigned int modification_time;
- int duration;
- int timescale;
- int layer;
- int volume;
- int language;
- int balance;
- int maxPDUsize;
- int avgPDUsize;
- int maxbitrate;
- int avgbitrate;
- int slidingavgbitrate;
- int graphicsmode;
- int opcolor[3];
- int num_url;
- mj2_url_t *url;
- int num_urn;
- mj2_urn_t *urn;
- int Dim[2];
- int w;
- int h;
- int visual_w;
- int visual_h;
- int CbCr_subsampling_dx;
- int CbCr_subsampling_dy;
- int sample_rate;
- int sample_description;
- int horizresolution;
- int vertresolution;
- int compressorname[8];
- int depth;
- unsigned char fieldcount;
- unsigned char fieldorder;
- unsigned char or_fieldcount;
- unsigned char or_fieldorder;
- int num_br;
- unsigned int *br;
- unsigned char num_jp2x;
- unsigned char *jp2xdata;
- unsigned char hsub;
- unsigned char vsub;
- unsigned char hoff;
- unsigned char voff;
- int trans_matrix[9];
- /** Number of samples */
- unsigned int num_samples;
- int transorm;
- int handler_type;
- int name_size;
- unsigned char same_sample_size;
- int num_tts;
- /** Time to sample */
- mj2_tts_t *tts;
- unsigned int num_chunks;
- mj2_chunk_t *chunk;
- unsigned int num_samplestochunk;
- mj2_sampletochunk_t *sampletochunk;
- char *name;
- opj_jp2_t jp2_struct;
- /** Sample parameters */
- mj2_sample_t *sample;
-} mj2_tk_t;
-
-/**
-MJ2 box
-*/
-typedef struct mj2_box {
- int length;
- int type;
- int init_pos;
-} mj2_box_t;
-
-/**
-MJ2 Movie
-*/
-typedef struct opj_mj2 {
- /** codec context */
- opj_common_ptr cinfo;
- /** handle to the J2K codec */
- opj_j2k_t *j2k;
- unsigned int brand;
- unsigned int minversion;
- int num_cl;
- unsigned int *cl;
- unsigned int creation_time;
- unsigned int modification_time;
- int timescale;
- unsigned int duration;
- int rate;
- int num_vtk;
- int num_stk;
- int num_htk;
- int volume;
- int trans_matrix[9];
- int next_tk_id;
- /** Track Parameters */
- mj2_tk_t *tk;
-} opj_mj2_t;
-
-/**
-Decompression parameters
-*/
-typedef struct mj2_dparameters {
- /**@name command line encoder parameters (not used inside the library) */
- /*@{*/
- /** input file name */
- char infile[OPJ_PATH_LEN];
- /** output file name */
- char outfile[OPJ_PATH_LEN];
- /** J2K decompression parameters */
- opj_dparameters_t j2k_parameters;
-} mj2_dparameters_t;
-
-/**
-Compression parameters
-*/
-typedef struct mj2_cparameters {
- /**@name command line encoder parameters (not used inside the library) */
- /*@{*/
- /** J2K compression parameters */
- opj_cparameters_t j2k_parameters;
- /** input file name */
- char infile[OPJ_PATH_LEN];
- /** output file name */
- char outfile[OPJ_PATH_LEN];
- /** input file format 0:MJ2 */
- int decod_format;
- /** output file format 0:YUV */
- int cod_format;
- /** Portion of the image coded */
- int Dim[2];
- /** YUV Frame width */
- int w;
- /** YUV Frame height */
- int h;
- /* Sample rate of YUV 4:4:4, 4:2:2 or 4:2:0 */
- int CbCr_subsampling_dx;
- /* Sample rate of YUV 4:4:4, 4:2:2 or 4:2:0 */
- int CbCr_subsampling_dy;
- /* Video Frame Rate */
- int frame_rate;
- /* In YUV files, numcomps always considered as 3 */
- int numcomps;
- /* In YUV files, precision always considered as 8 */
- int prec;
- unsigned int meth;
- unsigned int enumcs;
-} mj2_cparameters_t;
-
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Write the JP box
-*/
-OPJ_API void OPJ_CALLCONV mj2_write_jp(opj_cio_t *cio);
-/**
-Write the FTYP box
-@param movie MJ2 movie
-@param cio Output buffer stream
-*/
-OPJ_API void OPJ_CALLCONV mj2_write_ftyp(opj_mj2_t *movie, opj_cio_t *cio);
-/**
-Creates an MJ2 decompression structure
-@return Returns a handle to a MJ2 decompressor if successful, returns NULL otherwise
-*/
-OPJ_API opj_dinfo_t* OPJ_CALLCONV mj2_create_decompress();
-/**
-Destroy a MJ2 decompressor handle
-@param movie MJ2 decompressor handle to destroy
-*/
-OPJ_API void OPJ_CALLCONV mj2_destroy_decompress(opj_mj2_t *movie);
-/**
-Setup the decoder decoding parameters using user parameters.
-Decoding parameters are returned in mj2->j2k->cp.
-@param movie MJ2 decompressor handle
-@param mj2_parameters decompression parameters
-*/
-OPJ_API void OPJ_CALLCONV mj2_setup_decoder(opj_mj2_t *movie,
- mj2_dparameters_t *mj2_parameters);
-/**
-Decode an image from a JPEG-2000 file stream
-@param movie MJ2 decompressor handle
-@param cio Input buffer stream
-@return Returns a decoded image if successful, returns NULL otherwise
-*/
-opj_image_t* mj2_decode(opj_mj2_t *movie, opj_cio_t *cio);
-/**
-Creates a MJ2 compression structure
-@return Returns a handle to a MJ2 compressor if successful, returns NULL otherwise
-*/
-OPJ_API opj_cinfo_t* OPJ_CALLCONV mj2_create_compress();
-/**
-Destroy a MJ2 compressor handle
-@param movie MJ2 compressor handle to destroy
-*/
-OPJ_API void OPJ_CALLCONV mj2_destroy_compress(opj_mj2_t *movie);
-/**
-Setup the encoder parameters using the current image and using user parameters.
-Coding parameters are returned in mj2->j2k->cp.
-@param movie MJ2 compressor handle
-@param parameters compression parameters
-*/
-OPJ_API void OPJ_CALLCONV mj2_setup_encoder(opj_mj2_t *movie,
- mj2_cparameters_t *parameters);
-/**
-Encode an image into a JPEG-2000 file stream
-@param movie MJ2 compressor handle
-@param cio Output buffer stream
-@param image Image to encode
-@param index Name of the index file if required, NULL otherwise
-@return Returns true if successful, returns false otherwise
-*/
-opj_bool mj2_encode(opj_mj2_t *movie, opj_cio_t *cio, opj_image_t *image,
- char *index);
-
-/**
-Init a Standard MJ2 movie
-@param movie MJ2 Movie
-@return Returns 0 if successful, returns 1 otherwise
-*/
-OPJ_API int OPJ_CALLCONV mj2_init_stdmovie(opj_mj2_t *movie);
-/**
-Read the structure of an MJ2 file
-@param file MJ2 input File
-@param mj2 J2 movie structure
-@return Returns 0 if successful, returns 1 otherwise
-*/
-OPJ_API int OPJ_CALLCONV mj2_read_struct(FILE *file, opj_mj2_t *mj2);
-/**
-Write the MOOV box to an output buffer stream
-@param movie MJ2 movie structure
-@param cio Output buffer stream
-*/
-OPJ_API void OPJ_CALLCONV mj2_write_moov(opj_mj2_t *movie, opj_cio_t *cio);
-
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __MJ2_H */
+++ /dev/null
-/*
-* Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
-* Copyright (c) 2002-2014, Professor Benoit Macq
-* Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe
-* 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_includes.h"
-#include "mj2_convert.h"
-
-/* ----------------------- */
-/* */
-/* */
-/* Count the number of frames */
-/* in a YUV file */
-/* */
-/* ----------------------- */
-
-unsigned int OPJ_CALLCONV yuv_num_frames(mj2_tk_t * tk, char *infile)
-{
- unsigned int prec_size;
- long end_of_f, frame_size;
- FILE *f;
-
- f = fopen(infile, "rb");
- if (!f) {
- fprintf(stderr, "failed to open %s for reading\n", infile);
- return 0;
- }
- prec_size = (tk->depth + 7) / 8; /* bytes of precision */
-
- frame_size = (long)(tk->w * tk->h * (1.0 + (double) 2 / (double)(
- tk->CbCr_subsampling_dx *
- tk->CbCr_subsampling_dy))); /* Calculate frame size */
- frame_size *= prec_size;
-
- fseek(f, 0, SEEK_END);
- end_of_f = ftell(f); /* Calculate file size */
-
- if (end_of_f < frame_size) {
- fprintf(stderr,
- "YUV does not contains any frame of %d x %d size\n", tk->w,
- tk->h);
- fclose(f);
- return 0;
- }
- fclose(f);
-
- return (unsigned int)(end_of_f / frame_size);
-}
-
-/* ----------------------- */
-/* */
-/* */
-/* YUV to IMAGE */
-/* */
-/* ----------------------- */
-
-opj_image_t * OPJ_CALLCONV mj2_image_create(mj2_tk_t * tk,
- opj_cparameters_t *parameters)
-{
- opj_image_cmptparm_t cmptparm[3];
- opj_image_t * img;
- int i;
- int numcomps = 3;
- int subsampling_dx = parameters->subsampling_dx;
- int subsampling_dy = parameters->subsampling_dy;
-
- /* initialize image components */
- memset(&cmptparm[0], 0, 3 * sizeof(opj_image_cmptparm_t));
- for (i = 0; i < numcomps; i++) {
- cmptparm[i].prec = tk->depth;
- cmptparm[i].bpp = tk->depth;
- cmptparm[i].sgnd = 0;
- cmptparm[i].dx = i ? subsampling_dx * tk->CbCr_subsampling_dx : subsampling_dx;
- cmptparm[i].dy = i ? subsampling_dy * tk->CbCr_subsampling_dy : subsampling_dy;
- cmptparm[i].w = tk->w;
- cmptparm[i].h = tk->h;
- }
- /* create the image */
- img = opj_image_create(numcomps, cmptparm, CLRSPC_SRGB);
- return img;
-}
-
-char OPJ_CALLCONV yuvtoimage(mj2_tk_t * tk, opj_image_t * img, int frame_num,
- opj_cparameters_t *parameters, char* infile)
-{
- int i, compno;
- int offset, size, max, prec_bytes, is_16, v;
- long end_of_f, position;
- int numcomps = 3;
- int subsampling_dx = parameters->subsampling_dx;
- int subsampling_dy = parameters->subsampling_dy;
- FILE *yuvfile;
- int *data;
- unsigned char uc;
-
- yuvfile = fopen(infile, "rb");
- if (!yuvfile) {
- fprintf(stderr, "failed to open %s for readings\n", parameters->infile);
- return 1;
- }
- is_16 = (tk->depth > 8);
- prec_bytes = (is_16 ? 2 : 1);
-
- offset = (int)((double)(frame_num * tk->w * tk->h) * (1.0 +
- 1.0 * (double) 2 / (double)(tk->CbCr_subsampling_dx *
- tk->CbCr_subsampling_dy)));
- offset *= prec_bytes;
-
- fseek(yuvfile, 0, SEEK_END);
- end_of_f = ftell(yuvfile);
- fseek(yuvfile, sizeof(unsigned char) * offset, SEEK_SET);
- position = ftell(yuvfile);
- if (position >= end_of_f) {
- fprintf(stderr, "Cannot reach frame number %d in yuv file !!\n",
- frame_num);
- fclose(yuvfile);
- return 1;
- }
-
- img->x0 = tk->Dim[0];
- img->y0 = tk->Dim[1];
- img->x1 = !tk->Dim[0] ? (tk->w - 1) * subsampling_dx + 1 : tk->Dim[0] +
- (tk->w - 1) * subsampling_dx + 1;
- img->y1 = !tk->Dim[1] ? (tk->h - 1) * subsampling_dy + 1 : tk->Dim[1] +
- (tk->h - 1) * subsampling_dy + 1;
-
- size = tk->w * tk->h * prec_bytes;
-
- for (compno = 0; compno < numcomps; compno++) {
- max = size / (img->comps[compno].dx * img->comps[compno].dy);
- data = img->comps[compno].data;
-
- for (i = 0; i < max && !feof(yuvfile); i++) {
- v = 0;
- fread(&uc, 1, 1, yuvfile);
- v = uc;
-
- if (is_16) {
- fread(&uc, 1, 1, yuvfile);
- v |= (uc << 8);
- }
- *data++ = v;
- }
- }
- fclose(yuvfile);
-
- return 0;
-}
-
-
-
-/* ----------------------- */
-/* */
-/* */
-/* IMAGE to YUV */
-/* */
-/* ----------------------- */
-
-
-opj_bool OPJ_CALLCONV imagetoyuv(opj_image_t * img, char *outfile)
-{
- FILE *f;
- int *data;
- int i, v, is_16, prec_bytes;
- unsigned char buf[2];
-
- if (img->numcomps == 3) {
- if (img->comps[0].dx != img->comps[1].dx / 2
- || img->comps[1].dx != img->comps[2].dx) {
- fprintf(stderr,
- "Error with the input image components size: cannot create yuv file)\n");
- return OPJ_FALSE;
- }
- } else if (!(img->numcomps == 1)) {
- fprintf(stderr,
- "Error with the number of image components(must be one or three)\n");
- return OPJ_FALSE;
- }
-
- f = fopen(outfile, "a+b");
- if (!f) {
- fprintf(stderr, "failed to open %s for writing\n", outfile);
- return OPJ_FALSE;
- }
- is_16 = (img->comps[0].prec > 8);
- prec_bytes = (is_16 ? 2 : 1);
- data = img->comps[0].data;
-
- for (i = 0; i < (img->comps[0].w * img->comps[0].h); i++) {
- v = *data++;
- buf[0] = (unsigned char)v;
-
- if (is_16) {
- buf[1] = (unsigned char)(v >> 8);
- }
-
- fwrite(buf, 1, prec_bytes, f);
- }
-
-
- if (img->numcomps == 3) {
- data = img->comps[1].data;
-
- for (i = 0; i < (img->comps[1].w * img->comps[1].h); i++) {
- v = *data++;
- buf[0] = (unsigned char)v;
-
- if (is_16) {
- buf[1] = (unsigned char)(v >> 8);
- }
-
- fwrite(buf, 1, prec_bytes, f);
- }
- data = img->comps[2].data;
-
- for (i = 0; i < (img->comps[2].w * img->comps[2].h); i++) {
- v = *data++;
- buf[0] = (unsigned char)v;
-
- if (is_16) {
- buf[1] = (unsigned char)(v >> 8);
- }
-
- fwrite(buf, 1, prec_bytes, f);
- }
- } else if (img->numcomps == 1) {
- /* fake CbCr values */
- if (is_16) {
- buf[0] = 255;
- if (img->comps[0].prec == 10) {
- buf[1] = 1;
- } else if (img->comps[0].prec == 12) {
- buf[1] = 3;
- } else {
- buf[1] = 125;
- }
- } else {
- buf[0] = 125;
- }
-
- for (i = 0; i < (img->comps[0].w * img->comps[0].h * 0.25); i++) {
- fwrite(buf, 1, prec_bytes, f);
- }
-
-
- for (i = 0; i < (img->comps[0].w * img->comps[0].h * 0.25); i++) {
- fwrite(buf, 1, prec_bytes, f);
- }
- }
- fclose(f);
- return OPJ_TRUE;
-}
-
-/* ----------------------- */
-/* */
-/* */
-/* IMAGE to BMP */
-/* */
-/* ----------------------- */
-
-int OPJ_CALLCONV imagetobmp(opj_image_t * img, char *outfile)
-{
- int w, wr, h, hr, i, pad;
- FILE *f;
-
- if (img->numcomps == 3 && img->comps[0].dx == img->comps[1].dx
- && img->comps[1].dx == img->comps[2].dx
- && img->comps[0].dy == img->comps[1].dy
- && img->comps[1].dy == img->comps[2].dy
- && img->comps[0].prec == img->comps[1].prec
- && img->comps[1].prec == img->comps[2].prec) {
- /* -->> -->> -->> -->>
-
- 24 bits color
-
- <<-- <<-- <<-- <<-- */
-
- f = fopen(outfile, "wb");
- if (!f) {
- fprintf(stderr, "failed to open %s for writing\n", outfile);
- return 1;
- }
-
- w = img->comps[0].w;
- wr = int_ceildivpow2(img->comps[0].w, img->comps[0].factor);
-
- h = img->comps[0].h;
- hr = int_ceildivpow2(img->comps[0].h, img->comps[0].factor);
-
- fprintf(f, "BM");
-
- /* FILE HEADER */
- /* ------------- */
- fprintf(f, "%c%c%c%c",
- (unsigned char)(hr * wr * 3 + 3 * hr * (wr % 2) +
- 54) & 0xff,
- (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
- >> 8) & 0xff,
- (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
- >> 16) & 0xff,
- (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2) + 54)
- >> 24) & 0xff);
- fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
- ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
- fprintf(f, "%c%c%c%c", (54) & 0xff, ((54) >> 8) & 0xff,
- ((54) >> 16) & 0xff, ((54) >> 24) & 0xff);
-
- /* INFO HEADER */
- /* ------------- */
- fprintf(f, "%c%c%c%c", (40) & 0xff, ((40) >> 8) & 0xff,
- ((40) >> 16) & 0xff, ((40) >> 24) & 0xff);
- fprintf(f, "%c%c%c%c", (unsigned char)((wr) & 0xff),
- (unsigned char)((wr) >> 8) & 0xff,
- (unsigned char)((wr) >> 16) & 0xff,
- (unsigned char)((wr) >> 24) & 0xff);
- fprintf(f, "%c%c%c%c", (unsigned char)((hr) & 0xff),
- (unsigned char)((hr) >> 8) & 0xff,
- (unsigned char)((hr) >> 16) & 0xff,
- (unsigned char)((hr) >> 24) & 0xff);
- fprintf(f, "%c%c", (1) & 0xff, ((1) >> 8) & 0xff);
- fprintf(f, "%c%c", (24) & 0xff, ((24) >> 8) & 0xff);
- fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
- ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
- fprintf(f, "%c%c%c%c",
- (unsigned char)(3 * hr * wr +
- 3 * hr * (wr % 2)) & 0xff,
- (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2)) >>
- 8) & 0xff,
- (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2)) >>
- 16) & 0xff,
- (unsigned char)((hr * wr * 3 + 3 * hr * (wr % 2)) >>
- 24) & 0xff);
- fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
- ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
- fprintf(f, "%c%c%c%c", (7834) & 0xff, ((7834) >> 8) & 0xff,
- ((7834) >> 16) & 0xff, ((7834) >> 24) & 0xff);
- fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
- ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
- fprintf(f, "%c%c%c%c", (0) & 0xff, ((0) >> 8) & 0xff,
- ((0) >> 16) & 0xff, ((0) >> 24) & 0xff);
-
- for (i = 0; i < wr * hr; i++) {
- unsigned char R, G, B;
- /* a modifier */
- /* R = img->comps[0].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/
- R = img->comps[0].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
- /* G = img->comps[1].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/
- G = img->comps[1].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
- /* B = img->comps[2].data[w * h - ((i) / (w) + 1) * w + (i) % (w)];*/
- B = img->comps[2].data[w * hr - ((i) / (wr) + 1) * w + (i) % (wr)];
- fprintf(f, "%c%c%c", B, G, R);
-
- if ((i + 1) % wr == 0) {
- for (pad = (3 * wr) % 4 ? 4 - (3 * wr) % 4 : 0; pad > 0; pad--) { /* ADD */
- fprintf(f, "%c", 0);
- }
- }
- }
- fclose(f);
- }
- return 0;
-}
+++ /dev/null
-/*
-* 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 "mj2.h"
-
-#ifndef __MJ2_CONVERT_H
-#define __MJ2_CONVERT_H
-
-OPJ_API int OPJ_CALLCONV imagetoyuv(opj_image_t * img, char *outfile);
-
-OPJ_API int OPJ_CALLCONV imagetobmp(opj_image_t * img, char *outfile);
-
-OPJ_API opj_image_t * OPJ_CALLCONV mj2_image_create(mj2_tk_t * tk,
- opj_cparameters_t *parameters);
-
-OPJ_API char OPJ_CALLCONV yuvtoimage(mj2_tk_t * tk, opj_image_t * img,
- int frame_num, opj_cparameters_t *parameters, char* infile);
-
-OPJ_API unsigned int OPJ_CALLCONV yuv_num_frames(mj2_tk_t * tk, char *infile);
-
-
-#endif
+++ /dev/null
-/*
- * 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.
- */
-
-#include "opj_includes.h"
-
-/** @defgroup MQC MQC - Implementation of an MQ-Coder */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Output a byte, doing bit-stuffing if necessary.
-After a 0xff byte, the next byte must be smaller than 0x90.
-@param mqc MQC handle
-*/
-static void mqc_byteout(opj_mqc_t *mqc);
-/**
-Renormalize mqc->a and mqc->c while encoding, so that mqc->a stays between 0x8000 and 0x10000
-@param mqc MQC handle
-*/
-static void mqc_renorme(opj_mqc_t *mqc);
-/**
-Encode the most probable symbol
-@param mqc MQC handle
-*/
-static void mqc_codemps(opj_mqc_t *mqc);
-/**
-Encode the most least symbol
-@param mqc MQC handle
-*/
-static void mqc_codelps(opj_mqc_t *mqc);
-/**
-Fill mqc->c with 1's for flushing
-@param mqc MQC handle
-*/
-static void mqc_setbits(opj_mqc_t *mqc);
-/**
-FIXME: documentation ???
-@param mqc MQC handle
-@return
-*/
-static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc);
-/**
-FIXME: documentation ???
-@param mqc MQC handle
-@return
-*/
-static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc);
-/**
-Input a byte
-@param mqc MQC handle
-*/
-static INLINE void mqc_bytein(opj_mqc_t *const mqc);
-/**
-Renormalize mqc->a and mqc->c while decoding
-@param mqc MQC handle
-*/
-static INLINE void mqc_renormd(opj_mqc_t *const mqc);
-/*@}*/
-
-/*@}*/
-
-/* <summary> */
-/* This array defines all the possible states for a context. */
-/* </summary> */
-static opj_mqc_state_t mqc_states[47 * 2] = {
- {0x5601, 0, &mqc_states[2], &mqc_states[3]},
- {0x5601, 1, &mqc_states[3], &mqc_states[2]},
- {0x3401, 0, &mqc_states[4], &mqc_states[12]},
- {0x3401, 1, &mqc_states[5], &mqc_states[13]},
- {0x1801, 0, &mqc_states[6], &mqc_states[18]},
- {0x1801, 1, &mqc_states[7], &mqc_states[19]},
- {0x0ac1, 0, &mqc_states[8], &mqc_states[24]},
- {0x0ac1, 1, &mqc_states[9], &mqc_states[25]},
- {0x0521, 0, &mqc_states[10], &mqc_states[58]},
- {0x0521, 1, &mqc_states[11], &mqc_states[59]},
- {0x0221, 0, &mqc_states[76], &mqc_states[66]},
- {0x0221, 1, &mqc_states[77], &mqc_states[67]},
- {0x5601, 0, &mqc_states[14], &mqc_states[13]},
- {0x5601, 1, &mqc_states[15], &mqc_states[12]},
- {0x5401, 0, &mqc_states[16], &mqc_states[28]},
- {0x5401, 1, &mqc_states[17], &mqc_states[29]},
- {0x4801, 0, &mqc_states[18], &mqc_states[28]},
- {0x4801, 1, &mqc_states[19], &mqc_states[29]},
- {0x3801, 0, &mqc_states[20], &mqc_states[28]},
- {0x3801, 1, &mqc_states[21], &mqc_states[29]},
- {0x3001, 0, &mqc_states[22], &mqc_states[34]},
- {0x3001, 1, &mqc_states[23], &mqc_states[35]},
- {0x2401, 0, &mqc_states[24], &mqc_states[36]},
- {0x2401, 1, &mqc_states[25], &mqc_states[37]},
- {0x1c01, 0, &mqc_states[26], &mqc_states[40]},
- {0x1c01, 1, &mqc_states[27], &mqc_states[41]},
- {0x1601, 0, &mqc_states[58], &mqc_states[42]},
- {0x1601, 1, &mqc_states[59], &mqc_states[43]},
- {0x5601, 0, &mqc_states[30], &mqc_states[29]},
- {0x5601, 1, &mqc_states[31], &mqc_states[28]},
- {0x5401, 0, &mqc_states[32], &mqc_states[28]},
- {0x5401, 1, &mqc_states[33], &mqc_states[29]},
- {0x5101, 0, &mqc_states[34], &mqc_states[30]},
- {0x5101, 1, &mqc_states[35], &mqc_states[31]},
- {0x4801, 0, &mqc_states[36], &mqc_states[32]},
- {0x4801, 1, &mqc_states[37], &mqc_states[33]},
- {0x3801, 0, &mqc_states[38], &mqc_states[34]},
- {0x3801, 1, &mqc_states[39], &mqc_states[35]},
- {0x3401, 0, &mqc_states[40], &mqc_states[36]},
- {0x3401, 1, &mqc_states[41], &mqc_states[37]},
- {0x3001, 0, &mqc_states[42], &mqc_states[38]},
- {0x3001, 1, &mqc_states[43], &mqc_states[39]},
- {0x2801, 0, &mqc_states[44], &mqc_states[38]},
- {0x2801, 1, &mqc_states[45], &mqc_states[39]},
- {0x2401, 0, &mqc_states[46], &mqc_states[40]},
- {0x2401, 1, &mqc_states[47], &mqc_states[41]},
- {0x2201, 0, &mqc_states[48], &mqc_states[42]},
- {0x2201, 1, &mqc_states[49], &mqc_states[43]},
- {0x1c01, 0, &mqc_states[50], &mqc_states[44]},
- {0x1c01, 1, &mqc_states[51], &mqc_states[45]},
- {0x1801, 0, &mqc_states[52], &mqc_states[46]},
- {0x1801, 1, &mqc_states[53], &mqc_states[47]},
- {0x1601, 0, &mqc_states[54], &mqc_states[48]},
- {0x1601, 1, &mqc_states[55], &mqc_states[49]},
- {0x1401, 0, &mqc_states[56], &mqc_states[50]},
- {0x1401, 1, &mqc_states[57], &mqc_states[51]},
- {0x1201, 0, &mqc_states[58], &mqc_states[52]},
- {0x1201, 1, &mqc_states[59], &mqc_states[53]},
- {0x1101, 0, &mqc_states[60], &mqc_states[54]},
- {0x1101, 1, &mqc_states[61], &mqc_states[55]},
- {0x0ac1, 0, &mqc_states[62], &mqc_states[56]},
- {0x0ac1, 1, &mqc_states[63], &mqc_states[57]},
- {0x09c1, 0, &mqc_states[64], &mqc_states[58]},
- {0x09c1, 1, &mqc_states[65], &mqc_states[59]},
- {0x08a1, 0, &mqc_states[66], &mqc_states[60]},
- {0x08a1, 1, &mqc_states[67], &mqc_states[61]},
- {0x0521, 0, &mqc_states[68], &mqc_states[62]},
- {0x0521, 1, &mqc_states[69], &mqc_states[63]},
- {0x0441, 0, &mqc_states[70], &mqc_states[64]},
- {0x0441, 1, &mqc_states[71], &mqc_states[65]},
- {0x02a1, 0, &mqc_states[72], &mqc_states[66]},
- {0x02a1, 1, &mqc_states[73], &mqc_states[67]},
- {0x0221, 0, &mqc_states[74], &mqc_states[68]},
- {0x0221, 1, &mqc_states[75], &mqc_states[69]},
- {0x0141, 0, &mqc_states[76], &mqc_states[70]},
- {0x0141, 1, &mqc_states[77], &mqc_states[71]},
- {0x0111, 0, &mqc_states[78], &mqc_states[72]},
- {0x0111, 1, &mqc_states[79], &mqc_states[73]},
- {0x0085, 0, &mqc_states[80], &mqc_states[74]},
- {0x0085, 1, &mqc_states[81], &mqc_states[75]},
- {0x0049, 0, &mqc_states[82], &mqc_states[76]},
- {0x0049, 1, &mqc_states[83], &mqc_states[77]},
- {0x0025, 0, &mqc_states[84], &mqc_states[78]},
- {0x0025, 1, &mqc_states[85], &mqc_states[79]},
- {0x0015, 0, &mqc_states[86], &mqc_states[80]},
- {0x0015, 1, &mqc_states[87], &mqc_states[81]},
- {0x0009, 0, &mqc_states[88], &mqc_states[82]},
- {0x0009, 1, &mqc_states[89], &mqc_states[83]},
- {0x0005, 0, &mqc_states[90], &mqc_states[84]},
- {0x0005, 1, &mqc_states[91], &mqc_states[85]},
- {0x0001, 0, &mqc_states[90], &mqc_states[86]},
- {0x0001, 1, &mqc_states[91], &mqc_states[87]},
- {0x5601, 0, &mqc_states[92], &mqc_states[92]},
- {0x5601, 1, &mqc_states[93], &mqc_states[93]},
-};
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-static void mqc_byteout(opj_mqc_t *mqc)
-{
- if (*mqc->bp == 0xff) {
- mqc->bp++;
- *mqc->bp = mqc->c >> 20;
- mqc->c &= 0xfffff;
- mqc->ct = 7;
- } else {
- if ((mqc->c & 0x8000000) == 0) { /* ((mqc->c&0x8000000)==0) CHANGE */
- mqc->bp++;
- *mqc->bp = mqc->c >> 19;
- mqc->c &= 0x7ffff;
- mqc->ct = 8;
- } else {
- (*mqc->bp)++;
- if (*mqc->bp == 0xff) {
- mqc->c &= 0x7ffffff;
- mqc->bp++;
- *mqc->bp = mqc->c >> 20;
- mqc->c &= 0xfffff;
- mqc->ct = 7;
- } else {
- mqc->bp++;
- *mqc->bp = mqc->c >> 19;
- mqc->c &= 0x7ffff;
- mqc->ct = 8;
- }
- }
- }
-}
-
-static void mqc_renorme(opj_mqc_t *mqc)
-{
- do {
- mqc->a <<= 1;
- mqc->c <<= 1;
- mqc->ct--;
- if (mqc->ct == 0) {
- mqc_byteout(mqc);
- }
- } while ((mqc->a & 0x8000) == 0);
-}
-
-static void mqc_codemps(opj_mqc_t *mqc)
-{
- mqc->a -= (*mqc->curctx)->qeval;
- if ((mqc->a & 0x8000) == 0) {
- if (mqc->a < (*mqc->curctx)->qeval) {
- mqc->a = (*mqc->curctx)->qeval;
- } else {
- mqc->c += (*mqc->curctx)->qeval;
- }
- *mqc->curctx = (*mqc->curctx)->nmps;
- mqc_renorme(mqc);
- } else {
- mqc->c += (*mqc->curctx)->qeval;
- }
-}
-
-static void mqc_codelps(opj_mqc_t *mqc)
-{
- mqc->a -= (*mqc->curctx)->qeval;
- if (mqc->a < (*mqc->curctx)->qeval) {
- mqc->c += (*mqc->curctx)->qeval;
- } else {
- mqc->a = (*mqc->curctx)->qeval;
- }
- *mqc->curctx = (*mqc->curctx)->nlps;
- mqc_renorme(mqc);
-}
-
-static void mqc_setbits(opj_mqc_t *mqc)
-{
- unsigned int tempc = mqc->c + mqc->a;
- mqc->c |= 0xffff;
- if (mqc->c >= tempc) {
- mqc->c -= 0x8000;
- }
-}
-
-static INLINE int mqc_mpsexchange(opj_mqc_t *const mqc)
-{
- int d;
- if (mqc->a < (*mqc->curctx)->qeval) {
- d = 1 - (*mqc->curctx)->mps;
- *mqc->curctx = (*mqc->curctx)->nlps;
- } else {
- d = (*mqc->curctx)->mps;
- *mqc->curctx = (*mqc->curctx)->nmps;
- }
-
- return d;
-}
-
-static INLINE int mqc_lpsexchange(opj_mqc_t *const mqc)
-{
- int d;
- if (mqc->a < (*mqc->curctx)->qeval) {
- mqc->a = (*mqc->curctx)->qeval;
- d = (*mqc->curctx)->mps;
- *mqc->curctx = (*mqc->curctx)->nmps;
- } else {
- mqc->a = (*mqc->curctx)->qeval;
- d = 1 - (*mqc->curctx)->mps;
- *mqc->curctx = (*mqc->curctx)->nlps;
- }
-
- return d;
-}
-
-#ifdef MQC_PERF_OPT
-static INLINE void mqc_bytein(opj_mqc_t *const mqc)
-{
- unsigned int i = *((unsigned int *) mqc->bp);
- mqc->c += i & 0xffff00;
- mqc->ct = i & 0x0f;
- mqc->bp += (i >> 2) & 0x04;
-}
-#else
-static void mqc_bytein(opj_mqc_t *const mqc)
-{
- if (mqc->bp != mqc->end) {
- unsigned int c;
- if (mqc->bp + 1 != mqc->end) {
- c = *(mqc->bp + 1);
- } else {
- c = 0xff;
- }
- if (*mqc->bp == 0xff) {
- if (c > 0x8f) {
- mqc->c += 0xff00;
- mqc->ct = 8;
- } else {
- mqc->bp++;
- mqc->c += c << 9;
- mqc->ct = 7;
- }
- } else {
- mqc->bp++;
- mqc->c += c << 8;
- mqc->ct = 8;
- }
- } else {
- mqc->c += 0xff00;
- mqc->ct = 8;
- }
-}
-#endif
-
-static INLINE void mqc_renormd(opj_mqc_t *const mqc)
-{
- do {
- if (mqc->ct == 0) {
- mqc_bytein(mqc);
- }
- mqc->a <<= 1;
- mqc->c <<= 1;
- mqc->ct--;
- } while (mqc->a < 0x8000);
-}
-
-/*
-==========================================================
- MQ-Coder interface
-==========================================================
-*/
-
-opj_mqc_t* mqc_create(void)
-{
- opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
-#ifdef MQC_PERF_OPT
- mqc->buffer = NULL;
-#endif
- return mqc;
-}
-
-void mqc_destroy(opj_mqc_t *mqc)
-{
- if (mqc) {
-#ifdef MQC_PERF_OPT
- if (mqc->buffer) {
- opj_free(mqc->buffer);
- }
-#endif
- opj_free(mqc);
- }
-}
-
-int mqc_numbytes(opj_mqc_t *mqc)
-{
- return mqc->bp - mqc->start;
-}
-
-void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp)
-{
- mqc_setcurctx(mqc, 0);
- mqc->a = 0x8000;
- mqc->c = 0;
- mqc->bp = bp - 1;
- mqc->ct = 12;
- if (*mqc->bp == 0xff) {
- mqc->ct = 13;
- }
- mqc->start = bp;
-}
-
-void mqc_encode(opj_mqc_t *mqc, int d)
-{
- if ((*mqc->curctx)->mps == d) {
- mqc_codemps(mqc);
- } else {
- mqc_codelps(mqc);
- }
-}
-
-void mqc_flush(opj_mqc_t *mqc)
-{
- mqc_setbits(mqc);
- mqc->c <<= mqc->ct;
- mqc_byteout(mqc);
- mqc->c <<= mqc->ct;
- mqc_byteout(mqc);
-
- if (*mqc->bp != 0xff) {
- mqc->bp++;
- }
-}
-
-void mqc_bypass_init_enc(opj_mqc_t *mqc)
-{
- mqc->c = 0;
- mqc->ct = 8;
- /*if (*mqc->bp == 0xff) {
- mqc->ct = 7;
- } */
-}
-
-void mqc_bypass_enc(opj_mqc_t *mqc, int d)
-{
- mqc->ct--;
- mqc->c = mqc->c + (d << mqc->ct);
- if (mqc->ct == 0) {
- mqc->bp++;
- *mqc->bp = mqc->c;
- mqc->ct = 8;
- if (*mqc->bp == 0xff) {
- mqc->ct = 7;
- }
- mqc->c = 0;
- }
-}
-
-int mqc_bypass_flush_enc(opj_mqc_t *mqc)
-{
- unsigned char bit_padding;
-
- bit_padding = 0;
-
- if (mqc->ct != 0) {
- while (mqc->ct > 0) {
- mqc->ct--;
- mqc->c += bit_padding << mqc->ct;
- bit_padding = (bit_padding + 1) & 0x01;
- }
- mqc->bp++;
- *mqc->bp = mqc->c;
- mqc->ct = 8;
- mqc->c = 0;
- }
-
- return 1;
-}
-
-void mqc_reset_enc(opj_mqc_t *mqc)
-{
- mqc_resetstates(mqc);
- mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
- mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
- mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
-}
-
-int mqc_restart_enc(opj_mqc_t *mqc)
-{
- int correction = 1;
-
- /* <flush part> */
- int n = 27 - 15 - mqc->ct;
- mqc->c <<= mqc->ct;
- while (n > 0) {
- mqc_byteout(mqc);
- n -= mqc->ct;
- mqc->c <<= mqc->ct;
- }
- mqc_byteout(mqc);
-
- return correction;
-}
-
-void mqc_restart_init_enc(opj_mqc_t *mqc)
-{
- /* <Re-init part> */
- mqc_setcurctx(mqc, 0);
- mqc->a = 0x8000;
- mqc->c = 0;
- mqc->ct = 12;
- mqc->bp--;
- if (*mqc->bp == 0xff) {
- mqc->ct = 13;
- }
-}
-
-void mqc_erterm_enc(opj_mqc_t *mqc)
-{
- int k = 11 - mqc->ct + 1;
-
- while (k > 0) {
- mqc->c <<= mqc->ct;
- mqc->ct = 0;
- mqc_byteout(mqc);
- k -= mqc->ct;
- }
-
- if (*mqc->bp != 0xff) {
- mqc_byteout(mqc);
- }
-}
-
-void mqc_segmark_enc(opj_mqc_t *mqc)
-{
- int i;
- mqc_setcurctx(mqc, 18);
-
- for (i = 1; i < 5; i++) {
- mqc_encode(mqc, i % 2);
- }
-}
-
-void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len)
-{
- mqc_setcurctx(mqc, 0);
- mqc->start = bp;
- mqc->end = bp + len;
- mqc->bp = bp;
- if (len == 0) {
- mqc->c = 0xff << 16;
- } else {
- mqc->c = *mqc->bp << 16;
- }
-
-#ifdef MQC_PERF_OPT
- {
- unsigned int c;
- unsigned int *ip;
- unsigned char *end = mqc->end - 1;
- mqc->buffer = opj_realloc(mqc->buffer, (len + 1) * sizeof(unsigned int));
- ip = (unsigned int *) mqc->buffer;
-
- while (bp < end) {
- c = *(bp + 1);
- if (*bp == 0xff) {
- if (c > 0x8f) {
- break;
- } else {
- *ip = 0x00000017 | (c << 9);
- }
- } else {
- *ip = 0x00000018 | (c << 8);
- }
- bp++;
- ip++;
- }
-
- /* Handle last byte of data */
- c = 0xff;
- if (*bp == 0xff) {
- *ip = 0x0000ff18;
- } else {
- bp++;
- *ip = 0x00000018 | (c << 8);
- }
- ip++;
-
- *ip = 0x0000ff08;
- mqc->bp = mqc->buffer;
- }
-#endif
- mqc_bytein(mqc);
- mqc->c <<= 7;
- mqc->ct -= 7;
- mqc->a = 0x8000;
-}
-
-int mqc_decode(opj_mqc_t *const mqc)
-{
- int d;
- mqc->a -= (*mqc->curctx)->qeval;
- if ((mqc->c >> 16) < (*mqc->curctx)->qeval) {
- d = mqc_lpsexchange(mqc);
- mqc_renormd(mqc);
- } else {
- mqc->c -= (*mqc->curctx)->qeval << 16;
- if ((mqc->a & 0x8000) == 0) {
- d = mqc_mpsexchange(mqc);
- mqc_renormd(mqc);
- } else {
- d = (*mqc->curctx)->mps;
- }
- }
-
- return d;
-}
-
-void mqc_resetstates(opj_mqc_t *mqc)
-{
- int i;
- for (i = 0; i < MQC_NUMCTXS; i++) {
- mqc->ctxs[i] = mqc_states;
- }
-}
-
-void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob)
-{
- mqc->ctxs[ctxno] = &mqc_states[msb + (prob << 1)];
-}
-
-
+++ /dev/null
-/*
- * 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 __MQC_H
-#define __MQC_H
-/**
-@file mqc.h
-@brief Implementation of an MQ-Coder (MQC)
-
-The functions in MQC.C have for goal to realize the MQ-coder operations. The functions
-in MQC.C are used by some function in T1.C.
-*/
-
-/** @defgroup MQC MQC - Implementation of an MQ-Coder */
-/*@{*/
-
-/**
-This struct defines the state of a context.
-*/
-typedef struct opj_mqc_state {
- /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
- unsigned int qeval;
- /** the Most Probable Symbol (0 or 1) */
- int mps;
- /** next state if the next encoded symbol is the MPS */
- struct opj_mqc_state *nmps;
- /** next state if the next encoded symbol is the LPS */
- struct opj_mqc_state *nlps;
-} opj_mqc_state_t;
-
-#define MQC_NUMCTXS 19
-
-/**
-MQ coder
-*/
-typedef struct opj_mqc {
- unsigned int c;
- unsigned int a;
- unsigned int ct;
- unsigned char *bp;
- unsigned char *start;
- unsigned char *end;
- opj_mqc_state_t *ctxs[MQC_NUMCTXS];
- opj_mqc_state_t **curctx;
-#ifdef MQC_PERF_OPT
- unsigned char *buffer;
-#endif
-} opj_mqc_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a new MQC handle
-@return Returns a new MQC handle if successful, returns NULL otherwise
-*/
-opj_mqc_t* mqc_create(void);
-/**
-Destroy a previously created MQC handle
-@param mqc MQC handle to destroy
-*/
-void mqc_destroy(opj_mqc_t *mqc);
-/**
-Return the number of bytes written/read since initialisation
-@param mqc MQC handle
-@return Returns the number of bytes already encoded
-*/
-int mqc_numbytes(opj_mqc_t *mqc);
-/**
-Reset the states of all the context of the coder/decoder
-(each context is set to a state where 0 and 1 are more or less equiprobable)
-@param mqc MQC handle
-*/
-void mqc_resetstates(opj_mqc_t *mqc);
-/**
-Set the state of a particular context
-@param mqc MQC handle
-@param ctxno Number that identifies the context
-@param msb The MSB of the new state of the context
-@param prob Number that identifies the probability of the symbols for the new state of the context
-*/
-void mqc_setstate(opj_mqc_t *mqc, int ctxno, int msb, int prob);
-/**
-Initialize the encoder
-@param mqc MQC handle
-@param bp Pointer to the start of the buffer where the bytes will be written
-*/
-void mqc_init_enc(opj_mqc_t *mqc, unsigned char *bp);
-/**
-Set the current context used for coding/decoding
-@param mqc MQC handle
-@param ctxno Number that identifies the context
-*/
-#define mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(int)(ctxno)]
-/**
-Encode a symbol using the MQ-coder
-@param mqc MQC handle
-@param d The symbol to be encoded (0 or 1)
-*/
-void mqc_encode(opj_mqc_t *mqc, int d);
-/**
-Flush the encoder, so that all remaining data is written
-@param mqc MQC handle
-*/
-void mqc_flush(opj_mqc_t *mqc);
-/**
-BYPASS mode switch, initialization operation.
-JPEG 2000 p 505.
-<h2>Not fully implemented and tested !!</h2>
-@param mqc MQC handle
-*/
-void mqc_bypass_init_enc(opj_mqc_t *mqc);
-/**
-BYPASS mode switch, coding operation.
-JPEG 2000 p 505.
-<h2>Not fully implemented and tested !!</h2>
-@param mqc MQC handle
-@param d The symbol to be encoded (0 or 1)
-*/
-void mqc_bypass_enc(opj_mqc_t *mqc, int d);
-/**
-BYPASS mode switch, flush operation
-<h2>Not fully implemented and tested !!</h2>
-@param mqc MQC handle
-@return Returns 1 (always)
-*/
-int mqc_bypass_flush_enc(opj_mqc_t *mqc);
-/**
-RESET mode switch
-@param mqc MQC handle
-*/
-void mqc_reset_enc(opj_mqc_t *mqc);
-/**
-RESTART mode switch (TERMALL)
-@param mqc MQC handle
-@return Returns 1 (always)
-*/
-int mqc_restart_enc(opj_mqc_t *mqc);
-/**
-RESTART mode switch (TERMALL) reinitialisation
-@param mqc MQC handle
-*/
-void mqc_restart_init_enc(opj_mqc_t *mqc);
-/**
-ERTERM mode switch (PTERM)
-@param mqc MQC handle
-*/
-void mqc_erterm_enc(opj_mqc_t *mqc);
-/**
-SEGMARK mode switch (SEGSYM)
-@param mqc MQC handle
-*/
-void mqc_segmark_enc(opj_mqc_t *mqc);
-/**
-Initialize the decoder
-@param mqc MQC handle
-@param bp Pointer to the start of the buffer from which the bytes will be read
-@param len Length of the input buffer
-*/
-void mqc_init_dec(opj_mqc_t *mqc, unsigned char *bp, int len);
-/**
-Decode a symbol
-@param mqc MQC handle
-@return Returns the decoded symbol (0 or 1)
-*/
-int mqc_decode(opj_mqc_t *const mqc);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __MQC_H */
+++ /dev/null
-/*
- * 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) 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.
- */
-
-#ifdef _WIN32
-#include <windows.h>
-#endif /* _WIN32 */
-
-#include "opj_config_private.h"
-#include "opj_includes.h"
-
-/* ---------------------------------------------------------------------- */
-#ifdef _WIN32
-#ifndef OPJ_STATIC
-BOOL APIENTRY
-DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
-{
-
- OPJ_ARG_NOT_USED(lpReserved);
- OPJ_ARG_NOT_USED(hModule);
-
- switch (ul_reason_for_call) {
- case DLL_PROCESS_ATTACH :
- break;
- case DLL_PROCESS_DETACH :
- break;
- case DLL_THREAD_ATTACH :
- case DLL_THREAD_DETACH :
- break;
- }
-
- return TRUE;
-}
-#endif /* OPJ_STATIC */
-#endif /* _WIN32 */
-
-/* ---------------------------------------------------------------------- */
-
-
-const char* OPJ_CALLCONV opj_version(void)
-{
- return OPJ_PACKAGE_VERSION;
-}
-
-opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(OPJ_CODEC_FORMAT format)
-{
- opj_dinfo_t *dinfo = (opj_dinfo_t*)opj_calloc(1, sizeof(opj_dinfo_t));
- if (!dinfo) {
- return NULL;
- }
- dinfo->is_decompressor = OPJ_TRUE;
- switch (format) {
- case CODEC_J2K:
- case CODEC_JPT:
- /* get a J2K decoder handle */
- dinfo->j2k_handle = (void*)j2k_create_decompress((opj_common_ptr)dinfo);
- if (!dinfo->j2k_handle) {
- opj_free(dinfo);
- return NULL;
- }
- break;
- case CODEC_JP2:
- /* get a JP2 decoder handle */
- dinfo->jp2_handle = (void*)jp2_create_decompress((opj_common_ptr)dinfo);
- if (!dinfo->jp2_handle) {
- opj_free(dinfo);
- return NULL;
- }
- break;
- case CODEC_UNKNOWN:
- default:
- opj_free(dinfo);
- return NULL;
- }
-
- dinfo->codec_format = format;
-
- return dinfo;
-}
-
-void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo)
-{
- if (dinfo) {
- /* destroy the codec */
- switch (dinfo->codec_format) {
- case CODEC_J2K:
- case CODEC_JPT:
- j2k_destroy_decompress((opj_j2k_t*)dinfo->j2k_handle);
- break;
- case CODEC_JP2:
- jp2_destroy_decompress((opj_jp2_t*)dinfo->jp2_handle);
- break;
- case CODEC_UNKNOWN:
- default:
- break;
- }
- /* destroy the decompressor */
- opj_free(dinfo);
- }
-}
-
-void OPJ_CALLCONV opj_set_default_decoder_parameters(opj_dparameters_t
- *parameters)
-{
- if (parameters) {
- memset(parameters, 0, sizeof(opj_dparameters_t));
- /* default decoding parameters */
- parameters->cp_layer = 0;
- parameters->cp_reduce = 0;
- parameters->cp_limit_decoding = NO_LIMITATION;
-
- parameters->decod_format = -1;
- parameters->cod_format = -1;
- parameters->flags = 0;
- /* UniPG>> */
-#ifdef USE_JPWL
- parameters->jpwl_correct = OPJ_FALSE;
- parameters->jpwl_exp_comps = JPWL_EXPECTED_COMPONENTS;
- parameters->jpwl_max_tiles = JPWL_MAXIMUM_TILES;
-#endif /* USE_JPWL */
- /* <<UniPG */
- }
-}
-
-void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo,
- opj_dparameters_t *parameters)
-{
- if (dinfo && parameters) {
- switch (dinfo->codec_format) {
- case CODEC_J2K:
- case CODEC_JPT:
- j2k_setup_decoder((opj_j2k_t*)dinfo->j2k_handle, parameters);
- break;
- case CODEC_JP2:
- jp2_setup_decoder((opj_jp2_t*)dinfo->jp2_handle, parameters);
- break;
- case CODEC_UNKNOWN:
- default:
- break;
- }
- }
-}
-
-opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo, opj_cio_t *cio)
-{
- return opj_decode_with_info(dinfo, cio, NULL);
-}
-
-opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo,
- opj_cio_t *cio, opj_codestream_info_t *cstr_info)
-{
- if (dinfo && cio) {
- switch (dinfo->codec_format) {
- case CODEC_J2K:
- return j2k_decode((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info);
- case CODEC_JPT:
- return j2k_decode_jpt_stream((opj_j2k_t*)dinfo->j2k_handle, cio, cstr_info);
- case CODEC_JP2:
- return opj_jp2_decode((opj_jp2_t*)dinfo->jp2_handle, cio, cstr_info);
- case CODEC_UNKNOWN:
- default:
- break;
- }
- }
- return NULL;
-}
-
-opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format)
-{
- opj_cinfo_t *cinfo = (opj_cinfo_t*)opj_calloc(1, sizeof(opj_cinfo_t));
- if (!cinfo) {
- return NULL;
- }
- cinfo->is_decompressor = OPJ_FALSE;
- switch (format) {
- case CODEC_J2K:
- /* get a J2K coder handle */
- cinfo->j2k_handle = (void*)j2k_create_compress((opj_common_ptr)cinfo);
- if (!cinfo->j2k_handle) {
- opj_free(cinfo);
- return NULL;
- }
- break;
- case CODEC_JP2:
- /* get a JP2 coder handle */
- cinfo->jp2_handle = (void*)jp2_create_compress((opj_common_ptr)cinfo);
- if (!cinfo->jp2_handle) {
- opj_free(cinfo);
- return NULL;
- }
- break;
- case CODEC_JPT:
- case CODEC_UNKNOWN:
- default:
- opj_free(cinfo);
- return NULL;
- }
-
- cinfo->codec_format = format;
-
- return cinfo;
-}
-
-void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo)
-{
- if (cinfo) {
- /* destroy the codec */
- switch (cinfo->codec_format) {
- case CODEC_J2K:
- j2k_destroy_compress((opj_j2k_t*)cinfo->j2k_handle);
- break;
- case CODEC_JP2:
- jp2_destroy_compress((opj_jp2_t*)cinfo->jp2_handle);
- break;
- case CODEC_JPT:
- case CODEC_UNKNOWN:
- default:
- break;
- }
- /* destroy the decompressor */
- opj_free(cinfo);
- }
-}
-
-void OPJ_CALLCONV opj_set_default_encoder_parameters(opj_cparameters_t
- *parameters)
-{
- if (parameters) {
- memset(parameters, 0, sizeof(opj_cparameters_t));
- /* default coding parameters */
- parameters->cp_cinema = OFF;
- parameters->max_comp_size = 0;
- parameters->numresolution = 6;
- parameters->cp_rsiz = STD_RSIZ;
- parameters->cblockw_init = 64;
- parameters->cblockh_init = 64;
- parameters->prog_order = LRCP;
- parameters->roi_compno = -1; /* no ROI */
- parameters->subsampling_dx = 1;
- parameters->subsampling_dy = 1;
- parameters->tp_on = 0;
- parameters->decod_format = -1;
- parameters->cod_format = -1;
- parameters->tcp_rates[0] = 0;
- parameters->tcp_numlayers = 0;
- parameters->cp_disto_alloc = 0;
- parameters->cp_fixed_alloc = 0;
- parameters->cp_fixed_quality = 0;
- /* UniPG>> */
-#ifdef USE_JPWL
- parameters->jpwl_epc_on = OPJ_FALSE;
- parameters->jpwl_hprot_MH = -1; /* -1 means unassigned */
- {
- int i;
- for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
- parameters->jpwl_hprot_TPH_tileno[i] = -1; /* unassigned */
- parameters->jpwl_hprot_TPH[i] = 0; /* absent */
- }
- };
- {
- int i;
- for (i = 0; i < JPWL_MAX_NO_PACKSPECS; i++) {
- parameters->jpwl_pprot_tileno[i] = -1; /* unassigned */
- parameters->jpwl_pprot_packno[i] = -1; /* unassigned */
- parameters->jpwl_pprot[i] = 0; /* absent */
- }
- };
- parameters->jpwl_sens_size = 0; /* 0 means no ESD */
- parameters->jpwl_sens_addr = 0; /* 0 means auto */
- parameters->jpwl_sens_range = 0; /* 0 means packet */
- parameters->jpwl_sens_MH = -1; /* -1 means unassigned */
- {
- int i;
- for (i = 0; i < JPWL_MAX_NO_TILESPECS; i++) {
- parameters->jpwl_sens_TPH_tileno[i] = -1; /* unassigned */
- parameters->jpwl_sens_TPH[i] = -1; /* absent */
- }
- };
-#endif /* USE_JPWL */
- /* <<UniPG */
- }
-}
-
-void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo,
- opj_cparameters_t *parameters, opj_image_t *image)
-{
- if (cinfo && parameters && image) {
- switch (cinfo->codec_format) {
- case CODEC_J2K:
- j2k_setup_encoder((opj_j2k_t*)cinfo->j2k_handle, parameters, image);
- break;
- case CODEC_JP2:
- jp2_setup_encoder((opj_jp2_t*)cinfo->jp2_handle, parameters, image);
- break;
- case CODEC_JPT:
- case CODEC_UNKNOWN:
- default:
- break;
- }
- }
-}
-
-opj_bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio,
- opj_image_t *image, char *index)
-{
- if (index != NULL)
- opj_event_msg((opj_common_ptr)cinfo, EVT_WARNING,
- "Set index to NULL when calling the opj_encode function.\n"
- "To extract the index, use the opj_encode_with_info() function.\n"
- "No index will be generated during this encoding\n");
- return opj_encode_with_info(cinfo, cio, image, NULL);
-}
-
-opj_bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo, opj_cio_t *cio,
- opj_image_t *image, opj_codestream_info_t *cstr_info)
-{
- if (cinfo && cio && image) {
- switch (cinfo->codec_format) {
- case CODEC_J2K:
- return j2k_encode((opj_j2k_t*)cinfo->j2k_handle, cio, image, cstr_info);
- case CODEC_JP2:
- return opj_jp2_encode((opj_jp2_t*)cinfo->jp2_handle, cio, image, cstr_info);
- case CODEC_JPT:
- case CODEC_UNKNOWN:
- default:
- break;
- }
- }
- return OPJ_FALSE;
-}
-
-void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t *cstr_info)
-{
- if (cstr_info) {
- int tileno;
- for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
- opj_tile_info_t *tile_info = &cstr_info->tile[tileno];
- opj_free(tile_info->thresh);
- opj_free(tile_info->packet);
- opj_free(tile_info->tp);
- opj_free(tile_info->marker);
- }
- opj_free(cstr_info->tile);
- opj_free(cstr_info->marker);
- opj_free(cstr_info->numdecompos);
- }
-}
-
-void* OPJ_CALLCONV opj_image_data_alloc(size_t size)
-{
- /* NOTE: this defers from libopenjp2 where we use opj_aligned_malloc */
- void* ret = opj_malloc(size);
- /* printf("opj_image_data_alloc %p\n", ret); */
- return ret;
-}
-
-void OPJ_CALLCONV opj_image_data_free(void* ptr)
-{
- /* NOTE: this defers from libopenjp2 where we use opj_aligned_free */
- /* printf("opj_image_data_free %p\n", ptr); */
- opj_free(ptr);
-}
+++ /dev/null
-/*
-* 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
-* Copyright (c) 2010-2011, Kaori Hagihara
-* 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 OPENJPEG_H
-#define OPENJPEG_H
-
-/*
-==========================================================
- Compiler directives
-==========================================================
-*/
-
-#if defined(OPJ_STATIC) || !defined(_WIN32)
-/* http://gcc.gnu.org/wiki/Visibility */
-#if __GNUC__ >= 4
-#define OPJ_API __attribute__ ((visibility ("default")))
-#define OPJ_LOCAL __attribute__ ((visibility ("hidden")))
-#else
-#define OPJ_API
-#define OPJ_LOCAL
-#endif
-#define OPJ_CALLCONV
-#else
-#define OPJ_CALLCONV __stdcall
-/*
-The following ifdef block is the standard way of creating macros which make exporting
-from a DLL simpler. All files within this DLL are compiled with the OPJ_EXPORTS
-symbol defined on the command line. this symbol should not be defined on any project
-that uses this DLL. This way any other project whose source files include this file see
-OPJ_API functions as being imported from a DLL, whereas this DLL sees symbols
-defined with this macro as being exported.
-*/
-#if defined(OPJ_EXPORTS) || defined(DLL_EXPORT)
-#define OPJ_API __declspec(dllexport)
-#else
-#define OPJ_API __declspec(dllimport)
-#endif /* OPJ_EXPORTS */
-#endif /* !OPJ_STATIC || !_WIN32 */
-
-typedef int opj_bool;
-#define OPJ_TRUE 1
-#define OPJ_FALSE 0
-
-/* Avoid compile-time warning because parameter is not used */
-#define OPJ_ARG_NOT_USED(x) (void)(x)
-/*
-==========================================================
- Useful constant definitions
-==========================================================
-*/
-
-#define OPJ_PATH_LEN 4096 /**< Maximum allowed size for filenames */
-
-#define J2K_MAXRLVLS 33 /**< Number of maximum resolution level authorized */
-#define J2K_MAXBANDS (3*J2K_MAXRLVLS-2) /**< Number of maximum sub-band linked to number of resolution level */
-
-/* UniPG>> */
-#define JPWL_MAX_NO_TILESPECS 16 /**< Maximum number of tile parts expected by JPWL: increase at your will */
-#define JPWL_MAX_NO_PACKSPECS 16 /**< Maximum number of packet parts expected by JPWL: increase at your will */
-#define JPWL_MAX_NO_MARKERS 512 /**< Maximum number of JPWL markers: increase at your will */
-#define JPWL_PRIVATEINDEX_NAME "jpwl_index_privatefilename" /**< index file name used when JPWL is on */
-#define JPWL_EXPECTED_COMPONENTS 3 /**< Expect this number of components, so you'll find better the first EPB */
-#define JPWL_MAXIMUM_TILES 8192 /**< Expect this maximum number of tiles, to avoid some crashes */
-#define JPWL_MAXIMUM_HAMMING 2 /**< Expect this maximum number of bit errors in marker id's */
-#define JPWL_MAXIMUM_EPB_ROOM 65450 /**< Expect this maximum number of bytes for composition of EPBs */
-/* <<UniPG */
-
-/*
-==========================================================
- enum definitions
-==========================================================
-*/
-/**
-Rsiz Capabilities
-*/
-typedef enum RSIZ_CAPABILITIES {
- STD_RSIZ = 0, /** Standard JPEG2000 profile*/
- CINEMA2K = 3, /** Profile name for a 2K image*/
- CINEMA4K = 4 /** Profile name for a 4K image*/
-} OPJ_RSIZ_CAPABILITIES;
-
-/**
-Digital cinema operation mode
-*/
-typedef enum CINEMA_MODE {
- OFF = 0, /** Not Digital Cinema*/
- CINEMA2K_24 = 1, /** 2K Digital Cinema at 24 fps*/
- CINEMA2K_48 = 2, /** 2K Digital Cinema at 48 fps*/
- CINEMA4K_24 = 3 /** 4K Digital Cinema at 24 fps*/
-} OPJ_CINEMA_MODE;
-
-/**
-Progression order
-*/
-typedef enum PROG_ORDER {
- PROG_UNKNOWN = -1, /**< place-holder */
- LRCP = 0, /**< layer-resolution-component-precinct order */
- RLCP = 1, /**< resolution-layer-component-precinct order */
- RPCL = 2, /**< resolution-precinct-component-layer order */
- PCRL = 3, /**< precinct-component-resolution-layer order */
- CPRL = 4 /**< component-precinct-resolution-layer order */
-} OPJ_PROG_ORDER;
-
-/**
-Supported image color spaces
-*/
-typedef enum COLOR_SPACE {
- CLRSPC_UNKNOWN = -1, /**< not supported by the library */
- CLRSPC_UNSPECIFIED = 0, /**< not specified in the codestream */
- CLRSPC_SRGB = 1, /**< sRGB */
- CLRSPC_GRAY = 2, /**< grayscale */
- CLRSPC_SYCC = 3 /**< YUV */
-} OPJ_COLOR_SPACE;
-
-#define ENUMCS_SRGB 16
-#define ENUMCS_GRAY 17
-#define ENUMCS_SYCC 18
-
-/**
-Supported codec
-*/
-typedef enum CODEC_FORMAT {
- CODEC_UNKNOWN = -1, /**< place-holder */
- CODEC_J2K = 0, /**< JPEG-2000 codestream : read/write */
- CODEC_JPT = 1, /**< JPT-stream (JPEG 2000, JPIP) : read only */
- CODEC_JP2 = 2 /**< JPEG-2000 file format : read/write */
-} OPJ_CODEC_FORMAT;
-
-/**
-Limit decoding to certain portions of the codestream.
-*/
-typedef enum LIMIT_DECODING {
- NO_LIMITATION = 0, /**< No limitation for the decoding. The entire codestream will de decoded */
- LIMIT_TO_MAIN_HEADER = 1, /**< The decoding is limited to the Main Header */
- DECODE_ALL_BUT_PACKETS = 2 /**< Decode everything except the JPEG 2000 packets */
-} OPJ_LIMIT_DECODING;
-
-/*
-==========================================================
- event manager typedef definitions
-==========================================================
-*/
-
-/**
-Callback function prototype for events
-@param msg Event message
-@param client_data
-*/
-typedef void (*opj_msg_callback)(const char *msg, void *client_data);
-
-/**
-Message handler object
-used for
-<ul>
-<li>Error messages
-<li>Warning messages
-<li>Debugging messages
-</ul>
-*/
-typedef struct opj_event_mgr {
- /** Error message callback if available, NULL otherwise */
- opj_msg_callback error_handler;
- /** Warning message callback if available, NULL otherwise */
- opj_msg_callback warning_handler;
- /** Debug message callback if available, NULL otherwise */
- opj_msg_callback info_handler;
-} opj_event_mgr_t;
-
-
-/*
-==========================================================
- codec typedef definitions
-==========================================================
-*/
-
-/**
-Progression order changes
-*/
-typedef struct opj_poc {
- /** Resolution num start, Component num start, given by POC */
- int resno0, compno0;
- /** Layer num end,Resolution num end, Component num end, given by POC */
- int layno1, resno1, compno1;
- /** Layer num start,Precinct num start, Precinct num end */
- int layno0, precno0, precno1;
- /** Progression order enum*/
- OPJ_PROG_ORDER prg1, prg;
- /** Progression order string*/
- char progorder[5];
- /** Tile number */
- int tile;
- /** Start and end values for Tile width and height*/
- int tx0, tx1, ty0, ty1;
- /** Start value, initialised in pi_initialise_encode*/
- int layS, resS, compS, prcS;
- /** End value, initialised in pi_initialise_encode */
- int layE, resE, compE, prcE;
- /** Start and end values of Tile width and height, initialised in pi_initialise_encode*/
- int txS, txE, tyS, tyE, dx, dy;
- /** Temporary values for Tile parts, initialised in pi_create_encode */
- int lay_t, res_t, comp_t, prc_t, tx0_t, ty0_t;
-} opj_poc_t;
-
-/**
-Compression parameters
-*/
-typedef struct opj_cparameters {
- /** size of tile: tile_size_on = false (not in argument) or = true (in argument) */
- opj_bool tile_size_on;
- /** XTOsiz */
- int cp_tx0;
- /** YTOsiz */
- int cp_ty0;
- /** XTsiz */
- int cp_tdx;
- /** YTsiz */
- int cp_tdy;
- /** allocation by rate/distortion */
- int cp_disto_alloc;
- /** allocation by fixed layer */
- int cp_fixed_alloc;
- /** add fixed_quality */
- int cp_fixed_quality;
- /** fixed layer */
- int *cp_matrice;
- /** comment for coding */
- char *cp_comment;
- /** csty : coding style */
- int csty;
- /** progression order (default LRCP) */
- OPJ_PROG_ORDER prog_order;
- /** progression order changes */
- opj_poc_t POC[32];
- /** number of progression order changes (POC), default to 0 */
- int numpocs;
- /** number of layers */
- int tcp_numlayers;
- /** rates of layers */
- float tcp_rates[100];
- /** different psnr for successive layers */
- float tcp_distoratio[100];
- /** number of resolutions */
- int numresolution;
- /** initial code block width, default to 64 */
- int cblockw_init;
- /** initial code block height, default to 64 */
- int cblockh_init;
- /** mode switch (cblk_style) */
- int mode;
- /** 1 : use the irreversible DWT 9-7, 0 : use lossless compression (default) */
- int irreversible;
- /** region of interest: affected component in [0..3], -1 means no ROI */
- int roi_compno;
- /** region of interest: upshift value */
- int roi_shift;
- /* number of precinct size specifications */
- int res_spec;
- /** initial precinct width */
- int prcw_init[J2K_MAXRLVLS];
- /** initial precinct height */
- int prch_init[J2K_MAXRLVLS];
-
- /**@name command line encoder parameters (not used inside the library) */
- /*@{*/
- /** input file name */
- char infile[OPJ_PATH_LEN];
- /** output file name */
- char outfile[OPJ_PATH_LEN];
- /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
- int index_on;
- /** DEPRECATED. Index generation is now handeld with the opj_encode_with_info() function. Set to NULL */
- char index[OPJ_PATH_LEN];
- /** subimage encoding: origin image offset in x direction */
- int image_offset_x0;
- /** subimage encoding: origin image offset in y direction */
- int image_offset_y0;
- /** subsampling value for dx */
- int subsampling_dx;
- /** subsampling value for dy */
- int subsampling_dy;
- /** input file format 0: PGX, 1: PxM, 2: BMP 3:TIF*/
- int decod_format;
- /** output file format 0: J2K, 1: JP2, 2: JPT */
- int cod_format;
- /*@}*/
-
- /* UniPG>> */
- /**@name JPWL encoding parameters */
- /*@{*/
- /** enables writing of EPC in MH, thus activating JPWL */
- opj_bool jpwl_epc_on;
- /** error protection method for MH (0,1,16,32,37-128) */
- int jpwl_hprot_MH;
- /** tile number of header protection specification (>=0) */
- int jpwl_hprot_TPH_tileno[JPWL_MAX_NO_TILESPECS];
- /** error protection methods for TPHs (0,1,16,32,37-128) */
- int jpwl_hprot_TPH[JPWL_MAX_NO_TILESPECS];
- /** tile number of packet protection specification (>=0) */
- int jpwl_pprot_tileno[JPWL_MAX_NO_PACKSPECS];
- /** packet number of packet protection specification (>=0) */
- int jpwl_pprot_packno[JPWL_MAX_NO_PACKSPECS];
- /** error protection methods for packets (0,1,16,32,37-128) */
- int jpwl_pprot[JPWL_MAX_NO_PACKSPECS];
- /** enables writing of ESD, (0=no/1/2 bytes) */
- int jpwl_sens_size;
- /** sensitivity addressing size (0=auto/2/4 bytes) */
- int jpwl_sens_addr;
- /** sensitivity range (0-3) */
- int jpwl_sens_range;
- /** sensitivity method for MH (-1=no,0-7) */
- int jpwl_sens_MH;
- /** tile number of sensitivity specification (>=0) */
- int jpwl_sens_TPH_tileno[JPWL_MAX_NO_TILESPECS];
- /** sensitivity methods for TPHs (-1=no,0-7) */
- int jpwl_sens_TPH[JPWL_MAX_NO_TILESPECS];
- /*@}*/
- /* <<UniPG */
-
- /** Digital Cinema compliance 0-not compliant, 1-compliant*/
- OPJ_CINEMA_MODE cp_cinema;
- /** Maximum rate for each component. If == 0, component size limitation is not considered */
- int max_comp_size;
- /** Profile name*/
- OPJ_RSIZ_CAPABILITIES cp_rsiz;
- /** Tile part generation*/
- char tp_on;
- /** Flag for Tile part generation*/
- char tp_flag;
- /** MCT (multiple component transform) */
- char tcp_mct;
-} opj_cparameters_t;
-
-#define OPJ_DPARAMETERS_IGNORE_PCLR_CMAP_CDEF_FLAG 0x0001
-
-/**
-Decompression parameters
-*/
-typedef struct opj_dparameters {
- /**
- Set the number of highest resolution levels to be discarded.
- The image resolution is effectively divided by 2 to the power of the number of discarded levels.
- The reduce factor is limited by the smallest total number of decomposition levels among tiles.
- if != 0, then original dimension divided by 2^(reduce);
- if == 0 or not used, image is decoded to the full resolution
- */
- int cp_reduce;
- /**
- Set the maximum number of quality layers to decode.
- If there are less quality layers than the specified number, all the quality layers are decoded.
- if != 0, then only the first "layer" layers are decoded;
- if == 0 or not used, all the quality layers are decoded
- */
- int cp_layer;
-
- /**@name command line encoder parameters (not used inside the library) */
- /*@{*/
- /** input file name */
- char infile[OPJ_PATH_LEN];
- /** output file name */
- char outfile[OPJ_PATH_LEN];
- /** input file format 0: J2K, 1: JP2, 2: JPT */
- int decod_format;
- /** output file format 0: PGX, 1: PxM, 2: BMP */
- int cod_format;
- /*@}*/
-
- /* UniPG>> */
- /**@name JPWL decoding parameters */
- /*@{*/
- /** activates the JPWL correction capabilities */
- opj_bool jpwl_correct;
- /** expected number of components */
- int jpwl_exp_comps;
- /** maximum number of tiles */
- int jpwl_max_tiles;
- /*@}*/
- /* <<UniPG */
-
- /**
- Specify whether the decoding should be done on the entire codestream, or be limited to the main header
- Limiting the decoding to the main header makes it possible to extract the characteristics of the codestream
- if == NO_LIMITATION, the entire codestream is decoded;
- if == LIMIT_TO_MAIN_HEADER, only the main header is decoded;
- */
- OPJ_LIMIT_DECODING cp_limit_decoding;
-
- unsigned int flags;
-} opj_dparameters_t;
-
-/** Common fields between JPEG-2000 compression and decompression master structs. */
-
-#define opj_common_fields \
- opj_event_mgr_t *event_mgr; /**< pointer to the event manager */\
- void * client_data; /**< Available for use by application */\
- opj_bool is_decompressor; /**< So common code can tell which is which */\
- OPJ_CODEC_FORMAT codec_format; /**< selected codec */\
- void *j2k_handle; /**< pointer to the J2K codec */\
- void *jp2_handle; /**< pointer to the JP2 codec */\
- void *mj2_handle /**< pointer to the MJ2 codec */
-
-/* Routines that are to be used by both halves of the library are declared
- * to receive a pointer to this structure. There are no actual instances of
- * opj_common_struct_t, only of opj_cinfo_t and opj_dinfo_t.
- */
-typedef struct opj_common_struct {
- opj_common_fields; /* Fields common to both master struct types */
- /* Additional fields follow in an actual opj_cinfo_t or
- * opj_dinfo_t. All three structs must agree on these
- * initial fields! (This would be a lot cleaner in C++.)
- */
-} opj_common_struct_t;
-
-typedef opj_common_struct_t * opj_common_ptr;
-
-/**
-Compression context info
-*/
-typedef struct opj_cinfo {
- /** Fields shared with opj_dinfo_t */
- opj_common_fields;
- /* other specific fields go here */
-} opj_cinfo_t;
-
-/**
-Decompression context info
-*/
-typedef struct opj_dinfo {
- /** Fields shared with opj_cinfo_t */
- opj_common_fields;
- /* other specific fields go here */
-} opj_dinfo_t;
-
-/*
-==========================================================
- I/O stream typedef definitions
-==========================================================
-*/
-
-/*
- * Stream open flags.
- */
-/** The stream was opened for reading. */
-#define OPJ_STREAM_READ 0x0001
-/** The stream was opened for writing. */
-#define OPJ_STREAM_WRITE 0x0002
-
-/**
-Byte input-output stream (CIO)
-*/
-typedef struct opj_cio {
- /** codec context */
- opj_common_ptr cinfo;
-
- /** open mode (read/write) either OPJ_STREAM_READ or OPJ_STREAM_WRITE */
- int openmode;
- /** pointer to the start of the buffer */
- unsigned char *buffer;
- /** buffer size in bytes */
- int length;
-
- /** pointer to the start of the stream */
- unsigned char *start;
- /** pointer to the end of the stream */
- unsigned char *end;
- /** pointer to the current position */
- unsigned char *bp;
-} opj_cio_t;
-
-/*
-==========================================================
- image typedef definitions
-==========================================================
-*/
-
-/**
-Defines a single image component
-*/
-typedef struct opj_image_comp {
- /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
- int dx;
- /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
- int dy;
- /** data width */
- int w;
- /** data height */
- int h;
- /** x component offset compared to the whole image */
- int x0;
- /** y component offset compared to the whole image */
- int y0;
- /** precision */
- int prec;
- /** image depth in bits */
- int bpp;
- /** signed (1) / unsigned (0) */
- int sgnd;
- /** number of decoded resolution */
- int resno_decoded;
- /** number of division by 2 of the out image compared to the original size of image */
- int factor;
- /** image component data */
- int *data;
-} opj_image_comp_t;
-
-/**
-Defines image data and characteristics
-*/
-typedef struct opj_image {
- /** XOsiz: horizontal offset from the origin of the reference grid to the left side of the image area */
- int x0;
- /** YOsiz: vertical offset from the origin of the reference grid to the top side of the image area */
- int y0;
- /** Xsiz: width of the reference grid */
- int x1;
- /** Ysiz: height of the reference grid */
- int y1;
- /** number of components in the image */
- int numcomps;
- /** color space: sRGB, Greyscale or YUV */
- OPJ_COLOR_SPACE color_space;
- /** image components */
- opj_image_comp_t *comps;
- /** 'restricted' ICC profile */
- unsigned char *icc_profile_buf;
- /** size of ICC profile */
- int icc_profile_len;
-} opj_image_t;
-
-/**
-Component parameters structure used by the opj_image_create function
-*/
-typedef struct opj_image_comptparm {
- /** XRsiz: horizontal separation of a sample of ith component with respect to the reference grid */
- int dx;
- /** YRsiz: vertical separation of a sample of ith component with respect to the reference grid */
- int dy;
- /** data width */
- int w;
- /** data height */
- int h;
- /** x component offset compared to the whole image */
- int x0;
- /** y component offset compared to the whole image */
- int y0;
- /** precision */
- int prec;
- /** image depth in bits */
- int bpp;
- /** signed (1) / unsigned (0) */
- int sgnd;
-} opj_image_cmptparm_t;
-
-/*
-==========================================================
- Information on the JPEG 2000 codestream
-==========================================================
-*/
-
-/**
-Index structure : Information concerning a packet inside tile
-*/
-typedef struct opj_packet_info {
- /** packet start position (including SOP marker if it exists) */
- int start_pos;
- /** end of packet header position (including EPH marker if it exists)*/
- int end_ph_pos;
- /** packet end position */
- int end_pos;
- /** packet distorsion */
- double disto;
-} opj_packet_info_t;
-
-
-/* UniPG>> */
-/**
-Marker structure
-*/
-typedef struct opj_marker_info_t {
- /** marker type */
- unsigned short int type;
- /** position in codestream */
- int pos;
- /** length, marker val included */
- int len;
-} opj_marker_info_t;
-/* <<UniPG */
-
-/**
-Index structure : Information concerning tile-parts
-*/
-typedef struct opj_tp_info {
- /** start position of tile part */
- int tp_start_pos;
- /** end position of tile part header */
- int tp_end_header;
- /** end position of tile part */
- int tp_end_pos;
- /** start packet of tile part */
- int tp_start_pack;
- /** number of packets of tile part */
- int tp_numpacks;
-} opj_tp_info_t;
-
-/**
-Index structure : information regarding tiles
-*/
-typedef struct opj_tile_info {
- /** value of thresh for each layer by tile cfr. Marcela */
- double *thresh;
- /** number of tile */
- int tileno;
- /** start position */
- int start_pos;
- /** end position of the header */
- int end_header;
- /** end position */
- int end_pos;
- /** precinct number for each resolution level (width) */
- int pw[33];
- /** precinct number for each resolution level (height) */
- int ph[33];
- /** precinct size (in power of 2), in X for each resolution level */
- int pdx[33];
- /** precinct size (in power of 2), in Y for each resolution level */
- int pdy[33];
- /** information concerning packets inside tile */
- opj_packet_info_t *packet;
- /** add fixed_quality */
- int numpix;
- /** add fixed_quality */
- double distotile;
- /** number of markers */
- int marknum;
- /** list of markers */
- opj_marker_info_t *marker;
- /** actual size of markers array */
- int maxmarknum;
- /** number of tile parts */
- int num_tps;
- /** information concerning tile parts */
- opj_tp_info_t *tp;
-} opj_tile_info_t;
-
-/**
-Index structure of the codestream
-*/
-typedef struct opj_codestream_info {
- /** maximum distortion reduction on the whole image (add for Marcela) */
- double D_max;
- /** packet number */
- int packno;
- /** writing the packet in the index with t2_encode_packets */
- int index_write;
- /** image width */
- int image_w;
- /** image height */
- int image_h;
- /** progression order */
- OPJ_PROG_ORDER prog;
- /** tile size in x */
- int tile_x;
- /** tile size in y */
- int tile_y;
- /** */
- int tile_Ox;
- /** */
- int tile_Oy;
- /** number of tiles in X */
- int tw;
- /** number of tiles in Y */
- int th;
- /** component numbers */
- int numcomps;
- /** number of layer */
- int numlayers;
- /** number of decomposition for each component */
- int *numdecompos;
- /* UniPG>> */
- /** number of markers */
- int marknum;
- /** list of markers */
- opj_marker_info_t *marker;
- /** actual size of markers array */
- int maxmarknum;
- /* <<UniPG */
- /** main header position */
- int main_head_start;
- /** main header position */
- int main_head_end;
- /** codestream's size */
- int codestream_size;
- /** information regarding tiles inside image */
- opj_tile_info_t *tile;
-} opj_codestream_info_t;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/*
-==========================================================
- openjpeg version
-==========================================================
-*/
-
-OPJ_API const char * OPJ_CALLCONV opj_version(void);
-
-/*
-==========================================================
- image functions definitions
-==========================================================
-*/
-
-/**
-Create an image
-@param numcmpts number of components
-@param cmptparms components parameters
-@param clrspc image color space
-@return returns a new image structure if successful, returns NULL otherwise
-*/
-OPJ_API opj_image_t* OPJ_CALLCONV opj_image_create(int numcmpts,
- opj_image_cmptparm_t *cmptparms, OPJ_COLOR_SPACE clrspc);
-
-/**
-Deallocate any resources associated with an image
-@param image image to be destroyed
-*/
-OPJ_API void OPJ_CALLCONV opj_image_destroy(opj_image_t *image);
-
-/**
- * Allocator for opj_image_t->comps[].data
- * To be paired with opj_image_data_free.
- *
- * @param size number of bytes to allocate
- *
- * @return a new pointer if successful, NULL otherwise.
- * @since 2.2.0
-*/
-OPJ_API void* OPJ_CALLCONV opj_image_data_alloc(size_t size);
-
-/**
- * Destructor for opj_image_t->comps[].data
- * To be paired with opj_image_data_alloc.
- *
- * @param ptr Pointer to free
- *
- * @since 2.2.0
-*/
-OPJ_API void OPJ_CALLCONV opj_image_data_free(void* ptr);
-
-/*
-==========================================================
- stream functions definitions
-==========================================================
-*/
-
-/**
-Open and allocate a memory stream for read / write.
-On reading, the user must provide a buffer containing encoded data. The buffer will be
-wrapped by the returned CIO handle.
-On writing, buffer parameters must be set to 0: a buffer will be allocated by the library
-to contain encoded data.
-@param cinfo Codec context info
-@param buffer Reading: buffer address. Writing: NULL
-@param length Reading: buffer length. Writing: 0
-@return Returns a CIO handle if successful, returns NULL otherwise
-*/
-OPJ_API opj_cio_t* OPJ_CALLCONV opj_cio_open(opj_common_ptr cinfo,
- unsigned char *buffer, int length);
-
-/**
-Close and free a CIO handle
-@param cio CIO handle to free
-*/
-OPJ_API void OPJ_CALLCONV opj_cio_close(opj_cio_t *cio);
-
-/**
-Get position in byte stream
-@param cio CIO handle
-@return Returns the position in bytes
-*/
-OPJ_API int OPJ_CALLCONV cio_tell(opj_cio_t *cio);
-/**
-Set position in byte stream
-@param cio CIO handle
-@param pos Position, in number of bytes, from the beginning of the stream
-*/
-OPJ_API void OPJ_CALLCONV cio_seek(opj_cio_t *cio, int pos);
-
-/*
-==========================================================
- event manager functions definitions
-==========================================================
-*/
-
-OPJ_API opj_event_mgr_t* OPJ_CALLCONV opj_set_event_mgr(opj_common_ptr cinfo,
- opj_event_mgr_t *event_mgr, void *context);
-
-/*
-==========================================================
- codec functions definitions
-==========================================================
-*/
-/**
-Creates a J2K/JPT/JP2 decompression structure
-@param format Decoder to select
-@return Returns a handle to a decompressor if successful, returns NULL otherwise
-*/
-OPJ_API opj_dinfo_t* OPJ_CALLCONV opj_create_decompress(
- OPJ_CODEC_FORMAT format);
-/**
-Destroy a decompressor handle
-@param dinfo decompressor handle to destroy
-*/
-OPJ_API void OPJ_CALLCONV opj_destroy_decompress(opj_dinfo_t *dinfo);
-/**
-Set decoding parameters to default values
-@param parameters Decompression parameters
-*/
-OPJ_API void OPJ_CALLCONV opj_set_default_decoder_parameters(
- opj_dparameters_t *parameters);
-/**
-Setup the decoder decoding parameters using user parameters.
-Decoding parameters are returned in j2k->cp.
-@param dinfo decompressor handle
-@param parameters decompression parameters
-*/
-OPJ_API void OPJ_CALLCONV opj_setup_decoder(opj_dinfo_t *dinfo,
- opj_dparameters_t *parameters);
-/**
-Decode an image from a JPEG-2000 codestream
-@param dinfo decompressor handle
-@param cio Input buffer stream
-@return Returns a decoded image if successful, returns NULL otherwise
-*/
-OPJ_API opj_image_t* OPJ_CALLCONV opj_decode(opj_dinfo_t *dinfo,
- opj_cio_t *cio);
-
-/**
-Decode an image from a JPEG-2000 codestream and extract the codestream information
-@param dinfo decompressor handle
-@param cio Input buffer stream
-@param cstr_info Codestream information structure if needed afterwards, NULL otherwise
-@return Returns a decoded image if successful, returns NULL otherwise
-*/
-OPJ_API opj_image_t* OPJ_CALLCONV opj_decode_with_info(opj_dinfo_t *dinfo,
- opj_cio_t *cio, opj_codestream_info_t *cstr_info);
-/**
-Creates a J2K/JP2 compression structure
-@param format Coder to select
-@return Returns a handle to a compressor if successful, returns NULL otherwise
-*/
-OPJ_API opj_cinfo_t* OPJ_CALLCONV opj_create_compress(OPJ_CODEC_FORMAT format);
-/**
-Destroy a compressor handle
-@param cinfo compressor handle to destroy
-*/
-OPJ_API void OPJ_CALLCONV opj_destroy_compress(opj_cinfo_t *cinfo);
-/**
-Set encoding parameters to default values, that means :
-<ul>
-<li>Lossless
-<li>1 tile
-<li>Size of precinct : 2^15 x 2^15 (means 1 precinct)
-<li>Size of code-block : 64 x 64
-<li>Number of resolutions: 6
-<li>No SOP marker in the codestream
-<li>No EPH marker in the codestream
-<li>No sub-sampling in x or y direction
-<li>No mode switch activated
-<li>Progression order: LRCP
-<li>No index file
-<li>No ROI upshifted
-<li>No offset of the origin of the image
-<li>No offset of the origin of the tiles
-<li>Reversible DWT 5-3
-</ul>
-@param parameters Compression parameters
-*/
-OPJ_API void OPJ_CALLCONV opj_set_default_encoder_parameters(
- opj_cparameters_t *parameters);
-/**
-Setup the encoder parameters using the current image and using user parameters.
-@param cinfo Compressor handle
-@param parameters Compression parameters
-@param image Input filled image
-*/
-OPJ_API void OPJ_CALLCONV opj_setup_encoder(opj_cinfo_t *cinfo,
- opj_cparameters_t *parameters, opj_image_t *image);
-/**
-Encode an image into a JPEG-2000 codestream
-3@param cinfo compressor handle
-@param cio Output buffer stream
-@param image Image to encode
-@param index Deprecated -> Set to NULL. To extract index, used opj_encode_wci()
-@return Returns true if successful, returns false otherwise
-*/
-OPJ_API opj_bool OPJ_CALLCONV opj_encode(opj_cinfo_t *cinfo, opj_cio_t *cio,
- opj_image_t *image, char *index);
-/**
-Encode an image into a JPEG-2000 codestream and extract the codestream information
-@param cinfo compressor handle
-@param cio Output buffer stream
-@param image Image to encode
-@param cstr_info Codestream information structure if needed afterwards, NULL otherwise
-@return Returns true if successful, returns false otherwise
-*/
-OPJ_API opj_bool OPJ_CALLCONV opj_encode_with_info(opj_cinfo_t *cinfo,
- opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
-/**
-Destroy Codestream information after compression or decompression
-@param cstr_info Codestream information structure
-*/
-OPJ_API void OPJ_CALLCONV opj_destroy_cstr_info(opj_codestream_info_t
- *cstr_info);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* OPENJPEG_H */
+++ /dev/null
-/*
- * 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) 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 OPJ_INCLUDES_H
-#define OPJ_INCLUDES_H
-
-/*
- ==========================================================
- Standard includes used by the library
- ==========================================================
-*/
-#include <memory.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include <float.h>
-#include <time.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <ctype.h>
-
-/*
- ==========================================================
- OpenJPEG interface
- ==========================================================
- */
-#include "openjpeg.h"
-
-/*
- ==========================================================
- OpenJPEG modules
- ==========================================================
-*/
-
-/* Ignore GCC attributes if this is not GCC */
-#ifndef __GNUC__
-#define __attribute__(x) /* __attribute__(x) */
-#endif
-
-/*
-The inline keyword is supported by C99 but not by C90.
-Most compilers implement their own version of this keyword ...
-*/
-#ifndef INLINE
-#if defined(_MSC_VER)
-#define INLINE __forceinline
-#elif defined(__GNUC__)
-#define INLINE __inline__
-#elif defined(__MWERKS__)
-#define INLINE inline
-#else
-/* add other compilers here ... */
-#define INLINE
-#endif /* defined(<Compiler>) */
-#endif /* INLINE */
-
-/* Are restricted pointers available? (C99) */
-#if (__STDC_VERSION__ != 199901L)
-/* Not a C99 compiler */
-#ifdef __GNUC__
-#define restrict __restrict__
-#else
-#define restrict /* restrict */
-#endif
-#endif
-
-/* MSVC and Borland C do not have lrintf */
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-static INLINE long lrintf(float f)
-{
-#ifdef _M_X64
- return (long)((f > 0.0f) ? (f + 0.5f) : (f - 0.5f));
-#else
- int i;
-
- _asm{
- fld f
- fistp i
- };
-
- return i;
-#endif
-}
-#endif
-
-#include "j2k_lib.h"
-#include "opj_malloc.h"
-#include "event.h"
-#include "bio.h"
-#include "cio.h"
-
-#include "image.h"
-#include "j2k.h"
-#include "jp2.h"
-#include "jpt.h"
-
-#include "mqc.h"
-#include "raw.h"
-#include "bio.h"
-#include "tgt.h"
-#include "pi.h"
-#include "tcd.h"
-#include "t1.h"
-#include "dwt.h"
-#include "t2.h"
-#include "mct.h"
-#include "int.h"
-#include "fix.h"
-
-/* JPWL>> */
-#ifdef USE_JPWL
-#include "jpwl.h"
-#endif /* USE_JPWL */
-/* <<JPWL */
-
-#endif /* OPJ_INCLUDES_H */
+++ /dev/null
-/*
- * Copyright (c) 2005, Herve Drolon, FreeImage Team
- * Copyright (c) 2007, Callum Lerwick <seg@haxxed.com>
- * 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 __OPJ_MALLOC_H
-#define __OPJ_MALLOC_H
-/**
-@file opj_malloc.h
-@brief Internal functions
-
-The functions in opj_malloc.h are internal utilities used for memory management.
-*/
-
-/** @defgroup MISC MISC - Miscellaneous internal functions */
-/*@{*/
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-
-/**
-Allocate an uninitialized memory block
-@param size Bytes to allocate
-@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
-*/
-#ifdef ALLOC_PERF_OPT
-void * OPJ_CALLCONV opj_malloc(size_t size);
-#else
-#define opj_malloc(size) malloc(size)
-#endif
-
-/**
-Allocate a memory block with elements initialized to 0
-@param num Blocks to allocate
-@param size Bytes per block to allocate
-@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
-*/
-#ifdef ALLOC_PERF_OPT
-void * OPJ_CALLCONV opj_calloc(size_t _NumOfElements, size_t _SizeOfElements);
-#else
-#define opj_calloc(num, size) calloc(num, size)
-#endif
-
-/**
-Allocate memory aligned to a 16 byte boundary
-@param size Bytes to allocate
-@return Returns a void pointer to the allocated space, or NULL if there is insufficient memory available
-*/
-/* FIXME: These should be set with cmake tests, but we're currently not requiring use of cmake */
-#ifdef _WIN32
-/* Someone should tell the mingw people that their malloc.h ought to provide _mm_malloc() */
-#ifdef __GNUC__
-#include <mm_malloc.h>
-#define HAVE_MM_MALLOC
-#else /* MSVC, Intel C++ */
-#include <malloc.h>
-#ifdef _mm_malloc
-#define HAVE_MM_MALLOC
-#endif
-#endif
-#else /* Not _WIN32 */
-#if defined(__sun)
-#define HAVE_MEMALIGN
-#elif defined(__FreeBSD__)
-#define HAVE_POSIX_MEMALIGN
-/* Linux x86_64 and OSX always align allocations to 16 bytes */
-#elif !defined(__amd64__) && !defined(__APPLE__) && !defined(_AIX)
-#define HAVE_MEMALIGN
-#include <malloc.h>
-#endif
-#endif
-
-#define opj_aligned_malloc(size) malloc(size)
-#define opj_aligned_free(m) free(m)
-
-#ifdef HAVE_MM_MALLOC
-#undef opj_aligned_malloc
-#define opj_aligned_malloc(size) _mm_malloc(size, 16)
-#undef opj_aligned_free
-#define opj_aligned_free(m) _mm_free(m)
-#endif
-
-#ifdef HAVE_MEMALIGN
-extern void* memalign(size_t, size_t);
-#undef opj_aligned_malloc
-#define opj_aligned_malloc(size) memalign(16, (size))
-#undef opj_aligned_free
-#define opj_aligned_free(m) free(m)
-#endif
-
-#ifdef HAVE_POSIX_MEMALIGN
-#undef opj_aligned_malloc
-extern int posix_memalign(void**, size_t, size_t);
-
-static INLINE void* __attribute__((malloc)) opj_aligned_malloc(size_t size)
-{
- void* mem = NULL;
- posix_memalign(&mem, 16, size);
- return mem;
-}
-#undef opj_aligned_free
-#define opj_aligned_free(m) free(m)
-#endif
-
-#ifdef ALLOC_PERF_OPT
-#undef opj_aligned_malloc
-#define opj_aligned_malloc(size) opj_malloc(size)
-#undef opj_aligned_free
-#define opj_aligned_free(m) opj_free(m)
-#endif
-
-/**
-Reallocate memory blocks.
-@param m Pointer to previously allocated memory block
-@param s New size in bytes
-@return Returns a void pointer to the reallocated (and possibly moved) memory block
-*/
-#ifdef ALLOC_PERF_OPT
-void * OPJ_CALLCONV opj_realloc(void * m, size_t s);
-#else
-#define opj_realloc(m, s) realloc(m, s)
-#endif
-
-/**
-Deallocates or frees a memory block.
-@param m Previously allocated memory block to be freed
-*/
-#ifdef ALLOC_PERF_OPT
-void OPJ_CALLCONV opj_free(void * m);
-#else
-#define opj_free(m) free(m)
-#endif
-
-#ifdef __GNUC__
-#pragma GCC poison malloc calloc realloc free
-#endif
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __OPJ_MALLOC_H */
-
+++ /dev/null
-/*
- * 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_includes.h"
-
-/** @defgroup PI PI - Implementation of a packet iterator */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-/**
-Get next packet in layer-resolution-component-precinct order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static opj_bool pi_next_lrcp(opj_pi_iterator_t * pi);
-/**
-Get next packet in resolution-layer-component-precinct order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static opj_bool pi_next_rlcp(opj_pi_iterator_t * pi);
-/**
-Get next packet in resolution-precinct-component-layer order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static opj_bool pi_next_rpcl(opj_pi_iterator_t * pi);
-/**
-Get next packet in precinct-component-resolution-layer order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static opj_bool pi_next_pcrl(opj_pi_iterator_t * pi);
-/**
-Get next packet in component-precinct-resolution-layer order.
-@param pi packet iterator to modify
-@return returns false if pi pointed to the last packet or else returns true
-*/
-static opj_bool pi_next_cprl(opj_pi_iterator_t * pi);
-
-/*@}*/
-
-/*@}*/
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-static opj_bool pi_next_lrcp(opj_pi_iterator_t * pi)
-{
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- comp = &pi->comps[pi->compno];
- res = &comp->resolutions[pi->resno];
- goto LABEL_SKIP;
- } else {
- pi->first = 0;
- }
-
- for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
- for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1;
- pi->resno++) {
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- comp = &pi->comps[pi->compno];
- if (pi->resno >= comp->numresolutions) {
- continue;
- }
- res = &comp->resolutions[pi->resno];
- if (!pi->tp_on) {
- pi->poc.precno1 = res->pw * res->ph;
- }
- for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno *
- pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return OPJ_TRUE;
- }
-LABEL_SKIP:
- ;
- }
- }
- }
- }
-
- return OPJ_FALSE;
-}
-
-static opj_bool pi_next_rlcp(opj_pi_iterator_t * pi)
-{
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- comp = &pi->comps[pi->compno];
- res = &comp->resolutions[pi->resno];
- goto LABEL_SKIP;
- } else {
- pi->first = 0;
- }
-
- for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
- for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- comp = &pi->comps[pi->compno];
- if (pi->resno >= comp->numresolutions) {
- continue;
- }
- res = &comp->resolutions[pi->resno];
- if (!pi->tp_on) {
- pi->poc.precno1 = res->pw * res->ph;
- }
- for (pi->precno = pi->poc.precno0; pi->precno < pi->poc.precno1; pi->precno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno *
- pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return OPJ_TRUE;
- }
-LABEL_SKIP:
- ;
- }
- }
- }
- }
-
- return OPJ_FALSE;
-}
-
-static opj_bool pi_next_rpcl(opj_pi_iterator_t * pi)
-{
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- goto LABEL_SKIP;
- } else {
- int compno, resno;
- pi->first = 0;
- pi->dx = 0;
- pi->dy = 0;
- for (compno = 0; compno < pi->numcomps; compno++) {
- comp = &pi->comps[compno];
- for (resno = 0; resno < comp->numresolutions; resno++) {
- int dx, dy;
- res = &comp->resolutions[resno];
- dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
- dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
- pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
- pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
- }
- }
- }
- if (!pi->tp_on) {
- pi->poc.ty0 = pi->ty0;
- pi->poc.tx0 = pi->tx0;
- pi->poc.ty1 = pi->ty1;
- pi->poc.tx1 = pi->tx1;
- }
- for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
- for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1;
- pi->y += pi->dy - (pi->y % pi->dy)) {
- for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1;
- pi->x += pi->dx - (pi->x % pi->dx)) {
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- int levelno;
- int trx0, try0;
- int trx1, try1;
- int rpx, rpy;
- int prci, prcj;
- comp = &pi->comps[pi->compno];
- if (pi->resno >= comp->numresolutions) {
- continue;
- }
- res = &comp->resolutions[pi->resno];
- levelno = comp->numresolutions - 1 - pi->resno;
- trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
- try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
- trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
- try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
- rpx = res->pdx + levelno;
- rpy = res->pdy + levelno;
-
- /* To avoid divisions by zero / undefined behaviour on shift */
- if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx ||
- rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy) {
- continue;
- }
-
- if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) &&
- ((try0 << levelno) % (1 << rpy))))) {
- continue;
- }
- if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) &&
- ((trx0 << levelno) % (1 << rpx))))) {
- continue;
- }
-
- if ((res->pw == 0) || (res->ph == 0)) {
- continue;
- }
-
- if ((trx0 == trx1) || (try0 == try1)) {
- continue;
- }
-
- prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
- - int_floordivpow2(trx0, res->pdx);
- prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- - int_floordivpow2(try0, res->pdy);
- pi->precno = prci + prcj * res->pw;
- for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno *
- pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return OPJ_TRUE;
- }
-LABEL_SKIP:
- ;
- }
- }
- }
- }
- }
-
- return OPJ_FALSE;
-}
-
-static opj_bool pi_next_pcrl(opj_pi_iterator_t * pi)
-{
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- comp = &pi->comps[pi->compno];
- goto LABEL_SKIP;
- } else {
- int compno, resno;
- pi->first = 0;
- pi->dx = 0;
- pi->dy = 0;
- for (compno = 0; compno < pi->numcomps; compno++) {
- comp = &pi->comps[compno];
- for (resno = 0; resno < comp->numresolutions; resno++) {
- int dx, dy;
- res = &comp->resolutions[resno];
- dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
- dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
- pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
- pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
- }
- }
- }
- if (!pi->tp_on) {
- pi->poc.ty0 = pi->ty0;
- pi->poc.tx0 = pi->tx0;
- pi->poc.ty1 = pi->ty1;
- pi->poc.tx1 = pi->tx1;
- }
- for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1;
- pi->y += pi->dy - (pi->y % pi->dy)) {
- for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1;
- pi->x += pi->dx - (pi->x % pi->dx)) {
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- comp = &pi->comps[pi->compno];
- for (pi->resno = pi->poc.resno0;
- pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
- int levelno;
- int trx0, try0;
- int trx1, try1;
- int rpx, rpy;
- int prci, prcj;
- res = &comp->resolutions[pi->resno];
- levelno = comp->numresolutions - 1 - pi->resno;
- trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
- try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
- trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
- try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
- rpx = res->pdx + levelno;
- rpy = res->pdy + levelno;
-
- /* To avoid divisions by zero / undefined behaviour on shift */
- if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx ||
- rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy) {
- continue;
- }
-
- if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) &&
- ((try0 << levelno) % (1 << rpy))))) {
- continue;
- }
- if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) &&
- ((trx0 << levelno) % (1 << rpx))))) {
- continue;
- }
-
- if ((res->pw == 0) || (res->ph == 0)) {
- continue;
- }
-
- if ((trx0 == trx1) || (try0 == try1)) {
- continue;
- }
-
- prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
- - int_floordivpow2(trx0, res->pdx);
- prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- - int_floordivpow2(try0, res->pdy);
- pi->precno = prci + prcj * res->pw;
- for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno *
- pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return OPJ_TRUE;
- }
-LABEL_SKIP:
- ;
- }
- }
- }
- }
- }
-
- return OPJ_FALSE;
-}
-
-static opj_bool pi_next_cprl(opj_pi_iterator_t * pi)
-{
- opj_pi_comp_t *comp = NULL;
- opj_pi_resolution_t *res = NULL;
- long index = 0;
-
- if (!pi->first) {
- comp = &pi->comps[pi->compno];
- goto LABEL_SKIP;
- } else {
- pi->first = 0;
- }
-
- for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1; pi->compno++) {
- int resno;
- comp = &pi->comps[pi->compno];
- pi->dx = 0;
- pi->dy = 0;
- for (resno = 0; resno < comp->numresolutions; resno++) {
- int dx, dy;
- res = &comp->resolutions[resno];
- dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
- dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
- pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
- pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
- }
- if (!pi->tp_on) {
- pi->poc.ty0 = pi->ty0;
- pi->poc.tx0 = pi->tx0;
- pi->poc.ty1 = pi->ty1;
- pi->poc.tx1 = pi->tx1;
- }
- for (pi->y = pi->poc.ty0; pi->y < pi->poc.ty1;
- pi->y += pi->dy - (pi->y % pi->dy)) {
- for (pi->x = pi->poc.tx0; pi->x < pi->poc.tx1;
- pi->x += pi->dx - (pi->x % pi->dx)) {
- for (pi->resno = pi->poc.resno0;
- pi->resno < int_min(pi->poc.resno1, comp->numresolutions); pi->resno++) {
- int levelno;
- int trx0, try0;
- int trx1, try1;
- int rpx, rpy;
- int prci, prcj;
- res = &comp->resolutions[pi->resno];
- levelno = comp->numresolutions - 1 - pi->resno;
- trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
- try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
- trx1 = int_ceildiv(pi->tx1, comp->dx << levelno);
- try1 = int_ceildiv(pi->ty1, comp->dy << levelno);
- rpx = res->pdx + levelno;
- rpy = res->pdy + levelno;
-
- /* To avoid divisions by zero / undefined behaviour on shift */
- if (rpx >= 31 || ((comp->dx << rpx) >> rpx) != comp->dx ||
- rpy >= 31 || ((comp->dy << rpy) >> rpy) != comp->dy) {
- continue;
- }
-
- if (!((pi->y % (comp->dy << rpy) == 0) || ((pi->y == pi->ty0) &&
- ((try0 << levelno) % (1 << rpy))))) {
- continue;
- }
- if (!((pi->x % (comp->dx << rpx) == 0) || ((pi->x == pi->tx0) &&
- ((trx0 << levelno) % (1 << rpx))))) {
- continue;
- }
-
- if ((res->pw == 0) || (res->ph == 0)) {
- continue;
- }
-
- if ((trx0 == trx1) || (try0 == try1)) {
- continue;
- }
-
- prci = int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno), res->pdx)
- - int_floordivpow2(trx0, res->pdx);
- prcj = int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno), res->pdy)
- - int_floordivpow2(try0, res->pdy);
- pi->precno = prci + prcj * res->pw;
- for (pi->layno = pi->poc.layno0; pi->layno < pi->poc.layno1; pi->layno++) {
- index = pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno *
- pi->step_c + pi->precno * pi->step_p;
- if (!pi->include[index]) {
- pi->include[index] = 1;
- return OPJ_TRUE;
- }
-LABEL_SKIP:
- ;
- }
- }
- }
- }
- }
-
- return OPJ_FALSE;
-}
-
-/*
-==========================================================
- Packet iterator interface
-==========================================================
-*/
-
-opj_pi_iterator_t *pi_create_decode(opj_image_t *image, opj_cp_t *cp,
- int tileno)
-{
- int p, q;
- int compno, resno, pino;
- opj_pi_iterator_t *pi = NULL;
- opj_tcp_t *tcp = NULL;
- opj_tccp_t *tccp = NULL;
-
- tcp = &cp->tcps[tileno];
-
- pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1),
- sizeof(opj_pi_iterator_t));
- if (!pi) {
- /* TODO: throw an error */
- return NULL;
- }
-
- for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */
- int maxres = 0;
- int maxprec = 0;
- p = tileno % cp->tw;
- q = tileno / cp->tw;
-
- pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
- pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
- pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
- pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
- pi[pino].numcomps = image->numcomps;
-
- pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps,
- sizeof(opj_pi_comp_t));
- if (!pi[pino].comps) {
- /* TODO: throw an error */
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
-
- for (compno = 0; compno < pi->numcomps; compno++) {
- int tcx0, tcy0, tcx1, tcy1;
- opj_pi_comp_t *comp = &pi[pino].comps[compno];
- tccp = &tcp->tccps[compno];
- comp->dx = image->comps[compno].dx;
- comp->dy = image->comps[compno].dy;
- comp->numresolutions = tccp->numresolutions;
-
- comp->resolutions = (opj_pi_resolution_t*) opj_calloc(comp->numresolutions,
- sizeof(opj_pi_resolution_t));
- if (!comp->resolutions) {
- /* TODO: throw an error */
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
-
- tcx0 = int_ceildiv(pi->tx0, comp->dx);
- tcy0 = int_ceildiv(pi->ty0, comp->dy);
- tcx1 = int_ceildiv(pi->tx1, comp->dx);
- tcy1 = int_ceildiv(pi->ty1, comp->dy);
- if (comp->numresolutions > maxres) {
- maxres = comp->numresolutions;
- }
-
- for (resno = 0; resno < comp->numresolutions; resno++) {
- int levelno;
- int rx0, ry0, rx1, ry1;
- int px0, py0, px1, py1;
- opj_pi_resolution_t *res = &comp->resolutions[resno];
- if (tccp->csty & J2K_CCP_CSTY_PRT) {
- res->pdx = tccp->prcw[resno];
- res->pdy = tccp->prch[resno];
- } else {
- res->pdx = 15;
- res->pdy = 15;
- }
- levelno = comp->numresolutions - 1 - resno;
- rx0 = int_ceildivpow2(tcx0, levelno);
- ry0 = int_ceildivpow2(tcy0, levelno);
- rx1 = int_ceildivpow2(tcx1, levelno);
- ry1 = int_ceildivpow2(tcy1, levelno);
- px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
- py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
- px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
- py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
- res->pw = (rx0 == rx1) ? 0 : ((px1 - px0) >> res->pdx);
- res->ph = (ry0 == ry1) ? 0 : ((py1 - py0) >> res->pdy);
-
- if (res->pw * res->ph > maxprec) {
- maxprec = res->pw * res->ph;
- }
-
- }
- }
-
- tccp = &tcp->tccps[0];
- pi[pino].step_p = 1;
- pi[pino].step_c = maxprec * pi[pino].step_p;
- pi[pino].step_r = image->numcomps * pi[pino].step_c;
- pi[pino].step_l = maxres * pi[pino].step_r;
-
- if (pino == 0) {
- pi[pino].include = (short int*) opj_calloc(image->numcomps * maxres *
- tcp->numlayers * maxprec, sizeof(short int));
- if (!pi[pino].include) {
- /* TODO: throw an error */
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
- } else {
- pi[pino].include = pi[pino - 1].include;
- }
-
- if (tcp->POC == 0) {
- pi[pino].first = 1;
- pi[pino].poc.resno0 = 0;
- pi[pino].poc.compno0 = 0;
- pi[pino].poc.layno1 = tcp->numlayers;
- pi[pino].poc.resno1 = maxres;
- pi[pino].poc.compno1 = image->numcomps;
- pi[pino].poc.prg = tcp->prg;
- } else {
- pi[pino].first = 1;
- pi[pino].poc.resno0 = tcp->pocs[pino].resno0;
- pi[pino].poc.compno0 = tcp->pocs[pino].compno0;
- pi[pino].poc.layno1 = tcp->pocs[pino].layno1;
- pi[pino].poc.resno1 = tcp->pocs[pino].resno1;
- pi[pino].poc.compno1 = tcp->pocs[pino].compno1;
- pi[pino].poc.prg = tcp->pocs[pino].prg;
- }
- pi[pino].poc.layno0 = 0;
- pi[pino].poc.precno0 = 0;
- pi[pino].poc.precno1 = maxprec;
-
- }
-
- return pi;
-}
-
-
-opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp,
- int tileno, J2K_T2_MODE t2_mode)
-{
- int p, q, pino;
- int compno, resno;
- int maxres = 0;
- int maxprec = 0;
- opj_pi_iterator_t *pi = NULL;
- opj_tcp_t *tcp = NULL;
- opj_tccp_t *tccp = NULL;
-
- tcp = &cp->tcps[tileno];
-
- pi = (opj_pi_iterator_t*) opj_calloc((tcp->numpocs + 1),
- sizeof(opj_pi_iterator_t));
- if (!pi) {
- return NULL;
- }
- pi->tp_on = cp->tp_on;
-
- for (pino = 0; pino < tcp->numpocs + 1 ; pino ++) {
- p = tileno % cp->tw;
- q = tileno / cp->tw;
-
- pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
- pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
- pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
- pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
- pi[pino].numcomps = image->numcomps;
-
- pi[pino].comps = (opj_pi_comp_t*) opj_calloc(image->numcomps,
- sizeof(opj_pi_comp_t));
- if (!pi[pino].comps) {
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
-
- for (compno = 0; compno < pi[pino].numcomps; compno++) {
- int tcx0, tcy0, tcx1, tcy1;
- opj_pi_comp_t *comp = &pi[pino].comps[compno];
- tccp = &tcp->tccps[compno];
- comp->dx = image->comps[compno].dx;
- comp->dy = image->comps[compno].dy;
- comp->numresolutions = tccp->numresolutions;
-
- comp->resolutions = (opj_pi_resolution_t*) opj_malloc(comp->numresolutions *
- sizeof(opj_pi_resolution_t));
- if (!comp->resolutions) {
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
-
- tcx0 = int_ceildiv(pi[pino].tx0, comp->dx);
- tcy0 = int_ceildiv(pi[pino].ty0, comp->dy);
- tcx1 = int_ceildiv(pi[pino].tx1, comp->dx);
- tcy1 = int_ceildiv(pi[pino].ty1, comp->dy);
- if (comp->numresolutions > maxres) {
- maxres = comp->numresolutions;
- }
-
- for (resno = 0; resno < comp->numresolutions; resno++) {
- int levelno;
- int rx0, ry0, rx1, ry1;
- int px0, py0, px1, py1;
- opj_pi_resolution_t *res = &comp->resolutions[resno];
- if (tccp->csty & J2K_CCP_CSTY_PRT) {
- res->pdx = tccp->prcw[resno];
- res->pdy = tccp->prch[resno];
- } else {
- res->pdx = 15;
- res->pdy = 15;
- }
- levelno = comp->numresolutions - 1 - resno;
- rx0 = int_ceildivpow2(tcx0, levelno);
- ry0 = int_ceildivpow2(tcy0, levelno);
- rx1 = int_ceildivpow2(tcx1, levelno);
- ry1 = int_ceildivpow2(tcy1, levelno);
- px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
- py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
- px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
- py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
- res->pw = (rx0 == rx1) ? 0 : ((px1 - px0) >> res->pdx);
- res->ph = (ry0 == ry1) ? 0 : ((py1 - py0) >> res->pdy);
-
- if (res->pw * res->ph > maxprec) {
- maxprec = res->pw * res->ph;
- }
- }
- }
-
- tccp = &tcp->tccps[0];
- pi[pino].step_p = 1;
- pi[pino].step_c = maxprec * pi[pino].step_p;
- pi[pino].step_r = image->numcomps * pi[pino].step_c;
- pi[pino].step_l = maxres * pi[pino].step_r;
-
- for (compno = 0; compno < pi->numcomps; compno++) {
- opj_pi_comp_t *comp = &pi->comps[compno];
- for (resno = 0; resno < comp->numresolutions; resno++) {
- int dx, dy;
- opj_pi_resolution_t *res = &comp->resolutions[resno];
- dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
- dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
- pi[pino].dx = !pi->dx ? dx : int_min(pi->dx, dx);
- pi[pino].dy = !pi->dy ? dy : int_min(pi->dy, dy);
- }
- }
-
- if (pino == 0) {
- pi[pino].include = (short int*) opj_calloc(tcp->numlayers * pi[pino].step_l,
- sizeof(short int));
- if (!pi[pino].include) {
- pi_destroy(pi, cp, tileno);
- return NULL;
- }
- } else {
- pi[pino].include = pi[pino - 1].include;
- }
-
- /* Generation of boundaries for each prog flag*/
- if (tcp->POC && (cp->cinema || ((!cp->cinema) && (t2_mode == FINAL_PASS)))) {
- tcp->pocs[pino].compS = tcp->pocs[pino].compno0;
- tcp->pocs[pino].compE = tcp->pocs[pino].compno1;
- tcp->pocs[pino].resS = tcp->pocs[pino].resno0;
- tcp->pocs[pino].resE = tcp->pocs[pino].resno1;
- tcp->pocs[pino].layE = tcp->pocs[pino].layno1;
- tcp->pocs[pino].prg = tcp->pocs[pino].prg1;
- if (pino > 0) {
- tcp->pocs[pino].layS = (tcp->pocs[pino].layE > tcp->pocs[pino - 1].layE) ?
- tcp->pocs[pino - 1].layE : 0;
- }
- } else {
- tcp->pocs[pino].compS = 0;
- tcp->pocs[pino].compE = image->numcomps;
- tcp->pocs[pino].resS = 0;
- tcp->pocs[pino].resE = maxres;
- tcp->pocs[pino].layS = 0;
- tcp->pocs[pino].layE = tcp->numlayers;
- tcp->pocs[pino].prg = tcp->prg;
- }
- tcp->pocs[pino].prcS = 0;
- tcp->pocs[pino].prcE = maxprec;;
- tcp->pocs[pino].txS = pi[pino].tx0;
- tcp->pocs[pino].txE = pi[pino].tx1;
- tcp->pocs[pino].tyS = pi[pino].ty0;
- tcp->pocs[pino].tyE = pi[pino].ty1;
- tcp->pocs[pino].dx = pi[pino].dx;
- tcp->pocs[pino].dy = pi[pino].dy;
- }
- return pi;
-}
-
-
-
-void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno)
-{
- int compno, pino;
- opj_tcp_t *tcp = &cp->tcps[tileno];
- if (pi) {
- for (pino = 0; pino < tcp->numpocs + 1; pino++) {
- if (pi[pino].comps) {
- for (compno = 0; compno < pi->numcomps; compno++) {
- opj_pi_comp_t *comp = &pi[pino].comps[compno];
- if (comp->resolutions) {
- opj_free(comp->resolutions);
- }
- }
- opj_free(pi[pino].comps);
- }
- }
- if (pi->include) {
- opj_free(pi->include);
- }
- opj_free(pi);
- }
-}
-
-opj_bool pi_next(opj_pi_iterator_t * pi)
-{
- switch (pi->poc.prg) {
- case LRCP:
- return pi_next_lrcp(pi);
- case RLCP:
- return pi_next_rlcp(pi);
- case RPCL:
- return pi_next_rpcl(pi);
- case PCRL:
- return pi_next_pcrl(pi);
- case CPRL:
- return pi_next_cprl(pi);
- case PROG_UNKNOWN:
- return OPJ_FALSE;
- }
-
- return OPJ_FALSE;
-}
-
-opj_bool pi_create_encode(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno,
- int pino, int tpnum, int tppos, J2K_T2_MODE t2_mode, int cur_totnum_tp)
-{
- char prog[4];
- int i;
- int incr_top = 1, resetX = 0;
- opj_tcp_t *tcps = &cp->tcps[tileno];
- opj_poc_t *tcp = &tcps->pocs[pino];
-
- pi[pino].first = 1;
- pi[pino].poc.prg = tcp->prg;
-
- switch (tcp->prg) {
- case CPRL:
- strncpy(prog, "CPRL", 4);
- break;
- case LRCP:
- strncpy(prog, "LRCP", 4);
- break;
- case PCRL:
- strncpy(prog, "PCRL", 4);
- break;
- case RLCP:
- strncpy(prog, "RLCP", 4);
- break;
- case RPCL:
- strncpy(prog, "RPCL", 4);
- break;
- case PROG_UNKNOWN:
- return OPJ_TRUE;
- }
-
- if (!(cp->tp_on && ((!cp->cinema && (t2_mode == FINAL_PASS)) || cp->cinema))) {
- pi[pino].poc.resno0 = tcp->resS;
- pi[pino].poc.resno1 = tcp->resE;
- pi[pino].poc.compno0 = tcp->compS;
- pi[pino].poc.compno1 = tcp->compE;
- pi[pino].poc.layno0 = tcp->layS;
- pi[pino].poc.layno1 = tcp->layE;
- pi[pino].poc.precno0 = tcp->prcS;
- pi[pino].poc.precno1 = tcp->prcE;
- pi[pino].poc.tx0 = tcp->txS;
- pi[pino].poc.ty0 = tcp->tyS;
- pi[pino].poc.tx1 = tcp->txE;
- pi[pino].poc.ty1 = tcp->tyE;
- } else {
- if (tpnum < cur_totnum_tp) {
- for (i = 3; i >= 0; i--) {
- switch (prog[i]) {
- case 'C':
- if (i > tppos) {
- pi[pino].poc.compno0 = tcp->compS;
- pi[pino].poc.compno1 = tcp->compE;
- } else {
- if (tpnum == 0) {
- tcp->comp_t = tcp->compS;
- pi[pino].poc.compno0 = tcp->comp_t;
- pi[pino].poc.compno1 = tcp->comp_t + 1;
- tcp->comp_t += 1;
- } else {
- if (incr_top == 1) {
- if (tcp->comp_t == tcp->compE) {
- tcp->comp_t = tcp->compS;
- pi[pino].poc.compno0 = tcp->comp_t;
- pi[pino].poc.compno1 = tcp->comp_t + 1;
- tcp->comp_t += 1;
- incr_top = 1;
- } else {
- pi[pino].poc.compno0 = tcp->comp_t;
- pi[pino].poc.compno1 = tcp->comp_t + 1;
- tcp->comp_t += 1;
- incr_top = 0;
- }
- } else {
- pi[pino].poc.compno0 = tcp->comp_t - 1;
- pi[pino].poc.compno1 = tcp->comp_t;
- }
- }
- }
- break;
-
- case 'R':
- if (i > tppos) {
- pi[pino].poc.resno0 = tcp->resS;
- pi[pino].poc.resno1 = tcp->resE;
- } else {
- if (tpnum == 0) {
- tcp->res_t = tcp->resS;
- pi[pino].poc.resno0 = tcp->res_t;
- pi[pino].poc.resno1 = tcp->res_t + 1;
- tcp->res_t += 1;
- } else {
- if (incr_top == 1) {
- if (tcp->res_t == tcp->resE) {
- tcp->res_t = tcp->resS;
- pi[pino].poc.resno0 = tcp->res_t;
- pi[pino].poc.resno1 = tcp->res_t + 1;
- tcp->res_t += 1;
- incr_top = 1;
- } else {
- pi[pino].poc.resno0 = tcp->res_t;
- pi[pino].poc.resno1 = tcp->res_t + 1;
- tcp->res_t += 1;
- incr_top = 0;
- }
- } else {
- pi[pino].poc.resno0 = tcp->res_t - 1;
- pi[pino].poc.resno1 = tcp->res_t;
- }
- }
- }
- break;
-
- case 'L':
- if (i > tppos) {
- pi[pino].poc.layno0 = tcp->layS;
- pi[pino].poc.layno1 = tcp->layE;
- } else {
- if (tpnum == 0) {
- tcp->lay_t = tcp->layS;
- pi[pino].poc.layno0 = tcp->lay_t;
- pi[pino].poc.layno1 = tcp->lay_t + 1;
- tcp->lay_t += 1;
- } else {
- if (incr_top == 1) {
- if (tcp->lay_t == tcp->layE) {
- tcp->lay_t = tcp->layS;
- pi[pino].poc.layno0 = tcp->lay_t;
- pi[pino].poc.layno1 = tcp->lay_t + 1;
- tcp->lay_t += 1;
- incr_top = 1;
- } else {
- pi[pino].poc.layno0 = tcp->lay_t;
- pi[pino].poc.layno1 = tcp->lay_t + 1;
- tcp->lay_t += 1;
- incr_top = 0;
- }
- } else {
- pi[pino].poc.layno0 = tcp->lay_t - 1;
- pi[pino].poc.layno1 = tcp->lay_t;
- }
- }
- }
- break;
-
- case 'P':
- switch (tcp->prg) {
- case LRCP:
- case RLCP:
- if (i > tppos) {
- pi[pino].poc.precno0 = tcp->prcS;
- pi[pino].poc.precno1 = tcp->prcE;
- } else {
- if (tpnum == 0) {
- tcp->prc_t = tcp->prcS;
- pi[pino].poc.precno0 = tcp->prc_t;
- pi[pino].poc.precno1 = tcp->prc_t + 1;
- tcp->prc_t += 1;
- } else {
- if (incr_top == 1) {
- if (tcp->prc_t == tcp->prcE) {
- tcp->prc_t = tcp->prcS;
- pi[pino].poc.precno0 = tcp->prc_t;
- pi[pino].poc.precno1 = tcp->prc_t + 1;
- tcp->prc_t += 1;
- incr_top = 1;
- } else {
- pi[pino].poc.precno0 = tcp->prc_t;
- pi[pino].poc.precno1 = tcp->prc_t + 1;
- tcp->prc_t += 1;
- incr_top = 0;
- }
- } else {
- pi[pino].poc.precno0 = tcp->prc_t - 1;
- pi[pino].poc.precno1 = tcp->prc_t;
- }
- }
- }
- break;
- default:
- if (i > tppos) {
- pi[pino].poc.tx0 = tcp->txS;
- pi[pino].poc.ty0 = tcp->tyS;
- pi[pino].poc.tx1 = tcp->txE;
- pi[pino].poc.ty1 = tcp->tyE;
- } else {
- if (tpnum == 0) {
- tcp->tx0_t = tcp->txS;
- tcp->ty0_t = tcp->tyS;
- pi[pino].poc.tx0 = tcp->tx0_t;
- pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx);
- pi[pino].poc.ty0 = tcp->ty0_t;
- pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy);
- tcp->tx0_t = pi[pino].poc.tx1;
- tcp->ty0_t = pi[pino].poc.ty1;
- } else {
- if (incr_top == 1) {
- if (tcp->tx0_t >= tcp->txE) {
- if (tcp->ty0_t >= tcp->tyE) {
- tcp->ty0_t = tcp->tyS;
- pi[pino].poc.ty0 = tcp->ty0_t;
- pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy);
- tcp->ty0_t = pi[pino].poc.ty1;
- incr_top = 1;
- resetX = 1;
- } else {
- pi[pino].poc.ty0 = tcp->ty0_t;
- pi[pino].poc.ty1 = tcp->ty0_t + tcp->dy - (tcp->ty0_t % tcp->dy);
- tcp->ty0_t = pi[pino].poc.ty1;
- incr_top = 0;
- resetX = 1;
- }
- if (resetX == 1) {
- tcp->tx0_t = tcp->txS;
- pi[pino].poc.tx0 = tcp->tx0_t;
- pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx);
- tcp->tx0_t = pi[pino].poc.tx1;
- }
- } else {
- pi[pino].poc.tx0 = tcp->tx0_t;
- pi[pino].poc.tx1 = tcp->tx0_t + tcp->dx - (tcp->tx0_t % tcp->dx);
- tcp->tx0_t = pi[pino].poc.tx1;
- pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy);
- pi[pino].poc.ty1 = tcp->ty0_t ;
- incr_top = 0;
- }
- } else {
- pi[pino].poc.tx0 = tcp->tx0_t - tcp->dx - (tcp->tx0_t % tcp->dx);
- pi[pino].poc.tx1 = tcp->tx0_t ;
- pi[pino].poc.ty0 = tcp->ty0_t - tcp->dy - (tcp->ty0_t % tcp->dy);
- pi[pino].poc.ty1 = tcp->ty0_t ;
- }
- }
- }
- break;
- }
- break;
- }
- }
- }
- }
- return OPJ_FALSE;
-}
-
+++ /dev/null
-/*
- * 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 __PI_H
-#define __PI_H
-/**
-@file pi.h
-@brief Implementation of a packet iterator (PI)
-
-The functions in PI.C have for goal to realize a packet iterator that permits to get the next
-packet following the progression order and change of it. The functions in PI.C are used
-by some function in T2.C.
-*/
-
-/** @defgroup PI PI - Implementation of a packet iterator */
-/*@{*/
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_pi_resolution {
- int pdx, pdy;
- int pw, ph;
-} opj_pi_resolution_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_pi_comp {
- int dx, dy;
- /** number of resolution levels */
- int numresolutions;
- opj_pi_resolution_t *resolutions;
-} opj_pi_comp_t;
-
-/**
-Packet iterator
-*/
-typedef struct opj_pi_iterator {
- /** Enabling Tile part generation*/
- char tp_on;
- /** precise if the packet has been already used (useful for progression order change) */
- short int *include;
- /** layer step used to localize the packet in the include vector */
- int step_l;
- /** resolution step used to localize the packet in the include vector */
- int step_r;
- /** component step used to localize the packet in the include vector */
- int step_c;
- /** precinct step used to localize the packet in the include vector */
- int step_p;
- /** component that identify the packet */
- int compno;
- /** resolution that identify the packet */
- int resno;
- /** precinct that identify the packet */
- int precno;
- /** layer that identify the packet */
- int layno;
- /** 0 if the first packet */
- int first;
- /** progression order change information */
- opj_poc_t poc;
- /** number of components in the image */
- int numcomps;
- /** Components*/
- opj_pi_comp_t *comps;
- int tx0, ty0, tx1, ty1;
- int x, y, dx, dy;
-} opj_pi_iterator_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a packet iterator for Encoder
-@param image Raw image for which the packets will be listed
-@param cp Coding parameters
-@param tileno Number that identifies the tile for which to list the packets
-@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass
-@return Returns a packet iterator that points to the first packet of the tile
-@see pi_destroy
-*/
-opj_pi_iterator_t *pi_initialise_encode(opj_image_t *image, opj_cp_t *cp,
- int tileno, J2K_T2_MODE t2_mode);
-/**
-Modify the packet iterator for enabling tile part generation
-@param pi Handle to the packet iterator generated in pi_initialise_encode
-@param cp Coding parameters
-@param tileno Number that identifies the tile for which to list the packets
-@param pino Iterator index for pi
-@param tpnum Tile part number of the current tile
-@param tppos The position of the tile part flag in the progression order
-@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass
-@param cur_totnum_tp The total number of tile parts in the current tile
-@return Returns true if an error is detected
-*/
-opj_bool pi_create_encode(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno,
- int pino, int tpnum, int tppos, J2K_T2_MODE t2_mode, int cur_totnum_tp);
-/**
-Create a packet iterator for Decoder
-@param image Raw image for which the packets will be listed
-@param cp Coding parameters
-@param tileno Number that identifies the tile for which to list the packets
-@return Returns a packet iterator that points to the first packet of the tile
-@see pi_destroy
-*/
-opj_pi_iterator_t *pi_create_decode(opj_image_t * image, opj_cp_t * cp,
- int tileno);
-
-/**
-Destroy a packet iterator
-@param pi Previously created packet iterator
-@param cp Coding parameters
-@param tileno Number that identifies the tile for which the packets were listed
-@see pi_create
-*/
-void pi_destroy(opj_pi_iterator_t *pi, opj_cp_t *cp, int tileno);
-
-/**
-Modify the packet iterator to point to the next packet
-@param pi Packet iterator to modify
-@return Returns false if pi pointed to the last packet or else returns true
-*/
-opj_bool pi_next(opj_pi_iterator_t * pi);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __PI_H */
+++ /dev/null
-/*
- * 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
- * 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.
- */
-
-#include "opj_includes.h"
-
-/*
-==========================================================
- local functions
-==========================================================
-*/
-
-
-/*
-==========================================================
- RAW encoding interface
-==========================================================
-*/
-
-opj_raw_t* raw_create(void)
-{
- opj_raw_t *raw = (opj_raw_t*)opj_malloc(sizeof(opj_raw_t));
- return raw;
-}
-
-void raw_destroy(opj_raw_t *raw)
-{
- if (raw) {
- opj_free(raw);
- }
-}
-
-int raw_numbytes(opj_raw_t *raw)
-{
- return raw->bp - raw->start;
-}
-
-void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len)
-{
- raw->start = bp;
- raw->lenmax = len;
- raw->len = 0;
- raw->c = 0;
- raw->ct = 0;
-}
-
-int raw_decode(opj_raw_t *raw)
-{
- int d;
- if (raw->ct == 0) {
- raw->ct = 8;
- if (raw->len == raw->lenmax) {
- raw->c = 0xff;
- } else {
- if (raw->c == 0xff) {
- raw->ct = 7;
- }
- raw->c = *(raw->start + raw->len);
- raw->len++;
- }
- }
- raw->ct--;
- d = (raw->c >> raw->ct) & 0x01;
-
- return d;
-}
-
+++ /dev/null
-/*
- * 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
- * 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 __RAW_H
-#define __RAW_H
-/**
-@file raw.h
-@brief Implementation of operations for raw encoding (RAW)
-
-The functions in RAW.C have for goal to realize the operation of raw encoding linked
-with the corresponding mode switch.
-*/
-
-/** @defgroup RAW RAW - Implementation of operations for raw encoding */
-/*@{*/
-
-/**
-RAW encoding operations
-*/
-typedef struct opj_raw {
- /** temporary buffer where bits are coded or decoded */
- unsigned char c;
- /** number of bits already read or free to write */
- unsigned int ct;
- /** maximum length to decode */
- unsigned int lenmax;
- /** length decoded */
- unsigned int len;
- /** pointer to the current position in the buffer */
- unsigned char *bp;
- /** pointer to the start of the buffer */
- unsigned char *start;
- /** pointer to the end of the buffer */
- unsigned char *end;
-} opj_raw_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a new RAW handle
-@return Returns a new RAW handle if successful, returns NULL otherwise
-*/
-opj_raw_t* raw_create(void);
-/**
-Destroy a previously created RAW handle
-@param raw RAW handle to destroy
-*/
-void raw_destroy(opj_raw_t *raw);
-/**
-Return the number of bytes written/read since initialisation
-@param raw RAW handle to destroy
-@return Returns the number of bytes already encoded
-*/
-int raw_numbytes(opj_raw_t *raw);
-/**
-Initialize the decoder
-@param raw RAW handle
-@param bp Pointer to the start of the buffer from which the bytes will be read
-@param len Length of the input buffer
-*/
-void raw_init_dec(opj_raw_t *raw, unsigned char *bp, int len);
-/**
-Decode a symbol using raw-decoder. Cfr p.506 TAUBMAN
-@param raw RAW handle
-@return Returns the decoded symbol (0 or 1)
-*/
-int raw_decode(opj_raw_t *raw);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __RAW_H */
+++ /dev/null
-/*
- * 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) 2007, Callum Lerwick <seg@haxxed.com>
- * 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_includes.h"
-#include "t1_luts.h"
-
-/** @defgroup T1 T1 - Implementation of the tier-1 coding */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-static INLINE char t1_getctxno_zc(int f, int orient);
-static char t1_getctxno_sc(int f);
-static INLINE int t1_getctxno_mag(int f);
-static char t1_getspb(int f);
-static short t1_getnmsedec_sig(int x, int bitpos);
-static short t1_getnmsedec_ref(int x, int bitpos);
-static void t1_updateflags(flag_t *flagsp, int s, int stride);
-/**
-Encode significant pass
-*/
-static void t1_enc_sigpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int bpno,
- int one,
- int *nmsedec,
- char type,
- int vsc);
-/**
-Decode significant pass
-*/
-static INLINE void t1_dec_sigpass_step_raw(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf,
- int vsc);
-static INLINE void t1_dec_sigpass_step_mqc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf);
-static INLINE void t1_dec_sigpass_step_mqc_vsc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf,
- int vsc);
-/**
-Encode significant pass
-*/
-static void t1_enc_sigpass(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int *nmsedec,
- char type,
- int cblksty);
-/**
-Decode significant pass
-*/
-static void t1_dec_sigpass_raw(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int cblksty);
-static void t1_dec_sigpass_mqc(
- opj_t1_t *t1,
- int bpno,
- int orient);
-static void t1_dec_sigpass_mqc_vsc(
- opj_t1_t *t1,
- int bpno,
- int orient);
-/**
-Encode refinement pass
-*/
-static void t1_enc_refpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int bpno,
- int one,
- int *nmsedec,
- char type,
- int vsc);
-/**
-Decode refinement pass
-*/
-static INLINE void t1_dec_refpass_step_raw(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int poshalf,
- int neghalf,
- int vsc);
-static INLINE void t1_dec_refpass_step_mqc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int poshalf,
- int neghalf);
-static INLINE void t1_dec_refpass_step_mqc_vsc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int poshalf,
- int neghalf,
- int vsc);
-
-/**
-Encode refinement pass
-*/
-static void t1_enc_refpass(
- opj_t1_t *t1,
- int bpno,
- int *nmsedec,
- char type,
- int cblksty);
-/**
-Decode refinement pass
-*/
-static void t1_dec_refpass_raw(
- opj_t1_t *t1,
- int bpno,
- int cblksty);
-static void t1_dec_refpass_mqc(
- opj_t1_t *t1,
- int bpno);
-static void t1_dec_refpass_mqc_vsc(
- opj_t1_t *t1,
- int bpno);
-/**
-Encode clean-up pass
-*/
-static void t1_enc_clnpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int bpno,
- int one,
- int *nmsedec,
- int partial,
- int vsc);
-/**
-Decode clean-up pass
-*/
-static void t1_dec_clnpass_step_partial(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf);
-static void t1_dec_clnpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf);
-static void t1_dec_clnpass_step_vsc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf,
- int partial,
- int vsc);
-/**
-Encode clean-up pass
-*/
-static void t1_enc_clnpass(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int *nmsedec,
- int cblksty);
-/**
-Decode clean-up pass
-*/
-static void t1_dec_clnpass(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int cblksty);
-static double t1_getwmsedec(
- int nmsedec,
- int compno,
- int level,
- int orient,
- int bpno,
- int qmfbid,
- double stepsize,
- int numcomps,
- int mct);
-/**
-Encode 1 code-block
-@param t1 T1 handle
-@param cblk Code-block coding parameters
-@param orient
-@param compno Component number
-@param level
-@param qmfbid
-@param stepsize
-@param cblksty Code-block style
-@param numcomps
-@param mct
-@param tile
-*/
-static void t1_encode_cblk(
- opj_t1_t *t1,
- opj_tcd_cblk_enc_t* cblk,
- int orient,
- int compno,
- int level,
- int qmfbid,
- double stepsize,
- int cblksty,
- int numcomps,
- int mct,
- opj_tcd_tile_t * tile);
-/**
-Decode 1 code-block
-@param t1 T1 handle
-@param cblk Code-block coding parameters
-@param orient
-@param roishift Region of interest shifting value
-@param cblksty Code-block style
-*/
-static void t1_decode_cblk(
- opj_t1_t *t1,
- opj_tcd_cblk_dec_t* cblk,
- int orient,
- int roishift,
- int cblksty);
-
-/*@}*/
-
-/*@}*/
-
-/* ----------------------------------------------------------------------- */
-
-static char t1_getctxno_zc(int f, int orient)
-{
- return lut_ctxno_zc[(orient << 8) | (f & T1_SIG_OTH)];
-}
-
-static char t1_getctxno_sc(int f)
-{
- return lut_ctxno_sc[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
-}
-
-static int t1_getctxno_mag(int f)
-{
- int tmp1 = (f & T1_SIG_OTH) ? T1_CTXNO_MAG + 1 : T1_CTXNO_MAG;
- int tmp2 = (f & T1_REFINE) ? T1_CTXNO_MAG + 2 : tmp1;
- return (tmp2);
-}
-
-static char t1_getspb(int f)
-{
- return lut_spb[(f & (T1_SIG_PRIM | T1_SGN)) >> 4];
-}
-
-static short t1_getnmsedec_sig(int x, int bitpos)
-{
- if (bitpos > T1_NMSEDEC_FRACBITS) {
- return lut_nmsedec_sig[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((
- 1 << T1_NMSEDEC_BITS) - 1)];
- }
-
- return lut_nmsedec_sig0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
-}
-
-static short t1_getnmsedec_ref(int x, int bitpos)
-{
- if (bitpos > T1_NMSEDEC_FRACBITS) {
- return lut_nmsedec_ref[(x >> (bitpos - T1_NMSEDEC_FRACBITS)) & ((
- 1 << T1_NMSEDEC_BITS) - 1)];
- }
-
- return lut_nmsedec_ref0[x & ((1 << T1_NMSEDEC_BITS) - 1)];
-}
-
-static void t1_updateflags(flag_t *flagsp, int s, int stride)
-{
- flag_t *np = flagsp - stride;
- flag_t *sp = flagsp + stride;
-
- static const flag_t mod[] = {
- T1_SIG_S, T1_SIG_S | T1_SGN_S,
- T1_SIG_E, T1_SIG_E | T1_SGN_E,
- T1_SIG_W, T1_SIG_W | T1_SGN_W,
- T1_SIG_N, T1_SIG_N | T1_SGN_N
- };
-
- np[-1] |= T1_SIG_SE;
- np[0] |= mod[s];
- np[1] |= T1_SIG_SW;
-
- flagsp[-1] |= mod[s + 2];
- flagsp[0] |= T1_SIG;
- flagsp[1] |= mod[s + 4];
-
- sp[-1] |= T1_SIG_NE;
- sp[0] |= mod[s + 6];
- sp[1] |= T1_SIG_NW;
-}
-
-static void t1_enc_sigpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int bpno,
- int one,
- int *nmsedec,
- char type,
- int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
- (*flagsp);
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- v = int_abs(*datap) & one ? 1 : 0;
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient)); /* ESSAI */
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_encode(mqc, v);
- }
- if (v) {
- v = *datap < 0 ? 1 : 0;
- *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
- mqc_setcurctx(mqc, t1_getctxno_sc(flag)); /* ESSAI */
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_encode(mqc, v ^ t1_getspb(flag));
- }
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- *flagsp |= T1_VISIT;
- }
-}
-
-static INLINE void t1_dec_sigpass_step_raw(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf,
- int vsc)
-{
- int v, flag;
- opj_raw_t *raw = t1->raw; /* RAW component */
-
- OPJ_ARG_NOT_USED(orient);
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
- (*flagsp);
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- if (raw_decode(raw)) {
- v = raw_decode(raw); /* ESSAI */
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- *flagsp |= T1_VISIT;
- }
-} /* VSC and BYPASS by Antonin */
-
-static INLINE void t1_dec_sigpass_step_mqc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = *flagsp;
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- *flagsp |= T1_VISIT;
- }
-} /* VSC and BYPASS by Antonin */
-
-static INLINE void t1_dec_sigpass_step_mqc_vsc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf,
- int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
- (*flagsp);
- if ((flag & T1_SIG_OTH) && !(flag & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- *flagsp |= T1_VISIT;
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_enc_sigpass(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int *nmsedec,
- char type,
- int cblksty)
-{
- int i, j, k, one, vsc;
- *nmsedec = 0;
- one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- for (j = k; j < k + 4 && j < t1->h; ++j) {
- vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 ||
- j == t1->h - 1)) ? 1 : 0;
- t1_enc_sigpass_step(
- t1,
- &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- orient,
- bpno,
- one,
- nmsedec,
- type,
- vsc);
- }
- }
- }
-}
-
-static void t1_dec_sigpass_raw(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int cblksty)
-{
- int i, j, k, one, half, oneplushalf, vsc;
- one = 1 << bpno;
- half = one >> 1;
- oneplushalf = one | half;
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- for (j = k; j < k + 4 && j < t1->h; ++j) {
- vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 ||
- j == t1->h - 1)) ? 1 : 0;
- t1_dec_sigpass_step_raw(
- t1,
- &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- orient,
- oneplushalf,
- vsc);
- }
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_dec_sigpass_mqc(
- opj_t1_t *t1,
- int bpno,
- int orient)
-{
- int i, j, k, one, half, oneplushalf;
- int *data1 = t1->data;
- flag_t *flags1 = &t1->flags[1];
- one = 1 << bpno;
- half = one >> 1;
- oneplushalf = one | half;
- for (k = 0; k < (t1->h & ~3); k += 4) {
- for (i = 0; i < t1->w; ++i) {
- int *data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- }
- data1 += t1->w << 2;
- flags1 += t1->flags_stride << 2;
- }
- for (i = 0; i < t1->w; ++i) {
- int *data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- for (j = k; j < t1->h; ++j) {
- flags2 += t1->flags_stride;
- t1_dec_sigpass_step_mqc(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_dec_sigpass_mqc_vsc(
- opj_t1_t *t1,
- int bpno,
- int orient)
-{
- int i, j, k, one, half, oneplushalf, vsc;
- one = 1 << bpno;
- half = one >> 1;
- oneplushalf = one | half;
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- for (j = k; j < k + 4 && j < t1->h; ++j) {
- vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
- t1_dec_sigpass_step_mqc_vsc(
- t1,
- &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- orient,
- oneplushalf,
- vsc);
- }
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_enc_refpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int bpno,
- int one,
- int *nmsedec,
- char type,
- int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
- (*flagsp);
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- *nmsedec += t1_getnmsedec_ref(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
- v = int_abs(*datap) & one ? 1 : 0;
- mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
- if (type == T1_TYPE_RAW) { /* BYPASS/LAZY MODE */
- mqc_bypass_enc(mqc, v);
- } else {
- mqc_encode(mqc, v);
- }
- *flagsp |= T1_REFINE;
- }
-}
-
-static INLINE void t1_dec_refpass_step_raw(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int poshalf,
- int neghalf,
- int vsc)
-{
- int v, t, flag;
-
- opj_raw_t *raw = t1->raw; /* RAW component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
- (*flagsp);
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- v = raw_decode(raw);
- t = v ? poshalf : neghalf;
- *datap += *datap < 0 ? -t : t;
- *flagsp |= T1_REFINE;
- }
-} /* VSC and BYPASS by Antonin */
-
-static INLINE void t1_dec_refpass_step_mqc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int poshalf,
- int neghalf)
-{
- int v, t, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = *flagsp;
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
- v = mqc_decode(mqc);
- t = v ? poshalf : neghalf;
- *datap += *datap < 0 ? -t : t;
- *flagsp |= T1_REFINE;
- }
-} /* VSC and BYPASS by Antonin */
-
-static INLINE void t1_dec_refpass_step_mqc_vsc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int poshalf,
- int neghalf,
- int vsc)
-{
- int v, t, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
- (*flagsp);
- if ((flag & (T1_SIG | T1_VISIT)) == T1_SIG) {
- mqc_setcurctx(mqc, t1_getctxno_mag(flag)); /* ESSAI */
- v = mqc_decode(mqc);
- t = v ? poshalf : neghalf;
- *datap += *datap < 0 ? -t : t;
- *flagsp |= T1_REFINE;
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_enc_refpass(
- opj_t1_t *t1,
- int bpno,
- int *nmsedec,
- char type,
- int cblksty)
-{
- int i, j, k, one, vsc;
- *nmsedec = 0;
- one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- for (j = k; j < k + 4 && j < t1->h; ++j) {
- vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 ||
- j == t1->h - 1)) ? 1 : 0;
- t1_enc_refpass_step(
- t1,
- &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- bpno,
- one,
- nmsedec,
- type,
- vsc);
- }
- }
- }
-}
-
-static void t1_dec_refpass_raw(
- opj_t1_t *t1,
- int bpno,
- int cblksty)
-{
- int i, j, k, one, poshalf, neghalf;
- int vsc;
- one = 1 << bpno;
- poshalf = one >> 1;
- neghalf = bpno > 0 ? -poshalf : -1;
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- for (j = k; j < k + 4 && j < t1->h; ++j) {
- vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 ||
- j == t1->h - 1)) ? 1 : 0;
- t1_dec_refpass_step_raw(
- t1,
- &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- poshalf,
- neghalf,
- vsc);
- }
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_dec_refpass_mqc(
- opj_t1_t *t1,
- int bpno)
-{
- int i, j, k, one, poshalf, neghalf;
- int *data1 = t1->data;
- flag_t *flags1 = &t1->flags[1];
- one = 1 << bpno;
- poshalf = one >> 1;
- neghalf = bpno > 0 ? -poshalf : -1;
- for (k = 0; k < (t1->h & ~3); k += 4) {
- for (i = 0; i < t1->w; ++i) {
- int *data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += t1->w;
- }
- data1 += t1->w << 2;
- flags1 += t1->flags_stride << 2;
- }
- for (i = 0; i < t1->w; ++i) {
- int *data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- for (j = k; j < t1->h; ++j) {
- flags2 += t1->flags_stride;
- t1_dec_refpass_step_mqc(t1, flags2, data2, poshalf, neghalf);
- data2 += t1->w;
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_dec_refpass_mqc_vsc(
- opj_t1_t *t1,
- int bpno)
-{
- int i, j, k, one, poshalf, neghalf;
- int vsc;
- one = 1 << bpno;
- poshalf = one >> 1;
- neghalf = bpno > 0 ? -poshalf : -1;
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- for (j = k; j < k + 4 && j < t1->h; ++j) {
- vsc = ((j == k + 3 || j == t1->h - 1)) ? 1 : 0;
- t1_dec_refpass_step_mqc_vsc(
- t1,
- &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- poshalf,
- neghalf,
- vsc);
- }
- }
- }
-} /* VSC and BYPASS by Antonin */
-
-static void t1_enc_clnpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int bpno,
- int one,
- int *nmsedec,
- int partial,
- int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
- (*flagsp);
- if (partial) {
- goto LABEL_PARTIAL;
- }
- if (!(*flagsp & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- v = int_abs(*datap) & one ? 1 : 0;
- mqc_encode(mqc, v);
- if (v) {
-LABEL_PARTIAL:
- *nmsedec += t1_getnmsedec_sig(int_abs(*datap), bpno + T1_NMSEDEC_FRACBITS);
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- v = *datap < 0 ? 1 : 0;
- mqc_encode(mqc, v ^ t1_getspb(flag));
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- }
- *flagsp &= ~T1_VISIT;
-}
-
-static void t1_dec_clnpass_step_partial(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf)
-{
- int v, flag;
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- OPJ_ARG_NOT_USED(orient);
-
- flag = *flagsp;
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- *flagsp &= ~T1_VISIT;
-} /* VSC and BYPASS by Antonin */
-
-static void t1_dec_clnpass_step(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = *flagsp;
- if (!(flag & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- }
- *flagsp &= ~T1_VISIT;
-} /* VSC and BYPASS by Antonin */
-
-static void t1_dec_clnpass_step_vsc(
- opj_t1_t *t1,
- flag_t *flagsp,
- int *datap,
- int orient,
- int oneplushalf,
- int partial,
- int vsc)
-{
- int v, flag;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- flag = vsc ? ((*flagsp) & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) :
- (*flagsp);
- if (partial) {
- goto LABEL_PARTIAL;
- }
- if (!(flag & (T1_SIG | T1_VISIT))) {
- mqc_setcurctx(mqc, t1_getctxno_zc(flag, orient));
- if (mqc_decode(mqc)) {
-LABEL_PARTIAL:
- mqc_setcurctx(mqc, t1_getctxno_sc(flag));
- v = mqc_decode(mqc) ^ t1_getspb(flag);
- *datap = v ? -oneplushalf : oneplushalf;
- t1_updateflags(flagsp, v, t1->flags_stride);
- }
- }
- *flagsp &= ~T1_VISIT;
-}
-
-static void t1_enc_clnpass(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int *nmsedec,
- int cblksty)
-{
- int i, j, k, one, agg, runlen, vsc;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- *nmsedec = 0;
- one = 1 << (bpno + T1_NMSEDEC_FRACBITS);
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- if (k + 3 < t1->h) {
- if (cblksty & J2K_CCP_CBLKSTY_VSC) {
- agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || (MACRO_t1_flags(1 + k + 3, 1 + i)
- & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT |
- T1_SIG_OTH));
- } else {
- agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 3, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
- }
- } else {
- agg = 0;
- }
- if (agg) {
- for (runlen = 0; runlen < 4; ++runlen) {
- if (int_abs(t1->data[((k + runlen)*t1->w) + i]) & one) {
- break;
- }
- }
- mqc_setcurctx(mqc, T1_CTXNO_AGG);
- mqc_encode(mqc, runlen != 4);
- if (runlen == 4) {
- continue;
- }
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- mqc_encode(mqc, runlen >> 1);
- mqc_encode(mqc, runlen & 1);
- } else {
- runlen = 0;
- }
- for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
- vsc = ((cblksty & J2K_CCP_CBLKSTY_VSC) && (j == k + 3 ||
- j == t1->h - 1)) ? 1 : 0;
- t1_enc_clnpass_step(
- t1,
- &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- orient,
- bpno,
- one,
- nmsedec,
- agg && (j == k + runlen),
- vsc);
- }
- }
- }
-}
-
-static void t1_dec_clnpass(
- opj_t1_t *t1,
- int bpno,
- int orient,
- int cblksty)
-{
- int i, j, k, one, half, oneplushalf, agg, runlen, vsc;
- int segsym = cblksty & J2K_CCP_CBLKSTY_SEGSYM;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- one = 1 << bpno;
- half = one >> 1;
- oneplushalf = one | half;
- if (cblksty & J2K_CCP_CBLKSTY_VSC) {
- for (k = 0; k < t1->h; k += 4) {
- for (i = 0; i < t1->w; ++i) {
- if (k + 3 < t1->h) {
- agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || (MACRO_t1_flags(1 + k + 3, 1 + i)
- & (~(T1_SIG_S | T1_SIG_SE | T1_SIG_SW | T1_SGN_S))) & (T1_SIG | T1_VISIT |
- T1_SIG_OTH));
- } else {
- agg = 0;
- }
- if (agg) {
- mqc_setcurctx(mqc, T1_CTXNO_AGG);
- if (!mqc_decode(mqc)) {
- continue;
- }
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- runlen = mqc_decode(mqc);
- runlen = (runlen << 1) | mqc_decode(mqc);
- } else {
- runlen = 0;
- }
- for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
- vsc = (j == k + 3 || j == t1->h - 1) ? 1 : 0;
- t1_dec_clnpass_step_vsc(
- t1,
- &t1->flags[((j + 1) * t1->flags_stride) + i + 1],
- &t1->data[(j * t1->w) + i],
- orient,
- oneplushalf,
- agg && (j == k + runlen),
- vsc);
- }
- }
- }
- } else {
- int *data1 = t1->data;
- flag_t *flags1 = &t1->flags[1];
- for (k = 0; k < (t1->h & ~3); k += 4) {
- for (i = 0; i < t1->w; ++i) {
- int *data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- agg = !(MACRO_t1_flags(1 + k, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 1, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 2, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH)
- || MACRO_t1_flags(1 + k + 3, 1 + i) & (T1_SIG | T1_VISIT | T1_SIG_OTH));
- if (agg) {
- mqc_setcurctx(mqc, T1_CTXNO_AGG);
- if (!mqc_decode(mqc)) {
- continue;
- }
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- runlen = mqc_decode(mqc);
- runlen = (runlen << 1) | mqc_decode(mqc);
- flags2 += runlen * t1->flags_stride;
- data2 += runlen * t1->w;
- for (j = k + runlen; j < k + 4 && j < t1->h; ++j) {
- flags2 += t1->flags_stride;
- if (agg && (j == k + runlen)) {
- t1_dec_clnpass_step_partial(t1, flags2, data2, orient, oneplushalf);
- } else {
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- }
- data2 += t1->w;
- }
- } else {
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- }
- }
- data1 += t1->w << 2;
- flags1 += t1->flags_stride << 2;
- }
- for (i = 0; i < t1->w; ++i) {
- int *data2 = data1 + i;
- flag_t *flags2 = flags1 + i;
- for (j = k; j < t1->h; ++j) {
- flags2 += t1->flags_stride;
- t1_dec_clnpass_step(t1, flags2, data2, orient, oneplushalf);
- data2 += t1->w;
- }
- }
- }
-
- if (segsym) {
- int v = 0;
- mqc_setcurctx(mqc, T1_CTXNO_UNI);
- v = mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- v = (v << 1) | mqc_decode(mqc);
- /*
- if (v!=0xa) {
- opj_event_msg(t1->cinfo, EVT_WARNING, "Bad segmentation symbol %x\n", v);
- }
- */
- }
-} /* VSC and BYPASS by Antonin */
-
-
-/** mod fixed_quality */
-static double t1_getwmsedec(
- int nmsedec,
- int compno,
- int level,
- int orient,
- int bpno,
- int qmfbid,
- double stepsize,
- int numcomps,
- int mct)
-{
- double w1, w2, wmsedec;
- if (qmfbid == 1) {
- w1 = (mct && numcomps == 3) ? mct_getnorm(compno) : 1.0;
- w2 = dwt_getnorm(level, orient);
- } else { /* if (qmfbid == 0) */
- w1 = (mct && numcomps == 3) ? mct_getnorm_real(compno) : 1.0;
- w2 = dwt_getnorm_real(level, orient);
- }
- wmsedec = w1 * w2 * stepsize * (1 << bpno);
- wmsedec *= wmsedec * nmsedec / 8192.0;
-
- return wmsedec;
-}
-
-static opj_bool allocate_buffers(
- opj_t1_t *t1,
- int w,
- int h)
-{
- int datasize = w * h;
- int flagssize;
-
- if (datasize > t1->datasize) {
- opj_aligned_free(t1->data);
- t1->data = (int*) opj_aligned_malloc(datasize * sizeof(int));
- if (!t1->data) {
- return OPJ_FALSE;
- }
- t1->datasize = datasize;
- }
- memset(t1->data, 0, datasize * sizeof(int));
-
- t1->flags_stride = w + 2;
- flagssize = t1->flags_stride * (h + 2);
-
- if (flagssize > t1->flagssize) {
- opj_aligned_free(t1->flags);
- t1->flags = (flag_t*) opj_aligned_malloc(flagssize * sizeof(flag_t));
- if (!t1->flags) {
- return OPJ_FALSE;
- }
- t1->flagssize = flagssize;
- }
- memset(t1->flags, 0, flagssize * sizeof(flag_t));
-
- t1->w = w;
- t1->h = h;
-
- return OPJ_TRUE;
-}
-
-/** mod fixed_quality */
-static void t1_encode_cblk(
- opj_t1_t *t1,
- opj_tcd_cblk_enc_t* cblk,
- int orient,
- int compno,
- int level,
- int qmfbid,
- double stepsize,
- int cblksty,
- int numcomps,
- int mct,
- opj_tcd_tile_t * tile)
-{
- double cumwmsedec = 0.0;
-
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- int passno, bpno, passtype;
- int nmsedec = 0;
- int i, max;
- char type = T1_TYPE_MQ;
- double tempwmsedec;
-
- max = 0;
- for (i = 0; i < t1->w * t1->h; ++i) {
- int tmp = abs(t1->data[i]);
- max = int_max(max, tmp);
- }
-
- cblk->numbps = max ? (int_floorlog2(max) + 1) - T1_NMSEDEC_FRACBITS : 0;
-
- bpno = cblk->numbps - 1;
- passtype = 2;
-
- mqc_resetstates(mqc);
- mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
- mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
- mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
- mqc_init_enc(mqc, cblk->data);
-
- for (passno = 0; bpno >= 0; ++passno) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- int correction = 3;
- type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) &&
- (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
-
- switch (passtype) {
- case 0:
- t1_enc_sigpass(t1, bpno, orient, &nmsedec, type, cblksty);
- break;
- case 1:
- t1_enc_refpass(t1, bpno, &nmsedec, type, cblksty);
- break;
- case 2:
- t1_enc_clnpass(t1, bpno, orient, &nmsedec, cblksty);
- /* code switch SEGMARK (i.e. SEGSYM) */
- if (cblksty & J2K_CCP_CBLKSTY_SEGSYM) {
- mqc_segmark_enc(mqc);
- }
- break;
- }
-
- /* fixed_quality */
- tempwmsedec = t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid,
- stepsize, numcomps, mct);
- cumwmsedec += tempwmsedec;
- tile->distotile += tempwmsedec;
-
- /* Code switch "RESTART" (i.e. TERMALL) */
- if ((cblksty & J2K_CCP_CBLKSTY_TERMALL) && !((passtype == 2) &&
- (bpno - 1 < 0))) {
- if (type == T1_TYPE_RAW) {
- mqc_flush(mqc);
- correction = 1;
- /* correction = mqc_bypass_flush_enc(); */
- } else { /* correction = mqc_restart_enc(); */
- mqc_flush(mqc);
- correction = 1;
- }
- pass->term = 1;
- } else {
- if (((bpno < (cblk->numbps - 4) && (passtype > 0))
- || ((bpno == (cblk->numbps - 4)) && (passtype == 2))) &&
- (cblksty & J2K_CCP_CBLKSTY_LAZY)) {
- if (type == T1_TYPE_RAW) {
- mqc_flush(mqc);
- correction = 1;
- /* correction = mqc_bypass_flush_enc(); */
- } else { /* correction = mqc_restart_enc(); */
- mqc_flush(mqc);
- correction = 1;
- }
- pass->term = 1;
- } else {
- pass->term = 0;
- }
- }
-
- if (++passtype == 3) {
- passtype = 0;
- bpno--;
- }
-
- if (pass->term && bpno > 0) {
- type = ((bpno < (cblk->numbps - 4)) && (passtype < 2) &&
- (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
- if (type == T1_TYPE_RAW) {
- mqc_bypass_init_enc(mqc);
- } else {
- mqc_restart_init_enc(mqc);
- }
- }
-
- pass->distortiondec = cumwmsedec;
- pass->rate = mqc_numbytes(mqc) + correction; /* FIXME */
-
- /* Code-switch "RESET" */
- if (cblksty & J2K_CCP_CBLKSTY_RESET) {
- mqc_reset_enc(mqc);
- }
- }
-
- /* Code switch "ERTERM" (i.e. PTERM) */
- if (cblksty & J2K_CCP_CBLKSTY_PTERM) {
- mqc_erterm_enc(mqc);
- } else /* Default coding */ if (!(cblksty & J2K_CCP_CBLKSTY_LAZY)) {
- mqc_flush(mqc);
- }
-
- cblk->totalpasses = passno;
-
- for (passno = 0; passno < cblk->totalpasses; passno++) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- if (pass->rate > mqc_numbytes(mqc)) {
- pass->rate = mqc_numbytes(mqc);
- }
- /*Preventing generation of FF as last data byte of a pass*/
- if ((pass->rate > 1) && (cblk->data[pass->rate - 1] == 0xFF)) {
- pass->rate--;
- }
- pass->len = pass->rate - (passno == 0 ? 0 : cblk->passes[passno - 1].rate);
- }
-}
-
-static void t1_decode_cblk(
- opj_t1_t *t1,
- opj_tcd_cblk_dec_t* cblk,
- int orient,
- int roishift,
- int cblksty)
-{
- opj_raw_t *raw = t1->raw; /* RAW component */
- opj_mqc_t *mqc = t1->mqc; /* MQC component */
-
- int bpno, passtype;
- int segno, passno;
- char type = T1_TYPE_MQ; /* BYPASS mode */
-
- if (!allocate_buffers(
- t1,
- cblk->x1 - cblk->x0,
- cblk->y1 - cblk->y0)) {
- return;
- }
-
- bpno = roishift + cblk->numbps - 1;
- passtype = 2;
-
- mqc_resetstates(mqc);
- mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
- mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
- mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
-
- for (segno = 0; segno < cblk->numsegs; ++segno) {
- opj_tcd_seg_t *seg = &cblk->segs[segno];
-
- /* BYPASS mode */
- type = ((bpno <= (cblk->numbps - 1) - 4) && (passtype < 2) &&
- (cblksty & J2K_CCP_CBLKSTY_LAZY)) ? T1_TYPE_RAW : T1_TYPE_MQ;
- /* FIXME: slviewer gets here with a null pointer. Why? Partially downloaded and/or corrupt textures? */
- if (seg->data == NULL) {
- continue;
- }
- if (type == T1_TYPE_RAW) {
- raw_init_dec(raw, (*seg->data) + seg->dataindex, seg->len);
- } else {
- mqc_init_dec(mqc, (*seg->data) + seg->dataindex, seg->len);
- }
-
- for (passno = 0; passno < seg->numpasses; ++passno) {
- switch (passtype) {
- case 0:
- if (type == T1_TYPE_RAW) {
- t1_dec_sigpass_raw(t1, bpno + 1, orient, cblksty);
- } else {
- if (cblksty & J2K_CCP_CBLKSTY_VSC) {
- t1_dec_sigpass_mqc_vsc(t1, bpno + 1, orient);
- } else {
- t1_dec_sigpass_mqc(t1, bpno + 1, orient);
- }
- }
- break;
- case 1:
- if (type == T1_TYPE_RAW) {
- t1_dec_refpass_raw(t1, bpno + 1, cblksty);
- } else {
- if (cblksty & J2K_CCP_CBLKSTY_VSC) {
- t1_dec_refpass_mqc_vsc(t1, bpno + 1);
- } else {
- t1_dec_refpass_mqc(t1, bpno + 1);
- }
- }
- break;
- case 2:
- t1_dec_clnpass(t1, bpno + 1, orient, cblksty);
- break;
- }
-
- if ((cblksty & J2K_CCP_CBLKSTY_RESET) && type == T1_TYPE_MQ) {
- mqc_resetstates(mqc);
- mqc_setstate(mqc, T1_CTXNO_UNI, 0, 46);
- mqc_setstate(mqc, T1_CTXNO_AGG, 0, 3);
- mqc_setstate(mqc, T1_CTXNO_ZC, 0, 4);
- }
- if (++passtype == 3) {
- passtype = 0;
- bpno--;
- }
- }
- }
-}
-
-/* ----------------------------------------------------------------------- */
-
-opj_t1_t* t1_create(opj_common_ptr cinfo)
-{
- opj_t1_t *t1 = (opj_t1_t*) opj_malloc(sizeof(opj_t1_t));
- if (!t1) {
- return NULL;
- }
-
- t1->cinfo = cinfo;
- /* create MQC and RAW handles */
- t1->mqc = mqc_create();
- t1->raw = raw_create();
-
- t1->data = NULL;
- t1->flags = NULL;
- t1->datasize = 0;
- t1->flagssize = 0;
-
- return t1;
-}
-
-void t1_destroy(opj_t1_t *t1)
-{
- if (t1) {
- /* destroy MQC and RAW handles */
- mqc_destroy(t1->mqc);
- raw_destroy(t1->raw);
- opj_aligned_free(t1->data);
- opj_aligned_free(t1->flags);
- opj_free(t1);
- }
-}
-
-void t1_encode_cblks(
- opj_t1_t *t1,
- opj_tcd_tile_t *tile,
- opj_tcp_t *tcp)
-{
- int compno, resno, bandno, precno, cblkno;
-
- tile->distotile = 0; /* fixed_quality */
-
- for (compno = 0; compno < tile->numcomps; ++compno) {
- opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
- opj_tccp_t* tccp = &tcp->tccps[compno];
- int tile_w = tilec->x1 - tilec->x0;
-
- for (resno = 0; resno < tilec->numresolutions; ++resno) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- for (bandno = 0; bandno < res->numbands; ++bandno) {
- opj_tcd_band_t* restrict band = &res->bands[bandno];
- int bandconst = 8192 * 8192 / ((int) floor(band->stepsize * 8192));
-
- for (precno = 0; precno < res->pw * res->ph; ++precno) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; ++cblkno) {
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
- int* restrict datap;
- int* restrict tiledp;
- int cblk_w;
- int cblk_h;
- int i, j;
-
- int x = cblk->x0 - band->x0;
- int y = cblk->y0 - band->y0;
- if (band->bandno & 1) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- x += pres->x1 - pres->x0;
- }
- if (band->bandno & 2) {
- opj_tcd_resolution_t *pres = &tilec->resolutions[resno - 1];
- y += pres->y1 - pres->y0;
- }
-
- if (!allocate_buffers(
- t1,
- cblk->x1 - cblk->x0,
- cblk->y1 - cblk->y0)) {
- return;
- }
-
- datap = t1->data;
- cblk_w = t1->w;
- cblk_h = t1->h;
-
- tiledp = &tilec->data[(y * tile_w) + x];
- if (tccp->qmfbid == 1) {
- for (j = 0; j < cblk_h; ++j) {
- for (i = 0; i < cblk_w; ++i) {
- int tmp = tiledp[(j * tile_w) + i];
- datap[(j * cblk_w) + i] = tmp << T1_NMSEDEC_FRACBITS;
- }
- }
- } else { /* if (tccp->qmfbid == 0) */
- for (j = 0; j < cblk_h; ++j) {
- for (i = 0; i < cblk_w; ++i) {
- int tmp = tiledp[(j * tile_w) + i];
- datap[(j * cblk_w) + i] =
- fix_mul(
- tmp,
- bandconst) >> (11 - T1_NMSEDEC_FRACBITS);
- }
- }
- }
-
- t1_encode_cblk(
- t1,
- cblk,
- band->bandno,
- compno,
- tilec->numresolutions - 1 - resno,
- tccp->qmfbid,
- band->stepsize,
- tccp->cblksty,
- tile->numcomps,
- tcp->mct,
- tile);
-
- } /* cblkno */
- } /* precno */
- } /* bandno */
- } /* resno */
- } /* compno */
-}
-
-void t1_decode_cblks(
- opj_t1_t* t1,
- opj_tcd_tilecomp_t* tilec,
- opj_tccp_t* tccp)
-{
- int resno, bandno, precno, cblkno;
-
- int tile_w = tilec->x1 - tilec->x0;
-
- for (resno = 0; resno < tilec->numresolutions; ++resno) {
- opj_tcd_resolution_t* res = &tilec->resolutions[resno];
-
- for (bandno = 0; bandno < res->numbands; ++bandno) {
- opj_tcd_band_t* restrict band = &res->bands[bandno];
-
- for (precno = 0; precno < res->pw * res->ph; ++precno) {
- opj_tcd_precinct_t* precinct = &band->precincts[precno];
-
- for (cblkno = 0; cblkno < precinct->cw * precinct->ch; ++cblkno) {
- opj_tcd_cblk_dec_t* cblk = &precinct->cblks.dec[cblkno];
- int* restrict datap;
- int cblk_w, cblk_h;
- int x, y;
- int i, j;
-
- t1_decode_cblk(
- t1,
- cblk,
- band->bandno,
- tccp->roishift,
- tccp->cblksty);
-
- x = cblk->x0 - band->x0;
- y = cblk->y0 - band->y0;
- if (band->bandno & 1) {
- opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
- x += pres->x1 - pres->x0;
- }
- if (band->bandno & 2) {
- opj_tcd_resolution_t* pres = &tilec->resolutions[resno - 1];
- y += pres->y1 - pres->y0;
- }
-
- datap = t1->data;
- cblk_w = t1->w;
- cblk_h = t1->h;
-
- if (tccp->roishift) {
- int thresh = 1 << tccp->roishift;
- for (j = 0; j < cblk_h; ++j) {
- for (i = 0; i < cblk_w; ++i) {
- int val = datap[(j * cblk_w) + i];
- int mag = abs(val);
- if (mag >= thresh) {
- mag >>= tccp->roishift;
- datap[(j * cblk_w) + i] = val < 0 ? -mag : mag;
- }
- }
- }
- }
-
- if (tccp->qmfbid == 1) {
- int* restrict tiledp = &tilec->data[(y * tile_w) + x];
- for (j = 0; j < cblk_h; ++j) {
- for (i = 0; i < cblk_w; ++i) {
- int tmp = datap[(j * cblk_w) + i];
- ((int*)tiledp)[(j * tile_w) + i] = tmp / 2;
- }
- }
- } else { /* if (tccp->qmfbid == 0) */
- float* restrict tiledp = (float*) &tilec->data[(y * tile_w) + x];
- for (j = 0; j < cblk_h; ++j) {
- float* restrict tiledp2 = tiledp;
- for (i = 0; i < cblk_w; ++i) {
- float tmp = *datap * band->stepsize;
- *tiledp2 = tmp;
- datap++;
- tiledp2++;
- }
- tiledp += tile_w;
- }
- }
- opj_free(cblk->data);
- opj_free(cblk->segs);
- } /* cblkno */
- opj_free(precinct->cblks.dec);
- precinct->cblks.dec = NULL;
- } /* precno */
- } /* bandno */
- } /* resno */
-}
-
+++ /dev/null
-/*
- * 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 __T1_H
-#define __T1_H
-/**
-@file t1.h
-@brief Implementation of the tier-1 coding (coding of code-block coefficients) (T1)
-
-The functions in T1.C have for goal to realize the tier-1 coding operation. The functions
-in T1.C are used by some function in TCD.C.
-*/
-
-/** @defgroup T1 T1 - Implementation of the tier-1 coding */
-/*@{*/
-
-/* ----------------------------------------------------------------------- */
-#define T1_NMSEDEC_BITS 7
-
-#define T1_SIG_NE 0x0001 /**< Context orientation : North-East direction */
-#define T1_SIG_SE 0x0002 /**< Context orientation : South-East direction */
-#define T1_SIG_SW 0x0004 /**< Context orientation : South-West direction */
-#define T1_SIG_NW 0x0008 /**< Context orientation : North-West direction */
-#define T1_SIG_N 0x0010 /**< Context orientation : North direction */
-#define T1_SIG_E 0x0020 /**< Context orientation : East direction */
-#define T1_SIG_S 0x0040 /**< Context orientation : South direction */
-#define T1_SIG_W 0x0080 /**< Context orientation : West direction */
-#define T1_SIG_OTH (T1_SIG_N|T1_SIG_NE|T1_SIG_E|T1_SIG_SE|T1_SIG_S|T1_SIG_SW|T1_SIG_W|T1_SIG_NW)
-#define T1_SIG_PRIM (T1_SIG_N|T1_SIG_E|T1_SIG_S|T1_SIG_W)
-
-#define T1_SGN_N 0x0100
-#define T1_SGN_E 0x0200
-#define T1_SGN_S 0x0400
-#define T1_SGN_W 0x0800
-#define T1_SGN (T1_SGN_N|T1_SGN_E|T1_SGN_S|T1_SGN_W)
-
-#define T1_SIG 0x1000
-#define T1_REFINE 0x2000
-#define T1_VISIT 0x4000
-
-#define T1_NUMCTXS_ZC 9
-#define T1_NUMCTXS_SC 5
-#define T1_NUMCTXS_MAG 3
-#define T1_NUMCTXS_AGG 1
-#define T1_NUMCTXS_UNI 1
-
-#define T1_CTXNO_ZC 0
-#define T1_CTXNO_SC (T1_CTXNO_ZC+T1_NUMCTXS_ZC)
-#define T1_CTXNO_MAG (T1_CTXNO_SC+T1_NUMCTXS_SC)
-#define T1_CTXNO_AGG (T1_CTXNO_MAG+T1_NUMCTXS_MAG)
-#define T1_CTXNO_UNI (T1_CTXNO_AGG+T1_NUMCTXS_AGG)
-#define T1_NUMCTXS (T1_CTXNO_UNI+T1_NUMCTXS_UNI)
-
-#define T1_NMSEDEC_FRACBITS (T1_NMSEDEC_BITS-1)
-
-#define T1_TYPE_MQ 0 /**< Normal coding using entropy coder */
-#define T1_TYPE_RAW 1 /**< No encoding the information is store under raw format in codestream (mode switch RAW)*/
-
-/* ----------------------------------------------------------------------- */
-
-typedef short flag_t;
-
-/**
-Tier-1 coding (coding of code-block coefficients)
-*/
-typedef struct opj_t1 {
- /** codec context */
- opj_common_ptr cinfo;
-
- /** MQC component */
- opj_mqc_t *mqc;
- /** RAW component */
- opj_raw_t *raw;
-
- int *data;
- flag_t *flags;
- int w;
- int h;
- int datasize;
- int flagssize;
- int flags_stride;
-} opj_t1_t;
-
-#define MACRO_t1_flags(x,y) t1->flags[((x)*(t1->flags_stride))+(y)]
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a new T1 handle
-and initialize the look-up tables of the Tier-1 coder/decoder
-@return Returns a new T1 handle if successful, returns NULL otherwise
-@see t1_init_luts
-*/
-opj_t1_t* t1_create(opj_common_ptr cinfo);
-/**
-Destroy a previously created T1 handle
-@param t1 T1 handle to destroy
-*/
-void t1_destroy(opj_t1_t *t1);
-/**
-Encode the code-blocks of a tile
-@param t1 T1 handle
-@param tile The tile to encode
-@param tcp Tile coding parameters
-*/
-void t1_encode_cblks(opj_t1_t *t1, opj_tcd_tile_t *tile, opj_tcp_t *tcp);
-/**
-Decode the code-blocks of a tile
-@param t1 T1 handle
-@param tilec The tile to decode
-@param tccp Tile coding parameters
-*/
-void t1_decode_cblks(opj_t1_t* t1, opj_tcd_tilecomp_t* tilec, opj_tccp_t* tccp);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __T1_H */
+++ /dev/null
-/* This file was automatically generated by t1_generate_luts.c */
-
-static char lut_ctxno_zc[1024] = {
- 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 0, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
- 0, 3, 3, 6, 3, 6, 6, 8, 3, 6, 6, 8, 6, 8, 8, 8, 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8,
- 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
- 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
- 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
- 1, 4, 4, 7, 4, 7, 7, 8, 4, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
- 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
- 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8,
- 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8, 2, 5, 5, 7, 5, 7, 7, 8, 5, 7, 7, 8, 7, 8, 8, 8
-};
-
-static char lut_ctxno_sc[256] = {
- 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xb, 0x9, 0xa, 0xb, 0xb, 0xa, 0xa,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xd, 0x9, 0xa, 0xb, 0xc, 0xa, 0x9,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xb, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xd, 0xc, 0xd, 0xb, 0xc, 0xb, 0xc,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0x9, 0xb, 0xc, 0xc, 0xb, 0x9, 0xa, 0xd, 0xc, 0xa, 0x9,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0x9, 0xa, 0xd, 0xd, 0xa, 0xa,
- 0x9, 0xa, 0xc, 0xb, 0xa, 0x9, 0xd, 0xc, 0xc, 0xb, 0xc, 0xb, 0xd, 0xc, 0xd, 0xc,
- 0x9, 0xa, 0xc, 0xd, 0xa, 0xa, 0xd, 0xd, 0xc, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd
-};
-
-static char lut_spb[256] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0,
- 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1,
- 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-};
-
-static short lut_nmsedec_sig[1 << T1_NMSEDEC_BITS] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0180, 0x0300, 0x0480, 0x0600, 0x0780, 0x0900, 0x0a80,
- 0x0c00, 0x0d80, 0x0f00, 0x1080, 0x1200, 0x1380, 0x1500, 0x1680,
- 0x1800, 0x1980, 0x1b00, 0x1c80, 0x1e00, 0x1f80, 0x2100, 0x2280,
- 0x2400, 0x2580, 0x2700, 0x2880, 0x2a00, 0x2b80, 0x2d00, 0x2e80,
- 0x3000, 0x3180, 0x3300, 0x3480, 0x3600, 0x3780, 0x3900, 0x3a80,
- 0x3c00, 0x3d80, 0x3f00, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680,
- 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5100, 0x5280,
- 0x5400, 0x5580, 0x5700, 0x5880, 0x5a00, 0x5b80, 0x5d00, 0x5e80,
- 0x6000, 0x6180, 0x6300, 0x6480, 0x6600, 0x6780, 0x6900, 0x6a80,
- 0x6c00, 0x6d80, 0x6f00, 0x7080, 0x7200, 0x7380, 0x7500, 0x7680
-};
-
-static short lut_nmsedec_sig0[1 << T1_NMSEDEC_BITS] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080,
- 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200,
- 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400,
- 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
- 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00,
- 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180,
- 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780,
- 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00,
- 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x2680, 0x2780,
- 0x2880, 0x2980, 0x2b00, 0x2c00, 0x2d00, 0x2e80, 0x2f80, 0x3100,
- 0x3200, 0x3380, 0x3480, 0x3600, 0x3700, 0x3880, 0x3a00, 0x3b00,
- 0x3c80, 0x3e00, 0x3f80, 0x4080, 0x4200, 0x4380, 0x4500, 0x4680,
- 0x4800, 0x4980, 0x4b00, 0x4c80, 0x4e00, 0x4f80, 0x5180, 0x5300,
- 0x5480, 0x5600, 0x5800, 0x5980, 0x5b00, 0x5d00, 0x5e80, 0x6080,
- 0x6200, 0x6400, 0x6580, 0x6780, 0x6900, 0x6b00, 0x6d00, 0x6e80,
- 0x7080, 0x7280, 0x7480, 0x7600, 0x7800, 0x7a00, 0x7c00, 0x7e00
-};
-
-static short lut_nmsedec_ref[1 << T1_NMSEDEC_BITS] = {
- 0x1800, 0x1780, 0x1700, 0x1680, 0x1600, 0x1580, 0x1500, 0x1480,
- 0x1400, 0x1380, 0x1300, 0x1280, 0x1200, 0x1180, 0x1100, 0x1080,
- 0x1000, 0x0f80, 0x0f00, 0x0e80, 0x0e00, 0x0d80, 0x0d00, 0x0c80,
- 0x0c00, 0x0b80, 0x0b00, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880,
- 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0500, 0x0480,
- 0x0400, 0x0380, 0x0300, 0x0280, 0x0200, 0x0180, 0x0100, 0x0080,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0080, 0x0100, 0x0180, 0x0200, 0x0280, 0x0300, 0x0380,
- 0x0400, 0x0480, 0x0500, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
- 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b00, 0x0b80,
- 0x0c00, 0x0c80, 0x0d00, 0x0d80, 0x0e00, 0x0e80, 0x0f00, 0x0f80,
- 0x1000, 0x1080, 0x1100, 0x1180, 0x1200, 0x1280, 0x1300, 0x1380,
- 0x1400, 0x1480, 0x1500, 0x1580, 0x1600, 0x1680, 0x1700, 0x1780
-};
-
-static short lut_nmsedec_ref0[1 << T1_NMSEDEC_BITS] = {
- 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x1b00, 0x1a80, 0x1980,
- 0x1880, 0x1780, 0x1700, 0x1600, 0x1500, 0x1480, 0x1380, 0x1300,
- 0x1200, 0x1180, 0x1080, 0x1000, 0x0f00, 0x0e80, 0x0e00, 0x0d00,
- 0x0c80, 0x0c00, 0x0b80, 0x0a80, 0x0a00, 0x0980, 0x0900, 0x0880,
- 0x0800, 0x0780, 0x0700, 0x0680, 0x0600, 0x0580, 0x0580, 0x0500,
- 0x0480, 0x0400, 0x0400, 0x0380, 0x0300, 0x0300, 0x0280, 0x0280,
- 0x0200, 0x0200, 0x0180, 0x0180, 0x0100, 0x0100, 0x0100, 0x0080,
- 0x0080, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0080, 0x0080,
- 0x0080, 0x0080, 0x0100, 0x0100, 0x0100, 0x0180, 0x0180, 0x0200,
- 0x0200, 0x0280, 0x0280, 0x0300, 0x0300, 0x0380, 0x0400, 0x0400,
- 0x0480, 0x0500, 0x0580, 0x0580, 0x0600, 0x0680, 0x0700, 0x0780,
- 0x0800, 0x0880, 0x0900, 0x0980, 0x0a00, 0x0a80, 0x0b80, 0x0c00,
- 0x0c80, 0x0d00, 0x0e00, 0x0e80, 0x0f00, 0x1000, 0x1080, 0x1180,
- 0x1200, 0x1300, 0x1380, 0x1480, 0x1500, 0x1600, 0x1700, 0x1780,
- 0x1880, 0x1980, 0x1a80, 0x1b00, 0x1c00, 0x1d00, 0x1e00, 0x1f00
-};
-
+++ /dev/null
-/*
- * 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.
- */
-
-#include "opj_includes.h"
-
-/** @defgroup T2 T2 - Implementation of a tier-2 coding */
-/*@{*/
-
-/** @name Local static functions */
-/*@{*/
-
-static void t2_putcommacode(opj_bio_t *bio, int n);
-static int t2_getcommacode(opj_bio_t *bio);
-/**
-Variable length code for signalling delta Zil (truncation point)
-@param bio Bit Input/Output component
-@param n delta Zil
-*/
-static void t2_putnumpasses(opj_bio_t *bio, int n);
-static int t2_getnumpasses(opj_bio_t *bio);
-/**
-Encode a packet of a tile to a destination buffer
-@param tile Tile for which to write the packets
-@param tcp Tile coding parameters
-@param pi Packet identity
-@param dest Destination buffer
-@param len Length of the destination buffer
-@param cstr_info Codestream information structure
-@param tileno Number of the tile encoded
-@return
-*/
-static int t2_encode_packet(opj_tcd_tile_t *tile, opj_tcp_t *tcp,
- opj_pi_iterator_t *pi, unsigned char *dest, int len,
- opj_codestream_info_t *cstr_info, int tileno);
-/**
-@param cblk
-@param index
-@param cblksty
-@param first
-*/
-static opj_bool t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty,
- int first);
-/**
-Decode a packet of a tile from a source buffer
-@param t2 T2 handle
-@param src Source buffer
-@param len Length of the source buffer
-@param tile Tile for which to write the packets
-@param tcp Tile coding parameters
-@param pi Packet identity
-@param pack_info Packet information
-@return
-*/
-static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len,
- opj_tcd_tile_t *tile,
- opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info);
-
-/*@}*/
-
-/*@}*/
-
-/* ----------------------------------------------------------------------- */
-
-/* #define RESTART 0x04 */
-
-static void t2_putcommacode(opj_bio_t *bio, int n)
-{
- while (--n >= 0) {
- bio_write(bio, 1, 1);
- }
- bio_write(bio, 0, 1);
-}
-
-static int t2_getcommacode(opj_bio_t *bio)
-{
- int n;
- for (n = 0; bio_read(bio, 1); n++) {
- ;
- }
- return n;
-}
-
-static void t2_putnumpasses(opj_bio_t *bio, int n)
-{
- if (n == 1) {
- bio_write(bio, 0, 1);
- } else if (n == 2) {
- bio_write(bio, 2, 2);
- } else if (n <= 5) {
- bio_write(bio, 0xc | (n - 3), 4);
- } else if (n <= 36) {
- bio_write(bio, 0x1e0 | (n - 6), 9);
- } else if (n <= 164) {
- bio_write(bio, 0xff80 | (n - 37), 16);
- }
-}
-
-static int t2_getnumpasses(opj_bio_t *bio)
-{
- int n;
- if (!bio_read(bio, 1)) {
- return 1;
- }
- if (!bio_read(bio, 1)) {
- return 2;
- }
- if ((n = bio_read(bio, 2)) != 3) {
- return (3 + n);
- }
- if ((n = bio_read(bio, 5)) != 31) {
- return (6 + n);
- }
- return (37 + bio_read(bio, 7));
-}
-
-static int t2_encode_packet(opj_tcd_tile_t * tile, opj_tcp_t * tcp,
- opj_pi_iterator_t *pi, unsigned char *dest, int length,
- opj_codestream_info_t *cstr_info, int tileno)
-{
- int bandno, cblkno;
- unsigned char *c = dest;
-
- int compno = pi->compno; /* component value */
- int resno = pi->resno; /* resolution level value */
- int precno = pi->precno; /* precinct value */
- int layno = pi->layno; /* quality layer value */
-
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- opj_bio_t *bio = NULL; /* BIO component */
-
- /* <SOP 0xff91> */
- if (tcp->csty & J2K_CP_CSTY_SOP) {
- c[0] = 255;
- c[1] = 145;
- c[2] = 0;
- c[3] = 4;
- c[4] = (unsigned char)((tile->packno % 65536) / 256);
- c[5] = (unsigned char)((tile->packno % 65536) % 256);
- c += 6;
- }
- /* </SOP> */
-
- if (!layno) {
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- tgt_reset(prc->incltree);
- tgt_reset(prc->imsbtree);
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
- cblk->numpasses = 0;
- tgt_setvalue(prc->imsbtree, cblkno, band->numbps - cblk->numbps);
- }
- }
- }
-
- bio = bio_create();
- bio_init_enc(bio, c, length);
- bio_write(bio, 1, 1); /* Empty header bit */
-
- /* Writing Packet header */
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
- if (!cblk->numpasses && layer->numpasses) {
- tgt_setvalue(prc->incltree, cblkno, layno);
- }
- }
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
- int increment = 0;
- int nump = 0;
- int len = 0, passno;
- /* cblk inclusion bits */
- if (!cblk->numpasses) {
- tgt_encode(bio, prc->incltree, cblkno, layno + 1);
- } else {
- bio_write(bio, layer->numpasses != 0, 1);
- }
- /* if cblk not included, go to the next cblk */
- if (!layer->numpasses) {
- continue;
- }
- /* if first instance of cblk --> zero bit-planes information */
- if (!cblk->numpasses) {
- cblk->numlenbits = 3;
- tgt_encode(bio, prc->imsbtree, cblkno, 999);
- }
- /* number of coding passes included */
- t2_putnumpasses(bio, layer->numpasses);
-
- /* computation of the increase of the length indicator and insertion in the header */
- for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses;
- passno++) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- nump++;
- len += pass->len;
- if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
- increment = int_max(increment,
- int_floorlog2(len) + 1 - (cblk->numlenbits + int_floorlog2(nump)));
- len = 0;
- nump = 0;
- }
- }
- t2_putcommacode(bio, increment);
-
- /* computation of the new Length indicator */
- cblk->numlenbits += increment;
-
- /* insertion of the codeword segment length */
- for (passno = cblk->numpasses; passno < cblk->numpasses + layer->numpasses;
- passno++) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- nump++;
- len += pass->len;
- if (pass->term || passno == (cblk->numpasses + layer->numpasses) - 1) {
- bio_write(bio, len, cblk->numlenbits + int_floorlog2(nump));
- len = 0;
- nump = 0;
- }
- }
- }
- }
-
- if (bio_flush(bio)) {
- bio_destroy(bio);
- return -999; /* modified to eliminate longjmp !! */
- }
-
- c += bio_numbytes(bio);
- bio_destroy(bio);
-
- /* <EPH 0xff92> */
- if (tcp->csty & J2K_CP_CSTY_EPH) {
- c[0] = 255;
- c[1] = 146;
- c += 2;
- }
- /* </EPH> */
-
- /* << INDEX */
- /* End of packet header position. Currently only represents the distance to start of packet
- // Will be updated later by incrementing with packet start value */
- if (cstr_info && cstr_info->index_write) {
- opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
- info_PK->end_ph_pos = (int)(c - dest);
- }
- /* INDEX >> */
-
- /* Writing the packet body */
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
- if (!layer->numpasses) {
- continue;
- }
- if (c + layer->len > dest + length) {
- return -999;
- }
-
- memcpy(c, layer->data, layer->len);
- cblk->numpasses += layer->numpasses;
- c += layer->len;
- /* << INDEX */
- if (cstr_info && cstr_info->index_write) {
- opj_packet_info_t *info_PK = &cstr_info->tile[tileno].packet[cstr_info->packno];
- info_PK->disto += layer->disto;
- if (cstr_info->D_max < info_PK->disto) {
- cstr_info->D_max = info_PK->disto;
- }
- }
- /* INDEX >> */
- }
- }
-
- return (c - dest);
-}
-
-static opj_bool t2_init_seg(opj_tcd_cblk_dec_t* cblk, int index, int cblksty,
- int first)
-{
- opj_tcd_seg_t* seg;
- opj_tcd_seg_t* segs;
- segs = (opj_tcd_seg_t*) opj_realloc(cblk->segs,
- (index + 1) * sizeof(opj_tcd_seg_t));
-
- if (segs == NULL) {
- return OPJ_FALSE;
- }
- cblk->segs = segs;
-
- seg = &cblk->segs[index];
- seg->data = NULL;
- seg->dataindex = 0;
- seg->numpasses = 0;
- seg->len = 0;
- if (cblksty & J2K_CCP_CBLKSTY_TERMALL) {
- seg->maxpasses = 1;
- } else if (cblksty & J2K_CCP_CBLKSTY_LAZY) {
- if (first) {
- seg->maxpasses = 10;
- } else {
- seg->maxpasses = (((seg - 1)->maxpasses == 1) ||
- ((seg - 1)->maxpasses == 10)) ? 2 : 1;
- }
- } else {
- seg->maxpasses = 109;
- }
-
- return OPJ_TRUE;
-}
-
-static int t2_decode_packet(opj_t2_t* t2, unsigned char *src, int len,
- opj_tcd_tile_t *tile,
- opj_tcp_t *tcp, opj_pi_iterator_t *pi, opj_packet_info_t *pack_info)
-{
- int bandno, cblkno;
- unsigned char *c = src;
-
- opj_cp_t *cp = t2->cp;
-
- int compno = pi->compno; /* component value */
- int resno = pi->resno; /* resolution level value */
- int precno = pi->precno; /* precinct value */
- int layno = pi->layno; /* quality layer value */
-
- opj_tcd_resolution_t* res = &tile->comps[compno].resolutions[resno];
-
- unsigned char *hd = NULL;
- int present;
-
- opj_bio_t *bio = NULL; /* BIO component */
-
- if (layno == 0) {
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- if ((band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0)) {
- continue;
- }
-
- tgt_reset(prc->incltree);
- tgt_reset(prc->imsbtree);
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno];
- cblk->numsegs = 0;
- }
- }
- }
-
- /* SOP markers */
-
- if (tcp->csty & J2K_CP_CSTY_SOP) {
- if ((*c) != 0xff || (*(c + 1) != 0x91)) {
- opj_event_msg(t2->cinfo, EVT_WARNING, "Expected SOP marker\n");
- } else {
- c += 6;
- }
-
- /** TODO : check the Nsop value */
- }
-
- /*
- When the marker PPT/PPM is used the packet header are store in PPT/PPM marker
- This part deal with this caracteristic
- step 1: Read packet header in the saved structure
- step 2: Return to codestream for decoding
- */
-
- bio = bio_create();
-
- if (cp->ppm == 1) { /* PPM */
- hd = cp->ppm_data;
- bio_init_dec(bio, hd, cp->ppm_len);
- } else if (tcp->ppt == 1) { /* PPT */
- hd = tcp->ppt_data;
- bio_init_dec(bio, hd, tcp->ppt_len);
- } else { /* Normal Case */
- hd = c;
- bio_init_dec(bio, hd, src + len - hd);
- }
-
- present = bio_read(bio, 1);
-
- if (!present) {
- bio_inalign(bio);
- hd += bio_numbytes(bio);
- bio_destroy(bio);
-
- /* EPH markers */
-
- if (tcp->csty & J2K_CP_CSTY_EPH) {
- if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {
- printf("Error : expected EPH marker\n");
- } else {
- hd += 2;
- }
- }
-
- /* << INDEX */
- /* End of packet header position. Currently only represents the distance to start of packet
- // Will be updated later by incrementing with packet start value*/
- if (pack_info) {
- pack_info->end_ph_pos = (int)(c - src);
- }
- /* INDEX >> */
-
- if (cp->ppm == 1) { /* PPM case */
- cp->ppm_len += cp->ppm_data - hd;
- cp->ppm_data = hd;
- return (c - src);
- }
- if (tcp->ppt == 1) { /* PPT case */
- tcp->ppt_len += tcp->ppt_data - hd;
- tcp->ppt_data = hd;
- return (c - src);
- }
-
- return (hd - src);
- }
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- if ((band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0)) {
- continue;
- }
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- int included, increment, n, segno;
- opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno];
- /* if cblk not yet included before --> inclusion tagtree */
- if (!cblk->numsegs) {
- included = tgt_decode(bio, prc->incltree, cblkno, layno + 1);
- /* else one bit */
- } else {
- included = bio_read(bio, 1);
- }
- /* if cblk not included */
- if (!included) {
- cblk->numnewpasses = 0;
- continue;
- }
- /* if cblk not yet included --> zero-bitplane tagtree */
- if (!cblk->numsegs) {
- int i, numimsbs;
- for (i = 0; !tgt_decode(bio, prc->imsbtree, cblkno, i); i++) {
- ;
- }
- numimsbs = i - 1;
- cblk->numbps = band->numbps - numimsbs;
- cblk->numlenbits = 3;
- }
- /* number of coding passes */
- cblk->numnewpasses = t2_getnumpasses(bio);
- increment = t2_getcommacode(bio);
- /* length indicator increment */
- cblk->numlenbits += increment;
- segno = 0;
- if (!cblk->numsegs) {
- if (!t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 1)) {
- opj_event_msg(t2->cinfo, EVT_ERROR, "Out of memory\n");
- bio_destroy(bio);
- return -999;
- }
- } else {
- segno = cblk->numsegs - 1;
- if (cblk->segs[segno].numpasses == cblk->segs[segno].maxpasses) {
- ++segno;
- if (!t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0)) {
- opj_event_msg(t2->cinfo, EVT_ERROR, "Out of memory\n");
- bio_destroy(bio);
- return -999;
- }
- }
- }
- n = cblk->numnewpasses;
-
- do {
- cblk->segs[segno].numnewpasses = int_min(cblk->segs[segno].maxpasses -
- cblk->segs[segno].numpasses, n);
- cblk->segs[segno].newlen = bio_read(bio,
- cblk->numlenbits + int_floorlog2(cblk->segs[segno].numnewpasses));
- n -= cblk->segs[segno].numnewpasses;
- if (n > 0) {
- ++segno;
- if (!t2_init_seg(cblk, segno, tcp->tccps[compno].cblksty, 0)) {
- opj_event_msg(t2->cinfo, EVT_ERROR, "Out of memory\n");
- bio_destroy(bio);
- return -999;
- }
- }
- } while (n > 0);
- }
- }
-
- if (bio_inalign(bio)) {
- bio_destroy(bio);
- return -999;
- }
-
- hd += bio_numbytes(bio);
- bio_destroy(bio);
-
- /* EPH markers */
- if (tcp->csty & J2K_CP_CSTY_EPH) {
- if ((*hd) != 0xff || (*(hd + 1) != 0x92)) {
- opj_event_msg(t2->cinfo, EVT_ERROR, "Expected EPH marker\n");
- return -999;
- } else {
- hd += 2;
- }
- }
-
- /* << INDEX */
- /* End of packet header position. Currently only represents the distance to start of packet
- // Will be updated later by incrementing with packet start value*/
- if (pack_info) {
- pack_info->end_ph_pos = (int)(hd - src);
- }
- /* INDEX >> */
-
- if (cp->ppm == 1) {
- cp->ppm_len += cp->ppm_data - hd;
- cp->ppm_data = hd;
- } else if (tcp->ppt == 1) {
- tcp->ppt_len += tcp->ppt_data - hd;
- tcp->ppt_data = hd;
- } else {
- c = hd;
- }
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- if ((band->x1 - band->x0 == 0) || (band->y1 - band->y0 == 0)) {
- continue;
- }
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno];
- opj_tcd_seg_t *seg = NULL;
- if (!cblk->numnewpasses) {
- continue;
- }
- if (!cblk->numsegs) {
- seg = &cblk->segs[0];
- cblk->numsegs++;
- cblk->len = 0;
- } else {
- seg = &cblk->segs[cblk->numsegs - 1];
- if (seg->numpasses == seg->maxpasses) {
- seg++;
- cblk->numsegs++;
- }
- }
-
- do {
- if (c + seg->newlen > src + len) {
- return -999;
- }
-
-#ifdef USE_JPWL
- /* we need here a j2k handle to verify if making a check to
- the validity of cblocks parameters is selected from user (-W) */
-
- /* let's check that we are not exceeding */
- if ((cblk->len + seg->newlen) > 8192) {
- opj_event_msg(t2->cinfo, EVT_WARNING,
- "JPWL: segment too long (%d) for codeblock %d (p=%d, b=%d, r=%d, c=%d)\n",
- seg->newlen, cblkno, precno, bandno, resno, compno);
- if (!JPWL_ASSUME) {
- opj_event_msg(t2->cinfo, EVT_ERROR, "JPWL: giving up\n");
- return -999;
- }
- seg->newlen = 8192 - cblk->len;
- opj_event_msg(t2->cinfo, EVT_WARNING, " - truncating segment to %d\n",
- seg->newlen);
- break;
- };
-
-#endif /* USE_JPWL */
-
- cblk->data = (unsigned char*) opj_realloc(cblk->data,
- (cblk->len + seg->newlen) * sizeof(unsigned char));
- memcpy(cblk->data + cblk->len, c, seg->newlen);
- if (seg->numpasses == 0) {
- seg->data = &cblk->data;
- seg->dataindex = cblk->len;
- }
- c += seg->newlen;
- cblk->len += seg->newlen;
- seg->len += seg->newlen;
- seg->numpasses += seg->numnewpasses;
- cblk->numnewpasses -= seg->numnewpasses;
- if (cblk->numnewpasses > 0) {
- seg++;
- cblk->numsegs++;
- }
- } while (cblk->numnewpasses > 0);
- }
- }
-
- return (c - src);
-}
-
-/* ----------------------------------------------------------------------- */
-
-int t2_encode_packets(opj_t2_t* t2, int tileno, opj_tcd_tile_t *tile,
- int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,
- int tpnum, int tppos, int pino, J2K_T2_MODE t2_mode, int cur_totnum_tp)
-{
- unsigned char *c = dest;
- int e = 0;
- int compno;
- opj_pi_iterator_t *pi = NULL;
- int poc;
- opj_image_t *image = t2->image;
- opj_cp_t *cp = t2->cp;
- opj_tcp_t *tcp = &cp->tcps[tileno];
- int pocno = cp->cinema == CINEMA4K_24 ? 2 : 1;
- int maxcomp = cp->max_comp_size > 0 ? image->numcomps : 1;
-
- pi = pi_initialise_encode(image, cp, tileno, t2_mode);
- if (!pi) {
- /* TODO: throw an error */
- return -999;
- }
-
- if (t2_mode == THRESH_CALC) { /* Calculating threshold */
- for (compno = 0; compno < maxcomp; compno++) {
- for (poc = 0; poc < pocno ; poc++) {
- int comp_len = 0;
- int tpnum = compno;
- if (pi_create_encode(pi, cp, tileno, poc, tpnum, tppos, t2_mode,
- cur_totnum_tp)) {
- opj_event_msg(t2->cinfo, EVT_ERROR, "Error initializing Packet Iterator\n");
- pi_destroy(pi, cp, tileno);
- return -999;
- }
- while (pi_next(&pi[poc])) {
- if (pi[poc].layno < maxlayers) {
- e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[poc], c, dest + len - c,
- cstr_info, tileno);
- comp_len = comp_len + e;
- if (e == -999) {
- break;
- } else {
- c += e;
- }
- }
- }
- if (e == -999) {
- break;
- }
- if (cp->max_comp_size) {
- if (comp_len > cp->max_comp_size) {
- e = -999;
- break;
- }
- }
- }
- if (e == -999) {
- break;
- }
- }
- } else { /* t2_mode == FINAL_PASS */
- pi_create_encode(pi, cp, tileno, pino, tpnum, tppos, t2_mode, cur_totnum_tp);
- while (pi_next(&pi[pino])) {
- if (pi[pino].layno < maxlayers) {
- e = t2_encode_packet(tile, &cp->tcps[tileno], &pi[pino], c, dest + len - c,
- cstr_info, tileno);
- if (e == -999) {
- break;
- } else {
- c += e;
- }
- /* INDEX >> */
- if (cstr_info) {
- if (cstr_info->index_write) {
- opj_tile_info_t *info_TL = &cstr_info->tile[tileno];
- opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
- if (!cstr_info->packno) {
- info_PK->start_pos = info_TL->end_header + 1;
- } else {
- info_PK->start_pos = ((cp->tp_on | tcp->POC) &&
- info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno -
- 1].end_pos + 1;
- }
- info_PK->end_pos = info_PK->start_pos + e - 1;
- info_PK->end_ph_pos += info_PK->start_pos -
- 1; /* End of packet header which now only represents the distance
- // to start of packet is incremented by value of start of packet*/
- }
-
- cstr_info->packno++;
- }
- /* << INDEX */
- tile->packno++;
- }
- }
- }
-
- pi_destroy(pi, cp, tileno);
-
- if (e == -999) {
- return e;
- }
-
- return (c - dest);
-}
-
-int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno,
- opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info)
-{
- unsigned char *c = src;
- opj_pi_iterator_t *pi;
- int pino, e = 0;
- int n = 0, curtp = 0;
- int tp_start_packno;
-
- opj_image_t *image = t2->image;
- opj_cp_t *cp = t2->cp;
-
- /* create a packet iterator */
- pi = pi_create_decode(image, cp, tileno);
- if (!pi) {
- /* TODO: throw an error */
- return -999;
- }
-
- tp_start_packno = 0;
-
- for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++) {
- while (pi_next(&pi[pino])) {
- if ((cp->layer == 0) || (cp->layer >= ((pi[pino].layno) + 1))) {
- opj_packet_info_t *pack_info;
- if (cstr_info) {
- pack_info = &cstr_info->tile[tileno].packet[cstr_info->packno];
- } else {
- pack_info = NULL;
- }
- e = t2_decode_packet(t2, c, src + len - c, tile, &cp->tcps[tileno], &pi[pino],
- pack_info);
- } else {
- e = 0;
- }
- if (e == -999) {
- pi_destroy(pi, cp, tileno);
- return -999;
- }
- /* progression in resolution */
- image->comps[pi[pino].compno].resno_decoded =
- (e > 0) ?
- int_max(pi[pino].resno, image->comps[pi[pino].compno].resno_decoded)
- : image->comps[pi[pino].compno].resno_decoded;
- n++;
-
- /* INDEX >> */
- if (cstr_info) {
- opj_tile_info_t *info_TL = &cstr_info->tile[tileno];
- opj_packet_info_t *info_PK = &info_TL->packet[cstr_info->packno];
- if (!cstr_info->packno) {
- info_PK->start_pos = info_TL->end_header + 1;
- } else if (info_TL->packet[cstr_info->packno - 1].end_pos >=
- (int)cstr_info->tile[tileno].tp[curtp].tp_end_pos) { /* New tile part*/
- info_TL->tp[curtp].tp_numpacks = cstr_info->packno -
- tp_start_packno; /* Number of packets in previous tile-part*/
- info_TL->tp[curtp].tp_start_pack = tp_start_packno;
- tp_start_packno = cstr_info->packno;
- curtp++;
- info_PK->start_pos = cstr_info->tile[tileno].tp[curtp].tp_end_header + 1;
- } else {
- info_PK->start_pos = (cp->tp_on &&
- info_PK->start_pos) ? info_PK->start_pos : info_TL->packet[cstr_info->packno -
- 1].end_pos + 1;
- }
- info_PK->end_pos = info_PK->start_pos + e - 1;
- info_PK->end_ph_pos += info_PK->start_pos -
- 1; /* End of packet header which now only represents the distance
- // to start of packet is incremented by value of start of packet*/
- cstr_info->packno++;
- }
- /* << INDEX */
-
- if (e == -999) { /* ADD */
- break;
- } else {
- c += e;
- }
- }
- }
- /* INDEX >> */
- if (cstr_info) {
- cstr_info->tile[tileno].tp[curtp].tp_numpacks = cstr_info->packno -
- tp_start_packno; /* Number of packets in last tile-part*/
- cstr_info->tile[tileno].tp[curtp].tp_start_pack = tp_start_packno;
- }
- /* << INDEX */
-
- /* don't forget to release pi */
- pi_destroy(pi, cp, tileno);
-
- if (e == -999) {
- return e;
- }
-
- return (c - src);
-}
-
-/* ----------------------------------------------------------------------- */
-
-opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp)
-{
- /* create the tcd structure */
- opj_t2_t *t2 = (opj_t2_t*)opj_malloc(sizeof(opj_t2_t));
- if (!t2) {
- return NULL;
- }
- t2->cinfo = cinfo;
- t2->image = image;
- t2->cp = cp;
-
- return t2;
-}
-
-void t2_destroy(opj_t2_t *t2)
-{
- if (t2) {
- opj_free(t2);
- }
-}
-
-
-
-
-
+++ /dev/null
-/*
- * 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 __T2_H
-#define __T2_H
-/**
-@file t2.h
-@brief Implementation of a tier-2 coding (packetization of code-block data) (T2)
-
-*/
-
-/** @defgroup T2 T2 - Implementation of a tier-2 coding */
-/*@{*/
-
-/**
-Tier-2 coding
-*/
-typedef struct opj_t2 {
- /** codec context */
- opj_common_ptr cinfo;
-
- /** Encoding: pointer to the src image. Decoding: pointer to the dst image. */
- opj_image_t *image;
- /** pointer to the image coding parameters */
- opj_cp_t *cp;
-} opj_t2_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-
-/**
-Encode the packets of a tile to a destination buffer
-@param t2 T2 handle
-@param tileno number of the tile encoded
-@param tile the tile for which to write the packets
-@param maxlayers maximum number of layers
-@param dest the destination buffer
-@param len the length of the destination buffer
-@param cstr_info Codestream information structure
-@param tpnum Tile part number of the current tile
-@param tppos The position of the tile part flag in the progression order
-@param pino
-@param t2_mode If == 0 In Threshold calculation ,If == 1 Final pass
-@param cur_totnum_tp The total number of tile parts in the current tile
-*/
-int t2_encode_packets(opj_t2_t* t2, int tileno, opj_tcd_tile_t *tile,
- int maxlayers, unsigned char *dest, int len, opj_codestream_info_t *cstr_info,
- int tpnum, int tppos, int pino, J2K_T2_MODE t2_mode, int cur_totnum_tp);
-/**
-Decode the packets of a tile from a source buffer
-@param t2 T2 handle
-@param src the source buffer
-@param len length of the source buffer
-@param tileno number that identifies the tile for which to decode the packets
-@param tile tile for which to decode the packets
-@param cstr_info Codestream information structure
- */
-int t2_decode_packets(opj_t2_t *t2, unsigned char *src, int len, int tileno,
- opj_tcd_tile_t *tile, opj_codestream_info_t *cstr_info);
-
-/**
-Create a T2 handle
-@param cinfo Codec context info
-@param image Source or destination image
-@param cp Image coding parameters
-@return Returns a new T2 handle if successful, returns NULL otherwise
-*/
-opj_t2_t* t2_create(opj_common_ptr cinfo, opj_image_t *image, opj_cp_t *cp);
-/**
-Destroy a T2 handle
-@param t2 T2 handle to destroy
-*/
-void t2_destroy(opj_t2_t *t2);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __T2_H */
+++ /dev/null
-/*
- * 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.
- */
-
-#define _ISOC99_SOURCE /* lrintf is C99 */
-#include "opj_includes.h"
-
-void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t * img)
-{
- int tileno, compno, resno, bandno, precno;/*, cblkno;*/
-
- fprintf(fd, "image {\n");
- fprintf(fd, " tw=%d, th=%d x0=%d x1=%d y0=%d y1=%d\n",
- img->tw, img->th, tcd->image->x0, tcd->image->x1, tcd->image->y0,
- tcd->image->y1);
-
- for (tileno = 0; tileno < img->th * img->tw; tileno++) {
- opj_tcd_tile_t *tile = &tcd->tcd_image->tiles[tileno];
- fprintf(fd, " tile {\n");
- fprintf(fd, " x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n",
- tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps);
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- fprintf(fd, " tilec {\n");
- fprintf(fd,
- " x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n",
- tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions);
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- fprintf(fd, "\n res {\n");
- fprintf(fd,
- " x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n",
- res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands);
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- fprintf(fd, " band {\n");
- fprintf(fd,
- " x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%f, numbps=%d\n",
- band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps);
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- opj_tcd_precinct_t *prec = &band->precincts[precno];
- fprintf(fd, " prec {\n");
- fprintf(fd,
- " x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n",
- prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch);
- /*
- for (cblkno = 0; cblkno < prec->cw * prec->ch; cblkno++) {
- opj_tcd_cblk_t *cblk = &prec->cblks[cblkno];
- fprintf(fd, " cblk {\n");
- fprintf(fd,
- " x0=%d, y0=%d, x1=%d, y1=%d\n",
- cblk->x0, cblk->y0, cblk->x1, cblk->y1);
- fprintf(fd, " }\n");
- }
- */
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, " }\n");
- }
- fprintf(fd, "}\n");
-}
-
-/* ----------------------------------------------------------------------- */
-
-/**
-Create a new TCD handle
-*/
-opj_tcd_t* tcd_create(opj_common_ptr cinfo)
-{
- /* create the tcd structure */
- opj_tcd_t *tcd = (opj_tcd_t*)opj_malloc(sizeof(opj_tcd_t));
- if (!tcd) {
- return NULL;
- }
- tcd->cinfo = cinfo;
- tcd->tcd_image = (opj_tcd_image_t*)opj_malloc(sizeof(opj_tcd_image_t));
- if (!tcd->tcd_image) {
- opj_free(tcd);
- return NULL;
- }
-
- return tcd;
-}
-
-/**
-Destroy a previously created TCD handle
-*/
-void tcd_destroy(opj_tcd_t *tcd)
-{
- if (tcd) {
- opj_free(tcd->tcd_image);
- opj_free(tcd);
- }
-}
-
-/* ----------------------------------------------------------------------- */
-
-void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp,
- int curtileno)
-{
- int tileno, compno, resno, bandno, precno, cblkno;
-
- tcd->image = image;
- tcd->cp = cp;
- tcd->tcd_image->tw = cp->tw;
- tcd->tcd_image->th = cp->th;
- tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_malloc(sizeof(opj_tcd_tile_t));
-
- for (tileno = 0; tileno < 1; tileno++) {
- opj_tcp_t *tcp = &cp->tcps[curtileno];
- int j;
-
- /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
- int p = curtileno % cp->tw; /* si numerotation matricielle .. */
- int q = curtileno /
- cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */
-
- /* opj_tcd_tile_t *tile=&tcd->tcd_image->tiles[tileno]; */
- opj_tcd_tile_t *tile = tcd->tcd_image->tiles;
-
- /* 4 borders of the tile rescale on the image if necessary */
- tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
- tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
- tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
- tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
- tile->numcomps = image->numcomps;
- /* tile->PPT=image->PPT; */
-
- /* Modification of the RATE >> */
- for (j = 0; j < tcp->numlayers; j++) {
- tcp->rates[j] = tcp->rates[j] ?
- cp->tp_on ?
- (((float)(tile->numcomps
- * (tile->x1 - tile->x0)
- * (tile->y1 - tile->y0)
- * image->comps[0].prec))
- / (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((
- tcd->cur_totnum_tp - 1) * 14) / tcp->numlayers)
- :
- ((float)(tile->numcomps
- * (tile->x1 - tile->x0)
- * (tile->y1 - tile->y0)
- * image->comps[0].prec)) /
- (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)
- : 0;
-
- if (tcp->rates[j]) {
- if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) {
- tcp->rates[j] = tcp->rates[j - 1] + 20;
- } else {
- if (!j && tcp->rates[j] < 30) {
- tcp->rates[j] = 30;
- }
- }
-
- if (j == (tcp->numlayers - 1)) {
- tcp->rates[j] = tcp->rates[j] - 2;
- }
- }
- }
- /* << Modification of the RATE */
-
- tile->comps = (opj_tcd_tilecomp_t *) opj_malloc(image->numcomps * sizeof(
- opj_tcd_tilecomp_t));
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tccp_t *tccp = &tcp->tccps[compno];
-
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-
- /* border of each tile component (global) */
- tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
- tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
- tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
- tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
-
- tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) *
- (tilec->y1 - tilec->y0) * sizeof(int));
- tilec->numresolutions = tccp->numresolutions;
-
- tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(
- tilec->numresolutions * sizeof(opj_tcd_resolution_t));
-
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- int pdx, pdy;
- int levelno = tilec->numresolutions - 1 - resno;
- int tlprcxstart, tlprcystart, brprcxend, brprcyend;
- int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
- int cbgwidthexpn, cbgheightexpn;
- int cblkwidthexpn, cblkheightexpn;
-
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- /* border for each resolution level (global) */
- res->x0 = int_ceildivpow2(tilec->x0, levelno);
- res->y0 = int_ceildivpow2(tilec->y0, levelno);
- res->x1 = int_ceildivpow2(tilec->x1, levelno);
- res->y1 = int_ceildivpow2(tilec->y1, levelno);
-
- res->numbands = resno == 0 ? 1 : 3;
- /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
- if (tccp->csty & J2K_CCP_CSTY_PRT) {
- pdx = tccp->prcw[resno];
- pdy = tccp->prch[resno];
- } else {
- pdx = 15;
- pdy = 15;
- }
- /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
- tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
- tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
-
- brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
- brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
-
- res->pw = (brprcxend - tlprcxstart) >> pdx;
- res->ph = (brprcyend - tlprcystart) >> pdy;
-
- if (resno == 0) {
- tlcbgxstart = tlprcxstart;
- tlcbgystart = tlprcystart;
- brcbgxend = brprcxend;
- brcbgyend = brprcyend;
- cbgwidthexpn = pdx;
- cbgheightexpn = pdy;
- } else {
- tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
- tlcbgystart = int_ceildivpow2(tlprcystart, 1);
- brcbgxend = int_ceildivpow2(brprcxend, 1);
- brcbgyend = int_ceildivpow2(brprcyend, 1);
- cbgwidthexpn = pdx - 1;
- cbgheightexpn = pdy - 1;
- }
-
- cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
- cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- int x0b, y0b, i;
- int gain, numbps;
- opj_stepsize_t *ss = NULL;
-
- opj_tcd_band_t *band = &res->bands[bandno];
-
- band->bandno = resno == 0 ? 0 : bandno + 1;
- x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
- y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
-
- if (band->bandno == 0) {
- /* band border (global) */
- band->x0 = int_ceildivpow2(tilec->x0, levelno);
- band->y0 = int_ceildivpow2(tilec->y0, levelno);
- band->x1 = int_ceildivpow2(tilec->x1, levelno);
- band->y1 = int_ceildivpow2(tilec->y1, levelno);
- } else {
- /* band border (global) */
- band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
- band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
- band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
- band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
- }
-
- ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
- gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(
- band->bandno);
- numbps = image->comps[compno].prec + gain;
-
- band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0,
- numbps - ss->expn));
- band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */
-
- band->precincts = (opj_tcd_precinct_t *) opj_malloc(3 * res->pw * res->ph *
- sizeof(opj_tcd_precinct_t));
-
- for (i = 0; i < res->pw * res->ph * 3; i++) {
- band->precincts[i].imsbtree = NULL;
- band->precincts[i].incltree = NULL;
- band->precincts[i].cblks.enc = NULL;
- }
-
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
-
- int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
- int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
- int cbgxend = cbgxstart + (1 << cbgwidthexpn);
- int cbgyend = cbgystart + (1 << cbgheightexpn);
-
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- /* precinct size (global) */
- prc->x0 = int_max(cbgxstart, band->x0);
- prc->y0 = int_max(cbgystart, band->y0);
- prc->x1 = int_min(cbgxend, band->x1);
- prc->y1 = int_min(cbgyend, band->y1);
-
- tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
- tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
- brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
- brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
- prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
- prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
-
- prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc((prc->cw * prc->ch),
- sizeof(opj_tcd_cblk_enc_t));
- prc->incltree = tgt_create(prc->cw, prc->ch);
- prc->imsbtree = tgt_create(prc->cw, prc->ch);
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
- int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
- int cblkxend = cblkxstart + (1 << cblkwidthexpn);
- int cblkyend = cblkystart + (1 << cblkheightexpn);
-
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
-
- /* code-block size (global) */
- cblk->x0 = int_max(cblkxstart, prc->x0);
- cblk->y0 = int_max(cblkystart, prc->y0);
- cblk->x1 = int_min(cblkxend, prc->x1);
- cblk->y1 = int_min(cblkyend, prc->y1);
- cblk->data = (unsigned char*) opj_calloc(9728 + 2, sizeof(unsigned char));
- /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */
- cblk->data[0] = 0;
- cblk->data[1] = 0;
- cblk->data += 2;
- cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t));
- cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t));
- }
- }
- }
- }
- }
- }
-
- /* tcd_dump(stdout, tcd, &tcd->tcd_image); */
-}
-
-void tcd_free_encode(opj_tcd_t *tcd)
-{
- int tileno, compno, resno, bandno, precno, cblkno;
-
- for (tileno = 0; tileno < 1; tileno++) {
- opj_tcd_tile_t *tile = tcd->tcd_image->tiles;
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
-
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- if (prc->incltree != NULL) {
- tgt_destroy(prc->incltree);
- prc->incltree = NULL;
- }
- if (prc->imsbtree != NULL) {
- tgt_destroy(prc->imsbtree);
- prc->imsbtree = NULL;
- }
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_free(prc->cblks.enc[cblkno].data - 2);
- opj_free(prc->cblks.enc[cblkno].layers);
- opj_free(prc->cblks.enc[cblkno].passes);
- }
- opj_free(prc->cblks.enc);
- } /* for (precno */
- opj_free(band->precincts);
- band->precincts = NULL;
- } /* for (bandno */
- } /* for (resno */
- opj_free(tilec->resolutions);
- tilec->resolutions = NULL;
- } /* for (compno */
- opj_free(tile->comps);
- tile->comps = NULL;
- } /* for (tileno */
- opj_free(tcd->tcd_image->tiles);
- tcd->tcd_image->tiles = NULL;
-}
-
-void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp,
- int curtileno)
-{
- int tileno, compno, resno, bandno, precno, cblkno;
-
- for (tileno = 0; tileno < 1; tileno++) {
- opj_tcp_t *tcp = &cp->tcps[curtileno];
- int j;
- /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
- int p = curtileno % cp->tw;
- int q = curtileno / cp->tw;
-
- opj_tcd_tile_t *tile = tcd->tcd_image->tiles;
-
- /* 4 borders of the tile rescale on the image if necessary */
- tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
- tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
- tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
- tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
-
- tile->numcomps = image->numcomps;
- /* tile->PPT=image->PPT; */
-
- /* Modification of the RATE >> */
- for (j = 0; j < tcp->numlayers; j++) {
- tcp->rates[j] = tcp->rates[j] ?
- cp->tp_on ?
- (((float)(tile->numcomps
- * (tile->x1 - tile->x0)
- * (tile->y1 - tile->y0)
- * image->comps[0].prec))
- / (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)) - (((
- tcd->cur_totnum_tp - 1) * 14) / tcp->numlayers)
- :
- ((float)(tile->numcomps
- * (tile->x1 - tile->x0)
- * (tile->y1 - tile->y0)
- * image->comps[0].prec)) /
- (tcp->rates[j] * 8 * image->comps[0].dx * image->comps[0].dy)
- : 0;
-
- if (tcp->rates[j]) {
- if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) {
- tcp->rates[j] = tcp->rates[j - 1] + 20;
- } else {
- if (!j && tcp->rates[j] < 30) {
- tcp->rates[j] = 30;
- }
- }
- }
- }
- /* << Modification of the RATE */
-
- /* tile->comps=(opj_tcd_tilecomp_t*)opj_realloc(tile->comps,image->numcomps*sizeof(opj_tcd_tilecomp_t)); */
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tccp_t *tccp = &tcp->tccps[compno];
-
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-
- /* border of each tile component (global) */
- tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
- tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
- tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
- tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
-
- tilec->data = (int *) opj_aligned_malloc((tilec->x1 - tilec->x0) *
- (tilec->y1 - tilec->y0) * sizeof(int));
- tilec->numresolutions = tccp->numresolutions;
- /* tilec->resolutions=(opj_tcd_resolution_t*)opj_realloc(tilec->resolutions,tilec->numresolutions*sizeof(opj_tcd_resolution_t)); */
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- int pdx, pdy;
-
- int levelno = tilec->numresolutions - 1 - resno;
- int tlprcxstart, tlprcystart, brprcxend, brprcyend;
- int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
- int cbgwidthexpn, cbgheightexpn;
- int cblkwidthexpn, cblkheightexpn;
-
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- /* border for each resolution level (global) */
- res->x0 = int_ceildivpow2(tilec->x0, levelno);
- res->y0 = int_ceildivpow2(tilec->y0, levelno);
- res->x1 = int_ceildivpow2(tilec->x1, levelno);
- res->y1 = int_ceildivpow2(tilec->y1, levelno);
- res->numbands = resno == 0 ? 1 : 3;
-
- /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
- if (tccp->csty & J2K_CCP_CSTY_PRT) {
- pdx = tccp->prcw[resno];
- pdy = tccp->prch[resno];
- } else {
- pdx = 15;
- pdy = 15;
- }
- /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
- tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
- tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
- brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
- brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
-
- res->pw = (brprcxend - tlprcxstart) >> pdx;
- res->ph = (brprcyend - tlprcystart) >> pdy;
-
- if (resno == 0) {
- tlcbgxstart = tlprcxstart;
- tlcbgystart = tlprcystart;
- brcbgxend = brprcxend;
- brcbgyend = brprcyend;
- cbgwidthexpn = pdx;
- cbgheightexpn = pdy;
- } else {
- tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
- tlcbgystart = int_ceildivpow2(tlprcystart, 1);
- brcbgxend = int_ceildivpow2(brprcxend, 1);
- brcbgyend = int_ceildivpow2(brprcyend, 1);
- cbgwidthexpn = pdx - 1;
- cbgheightexpn = pdy - 1;
- }
-
- cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
- cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- int x0b, y0b;
- int gain, numbps;
- opj_stepsize_t *ss = NULL;
-
- opj_tcd_band_t *band = &res->bands[bandno];
-
- band->bandno = resno == 0 ? 0 : bandno + 1;
- x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
- y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
-
- if (band->bandno == 0) {
- /* band border */
- band->x0 = int_ceildivpow2(tilec->x0, levelno);
- band->y0 = int_ceildivpow2(tilec->y0, levelno);
- band->x1 = int_ceildivpow2(tilec->x1, levelno);
- band->y1 = int_ceildivpow2(tilec->y1, levelno);
- } else {
- band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
- band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
- band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
- band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
- }
-
- ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
- gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(
- band->bandno);
- numbps = image->comps[compno].prec + gain;
- band->stepsize = (float)((1.0 + ss->mant / 2048.0) * pow(2.0,
- numbps - ss->expn));
- band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */
-
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
-
- int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
- int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
- int cbgxend = cbgxstart + (1 << cbgwidthexpn);
- int cbgyend = cbgystart + (1 << cbgheightexpn);
-
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- /* precinct size (global) */
- prc->x0 = int_max(cbgxstart, band->x0);
- prc->y0 = int_max(cbgystart, band->y0);
- prc->x1 = int_min(cbgxend, band->x1);
- prc->y1 = int_min(cbgyend, band->y1);
-
- tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
- tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
- brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
- brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
- prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
- prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
-
- opj_free(prc->cblks.enc);
- prc->cblks.enc = (opj_tcd_cblk_enc_t*) opj_calloc(prc->cw * prc->ch,
- sizeof(opj_tcd_cblk_enc_t));
-
- if (prc->incltree != NULL) {
- tgt_destroy(prc->incltree);
- }
- if (prc->imsbtree != NULL) {
- tgt_destroy(prc->imsbtree);
- }
-
- prc->incltree = tgt_create(prc->cw, prc->ch);
- prc->imsbtree = tgt_create(prc->cw, prc->ch);
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
- int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
- int cblkxend = cblkxstart + (1 << cblkwidthexpn);
- int cblkyend = cblkystart + (1 << cblkheightexpn);
-
- opj_tcd_cblk_enc_t* cblk = &prc->cblks.enc[cblkno];
-
- /* code-block size (global) */
- cblk->x0 = int_max(cblkxstart, prc->x0);
- cblk->y0 = int_max(cblkystart, prc->y0);
- cblk->x1 = int_min(cblkxend, prc->x1);
- cblk->y1 = int_min(cblkyend, prc->y1);
- cblk->data = (unsigned char*) opj_calloc(8192 + 2, sizeof(unsigned char));
- /* FIXME: mqc_init_enc and mqc_byteout underrun the buffer if we don't do this. Why? */
- cblk->data[0] = 0;
- cblk->data[1] = 0;
- cblk->data += 2;
- cblk->layers = (opj_tcd_layer_t*) opj_calloc(100, sizeof(opj_tcd_layer_t));
- cblk->passes = (opj_tcd_pass_t*) opj_calloc(100, sizeof(opj_tcd_pass_t));
- }
- } /* precno */
- } /* bandno */
- } /* resno */
- } /* compno */
- } /* tileno */
-
- /* tcd_dump(stdout, tcd, &tcd->tcd_image); */
-}
-
-void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp)
-{
- int i, j, tileno, p, q;
- unsigned int x0 = 0, y0 = 0, x1 = 0, y1 = 0, w, h;
-
- tcd->image = image;
- tcd->tcd_image->tw = cp->tw;
- tcd->tcd_image->th = cp->th;
- tcd->tcd_image->tiles = (opj_tcd_tile_t *) opj_calloc(cp->tw * cp->th,
- sizeof(opj_tcd_tile_t));
-
- /*
- Allocate place to store the decoded data = final image
- Place limited by the tile really present in the codestream
- */
-
- for (j = 0; j < cp->tileno_size; j++) {
- opj_tcd_tile_t *tile;
-
- tileno = cp->tileno[j];
- tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]);
- tile->numcomps = image->numcomps;
- tile->comps = (opj_tcd_tilecomp_t*) opj_calloc(image->numcomps,
- sizeof(opj_tcd_tilecomp_t));
- }
-
- for (i = 0; i < image->numcomps; i++) {
- for (j = 0; j < cp->tileno_size; j++) {
- opj_tcd_tile_t *tile;
- opj_tcd_tilecomp_t *tilec;
-
- /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
-
- tileno = cp->tileno[j];
-
- tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]);
- tilec = &tile->comps[i];
-
- p = tileno % cp->tw; /* si numerotation matricielle .. */
- q = tileno /
- cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */
-
- /* 4 borders of the tile rescale on the image if necessary */
- tile->x0 = int_max(cp->tx0 + p * cp->tdx, image->x0);
- tile->y0 = int_max(cp->ty0 + q * cp->tdy, image->y0);
- tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, image->x1);
- tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, image->y1);
-
- tilec->x0 = int_ceildiv(tile->x0, image->comps[i].dx);
- tilec->y0 = int_ceildiv(tile->y0, image->comps[i].dy);
- tilec->x1 = int_ceildiv(tile->x1, image->comps[i].dx);
- tilec->y1 = int_ceildiv(tile->y1, image->comps[i].dy);
-
- x0 = j == 0 ? tilec->x0 : int_min(x0, (unsigned int) tilec->x0);
- y0 = j == 0 ? tilec->y0 : int_min(y0, (unsigned int) tilec->y0);
- x1 = j == 0 ? tilec->x1 : int_max(x1, (unsigned int) tilec->x1);
- y1 = j == 0 ? tilec->y1 : int_max(y1, (unsigned int) tilec->y1);
- }
-
- w = int_ceildivpow2(x1 - x0, image->comps[i].factor);
- h = int_ceildivpow2(y1 - y0, image->comps[i].factor);
-
- image->comps[i].w = w;
- image->comps[i].h = h;
- image->comps[i].x0 = x0;
- image->comps[i].y0 = y0;
- }
-}
-
-void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp,
- int tileno, opj_codestream_info_t *cstr_info)
-{
- int compno, resno, bandno, precno, cblkno;
- opj_tcp_t *tcp;
- opj_tcd_tile_t *tile;
-
- OPJ_ARG_NOT_USED(cstr_info);
-
- tcd->cp = cp;
-
- tcp = &(cp->tcps[cp->tileno[tileno]]);
- tile = &(tcd->tcd_image->tiles[cp->tileno[tileno]]);
-
- tileno = cp->tileno[tileno];
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
-
- if (tccp->numresolutions <= 0) {
- cp->tileno[tileno] = -1;
- return;
- }
-
- /* border of each tile component (global) */
- tilec->x0 = int_ceildiv(tile->x0, image->comps[compno].dx);
- tilec->y0 = int_ceildiv(tile->y0, image->comps[compno].dy);
- tilec->x1 = int_ceildiv(tile->x1, image->comps[compno].dx);
- tilec->y1 = int_ceildiv(tile->y1, image->comps[compno].dy);
-
- tilec->numresolutions = tccp->numresolutions;
- tilec->resolutions = (opj_tcd_resolution_t *) opj_malloc(
- tilec->numresolutions * sizeof(opj_tcd_resolution_t));
-
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- int pdx, pdy;
- int levelno = tilec->numresolutions - 1 - resno;
- int tlprcxstart, tlprcystart, brprcxend, brprcyend;
- int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend;
- int cbgwidthexpn, cbgheightexpn;
- int cblkwidthexpn, cblkheightexpn;
-
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- /* border for each resolution level (global) */
- res->x0 = int_ceildivpow2(tilec->x0, levelno);
- res->y0 = int_ceildivpow2(tilec->y0, levelno);
- res->x1 = int_ceildivpow2(tilec->x1, levelno);
- res->y1 = int_ceildivpow2(tilec->y1, levelno);
- res->numbands = resno == 0 ? 1 : 3;
-
- /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */
- if (tccp->csty & J2K_CCP_CSTY_PRT) {
- pdx = tccp->prcw[resno];
- pdy = tccp->prch[resno];
- } else {
- pdx = 15;
- pdy = 15;
- }
-
- /* p. 64, B.6, ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */
- tlprcxstart = int_floordivpow2(res->x0, pdx) << pdx;
- tlprcystart = int_floordivpow2(res->y0, pdy) << pdy;
- brprcxend = int_ceildivpow2(res->x1, pdx) << pdx;
- brprcyend = int_ceildivpow2(res->y1, pdy) << pdy;
-
- res->pw = (res->x0 == res->x1) ? 0 : ((brprcxend - tlprcxstart) >> pdx);
- res->ph = (res->y0 == res->y1) ? 0 : ((brprcyend - tlprcystart) >> pdy);
-
- if (resno == 0) {
- tlcbgxstart = tlprcxstart;
- tlcbgystart = tlprcystart;
- brcbgxend = brprcxend;
- brcbgyend = brprcyend;
- cbgwidthexpn = pdx;
- cbgheightexpn = pdy;
- } else {
- tlcbgxstart = int_ceildivpow2(tlprcxstart, 1);
- tlcbgystart = int_ceildivpow2(tlprcystart, 1);
- brcbgxend = int_ceildivpow2(brprcxend, 1);
- brcbgyend = int_ceildivpow2(brprcyend, 1);
- cbgwidthexpn = pdx - 1;
- cbgheightexpn = pdy - 1;
- }
-
- cblkwidthexpn = int_min(tccp->cblkw, cbgwidthexpn);
- cblkheightexpn = int_min(tccp->cblkh, cbgheightexpn);
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- int x0b, y0b;
- int gain, numbps;
- opj_stepsize_t *ss = NULL;
-
- opj_tcd_band_t *band = &res->bands[bandno];
- band->bandno = resno == 0 ? 0 : bandno + 1;
- x0b = (band->bandno == 1) || (band->bandno == 3) ? 1 : 0;
- y0b = (band->bandno == 2) || (band->bandno == 3) ? 1 : 0;
-
- if (band->bandno == 0) {
- /* band border (global) */
- band->x0 = int_ceildivpow2(tilec->x0, levelno);
- band->y0 = int_ceildivpow2(tilec->y0, levelno);
- band->x1 = int_ceildivpow2(tilec->x1, levelno);
- band->y1 = int_ceildivpow2(tilec->y1, levelno);
- } else {
- /* band border (global) */
- band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1);
- band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1);
- band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1);
- band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1);
- }
-
- ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1];
- gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(
- band->bandno);
- numbps = image->comps[compno].prec + gain;
- band->stepsize = (float)(((1.0 + ss->mant / 2048.0) * pow(2.0,
- numbps - ss->expn)) * 0.5);
- band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */
-
- band->precincts = (opj_tcd_precinct_t *) opj_malloc(res->pw * res->ph * sizeof(
- opj_tcd_precinct_t));
-
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend;
- int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn);
- int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn);
- int cbgxend = cbgxstart + (1 << cbgwidthexpn);
- int cbgyend = cbgystart + (1 << cbgheightexpn);
-
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- /* precinct size (global) */
- prc->x0 = int_max(cbgxstart, band->x0);
- prc->y0 = int_max(cbgystart, band->y0);
- prc->x1 = int_min(cbgxend, band->x1);
- prc->y1 = int_min(cbgyend, band->y1);
-
- tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn;
- tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn;
- brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn;
- brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn;
- prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn;
- prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn;
-
- prc->cblks.dec = (opj_tcd_cblk_dec_t*) opj_malloc(prc->cw * prc->ch * sizeof(
- opj_tcd_cblk_dec_t));
-
- prc->incltree = tgt_create(prc->cw, prc->ch);
- prc->imsbtree = tgt_create(prc->cw, prc->ch);
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn);
- int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn);
- int cblkxend = cblkxstart + (1 << cblkwidthexpn);
- int cblkyend = cblkystart + (1 << cblkheightexpn);
-
- opj_tcd_cblk_dec_t* cblk = &prc->cblks.dec[cblkno];
- cblk->data = NULL;
- cblk->segs = NULL;
- /* code-block size (global) */
- cblk->x0 = int_max(cblkxstart, prc->x0);
- cblk->y0 = int_max(cblkystart, prc->y0);
- cblk->x1 = int_min(cblkxend, prc->x1);
- cblk->y1 = int_min(cblkyend, prc->y1);
- cblk->numsegs = 0;
- }
- } /* precno */
- } /* bandno */
- } /* resno */
- } /* compno */
- /* tcd_dump(stdout, tcd, &tcd->tcd_image); */
-}
-
-void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final)
-{
- int compno, resno, bandno, precno, cblkno;
- int value; /*, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; */
- int matrice[10][10][3];
- int i, j, k;
-
- opj_cp_t *cp = tcd->cp;
- opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
- opj_tcp_t *tcd_tcp = tcd->tcp;
-
- /*matrice=(int*)opj_malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int)); */
-
- for (compno = 0; compno < tcd_tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
- for (i = 0; i < tcd_tcp->numlayers; i++) {
- for (j = 0; j < tilec->numresolutions; j++) {
- for (k = 0; k < 3; k++) {
- matrice[i][j][k] =
- (int)(cp->matrice[i * tilec->numresolutions * 3 + j * 3 + k]
- * (float)(tcd->image->comps[compno].prec / 16.0));
- }
- }
- }
-
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
- int n;
- int imsb = tcd->image->comps[compno].prec -
- cblk->numbps; /* number of bit-plan equal to zero */
- /* Correction of the matrix of coefficient to include the IMSB information */
- if (layno == 0) {
- value = matrice[layno][resno][bandno];
- if (imsb >= value) {
- value = 0;
- } else {
- value -= imsb;
- }
- } else {
- value = matrice[layno][resno][bandno] - matrice[layno - 1][resno][bandno];
- if (imsb >= matrice[layno - 1][resno][bandno]) {
- value -= (imsb - matrice[layno - 1][resno][bandno]);
- if (value < 0) {
- value = 0;
- }
- }
- }
-
- if (layno == 0) {
- cblk->numpassesinlayers = 0;
- }
-
- n = cblk->numpassesinlayers;
- if (cblk->numpassesinlayers == 0) {
- if (value != 0) {
- n = 3 * value - 2 + cblk->numpassesinlayers;
- } else {
- n = cblk->numpassesinlayers;
- }
- } else {
- n = 3 * value + cblk->numpassesinlayers;
- }
-
- layer->numpasses = n - cblk->numpassesinlayers;
-
- if (!layer->numpasses) {
- continue;
- }
-
- if (cblk->numpassesinlayers == 0) {
- layer->len = cblk->passes[n - 1].rate;
- layer->data = cblk->data;
- } else {
- layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers -
- 1].rate;
- layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
- }
- if (final) {
- cblk->numpassesinlayers = n;
- }
- }
- }
- }
- }
- }
-}
-
-void tcd_rateallocate_fixed(opj_tcd_t *tcd)
-{
- int layno;
- for (layno = 0; layno < tcd->tcp->numlayers; layno++) {
- tcd_makelayer_fixed(tcd, layno, 1);
- }
-}
-
-void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final)
-{
- int compno, resno, bandno, precno, cblkno, passno;
-
- opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
-
- tcd_tile->distolayer[layno] = 0; /* fixed_quality */
-
- for (compno = 0; compno < tcd_tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
- opj_tcd_layer_t *layer = &cblk->layers[layno];
-
- int n;
- if (layno == 0) {
- cblk->numpassesinlayers = 0;
- }
- n = cblk->numpassesinlayers;
- for (passno = cblk->numpassesinlayers; passno < cblk->totalpasses; passno++) {
- int dr;
- double dd;
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- if (n == 0) {
- dr = pass->rate;
- dd = pass->distortiondec;
- } else {
- dr = pass->rate - cblk->passes[n - 1].rate;
- dd = pass->distortiondec - cblk->passes[n - 1].distortiondec;
- }
- if (!dr) {
- if (dd != 0) {
- n = passno + 1;
- }
- continue;
- }
- if (dd / dr >= thresh) {
- n = passno + 1;
- }
- }
- layer->numpasses = n - cblk->numpassesinlayers;
-
- if (!layer->numpasses) {
- layer->disto = 0;
- continue;
- }
- if (cblk->numpassesinlayers == 0) {
- layer->len = cblk->passes[n - 1].rate;
- layer->data = cblk->data;
- layer->disto = cblk->passes[n - 1].distortiondec;
- } else {
- layer->len = cblk->passes[n - 1].rate - cblk->passes[cblk->numpassesinlayers -
- 1].rate;
- layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate;
- layer->disto = cblk->passes[n - 1].distortiondec -
- cblk->passes[cblk->numpassesinlayers - 1].distortiondec;
- }
-
- tcd_tile->distolayer[layno] += layer->disto; /* fixed_quality */
-
- if (final) {
- cblk->numpassesinlayers = n;
- }
- }
- }
- }
- }
- }
-}
-
-opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len,
- opj_codestream_info_t *cstr_info)
-{
- int compno, resno, bandno, precno, cblkno, passno, layno;
- double min, max;
- double cumdisto[100]; /* fixed_quality */
- const double K = 1; /* 1.1; fixed_quality */
- double maxSE = 0;
-
- opj_cp_t *cp = tcd->cp;
- opj_tcd_tile_t *tcd_tile = tcd->tcd_tile;
- opj_tcp_t *tcd_tcp = tcd->tcp;
-
- min = DBL_MAX;
- max = 0;
-
- tcd_tile->numpix = 0; /* fixed_quality */
-
- for (compno = 0; compno < tcd_tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tcd_tile->comps[compno];
- tilec->numpix = 0;
-
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
-
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
-
- for (precno = 0; precno < res->pw * res->ph; precno++) {
- opj_tcd_precinct_t *prc = &band->precincts[precno];
-
- for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
- opj_tcd_cblk_enc_t *cblk = &prc->cblks.enc[cblkno];
-
- for (passno = 0; passno < cblk->totalpasses; passno++) {
- opj_tcd_pass_t *pass = &cblk->passes[passno];
- int dr;
- double dd, rdslope;
- if (passno == 0) {
- dr = pass->rate;
- dd = pass->distortiondec;
- } else {
- dr = pass->rate - cblk->passes[passno - 1].rate;
- dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec;
- }
- if (dr == 0) {
- continue;
- }
- rdslope = dd / dr;
- if (rdslope < min) {
- min = rdslope;
- }
- if (rdslope > max) {
- max = rdslope;
- }
- } /* passno */
-
- /* fixed_quality */
- tcd_tile->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
- tilec->numpix += ((cblk->x1 - cblk->x0) * (cblk->y1 - cblk->y0));
- } /* cbklno */
- } /* precno */
- } /* bandno */
- } /* resno */
-
- maxSE += (((double)(1 << tcd->image->comps[compno].prec) - 1.0)
- * ((double)(1 << tcd->image->comps[compno].prec) - 1.0))
- * ((double)(tilec->numpix));
- } /* compno */
-
- /* index file */
- if (cstr_info) {
- opj_tile_info_t *tile_info = &cstr_info->tile[tcd->tcd_tileno];
- tile_info->numpix = tcd_tile->numpix;
- tile_info->distotile = tcd_tile->distotile;
- tile_info->thresh = (double *) opj_malloc(tcd_tcp->numlayers * sizeof(double));
- }
-
- for (layno = 0; layno < tcd_tcp->numlayers; layno++) {
- double lo = min;
- double hi = max;
- int success = 0;
- int maxlen = tcd_tcp->rates[layno] ? int_min(((int) ceil(
- tcd_tcp->rates[layno])), len) : len;
- double goodthresh = 0;
- double stable_thresh = 0;
- int i;
- double distotarget; /* fixed_quality */
-
- /* fixed_quality */
- distotarget = tcd_tile->distotile - ((K * maxSE) / pow((float)10,
- tcd_tcp->distoratio[layno] / 10));
-
- /* Don't try to find an optimal threshold but rather take everything not included yet, if
- -r xx,yy,zz,0 (disto_alloc == 1 and rates == 0)
- -q xx,yy,zz,0 (fixed_quality == 1 and distoratio == 0)
- ==> possible to have some lossy layers and the last layer for sure lossless */
- if (((cp->disto_alloc == 1) && (tcd_tcp->rates[layno] > 0)) ||
- ((cp->fixed_quality == 1) && (tcd_tcp->distoratio[layno] > 0))) {
- opj_t2_t *t2 = t2_create(tcd->cinfo, tcd->image, cp);
- double thresh = 0;
-
- for (i = 0; i < 128; i++) {
- int l = 0;
- double distoachieved = 0; /* fixed_quality */
- thresh = (lo + hi) / 2;
-
- tcd_makelayer(tcd, layno, thresh, 0);
-
- if (cp->fixed_quality) { /* fixed_quality */
- if (cp->cinema) {
- l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen,
- cstr_info, tcd->cur_tp_num, tcd->tp_pos, tcd->cur_pino, THRESH_CALC,
- tcd->cur_totnum_tp);
- if (l == -999) {
- lo = thresh;
- continue;
- } else {
- distoachieved = layno == 0 ?
- tcd_tile->distolayer[0] : cumdisto[layno - 1] + tcd_tile->distolayer[layno];
- if (distoachieved < distotarget) {
- hi = thresh;
- stable_thresh = thresh;
- continue;
- } else {
- lo = thresh;
- }
- }
- } else {
- distoachieved = (layno == 0) ?
- tcd_tile->distolayer[0] : (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
- if (distoachieved < distotarget) {
- hi = thresh;
- stable_thresh = thresh;
- continue;
- }
- lo = thresh;
- }
- } else {
- l = t2_encode_packets(t2, tcd->tcd_tileno, tcd_tile, layno + 1, dest, maxlen,
- cstr_info, tcd->cur_tp_num, tcd->tp_pos, tcd->cur_pino, THRESH_CALC,
- tcd->cur_totnum_tp);
- /* TODO: what to do with l ??? seek / tell ??? */
- /* opj_event_msg(tcd->cinfo, EVT_INFO, "rate alloc: len=%d, max=%d\n", l, maxlen); */
- if (l == -999) {
- lo = thresh;
- continue;
- }
- hi = thresh;
- stable_thresh = thresh;
- }
- }
- success = 1;
- goodthresh = stable_thresh == 0 ? thresh : stable_thresh;
- t2_destroy(t2);
- } else {
- success = 1;
- goodthresh = min;
- }
-
- if (!success) {
- return OPJ_FALSE;
- }
-
- if (cstr_info) { /* Threshold for Marcela Index */
- cstr_info->tile[tcd->tcd_tileno].thresh[layno] = goodthresh;
- }
- tcd_makelayer(tcd, layno, goodthresh, 1);
-
- /* fixed_quality */
- cumdisto[layno] = (layno == 0) ? tcd_tile->distolayer[0] :
- (cumdisto[layno - 1] + tcd_tile->distolayer[layno]);
- }
-
- return OPJ_TRUE;
-}
-
-int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len,
- opj_codestream_info_t *cstr_info)
-{
- int compno;
- int l, i, numpacks = 0;
- opj_tcd_tile_t *tile = NULL;
- opj_tcp_t *tcd_tcp = NULL;
- opj_cp_t *cp = NULL;
-
- opj_tcp_t *tcp = &tcd->cp->tcps[0];
- opj_tccp_t *tccp = &tcp->tccps[0];
- opj_image_t *image = tcd->image;
-
- opj_t1_t *t1 = NULL; /* T1 component */
- opj_t2_t *t2 = NULL; /* T2 component */
-
- tcd->tcd_tileno = tileno;
- tcd->tcd_tile = tcd->tcd_image->tiles;
- tcd->tcp = &tcd->cp->tcps[tileno];
-
- tile = tcd->tcd_tile;
- tcd_tcp = tcd->tcp;
- cp = tcd->cp;
-
- if (tcd->cur_tp_num == 0) {
- tcd->encoding_time = opj_clock(); /* time needed to encode a tile */
- /* INDEX >> "Precinct_nb_X et Precinct_nb_Y" */
- if (cstr_info) {
- opj_tcd_tilecomp_t *tilec_idx = &tile->comps[0]; /* based on component 0 */
- for (i = 0; i < tilec_idx->numresolutions; i++) {
- opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[i];
-
- cstr_info->tile[tileno].pw[i] = res_idx->pw;
- cstr_info->tile[tileno].ph[i] = res_idx->ph;
-
- numpacks += res_idx->pw * res_idx->ph;
-
- cstr_info->tile[tileno].pdx[i] = tccp->prcw[i];
- cstr_info->tile[tileno].pdy[i] = tccp->prch[i];
- }
- cstr_info->tile[tileno].packet = (opj_packet_info_t*) opj_calloc(
- cstr_info->numcomps * cstr_info->numlayers * numpacks,
- sizeof(opj_packet_info_t));
- }
- /* << INDEX */
-
- /*---------------TILE-------------------*/
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- int x, y;
-
- int adjust = image->comps[compno].sgnd ? 0 : 1 << (image->comps[compno].prec -
- 1);
- int offset_x = int_ceildiv(image->x0, image->comps[compno].dx);
- int offset_y = int_ceildiv(image->y0, image->comps[compno].dy);
-
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- int tw = tilec->x1 - tilec->x0;
- int w = int_ceildiv(image->x1 - image->x0, image->comps[compno].dx);
-
- /* extract tile data */
-
- if (tcd_tcp->tccps[compno].qmfbid == 1) {
- for (y = tilec->y0; y < tilec->y1; y++) {
- /* start of the src tile scanline */
- int *data = &image->comps[compno].data[(tilec->x0 - offset_x) +
- (y - offset_y) * w];
- /* start of the dst tile scanline */
- int *tile_data = &tilec->data[(y - tilec->y0) * tw];
- for (x = tilec->x0; x < tilec->x1; x++) {
- *tile_data++ = *data++ - adjust;
- }
- }
- } else if (tcd_tcp->tccps[compno].qmfbid == 0) {
- for (y = tilec->y0; y < tilec->y1; y++) {
- /* start of the src tile scanline */
- int *data = &image->comps[compno].data[(tilec->x0 - offset_x) +
- (y - offset_y) * w];
- /* start of the dst tile scanline */
- int *tile_data = &tilec->data[(y - tilec->y0) * tw];
- for (x = tilec->x0; x < tilec->x1; x++) {
- *tile_data++ = (*data++ - adjust) << 11;
- }
-
- }
- }
- }
-
- /*----------------MCT-------------------*/
- if (tcd_tcp->mct) {
- int samples = (tile->comps[0].x1 - tile->comps[0].x0) *
- (tile->comps[0].y1 - tile->comps[0].y0);
- if (tcd_tcp->tccps[0].qmfbid == 0) {
- mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data,
- samples);
- } else {
- mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data,
- samples);
- }
- }
-
- /*----------------DWT---------------------*/
-
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- if (tcd_tcp->tccps[compno].qmfbid == 1) {
- dwt_encode(tilec);
- } else if (tcd_tcp->tccps[compno].qmfbid == 0) {
- dwt_encode_real(tilec);
- }
- }
-
- /*------------------TIER1-----------------*/
- t1 = t1_create(tcd->cinfo);
- t1_encode_cblks(t1, tile, tcd_tcp);
- t1_destroy(t1);
-
- /*-----------RATE-ALLOCATE------------------*/
-
- /* INDEX */
- if (cstr_info) {
- cstr_info->index_write = 0;
- }
- if (cp->disto_alloc || cp->fixed_quality) { /* fixed_quality */
- /* Normal Rate/distortion allocation */
- tcd_rateallocate(tcd, dest, len, cstr_info);
- } else {
- /* Fixed layer allocation */
- tcd_rateallocate_fixed(tcd);
- }
- }
- /*--------------TIER2------------------*/
-
- /* INDEX */
- if (cstr_info) {
- cstr_info->index_write = 1;
- }
-
- t2 = t2_create(tcd->cinfo, image, cp);
- l = t2_encode_packets(t2, tileno, tile, tcd_tcp->numlayers, dest, len,
- cstr_info, tcd->tp_num, tcd->tp_pos, tcd->cur_pino, FINAL_PASS,
- tcd->cur_totnum_tp);
- t2_destroy(t2);
-
- /*---------------CLEAN-------------------*/
-
-
- if (tcd->cur_tp_num == tcd->cur_totnum_tp - 1) {
- tcd->encoding_time = opj_clock() - tcd->encoding_time;
- opj_event_msg(tcd->cinfo, EVT_INFO, "- tile encoded in %f s\n",
- tcd->encoding_time);
-
- /* cleaning memory */
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- opj_aligned_free(tilec->data);
- }
- }
-
- return l;
-}
-
-opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len,
- int tileno, opj_codestream_info_t *cstr_info)
-{
- int l;
- int compno;
- int eof = 0;
- double tile_time, t1_time, dwt_time;
- opj_tcd_tile_t *tile = NULL;
-
- opj_t1_t *t1 = NULL; /* T1 component */
- opj_t2_t *t2 = NULL; /* T2 component */
-
- tcd->tcd_tileno = tileno;
- tcd->tcd_tile = &(tcd->tcd_image->tiles[tileno]);
- tcd->tcp = &(tcd->cp->tcps[tileno]);
- tile = tcd->tcd_tile;
-
- tile_time = opj_clock(); /* time needed to decode a tile */
- opj_event_msg(tcd->cinfo, EVT_INFO, "tile %d of %d\n", tileno + 1,
- tcd->cp->tw * tcd->cp->th);
-
- /* INDEX >> */
- if (cstr_info) {
- int resno, compno, numprec = 0;
- for (compno = 0; compno < cstr_info->numcomps; compno++) {
- opj_tcp_t *tcp = &tcd->cp->tcps[0];
- opj_tccp_t *tccp = &tcp->tccps[compno];
- opj_tcd_tilecomp_t *tilec_idx = &tile->comps[compno];
- for (resno = 0; resno < tilec_idx->numresolutions; resno++) {
- opj_tcd_resolution_t *res_idx = &tilec_idx->resolutions[resno];
- cstr_info->tile[tileno].pw[resno] = res_idx->pw;
- cstr_info->tile[tileno].ph[resno] = res_idx->ph;
- numprec += res_idx->pw * res_idx->ph;
- if (tccp->csty & J2K_CP_CSTY_PRT) {
- cstr_info->tile[tileno].pdx[resno] = tccp->prcw[resno];
- cstr_info->tile[tileno].pdy[resno] = tccp->prch[resno];
- } else {
- cstr_info->tile[tileno].pdx[resno] = 15;
- cstr_info->tile[tileno].pdy[resno] = 15;
- }
- }
- }
- cstr_info->tile[tileno].packet = (opj_packet_info_t *) opj_malloc(
- cstr_info->numlayers * numprec * sizeof(opj_packet_info_t));
- cstr_info->packno = 0;
- }
- /* << INDEX */
-
- /*--------------TIER2------------------*/
-
- t2 = t2_create(tcd->cinfo, tcd->image, tcd->cp);
- l = t2_decode_packets(t2, src, len, tileno, tile, cstr_info);
- t2_destroy(t2);
-
- if (l == -999) {
- eof = 1;
- opj_event_msg(tcd->cinfo, EVT_ERROR, "tcd_decode: incomplete bitstream\n");
- }
-
- /*------------------TIER1-----------------*/
-
- t1_time = opj_clock(); /* time needed to decode a tile */
- t1 = t1_create(tcd->cinfo);
- if (t1 == NULL) {
- opj_event_msg(tcd->cinfo, EVT_ERROR, "Out of memory\n");
- t1_destroy(t1);
- return OPJ_FALSE;
- }
-
- for (compno = 0; compno < tile->numcomps; ++compno) {
- opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
- /* The +3 is headroom required by the vectorized DWT */
- tilec->data = (int*) opj_aligned_malloc((((tilec->x1 - tilec->x0) *
- (tilec->y1 - tilec->y0)) + 3) * sizeof(int));
- if (tilec->data == NULL) {
- opj_event_msg(tcd->cinfo, EVT_ERROR, "Out of memory\n");
- return OPJ_FALSE;
- }
-
- t1_decode_cblks(t1, tilec, &tcd->tcp->tccps[compno]);
- }
- t1_destroy(t1);
- t1_time = opj_clock() - t1_time;
- opj_event_msg(tcd->cinfo, EVT_INFO, "- tiers-1 took %f s\n", t1_time);
-
- /*----------------DWT---------------------*/
-
- dwt_time = opj_clock(); /* time needed to decode a tile */
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- int numres2decode;
-
- if (tcd->cp->reduce != 0) {
- if (tile->comps[compno].numresolutions < (tcd->cp->reduce - 1)) {
- opj_event_msg(tcd->cinfo, EVT_ERROR,
- "Error decoding tile. The number of resolutions to remove [%d+1] is higher than the number "
- " of resolutions in the original codestream [%d]\nModify the cp_reduce parameter.\n",
- tcd->cp->reduce, tile->comps[compno].numresolutions);
- return OPJ_FALSE;
- } else {
- tcd->image->comps[compno].resno_decoded =
- tile->comps[compno].numresolutions - tcd->cp->reduce - 1;
- }
- }
-
- numres2decode = tcd->image->comps[compno].resno_decoded + 1;
- if (numres2decode > 0) {
- if (tcd->tcp->tccps[compno].qmfbid == 1) {
- dwt_decode(tilec, numres2decode);
- } else {
- dwt_decode_real(tilec, numres2decode);
- }
- }
- }
- dwt_time = opj_clock() - dwt_time;
- opj_event_msg(tcd->cinfo, EVT_INFO, "- dwt took %f s\n", dwt_time);
-
- /*----------------MCT-------------------*/
-
- if (tcd->tcp->mct) {
- int n = (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 -
- tile->comps[0].y0);
-
- if (tile->numcomps >= 3) {
- if (tcd->tcp->tccps[0].qmfbid == 1) {
- mct_decode(
- tile->comps[0].data,
- tile->comps[1].data,
- tile->comps[2].data,
- n);
- } else {
- mct_decode_real(
- (float*)tile->comps[0].data,
- (float*)tile->comps[1].data,
- (float*)tile->comps[2].data,
- n);
- }
- } else {
- opj_event_msg(tcd->cinfo, EVT_WARNING,
- "Number of components (%d) is inconsistent with a MCT. Skip the MCT step.\n",
- tile->numcomps);
- }
- }
-
- /*---------------TILE-------------------*/
-
- for (compno = 0; compno < tile->numcomps; ++compno) {
- opj_tcd_tilecomp_t* tilec = &tile->comps[compno];
- opj_image_comp_t* imagec = &tcd->image->comps[compno];
- opj_tcd_resolution_t* res = &tilec->resolutions[imagec->resno_decoded];
- int adjust = imagec->sgnd ? 0 : 1 << (imagec->prec - 1);
- int min = imagec->sgnd ? -(1 << (imagec->prec - 1)) : 0;
- int max = imagec->sgnd ? (1 << (imagec->prec - 1)) - 1 :
- (1 << imagec->prec) - 1;
-
- int tw = tilec->x1 - tilec->x0;
- int w = imagec->w;
-
- int offset_x = int_ceildivpow2(imagec->x0, imagec->factor);
- int offset_y = int_ceildivpow2(imagec->y0, imagec->factor);
-
- int i, j;
- if (!imagec->data) {
- imagec->data = (int*) opj_malloc(imagec->w * imagec->h * sizeof(int));
- }
- if (!imagec->data) {
- opj_event_msg(tcd->cinfo, EVT_ERROR, "Out of memory\n");
- return OPJ_FALSE;
- }
- if (tcd->tcp->tccps[compno].qmfbid == 1) {
- for (j = res->y0; j < res->y1; ++j) {
- for (i = res->x0; i < res->x1; ++i) {
- int v = tilec->data[i - res->x0 + (j - res->y0) * tw];
- v += adjust;
- imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max);
- }
- }
- } else {
- for (j = res->y0; j < res->y1; ++j) {
- for (i = res->x0; i < res->x1; ++i) {
- float tmp = ((float*)tilec->data)[i - res->x0 + (j - res->y0) * tw];
- int v = lrintf(tmp);
- v += adjust;
- imagec->data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max);
- }
- }
- }
- opj_aligned_free(tilec->data);
- }
-
- tile_time = opj_clock() - tile_time; /* time needed to decode a tile */
- opj_event_msg(tcd->cinfo, EVT_INFO, "- tile decoded in %f s\n", tile_time);
-
- if (eof) {
- return OPJ_FALSE;
- }
-
- return OPJ_TRUE;
-}
-
-void tcd_free_decode(opj_tcd_t *tcd)
-{
- opj_tcd_image_t *tcd_image = tcd->tcd_image;
- int i = 0;
- for (i = 0; i < tcd_image->tw * tcd_image->th; i++) {
- tcd_free_decode_tile(tcd, i);
- }
-
- opj_free(tcd_image->tiles);
-}
-
-void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno)
-{
- int compno, resno, bandno, precno, cblkno;
-
- opj_tcd_image_t *tcd_image = tcd->tcd_image;
-
- opj_tcd_tile_t *tile = &tcd_image->tiles[tileno];
- if (tile->comps != NULL) {
- for (compno = 0; compno < tile->numcomps; compno++) {
- opj_tcd_tilecomp_t *tilec = &tile->comps[compno];
- for (resno = 0; resno < tilec->numresolutions; resno++) {
- opj_tcd_resolution_t *res = &tilec->resolutions[resno];
- for (bandno = 0; bandno < res->numbands; bandno++) {
- opj_tcd_band_t *band = &res->bands[bandno];
- for (precno = 0; precno < res->ph * res->pw; precno++) {
- opj_tcd_precinct_t *prec = &band->precincts[precno];
- if (prec->cblks.dec != NULL) {
- for (cblkno = 0; cblkno < prec->cw * prec->ch; ++cblkno) {
- opj_tcd_cblk_dec_t* cblk = &prec->cblks.dec[cblkno];
- opj_free(cblk->data);
- opj_free(cblk->segs);
- }
- opj_free(prec->cblks.dec);
- }
- if (prec->imsbtree != NULL) {
- tgt_destroy(prec->imsbtree);
- }
- if (prec->incltree != NULL) {
- tgt_destroy(prec->incltree);
- }
-
-
- }
- opj_free(band->precincts);
- }
- }
- opj_free(tilec->resolutions);
- }
- opj_free(tile->comps);
- tile->comps = NULL;
- }
-}
-
-
-
+++ /dev/null
-/*
- * 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 __TCD_H
-#define __TCD_H
-/**
-@file tcd.h
-@brief Implementation of a tile coder/decoder (TCD)
-
-The functions in TCD.C have for goal to encode or decode each tile independently from
-each other. The functions in TCD.C are used by some function in J2K.C.
-*/
-
-/** @defgroup TCD TCD - Implementation of a tile coder/decoder */
-/*@{*/
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_seg {
- unsigned char** data;
- int dataindex;
- int numpasses;
- int len;
- int maxpasses;
- int numnewpasses;
- int newlen;
-} opj_tcd_seg_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_pass {
- int rate;
- double distortiondec;
- int term, len;
-} opj_tcd_pass_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_layer {
- int numpasses; /* Number of passes in the layer */
- int len; /* len of information */
- double disto; /* add for index (Cfr. Marcela) */
- unsigned char *data; /* data */
-} opj_tcd_layer_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_cblk_enc {
- unsigned char* data; /* Data */
- opj_tcd_layer_t* layers; /* layer information */
- opj_tcd_pass_t* passes; /* information about the passes */
- int x0, y0, x1,
- y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
- int numbps;
- int numlenbits;
- int numpasses; /* number of pass already done for the code-blocks */
- int numpassesinlayers; /* number of passes in the layer */
- int totalpasses; /* total number of passes */
-} opj_tcd_cblk_enc_t;
-
-typedef struct opj_tcd_cblk_dec {
- unsigned char* data; /* Data */
- opj_tcd_seg_t* segs; /* segments information */
- int x0, y0, x1,
- y1; /* dimension of the code-blocks : left upper corner (x0, y0) right low corner (x1,y1) */
- int numbps;
- int numlenbits;
- int len; /* length */
- int numnewpasses; /* number of pass added to the code-blocks */
- int numsegs; /* number of segments */
-} opj_tcd_cblk_dec_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_precinct {
- int x0, y0, x1,
- y1; /* dimension of the precinct : left upper corner (x0, y0) right low corner (x1,y1) */
- int cw, ch; /* number of precinct in width and height */
- union { /* code-blocks information */
- opj_tcd_cblk_enc_t* enc;
- opj_tcd_cblk_dec_t* dec;
- } cblks;
- opj_tgt_tree_t *incltree; /* inclusion tree */
- opj_tgt_tree_t *imsbtree; /* IMSB tree */
-} opj_tcd_precinct_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_band {
- int x0, y0, x1,
- y1; /* dimension of the subband : left upper corner (x0, y0) right low corner (x1,y1) */
- int bandno;
- opj_tcd_precinct_t *precincts; /* precinct information */
- int numbps;
- float stepsize;
-} opj_tcd_band_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_resolution {
- int x0, y0, x1,
- y1; /* dimension of the resolution level : left upper corner (x0, y0) right low corner (x1,y1) */
- int pw, ph;
- int numbands; /* number sub-band for the resolution level */
- opj_tcd_band_t bands[3]; /* subband information */
-} opj_tcd_resolution_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_tilecomp {
- int x0, y0, x1,
- y1; /* dimension of component : left upper corner (x0, y0) right low corner (x1,y1) */
- int numresolutions; /* number of resolutions level */
- opj_tcd_resolution_t *resolutions; /* resolutions information */
- int *data; /* data of the component */
- int numpix; /* add fixed_quality */
-} opj_tcd_tilecomp_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_tile {
- int x0, y0, x1,
- y1; /* dimension of the tile : left upper corner (x0, y0) right low corner (x1,y1) */
- int numcomps; /* number of components in tile */
- opj_tcd_tilecomp_t *comps; /* Components information */
- int numpix; /* add fixed_quality */
- double distotile; /* add fixed_quality */
- double distolayer[100]; /* add fixed_quality */
- /** packet number */
- int packno;
-} opj_tcd_tile_t;
-
-/**
-FIXME: documentation
-*/
-typedef struct opj_tcd_image {
- int tw, th; /* number of tiles in width and height */
- opj_tcd_tile_t *tiles; /* Tiles information */
-} opj_tcd_image_t;
-
-/**
-Tile coder/decoder
-*/
-typedef struct opj_tcd {
- /** Position of the tilepart flag in Progression order*/
- int tp_pos;
- /** Tile part number*/
- int tp_num;
- /** Current tile part number*/
- int cur_tp_num;
- /** Total number of tileparts of the current tile*/
- int cur_totnum_tp;
- /** Current Packet iterator number */
- int cur_pino;
- /** codec context */
- opj_common_ptr cinfo;
-
- /** info on each image tile */
- opj_tcd_image_t *tcd_image;
- /** image */
- opj_image_t *image;
- /** coding parameters */
- opj_cp_t *cp;
- /** pointer to the current encoded/decoded tile */
- opj_tcd_tile_t *tcd_tile;
- /** coding/decoding parameters common to all tiles */
- opj_tcp_t *tcp;
- /** current encoded/decoded tile */
- int tcd_tileno;
- /** Time taken to encode a tile*/
- double encoding_time;
-} opj_tcd_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-
-/**
-Dump the content of a tcd structure
-*/
-void tcd_dump(FILE *fd, opj_tcd_t *tcd, opj_tcd_image_t *img);
-/**
-Create a new TCD handle
-@param cinfo Codec context info
-@return Returns a new TCD handle if successful returns NULL otherwise
-*/
-opj_tcd_t* tcd_create(opj_common_ptr cinfo);
-/**
-Destroy a previously created TCD handle
-@param tcd TCD handle to destroy
-*/
-void tcd_destroy(opj_tcd_t *tcd);
-/**
-Initialize the tile coder (allocate the memory)
-@param tcd TCD handle
-@param image Raw image
-@param cp Coding parameters
-@param curtileno Number that identifies the tile that will be encoded
-*/
-void tcd_malloc_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp,
- int curtileno);
-/**
-Free the memory allocated for encoding
-@param tcd TCD handle
-*/
-void tcd_free_encode(opj_tcd_t *tcd);
-/**
-Initialize the tile coder (reuses the memory allocated by tcd_malloc_encode)
-@param tcd TCD handle
-@param image Raw image
-@param cp Coding parameters
-@param curtileno Number that identifies the tile that will be encoded
-*/
-void tcd_init_encode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp,
- int curtileno);
-/**
-Initialize the tile decoder
-@param tcd TCD handle
-@param image Raw image
-@param cp Coding parameters
-*/
-void tcd_malloc_decode(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp);
-void tcd_malloc_decode_tile(opj_tcd_t *tcd, opj_image_t * image, opj_cp_t * cp,
- int tileno, opj_codestream_info_t *cstr_info);
-void tcd_makelayer_fixed(opj_tcd_t *tcd, int layno, int final);
-void tcd_rateallocate_fixed(opj_tcd_t *tcd);
-void tcd_makelayer(opj_tcd_t *tcd, int layno, double thresh, int final);
-opj_bool tcd_rateallocate(opj_tcd_t *tcd, unsigned char *dest, int len,
- opj_codestream_info_t *cstr_info);
-/**
-Encode a tile from the raw image into a buffer
-@param tcd TCD handle
-@param tileno Number that identifies one of the tiles to be encoded
-@param dest Destination buffer
-@param len Length of destination buffer
-@param cstr_info Codestream information structure
-@return
-*/
-int tcd_encode_tile(opj_tcd_t *tcd, int tileno, unsigned char *dest, int len,
- opj_codestream_info_t *cstr_info);
-/**
-Decode a tile from a buffer into a raw image
-@param tcd TCD handle
-@param src Source buffer
-@param len Length of source buffer
-@param tileno Number that identifies one of the tiles to be decoded
-@param cstr_info Codestream information structure
-*/
-opj_bool tcd_decode_tile(opj_tcd_t *tcd, unsigned char *src, int len,
- int tileno, opj_codestream_info_t *cstr_info);
-/**
-Free the memory allocated for decoding
-@param tcd TCD handle
-*/
-void tcd_free_decode(opj_tcd_t *tcd);
-void tcd_free_decode_tile(opj_tcd_t *tcd, int tileno);
-
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __TCD_H */
+++ /dev/null
-/*
- * 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.
- */
-
-#include "opj_includes.h"
-
-/*
-==========================================================
- Tag-tree coder interface
-==========================================================
-*/
-
-opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv)
-{
- int nplh[32];
- int nplv[32];
- opj_tgt_node_t *node = NULL;
- opj_tgt_node_t *parentnode = NULL;
- opj_tgt_node_t *parentnode0 = NULL;
- opj_tgt_tree_t *tree = NULL;
- int i, j, k;
- int numlvls;
- int n;
-
- tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t));
- if (!tree) {
- return NULL;
- }
- tree->numleafsh = numleafsh;
- tree->numleafsv = numleafsv;
-
- numlvls = 0;
- nplh[0] = numleafsh;
- nplv[0] = numleafsv;
- tree->numnodes = 0;
- do {
- n = nplh[numlvls] * nplv[numlvls];
- nplh[numlvls + 1] = (nplh[numlvls] + 1) / 2;
- nplv[numlvls + 1] = (nplv[numlvls] + 1) / 2;
- tree->numnodes += n;
- ++numlvls;
- } while (n > 1);
-
- /* ADD */
- if (tree->numnodes == 0) {
- opj_free(tree);
- return NULL;
- }
-
- tree->nodes = (opj_tgt_node_t*) opj_calloc(tree->numnodes,
- sizeof(opj_tgt_node_t));
- if (!tree->nodes) {
- opj_free(tree);
- return NULL;
- }
-
- node = tree->nodes;
- parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv];
- parentnode0 = parentnode;
-
- for (i = 0; i < numlvls - 1; ++i) {
- for (j = 0; j < nplv[i]; ++j) {
- k = nplh[i];
- while (--k >= 0) {
- node->parent = parentnode;
- ++node;
- if (--k >= 0) {
- node->parent = parentnode;
- ++node;
- }
- ++parentnode;
- }
- if ((j & 1) || j == nplv[i] - 1) {
- parentnode0 = parentnode;
- } else {
- parentnode = parentnode0;
- parentnode0 += nplh[i];
- }
- }
- }
- node->parent = 0;
-
- tgt_reset(tree);
-
- return tree;
-}
-
-void tgt_destroy(opj_tgt_tree_t *tree)
-{
- opj_free(tree->nodes);
- opj_free(tree);
-}
-
-void tgt_reset(opj_tgt_tree_t *tree)
-{
- int i;
-
- if (NULL == tree) {
- return;
- }
-
- for (i = 0; i < tree->numnodes; i++) {
- tree->nodes[i].value = 999;
- tree->nodes[i].low = 0;
- tree->nodes[i].known = 0;
- }
-}
-
-void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value)
-{
- opj_tgt_node_t *node;
- node = &tree->nodes[leafno];
- while (node && node->value > value) {
- node->value = value;
- node = node->parent;
- }
-}
-
-void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno,
- int threshold)
-{
- opj_tgt_node_t *stk[31];
- opj_tgt_node_t **stkptr;
- opj_tgt_node_t *node;
- int low;
-
- stkptr = stk;
- node = &tree->nodes[leafno];
- while (node->parent) {
- *stkptr++ = node;
- node = node->parent;
- }
-
- low = 0;
- for (;;) {
- if (low > node->low) {
- node->low = low;
- } else {
- low = node->low;
- }
-
- while (low < threshold) {
- if (low >= node->value) {
- if (!node->known) {
- bio_write(bio, 1, 1);
- node->known = 1;
- }
- break;
- }
- bio_write(bio, 0, 1);
- ++low;
- }
-
- node->low = low;
- if (stkptr == stk) {
- break;
- }
- node = *--stkptr;
- }
-}
-
-int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold)
-{
- opj_tgt_node_t *stk[31];
- opj_tgt_node_t **stkptr;
- opj_tgt_node_t *node;
- int low;
-
- stkptr = stk;
- node = &tree->nodes[leafno];
- while (node->parent) {
- *stkptr++ = node;
- node = node->parent;
- }
-
- low = 0;
- for (;;) {
- if (low > node->low) {
- node->low = low;
- } else {
- low = node->low;
- }
- while (low < threshold && low < node->value) {
- if (bio_read(bio, 1)) {
- node->value = low;
- } else {
- ++low;
- }
- }
- node->low = low;
- if (stkptr == stk) {
- break;
- }
- node = *--stkptr;
- }
-
- return (node->value < threshold) ? 1 : 0;
-}
+++ /dev/null
-/*
- * 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 __TGT_H
-#define __TGT_H
-/**
-@file tgt.h
-@brief Implementation of a tag-tree coder (TGT)
-
-The functions in TGT.C have for goal to realize a tag-tree coder. The functions in TGT.C
-are used by some function in T2.C.
-*/
-
-/** @defgroup TGT TGT - Implementation of a tag-tree coder */
-/*@{*/
-
-/**
-Tag node
-*/
-typedef struct opj_tgt_node {
- struct opj_tgt_node *parent;
- int value;
- int low;
- int known;
-} opj_tgt_node_t;
-
-/**
-Tag tree
-*/
-typedef struct opj_tgt_tree {
- int numleafsh;
- int numleafsv;
- int numnodes;
- opj_tgt_node_t *nodes;
-} opj_tgt_tree_t;
-
-/** @name Exported functions */
-/*@{*/
-/* ----------------------------------------------------------------------- */
-/**
-Create a tag-tree
-@param numleafsh Width of the array of leafs of the tree
-@param numleafsv Height of the array of leafs of the tree
-@return Returns a new tag-tree if successful, returns NULL otherwise
-*/
-opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv);
-/**
-Destroy a tag-tree, liberating memory
-@param tree Tag-tree to destroy
-*/
-void tgt_destroy(opj_tgt_tree_t *tree);
-/**
-Reset a tag-tree (set all leaves to 0)
-@param tree Tag-tree to reset
-*/
-void tgt_reset(opj_tgt_tree_t *tree);
-/**
-Set the value of a leaf of a tag-tree
-@param tree Tag-tree to modify
-@param leafno Number that identifies the leaf to modify
-@param value New value of the leaf
-*/
-void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value);
-/**
-Encode the value of a leaf of the tag-tree up to a given threshold
-@param bio Pointer to a BIO handle
-@param tree Tag-tree to modify
-@param leafno Number that identifies the leaf to encode
-@param threshold Threshold to use when encoding value of the leaf
-*/
-void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno,
- int threshold);
-/**
-Decode the value of a leaf of the tag-tree up to a given threshold
-@param bio Pointer to a BIO handle
-@param tree Tag-tree to decode
-@param leafno Number that identifies the leaf to decode
-@param threshold Threshold to use when decoding value of the leaf
-@return Returns 1 if the node's value < threshold, returns 0 otherwise
-*/
-int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold);
-/* ----------------------------------------------------------------------- */
-/*@}*/
-
-/*@}*/
-
-#endif /* __TGT_H */
set_property(TARGET openjpegjni PROPERTY NO_SONAME 1)
# FIXME (need to use old API):
-if(BUILD_MJ2)
- target_link_libraries(openjpegjni openmj2)
-endif()
target_link_libraries(openjpegjni
${PNG_LIBNAME} ${TIFF_LIBNAME} ${LCMS_LIBNAME} ${Z_LIBNAME}
)