[trunk] FolderReorgProposal task: add JP3D
Update issue 177
This commit is contained in:
parent
32773fa638
commit
03d1a40164
|
@ -1,29 +0,0 @@
|
||||||
# Build the demo app, small examples
|
|
||||||
|
|
||||||
# First thing define the common source:
|
|
||||||
SET(common_SRCS
|
|
||||||
convert.c
|
|
||||||
)
|
|
||||||
|
|
||||||
IF(WIN32)
|
|
||||||
IF(BUILD_SHARED_LIBS)
|
|
||||||
ADD_DEFINITIONS(-DOPJ_EXPORTS)
|
|
||||||
ELSE(BUILD_SHARED_LIBS)
|
|
||||||
ADD_DEFINITIONS(-DOPJ_STATIC)
|
|
||||||
ENDIF(BUILD_SHARED_LIBS)
|
|
||||||
ENDIF(WIN32)
|
|
||||||
|
|
||||||
# Loop over all executables:
|
|
||||||
FOREACH(exe jp3d_to_volume volume_to_jp3d)
|
|
||||||
ADD_EXECUTABLE(${exe} ${exe}.c ${common_SRCS})
|
|
||||||
TARGET_LINK_LIBRARIES(${exe} ${OPENJP3D_LIBRARY_NAME})
|
|
||||||
# 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 ${OPENJP3D_INSTALL_BIN_DIR} COMPONENT Applications
|
|
||||||
)
|
|
||||||
ENDFOREACH(exe)
|
|
|
@ -1,23 +0,0 @@
|
||||||
|
|
||||||
MAINTAINERCLEANFILES = Makefile.in
|
|
||||||
|
|
||||||
bin_PROGRAMS = jp3d_to_volume volume_to_jp3d
|
|
||||||
LDADD = $(USERLIBS) ../libjp3dvm/libopenjp3dvm.la
|
|
||||||
|
|
||||||
jp3d_to_volume_CPPFLAGS =
|
|
||||||
jp3d_to_volume_CFLAGS =
|
|
||||||
jp3d_to_volume_LDADD = $(top_builddir)/jp3d/libjp3dvm/libopenjp3dvm.la -lm
|
|
||||||
jp3d_to_volume_SOURCES = getopt.c convert.c jp3d_to_volume.c convert.h
|
|
||||||
|
|
||||||
volume_to_jp3d_CPPFLAGS =
|
|
||||||
volume_to_jp3d_CFLAGS =
|
|
||||||
volume_to_jp3d_LDADD = $(top_builddir)/jp3d/libjp3dvm/libopenjp3dvm.la
|
|
||||||
volume_to_jp3d_SOURCES = getopt.c convert.c volume_to_jp3d.c convert.h
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
CMakeLists.txt \
|
|
||||||
windirent.h
|
|
||||||
|
|
||||||
install-data-hook:
|
|
||||||
@echo -e " (B)\t$(bindir)/jp3d_to_volume$(EXEEXT)" >> $(top_builddir)/report.txt
|
|
||||||
@echo -e " (B)\t$(bindir)/volume_to_jp3d$(EXEEXT)" >> $(top_builddir)/report.txt
|
|
997
codec/convert.c
997
codec/convert.c
|
@ -1,997 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <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");
|
|
||||||
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%[ \t]%c%c%[ \t+-]%d%[ \t]%d%[ \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");
|
|
||||||
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;
|
|
||||||
if (sliceno != 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);
|
|
||||||
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);
|
|
||||||
|
|
||||||
sprintf(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);
|
|
||||||
fclose(f);
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#ifndef __JP3D_CONVERT_H
|
|
||||||
#define __JP3D_CONVERT_H
|
|
||||||
|
|
||||||
/**
|
|
||||||
Load a single volume component encoded in PGX file format
|
|
||||||
@param filename Name of the PGX file to load
|
|
||||||
@param parameters *List ?*
|
|
||||||
@return Returns a greyscale volume if successful, returns NULL otherwise
|
|
||||||
*/
|
|
||||||
opj_volume_t* pgxtovolume(char *filename, opj_cparameters_t *parameters);
|
|
||||||
|
|
||||||
int volumetopgx(opj_volume_t *volume, char *outfile);
|
|
||||||
|
|
||||||
opj_volume_t* bintovolume(char *filename,char *fileimg, opj_cparameters_t *parameters);
|
|
||||||
|
|
||||||
int volumetobin(opj_volume_t *volume, char *outfile);
|
|
||||||
|
|
||||||
opj_volume_t* imgtovolume(char *fileimg, opj_cparameters_t *parameters);
|
|
||||||
|
|
||||||
#endif /* __J2K_CONVERT_H */
|
|
||||||
|
|
109
codec/getopt.c
109
codec/getopt.c
|
@ -1,109 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 1987, 1993, 1994
|
|
||||||
* The Regents of the University of California. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. All advertising materials mentioning features or use of this software
|
|
||||||
* must display the following acknowledgement:
|
|
||||||
* This product includes software developed by the University of
|
|
||||||
* California, Berkeley and its contributors.
|
|
||||||
* 4. Neither the name of the University nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* last review : october 29th, 2002 */
|
|
||||||
|
|
||||||
#if defined(LIBC_SCCS) && !defined(lint)
|
|
||||||
static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95";
|
|
||||||
#endif /* LIBC_SCCS and not lint */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
int opterr = 1, /* if error message should be printed */
|
|
||||||
optind = 1, /* index into parent argv vector */
|
|
||||||
optopt, /* character checked for validity */
|
|
||||||
optreset; /* reset getopt */
|
|
||||||
char *optarg; /* argument associated with option */
|
|
||||||
|
|
||||||
#define BADCH (int)'?'
|
|
||||||
#define BADARG (int)':'
|
|
||||||
#define EMSG ""
|
|
||||||
|
|
||||||
/*
|
|
||||||
* getopt --
|
|
||||||
* Parse argc/argv argument vector.
|
|
||||||
*/
|
|
||||||
int getopt(int nargc, char *const *nargv, const char *ostr) {
|
|
||||||
|
|
||||||
# define __progname nargv[0] /* program name */
|
|
||||||
|
|
||||||
static char *place = EMSG; /* option letter processing */
|
|
||||||
char *oli; /* option letter list index */
|
|
||||||
|
|
||||||
if (optreset || !*place) { /* update scanning pointer */
|
|
||||||
optreset = 0;
|
|
||||||
if (optind >= nargc || *(place = nargv[optind]) != '-') {
|
|
||||||
place = EMSG;
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
if (place[1] && *++place == '-') { /* found "--" */
|
|
||||||
++optind;
|
|
||||||
place = EMSG;
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
} /* option letter okay? */
|
|
||||||
|
|
||||||
if ((optopt = (int) *place++) == (int) ':' || !(oli = strchr(ostr, optopt))) {
|
|
||||||
/* if the user didn't specify '-' as an option, assume it means -1. */
|
|
||||||
if (optopt == (int) '-')
|
|
||||||
return (-1);
|
|
||||||
if (!*place)
|
|
||||||
++optind;
|
|
||||||
if (opterr && *ostr != ':')
|
|
||||||
(void) fprintf(stdout,"[ERROR] %s: illegal option -- %c\n", __progname, optopt);
|
|
||||||
return (BADCH);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*++oli != ':') { /* don't need argument */
|
|
||||||
optarg = NULL;
|
|
||||||
if (!*place)
|
|
||||||
++optind;
|
|
||||||
} else { /* need an argument */
|
|
||||||
if (*place) /* no white space */
|
|
||||||
optarg = place;
|
|
||||||
else if (nargc <= ++optind) { /* no arg */
|
|
||||||
place = EMSG;
|
|
||||||
if (*ostr == ':')
|
|
||||||
return (BADARG);
|
|
||||||
if (opterr)
|
|
||||||
(void) fprintf(stdout, "[ERROR] %s: option requires an argument -- %c\n", __progname, optopt);
|
|
||||||
return (BADCH);
|
|
||||||
} else /* white space */
|
|
||||||
optarg = nargv[optind];
|
|
||||||
place = EMSG;
|
|
||||||
++optind;
|
|
||||||
}
|
|
||||||
return (optopt); /* dump back option letter */
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
/* last review : october 29th, 2002 */
|
|
||||||
|
|
||||||
#ifndef _GETOPT_H_
|
|
||||||
#define _GETOPT_H_
|
|
||||||
|
|
||||||
extern int opterr;
|
|
||||||
extern int optind;
|
|
||||||
extern int optopt;
|
|
||||||
extern int optreset;
|
|
||||||
extern char *optarg;
|
|
||||||
|
|
||||||
extern int getopt(int nargc, char *const *nargv, const char *ostr);
|
|
||||||
|
|
||||||
#endif /* _GETOPT_H_ */
|
|
|
@ -1,540 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "openjp3d.h"
|
|
||||||
#include "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 = getopt(argc, argv, "i:o:O:r:l:B:m:h");
|
|
||||||
if (c == -1)
|
|
||||||
break;
|
|
||||||
switch (c) {
|
|
||||||
case 'i': /* input file */
|
|
||||||
{
|
|
||||||
char *infile = 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 = 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 = 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 = 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(optarg, "%d, %d, %d", ¶meters->cp_reduce[0], ¶meters->cp_reduce[1], ¶meters->cp_reduce[2]);
|
|
||||||
int aux;
|
|
||||||
aux = sscanf(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(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, 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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,906 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "openjp3d.h"
|
|
||||||
#include "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 = 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 = 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 = 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 = 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 = 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 = 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 = 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(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(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 = 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(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 = optarg;
|
|
||||||
strncpy(parameters->index, index, MAX_PATH);
|
|
||||||
parameters->index_on = 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* ----------------------------------------------------- */
|
|
||||||
|
|
||||||
case 'p': /* progression order */
|
|
||||||
{
|
|
||||||
char progression[4];
|
|
||||||
|
|
||||||
strncpy(progression, 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(optarg, "%d,%d,%d", ¶meters->subsampling_dx, ¶meters->subsampling_dy, ¶meters->subsampling_dz) != 2) {
|
|
||||||
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(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 = 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(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(optarg, "%d", ¶meters->dcoffset) != 1) {
|
|
||||||
fprintf(stdout, "[ERROR] DC offset error !! [-D %d]\n",parameters->dcoffset);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* ------------------------------------------------------ */
|
|
||||||
|
|
||||||
case 'R': /* ROI */
|
|
||||||
{
|
|
||||||
if (sscanf(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(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': // Tranformation of original data (2D-DWT/3D-DWT/3D-RLS/2D-DWT+1D-RLS)
|
|
||||||
{
|
|
||||||
char transform[4];
|
|
||||||
|
|
||||||
strncpy(transform, 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, 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, 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 optionnal
|
|
||||||
*/
|
|
||||||
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;
|
|
||||||
}
|
|
|
@ -1,678 +0,0 @@
|
||||||
/*
|
|
||||||
* uce-dirent.h - operating system independent dirent implementation
|
|
||||||
*
|
|
||||||
* Copyright (C) 1998-2002 Toni Ronkko
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
* a copy of this software and associated documentation files (the
|
|
||||||
* ``Software''), to deal in the Software without restriction, including
|
|
||||||
* without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
* permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
* the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included
|
|
||||||
* in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
* IN NO EVENT SHALL TONI RONKKO BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
||||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
||||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
* OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* May 28 1998, Toni Ronkko <tronkko@messi.uku.fi>
|
|
||||||
*
|
|
||||||
* $Id: uce-dirent.h,v 1.7 2002/05/13 10:48:35 tr Exp $
|
|
||||||
*
|
|
||||||
* $Log: uce-dirent.h,v $
|
|
||||||
* Revision 1.7 2002/05/13 10:48:35 tr
|
|
||||||
* embedded some source code directly to the header so that no source
|
|
||||||
* modules need to be included in the MS Visual C project using the
|
|
||||||
* interface, removed all the dependencies to other headers of the `uce'
|
|
||||||
* library so that the header can be made public
|
|
||||||
*
|
|
||||||
* Revision 1.6 2002/04/12 16:22:04 tr
|
|
||||||
* Unified Compiling Environment (UCE) replaced `std' library
|
|
||||||
*
|
|
||||||
* Revision 1.5 2001/07/20 16:33:40 tr
|
|
||||||
* moved to `std' library and re-named defines accordingly
|
|
||||||
*
|
|
||||||
* Revision 1.4 2001/07/10 16:47:18 tronkko
|
|
||||||
* revised comments
|
|
||||||
*
|
|
||||||
* Revision 1.3 2001/01/11 13:16:43 tr
|
|
||||||
* using ``uce-machine.h'' for finding out defines such as `FREEBSD'
|
|
||||||
*
|
|
||||||
* Revision 1.2 2000/10/08 16:00:41 tr
|
|
||||||
* copy of FreeBSD man page
|
|
||||||
*
|
|
||||||
* Revision 1.1 2000/07/10 05:53:16 tr
|
|
||||||
* Initial revision
|
|
||||||
*
|
|
||||||
* Revision 1.2 1998/07/19 18:29:14 tr
|
|
||||||
* Added error reporting capabilities and some asserts.
|
|
||||||
*
|
|
||||||
* Revision 1.1 1998/07/04 16:27:51 tr
|
|
||||||
* Initial revision
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* MSVC 1.0 scans automatic dependencies incorrectly when your project
|
|
||||||
* contains this very header. The problem is that MSVC cannot handle
|
|
||||||
* include directives inside #if..#endif block those are never entered.
|
|
||||||
* Since this header ought to compile in many different operating systems,
|
|
||||||
* there had to be several conditional blocks that are compiled only in
|
|
||||||
* operating systems for what they were designed for. MSVC 1.0 cannot
|
|
||||||
* handle inclusion of sys/dir.h in a part that is compiled only in Apollo
|
|
||||||
* operating system. To fix the problem you need to insert DIR.H into
|
|
||||||
* SYSINCL.DAT located in MSVC\BIN directory and restart visual C++.
|
|
||||||
* Consult manuals for more informaton about the problem.
|
|
||||||
*
|
|
||||||
* Since many UNIX systems have dirent.h we assume to have one also.
|
|
||||||
* However, if your UNIX system does not have dirent.h you can download one
|
|
||||||
* for example at: http://ftp.uni-mannheim.de/ftp/GNU/dirent/dirent.tar.gz.
|
|
||||||
* You can also see if you have one of dirent.h, direct.h, dir.h, ndir.h,
|
|
||||||
* sys/dir.h and sys/ndir.h somewhere. Try defining HAVE_DIRENT_H,
|
|
||||||
* HAVE_DIRECT_H, HAVE_DIR_H, HAVE_NDIR_H, HAVE_SYS_DIR_H and
|
|
||||||
* HAVE_SYS_NDIR_H according to the files found.
|
|
||||||
*/
|
|
||||||
#ifndef DIRENT_H
|
|
||||||
#define DIRENT_H
|
|
||||||
#define DIRENT_H_INCLUDED
|
|
||||||
|
|
||||||
/* find out platform */
|
|
||||||
#if defined(MSDOS) /* MS-DOS */
|
|
||||||
#elif defined(__MSDOS__) /* Turbo C/Borland */
|
|
||||||
# define MSDOS
|
|
||||||
#elif defined(__DOS__) /* Watcom */
|
|
||||||
# define MSDOS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(WIN32) /* MS-Windows */
|
|
||||||
#elif defined(__NT__) /* Watcom */
|
|
||||||
# define WIN32
|
|
||||||
#elif defined(_WIN32) /* Microsoft */
|
|
||||||
# define WIN32
|
|
||||||
#elif defined(__WIN32__) /* Borland */
|
|
||||||
# define WIN32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* See what kind of dirent interface we have unless autoconf has already
|
|
||||||
* determinated that.
|
|
||||||
*/
|
|
||||||
#if !defined(HAVE_DIRENT_H) && !defined(HAVE_DIRECT_H) && !defined(HAVE_SYS_DIR_H) && !defined(HAVE_NDIR_H) && !defined(HAVE_SYS_NDIR_H) && !defined(HAVE_DIR_H)
|
|
||||||
# if defined(_MSC_VER) /* Microsoft C/C++ */
|
|
||||||
/* no dirent.h */
|
|
||||||
# elif defined(__MINGW32__) /* MinGW */
|
|
||||||
/* no dirent.h */
|
|
||||||
# elif defined(__BORLANDC__) /* Borland C/C++ */
|
|
||||||
# define HAVE_DIRENT_H
|
|
||||||
# define VOID_CLOSEDIR
|
|
||||||
# elif defined(__TURBOC__) /* Borland Turbo C */
|
|
||||||
/* no dirent.h */
|
|
||||||
# elif defined(__WATCOMC__) /* Watcom C/C++ */
|
|
||||||
# define HAVE_DIRECT_H
|
|
||||||
# elif defined(__apollo) /* Apollo */
|
|
||||||
# define HAVE_SYS_DIR_H
|
|
||||||
# elif defined(__hpux) /* HP-UX */
|
|
||||||
# define HAVE_DIRENT_H
|
|
||||||
# elif defined(__alpha) || defined(__alpha__) /* Alpha OSF1 */
|
|
||||||
# error "not implemented"
|
|
||||||
# elif defined(__sgi) /* Silicon Graphics */
|
|
||||||
# define HAVE_DIRENT_H
|
|
||||||
# elif defined(sun) || defined(_sun) /* Sun Solaris */
|
|
||||||
# define HAVE_DIRENT_H
|
|
||||||
# elif defined(__FreeBSD__) /* FreeBSD */
|
|
||||||
# define HAVE_DIRENT_H
|
|
||||||
# elif defined(__linux__) /* Linux */
|
|
||||||
# define HAVE_DIRENT_H
|
|
||||||
# elif defined(__GNUC__) /* GNU C/C++ */
|
|
||||||
# define HAVE_DIRENT_H
|
|
||||||
# else
|
|
||||||
# error "not implemented"
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* include proper interface headers */
|
|
||||||
#if defined(HAVE_DIRENT_H)
|
|
||||||
# include <dirent.h>
|
|
||||||
# ifdef FREEBSD
|
|
||||||
# define NAMLEN(dp) ((int)((dp)->d_namlen))
|
|
||||||
# else
|
|
||||||
# define NAMLEN(dp) ((int)(strlen((dp)->d_name)))
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#elif defined(HAVE_NDIR_H)
|
|
||||||
# include <ndir.h>
|
|
||||||
# define NAMLEN(dp) ((int)((dp)->d_namlen))
|
|
||||||
|
|
||||||
#elif defined(HAVE_SYS_NDIR_H)
|
|
||||||
# include <sys/ndir.h>
|
|
||||||
# define NAMLEN(dp) ((int)((dp)->d_namlen))
|
|
||||||
|
|
||||||
#elif defined(HAVE_DIRECT_H)
|
|
||||||
# include <direct.h>
|
|
||||||
# define NAMLEN(dp) ((int)((dp)->d_namlen))
|
|
||||||
|
|
||||||
#elif defined(HAVE_DIR_H)
|
|
||||||
# include <dir.h>
|
|
||||||
# define NAMLEN(dp) ((int)((dp)->d_namlen))
|
|
||||||
|
|
||||||
#elif defined(HAVE_SYS_DIR_H)
|
|
||||||
# include <sys/types.h>
|
|
||||||
# include <sys/dir.h>
|
|
||||||
# ifndef dirent
|
|
||||||
# define dirent direct
|
|
||||||
# endif
|
|
||||||
# define NAMLEN(dp) ((int)((dp)->d_namlen))
|
|
||||||
|
|
||||||
#elif defined(MSDOS) || defined(WIN32)
|
|
||||||
|
|
||||||
/* figure out type of underlaying directory interface to be used */
|
|
||||||
# if defined(WIN32)
|
|
||||||
# define DIRENT_WIN32_INTERFACE
|
|
||||||
# elif defined(MSDOS)
|
|
||||||
# define DIRENT_MSDOS_INTERFACE
|
|
||||||
# else
|
|
||||||
# error "missing native dirent interface"
|
|
||||||
# endif
|
|
||||||
|
|
||||||
/*** WIN32 specifics ***/
|
|
||||||
# if defined(DIRENT_WIN32_INTERFACE)
|
|
||||||
# include <windows.h>
|
|
||||||
# if !defined(DIRENT_MAXNAMLEN)
|
|
||||||
# define DIRENT_MAXNAMLEN (MAX_PATH)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
|
|
||||||
/*** MS-DOS specifics ***/
|
|
||||||
# elif defined(DIRENT_MSDOS_INTERFACE)
|
|
||||||
# include <dos.h>
|
|
||||||
|
|
||||||
/* Borland defines file length macros in dir.h */
|
|
||||||
# if defined(__BORLANDC__)
|
|
||||||
# include <dir.h>
|
|
||||||
# if !defined(DIRENT_MAXNAMLEN)
|
|
||||||
# define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT))
|
|
||||||
# endif
|
|
||||||
# if !defined(_find_t)
|
|
||||||
# define _find_t find_t
|
|
||||||
# endif
|
|
||||||
|
|
||||||
/* Turbo C defines ffblk structure in dir.h */
|
|
||||||
# elif defined(__TURBOC__)
|
|
||||||
# include <dir.h>
|
|
||||||
# if !defined(DIRENT_MAXNAMLEN)
|
|
||||||
# define DIRENT_MAXNAMLEN ((MAXFILE)+(MAXEXT))
|
|
||||||
# endif
|
|
||||||
# define DIRENT_USE_FFBLK
|
|
||||||
|
|
||||||
/* MSVC */
|
|
||||||
# elif defined(_MSC_VER)
|
|
||||||
# if !defined(DIRENT_MAXNAMLEN)
|
|
||||||
# define DIRENT_MAXNAMLEN (12)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
/* Watcom */
|
|
||||||
# elif defined(__WATCOMC__)
|
|
||||||
# if !defined(DIRENT_MAXNAMLEN)
|
|
||||||
# if defined(__OS2__) || defined(__NT__)
|
|
||||||
# define DIRENT_MAXNAMLEN (255)
|
|
||||||
# else
|
|
||||||
# define DIRENT_MAXNAMLEN (12)
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
|
|
||||||
/*** generic MS-DOS and MS-Windows stuff ***/
|
|
||||||
# if !defined(NAME_MAX) && defined(DIRENT_MAXNAMLEN)
|
|
||||||
# define NAME_MAX DIRENT_MAXNAMLEN
|
|
||||||
# endif
|
|
||||||
# if NAME_MAX < DIRENT_MAXNAMLEN
|
|
||||||
# error "assertion failed: NAME_MAX >= DIRENT_MAXNAMLEN"
|
|
||||||
# endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Substitute for real dirent structure. Note that `d_name' field is a
|
|
||||||
* true character array although we have it copied in the implementation
|
|
||||||
* dependent data. We could save some memory if we had declared `d_name'
|
|
||||||
* as a pointer refering 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 althought
|
|
||||||
* 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 occured */
|
|
||||||
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*/
|
|
|
@ -1,37 +0,0 @@
|
||||||
|
|
||||||
INCLUDE_REGULAR_EXPRESSION("^.*$")
|
|
||||||
|
|
||||||
# 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(BUILD_SHARED_LIBS)
|
|
||||||
ADD_DEFINITIONS(-DOPJ_STATIC)
|
|
||||||
ENDIF(BUILD_SHARED_LIBS)
|
|
||||||
ENDIF(WIN32)
|
|
||||||
ADD_LIBRARY(${OPENJP3D_LIBRARY_NAME} ${OPENJP3D_SRCS})
|
|
||||||
IF(UNIX)
|
|
||||||
TARGET_LINK_LIBRARIES(${OPENJP3D_LIBRARY_NAME} m)
|
|
||||||
ENDIF(UNIX)
|
|
||||||
SET_TARGET_PROPERTIES(${OPENJP3D_LIBRARY_NAME} PROPERTIES ${OPENJP3D_LIBRARY_PROPERTIES})
|
|
||||||
|
|
||||||
# Install library
|
|
||||||
INSTALL(TARGETS ${OPENJP3D_LIBRARY_NAME}
|
|
||||||
EXPORT OpenJP3DTargets
|
|
||||||
DESTINATION ${OPENJP3D_INSTALL_LIB_DIR}
|
|
||||||
COMPONENT Libraries
|
|
||||||
)
|
|
||||||
|
|
||||||
# Install includes files
|
|
||||||
INSTALL(FILES openjp3d.h
|
|
||||||
DESTINATION ${OPENJP3D_INSTALL_INCLUDE_DIR}/${subdir}
|
|
||||||
COMPONENT Headers
|
|
||||||
)
|
|
||||||
INSTALL(CODE
|
|
||||||
"EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E create_symlink ${subdir}/openjp3d.h \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${OPENJP3D_INSTALL_INCLUDE_DIR}/openjp3d.h)")
|
|
||||||
|
|
|
@ -1,88 +0,0 @@
|
||||||
MAINTAINERCLEANFILES = Makefile.in
|
|
||||||
|
|
||||||
lib_LTLIBRARIES = libopenjp3dvm.la
|
|
||||||
|
|
||||||
includesdir = ${includedir}/openjp3d-@JP3D_MAJOR_NR@.@JP3D_MINOR_NR@
|
|
||||||
includes_HEADERS = openjp3d.h
|
|
||||||
|
|
||||||
libopenjp3dvm_la_LDFLAGS = -no-undefined -version-info @lt_version_jp3d@
|
|
||||||
|
|
||||||
libopenjp3dvm_la_CPPFLAGS = \
|
|
||||||
-I. \
|
|
||||||
-I$(top_srcdir)/jp3d/libjp3dvm \
|
|
||||||
-I$(top_builddir)/jp3d/libjp3dvm
|
|
||||||
libopenjp3dvm_la_CFLAGS =
|
|
||||||
libopenjp3dvm_la_LIBADD = -lm
|
|
||||||
libopenjp3dvm_la_SOURCES = \
|
|
||||||
bio.c \
|
|
||||||
cio.c \
|
|
||||||
dwt.c \
|
|
||||||
event.c \
|
|
||||||
jp3d.c \
|
|
||||||
jp3d_lib.c \
|
|
||||||
volume.c \
|
|
||||||
mct.c \
|
|
||||||
mqc.c \
|
|
||||||
openjp3d.c \
|
|
||||||
pi.c \
|
|
||||||
raw.c \
|
|
||||||
t1.c \
|
|
||||||
t1_3d.c \
|
|
||||||
t2.c \
|
|
||||||
tcd.c \
|
|
||||||
tgt.c \
|
|
||||||
bio.h \
|
|
||||||
cio.h \
|
|
||||||
dwt.h \
|
|
||||||
event.h \
|
|
||||||
fix.h \
|
|
||||||
int.h \
|
|
||||||
jp3d.h \
|
|
||||||
jp3d_lib.h \
|
|
||||||
mct.h \
|
|
||||||
mqc.h \
|
|
||||||
opj_includes.h \
|
|
||||||
pi.h \
|
|
||||||
raw.h \
|
|
||||||
t1.h \
|
|
||||||
t1_3d.h \
|
|
||||||
t2.h \
|
|
||||||
tcd.h \
|
|
||||||
tgt.h \
|
|
||||||
volume.h
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
CMakeLists.txt
|
|
||||||
|
|
||||||
install-data-hook:
|
|
||||||
cd $(DESTDIR)$(includedir) && \
|
|
||||||
rm -f openjp3d.h && \
|
|
||||||
$(LN_S) openjp3d-@JP3D_MAJOR_NR@.@JP3D_MINOR_NR@/openjp3d.h \
|
|
||||||
openjp3d.h
|
|
||||||
@echo -e " (LA)\t$(libdir)/libopenjp3dvm.la" >> $(top_builddir)/report.txt
|
|
||||||
@( $(call solist) ) >> $(top_builddir)/report.txt
|
|
||||||
@echo -e " (A)\t$(base)/$(a)" >> $(top_builddir)/report.txt
|
|
||||||
@echo -e " (H)\t$(includedir)/openjp3d-$(MAJOR_NR).$(MINOR_NR)/openjp3d.h" >> $(top_builddir)/report.txt
|
|
||||||
@echo -e " (LN)\t$(includedir)/openjp3d.h" >> $(top_builddir)/report.txt
|
|
||||||
|
|
||||||
uninstall-hook:
|
|
||||||
rm -f $(DESTDIR)$(includedir)/openjp3d.h
|
|
||||||
|
|
||||||
solist = $(foreach f, $(dll) $(so), echo -e ' $(SO_PREFIX)\t$(base)/$(f)' ;)
|
|
||||||
get_tok = $(shell grep -E "^$(1)=" $(lib_LTLIBRARIES) | cut -d "'" -f 2)
|
|
||||||
base = $(call get_tok,libdir)
|
|
||||||
so = $(call get_tok,library_names)
|
|
||||||
a = $(call get_tok,old_library)
|
|
||||||
|
|
||||||
if HAVE_WIN32
|
|
||||||
SO_PREFIX = (DLL)
|
|
||||||
dll = $(call get_tok,dlname)
|
|
||||||
else
|
|
||||||
if HAVE_DARWIN
|
|
||||||
SO_PREFIX = (DY)
|
|
||||||
dll =
|
|
||||||
else
|
|
||||||
SO_PREFIX = (SO)
|
|
||||||
dll =
|
|
||||||
endif
|
|
||||||
endif
|
|
|
@ -1,189 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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;
|
|
||||||
}
|
|
|
@ -1,132 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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();
|
|
||||||
/**
|
|
||||||
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 */
|
|
||||||
|
|
|
@ -1,217 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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_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.
|
|
||||||
*/
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,100 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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 occured
|
|
||||||
*/
|
|
||||||
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 occured
|
|
||||||
*/
|
|
||||||
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 */
|
|
||||||
|
|
1016
libopenjp3d/dwt.c
1016
libopenjp3d/dwt.c
File diff suppressed because it is too large
Load Diff
|
@ -1,100 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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 tranform 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 tranform 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 */
|
|
|
@ -1,181 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,58 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 optionnal 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 */
|
|
|
@ -1,62 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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 */
|
|
|
@ -1,122 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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
|
|
2328
libopenjp3d/jp3d.c
2328
libopenjp3d/jp3d.c
File diff suppressed because it is too large
Load Diff
|
@ -1,518 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#ifndef __J3D_H
|
|
||||||
#define __J3D_H
|
|
||||||
/**
|
|
||||||
@file j3d.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 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_ZSI 0xff54 /**< ZSI 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 heigth & 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, heigth 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, heigth 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 curently 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 */
|
|
|
@ -1,76 +0,0 @@
|
||||||
/*
|
|
||||||
* 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,75 +0,0 @@
|
||||||
/*
|
|
||||||
* 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();
|
|
||||||
|
|
||||||
/**
|
|
||||||
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 */
|
|
||||||
|
|
|
@ -1,131 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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> */
|
|
||||||
/* Foward 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> */
|
|
||||||
/* Foward 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];
|
|
||||||
}
|
|
|
@ -1,97 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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 */
|
|
|
@ -1,548 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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)];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,201 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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();
|
|
||||||
/**
|
|
||||||
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 */
|
|
|
@ -1,207 +0,0 @@
|
||||||
/*
|
|
||||||
* 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"
|
|
||||||
#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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,713 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#ifndef OPENJPEG_H
|
|
||||||
#define OPENJPEG_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
==========================================================
|
|
||||||
Compiler directives
|
|
||||||
==========================================================
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(OPJ_STATIC) || !defined(_WIN32)
|
|
||||||
#define OPJ_API
|
|
||||||
#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, wheras 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();
|
|
||||||
|
|
||||||
/*
|
|
||||||
==========================================================
|
|
||||||
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 */
|
|
|
@ -1,81 +0,0 @@
|
||||||
/*
|
|
||||||
* 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"
|
|
||||||
|
|
||||||
//#include "pred.h"
|
|
||||||
//#include "golomb.h"
|
|
||||||
|
|
||||||
#endif /* OPJ_INCLUDES_H */
|
|
630
libopenjp3d/pi.c
630
libopenjp3d/pi.c
|
@ -1,630 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* Copyright (c) 2006, Mónica Díez, 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;
|
|
||||||
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;
|
|
||||||
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;
|
|
||||||
for (resno = 0; resno < comp->numresolution[0]; resno++) {
|
|
||||||
int dx, dy;
|
|
||||||
res = &comp->resolutions[resno];
|
|
||||||
dx = comp->dx * (1 << (res->pdx + comp->numresolution[0] - 1 - resno));
|
|
||||||
dy = comp->dy * (1 << (res->pdy + comp->numresolution[0] - 1 - resno));
|
|
||||||
pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
|
|
||||||
pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
|
|
||||||
}
|
|
||||||
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;
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
145
libopenjp3d/pi.h
145
libopenjp3d/pi.h
|
@ -1,145 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __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 (usefull 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 */
|
|
|
@ -1,86 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,99 +0,0 @@
|
||||||
/*
|
|
||||||
* 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();
|
|
||||||
/**
|
|
||||||
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 */
|
|
1181
libopenjp3d/t1.c
1181
libopenjp3d/t1.c
File diff suppressed because it is too large
Load Diff
173
libopenjp3d/t1.h
173
libopenjp3d/t1.h
|
@ -1,173 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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 (heigth) */
|
|
||||||
#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 (heigth) */
|
|
||||||
#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 */
|
|
1230
libopenjp3d/t1_3d.c
1230
libopenjp3d/t1_3d.c
File diff suppressed because it is too large
Load Diff
|
@ -1,173 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 */
|
|
675
libopenjp3d/t2.c
675
libopenjp3d/t2.c
|
@ -1,675 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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)) {
|
|
||||||
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");
|
|
||||||
} 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
101
libopenjp3d/t2.h
101
libopenjp3d/t2.h
|
@ -1,101 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#ifndef __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 */
|
|
1738
libopenjp3d/tcd.c
1738
libopenjp3d/tcd.c
File diff suppressed because it is too large
Load Diff
|
@ -1,334 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* Copyright (c) 2006, Mónica Díez García, Image Processing Laboratory, University of Valladolid, Spain
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
|
|
||||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
#ifndef __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 posible 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 informations */
|
|
||||||
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 heigth 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 heigth 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 */
|
|
|
@ -1,256 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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_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;
|
|
||||||
|
|
||||||
p = tree->numleafsh * tree->numleafsv * tree->numleafsz;
|
|
||||||
p0 = p;
|
|
||||||
n = 0;
|
|
||||||
//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 (j = 0; j < nplv[i]; ++j) {
|
|
||||||
k = nplh[i]*nplz[i];
|
|
||||||
while (--k >= 0) {
|
|
||||||
node->parent = parentnode; //fprintf(stdout,"node[%d].parent = node[%d]\n",n,p);
|
|
||||||
++node; ++n;
|
|
||||||
if (--k >= 0 && n < p) {
|
|
||||||
node->parent = parentnode; //fprintf(stdout,"node[%d].parent = node[%d]\n",n,p);
|
|
||||||
++node; ++n;
|
|
||||||
}
|
|
||||||
if (nplz[i] != 1){ //2D operation vs 3D operation
|
|
||||||
if (--k >= 0 && n < p) {
|
|
||||||
node->parent = parentnode; //fprintf(stdout,"node[%d].parent = node[%d]\n",n,p);
|
|
||||||
++node; ++n;
|
|
||||||
}
|
|
||||||
if (--k >= 0 && n < p) {
|
|
||||||
node->parent = parentnode; //fprintf(stdout,"node[%d].parent = node[%d]\n",n,p);
|
|
||||||
++node; ++n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++parentnode; ++p;
|
|
||||||
}
|
|
||||||
if ((j & 1) || j == nplv[i] - 1) {
|
|
||||||
parentnode0 = parentnode; p0 = p; //fprintf(stdout,"parent = node[%d] \n",p);
|
|
||||||
} else {
|
|
||||||
parentnode = parentnode0; p = p0; //fprintf(stdout,"parent = node[%d] \n",p);
|
|
||||||
parentnode0 += nplh[i]*nplz[i]; p0 += nplh[i]*nplz[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;
|
|
||||||
}
|
|
|
@ -1,124 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2001-2003, David Janssens
|
|
||||||
* Copyright (c) 2002-2003, Yannick Verschueren
|
|
||||||
* Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe
|
|
||||||
* Copyright (c) 2005, Herve Drolon, FreeImage Team
|
|
||||||
* Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
|
|
||||||
* 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 */
|
|
|
@ -1,89 +0,0 @@
|
||||||
/*
|
|
||||||
* 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_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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
/*
|
|
||||||
* 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 */
|
|
||||||
|
|
|
@ -1,114 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# The next line is executed by /bin/sh, but not tcl \
|
|
||||||
exec wish "$0" ${1+"$@"}
|
|
||||||
|
|
||||||
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 .]
|
|
13
tcltk/README
13
tcltk/README
|
@ -1,13 +0,0 @@
|
||||||
HOWTO USE THE TCL/TK APP IN 'jp3d/tcltk'
|
|
||||||
----------------------------------------
|
|
||||||
1. Download the 'BWidget-1.9.2'
|
|
||||||
http://www.sourceforge.net/projects/tcllib/
|
|
||||||
|
|
||||||
2. Install it e.g. in '/usr/local/BWidget-1.9.2/'
|
|
||||||
3. Add the lappend command in line 4
|
|
||||||
to jp3d/tcltk/LPI_JP3D_VM.tcl:
|
|
||||||
|
|
||||||
#!/bin/sh
|
|
||||||
# The next line is executed by /bin/sh, but not tcl \
|
|
||||||
exec wish "$0" ${1+"$@"}
|
|
||||||
lappend auto_path /usr/local/BWidget-1.9.2
|
|
BIN
tcltk/Thumbs.db
BIN
tcltk/Thumbs.db
Binary file not shown.
|
@ -1,272 +0,0 @@
|
||||||
|
|
||||||
namespace eval VMDecoder {
|
|
||||||
variable var
|
|
||||||
variable JP3Ddecoder "../bin/jp3d_to_volume.exe"
|
|
||||||
#variable JP3Ddecoder "jp3d_to_volume.exe"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
proc VMDecoder::create { nb } {
|
|
||||||
variable var
|
|
||||||
|
|
||||||
set frameD [$nb insert end VMDecoder -text "Decoder"]
|
|
||||||
set topfD [frame $frameD.topfD]
|
|
||||||
set medfD [frame $frameD.medfD]
|
|
||||||
set bottomfD [frame $frameD.bottomfD]
|
|
||||||
set srcfD [TitleFrame $topfD.srcfD -text "Source"]
|
|
||||||
set dstfD [TitleFrame $topfD.dstfD -text "Destination"]
|
|
||||||
set paramfD [TitleFrame $medfD.paramfD -text "Decoding parameters"]
|
|
||||||
set infofD [TitleFrame $medfD.infofD -text "Distortion measures"]
|
|
||||||
|
|
||||||
set frame1 [$srcfD getframe]
|
|
||||||
_sourceD $frame1
|
|
||||||
set frame2 [$dstfD getframe]
|
|
||||||
_destinationD $frame2
|
|
||||||
set frame3 [$infofD getframe]
|
|
||||||
_originalD $frame3
|
|
||||||
set frame4 [$paramfD getframe]
|
|
||||||
_paramsD $frame4
|
|
||||||
|
|
||||||
set butD [Button $bottomfD.butD -text "Decode!" \
|
|
||||||
-command "VMDecoder::_decode $frame1 $frame2 $frame3" \
|
|
||||||
-helptext "Decoding trigger button"]
|
|
||||||
set butR [Button $bottomfD.butR -text "Save info" \
|
|
||||||
-command "VMDecoder::_save $frame3" \
|
|
||||||
-helptext "Save information"]
|
|
||||||
|
|
||||||
pack $srcfD $dstfD -side left -fill both -padx 10 -ipadx 5 -expand yes
|
|
||||||
pack $topfD -pady 4 -fill x
|
|
||||||
|
|
||||||
pack $paramfD $infofD -side left -fill both -padx 10 -pady 2 -ipadx 5 -expand yes
|
|
||||||
pack $medfD -pady 4 -fill x
|
|
||||||
|
|
||||||
pack $butD $butR -side left -padx 4 -pady 5 -expand yes
|
|
||||||
pack $bottomfD -pady 4 -fill x
|
|
||||||
|
|
||||||
return $frameD
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
proc fileDialogD {w ent operation} {
|
|
||||||
|
|
||||||
variable file
|
|
||||||
|
|
||||||
if {$operation == "open"} {
|
|
||||||
#-----Type names---------Extension(s)---
|
|
||||||
set types {
|
|
||||||
{"JP3D Files" {.jp3d} }
|
|
||||||
{"All files" *}
|
|
||||||
}
|
|
||||||
set file [tk_getOpenFile -filetypes $types -parent $w ]
|
|
||||||
} elseif {$operation == "original"} {
|
|
||||||
#-----Type names---------Extension(s)---
|
|
||||||
set types {
|
|
||||||
{"BIN Raw Image Files" {.bin} }
|
|
||||||
{"PGX Raw Image Files" {.pgx} }
|
|
||||||
{"All files" *}
|
|
||||||
}
|
|
||||||
set file [tk_getOpenFile -filetypes $types -parent $w ]
|
|
||||||
} else {
|
|
||||||
#-----Type names---------Extension(s)---
|
|
||||||
set types {
|
|
||||||
{"BIN Raw Image Files" {.bin} }
|
|
||||||
{"PGX Raw Image Files" {.pgx} }
|
|
||||||
{"All files" *}
|
|
||||||
}
|
|
||||||
set file [tk_getSaveFile -filetypes $types -parent $w -initialfile Untitled -defaultextension "*.bin"]
|
|
||||||
}
|
|
||||||
if {[string compare $file ""]} {
|
|
||||||
$ent delete 0 end
|
|
||||||
$ent insert end $file
|
|
||||||
$ent xview moveto 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
proc VMDecoder::_sourceD { parent } {
|
|
||||||
|
|
||||||
variable var
|
|
||||||
|
|
||||||
set labsrcD [LabelFrame $parent.labsrcD -text "Select compressed file: " -side top \
|
|
||||||
-anchor w -relief flat -borderwidth 0]
|
|
||||||
set subsrcD [$labsrcD getframe]
|
|
||||||
set listD [entry $subsrcD.entrysrcD -width 40 -textvariable VMDecoder::var(sourceD)]
|
|
||||||
|
|
||||||
set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0]
|
|
||||||
set subbrw [$labbrw getframe]
|
|
||||||
set butbrw [button $subbrw.butbrw -image [Bitmap::get open] \
|
|
||||||
-relief raised -borderwidth 1 -padx 1 -pady 1 \
|
|
||||||
-command "fileDialogD . $subsrcD.entrysrcD open"]
|
|
||||||
|
|
||||||
pack $listD -side top
|
|
||||||
pack $butbrw -side top
|
|
||||||
pack $labsrcD $labbrw -side left -fill both -expand yes
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
proc VMDecoder::_destinationD { parent } {
|
|
||||||
|
|
||||||
variable var
|
|
||||||
|
|
||||||
set labdstD [LabelFrame $parent.labdstD -text "Save decompressed volume file(s) as: " -side top \
|
|
||||||
-anchor w -relief flat -borderwidth 0]
|
|
||||||
set subdstD [$labdstD getframe]
|
|
||||||
set listD [entry $subdstD.entrydstD -width 40 -textvariable VMDecoder::var(destinationD)]
|
|
||||||
|
|
||||||
set labbrw [LabelFrame $parent.labbrw -side top -anchor w -relief flat -borderwidth 0]
|
|
||||||
set subbrw [$labbrw getframe]
|
|
||||||
set butbrw [button $subbrw.butbrw -image [Bitmap::get save] \
|
|
||||||
-relief raised -borderwidth 1 -padx 1 -pady 1 \
|
|
||||||
-command "fileDialogD . $subdstD.entrydstD save"]
|
|
||||||
|
|
||||||
pack $listD -side top
|
|
||||||
pack $butbrw -side top
|
|
||||||
pack $labdstD $labbrw -side left -fill both -expand yes
|
|
||||||
}
|
|
||||||
|
|
||||||
proc VMDecoder::_originalD { parent } {
|
|
||||||
|
|
||||||
variable var
|
|
||||||
|
|
||||||
set laborgD [LabelFrame $parent.laborgD -text "Select original file: " -side top \
|
|
||||||
-anchor w -relief flat -borderwidth 0]
|
|
||||||
set suborgD [$laborgD getframe]
|
|
||||||
set listorgD [entry $suborgD.entryorgD -width 30 -textvariable VMDecoder::var(originalD)]
|
|
||||||
|
|
||||||
set labbrw2 [LabelFrame $parent.labbrw2 -side top -anchor w -relief flat -borderwidth 0]
|
|
||||||
set subbrw2 [$labbrw2 getframe]
|
|
||||||
set butbrw2 [button $subbrw2.butbrw2 -image [Bitmap::get open] \
|
|
||||||
-relief raised -borderwidth 1 -padx 1 -pady 1 \
|
|
||||||
-command "fileDialogD . $suborgD.entryorgD original"]
|
|
||||||
|
|
||||||
set infoD [Label $parent.infoD -relief sunken -textvariable VMDecoder::var(decodinfo) -justify left]
|
|
||||||
|
|
||||||
pack $listorgD -side left -anchor n
|
|
||||||
pack $butbrw2 -side left -anchor n
|
|
||||||
pack $infoD -side bottom -anchor nw -pady 4 -ipadx 150 -ipady 20 -expand yes
|
|
||||||
pack $laborgD $labbrw2 -side left -fill both
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
proc VMDecoder::_paramsD { parent } {
|
|
||||||
|
|
||||||
variable var
|
|
||||||
|
|
||||||
########### DECODING #############
|
|
||||||
set labcod [LabelFrame $parent.labcod -side top -anchor w -relief sunken -borderwidth 1]
|
|
||||||
set subcod [$labcod getframe]
|
|
||||||
|
|
||||||
set frameres [frame $subcod.frameres -borderwidth 1]
|
|
||||||
set labres [LabelEntry $frameres.labres -label "Resolutions to discard: " -labelwidth 20 -labelanchor w \
|
|
||||||
-textvariable VMDecoder::var(resdiscard) -editable 1 \
|
|
||||||
-helptext "Number of highest resolution levels to be discarded on each dimension" ]
|
|
||||||
set VMDecoder::var(resdiscard) "0,0,0"
|
|
||||||
|
|
||||||
set framelayer [frame $subcod.framelayer -borderwidth 1]
|
|
||||||
set lablayer [LabelEntry $framelayer.lablayer -label "Layers to decode: " -labelwidth 20 -labelanchor w \
|
|
||||||
-textvariable VMDecoder::var(layer) -editable 1 \
|
|
||||||
-helptext "Maximum number of quality layers to decode" ]
|
|
||||||
set VMDecoder::var(layer) "All"
|
|
||||||
|
|
||||||
set framebe [frame $subcod.framebe -borderwidth 1]
|
|
||||||
set chkbe [checkbutton $framebe.chkbe -text "Write decoded file with BigEndian byte order" \
|
|
||||||
-variable VMDecoder::var(be) -onvalue 1 -offvalue 0 ]
|
|
||||||
|
|
||||||
pack $labres -side left -padx 2 -anchor n
|
|
||||||
pack $lablayer -side left -padx 2 -anchor n
|
|
||||||
pack $chkbe -side left -padx 2 -anchor w
|
|
||||||
pack $frameres $framelayer $framebe -side top -anchor w
|
|
||||||
|
|
||||||
pack $subcod -anchor n
|
|
||||||
pack $labcod -side left -fill both -padx 4 -expand yes
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
proc VMDecoder::_decode { framesrc framedst frameinfo} {
|
|
||||||
|
|
||||||
variable var
|
|
||||||
|
|
||||||
set sourceD [$framesrc.labsrcD.f.entrysrcD get ]
|
|
||||||
set destinationD [$framedst.labdstD.f.entrydstD get ]
|
|
||||||
set originD [$frameinfo.laborgD.f.entryorgD get ]
|
|
||||||
set cond1 [string match *.pgx [string tolower $destinationD]]
|
|
||||||
set cond2 [string match *\**.pgx [string tolower $destinationD]]
|
|
||||||
set cond3 [string match *.bin [string tolower $destinationD]]
|
|
||||||
|
|
||||||
#comprobamos datos son correctos
|
|
||||||
if {($cond1 == 1) && ($cond2 == 0)} {
|
|
||||||
set pgx "*.pgx"
|
|
||||||
set pattern [string range $destinationD 0 [expr [string length $destinationD]-5]]
|
|
||||||
set destinationD $pattern$img
|
|
||||||
} elseif {$sourceD == ""} {
|
|
||||||
MessageDlg .msgdlg -parent . -message "Error : Source file is not defined !" -type ok -icon error
|
|
||||||
} elseif {$destinationD == ""} {
|
|
||||||
MessageDlg .msgdlg -parent . -message "Error : Destination file is not defined !" -type ok -icon error
|
|
||||||
} else {
|
|
||||||
|
|
||||||
#creamos datain a partir de los parametros de entrada
|
|
||||||
#set dirJP3Ddecoder [mk_relativepath $VMDecoder::JP3Ddecoder]
|
|
||||||
set dirJP3Ddecoder $VMDecoder::JP3Ddecoder
|
|
||||||
set datain [concat " $dirJP3Ddecoder -i [mk_relativepath $sourceD] "]
|
|
||||||
set datain [concat " $datain -o [mk_relativepath $destinationD] "]
|
|
||||||
if {$originD != ""} {
|
|
||||||
set datain [concat " $datain -O [mk_relativepath $originD] "]
|
|
||||||
if {$cond3 == 1} {
|
|
||||||
set img ".img"
|
|
||||||
set pattern [string range $originD 0 [expr [string length $originD]-5]]
|
|
||||||
set pattern $pattern$img
|
|
||||||
if {[file exists $pattern]} {
|
|
||||||
set datain [concat " $datain -m [mk_relativepath $pattern] "]
|
|
||||||
} else {
|
|
||||||
MessageDlg .msgdlg -parent . -message "Error : IMG file associated to original BIN volume file not found in same directory !" -type ok -icon info
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if {$VMDecoder::var(resdiscard) != "0,0,0"} {
|
|
||||||
set datain [concat " $datain -r $VMDecoder::var(resdiscard) "]
|
|
||||||
}
|
|
||||||
if {$VMDecoder::var(layer) != "All" && $VMDecoder::var(layer) > 0} {
|
|
||||||
set datain [concat " $datain -l $VMDecoder::var(layer) "]
|
|
||||||
}
|
|
||||||
if {$VMDecoder::var(be) == 1} {
|
|
||||||
set datain [concat " $datain -BE"]
|
|
||||||
}
|
|
||||||
|
|
||||||
set VMDecoder::var(progval) 10
|
|
||||||
ProgressDlg .progress -parent . -title "Wait..." \
|
|
||||||
-type infinite \
|
|
||||||
-width 20 \
|
|
||||||
-textvariable "Compute in progress..."\
|
|
||||||
-variable VMDecoder::progval \
|
|
||||||
-stop "Stop" \
|
|
||||||
-command {destroy .progress}
|
|
||||||
|
|
||||||
after 200 set VMDecoder::var(progval) 2
|
|
||||||
|
|
||||||
set fp [open "| $datain " r+]
|
|
||||||
fconfigure $fp -buffering line
|
|
||||||
set jp3dVM::dataout [concat "EXECUTED PROGRAM:\n\t$datain"]
|
|
||||||
while {-1 != [gets $fp tmp]} {
|
|
||||||
set jp3dVM::dataout [concat "$jp3dVM::dataout\n$tmp"]
|
|
||||||
}
|
|
||||||
close $fp
|
|
||||||
destroy .progress
|
|
||||||
set cond [string first "ERROR" $jp3dVM::dataout]
|
|
||||||
set cond2 [string first "PSNR" $jp3dVM::dataout]
|
|
||||||
set cond3 [string first "RESULT" $jp3dVM::dataout]
|
|
||||||
if {$cond != -1} {
|
|
||||||
MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond-1] end] -type ok -icon error
|
|
||||||
} elseif {$cond3 != -1} {
|
|
||||||
if {$cond2 != -1} {
|
|
||||||
set VMDecoder::var(decodinfo) [string range $jp3dVM::dataout [expr $cond2-1] end]
|
|
||||||
}
|
|
||||||
MessageDlg .msgdlg -parent . -message [string range $jp3dVM::dataout [expr $cond3-1] end] -type ok -icon info
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
proc VMDecoder::_save { frameinfo } {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,470 +0,0 @@
|
||||||
|
|
||||||
namespace eval VMEncoder {
|
|
||||||
variable var
|
|
||||||
variable JP3Dencoder "../bin/volume_to_jp3d.exe"
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Before Width: | Height: | Size: 5.1 KiB |
Loading…
Reference in New Issue