summaryrefslogtreecommitdiff
path: root/indexer_JPIP/t2.c
diff options
context:
space:
mode:
Diffstat (limited to 'indexer_JPIP/t2.c')
-rw-r--r--indexer_JPIP/t2.c254
1 files changed, 254 insertions, 0 deletions
diff --git a/indexer_JPIP/t2.c b/indexer_JPIP/t2.c
new file mode 100644
index 00000000..466b4095
--- /dev/null
+++ b/indexer_JPIP/t2.c
@@ -0,0 +1,254 @@
+/*
+ * 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
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "t2.h"
+#include "tcd.h"
+#include "bio.h"
+#include "j2k.h"
+#include "pi.h"
+#include "tgt.h"
+#include "int.h"
+#include "cio.h"
+#include <stdio.h>
+#include <setjmp.h>
+#include <string.h>
+#include <stdlib.h>
+
+#define RESTART 0x04
+
+extern jmp_buf j2k_error;
+
+int t2_getcommacode() {
+ int n;
+ for (n=0; bio_read(1); n++) {}
+ return n;
+}
+
+int t2_getnumpasses()
+{
+ int n;
+ if (!bio_read(1)) return 1;
+ if (!bio_read(1)) return 2;
+ if ((n=bio_read(2))!=3) return 3+n;
+ if ((n=bio_read(5))!=31) return 6+n;
+ return 37+bio_read(7);
+}
+
+void t2_init_seg(tcd_seg_t *seg, int cblksty) {
+ seg->numpasses=0;
+ seg->len=0;
+ 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 bandno, cblkno;
+ 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; 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; cblkno<prc->cw*prc->ch; cblkno++) {
+ tcd_cblk_t *cblk=&prc->cblks[cblkno];
+ cblk->numsegs=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;
+ }
+ 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++) {
+ int included, increment, n;
+ tcd_cblk_t *cblk=&prc->cblks[cblkno];
+ tcd_seg_t *seg;
+ if (!cblk->numsegs) {
+ included=tgt_decode(prc->incltree, cblkno, layno+1);
+ } else {
+ included=bio_read(1);
+ }
+ if (!included) {
+ 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;
+ }
+ cblk->numnewpasses=t2_getnumpasses();
+ increment=t2_getcommacode();
+ cblk->numlenbits+=increment;
+ if (!cblk->numsegs) {
+ seg=&cblk->segs[0];
+ t2_init_seg(seg, tcp->tccps[compno].cblksty);
+ } else {
+ seg=&cblk->segs[cblk->numsegs-1];
+ if (seg->numpasses==seg->maxpasses) {
+ t2_init_seg(++seg, tcp->tccps[compno].cblksty);
+ }
+ }
+ 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) {
+ t2_init_seg(++seg, tcp->tccps[compno].cblksty);
+ }
+ } while (n>0);
+ }
+ }
+ if(bio_inalign()) return -999;
+ c+=bio_numbytes();
+ if (tcp->csty&J2K_CP_CSTY_EPH) {
+ c+=2;
+ }
+
+ // INDEX
+ layer_Idx->len_header=c-d;
+ if (tcp->csty&J2K_CP_CSTY_SOP)
+ layer_Idx->len_header-=6;
+ // \INDEX --> END OF HEADER !!
+
+ 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;
+ } else {
+ seg=&cblk->segs[cblk->numsegs-1];
+ if (seg->numpasses==seg->maxpasses) {
+ seg++;
+ cblk->numsegs++;
+ }
+ }
+ do {
+ if (c+seg->newlen>src+len) return -999;
+ memcpy(cblk->data+cblk->len, c, seg->newlen);
+ if (seg->numpasses==0) {
+ seg->data=cblk->data+cblk->len;
+ }
+ c+=seg->newlen;
+ cblk->len+=seg->newlen;
+ seg->len+=seg->newlen;
+ seg->numpasses+=seg->numnewpasses;
+ cblk->numnewpasses-=seg->numnewpasses;
+ if (cblk->numnewpasses>0) {
+ seg++;
+ cblk->numsegs++;
+ }
+ } while (cblk->numnewpasses>0);
+ }
+ }
+ //<INDEX>
+ e=c-d;
+ layer_Idx->len=e;
+ //</INDEX>
+
+ return c-src;
+}
+
+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;
+ pi_iterator_t *pi;
+ int pino, compno,e;
+ int position=imgg->tile[tileno].end_header+1;
+ 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);
+
+ 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++;
+ }
+
+ // FREE space memory taken by pi
+ for (compno=0; compno<pi[pino].numcomps; compno++)
+ {
+ free(pi[pino].comps[compno].resolutions);
+ }
+ free(pi[pino].comps);
+ }
+ free(pi);
+
+ if (e==-999)
+ return e;
+ else
+ {
+ imgg->num_packet_max=int_max(imgg->num_packet_max,tile_Idx->num_packet);
+ return c-src;
+ }
+}