diff --git a/indexer_JPIP/bio.c b/indexer_JPIP/bio.c
index 17078cef..2c989e56 100644
--- a/indexer_JPIP/bio.c
+++ b/indexer_JPIP/bio.c
@@ -42,19 +42,6 @@ int bio_numbytes() {
return bio_bp-bio_start;
}
-///
-/// Init encoder.
-///
-/// Output buffer
-/// Output buffer length
-void bio_init_enc(unsigned char *bp, int len) {
- bio_start=bp;
- bio_end=bp+len;
- bio_bp=bp;
- bio_buf=0;
- bio_ct=8;
-}
-
///
/// Init decoder.
///
@@ -68,15 +55,14 @@ void bio_init_dec(unsigned char *bp, int len) {
bio_ct=0;
}
-///
-/// Write byte.
-///
-int bio_byteout() {
- bio_buf=(bio_buf<<8)&0xffff;
- bio_ct=bio_buf==0xff00?7:8;
- if (bio_bp>=bio_end) return 1; //longjmp(j2k_error, 1);
- *bio_bp++=bio_buf>>8;
- return 0;
+int bio_byteout()
+{
+ 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;
}
///
@@ -90,18 +76,6 @@ int bio_bytein() {
return 0;
}
-///
-/// Write bit.
-///
-/// Bit to write (0 or 1)
-void bio_putbit(int b) {
- if (bio_ct==0) {
- bio_byteout();
- }
- bio_ct--;
- bio_buf|=b<
/// Read bit.
///
@@ -113,18 +87,6 @@ int bio_getbit() {
return (bio_buf>>bio_ct)&1;
}
-///
-/// Write bits.
-///
-/// Value of bits
-/// Number of bits to write
-void bio_write(int v, int n) {
- int i;
- for (i=n-1; i>=0; i--) {
- bio_putbit((v>>i)&1);
- }
-}
-
///
/// Read bits.
///
diff --git a/indexer_JPIP/bio.h b/indexer_JPIP/bio.h
index ed412bdc..eea6cff0 100644
--- a/indexer_JPIP/bio.h
+++ b/indexer_JPIP/bio.h
@@ -1,7 +1,7 @@
/*
* Copyright (c) 2001-2002, David Janssens
- * Copyright (c) 2003, Yannick Verschueren
- * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -30,9 +30,7 @@
#define __BIO_H
int bio_numbytes();
-void bio_init_enc(unsigned char *bp, int len);
void bio_init_dec(unsigned char *bp, int len);
-void bio_write(int v, int n);
int bio_read(int n);
int bio_flush();
int bio_inalign();
diff --git a/indexer_JPIP/cio.c b/indexer_JPIP/cio.c
index 208fe24e..29f160ee 100644
--- a/indexer_JPIP/cio.c
+++ b/indexer_JPIP/cio.c
@@ -1,7 +1,7 @@
/*
* Copyright (c) 2001-2002, David Janssens
* Copyright (c) 2003, Yannick Verschueren
- * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -109,12 +109,14 @@ void cio_write(long long v, int n) {
///
/// Read some bytes.
///
-unsigned int cio_read(int n) {
+/* unsigned int cio_read(int n) { */
+long long cio_read(int n) {
int i;
- unsigned int v;
+ /*unsigned int v;*/
+ long long v;
v=0;
for (i=n-1; i>=0; i--) {
- v+=cio_bytein()<<(i<<3);
+ v+=cio_bytein()<<(i<<3);
}
return v;
}
diff --git a/indexer_JPIP/cio.h b/indexer_JPIP/cio.h
index 2e351c08..3e297897 100644
--- a/indexer_JPIP/cio.h
+++ b/indexer_JPIP/cio.h
@@ -1,7 +1,7 @@
/*
* Copyright (c) 2001-2002, David Janssens
- * Copyright (c) 2003, Yannick Verschueren
- * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -35,9 +35,10 @@ int cio_numbytes();
int cio_numbytesleft();
unsigned char *cio_getbp();
void cio_init(unsigned char *bp, int len);
-//void cio_write(unsigned int v, int n);
+/* void cio_write(unsigned int v, int n); */
void cio_write(long long v, int n);
-unsigned int cio_read(int n);
+/* unsigned int cio_read(int n); */
+long long cio_read(int n);
void cio_skip(int n);
#endif
diff --git a/indexer_JPIP/index_create.c b/indexer_JPIP/index_create.c
index 03f5332c..2b6ae5ca 100644
--- a/indexer_JPIP/index_create.c
+++ b/indexer_JPIP/index_create.c
@@ -1,7 +1,7 @@
/*
* Copyright (c) 2001-2002, David Janssens
- * Copyright (c) 2003, Yannick Verschueren
- * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -69,6 +69,9 @@
#define J2K_STATE_TPH 0x0010
#define J2K_STATE_MT 0x0020
+#define START_NB 5
+#define INCREMENT 5
+
jmp_buf j2k_error;
static int j2k_state;
@@ -84,23 +87,22 @@ static int *j2k_tile_len;
static info_image_t img;
+
void j2k_clean() {
int tileno = 0;
- int compno, resno, precno;
-
- tcd_free(j2k_img,j2k_cp);
-
- for (tileno=0;tilenotw*j2k_cp->th;tileno++) {
+ int compno=0, resno=0, precno=0;
+
+ tcd_free(j2k_img, j2k_cp);
+ for (tileno = 0; tileno < j2k_cp->tw * j2k_cp->th; tileno++) {
info_tile_t *tile_Idx = &img.tile[tileno];
- for (compno=0;compnocompo[compno];
-
- for(resno=0;resnoreso[resno];
- for (precno=0;precnoprec[precno];
free(prec_Idx->layer);
@@ -110,463 +112,902 @@ void j2k_clean() {
free(compo_Idx->reso);
}
free(tile_Idx->compo);
- }
+ free(tile_Idx->marker);
+ free(tile_Idx->tile_parts);
+ free(tile_Idx->marker_mul.COC);
+ free(tile_Idx->marker_mul.RGN);
+ free(tile_Idx->marker_mul.QCC);
+ free(tile_Idx->marker_mul.PLT);
+ free(tile_Idx->marker_mul.PPT);
+ free(tile_Idx->marker_mul.COM);
+}
free(img.tile);
free(img.marker);
+ free(img.marker_mul.COC);
+ free(img.marker_mul.RGN);
+ free(img.marker_mul.QCC);
+ free(img.marker_mul.PLM);
+ free(img.marker_mul.PPM);
+ free(img.marker_mul.COM);
}
+
+
void j2k_read_soc() {
- j2k_state=J2K_STATE_MHSIZ;
+ j2k_state=J2K_STATE_MHSIZ;
}
+
+
void j2k_read_siz() {
int len, i;
- len=cio_read(2);
+ info_tile_t *tile;
- //
- img.marker[img.num_marker].type=J2K_MS_SIZ;
- img.marker[img.num_marker].start_pos=cio_tell()-2;
- img.marker[img.num_marker].len=len;
+ len = cio_read(2);
+
+ /* [MHIX BOX] */
+ img.marker[img.num_marker].type = J2K_MS_SIZ;
+ img.marker[img.num_marker].start_pos = cio_tell()-2;
+ img.marker[img.num_marker].len = len;
img.num_marker++;
- //
-
+ /* [MHIX BOX] */
- cio_read(2); // Rsiz (capabilities)
- j2k_img->x1=cio_read(4); // Xsiz
- j2k_img->y1=cio_read(4); // Ysiz
- j2k_img->x0=cio_read(4); // X0siz
- j2k_img->y0=cio_read(4); // Y0siz
- j2k_cp->tdx=cio_read(4); // XTsiz
- j2k_cp->tdy=cio_read(4); // YTsiz
- j2k_cp->tx0=cio_read(4); // XT0siz
- j2k_cp->ty0=cio_read(4); // YTOsiz
- j2k_img->numcomps=cio_read(2); // Csiz
- j2k_img->comps=(j2k_comp_t*)malloc(j2k_img->numcomps*sizeof(j2k_comp_t));
- for (i=0; inumcomps; i++) {
+ cio_read(2); /* Rsiz (capabilities) */
+ j2k_img->x1 = cio_read(4); /* Xsiz */
+ j2k_img->y1 = cio_read(4); /* Ysiz */
+ j2k_img->x0 = cio_read(4); /* X0siz */
+ j2k_img->y0 = cio_read(4); /* Y0siz */
+ j2k_cp->tdx = cio_read(4); /* XTsiz */
+ j2k_cp->tdy = cio_read(4); /* YTsiz */
+ j2k_cp->tx0 = cio_read(4); /* XT0siz */
+ j2k_cp->ty0 = cio_read(4); /* YTOsiz */
+
+ j2k_img->numcomps = cio_read(2); /* Csiz */
+ j2k_img->comps = (j2k_comp_t*)malloc(j2k_img->numcomps * sizeof(j2k_comp_t));
+ for (i = 0; i < j2k_img->numcomps; i++) {
int tmp, w, h;
- tmp=cio_read(1);
- j2k_img->comps[i].prec=(tmp&0x7f)+1;
- j2k_img->comps[i].sgnd=tmp>>7;
- j2k_img->comps[i].dx=cio_read(1);
- j2k_img->comps[i].dy=cio_read(1);
- w=int_ceildiv(j2k_img->x1-j2k_img->x0, j2k_img->comps[i].dx);
- h=int_ceildiv(j2k_img->y1-j2k_img->y0, j2k_img->comps[i].dy);
- j2k_img->comps[i].data=(int*)malloc(sizeof(int)*w*h);
+ tmp = cio_read(1);
+ j2k_img->comps[i].prec = (tmp & 0x7f) + 1;
+ j2k_img->comps[i].sgnd = tmp >> 7;
+ j2k_img->comps[i].dx = cio_read(1);
+ j2k_img->comps[i].dy = cio_read(1);
+ w = int_ceildiv(j2k_img->x1-j2k_img->x0, j2k_img->comps[i].dx);
+ h = int_ceildiv(j2k_img->y1-j2k_img->y0, j2k_img->comps[i].dy);
+ j2k_img->comps[i].data = (int*)malloc(sizeof(int) * w * h);
}
- j2k_cp->tw=int_ceildiv(j2k_img->x1-j2k_img->x0, j2k_cp->tdx);
- j2k_cp->th=int_ceildiv(j2k_img->y1-j2k_img->y0, j2k_cp->tdy);
+ j2k_cp->tw = int_ceildiv(j2k_img->x1 - j2k_cp->tx0, j2k_cp->tdx);
+ j2k_cp->th = int_ceildiv(j2k_img->y1 - j2k_cp->ty0, j2k_cp->tdy);
- j2k_cp->tcps=(j2k_tcp_t*)calloc(sizeof(j2k_tcp_t), j2k_cp->tw*j2k_cp->th);
- j2k_default_tcp.tccps=(j2k_tccp_t*)calloc(sizeof(j2k_tccp_t), j2k_img->numcomps);
- for (i=0; itw*j2k_cp->th; i++) {
- j2k_cp->tcps[i].tccps=(j2k_tccp_t*)calloc(sizeof(j2k_tccp_t), j2k_img->numcomps);
+ j2k_cp->tcps = (j2k_tcp_t*)calloc((j2k_cp->tw * j2k_cp->th), sizeof(j2k_tcp_t));
+
+ for (i = 0; i < j2k_cp->tw * j2k_cp->th; i++)
+ {
+ j2k_cp->tcps[i].POC = 0;
+ j2k_cp->tcps[i].numpocs = 0;
+ // j2k_cp->tcps[i].first=1;
+ }
+
+ /* Initialization for PPM marker */
+ j2k_cp->ppm = 0;
+ j2k_cp->ppm_data = NULL;
+ j2k_cp->ppm_previous = 0;
+ j2k_cp->ppm_store = 0;
+
+ j2k_default_tcp.tccps = (j2k_tccp_t*)malloc(j2k_img->numcomps * sizeof(j2k_tccp_t));
+ for (i = 0; i < j2k_cp->tw * j2k_cp->th; i++) {
+ j2k_cp->tcps[i].tccps = (j2k_tccp_t*)malloc(j2k_img->numcomps * sizeof(j2k_tccp_t));
}
- j2k_tile_data=(unsigned char**)calloc(j2k_cp->tw*j2k_cp->th, sizeof(char*));
- j2k_tile_len=(int*)calloc(j2k_cp->tw*j2k_cp->th, sizeof(int));
- j2k_state=J2K_STATE_MH;
+ j2k_tile_data = (unsigned char**)calloc(j2k_cp->tw * j2k_cp->th, sizeof(char*));
+ j2k_tile_len = (int*)calloc(j2k_cp->tw * j2k_cp->th, sizeof(int));
+ j2k_state = J2K_STATE_MH;
- //
- img.Im_w=j2k_img->x1-j2k_img->x0;
- img.Im_h=j2k_img->y1-j2k_img->y0;
- img.Tile_x=j2k_cp->tdx;
- img.Tile_y=j2k_cp->tdy;
- img.Comp=j2k_img->numcomps;
- img.tw=j2k_cp->tw;
- img.th=j2k_cp->th;
- img.tile=(info_tile_t*)malloc((img.tw*img.th)*sizeof(info_tile_t));
- //
+ /* */
+ img.Im_w = j2k_img->x1 - j2k_img->x0;
+ img.Im_h = j2k_img->y1 - j2k_img->y0;
+ img.Tile_x = j2k_cp->tdx;
+ img.Tile_y = j2k_cp->tdy;
+ img.Comp = j2k_img->numcomps;
+ img.tw = j2k_cp->tw;
+ img.th = j2k_cp->th;
+ img.tile = (info_tile_t*)malloc(img.tw * img.th * sizeof(info_tile_t));
+
+ for (i = 0; i < img.tw * img.th; i++)
+ {
+ tile = &img.tile[i];
+ tile->marker = (info_marker_t*)malloc(32 * sizeof(info_marker_t));
+ tile->num_marker = 0;
+ tile->marker_mul.num_COC = 0;
+ tile->marker_mul.CzCOC = START_NB;
+ tile->marker_mul.num_RGN = 0;
+ tile->marker_mul.CzRGN = START_NB;
+ tile->marker_mul.num_QCC = 0;
+ tile->marker_mul.CzQCC = START_NB;
+ tile->marker_mul.num_PLT = 0;
+ tile->marker_mul.CzPLT = START_NB;
+ tile->marker_mul.num_PPT = 0;
+ tile->marker_mul.CzPPT = START_NB;
+ tile->marker_mul.num_COM = 0;
+ tile->marker_mul.CzCOM = START_NB;
+ }
+ /* */
}
void j2k_read_com() {
int len;
- len=cio_read(2);
+ info_tile_t *tile;
+ info_marker_t *tmp;
- //
- if (j2k_state==J2K_STATE_MH)
+ len = cio_read(2);
+
+ /* [MHIX BOX] */
+ if (j2k_state == J2K_STATE_MH)
{
- if (!img.marker_mul.num_COM)
- img.marker_mul.COM=(info_marker_t*)malloc(sizeof(info_marker_t));
- else
- img.marker_mul.COM=realloc(img.marker_mul.COM,(1+img.marker_mul.num_COM)*sizeof(info_marker_t));
- img.marker_mul.COM[img.marker_mul.num_COM].type=J2K_MS_COM;
- img.marker_mul.COM[img.marker_mul.num_COM].start_pos=cio_tell()-2;
- img.marker_mul.COM[img.marker_mul.num_COM].len=len;
- img.marker_mul.num_COM++;
- }
- //
+ if (!img.marker_mul.num_COM)
+ img.marker_mul.COM = (info_marker_t*)malloc(img.marker_mul.CzCOM * sizeof(info_marker_t));
+ if (img.marker_mul.num_COM >= img.marker_mul.CzCOM)
+ {
+ tmp = (info_marker_t*)malloc(2 * img.marker_mul.CzCOM * sizeof(info_marker_t));
+ memcpy(tmp,img.marker_mul.COM,img.marker_mul.CzCOM);
+ img.marker_mul.CzCOM *= 2;
+ free(img.marker_mul.COM);
+ img.marker_mul.COM = tmp;
+ }
- cio_skip(len-2);
+ img.marker_mul.COM[img.marker_mul.num_COM].type = J2K_MS_COM;
+ img.marker_mul.COM[img.marker_mul.num_COM].start_pos = cio_tell()-2;
+ img.marker_mul.COM[img.marker_mul.num_COM].len = len;
+ img.marker_mul.num_COM++;
+ } else
+ {
+ tile = &img.tile[j2k_curtileno];
+ if (!tile->marker_mul.num_COM)
+ tile->marker_mul.COM = (info_marker_t*)calloc(START_NB, sizeof(info_marker_t));
+ if (tile->marker_mul.num_COM >= tile->marker_mul.CzCOM)
+ {
+ tmp = (info_marker_t*)malloc(2 * tile->marker_mul.CzCOM * sizeof(info_marker_t));
+ memcpy(tmp,tile->marker_mul.COM,tile->marker_mul.CzCOM);
+ tile->marker_mul.CzCOM *= 2;
+ free(tile->marker_mul.COM);
+ tile->marker_mul.COM = tmp;
+ }
+ tile->marker_mul.COM[tile->marker_mul.num_COM].type = J2K_MS_COM;
+ tile->marker_mul.COM[tile->marker_mul.num_COM].start_pos = cio_tell()-2;
+ tile->marker_mul.COM[tile->marker_mul.num_COM].len = len;
+ tile->marker_mul.num_COM++;
+ }
+ /* [MHIX BOX] */
+
+ cio_skip(len - 2);
}
+
+
+
void j2k_read_cox(int compno) {
int i;
j2k_tcp_t *tcp;
j2k_tccp_t *tccp;
- tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;
- tccp=&tcp->tccps[compno];
- tccp->numresolutions=cio_read(1)+1;
- img.Decomposition=tccp->numresolutions-1; //
+ tcp = j2k_state == J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp;
+ tccp = &tcp->tccps[compno];
+ tccp->numresolutions = cio_read(1) + 1;
- tccp->cblkw=cio_read(1)+2;
- tccp->cblkh=cio_read(1)+2;
- tccp->cblksty=cio_read(1);
- tccp->qmfbid=cio_read(1);
+ img.Decomposition = tccp->numresolutions - 1; /* */
+
+ tccp->cblkw = cio_read(1) + 2;
+ tccp->cblkh = cio_read(1) + 2;
+ tccp->cblksty = cio_read(1);
+ tccp->qmfbid = cio_read(1);
if (tccp->csty&J2K_CP_CSTY_PRT) {
- for (i=0; inumresolutions; i++) {
- int tmp=cio_read(1);
- tccp->prcw[i]=tmp&0xf;
- tccp->prch[i]=tmp>>4;
+ for (i = 0; i < tccp->numresolutions; i++) {
+ int tmp = cio_read(1);
+ tccp->prcw[i] = tmp&0xf;
+ tccp->prch[i] = tmp>>4;
}
}
}
+
+
+
void j2k_read_cod() {
int len, i, pos;
j2k_tcp_t *tcp;
- tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;
- len=cio_read(2);
+ info_tile_t *tile;
- //
- if (j2k_state==J2K_STATE_MH)
+ tcp = j2k_state == J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp;
+ len = cio_read(2);
+
+ /* [MHIX BOX] */
+ if (j2k_state == J2K_STATE_MH)
{
- if (!img.marker_mul.num_COD)
- img.marker_mul.COD=(info_marker_t*)malloc(sizeof(info_marker_t));
- else
- img.marker_mul.COD=realloc(img.marker_mul.COD,(1+img.marker_mul.num_COD)*sizeof(info_marker_t));
- img.marker_mul.COD[img.marker_mul.num_COD].type=J2K_MS_COD;
- img.marker_mul.COD[img.marker_mul.num_COD].start_pos=cio_tell()-2;
- img.marker_mul.COD[img.marker_mul.num_COD].len=len;
- img.marker_mul.num_COD++;
+ img.marker[img.num_marker].type = J2K_MS_SIZ;
+ img.marker[img.num_marker].start_pos = cio_tell()-2;
+ img.marker[img.num_marker].len = len;
+ img.num_marker++;
}
- //
+ else
+ {
+ tile = &img.tile[j2k_curtileno];
+ tile->marker[tile->num_marker].type = J2K_MS_SIZ;
+ tile->marker[tile->num_marker].start_pos = cio_tell()-2;
+ tile->marker[tile->num_marker].len = len;
+ tile->num_marker++;
+ }
+ /* [MHIX BOX] */
-
- tcp->csty=cio_read(1);
- tcp->prg=cio_read(1);
- tcp->numlayers=cio_read(2);
- tcp->mct=cio_read(1);
- pos=cio_tell();
- for (i=0; inumcomps; i++) {
- tcp->tccps[i].csty=tcp->csty&J2K_CP_CSTY_PRT;
+ tcp->csty = cio_read(1);
+ tcp->prg = cio_read(1);
+ tcp->numlayers = cio_read(2);
+ tcp->mct = cio_read(1);
+
+ pos = cio_tell();
+ for (i = 0; i < j2k_img->numcomps; i++) {
+ tcp->tccps[i].csty = tcp->csty&J2K_CP_CSTY_PRT;
cio_seek(pos);
j2k_read_cox(i);
}
- //
- img.Prog=tcp->prg;
- img.Layer=tcp->numlayers;
- //
+
+ /* */
+ img.Prog = tcp->prg;
+ img.Layer = tcp->numlayers;
+ /* */
}
+
+
+
void j2k_read_coc() {
int len, compno;
j2k_tcp_t *tcp;
- tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;
- len=cio_read(2);
- //
- if (j2k_state==J2K_STATE_MH)
+ info_tile_t *tile;
+ info_marker_t *tmp;
+
+ tcp = j2k_state == J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp;
+ len = cio_read(2);
+
+ /* [MHIX BOX] */
+ if (j2k_state == J2K_STATE_MH)
{
if (!img.marker_mul.num_COC)
- img.marker_mul.COC=(info_marker_t*)malloc(sizeof(info_marker_t));
- else
- img.marker_mul.COC=realloc(img.marker_mul.COC,(1+img.marker_mul.num_COC)*sizeof(info_marker_t));
- img.marker_mul.COC[img.marker_mul.num_COC].type=J2K_MS_COC;
- img.marker_mul.COC[img.marker_mul.num_COC].start_pos=cio_tell()-2;
- img.marker_mul.COC[img.marker_mul.num_COC].len=len;
+ img.marker_mul.COC = (info_marker_t*)malloc(img.marker_mul.CzCOC * sizeof(info_marker_t));
+ if (img.marker_mul.num_COC >= img.marker_mul.CzCOC)
+ {
+ tmp = (info_marker_t*)malloc((INCREMENT + img.marker_mul.CzCOC) * sizeof(info_marker_t));
+ memcpy(tmp,img.marker_mul.COC,img.marker_mul.CzCOC);
+ img.marker_mul.CzCOC += INCREMENT;
+ free(img.marker_mul.COC);
+ img.marker_mul.COC = tmp;
+ }
+ img.marker_mul.COC[img.marker_mul.num_COC].type = J2K_MS_COC;
+ img.marker_mul.COC[img.marker_mul.num_COC].start_pos = cio_tell()-2;
+ img.marker_mul.COC[img.marker_mul.num_COC].len = len;
img.marker_mul.num_COC++;
- }
- //
-
+ } else
+ {
+ tile = &img.tile[j2k_curtileno];
+ if (!tile->marker_mul.num_COC)
+ tile->marker_mul.COC = (info_marker_t*)malloc(tile->marker_mul.CzCOC * sizeof(info_marker_t));
+ if (tile->marker_mul.num_COC >= tile->marker_mul.CzCOC)
+ {
+ tmp = (info_marker_t*)malloc((INCREMENT + tile->marker_mul.CzCOC) * sizeof(info_marker_t));
+ memcpy(tmp,tile->marker_mul.COC,tile->marker_mul.CzCOC);
+ tile->marker_mul.CzCOC += INCREMENT;
+ free(tile->marker_mul.COC);
+ tile->marker_mul.COC = tmp;
+ }
+ tile->marker_mul.COC[tile->marker_mul.num_COC].type = J2K_MS_COC;
+ tile->marker_mul.COC[tile->marker_mul.num_COC].start_pos = cio_tell() - 2;
+ tile->marker_mul.COC[tile->marker_mul.num_COC].len = len;
+ tile->marker_mul.num_COC++;
+ }
+ /* [MHIX BOX] */
- compno=cio_read(j2k_img->numcomps<=256?1:2);
- tcp->tccps[compno].csty=cio_read(1);
+ compno =cio_read(j2k_img->numcomps <= 256 ? 1 : 2);
+
+ tcp->tccps[compno].csty = cio_read(1);
j2k_read_cox(compno);
}
+
+
+
void j2k_read_qcx(int compno, int len) {
int tmp;
j2k_tcp_t *tcp;
j2k_tccp_t *tccp;
int bandno, numbands;
- tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;
- tccp=&tcp->tccps[compno];
- tmp=cio_read(1);
- tccp->qntsty=tmp&0x1f;
- tccp->numgbits=tmp>>5;
- numbands=tccp->qntsty==J2K_CCP_QNTSTY_SIQNT?1:(tccp->qntsty==J2K_CCP_QNTSTY_NOQNT?len-1:(len-1)/2);
- for (bandno=0; bandnotcps[j2k_curtileno] : &j2k_default_tcp;
+ tccp = &tcp->tccps[compno];
+ tmp = cio_read(1);
+ tccp->qntsty = tmp & 0x1f;
+ tccp->numgbits = tmp >> 5;
+ numbands = tccp->qntsty == J2K_CCP_QNTSTY_SIQNT ? 1 : (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT ? len - 1 : (len - 1) / 2);
+ for (bandno = 0; bandno < numbands; bandno++) {
int expn, mant;
- if (tccp->qntsty==J2K_CCP_QNTSTY_NOQNT) { // WHY STEPSIZES WHEN NOQNT ?
- expn=cio_read(1)>>3;
- mant=0;
+ if (tccp->qntsty == J2K_CCP_QNTSTY_NOQNT) { /* WHY STEPSIZES WHEN NOQNT ? */
+ expn = cio_read(1) >> 3;
+ mant = 0;
} else {
- tmp=cio_read(2);
- expn=tmp>>11;
- mant=tmp&0x7ff;
+ tmp = cio_read(2);
+ expn = tmp >> 11;
+ mant = tmp & 0x7ff;
}
- tccp->stepsizes[bandno].expn=expn;
- tccp->stepsizes[bandno].mant=mant;
+ tccp->stepsizes[bandno].expn = expn;
+ tccp->stepsizes[bandno].mant = mant;
}
}
+
+
+
void j2k_read_qcd() {
int len, i, pos;
- len=cio_read(2);
+ info_tile_t *tile;
- //
- if (j2k_state==J2K_STATE_MH)
+ len = cio_read(2);
+
+ /* [MHIX BOX] */
+ if (j2k_state == J2K_STATE_MH)
{
- img.marker[img.num_marker].type=J2K_MS_QCD;
- img.marker[img.num_marker].start_pos=cio_tell()-2;
- img.marker[img.num_marker].len=len;
+ img.marker[img.num_marker].type = J2K_MS_QCD;
+ img.marker[img.num_marker].start_pos = cio_tell()-2;
+ img.marker[img.num_marker].len = len;
img.num_marker++;
- }
- //
+ } else
+ {
+ tile = &img.tile[j2k_curtileno];
+ tile->marker[tile->num_marker].type = J2K_MS_QCD;
+ tile->marker[tile->num_marker].start_pos = cio_tell()-2;
+ tile->marker[tile->num_marker].len = len;
+ tile->num_marker++;
+ }
+ /* [MHIX BOX] */
pos=cio_tell();
- for (i=0; inumcomps; i++) {
+ for (i = 0; i < j2k_img->numcomps; i++) {
cio_seek(pos);
- j2k_read_qcx(i, len-2);
+ j2k_read_qcx(i, len - 2);
}
}
+
+
+
void j2k_read_qcc() {
int len, compno;
- len=cio_read(2);
+ info_tile_t *tile;
+ info_marker_t *tmp;
- //
- if (j2k_state==J2K_STATE_MH)
+ len = cio_read(2);
+ /* [MHIX BOX] */
+ if (j2k_state == J2K_STATE_MH)
{
if (!img.marker_mul.num_QCC)
- img.marker_mul.QCC=(info_marker_t*)malloc(sizeof(info_marker_t));
- else
- img.marker_mul.QCC=realloc(img.marker_mul.QCC,(1+img.marker_mul.num_QCC)*sizeof(info_marker_t));
- img.marker_mul.QCC[img.marker_mul.num_QCC].type=J2K_MS_QCC;
- img.marker_mul.QCC[img.marker_mul.num_QCC].start_pos=cio_tell()-2;
- img.marker_mul.QCC[img.marker_mul.num_QCC].len=len;
+ img.marker_mul.QCC = (info_marker_t*)malloc(img.marker_mul.CzQCC * sizeof(info_marker_t));
+ if (img.marker_mul.num_QCC >= img.marker_mul.CzQCC)
+ {
+ tmp = (info_marker_t*)malloc((INCREMENT + img.marker_mul.CzQCC) * sizeof(info_marker_t));
+ memcpy(tmp,img.marker_mul.QCC,img.marker_mul.CzQCC);
+ img.marker_mul.CzQCC += INCREMENT;
+ free(img.marker_mul.QCC);
+ img.marker_mul.QCC = tmp;
+ }
+ img.marker_mul.QCC[img.marker_mul.num_QCC].type = J2K_MS_QCC;
+ img.marker_mul.QCC[img.marker_mul.num_QCC].start_pos = cio_tell() - 2;
+ img.marker_mul.QCC[img.marker_mul.num_QCC].len = len;
img.marker_mul.num_QCC++;
- }
- //
-
-
- compno=cio_read(j2k_img->numcomps<=256?1:2);
- j2k_read_qcx(compno, len-2-(j2k_img->numcomps<=256?1:2));
+ } else
+ {
+ tile = &img.tile[j2k_curtileno];
+ if (!tile->marker_mul.num_QCC)
+ tile->marker_mul.QCC = (info_marker_t*)malloc(tile->marker_mul.CzQCC * sizeof(info_marker_t));
+ if (tile->marker_mul.num_QCC >= tile->marker_mul.CzQCC)
+ {
+ tmp = (info_marker_t*)malloc((INCREMENT + tile->marker_mul.CzQCC) * sizeof(info_marker_t));
+ memcpy(tmp,tile->marker_mul.QCC,tile->marker_mul.CzQCC);
+ tile->marker_mul.CzQCC += INCREMENT;
+ free(tile->marker_mul.QCC);
+ tile->marker_mul.QCC = tmp;
+ }
+ tile->marker_mul.QCC[tile->marker_mul.num_QCC].type = J2K_MS_QCC;
+ tile->marker_mul.QCC[tile->marker_mul.num_QCC].start_pos = cio_tell()-2;
+ tile->marker_mul.QCC[tile->marker_mul.num_QCC].len = len;
+ tile->marker_mul.num_QCC++;
+ }
+ /* [MHIX BOX] */
+
+ compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2);
+ j2k_read_qcx(compno, len - 2 - (j2k_img->numcomps <= 256 ? 1 : 2));
}
+
+
+
void j2k_read_poc() {
- int len, numpchgs, i;
+ int len, numpchgs, i, old_poc;
j2k_tcp_t *tcp;
- fprintf(stderr, "WARNING: POC marker segment processing not fully implemented\n");
- tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;
- len=cio_read(2);
-
- //
- if (j2k_state==J2K_STATE_MH)
- {
- img.marker[img.num_marker].type=J2K_MS_POC;
- img.marker[img.num_marker].start_pos=cio_tell()-2;
- img.marker[img.num_marker].len=len;
- img.num_marker++;
- }
- //
-
+ j2k_tccp_t *tccp;
+ info_tile_t *tile;
- numpchgs=(len-2)/(5+2*(j2k_img->numcomps<=256?1:2));
- for (i=0; ipocs[i];
- poc->resno0=cio_read(1);
- poc->compno0=cio_read(j2k_img->numcomps<=256?1:2);
- poc->layno1=cio_read(2);
- poc->resno1=cio_read(1);
- poc->compno1=cio_read(j2k_img->numcomps<=256?1:2);
- poc->prg=cio_read(1);
- }
+ tcp = j2k_state == J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp;
+ old_poc = tcp->POC ? tcp->numpocs+1 : 0;
+ tcp->POC = 1;
+ tccp = &tcp->tccps[0];
+ len = cio_read(2);
+
+ /* [MHIX BOX] */
+ if (j2k_state == J2K_STATE_MH)
+ {
+ img.marker[img.num_marker].type = J2K_MS_POC;
+ img.marker[img.num_marker].start_pos = cio_tell()-2;
+ img.marker[img.num_marker].len = len;
+ img.num_marker++;
+ } else
+ {
+ tile = &img.tile[j2k_curtileno];
+ tile->marker[tile->num_marker].type = J2K_MS_POC;
+ tile->marker[tile->num_marker].start_pos = cio_tell()-2;
+ tile->marker[tile->num_marker].len = len;
+ tile->num_marker++;
+ }
+ /* [MHIX BOX] */
+
+ numpchgs = (len - 2) / (5 + 2 * (j2k_img->numcomps <= 256 ? 1 : 2));
+ for (i = 0; i < numpchgs; i++) {
+ j2k_poc_t *poc;
+ poc = &tcp->pocs[i];
+ poc->resno0 = cio_read(1);
+ poc->compno0 = cio_read(j2k_img->numcomps <= 256 ? 1 : 2);
+ poc->layno1 = int_min(cio_read(2), tcp->numlayers);
+ poc->resno1 = int_min(cio_read(1), tccp->numresolutions);
+ poc->compno1 = int_min(cio_read(j2k_img->numcomps <= 256 ? 1 : 2), j2k_img->numcomps);
+ poc->prg = cio_read(1);
+ }
+
+ tcp->numpocs = numpchgs + old_poc - 1;
}
+
+
+
void j2k_read_crg() {
- int len;
- len=cio_read(2);
+ int len, i, Xcrg_i, Ycrg_i;
- //
- if (j2k_state==J2K_STATE_MH)
- {
- img.marker[img.num_marker].type=J2K_MS_CRG;
- img.marker[img.num_marker].start_pos=cio_tell()-2;
- img.marker[img.num_marker].len=len;
- img.num_marker++;
+ len = cio_read(2);
+
+ /* [MHIX BOX] */
+ img.marker[img.num_marker].type = J2K_MS_CRG;
+ img.marker[img.num_marker].start_pos = cio_tell()-2;
+ img.marker[img.num_marker].len = len;
+ img.num_marker++;
+ /* [MHIX BOX] */
+
+ for (i = 0; i < j2k_img->numcomps; i++)
+ {
+ Xcrg_i = cio_read(2);
+ Ycrg_i = cio_read(2);
}
- //
-
- fprintf(stderr, "WARNING: CRG marker segment processing not implemented\n");
- cio_skip(len-2);
}
+
+
+
void j2k_read_tlm() {
- int len;
- len=cio_read(2);
+ int len, Ztlm, Stlm, ST, SP, tile_tlm, i;
+ long int Ttlm_i, Ptlm_i;
+ info_marker_t *tmp;
- //
- if (j2k_state==J2K_STATE_MH)
+ len = cio_read(2);
+
+ /* [MHIX BOX] */
+ if (!img.marker_mul.num_TLM)
+ img.marker_mul.TLM = (info_marker_t*)malloc(img.marker_mul.CzTLM * sizeof(info_marker_t));
+ if (img.marker_mul.num_TLM >= img.marker_mul.CzTLM)
{
- if (!img.marker_mul.num_TLM)
- img.marker_mul.TLM=(info_marker_t*)malloc(sizeof(info_marker_t));
- else
- img.marker_mul.TLM=realloc(img.marker_mul.TLM,(1+img.marker_mul.num_TLM)*sizeof(info_marker_t));
- img.marker_mul.TLM[img.marker_mul.num_TLM].type=J2K_MS_TLM;
- img.marker_mul.TLM[img.marker_mul.num_TLM].start_pos=cio_tell()-2;
- img.marker_mul.TLM[img.marker_mul.num_TLM].len=len;
- img.marker_mul.num_TLM++;
+ tmp = (info_marker_t*)malloc((INCREMENT + img.marker_mul.CzTLM) * sizeof(info_marker_t));
+ memcpy(tmp,img.marker_mul.TLM,img.marker_mul.CzTLM);
+ img.marker_mul.CzTLM += INCREMENT;
+ free(img.marker_mul.TLM);
+ img.marker_mul.TLM = tmp;
}
- //
+ img.marker_mul.TLM[img.marker_mul.num_TLM].type = J2K_MS_TLM;
+ img.marker_mul.TLM[img.marker_mul.num_TLM].start_pos = cio_tell()-2;
+ img.marker_mul.TLM[img.marker_mul.num_TLM].len = len;
+ img.marker_mul.num_TLM++;
+ /* [MHIX BOX] */
- fprintf(stderr, "WARNING: TLM marker segment processing not implemented\n");
- cio_skip(len-2);
+ Ztlm = cio_read(1);
+ Stlm = cio_read(1);
+ ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
+ SP = (Stlm >> 6) & 0x01;
+ tile_tlm = (len - 4) / ((SP + 1) * 2 + ST);
+ for (i = 0; i < tile_tlm; i++)
+ {
+ Ttlm_i = cio_read(ST);
+ Ptlm_i = cio_read(SP ? 4 : 2);
+ }
}
+
+
+
void j2k_read_plm() {
- int len;
+ int len, i, Z_plm, N_plm, add, packet_len=0;
+ info_marker_t *tmp;
+
len=cio_read(2);
- //
- if (j2k_state==J2K_STATE_MH)
+ /* [MHIX BOX] */
+ if (!img.marker_mul.num_PLM)
+ img.marker_mul.PLM = (info_marker_t*)malloc(img.marker_mul.CzPLM * sizeof(info_marker_t));
+ if (img.marker_mul.num_PLM >= img.marker_mul.CzPLM)
{
- if (!img.marker_mul.num_PLM)
- img.marker_mul.PLM=(info_marker_t*)malloc(sizeof(info_marker_t));
- else
- img.marker_mul.PLM=realloc(img.marker_mul.PLM,(1+img.marker_mul.num_PLM)*sizeof(info_marker_t));
- img.marker_mul.PLM[img.marker_mul.num_PLM].type=J2K_MS_PLM;
- img.marker_mul.PLM[img.marker_mul.num_PLM].start_pos=cio_tell()-2;
- img.marker_mul.PLM[img.marker_mul.num_PLM].len=len;
- img.marker_mul.num_PLM++;
+ tmp = (info_marker_t*)malloc((INCREMENT + img.marker_mul.CzPLM) * sizeof(info_marker_t));
+ memcpy(tmp,img.marker_mul.PLM,img.marker_mul.CzPLM);
+ img.marker_mul.CzPLM += INCREMENT;
+ free(img.marker_mul.PLM);
+ img.marker_mul.PLM = tmp;
+ }
+ img.marker_mul.PLM[img.marker_mul.num_PLM].type = J2K_MS_PLM;
+ img.marker_mul.PLM[img.marker_mul.num_PLM].start_pos = cio_tell()-2;
+ img.marker_mul.PLM[img.marker_mul.num_PLM].len = len;
+ img.marker_mul.num_PLM++;
+ /* [MHIX BOX] */
+
+ Z_plm = cio_read(1);
+ len -= 3;
+ while (len > 0)
+ {
+ N_plm = cio_read(4);
+ len -= 4;
+ for (i = N_plm ; i > 0 ; i--)
+ {
+ add = cio_read(1);
+ len--;
+ packet_len = (packet_len << 7) + add;
+ if ((add & 0x80) == 0)
+ {
+ /* New packet */
+ packet_len = 0;
+ }
+ if (len <= 0) break;
+ }
}
- //
-
- fprintf(stderr, "WARNING: PLM marker segment processing not implemented\n");
- cio_skip(len-2);
}
+
+
+
void j2k_read_plt() {
- int len;
- len=cio_read(2);
- fprintf(stderr, "WARNING: PLT marker segment processing not implemented\n");
- cio_skip(len-2);
+ int len, i, Zplt, packet_len=0, add;
+ info_tile_t *tile;
+ info_marker_t *tmp;
+;
+ len = cio_read(2);
+
+ /* [MHIX BOX] */
+ tile = &img.tile[j2k_curtileno];
+ if (!tile->marker_mul.num_PLT)
+ tile->marker_mul.PLT = (info_marker_t*)malloc(tile->marker_mul.CzPLT * sizeof(info_marker_t));
+ if (tile->marker_mul.num_PLT >= tile->marker_mul.CzPLT)
+ {
+ tmp = (info_marker_t*)malloc((INCREMENT + tile->marker_mul.CzPLT) * sizeof(info_marker_t));
+ memcpy(tmp,tile->marker_mul.PLT,tile->marker_mul.CzPLT);
+ tile->marker_mul.CzPLT += INCREMENT;
+ free(tile->marker_mul.PLT);
+ tile->marker_mul.PLT = tmp;
+ }
+
+ tile->marker_mul.PLT[tile->marker_mul.num_PLT].type = J2K_MS_PLT;
+ tile->marker_mul.PLT[tile->marker_mul.num_PLT].start_pos = cio_tell()-2;
+ tile->marker_mul.PLT[tile->marker_mul.num_PLT].len = len;
+ tile->marker_mul.num_PLT++;
+ /* [MHIX BOX] */
+
+ Zplt = cio_read(1);
+ for (i = len-3; i > 0; i--)
+ {
+ add = cio_read(1);
+ packet_len = (packet_len << 7) + add;
+ if ((add & 0x80) == 0)
+ {
+ /* New packet */
+ packet_len = 0;
+ }
+ }
}
+
+
+
void j2k_read_ppm() {
- int len;
- len=cio_read(2);
- //
- if (j2k_state==J2K_STATE_MH)
- {
- img.marker[img.num_marker].type=J2K_MS_PPM;
- img.marker[img.num_marker].start_pos=cio_tell()-2;
- img.marker[img.num_marker].len=len;
- img.num_marker++;
- }
- //
+ int len, Z_ppm, i, j;
+ int N_ppm;
+ info_marker_t *tmp;
+
+ len = cio_read(2);
- fprintf(stderr, "WARNING: PPM marker segment processing not implemented\n");
- cio_skip(len-2);
+ /* [MHIX BOX] */
+ if (!img.marker_mul.num_PPM)
+ img.marker_mul.PPM = (info_marker_t*)malloc(img.marker_mul.CzPPM * sizeof(info_marker_t));
+ if (img.marker_mul.num_PPM >= img.marker_mul.CzPPM)
+ {
+ tmp = (info_marker_t*)malloc((INCREMENT + img.marker_mul.CzPPM) * sizeof(info_marker_t));
+ memcpy(tmp,img.marker_mul.PPM,img.marker_mul.CzPPM);
+ img.marker_mul.CzPPM += INCREMENT;
+ free(img.marker_mul.PPM);
+ img.marker_mul.PPM = tmp;
+ }
+ img.marker_mul.PLM[img.marker_mul.num_PPM].type = J2K_MS_PPM;
+ img.marker_mul.PLM[img.marker_mul.num_PPM].start_pos = cio_tell()-2;
+ img.marker_mul.PLM[img.marker_mul.num_PPM].len = len;
+ img.marker_mul.num_PPM++;
+ /* [MHIX BOX] */
+
+ j2k_cp->ppm = 1;
+
+ Z_ppm = cio_read(1); /* Z_ppm */
+ len -= 3;
+ while (len > 0)
+ {
+ if (j2k_cp->ppm_previous == 0)
+ {
+ N_ppm = cio_read(4); /* N_ppm */
+ len -= 4;
+ } else
+ {
+ N_ppm = j2k_cp->ppm_previous;
+ }
+
+ j = j2k_cp->ppm_store;
+ if (Z_ppm == 0) /* First PPM marker */
+ j2k_cp->ppm_data = (unsigned char*)calloc(N_ppm, sizeof(unsigned char));
+ else /* NON-first PPM marker */
+ j2k_cp->ppm_data = (unsigned char*)realloc(j2k_cp->ppm_data, (N_ppm + j2k_cp->ppm_store) * sizeof(unsigned char));
+
+ for (i = N_ppm ; i > 0 ; i--) /* Read packet header */
+ {
+ j2k_cp->ppm_data[j] = cio_read(1);
+ j++;
+ len--;
+ if (len == 0) break; /* Case of non-finished packet header in present marker but finished in next one */
+ }
+
+ j2k_cp->ppm_previous = i - 1;
+ j2k_cp->ppm_store = j;
+ }
}
+
+
+
void j2k_read_ppt() {
- int len;
+ int len, Z_ppt, i, j = 0;
+ j2k_tcp_t *tcp;
+ info_tile_t *tile;
len=cio_read(2);
- fprintf(stderr, "WARNING: PPT marker segment processing not implemented\n");
- cio_skip(len-2);
+
+ /* [MHIX BOX] */
+ tile = & img.tile[j2k_curtileno];
+ tile->marker[tile->num_marker].type = J2K_MS_PPT;
+ tile->marker[tile->num_marker].start_pos = cio_tell()-2;
+ tile->marker[tile->num_marker].len = len;
+ tile->num_marker++;
+ /* [MHIX BOX] */
+
+ Z_ppt = cio_read(1);
+ tcp = &j2k_cp->tcps[j2k_curtileno];
+ tcp->ppt = 1;
+ if (Z_ppt == 0) /* First PPT marker */
+ {
+ tcp->ppt_data = (unsigned char*)calloc(len - 3, sizeof(unsigned char));
+ tcp->ppt_store = 0;
+ }
+ else /* NON-first PPT marker */
+ tcp->ppt_data = (unsigned char*)realloc(tcp->ppt_data, (len - 3 + tcp->ppt_store) * sizeof(unsigned char));
+
+ j = tcp->ppt_store;
+ for (i = len - 3 ; i > 0 ; i--)
+ {
+ tcp->ppt_data[j] = cio_read(1);
+ j++;
+ }
+ tcp->ppt_store = j;
}
+
+
+
void j2k_read_sot() {
int len, tileno, totlen, partno, numparts, i;
j2k_tcp_t *tcp;
j2k_tccp_t *tmp;
- len=cio_read(2);
- tileno=cio_read(2);
- //
- if (!tileno) img.Main_head_end=cio_tell()-6; // Correction End = First byte of first SOT
- img.tile[tileno].start_pos=cio_tell()-6;
- img.tile[tileno].num_tile=tileno;
- //
- totlen=cio_read(4);
+ info_tile_t *tile;
+ info_tile_part_t *tilepart_tmp;
+
+
+ //fprintf(stderr,"SOT\n");
+ len = cio_read(2);
+ tileno = cio_read(2);
+ /* [MHIX BOX] */
+ tile = & img.tile[tileno];
+ tile->marker[tile->num_marker].type = J2K_MS_SOT;
+ tile->marker[tile->num_marker].start_pos = cio_tell() - 4;
+ tile->marker[tile->num_marker].len = len;
+ tile->num_marker++;
+ /* [MHIX BOX] */
+
+ totlen = cio_read(4);
if (!totlen) totlen = cio_numbytesleft() + 8;
+ partno = cio_read(1);
+ numparts = cio_read(1);
- img.tile[tileno].end_pos=totlen+img.tile[tileno].start_pos; //
+ /* */
+ if (tileno == 0 && partno == 0 )
+ img.Main_head_end = cio_tell() - 7; /* Correction End = First byte of first SOT */
+
+ img.tile[tileno].num_tile = tileno;
+ /* */
+
+ tile->numparts = partno + 1; /* INDEX : Number of tile_parts for the tile */
+ img.num_max_tile_parts = int_max(tile->numparts, img.num_max_tile_parts); /* INDEX : Maximum number of tile_part per tile */
- partno=cio_read(1);
- numparts=cio_read(1);
- j2k_curtileno=tileno;
- j2k_eot=cio_getbp()-12+totlen;
- j2k_state=J2K_STATE_TPH;
- tcp=&j2k_cp->tcps[j2k_curtileno];
- tmp=tcp->tccps;
- *tcp=j2k_default_tcp;
- tcp->tccps=tmp;
- for (i=0; inumcomps; i++) {
- tcp->tccps[i]=j2k_default_tcp.tccps[i];
+ if (partno == 0)
+ {
+ tile->tile_parts = (info_tile_part_t*)malloc(START_NB * sizeof(info_tile_part_t*));
+ tile->Cztile_parts = START_NB;
}
+ if (partno >= tile->Cztile_parts)
+ {
+ tilepart_tmp = (info_tile_part_t*)malloc((INCREMENT + tile->Cztile_parts) * sizeof(info_tile_part_t));
+ memcpy(tmp, tile->tile_parts, tile->Cztile_parts);
+ tile->Cztile_parts += INCREMENT;
+ free(tile->tile_parts);
+ tile->tile_parts = tilepart_tmp;
+ }
+
+ tile->tile_parts[partno].start_pos = cio_tell() - 12; /* INDEX : start_pos of the tile_part */
+ tile->tile_parts[partno].length = totlen; /* INDEX : length of the tile_part */
+ tile->tile_parts[partno].end_pos = totlen + cio_tell() - 12; /* INDEX : end position of the tile_part */
+
+
+ j2k_curtileno = tileno;
+ j2k_eot = cio_getbp() - 12 + totlen;
+ j2k_state = J2K_STATE_TPH;
+ tcp = &j2k_cp->tcps[j2k_curtileno];
+
+ tile->tile_parts[numparts].num_reso_AUX = tcp->tccps[0].numresolutions; /* INDEX : AUX value for TPIX */
+
+ if (partno == 0)
+ // if (tcp->first == 1)
+ {
+ tmp = tcp->tccps;
+ *tcp = j2k_default_tcp;
+ /* Initialization PPT */
+ tcp->ppt = 0;
+ tcp->ppt_data = NULL;
+
+ tcp->tccps = tmp;
+ for (i = 0; i < j2k_img->numcomps; i++) {
+ tcp->tccps[i] = j2k_default_tcp.tccps[i];
+ }
+ //j2k_cp->tcps[j2k_curtileno].first=0;
+ }
}
-void j2k_read_sod() {
- int len;
- unsigned char *data;
- img.tile[j2k_curtileno].end_header=cio_tell()-1; //
- len=int_min(j2k_eot-cio_getbp(), cio_numbytesleft());
- j2k_tile_len[j2k_curtileno]+=len;
- data=(unsigned char*)realloc(j2k_tile_data[j2k_curtileno], j2k_tile_len[j2k_curtileno]);
- memcpy(data, cio_getbp(), len);
- j2k_tile_data[j2k_curtileno]=data;
- cio_skip(len);
- j2k_state=J2K_STATE_TPHSOT;
-
-}
+
void j2k_read_rgn() {
int len, compno, roisty;
j2k_tcp_t *tcp;
- tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;
- len=cio_read(2);
-
- //
- if (j2k_state==J2K_STATE_MH)
+ info_tile_t *tile;
+ info_marker_t *tmp;
+ // fprintf(stderr,"RGN\n");
+ tcp = j2k_state == J2K_STATE_TPH ? &j2k_cp->tcps[j2k_curtileno] : &j2k_default_tcp;
+ len = cio_read(2);
+
+ /* [MHIX BOX]*/
+ if (j2k_state == J2K_STATE_MH)
{
if (!img.marker_mul.num_RGN)
- img.marker_mul.RGN=(info_marker_t*)malloc(sizeof(info_marker_t));
- else
- img.marker_mul.RGN=realloc(img.marker_mul.RGN,(1+img.marker_mul.num_RGN)*sizeof(info_marker_t));
- img.marker_mul.RGN[img.marker_mul.num_RGN].type=J2K_MS_RGN;
- img.marker_mul.RGN[img.marker_mul.num_RGN].start_pos=cio_tell()-2;
- img.marker_mul.RGN[img.marker_mul.num_RGN].len=len;
+ img.marker_mul.RGN = (info_marker_t*)malloc(img.marker_mul.CzRGN * sizeof(info_marker_t));
+ if (img.marker_mul.num_RGN >= img.marker_mul.CzRGN)
+ {
+ tmp = (info_marker_t*)malloc((INCREMENT + img.marker_mul.CzRGN) * sizeof(info_marker_t));
+ memcpy(tmp,img.marker_mul.RGN, img.marker_mul.CzRGN);
+ img.marker_mul.CzRGN += INCREMENT;
+ free(img.marker_mul.RGN);
+ img.marker_mul.RGN = tmp;
+ }
+ img.marker_mul.RGN[img.marker_mul.num_RGN].type = J2K_MS_RGN;
+ img.marker_mul.RGN[img.marker_mul.num_RGN].start_pos = cio_tell() - 2;
+ img.marker_mul.RGN[img.marker_mul.num_RGN].len = len;
img.marker_mul.num_RGN++;
- }
- //
+ } else
+ {
+ tile = &img.tile[j2k_curtileno];
+ if (!tile->marker_mul.num_RGN)
+ tile->marker_mul.RGN = (info_marker_t*)malloc(tile->marker_mul.CzRGN * sizeof(info_marker_t));
+ if (tile->marker_mul.num_RGN >= tile->marker_mul.CzRGN)
+ {
+ tmp = (info_marker_t*)malloc((INCREMENT + tile->marker_mul.CzRGN) * sizeof(info_marker_t));
+ memcpy(tmp,tile->marker_mul.RGN,tile->marker_mul.CzRGN);
+ tile->marker_mul.CzRGN += INCREMENT;
+ free(tile->marker_mul.RGN);
+ tile->marker_mul.RGN = tmp;
+ }
+ tile->marker_mul.RGN[tile->marker_mul.num_RGN].type = J2K_MS_RGN;
+ tile->marker_mul.RGN[tile->marker_mul.num_RGN].start_pos = cio_tell() - 2;
+ tile->marker_mul.RGN[tile->marker_mul.num_RGN].len = len;
+ tile->marker_mul.num_RGN++;
+ }
+ /* [MHIX BOX] */
- compno=cio_read(j2k_img->numcomps<=256?1:2);
- roisty=cio_read(1);
- tcp->tccps[compno].roishift=cio_read(1);
+ compno = cio_read(j2k_img->numcomps <= 256 ? 1 : 2);
+ roisty = cio_read(1);
+ tcp->tccps[compno].roishift = cio_read(1);
+}
+
+
+
+
+
+void j2k_read_sod() {
+ int len;
+ unsigned char *data;
+ info_tile_t *tile;
+ info_tile_part_t *tile_part;
+ // fprintf(stderr,"SOD\n");
+ /* [MHIX BOX] */
+ tile = &img.tile[j2k_curtileno];
+ tile->marker[tile->num_marker].type = J2K_MS_SOD;
+ tile->marker[tile->num_marker].start_pos = cio_tell();
+ tile->marker[tile->num_marker].len = 0;
+ tile->num_marker++;
+ /* [MHIX BOX] */
+
+ tile_part = &tile->tile_parts[tile->numparts - 1]; /* INDEX : Current tilepart of a tile */
+ tile_part->length_header = cio_tell() - 1 - tile_part->start_pos; /* INDEX : length of the tile-part header */
+ tile_part->end_header = cio_tell() - 1; /* INDEX : end header position of the tile-part header */
+
+ len = int_min(j2k_eot - cio_getbp(), cio_numbytesleft());
+
+ j2k_tile_len[j2k_curtileno] += len;
+ data = (unsigned char*)realloc(j2k_tile_data[j2k_curtileno], j2k_tile_len[j2k_curtileno]);
+ memcpy(data, cio_getbp(), len);
+ j2k_tile_data[j2k_curtileno] = data;
+ cio_skip(len);
+ j2k_state = J2K_STATE_TPHSOT;
}
void j2k_read_eoc() {
int tileno;
tcd_init(j2k_img, j2k_cp, &img);
- for (tileno=0; tilenotw*j2k_cp->th; tileno++) {
+ for (tileno = 0; tilenotw * j2k_cp->th; tileno++) {
tcd_decode_tile(j2k_tile_data[tileno], j2k_tile_len[tileno], tileno, &img);
}
- j2k_state=J2K_STATE_MT;
+ j2k_state = J2K_STATE_MT;
longjmp(j2k_error, 1);
-
}
+
+
+
void j2k_read_unk() {
fprintf(stderr, "warning: unknown marker\n");
}
-int j2k_index_JPIP(char *Idx_file, char *J2K_file, int len){
+
+
+
+int j2k_index_JPIP(char *Idx_file, char *J2K_file, int len, int version){
FILE *dest;
char *index;
int pos_iptr, end_pos;
@@ -576,12 +1017,12 @@ int j2k_index_JPIP(char *Idx_file, char *J2K_file, int len){
dest=fopen(Idx_file, "wb");
if (!dest) {
- fprintf(stderr,"Failed to open %s for reading !!\n",Idx_file);
+ fprintf(stderr, "Failed to open %s for reading !!\n", Idx_file);
return 0;
}
- // INDEX MODE JPIP
- index=(char*)malloc(len);
+ /* INDEX MODE JPIP */
+ index = (char*)malloc(len);
cio_init(index, len);
jp2_write_jp();
jp2_write_ftyp();
@@ -590,22 +1031,24 @@ int j2k_index_JPIP(char *Idx_file, char *J2K_file, int len){
jp2_write_dbtl(Idx_file);
pos_iptr=cio_tell();
- cio_skip(24); // IPTR further !
+ cio_skip(24); /* IPTR further ! */
- pos_jp2c=cio_tell();
- len_jp2c=jp2_write_jp2c(J2K_file);
-
- pos_cidx=cio_tell();
- len_cidx=jpip_write_cidx(pos_jp2c+8,img, j2k_cp); // Correction len_jp2C --> pos_jp2c+8
+ pos_jp2c = cio_tell();
+ len_jp2c = jp2_write_jp2c(J2K_file);
+
+ pos_cidx = cio_tell();
+ len_cidx = jpip_write_cidx(pos_jp2c + 8,img, j2k_cp, version); /* Correction len_jp2C --> pos_jp2c + 8 */
+
- pos_fidx=cio_tell();
- len_fidx=jpip_write_fidx(pos_jp2c, len_jp2c, pos_cidx, len_cidx);
-
- end_pos=cio_tell();
+ pos_fidx = cio_tell();
+ len_fidx = jpip_write_fidx(pos_jp2c, len_jp2c, pos_cidx, len_cidx);
+
+end_pos = cio_tell();
+
cio_seek(pos_iptr);
jpip_write_iptr(pos_fidx,len_fidx);
cio_seek(end_pos);
-
+
fwrite(index, 1, cio_tell(), dest);
free(index);
@@ -646,38 +1089,38 @@ j2k_dec_mstabent_t j2k_dec_mstab[]={
j2k_dec_mstabent_t *j2k_dec_mstab_lookup(int id) {
j2k_dec_mstabent_t *e;
- for (e=j2k_dec_mstab; e->id!=0; e++) {
- if (e->id==id) {
+ for (e = j2k_dec_mstab; e->id != 0; e++) {
+ if (e->id == id) {
break;
}
}
return e;
}
-LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t **image, j2k_cp_t **cp) {
+int j2k_decode(unsigned char *src, int len, j2k_image_t **image, j2k_cp_t **cp) {
if (setjmp(j2k_error)) {
- if (j2k_state!=J2K_STATE_MT) {
+ if (j2k_state != J2K_STATE_MT) {
fprintf(stderr, "WARNING: incomplete bitstream\n");
return 0;
}
return cio_numbytes();
}
- j2k_img=(j2k_image_t*)malloc(sizeof(j2k_image_t));
- j2k_cp=(j2k_cp_t*)malloc(sizeof(j2k_cp_t));
- *image=j2k_img;
- *cp=j2k_cp;
- j2k_state=J2K_STATE_MHSOC;
+ j2k_img = (j2k_image_t*)calloc(1, sizeof(j2k_image_t));
+ j2k_cp = (j2k_cp_t*)calloc(1, sizeof(j2k_cp_t));
+ *image = j2k_img;
+ *cp = j2k_cp;
+ j2k_state = J2K_STATE_MHSOC;
cio_init(src, len);
for (;;) {
j2k_dec_mstabent_t *e;
- int id=cio_read(2);
- if (id>>8!=0xff) {
- fprintf(stderr, "%.8x: expected a marker instead of %x\n", cio_tell()-2, id);
+ int id = cio_read(2);
+ if (id >> 8 != 0xff) {
+ fprintf(stderr, "%.8x: expected a marker instead of %x\n", cio_tell() - 2, id);
return 0;
}
- e=j2k_dec_mstab_lookup(id);
+ e = j2k_dec_mstab_lookup(id);
if (!(j2k_state & e->states)) {
- fprintf(stderr, "%.8x: unexpected marker %x\n", cio_tell()-2, id);
+ fprintf(stderr, "%.8x: unexpected marker %x\n", cio_tell() - 2, id);
return 0;
}
if (e->handler) {
@@ -687,6 +1130,7 @@ LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t **image, j2k_
}
+
#ifdef WIN32
#include
@@ -702,10 +1146,6 @@ BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserve
}
#endif
-
-extern info_image_t img;
-
-
int main(int argc, char **argv)
{
FILE *src;
@@ -713,53 +1153,67 @@ int main(int argc, char **argv)
char *j2kfile;
j2k_image_t *imgg;
j2k_cp_t *cp;
+ int version;
- if (argc!=3)
+ if (argc != 4)
{
- fprintf(stderr,"\nERROR in entry : index_create J2K-file Idx-file\n\n");
- return 0;
+ fprintf(stderr,"\nERROR in entry : index_create J2K-file Idx-file version\n\nVersion : 0, 1, 2 or 3\n\n");
+ return 1;
}
src=fopen(argv[1], "rb");
if (!src) {
- fprintf(stderr,"Failed to open %s for reading !!\n",argv[1]);
- return 0;
+ fprintf(stderr, "Failed to open %s for reading !!\n", argv[1]);
+ return 1;
}
- // length of the codestream
+ /* length of the codestream */
fseek(src, 0, SEEK_END);
- totlen=ftell(src);
+ totlen = ftell(src);
fseek(src, 0, SEEK_SET);
- j2kfile=(char*)malloc(totlen);
+ j2kfile = (char*)malloc(totlen);
fread(j2kfile, 1, totlen, src);
-
- img.marker=(info_marker_t*)malloc(32*sizeof(info_marker_t));
- img.num_marker=0;
- img.marker_mul.num_COD=0;
- img.marker_mul.num_COC=0;
- img.marker_mul.num_RGN=0;
- img.marker_mul.num_QCC=0;
- img.marker_mul.num_TLM=0;
- img.marker_mul.num_PLM=0;
- img.marker_mul.num_COM=0;
+ fclose(src);
- // decode
+ img.marker = (info_marker_t*)malloc(32 * sizeof(info_marker_t));
+ img.num_marker = 0;
+ img.num_max_tile_parts = 0;
+ img.marker_mul.num_COC = 0;
+ img.marker_mul.CzCOC = START_NB;
+ img.marker_mul.num_RGN = 0;
+ img.marker_mul.CzRGN = START_NB;
+ img.marker_mul.num_QCC = 0;
+ img.marker_mul.CzQCC = START_NB;
+ img.marker_mul.num_TLM = 0;
+ img.marker_mul.CzTLM = START_NB;
+ img.marker_mul.num_PLM = 0;
+ img.marker_mul.CzPLM = START_NB;
+ img.marker_mul.num_PPM = 0;
+ img.marker_mul.CzPPM = START_NB;
+ img.marker_mul.num_COM = 0;
+ img.marker_mul.CzCOM = START_NB;
+
+ /* decode */
if (!j2k_decode(j2kfile, totlen, &imgg, &cp)) {
fprintf(stderr, "Index_creator: failed to decode image!\n");
return 1;
}
-
free(j2kfile);
+
+ // fseek(src, 0, SEEK_SET);
+ img.codestream_size = totlen;
+ sscanf(argv[3], "%d", &version);
+ if (version > 3)
+ {
+ fprintf(stderr,"Error : value of version unauthorized !! Value accepted : 0, 1, 2 or 3 !!\n");
+ return 0;
+ }
- fseek(src, 0, SEEK_SET);
- img.codestream_size=totlen;
-
- j2k_index_JPIP(argv[2],argv[1],totlen*2>30000?totlen*2:30000);
-
- fclose(src);
-
+ j2k_index_JPIP(argv[2], argv[1], totlen * 2 > 60000 ? totlen * 2 : 60000, version);
+
j2k_clean();
- return 1;
+ return 0;
}
+
diff --git a/indexer_JPIP/int.c b/indexer_JPIP/int.c
index b7a368f4..29f778c9 100644
--- a/indexer_JPIP/int.c
+++ b/indexer_JPIP/int.c
@@ -1,7 +1,7 @@
/*
* Copyright (c) 2001-2002, David Janssens
* Copyright (c) 2003, Yannick Verschueren
- * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/indexer_JPIP/int.h b/indexer_JPIP/int.h
index 5a1bfd4a..4921ff4d 100644
--- a/indexer_JPIP/int.h
+++ b/indexer_JPIP/int.h
@@ -1,7 +1,7 @@
/*
* Copyright (c) 2001-2002, David Janssens
* Copyright (c) 2003, Yannick Verschueren
- * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
diff --git a/indexer_JPIP/j2k.h b/indexer_JPIP/j2k.h
index e899fae3..e87da5db 100644
--- a/indexer_JPIP/j2k.h
+++ b/indexer_JPIP/j2k.h
@@ -1,7 +1,7 @@
/*
* Copyright (c) 2001-2002, David Janssens
- * Copyright (c) 2003, Yannick Verschueren
- * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -60,40 +60,40 @@
typedef struct
{
- int dx, dy; // XRsiz, YRsiz
- int prec; // precision
- int bpp; // deapth of image in bits
- int sgnd; // signed
- int *data; // image-component data
+ int dx, dy; /* XRsiz, YRsiz */
+ int prec; /* precision */
+ int bpp; /* deapth of image in bits */
+ int sgnd; /* signed */
+ int *data; /* image-component data */
} j2k_comp_t;
typedef struct {
- int x0, y0; // XOsiz, YOsiz
- int x1, y1; // Xsiz, Ysiz
- int numcomps; // number of components
- int index_on; // 0 = no index || 1 = index
- //int PPT;
- j2k_comp_t *comps; // image-components
+ int version;
+ int x0, y0; /* XOsiz, YOsiz */
+ int x1, y1; /* Xsiz, Ysiz */
+ int numcomps; /* number of components */
+ int index_on; /* 0 = no index || 1 = index */
+ j2k_comp_t *comps; /* image-components */
} j2k_image_t;
typedef struct {
- int expn; // exponent
- int mant; // mantissa
+ int expn; /* exponent */
+ int mant; /* mantissa */
} j2k_stepsize_t;
typedef struct {
- int csty; // coding style
- int numresolutions; // number of resolutions
- int cblkw; // width of code-blocks
- int cblkh; // height of code-blocks
- int cblksty; // code-block coding style
- int qmfbid; // discrete wavelet transform identifier
- int qntsty; // quantisation style
- j2k_stepsize_t stepsizes[J2K_MAXBANDS]; // stepsizes used for quantisation
- int numgbits; // number of guard bits
- int roishift; // Region Of Interest shift
- int prcw[J2K_MAXRLVLS]; // Precinct width
- int prch[J2K_MAXRLVLS]; // Precinct height
+ int csty; /* coding style */
+ int numresolutions; /* number of resolutions */
+ int cblkw; /* width of code-blocks */
+ int cblkh; /* height of code-blocks */
+ int cblksty; /* code-block coding style */
+ int qmfbid; /* discrete wavelet transform identifier */
+ int qntsty; /* quantisation style */
+ j2k_stepsize_t stepsizes[J2K_MAXBANDS]; /* stepsizes used for quantisation */
+ int numgbits; /* number of guard bits */
+ int roishift; /* Region of Interest shift */
+ int prcw[J2K_MAXRLVLS]; /* Precinct width */
+ int prch[J2K_MAXRLVLS]; /* Precinct height */
} j2k_tccp_t;
typedef struct {
@@ -105,118 +105,185 @@ typedef struct {
} j2k_poc_t;
typedef struct {
- int csty; // coding style
- int prg; // progression order
- int numlayers; // number of layers
- int mct; // multi-component transform identifier
- int rates[100]; // rates of layers
- int numpocs; // number of progression order changes
- j2k_poc_t pocs[32]; // progression order changes
- j2k_tccp_t *tccps; // tile-component coding parameters
+ //int first;
+ int csty; /* coding style */
+ int prg; /* progression order */
+ int numlayers; /* number of layers */
+ int mct; /* multi-component transform identifier */
+ int rates[100]; /* rates of layers */
+ int numpocs; /* number of progression order changes */
+ int POC; /* Precise if a POC marker has been used O:NO, 1:YES */
+ j2k_poc_t pocs[32]; /* progression order changes */
+ unsigned char *ppt_data; /* packet header store there for futur use in t2_decode_packet */
+ int ppt; /* If ppt == 1 --> there was a PPT marker for the present tile */
+ int ppt_store; /* Use in case of multiple marker PPT (number of info already store) */
+ j2k_tccp_t *tccps; /* tile-component coding parameters */
} j2k_tcp_t;
typedef struct {
- int tx0, ty0; // XTOsiz, YTOsiz
- int tdx, tdy; // XTsiz, YTsiz
- int tw, th;
- j2k_tcp_t *tcps; // tile coding parameters
+ int tx0, ty0; /* XTOsiz, YTOsiz */
+ int tdx, tdy; /* XTsiz, YTsiz */
+ int tw, th;
+ unsigned char *ppm_data; /* packet header store there for futur use in t2_decode_packet */
+ int ppm; /* If ppm == 1 --> there was a PPM marker for the present tile */
+ int ppm_store; /* Use in case of multiple marker PPM (number of info already store) */
+ int ppm_previous; /* Use in case of multiple marker PPM (case on non-finished previous info) */
+ j2k_tcp_t *tcps; /* tile coding parameters */
} j2k_cp_t;
+
+
+
+
+/* Packet information : Layer level */
typedef struct {
- int len;
- int len_header;
- int offset;
+ int len; /* Length of the body of the packet */
+ int len_header; /* Length of the header of the packet */
+ int offset; /* Offset of the body of the packet */
+ int offset_header; /* Offset of the header of the packet */
} info_layer_t;
+
+/* Access to packet information : precinct level */
typedef struct {
info_layer_t *layer;
} info_prec_t;
+
+/* Access to packet information : resolution level */
typedef struct {
info_prec_t *prec;
} info_reso_t;
+
+/* Access to packet information : component level */
typedef struct {
info_reso_t *reso;
} info_compo_t;
-typedef struct {
- int num_tile; // Number of Tile
- int start_pos; // Start position
- int end_header; // End position of the header
- int end_pos; // End position
- int pw, ph; // number of precinct by tile
- int num_packet; // number of packet in the tile
- info_compo_t *compo; // component [packet]
-} info_tile_t; // index struct
+/* Information about the marker */
typedef struct {
- int type; // type of marker [SIZ, QCD, POC, PPM, CRG] appearing only once
- int start_pos; // Start position of the marker
- int len; // Length of the marker
-} info_marker_t; // index struct
+ int type; /* type of marker [SIZ, QCD, POC, PPM, CRG, COD] appearing only once */
+ int start_pos; /* Start position of the marker */
+ int len; /* Length of the marker */
+} info_marker_t;
+
+/* Multiple marker in tile header */
typedef struct{
- info_marker_t *COD;
- int num_COD;
- info_marker_t *COC;
- int num_COC;
- info_marker_t *RGN;
- int num_RGN;
- info_marker_t *QCC;
- int num_QCC;
- info_marker_t *TLM;
- int num_TLM;
- info_marker_t *PLM;
- int num_PLM;
- info_marker_t *PPM;
- int num_PPM;
- info_marker_t *COM;
- int num_COM;
-} info_marker_mul_t; // index struct
+ info_marker_t *COC; /* COC markers */
+ int num_COC; /* Number of COC marker */
+ int CzCOC; /* Current size of the vector COC */
+
+ info_marker_t *RGN; /* RGN markers */
+ int num_RGN; /* Number of RGN marker */
+ int CzRGN; /* Current size of the vector RGN */
+
+ info_marker_t *QCC; /* QCC markers */
+ int num_QCC; /* Number of QCC marker */
+ int CzQCC; /* Current size of the vector QCC */
+
+ info_marker_t *PLT; /* PLT markers */
+ int num_PLT; /* Number of PLT marker */
+ int CzPLT; /* Current size of the vector PLT */
+
+ info_marker_t *PPT; /* PPT markers */
+ int num_PPT; /* Number of PPT marker */
+ int CzPPT; /* Current size of the vector PPT */
+
+ info_marker_t *COM; /* COM markers */
+ int num_COM; /* Number of COM marker */
+ int CzCOM; /* Current size of the vector COC */
+} info_marker_mul_tile_t;
+
+/* Information about each tile_part for a particulary tile */
+typedef struct{
+ int start_pos; /* Start position of the tile_part */
+ int length; /* Length of the tile_part header + body */
+ int length_header; /* Length of the header */
+ int end_pos; /* End position of the tile part */
+ int end_header; /* End position of the tile part header */
+
+ int num_reso_AUX; /* Number of resolution level completed */
+} info_tile_part_t;
+
+
+/* Information about each tile */
typedef struct {
- int index_on;
- int num; // numero of packet
- int index_write; // writing the packet inthe index with t2_encode_packets
- int Im_w, Im_h; // Image width and Height
- int Prog; // progression order
- int Tile_x, Tile_y; // Number of Tile in X and Y
+ int num_tile; /* Number of Tile */
+ int pw, ph; /* number of precinct by tile */
+ int num_packet; /* number of packet in the tile */
+ info_compo_t *compo; /* component [packet] */
+
+ info_marker_t *marker; /* information concerning markers inside image [only one apparition] */
+ info_marker_mul_tile_t marker_mul; /* information concerning markers inside image [multiple apparition] */
+ int num_marker; /* number of marker */
+
+ int numparts; /* number of tile_part for this tile */
+ info_tile_part_t *tile_parts; /* Information about each tile_part */
+ int Cztile_parts; /* Current size of the tile_parts vector */
+} info_tile_t; /* index struct */
+
+
+/* Multiple marker in main header */
+typedef struct{
+ info_marker_t *COC; /* COC markers */
+ int num_COC; /* Number of COC marker */
+ int CzCOC; /* Current size of the vector COC */
+
+ info_marker_t *RGN; /* RGN markers */
+ int num_RGN; /* Number of RGN marker */
+ int CzRGN; /* Current size of the vector RGN */
+
+ info_marker_t *QCC; /* QCC markers */
+ int num_QCC; /* Number of QCC marker */
+ int CzQCC; /* Current size of the vector QCC */
+
+ info_marker_t *TLM; /* TLM markers */
+ int num_TLM; /* Number of TLM marker */
+ int CzTLM; /* Current size of the vector TLM */
+
+ info_marker_t *PLM; /* PLM markers */
+ int num_PLM; /* Number of PLM marker */
+ int CzPLM; /* Current size of the vector PLM */
+
+ info_marker_t *PPM; /* PPM markers */
+ int num_PPM; /* Number of PPM marker */
+ int CzPPM; /* Current size of the vector PPM */
+
+ info_marker_t *COM; /* COM markers */
+ int num_COM; /* Number of COM marker */
+ int CzCOM; /* Current size of the vector COM */
+} info_marker_mul_t; /* index struct */
+
+
+/* Information about image */
+typedef struct {
+ int Im_w, Im_h; /* Image width and Height */
+ int Tile_x, Tile_y; /* Number of Tile in X and Y */
int tw, th;
- int Comp; // Component numbers
- int Layer; // number of layer
- int Decomposition; // number of decomposition
- int pw, ph; // nombre precinct in X and Y
- int pdx, pdy; // size of precinct in X and Y
- int Main_head_end; // Main header position
- int codestream_size; // codestream's size
- info_tile_t *tile; // information concerning tiles inside image
- info_marker_t *marker; // information concerning markers inside image [only one apparition]
- info_marker_mul_t marker_mul; // information concerning markers inside image [multiple apparition]
- int num_marker; // number of marker
- int num_packet_max; // MAximum number of packet
-} info_image_t; // index struct
+ int pw, ph; /* nombre precinct in X and Y */
+ int pdx, pdy; /* size of precinct in X and Y */
+ int Prog; /* progression order */
+ int Comp; /* Component numbers */
+ int Layer; /* number of layer */
+ int Decomposition; /* number of decomposition */
+ int Main_head_end; /* Main header position */
+ int codestream_size; /* codestream's size */
-/*
- * Encode an image into a JPEG-2000 codestream
- * i: image to encode
- * cp: coding parameters
- * dest: destination buffer
- * len: length of destination buffer
- * index : index file name
- */
-LIBJ2K_API int j2k_encode(j2k_image_t *i, j2k_cp_t *cp,char *outfile, int len,char *index);
+ info_marker_t *marker; /* information concerning markers inside image [only one apparition] */
+ info_marker_mul_t marker_mul; /* information concerning markers inside image [multiple apparition] */
+ int num_marker; /* number of marker */
+
+ int num_packet_max; /* Maximum number of packet */
+
+ int num_max_tile_parts; /* Maximum number of tile-part */
+ info_tile_t *tile; /* information concerning tiles inside image */
+} info_image_t; /* index struct */
-//LIBJ2K_API int j2k_encode(j2k_image_t *i, j2k_cp_t *cp,unsigned char *dest, int len);
-/*
- * Decode an image from a JPEG-2000 codestream
- * src: source buffer
- * len: length of source buffer
- * i: decode image
- * cp: coding parameters that were used to encode the image
- */
-LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t **i, j2k_cp_t **cp);
#endif
diff --git a/indexer_JPIP/jp2.c b/indexer_JPIP/jp2.c
index 5588c868..1c193ad7 100644
--- a/indexer_JPIP/jp2.c
+++ b/indexer_JPIP/jp2.c
@@ -1,6 +1,6 @@
/*
- * Copyright (c) 2003, Yannick Verschueren
- * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -28,9 +28,6 @@
#include
#include
#include
-#include
-#include
-#include
#include "j2k.h"
#include "cio.h"
@@ -176,13 +173,19 @@ void jp2_write_colr(int BPC_ok, j2k_image_t *j2k_img)
cio_seek(lenp+len);
}
+/*
+ * Write the JP2H box
+ *
+ * JP2 Header box
+ *
+ */
void jp2_write_jp2h(j2k_image_t *j2k_img)
{
int len, lenp, BPC_ok;
lenp=cio_tell();
cio_skip(4);
- cio_write(JP2_JP2H, 4); // JP2H
+ cio_write(JP2_JP2H, 4); /* JP2H */
BPC_ok=jp2_write_ihdr(j2k_img);
@@ -192,29 +195,53 @@ void jp2_write_jp2h(j2k_image_t *j2k_img)
len=cio_tell()-lenp;
cio_seek(lenp);
- cio_write(len,4); // L
+ cio_write(len,4); /* L */
cio_seek(lenp+len);
}
+/*
+ * Write the FTYP box
+ *
+ * File type box
+ *
+ */
void jp2_write_ftyp()
{
int len, lenp;
lenp=cio_tell();
cio_skip(4);
- cio_write(JP2_FTYP, 4); // FTYP
+ cio_write(JP2_FTYP, 4); /* FTYP */
- cio_write(JP2,4); // BR
- cio_write(0,4); // MinV
- cio_write(JP2,4); // CL0 : JP2
- cio_write(JPIP_JPIP,4); // CL1 : JPIP
+ cio_write(JP2,4); /* BR */
+ cio_write(0,4); /* MinV */
+ cio_write(JP2,4); /* CL0 : JP2 */
+ cio_write(JPIP_JPIP,4); /* CL1 : JPIP */
len=cio_tell()-lenp;
cio_seek(lenp);
- cio_write(len,4); // L
+ cio_write(len,4); /* L */
cio_seek(lenp+len);
}
+/*
+ * Read the FTYP box
+ *
+ * File type box
+ *
+ */
+void jp2_read_ftyp(int length)
+{
+ int BR, MinV, type, i;
+
+ BR = cio_read(4); /* BR */
+ MinV = cio_read(4); /* MinV */
+ length-=8;
+
+ for (i=length/4;i>0;i--)
+ type = cio_read(4); /* CLi : JP2, JPIP */
+}
+
int jp2_write_jp2c(char *J2K_file)
{
int len, lenp, totlen, i;
@@ -257,3 +284,18 @@ void jp2_write_jp()
cio_write(len,4); // L
cio_seek(lenp+len);
}
+
+/*
+ * Read the JP box
+ *
+ * JPEG 2000 signature
+ *
+ * return 1 if error else 0
+ */
+int jp2_read_jp()
+{
+ if (0x0d0a870a!=cio_read(4))
+ return 1;
+ else
+ return 0;
+}
diff --git a/indexer_JPIP/jp2.h b/indexer_JPIP/jp2.h
index 2bdf09a4..d5510f5a 100644
--- a/indexer_JPIP/jp2.h
+++ b/indexer_JPIP/jp2.h
@@ -24,6 +24,8 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
+#ifndef __JP2_H
+#define __JP2_H
#include "j2k.h"
@@ -38,3 +40,5 @@ void jp2_write_ftyp();
int jp2_write_jp2c(char *J2K_file);
void jp2_write_jp();
+
+#endif
diff --git a/indexer_JPIP/jpip.c b/indexer_JPIP/jpip.c
index f6bdade2..1e43a876 100644
--- a/indexer_JPIP/jpip.c
+++ b/indexer_JPIP/jpip.c
@@ -1,6 +1,6 @@
/*
- * Copyright (c) 2003, Yannick Verschueren
- * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * Copyright (c) 2003-2004, Yannick Verschueren
+ * Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -37,187 +37,355 @@
#include "tcd.h"
#include "int.h"
-#define JPIP_CIDX 0x63696478
-#define JPIP_CPTR 0x63707472
-#define JPIP_MANF 0x6d616e66
-#define JPIP_FAIX 0x66616978
-#define JPIP_MHIX 0x6d686978
-#define JPIP_TPIX 0x74706978
-#define JPIP_THIX 0x74686978
-#define JPIP_PPIX 0x70706978
-#define JPIP_PHIX 0x70686978
-#define JPIP_FIDX 0x66696478
-#define JPIP_FPTR 0x66707472
-#define JPIP_PRXY 0x70727879
-#define JPIP_IPTR 0x69707472
+#define JPIP_CIDX 0x63696478 /* Codestream index */
+#define JPIP_CPTR 0x63707472 /* Codestream Finder Box */
+#define JPIP_MANF 0x6d616e66 /* Manifest Box */
+#define JPIP_FAIX 0x66616978 /* Fragment array Index box */
+#define JPIP_MHIX 0x6d686978 /* Main Header Index Table */
+#define JPIP_TPIX 0x74706978 /* Tile-part Index Table box */
+#define JPIP_THIX 0x74686978 /* Tile header Index Table box */
+#define JPIP_PPIX 0x70706978 /* Precinct Packet Index Table box */
+#define JPIP_PHIX 0x70686978 /* Packet Header index Table */
+#define JPIP_FIDX 0x66696478 /* File Index */
+#define JPIP_FPTR 0x66707472 /* File Finder */
+#define JPIP_PRXY 0x70727879 /* Proxy boxes */
+#define JPIP_IPTR 0x69707472 /* Index finder box */
+#define JPIP_PHLD 0x70686c64 /* Place holder */
#define JP2C 0x6a703263
-static info_marker_t marker_jpip[32], marker_local_jpip[32]; // SIZE to precise !
-static int num_marker_jpip, num_marker_local_jpip;
+//static info_marker_t marker_jpip[32], marker_local_jpip[32]; /* SIZE to precise ! */
+//static int num_marker_jpip, num_marker_local_jpip;
-void jpip_write_cptr(int offset, info_image_t img) // Codestream finder box (box)
+/*
+ * Write the CPTR box
+ *
+ * Codestream finder box (box)
+ *
+ */
+void jpip_write_cptr(int offset, info_image_t img)
{
int len, lenp;
lenp=cio_tell();
- cio_skip(4); // L [at the end]
- cio_write(JPIP_CPTR,4); // T
- cio_write(0,2); // DR A PRECISER !!
- cio_write(0,2); // CONT
- cio_write(offset,8); // COFF A PRECISER !!
- cio_write(img.codestream_size,8); // CLEN
+ cio_skip(4); /* L [at the end] */
+ cio_write(JPIP_CPTR,4); /* T */
+ cio_write(0,2); /* DR A PRECISER !! */
+ cio_write(0,2); /* CONT */
+ cio_write(offset,8); /* COFF A PRECISER !! */
+ cio_write(img.codestream_size,8); /* CLEN */
len=cio_tell()-lenp;
cio_seek(lenp);
- cio_write(len, 4); // L
+ cio_write(len, 4); /* L */
cio_seek(lenp+len);
}
-void jpip_write_manf(int second, int v, info_marker_t *marker) // Manifest box (box)
+/*
+ * Read the CPTR box
+ *
+ * Codestream finder box (box)
+ *
+ */
+void jpip_read_cptr()
+{
+ int DR, CONT;
+ long long Coff, codestream_size;
+
+ DR = cio_read(2); /* DR */
+ CONT = cio_read(2); /* CONT */
+ Coff = cio_read(8); /* COFF */
+ codestream_size = cio_read(8); /* CLEN */
+}
+
+/*
+ * Write the MANF box
+ *
+ * Manifest box (box)
+ *
+ */
+void jpip_write_manf(int second, int v, info_marker_t *marker)
{
int len, lenp, i;
lenp=cio_tell();
- cio_skip(4); // L [at the end]
- cio_write(JPIP_MANF,4); // T
+ cio_skip(4); /* L [at the end] */
+ cio_write(JPIP_MANF,4); /* T */
- if (second) // Write only during the second pass
+ if (second) /* Write only during the second pass */
{
for(i=0;i= 0; i--) /* COC */
+ {
+ cio_write(img.marker_mul.COC[i].type, 2);
+ cio_write(i, 2);
+ cio_write(img.marker_mul.COC[i].start_pos, 8);
+ cio_write(img.marker_mul.COC[i].len, 2);
+ }
+
+ for(i = img.marker_mul.num_RGN - 1; i >= 0; i--) /* RGN */
+ {
+ cio_write(img.marker_mul.RGN[i].type, 2);
+ cio_write(i, 2);
+ cio_write(img.marker_mul.RGN[i].start_pos, 8);
+ cio_write(img.marker_mul.RGN[i].len, 2);
+ }
+
+ for(i = img.marker_mul.num_QCC - 1; i >= 0; i--) /* QCC */
+ {
+ cio_write(img.marker_mul.QCC[i].type, 2);
+ cio_write(i, 2);
+ cio_write(img.marker_mul.QCC[i].start_pos, 8);
+ cio_write(img.marker_mul.QCC[i].len, 2);
+ }
+
+ for(i = img.marker_mul.num_TLM - 1; i >= 0; i--) /* TLM */
+ {
+ cio_write(img.marker_mul.TLM[i].type, 2);
+ cio_write(i, 2);
+ cio_write(img.marker_mul.TLM[i].start_pos, 8);
+ cio_write(img.marker_mul.TLM[i].len, 2);
+ }
+
+ for(i = img.marker_mul.num_PLM - 1; i >= 0; i--) /* PLM */
+ {
+ cio_write(img.marker_mul.PLM[i].type, 2);
+ cio_write(i, 2);
+ cio_write(img.marker_mul.PLM[i].start_pos, 8);
+ cio_write(img.marker_mul.PLM[i].len, 2);
+ }
+
+ for(i = img.marker_mul.num_PPM - 1; i >= 0; i--) /* PPM */
+ {
+ cio_write(img.marker_mul.PPM[i].type, 2);
+ cio_write(i, 2);
+ cio_write(img.marker_mul.PPM[i].start_pos, 8);
+ cio_write(img.marker_mul.PPM[i].len, 2);
+ }
+
+ for(i = img.marker_mul.num_COM - 1; i >= 0; i--) /* COM */
+ {
+ cio_write(img.marker_mul.COM[i].type, 2);
+ cio_write(i, 2);
+ cio_write(img.marker_mul.COM[i].start_pos, 8);
+ cio_write(img.marker_mul.COM[i].len, 2);
+ }
+ }
+ else /* TILE HEADER */
+ {
+ tile = &img.tile[tileno];
+ cio_write(tile->tile_parts[0].length_header, 8); /* TLEN */
+
+ for(i = 0; i < tile->num_marker; i++) /* Marker restricted to 1 apparition */
+ {
+ cio_write(tile->marker[i].type, 2);
+ cio_write(0, 2);
+ cio_write(tile->marker[i].start_pos, 8);
+ cio_write(tile->marker[i].len, 2);
+ }
+
+ /* Marker NOT restricted to 1 apparition */
+ for(i = tile->marker_mul.num_COC - 1; i >= 0; i--) /* COC */
+ {
+ cio_write(tile->marker_mul.COC[i].type, 2);
+ cio_write(i, 2);
+ cio_write(tile->marker_mul.COC[i].start_pos, 8);
+ cio_write(tile->marker_mul.COC[i].len, 2);
+ }
+
+ for(i = tile->marker_mul.num_RGN - 1; i >= 0; i--) /* RGN */
+ {
+ cio_write(tile->marker_mul.RGN[i].type, 2);
+ cio_write(i, 2);
+ cio_write(tile->marker_mul.RGN[i].start_pos, 8);
+ cio_write(tile->marker_mul.RGN[i].len, 2);
+ }
+
+ for(i = tile->marker_mul.num_QCC - 1; i >= 0; i--) /* QCC */
+ {
+ cio_write(tile->marker_mul.QCC[i].type, 2);
+ cio_write(i, 2);
+ cio_write(tile->marker_mul.QCC[i].start_pos, 8);
+ cio_write(tile->marker_mul.QCC[i].len, 2);
+ }
+
+ for(i = tile->marker_mul.num_PLT - 1; i >= 0; i--) /* PLT */
+ {
+ cio_write(tile->marker_mul.PLT[i].type,2);
+ cio_write(i,2);
+ cio_write(tile->marker_mul.PLT[i].start_pos,8);
+ cio_write(tile->marker_mul.PLT[i].len,2);
+ }
+
+ for(i = tile->marker_mul.num_PPT - 1; i >= 0; i--) /* PPT */
+ {
+ cio_write(tile->marker_mul.PPT[i].type, 2);
+ cio_write(i, 2);
+ cio_write(tile->marker_mul.PPT[i].start_pos, 8);
+ cio_write(tile->marker_mul.PPT[i].len, 2);
+ }
+
+ for(i = tile->marker_mul.num_COM - 1; i >= 0; i--) /* COM */
+ {
+ cio_write(tile->marker_mul.COM[i].type, 2);
+ cio_write(i, 2);
+ cio_write(tile->marker_mul.COM[i].start_pos, 8);
+ cio_write(tile->marker_mul.COM[i].len, 2);
+ }
+ }
- for(i=0;i=0;i--) // COD
- {
- cio_write(img.marker_mul.COD[i].type,2);
- cio_write(i,2);
- cio_write(img.marker_mul.COD[i].start_pos,8);
- cio_write(img.marker_mul.COD[i].len,2);
- }
-
- for(i=img.marker_mul.num_COC-1;i>=0;i--) // COC
- {
- cio_write(img.marker_mul.COC[i].type,2);
- cio_write(i,2);
- cio_write(img.marker_mul.COC[i].start_pos,8);
- cio_write(img.marker_mul.COC[i].len,2);
- }
-
- for(i=img.marker_mul.num_RGN-1;i>=0;i--) // RGN
- {
- cio_write(img.marker_mul.RGN[i].type,2);
- cio_write(i,2);
- cio_write(img.marker_mul.RGN[i].start_pos,8);
- cio_write(img.marker_mul.RGN[i].len,2);
- }
-
- for(i=img.marker_mul.num_QCC-1;i>=0;i--) // QCC
- {
- cio_write(img.marker_mul.QCC[i].type,2);
- cio_write(i,2);
- cio_write(img.marker_mul.QCC[i].start_pos,8);
- cio_write(img.marker_mul.QCC[i].len,2);
- }
-
- for(i=img.marker_mul.num_TLM-1;i>=0;i--) // TLM
- {
- cio_write(img.marker_mul.TLM[i].type,2);
- cio_write(i,2);
- cio_write(img.marker_mul.TLM[i].start_pos,8);
- cio_write(img.marker_mul.TLM[i].len,2);
- }
-
- for(i=img.marker_mul.num_PLM-1;i>=0;i--) // PLM
- {
- cio_write(img.marker_mul.PLM[i].type,2);
- cio_write(i,2);
- cio_write(img.marker_mul.PLM[i].start_pos,8);
- cio_write(img.marker_mul.PLM[i].len,2);
- }
-
- for(i=img.marker_mul.num_COM-1;i>=0;i--) // COM
- {
- cio_write(img.marker_mul.COM[i].type,2);
- cio_write(i,2);
- cio_write(img.marker_mul.COM[i].start_pos,8);
- cio_write(img.marker_mul.COM[i].len,2);
- }
-
len=cio_tell()-lenp;
cio_seek(lenp);
- cio_write(len, 4); // L
+ cio_write(len, 4); /* L */
cio_seek(lenp+len);
-
+
return len;
}
-int jpip_write_faix(int v, int compno, info_image_t img, j2k_cp_t *j2k_cp) // Fragment array Index box
+/*
+ * Read the MHIX box
+ *
+ * Main Header Index Table (box)
+ *
+ */
+void jpip_read_mhix(int len)
{
- int len, lenp, i;
- int version = 0;
+ int i, v, marker_type, marker_start_pos, marker_len, marker_remains;
+
+ v = (len - 8) / 14;
+
+ for (i=0; icompo[compno];
int correction;
+
+ num_packet=0;
+
if(j2k_cp->tcps[tileno].csty&J2K_CP_CSTY_EPH)
correction=3;
else
@@ -231,30 +399,37 @@ int jpip_write_faix(int v, int compno, info_image_t img, j2k_cp_t *j2k_cp) // Fr
for(layno=0;laynolayer[layno];
- cio_write(layer_Idx->offset,version?8:4);
- cio_write((layer_Idx->len_header-correction)?0:layer_Idx->len,version?8:4);
+ cio_write(layer_Idx->offset,(version & 0x01)?8:4); /* start position */
+ cio_write((layer_Idx->len_header-correction)?0:layer_Idx->len,(version & 0x01)?8:4); /* length */
+ if (version & 0x02)
+ cio_write(0,4); /* Aux_i,j : Auxiliary value */
num_packet++;
}
}
}
+ /* PADDING */
+ while (num_packet < img.num_packet_max)
+ {
+ cio_write(0,(version & 0x01)?8:4); /* start position */
+ cio_write(0,(version & 0x01)?8:4); /* length */
+ if (version & 0x02)
+ cio_write(0,4); /* Aux_i,j : Auxiliary value */
+ num_packet++;
+ }
}
- // PADDING
- while (num_packetcompo[compno];
int correction;
+
+ num_packet = 0;
if(j2k_cp->tcps[tileno].csty&J2K_CP_CSTY_EPH)
correction=3;
else
@@ -268,126 +443,209 @@ int jpip_write_faix(int v, int compno, info_image_t img, j2k_cp_t *j2k_cp) // Fr
for(layno=0;laynolayer[layno];
- cio_write(layer_Idx->offset,version?8:4);
- cio_write((layer_Idx->len_header-correction)?0:layer_Idx->len_header,version?8:4);
+ cio_write(layer_Idx->offset_header,(version & 0x01)?8:4); /* start position */
+ cio_write((layer_Idx->len_header-correction)?0:layer_Idx->len_header,(version & 0x01)?8:4); /* length */
+ if (version & 0x02)
+ cio_write(0,4); /* Aux_i,j : Auxiliary value */
num_packet++;
}
}
}
- }
- // PADDING
- while (num_packettw*j2k_cp->th);
+
+ for ( i = 0; i < 2 ; i++ )
+ {
+ if (i) cio_seek(lenp);
+
+ lenp = cio_tell();
+ cio_skip(4); /* L [at the end] */
+ cio_write(JPIP_THIX, 4); /* THIX */
+ jpip_write_manf(i, j2k_cp->tw*j2k_cp->th, marker);
+ num_marker_local_jpip=img.Comp;
+
+ for (tileno = 0; tileno < j2k_cp->tw*j2k_cp->th; tileno++)
+ {
+ marker[tileno].len = jpip_write_mhix(img, 1, tileno);
+ marker[tileno].type = JPIP_MHIX;
+ }
+
+ len=cio_tell()-lenp;
+ cio_seek(lenp);
+ cio_write(len, 4); /* L */
+ cio_seek(lenp+len);
+ }
+
+ free(marker);
return len;
}
-
-int jpip_write_ppix(info_image_t img,j2k_cp_t *j2k_cp) // Precinct Packet Index Table box (superbox)
+/*
+ * Write the PPIX box
+ *
+ * Precinct Packet Index table box (superbox)
+ *
+ */
+int jpip_write_ppix(info_image_t img,j2k_cp_t *j2k_cp)
{
int len, lenp, compno, i;
+ info_marker_t *marker;
+ int num_marker_local_jpip;
+ marker = (info_marker_t*)calloc(sizeof(info_marker_t), img.Comp);
for (i=0;i<2;i++)
{
if (i) cio_seek(lenp);
lenp=cio_tell();
- cio_skip(4); // L [at the end]
- cio_write(JPIP_PPIX, 4); // PPIX
- jpip_write_manf(i,img.Comp,marker_local_jpip);
-
+ cio_skip(4); /* L [at the end] */
+ cio_write(JPIP_PPIX, 4); /* PPIX */
+ jpip_write_manf(i,img.Comp,marker);
num_marker_local_jpip=img.Comp;
for (compno=0; compno
#include
-
-///
-/// Create a packet iterator.
-///
-pi_iterator_t *pi_create(j2k_image_t *img, j2k_cp_t *cp, int tileno) {
- int p, q;
- int compno, resno,pino, layno, precno;
- int maxres=0;
- pi_iterator_t *pi;
- j2k_tcp_t *tcp;
- j2k_tccp_t *tccp;
-
- tcp=&cp->tcps[tileno];
- pi=(pi_iterator_t*)malloc((tcp->numpocs+1)*sizeof(pi_iterator_t));
-
- for (pino=0;pinonumpocs+1;pino++) // change
- {
- p=tileno%cp->tw;
- q=tileno/cp->tw;
-
- pi[pino].tx0=int_max(cp->tx0+p*cp->tdx, img->x0);
- pi[pino].ty0=int_max(cp->ty0+q*cp->tdy, img->y0);
- pi[pino].tx1=int_min(cp->tx0+(p+1)*cp->tdx, img->x1);
- pi[pino].ty1=int_min(cp->ty0+(q+1)*cp->tdy, img->y1);
- pi[pino].numcomps=img->numcomps;
- pi[pino].comps=(pi_comp_t*)malloc(img->numcomps*sizeof(pi_comp_t));
-
- for (compno=0; compnonumcomps; compno++)
- {
- int tcx0, tcy0, tcx1, tcy1;
- pi_comp_t *comp=&pi[pino].comps[compno];
-
- tccp=&tcp->tccps[compno];
- comp->dx=img->comps[compno].dx;
- comp->dy=img->comps[compno].dy;
- comp->numresolutions=tccp->numresolutions;
- comp->resolutions=(pi_resolution_t*)malloc(comp->numresolutions*sizeof(pi_resolution_t));
- tcx0=int_ceildiv(pi->tx0, comp->dx);
- tcy0=int_ceildiv(pi->ty0, comp->dy);
- tcx1=int_ceildiv(pi->tx1, comp->dx);
- tcy1=int_ceildiv(pi->ty1, comp->dy);
- if (comp->numresolutions>maxres) {
- maxres=comp->numresolutions;
- }
- for (resno=0; resnonumresolutions; resno++)
- {
- int levelno;
- int rx0, ry0, rx1, ry1;
- int px0, py0, px1, py1;
- pi_resolution_t *res=&comp->resolutions[resno];
- if (tccp->csty&J2K_CCP_CSTY_PRT) {
- res->pdx=tccp->prcw[resno];
- res->pdy=tccp->prch[resno];
- } else {
- res->pdx=15;
- res->pdy=15;
+
+/* */
+/* Create a packet iterator. */
+/* */
+pi_iterator_t *pi_create(j2k_image_t * img, j2k_cp_t * cp, int tileno)
+{
+ int p, q;
+ int compno, resno, pino;
+ int maxres = 0;
+ pi_iterator_t *pi;
+ j2k_tcp_t *tcp;
+ j2k_tccp_t *tccp;
+
+ tcp = &cp->tcps[tileno];
+ pi = (pi_iterator_t *) malloc((tcp->numpocs + 1) * sizeof(pi_iterator_t));
+
+ for (pino = 0; pino < tcp->numpocs + 1; pino++) { /* change */
+ p = tileno % cp->tw;
+ q = tileno / cp->tw;
+
+ pi[pino].tx0 = int_max(cp->tx0 + p * cp->tdx, img->x0);
+ pi[pino].ty0 = int_max(cp->ty0 + q * cp->tdy, img->y0);
+ pi[pino].tx1 = int_min(cp->tx0 + (p + 1) * cp->tdx, img->x1);
+ pi[pino].ty1 = int_min(cp->ty0 + (q + 1) * cp->tdy, img->y1);
+ pi[pino].numcomps = img->numcomps;
+ pi[pino].comps = (pi_comp_t *) malloc(img->numcomps * sizeof(pi_comp_t));
+
+ for (compno = 0; compno < pi->numcomps; compno++) {
+ int tcx0, tcy0, tcx1, tcy1;
+ pi_comp_t *comp = &pi[pino].comps[compno];
+ tccp = &tcp->tccps[compno];
+ comp->dx = img->comps[compno].dx;
+ comp->dy = img->comps[compno].dy;
+ comp->numresolutions = tccp->numresolutions;
+ comp->resolutions =
+ (pi_resolution_t *) malloc(comp->numresolutions *
+ sizeof(pi_resolution_t));
+ tcx0 = int_ceildiv(pi->tx0, comp->dx);
+ tcy0 = int_ceildiv(pi->ty0, comp->dy);
+ tcx1 = int_ceildiv(pi->tx1, comp->dx);
+ tcy1 = int_ceildiv(pi->ty1, comp->dy);
+ if (comp->numresolutions > maxres) {
+ maxres = comp->numresolutions;
+ }
+ for (resno = 0; resno < comp->numresolutions; resno++) {
+ int levelno;
+ int rx0, ry0, rx1, ry1;
+ int px0, py0, px1, py1;
+ pi_resolution_t *res = &comp->resolutions[resno];
+ if (tccp->csty & J2K_CCP_CSTY_PRT) {
+ res->pdx = tccp->prcw[resno];
+ res->pdy = tccp->prch[resno];
+ } else {
+ res->pdx = 15;
+ res->pdy = 15;
+ }
+ levelno = comp->numresolutions - 1 - resno;
+ rx0 = int_ceildivpow2(tcx0, levelno);
+ ry0 = int_ceildivpow2(tcy0, levelno);
+ rx1 = int_ceildivpow2(tcx1, levelno);
+ ry1 = int_ceildivpow2(tcy1, levelno);
+ px0 = int_floordivpow2(rx0, res->pdx) << res->pdx;
+ py0 = int_floordivpow2(ry0, res->pdy) << res->pdy;
+ px1 = int_ceildivpow2(rx1, res->pdx) << res->pdx;
+ py1 = int_ceildivpow2(ry1, res->pdy) << res->pdy;
+ res->pw = (px1 - px0) >> res->pdx;
+ res->ph = (py1 - py0) >> res->pdy;
+ }
}
- levelno=comp->numresolutions-1-resno;
- rx0=int_ceildivpow2(tcx0, levelno);
- ry0=int_ceildivpow2(tcy0, levelno);
- rx1=int_ceildivpow2(tcx1, levelno);
- ry1=int_ceildivpow2(tcy1, levelno);
- px0=int_floordivpow2(rx0, res->pdx)<pdx;
- py0=int_floordivpow2(ry0, res->pdy)<pdy;
- px1=int_ceildivpow2(rx1, res->pdx)<pdx;
- py1=int_ceildivpow2(ry1, res->pdy)<pdy;
- res->pw=(px1-px0)>>res->pdx;
- res->ph=(py1-py0)>>res->pdy;
- }
- }
-
- for (layno=0; layno<10; layno++)
- {
- for (resno=0; resno<10; resno++)
- {
- for (compno=0; compno<3; compno++)
- {
- for (precno=0; precno<99; precno++)
- {
- pi[pino].include[layno][resno][compno][precno]=0;
- }
- }
- }
- }
-
- if (pino==tcp->numpocs)
- {
- 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=img->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;
+
+ tccp = &tcp->tccps[0];
+ pi[pino].step_p=1;
+ pi[pino].step_c=100*pi[pino].step_p;
+ pi[pino].step_r=img->numcomps*pi[pino].step_c;
+ pi[pino].step_l=maxres*pi[pino].step_r;
+
+ if (pino==0)
+ pi[pino].include=(short int*)calloc(img->numcomps*maxres*tcp->numlayers*100,sizeof(short int));
+ else
+ pi[pino].include=pi[pino-1].include;
+
+ /*if (pino == tcp->numpocs) {*/
+ 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 = img->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;
}
-///
-/// Get next packet in layer=resolution-component-precinct order.
-///
-int pi_next_lrcp(pi_iterator_t *pi) {
- pi_comp_t *comp;
- pi_resolution_t *res;
+/* */
+/* Get next packet in layer=resolution-component-precinct order. */
+/* */
+int pi_next_lrcp(pi_iterator_t * pi)
+{
+ pi_comp_t *comp;
+ pi_resolution_t *res;
- if (!pi->first)
- {
- comp=&pi->comps[pi->compno];
- res=&comp->resolutions[pi->resno];
- goto skip;
- } else {
- pi->first=0;
- }
- for (pi->layno=0; pi->laynopoc.layno1; pi->layno++)
- {
- for (pi->resno=pi->poc.resno0; pi->resnopoc.resno1; pi->resno++)
- {
- for (pi->compno=pi->poc.compno0; pi->compnopoc.compno1; pi->compno++)
- {
+ if (!pi->first) {
+ comp = &pi->comps[pi->compno];
+ res = &comp->resolutions[pi->resno];
+ goto 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->numresolutions) {
- comp=&pi->comps[pi->compno];
- if (pi->resno>=comp->numresolutions)
- {
-
- continue;
- }
- res=&comp->resolutions[pi->resno];
-
- for (pi->precno=0; pi->precnopw*res->ph; pi->precno++)
- {
-
- if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno])
- {
- pi->include[pi->layno][pi->resno][pi->compno][pi->precno]=1;
- return 1;
- }
- skip: ;
- }
- }
- }
- }
- return 0;
-}
-
-///
-/// Get next packet in resolution-layer-component-precinct order.
-///
-int pi_next_rlcp(pi_iterator_t *pi) {
- pi_comp_t *comp;
- pi_resolution_t *res;
- if (!pi->first) {
- comp=&pi->comps[pi->compno];
- res=&comp->resolutions[pi->resno];
- goto skip;
- } else {
- pi->first=0;
- }
- for (pi->resno=pi->poc.resno0; pi->resnopoc.resno1; pi->resno++) {
- for (pi->layno=0; pi->laynopoc.layno1; pi->layno++) {
- for (pi->compno=pi->poc.compno0; pi->compnopoc.compno1; pi->compno++) {
- comp=&pi->comps[pi->compno];
- if (pi->resno>=comp->numresolutions) {
- continue;
- }
- res=&comp->resolutions[pi->resno];
- for (pi->precno=0; pi->precnopw*res->ph; pi->precno++) {
- if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno])
- {
- pi->include[pi->layno][pi->resno][pi->compno][pi->precno]=1;
- return 1;
- }
- skip: ;
- }
- }
- }
- }
- return 0;
-}
-
-///
-/// Get next packet in resolution-precinct-component-layer order.
-///
-int pi_next_rpcl(pi_iterator_t *pi) {
- pi_comp_t *comp;
- pi_resolution_t *res;
- if (!pi->first) {
- goto skip;
- } else {
- int compno, resno;
- pi->first=0;
- pi->dx=0;
- pi->dy=0;
- for (compno=0; compnonumcomps; compno++) {
- comp=&pi->comps[compno];
- for (resno=0; resnonumresolutions; resno++) {
- int dx, dy;
- res=&comp->resolutions[resno];
- dx=comp->dx*(1<<(res->pdx+comp->numresolutions-1-resno));
- dy=comp->dy*(1<<(res->pdy+comp->numresolutions-1-resno));
- pi->dx=!pi->dx?dx:int_min(pi->dx, dx);
- pi->dy=!pi->dy?dy:int_min(pi->dy, dy);
- }
- }
- }
- for (pi->resno=pi->poc.resno0; pi->resnopoc.resno1; pi->resno++) {
- for (pi->y=pi->ty0; pi->yty1; pi->y+=pi->dy-(pi->y%pi->dy)) {
- for (pi->x=pi->tx0; pi->xtx1; pi->x+=pi->dx-(pi->x%pi->dx)) {
- for (pi->compno=pi->poc.compno0; pi->compnopoc.compno1; pi->compno++) {
- int levelno;
- int trx0, try0;
- int rpx, rpy;
- int prci, prcj;
- comp=&pi->comps[pi->compno];
- if (pi->resno>=comp->numresolutions) {
- continue;
- }
- res=&comp->resolutions[pi->resno];
- levelno=comp->numresolutions-1-pi->resno;
- trx0=int_ceildiv(pi->tx0, comp->dx<ty0, comp->dy<pdx+levelno;
- rpy=res->pdy+levelno;
- if (!(pi->x%(comp->dx<x==pi->tx0&&(trx0<y%(comp->dy<y==pi->ty0&&(try0<x, comp->dx<pdx)-int_floordivpow2(trx0, res->pdx);
- prcj=int_floordivpow2(int_ceildiv(pi->y, comp->dy<pdy)-int_floordivpow2(try0, res->pdy);
- pi->precno=prci+prcj*res->pw;
- for (pi->layno=0; pi->laynopoc.layno1; pi->layno++) {
- if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno])
- {
- pi->include[pi->layno][pi->resno][pi->compno][pi->precno]=1;
- return 1;
- }
- skip: ;
- }
- }
- }
- }
- }
- return 0;
-}
-
-///
-/// Get next packet in precinct-component-resolution-layer order.
-///
-int pi_next_pcrl(pi_iterator_t *pi) {
- pi_comp_t *comp;
- pi_resolution_t *res;
- if (!pi->first) {
- comp=&pi->comps[pi->compno];
- goto skip;
- } else {
- int compno, resno;
- pi->first=0;
- pi->dx=0;
- pi->dy=0;
- for (compno=0; compnonumcomps; compno++) {
- comp=&pi->comps[compno];
- for (resno=0; resnonumresolutions; resno++) {
- int dx, dy;
- res=&comp->resolutions[resno];
- dx=comp->dx*(1<<(res->pdx+comp->numresolutions-1-resno));
- dy=comp->dy*(1<<(res->pdy+comp->numresolutions-1-resno));
- pi->dx=!pi->dx?dx:int_min(pi->dx, dx);
- pi->dy=!pi->dy?dy:int_min(pi->dy, dy);
- }
- }
- }
- for (pi->y=pi->ty0; pi->yty1; pi->y+=pi->dy-(pi->y%pi->dy)) {
- for (pi->x=pi->tx0; pi->xtx1; pi->x+=pi->dx-(pi->x%pi->dx)) {
- for (pi->compno=pi->poc.compno0; pi->compnopoc.compno1; pi->compno++) {
- comp=&pi->comps[pi->compno];
- for (pi->resno=pi->poc.resno0; pi->resnopoc.resno1, comp->numresolutions); pi->resno++) {
- int levelno;
- int trx0, try0;
- int rpx, rpy;
- int prci, prcj;
- res=&comp->resolutions[pi->resno];
- levelno=comp->numresolutions-1-pi->resno;
- trx0=int_ceildiv(pi->tx0, comp->dx<ty0, comp->dy<pdx+levelno;
- rpy=res->pdy+levelno;
- if (!(pi->x%(comp->dx<x==pi->tx0&&(trx0<y%(comp->dy<y==pi->ty0&&(try0<x, comp->dx<pdx)-int_floordivpow2(trx0, res->pdx);
- prcj=int_floordivpow2(int_ceildiv(pi->y, comp->dy<pdy)-int_floordivpow2(try0, res->pdy);
- pi->precno=prci+prcj*res->pw;
- for (pi->layno=0; pi->laynopoc.layno1; pi->layno++) {
- if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno])
- {
- pi->include[pi->layno][pi->resno][pi->compno][pi->precno]=1;
- return 1;
+ continue;
+ }
+ res = &comp->resolutions[pi->resno];
+ for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) {
+ if (!pi->include[pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p]){
+ pi->include[pi->layno * pi->step_l + pi->resno * pi->step_r + pi->compno * pi->step_c + pi->precno * pi->step_p] = 1;
+ return 1;
+ }
+ skip:;
+ }
}
- skip: ;
- }
- }
- }
- }
- }
- return 0;
-}
-
-///
-/// Get next packet in component-precinct-resolution-layer order.
-///
-int pi_next_cprl(pi_iterator_t *pi) {
- pi_comp_t *comp;
- pi_resolution_t *res;
- if (!pi->first) {
- comp=&pi->comps[pi->compno];
- goto skip;
- } else {
- pi->first=0;
- }
- for (pi->compno=pi->poc.compno0; pi->compnopoc.compno1; pi->compno++) {
- int resno;
- comp=&pi->comps[pi->compno];
- pi->dx=0;
- pi->dy=0;
- for (resno=0; resnonumresolutions; resno++) {
- int dx, dy;
- res=&comp->resolutions[resno];
- dx=comp->dx*(1<<(res->pdx+comp->numresolutions-1-resno));
- dy=comp->dy*(1<<(res->pdy+comp->numresolutions-1-resno));
- pi->dx=!pi->dx?dx:int_min(pi->dx, dx);
- pi->dy=!pi->dy?dy:int_min(pi->dy, dy);
- }
- for (pi->y=pi->ty0; pi->yty1; pi->y+=pi->dy-(pi->y%pi->dy)) {
- for (pi->x=pi->tx0; pi->xtx1; pi->x+=pi->dx-(pi->x%pi->dx)) {
- for (pi->resno=pi->poc.resno0; pi->resnopoc.resno1, comp->numresolutions); pi->resno++) {
- int levelno;
- int trx0, try0;
- int rpx, rpy;
- int prci, prcj;
- res=&comp->resolutions[pi->resno];
- levelno=comp->numresolutions-1-pi->resno;
- trx0=int_ceildiv(pi->tx0, comp->dx<ty0, comp->dy<pdx+levelno;
- rpy=res->pdy+levelno;
- if (!(pi->x%(comp->dx<x==pi->tx0&&(trx0<y%(comp->dy<y==pi->ty0&&(try0<x, comp->dx<pdx)-int_floordivpow2(trx0, res->pdx);
- prcj=int_floordivpow2(int_ceildiv(pi->y, comp->dy<pdy)-int_floordivpow2(try0, res->pdy);
- pi->precno=prci+prcj*res->pw;
- for (pi->layno=0; pi->laynopoc.layno1; pi->layno++) {
- if (!pi->include[pi->layno][pi->resno][pi->compno][pi->precno])
- {
- pi->include[pi->layno][pi->resno][pi->compno][pi->precno]=1;
- return 1;
- }
- skip: ;
- }
- }
- }
- }
- }
- return 0;
-}
-
-///
-/// Get next packet.
-///
-int pi_next(pi_iterator_t *pi) {
- switch (pi->poc.prg) {
- case 0:
- return pi_next_lrcp(pi);
- case 1:
- return pi_next_rlcp(pi);
- case 2:
- return pi_next_rpcl(pi);
- case 3:
- return pi_next_pcrl(pi);
- case 4:
- return pi_next_cprl(pi);
- }
+ }
+ }
+ return 0;
+}
+
+/* */
+/* Get next packet in resolution-layer-component-precinct order. */
+/* */
+int pi_next_rlcp(pi_iterator_t * pi)
+{
+ pi_comp_t *comp;
+ pi_resolution_t *res;
+ if (!pi->first) {
+ comp = &pi->comps[pi->compno];
+ res = &comp->resolutions[pi->resno];
+ goto 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->numresolutions) {
+ continue;
+ }
+ res = &comp->resolutions[pi->resno];
+ for (pi->precno = 0; pi->precno < res->pw * res->ph; pi->precno++) {
+ if (!pi->include[pi->layno*pi->step_l+pi->resno*pi->step_r+pi->compno*pi->step_c+pi->precno*pi->step_p]){
+ pi->include[pi->layno*pi->step_l+pi->resno*pi->step_r+pi->compno*pi->step_c+pi->precno*pi->step_p] = 1;
+ return 1;
+ }
+ skip:;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/* */
+/* Get next packet in resolution-precinct-component-layer order. */
+/* */
+int pi_next_rpcl(pi_iterator_t * pi)
+{
+ pi_comp_t *comp;
+ pi_resolution_t *res;
+ if (!pi->first) {
+ goto skip;
+ } else {
+ int compno, resno;
+ pi->first = 0;
+ pi->dx = 0;
+ pi->dy = 0;
+ for (compno = 0; compno < pi->numcomps; compno++) {
+ comp = &pi->comps[compno];
+ for (resno = 0; resno < comp->numresolutions; resno++) {
+ int dx, dy;
+ res = &comp->resolutions[resno];
+ dx =
+ comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
+ dy =
+ comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
+ pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
+ pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
+ }
+ }
+ }
+ for (pi->resno = pi->poc.resno0; pi->resno < pi->poc.resno1; pi->resno++) {
+ 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 levelno;
+ int trx0, try0;
+ int rpx, rpy;
+ int prci, prcj;
+ comp = &pi->comps[pi->compno];
+ if (pi->resno >= comp->numresolutions) {
+ continue;
+ }
+ res = &comp->resolutions[pi->resno];
+ levelno = comp->numresolutions - 1 - pi->resno;
+ trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
+ try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
+ rpx = res->pdx + levelno;
+ rpy = res->pdy + levelno;
+ if (!
+ (pi->x % (comp->dx << rpx) == 0
+ || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
+ continue;
+ }
+ if (!
+ (pi->y % (comp->dy << rpy) == 0
+ || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
+ continue;
+ }
+ prci =
+ int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno),
+ res->pdx) - int_floordivpow2(trx0, res->pdx);
+ prcj =
+ int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno),
+ res->pdy) - int_floordivpow2(try0, res->pdy);
+ pi->precno = prci + prcj * res->pw;
+ for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
+ if (!pi->include[pi->layno*pi->step_l+pi->resno*pi->step_r+pi->compno*pi->step_c+pi->precno*pi->step_p]){
+ pi->include[pi->layno*pi->step_l+pi->resno*pi->step_r+pi->compno*pi->step_c+pi->precno*pi->step_p] = 1;
+ return 1;
+ }
+ skip:;
+ }
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/* */
+/* Get next packet in precinct-component-resolution-layer order. */
+/* */
+int pi_next_pcrl(pi_iterator_t * pi)
+{
+ pi_comp_t *comp;
+ pi_resolution_t *res;
+ if (!pi->first) {
+ comp = &pi->comps[pi->compno];
+ goto skip;
+ } else {
+ int compno, resno;
+ pi->first = 0;
+ pi->dx = 0;
+ pi->dy = 0;
+ for (compno = 0; compno < pi->numcomps; compno++) {
+ comp = &pi->comps[compno];
+ for (resno = 0; resno < comp->numresolutions; resno++) {
+ int dx, dy;
+ res = &comp->resolutions[resno];
+ dx =
+ comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
+ dy =
+ comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
+ pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
+ pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
+ }
+ }
+ }
+ 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->numresolutions);
+ pi->resno++) {
+ int levelno;
+ int trx0, try0;
+ int rpx, rpy;
+ int prci, prcj;
+ res = &comp->resolutions[pi->resno];
+ levelno = comp->numresolutions - 1 - pi->resno;
+ trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
+ try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
+ rpx = res->pdx + levelno;
+ rpy = res->pdy + levelno;
+ if (!
+ (pi->x % (comp->dx << rpx) == 0
+ || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
+ continue;
+ }
+ if (!
+ (pi->y % (comp->dy << rpy) == 0
+ || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
+ continue;
+ }
+ prci =
+ int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno),
+ res->pdx) - int_floordivpow2(trx0, res->pdx);
+ prcj =
+ int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno),
+ res->pdy) - int_floordivpow2(try0, res->pdy);
+ pi->precno = prci + prcj * res->pw;
+ for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
+ if (! pi->include[pi->layno*pi->step_l+pi->resno*pi->step_r+pi->compno*pi->step_c+pi->precno*pi->step_p]){
+ pi->include[pi->layno*pi->step_l+pi->resno*pi->step_r+pi->compno*pi->step_c+pi->precno*pi->step_p] = 1;
+ return 1;
+ }
+ skip:;
+ }
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/* */
+/* Get next packet in component-precinct-resolution-layer order. */
+/* */
+int pi_next_cprl(pi_iterator_t * pi)
+{
+ pi_comp_t *comp;
+ pi_resolution_t *res;
+ if (!pi->first) {
+ comp = &pi->comps[pi->compno];
+ goto skip;
+ } else {
+ pi->first = 0;
+ }
+ for (pi->compno = pi->poc.compno0; pi->compno < pi->poc.compno1;
+ pi->compno++) {
+ int resno;
+ comp = &pi->comps[pi->compno];
+ pi->dx = 0;
+ pi->dy = 0;
+ for (resno = 0; resno < comp->numresolutions; resno++) {
+ int dx, dy;
+ res = &comp->resolutions[resno];
+ dx = comp->dx * (1 << (res->pdx + comp->numresolutions - 1 - resno));
+ dy = comp->dy * (1 << (res->pdy + comp->numresolutions - 1 - resno));
+ pi->dx = !pi->dx ? dx : int_min(pi->dx, dx);
+ pi->dy = !pi->dy ? dy : int_min(pi->dy, dy);
+ }
+ 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->numresolutions);
+ pi->resno++) {
+ int levelno;
+ int trx0, try0;
+ int rpx, rpy;
+ int prci, prcj;
+ res = &comp->resolutions[pi->resno];
+ levelno = comp->numresolutions - 1 - pi->resno;
+ trx0 = int_ceildiv(pi->tx0, comp->dx << levelno);
+ try0 = int_ceildiv(pi->ty0, comp->dy << levelno);
+ rpx = res->pdx + levelno;
+ rpy = res->pdy + levelno;
+ if (!
+ (pi->x % (comp->dx << rpx) == 0
+ || (pi->x == pi->tx0 && (trx0 << levelno) % (1 << rpx)))) {
+ continue;
+ }
+ if (!
+ (pi->y % (comp->dy << rpy) == 0
+ || (pi->y == pi->ty0 && (try0 << levelno) % (1 << rpx)))) {
+ continue;
+ }
+ prci =
+ int_floordivpow2(int_ceildiv(pi->x, comp->dx << levelno),
+ res->pdx) - int_floordivpow2(trx0, res->pdx);
+ prcj =
+ int_floordivpow2(int_ceildiv(pi->y, comp->dy << levelno),
+ res->pdy) - int_floordivpow2(try0, res->pdy);
+ pi->precno = prci + prcj * res->pw;
+ for (pi->layno = 0; pi->layno < pi->poc.layno1; pi->layno++) {
+ if (! pi->include[pi->layno*pi->step_l+pi->resno*pi->step_r+pi->compno*pi->step_c+pi->precno*pi->step_p]){
+ pi->include[pi->layno*pi->step_l+pi->resno*pi->step_r+pi->compno*pi->step_c+pi->precno*pi->step_p] = 1;
+ return 1;
+ }
+ skip:;
+ }
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/* */
+/* Get next packet. */
+/* */
+int pi_next(pi_iterator_t * pi)
+{
+ switch (pi->poc.prg) {
+ case 0:
+ return pi_next_lrcp(pi);
+ case 1:
+ return pi_next_rlcp(pi);
+ case 2:
+ return pi_next_rpcl(pi);
+ case 3:
+ return pi_next_pcrl(pi);
+ case 4:
+ return pi_next_cprl(pi);
+ }
return 0;
}
diff --git a/indexer_JPIP/pi.h b/indexer_JPIP/pi.h
index fbe822d2..b300b9e3 100644
--- a/indexer_JPIP/pi.h
+++ b/indexer_JPIP/pi.h
@@ -1,7 +1,5 @@
/*
* Copyright (c) 2001-2002, David Janssens
- * Copyright (c) 2003, Yannick Verschueren
- * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -33,26 +31,27 @@
#include "tcd.h"
typedef struct {
- int pdx, pdy;
- int pw, ph;
+ int pdx, pdy;
+ int pw, ph;
} pi_resolution_t;
typedef struct {
- int dx, dy;
- int numresolutions;
- pi_resolution_t *resolutions;
+ int dx, dy;
+ int numresolutions;
+ pi_resolution_t *resolutions;
} pi_comp_t;
typedef struct {
- int include[10][10][3][99];
- int compno, resno, precno, layno; // component, resolution, precinct and layer that indentify the packet
- int first;
- j2k_poc_t poc;
- int numcomps;
- pi_comp_t *comps;
- int tx0, ty0, tx1, ty1;
- int x, y, dx, dy;
-} pi_iterator_t; // packet iterator
+ short int *include;
+ int step_l, step_r, step_c, step_p;
+ int compno, resno, precno, layno; /* component, resolution, precinct and layer that indentify the packet */
+ int first;
+ j2k_poc_t poc;
+ int numcomps;
+ pi_comp_t *comps;
+ int tx0, ty0, tx1, ty1;
+ int x, y, dx, dy;
+} pi_iterator_t; /* packet iterator */
/*
* Create a packet iterator
@@ -61,13 +60,13 @@ typedef struct {
* tileno: number that identifies the tile for which to list the packets
* return value: returns a packet iterator that points to the first packet of the tile
*/
-pi_iterator_t *pi_create(j2k_image_t *img, j2k_cp_t *cp, int tileno);
+pi_iterator_t *pi_create(j2k_image_t * img, j2k_cp_t * cp, int tileno);
/*
* Modify the packet iterator to point to the next packet
* pi: packet iterator to modify
* return value: returns 0 if pi pointed to the last packet or else returns 1
*/
-int pi_next(pi_iterator_t *pi);
+int pi_next(pi_iterator_t * pi);
#endif
diff --git a/indexer_JPIP/t2.c b/indexer_JPIP/t2.c
index 466b4095..14a44bea 100644
--- a/indexer_JPIP/t2.c
+++ b/indexer_JPIP/t2.c
@@ -65,185 +65,320 @@ void t2_init_seg(tcd_seg_t *seg, int cblksty) {
seg->maxpasses=cblksty&J2K_CCP_CBLKSTY_TERMALL?1:100;
}
-int t2_decode_packet(unsigned char *src, int len, tcd_tile_t *tile, j2k_tcp_t *tcp, int compno, int resno, int precno, int layno, info_layer_t *layer_Idx) {
+int t2_decode_packet(unsigned char *src, int len, tcd_tile_t *tile, j2k_cp_t * cp, j2k_tcp_t *tcp, int compno, int resno, int precno, int layno, info_layer_t *layer_Idx) {
int bandno, cblkno;
- tcd_tilecomp_t *tilec=&tile->comps[compno];
- tcd_resolution_t *res=&tilec->resolutions[resno];
- unsigned char *c=src;
- unsigned char *d=c;
+ tcd_tilecomp_t *tilec = &tile->comps[compno];
+ tcd_resolution_t *res = &tilec->resolutions[resno];
+ unsigned char *c = src;
+ unsigned char *d = c;
int e;
int present;
- if (layno==0) {
- for (bandno=0; bandnonumbands; bandno++) {
- tcd_band_t *band=&res->bands[bandno];
- tcd_precinct_t *prc=&band->precincts[precno];
+ if (layno == 0) {
+ for (bandno = 0; bandno < res->numbands; bandno++) {
+ tcd_band_t *band = &res->bands[bandno];
+ tcd_precinct_t *prc = &band->precincts[precno];
tgt_reset(prc->incltree);
tgt_reset(prc->imsbtree);
- for (cblkno=0; cblknocw*prc->ch; cblkno++) {
- tcd_cblk_t *cblk=&prc->cblks[cblkno];
- cblk->numsegs=0;
+ for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
+ tcd_cblk_t *cblk = &prc->cblks[cblkno];
+ cblk->numsegs = 0;
}
}
}
+ /* INDEX */
+ layer_Idx->len_header = 0;
- if (tcp->csty&J2K_CP_CSTY_SOP) {
- c+=6;
- }
- bio_init_dec(c, src+len-c);
- present=bio_read(1);
- if (!present) {
- bio_inalign();
- c+=bio_numbytes();
- return c-src;
- }
+ /* 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: (futher) return to codestream for decoding */
+ if (cp->ppm == 1) /* PPM */
+ {
+ c = cp->ppm_data;
+ d = c;
+ bio_init_dec(c, 1000);
+ } else
+ {
+ if (tcp->ppt == 1) /* PPT */
+ {
+ c = tcp->ppt_data;
+ d = c;
+ bio_init_dec(c, 1000);
+ } else /* Normal Case */
+ {
+ if (tcp->csty & J2K_CP_CSTY_SOP)
+ {
+ if ((*c) != 255 || (*(c+1) != 145)) {printf("Error : expected SOP marker [1]!!!\n");}
+ c += 6;
+ }
+ bio_init_dec(c, src + len - c);
+ layer_Idx->len_header = -6;
+ }
+ }
+
+ present = bio_read(1);
+
+ if (!present)
+ {
+ bio_inalign();
+ /* Normal case */
+ c += bio_numbytes();
+ if (tcp->csty & J2K_CP_CSTY_EPH)
+ {
+ if ((*c) != 255 || (*(c+1) != 146)) {printf("Error : expected EPH marker [1]!!!\n");}
+ c += 2;
+ }
+ /* INDEX */
+ layer_Idx->len_header += (c-d);
+
+ /* PPT and PPM dealing */
+ if (cp->ppm == 1) /* PPM */
+ {
+ cp->ppm_data = c;
+ return 0;
+ }
+ if (tcp->ppt == 1) /* PPT */
+ {
+ tcp->ppt_data = c;
+ return 0;
+ }
+ return c - src;
+ }
+
for (bandno=0; bandnonumbands; bandno++) {
- tcd_band_t *band=&res->bands[bandno];
- tcd_precinct_t *prc=&band->precincts[precno];
- for (cblkno=0; cblknocw*prc->ch; cblkno++) {
+ tcd_band_t *band = &res->bands[bandno];
+ tcd_precinct_t *prc = &band->precincts[precno];
+ for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) {
int included, increment, n;
- tcd_cblk_t *cblk=&prc->cblks[cblkno];
+ tcd_cblk_t *cblk = &prc->cblks[cblkno];
tcd_seg_t *seg;
if (!cblk->numsegs) {
- included=tgt_decode(prc->incltree, cblkno, layno+1);
+ included = tgt_decode(prc->incltree, cblkno, layno+1);
} else {
- included=bio_read(1);
+ included = bio_read(1);
}
if (!included) {
- cblk->numnewpasses=0;
+ cblk->numnewpasses = 0;
continue;
}
if (!cblk->numsegs) {
int i, numimsbs;
- for (i=0; !tgt_decode(prc->imsbtree, cblkno, i); i++) {}
- numimsbs=i-1;
- cblk->numbps=band->numbps-numimsbs;
- cblk->numlenbits=3;
+ for (i = 0; !tgt_decode(prc->imsbtree, cblkno, i); i++) {}
+ numimsbs = i-1;
+ cblk->numbps = band->numbps - numimsbs;
+ cblk->numlenbits = 3;
}
- cblk->numnewpasses=t2_getnumpasses();
- increment=t2_getcommacode();
- cblk->numlenbits+=increment;
+ cblk->numnewpasses = t2_getnumpasses();
+ increment = t2_getcommacode();
+ cblk->numlenbits += increment;
if (!cblk->numsegs) {
- seg=&cblk->segs[0];
+ seg = &cblk->segs[0];
t2_init_seg(seg, tcp->tccps[compno].cblksty);
} else {
- seg=&cblk->segs[cblk->numsegs-1];
- if (seg->numpasses==seg->maxpasses) {
+ seg = &cblk->segs[cblk->numsegs - 1];
+ if (seg->numpasses == seg->maxpasses) {
t2_init_seg(++seg, tcp->tccps[compno].cblksty);
}
}
- n=cblk->numnewpasses;
+ n = cblk->numnewpasses;
do {
- seg->numnewpasses=int_min(seg->maxpasses-seg->numpasses, n);
- seg->newlen=bio_read(cblk->numlenbits+int_floorlog2(seg->numnewpasses));
- n-=seg->numnewpasses;
- if (n>0) {
+ seg->numnewpasses = int_min(seg->maxpasses-seg->numpasses, n);
+ seg->newlen = bio_read(cblk->numlenbits + int_floorlog2(seg->numnewpasses));
+ n -= seg->numnewpasses;
+ if (n > 0) {
t2_init_seg(++seg, tcp->tccps[compno].cblksty);
}
- } while (n>0);
+ } while (n > 0);
}
}
if(bio_inalign()) return -999;
- c+=bio_numbytes();
- if (tcp->csty&J2K_CP_CSTY_EPH) {
- c+=2;
+ c += bio_numbytes();
+
+ if (tcp->csty & J2K_CP_CSTY_EPH) { /* EPH marker */
+ if ((*c) != 255 || (*(c+1) != 146)) {printf("Error : expected EPH marker [2]!!!\n"); }
+ c += 2;
}
+
+ /* INDEX */
+ layer_Idx->len_header += (c-d);
- // INDEX
- layer_Idx->len_header=c-d;
- if (tcp->csty&J2K_CP_CSTY_SOP)
- layer_Idx->len_header-=6;
- // \INDEX --> END OF HEADER !!
+ /* PPT Step 2 : see above for details */
+ if (cp->ppm == 1)
+ {
+ cp->ppm_data = c; /* Update pointer */
- for (bandno=0; bandnonumbands; bandno++) {
- tcd_band_t *band=&res->bands[bandno];
- tcd_precinct_t *prc=&band->precincts[precno];
- for (cblkno=0; cblknocw*prc->ch; cblkno++) {
- tcd_cblk_t *cblk=&prc->cblks[cblkno];
+ /* INDEX */
+ layer_Idx->len_header = c-d;
+
+ c = src;
+ d = c;
+ if (tcp->csty & J2K_CP_CSTY_SOP)
+ {
+ if ((*c) != 255 || (*(c+1) != 145)) {printf("Error : expected SOP marker [2] !!!\n"); }
+ c += 6;
+ }
+ bio_init_dec(c, src + len - c);
+ } else
+ {
+ if (tcp->ppt == 1)
+ {
+ tcp->ppt_data = c; /* Update pointer */
+ /* INDEX */
+ layer_Idx->len_header = c-d;
+
+ c = src;
+ d = c;
+ if (tcp->csty & J2K_CP_CSTY_SOP) /* SOP marker */
+ {
+ if ((*c) != 255 || (*(c+1) != 145)) {printf("Error : expected SOP marker [2] !!!\n"); }
+ c += 6;
+ }
+ bio_init_dec(c, src + len - c);
+
+ }
+ }
+
+ for (bandno = 0; bandno < res->numbands; bandno++) {
+ tcd_band_t *band = &res->bands[bandno];
+ tcd_precinct_t *prc = &band->precincts[precno];
+ for (cblkno = 0; cblkno < prc->cw*prc->ch; cblkno++) {
+ tcd_cblk_t *cblk = &prc->cblks[cblkno];
tcd_seg_t *seg;
if (!cblk->numnewpasses) continue;
if (!cblk->numsegs) {
- seg=&cblk->segs[cblk->numsegs++];
- cblk->len=0;
+ seg = &cblk->segs[cblk->numsegs++];
+ cblk->len = 0;
} else {
- seg=&cblk->segs[cblk->numsegs-1];
- if (seg->numpasses==seg->maxpasses) {
+ 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;
+ 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) {
+ 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);
+ } while (cblk->numnewpasses > 0);
}
}
- //
- e=c-d;
- layer_Idx->len=e;
- //
+ /* */
+ e = c-d;
+ layer_Idx->len = e;
+ /* */
return c-src;
}
+void t2_init_info_packets(info_image_t *img, j2k_cp_t *cp)
+{
+ int compno, tileno, resno, precno, layno;
+
+ for(compno = 0; compno < img->Comp; compno++)
+ {
+ for(tileno = 0; tileno < img->tw*img->th; tileno++)
+ {
+ info_tile_t *tile_Idx = &img->tile[tileno];
+ info_compo_t *compo_Idx = &tile_Idx->compo[compno];
+ for(resno = 0; resno < img->Decomposition + 1 ; resno++)
+ {
+ info_reso_t *reso_Idx = &compo_Idx->reso[resno];
+ for (precno = 0; precno < img->tile[tileno].pw * img->tile[tileno].ph; precno++)
+ {
+ info_prec_t *prec_Idx = &reso_Idx->prec[precno];
+ for(layno = 0; layno < img->Layer ; layno++)
+ {
+ info_layer_t *layer_Idx = &prec_Idx->layer[layno];
+ layer_Idx->offset = 0; /* start position */
+ layer_Idx->len_header = 0; /* length */
+ }
+ }
+ }
+ }
+ }
+}
+
int t2_decode_packets(unsigned char *src, int len, j2k_image_t *img, j2k_cp_t *cp, int tileno, tcd_tile_t *tile, info_image_t *imgg) {
- unsigned char *c=src;
+ unsigned char *c = src;
pi_iterator_t *pi;
int pino, compno,e;
- int position=imgg->tile[tileno].end_header+1;
+ int partno;
+ info_tile_part_t *tile_part;
+ int position;
+ int length_read;
info_tile_t *tile_Idx;
info_compo_t *compo_Idx;
info_reso_t *reso_Idx;
info_prec_t *prec_Idx;
info_layer_t *layer_Idx;
- tile_Idx=&imgg->tile[tileno];
- tile_Idx->num_packet=0;
- pi=pi_create(img, cp, tileno);
+ t2_init_info_packets(imgg, cp); /* Initialize the packets information : LEN and OFFSET to 0 */
- for (pino=0; pino<=cp->tcps[tileno].numpocs;pino++)
+ tile_Idx = &imgg->tile[tileno];
+ tile_Idx->num_packet = 0;
+ pi = pi_create(img, cp, tileno);
+ partno = 0;
+ tile_part = &tile_Idx->tile_parts[partno];
+ position = tile_part->end_header + 1;
+ length_read = 0;
+
+ for (pino = 0; pino <= cp->tcps[tileno].numpocs; pino++)
{
-
- while (pi_next(&pi[pino])) {
- compo_Idx=&tile_Idx->compo[pi[pino].compno];
- reso_Idx=&compo_Idx->reso[pi[pino].resno];
- prec_Idx=&reso_Idx->prec[pi[pino].precno];
- layer_Idx=&prec_Idx->layer[pi[pino].layno];
-
- layer_Idx->offset=position;
-
- e=t2_decode_packet(c, src+len-c, tile, &cp->tcps[tileno], pi[pino].compno, pi[pino].resno, pi[pino].precno, pi[pino].layno,layer_Idx);
-
- if (e==-999)
- {
- break;
- } else
- c+=e;
- position+=e;
- tile_Idx->num_packet++;
- }
+ while (pi_next(&pi[pino]))
+ {
+ compo_Idx = &tile_Idx->compo[pi[pino].compno];
+ reso_Idx = &compo_Idx->reso[pi[pino].resno];
+ prec_Idx = &reso_Idx->prec[pi[pino].precno];
+ layer_Idx = &prec_Idx->layer[pi[pino].layno];
+
+ layer_Idx->offset = position;
+ layer_Idx->offset_header = position;
+
+ e = t2_decode_packet(c, src+len-c, tile, cp, &cp->tcps[tileno], pi[pino].compno, pi[pino].resno, pi[pino].precno, pi[pino].layno,layer_Idx);
+ if (e == -999)
+ {
+ break;
+ } else
+ c += e;
+ position += e;
+
+ /* Update position in case of multiple tile-parts for a tile >> */
+ length_read += e;
+ if (length_read >= (tile_part->end_pos - tile_part->end_header))
+ {
+ partno++;
+ tile_part = &tile_Idx->tile_parts[partno];
+ position = tile_part->end_header + 1;
+ length_read = 0;
+ }
+ /* << end_update */
+
+ tile_Idx->num_packet++;
+ }
// FREE space memory taken by pi
- for (compno=0; compnotcps[tileno];
- tile=tcd_tile;
- l=t2_decode_packets(src, len, tcd_img, tcd_cp, tileno, tile, imgg);
+ tile = &tcd_image.tiles[tileno];
+
+ l = t2_decode_packets(src, len, tcd_img, tcd_cp, tileno, tile, imgg);
if (l==-999)
{
diff --git a/indexer_JPIP/tgt.c b/indexer_JPIP/tgt.c
index 4a651935..c2b46824 100644
--- a/indexer_JPIP/tgt.c
+++ b/indexer_JPIP/tgt.c
@@ -1,7 +1,7 @@
/*
* Copyright (c) 2001-2002, David Janssens
* Copyright (c) 2003, Yannick Verschueren
- * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
+ * Copyright (c) 2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without