2 * Copyright (c) 2003-2004, Yannick Verschueren
3 * Copyright (c) 2003-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
40 #define JPIP_CIDX 0x63696478 /* Codestream index */
41 #define JPIP_CPTR 0x63707472 /* Codestream Finder Box */
42 #define JPIP_MANF 0x6d616e66 /* Manifest Box */
43 #define JPIP_FAIX 0x66616978 /* Fragment array Index box */
44 #define JPIP_MHIX 0x6d686978 /* Main Header Index Table */
45 #define JPIP_TPIX 0x74706978 /* Tile-part Index Table box */
46 #define JPIP_THIX 0x74686978 /* Tile header Index Table box */
47 #define JPIP_PPIX 0x70706978 /* Precinct Packet Index Table box */
48 #define JPIP_PHIX 0x70686978 /* Packet Header index Table */
49 #define JPIP_FIDX 0x66696478 /* File Index */
50 #define JPIP_FPTR 0x66707472 /* File Finder */
51 #define JPIP_PRXY 0x70727879 /* Proxy boxes */
52 #define JPIP_IPTR 0x69707472 /* Index finder box */
53 #define JPIP_PHLD 0x70686c64 /* Place holder */
55 #define JP2C 0x6a703263
57 //static info_marker_t marker_jpip[32], marker_local_jpip[32]; /* SIZE to precise ! */
58 //static int num_marker_jpip, num_marker_local_jpip;
63 * Codestream finder box (box)
66 void jpip_write_cptr(int offset, info_image_t img)
71 cio_skip(4); /* L [at the end] */
72 cio_write(JPIP_CPTR,4); /* T */
73 cio_write(0,2); /* DR A PRECISER !! */
74 cio_write(0,2); /* CONT */
75 cio_write(offset,8); /* COFF A PRECISER !! */
76 cio_write(img.codestream_size,8); /* CLEN */
79 cio_write(len, 4); /* L */
86 * Codestream finder box (box)
92 long long Coff, codestream_size;
94 DR = cio_read(2); /* DR */
95 CONT = cio_read(2); /* CONT */
96 Coff = cio_read(8); /* COFF */
97 codestream_size = cio_read(8); /* CLEN */
106 void jpip_write_manf(int second, int v, info_marker_t *marker)
110 cio_skip(4); /* L [at the end] */
111 cio_write(JPIP_MANF,4); /* T */
113 if (second) /* Write only during the second pass */
117 cio_write(marker[i].len,4); /* Marker length */
118 cio_write(marker[i].type,4); /* Marker type */
124 cio_write(len, 4); /* L */
134 void jpip_read_manf(int len)
136 int i, v, marker_len, marker_type;
142 marker_len = cio_read(4); /* Marker length */
143 marker_type = cio_read(4); /* Marker type */
150 * Main Header Index Table (box)
153 int jpip_write_mhix(info_image_t img, int status, int tileno)
158 cio_skip(4); /* L [at the end] */
159 cio_write(JPIP_MHIX, 4); /* MHIX */
161 if (status) /* MAIN HEADER */
163 cio_write(img.Main_head_end,8); /* TLEN */
165 for(i = 0; i < img.num_marker; i++) /* Marker restricted to 1 apparition */
167 cio_write(img.marker[i].type, 2);
169 cio_write(img.marker[i].start_pos, 8);
170 cio_write(img.marker[i].len, 2);
173 /* Marker NOT restricted to 1 apparition */
174 for(i = img.marker_mul.num_COC - 1; i >= 0; i--) /* COC */
176 cio_write(img.marker_mul.COC[i].type, 2);
178 cio_write(img.marker_mul.COC[i].start_pos, 8);
179 cio_write(img.marker_mul.COC[i].len, 2);
182 for(i = img.marker_mul.num_RGN - 1; i >= 0; i--) /* RGN */
184 cio_write(img.marker_mul.RGN[i].type, 2);
186 cio_write(img.marker_mul.RGN[i].start_pos, 8);
187 cio_write(img.marker_mul.RGN[i].len, 2);
190 for(i = img.marker_mul.num_QCC - 1; i >= 0; i--) /* QCC */
192 cio_write(img.marker_mul.QCC[i].type, 2);
194 cio_write(img.marker_mul.QCC[i].start_pos, 8);
195 cio_write(img.marker_mul.QCC[i].len, 2);
198 for(i = img.marker_mul.num_TLM - 1; i >= 0; i--) /* TLM */
200 cio_write(img.marker_mul.TLM[i].type, 2);
202 cio_write(img.marker_mul.TLM[i].start_pos, 8);
203 cio_write(img.marker_mul.TLM[i].len, 2);
206 for(i = img.marker_mul.num_PLM - 1; i >= 0; i--) /* PLM */
208 cio_write(img.marker_mul.PLM[i].type, 2);
210 cio_write(img.marker_mul.PLM[i].start_pos, 8);
211 cio_write(img.marker_mul.PLM[i].len, 2);
214 for(i = img.marker_mul.num_PPM - 1; i >= 0; i--) /* PPM */
216 cio_write(img.marker_mul.PPM[i].type, 2);
218 cio_write(img.marker_mul.PPM[i].start_pos, 8);
219 cio_write(img.marker_mul.PPM[i].len, 2);
222 for(i = img.marker_mul.num_COM - 1; i >= 0; i--) /* COM */
224 cio_write(img.marker_mul.COM[i].type, 2);
226 cio_write(img.marker_mul.COM[i].start_pos, 8);
227 cio_write(img.marker_mul.COM[i].len, 2);
230 else /* TILE HEADER */
232 tile = &img.tile[tileno];
233 cio_write(tile->tile_parts[0].length_header, 8); /* TLEN */
235 for(i = 0; i < tile->num_marker; i++) /* Marker restricted to 1 apparition */
237 cio_write(tile->marker[i].type, 2);
239 cio_write(tile->marker[i].start_pos, 8);
240 cio_write(tile->marker[i].len, 2);
243 /* Marker NOT restricted to 1 apparition */
244 for(i = tile->marker_mul.num_COC - 1; i >= 0; i--) /* COC */
246 cio_write(tile->marker_mul.COC[i].type, 2);
248 cio_write(tile->marker_mul.COC[i].start_pos, 8);
249 cio_write(tile->marker_mul.COC[i].len, 2);
252 for(i = tile->marker_mul.num_RGN - 1; i >= 0; i--) /* RGN */
254 cio_write(tile->marker_mul.RGN[i].type, 2);
256 cio_write(tile->marker_mul.RGN[i].start_pos, 8);
257 cio_write(tile->marker_mul.RGN[i].len, 2);
260 for(i = tile->marker_mul.num_QCC - 1; i >= 0; i--) /* QCC */
262 cio_write(tile->marker_mul.QCC[i].type, 2);
264 cio_write(tile->marker_mul.QCC[i].start_pos, 8);
265 cio_write(tile->marker_mul.QCC[i].len, 2);
268 for(i = tile->marker_mul.num_PLT - 1; i >= 0; i--) /* PLT */
270 cio_write(tile->marker_mul.PLT[i].type,2);
272 cio_write(tile->marker_mul.PLT[i].start_pos,8);
273 cio_write(tile->marker_mul.PLT[i].len,2);
276 for(i = tile->marker_mul.num_PPT - 1; i >= 0; i--) /* PPT */
278 cio_write(tile->marker_mul.PPT[i].type, 2);
280 cio_write(tile->marker_mul.PPT[i].start_pos, 8);
281 cio_write(tile->marker_mul.PPT[i].len, 2);
284 for(i = tile->marker_mul.num_COM - 1; i >= 0; i--) /* COM */
286 cio_write(tile->marker_mul.COM[i].type, 2);
288 cio_write(tile->marker_mul.COM[i].start_pos, 8);
289 cio_write(tile->marker_mul.COM[i].len, 2);
295 cio_write(len, 4); /* L */
304 * Main Header Index Table (box)
307 void jpip_read_mhix(int len)
309 int i, v, marker_type, marker_start_pos, marker_len, marker_remains;
315 marker_type = cio_read(2); /* Type of the marker */
316 marker_remains = cio_read(2); /* Number of same markers following */
317 marker_start_pos = cio_read(2); /* Start position of the marker */
318 marker_len = cio_read(2); /* Length of the marker */
325 * Fragment array Index box (box)
328 int jpip_write_faix(int v, int compno, info_image_t img, j2k_cp_t *j2k_cp, int version)
332 int tileno, resno, precno, layno, num_packet=0;
335 cio_skip(4); /* L [at the end] */
336 cio_write(JPIP_FAIX, 4); /* FAIX */
337 cio_write(version,1); /* Version 0 = 4 bytes */
342 cio_write(img.num_max_tile_parts,(version & 0x01)?8:4); /* NMAX */
343 cio_write(img.tw*img.th,(version & 0x01)?8:4); /* M */
344 for (i = 0; i < img.tw*img.th; i++)
346 for (j = 0; j < img.tile[i].numparts ; j++)
348 cio_write(img.tile[i].tile_parts[j].start_pos,(version & 0x01)?8:4); /* start position */
349 cio_write(img.tile[i].tile_parts[j].length,(version & 0x01)?8:4); /* length */
351 cio_write(img.tile[i].tile_parts[j].num_reso_AUX,4); /* Aux_i,j : Auxiliary value */
355 while (j < img.num_max_tile_parts)
357 cio_write(0,(version & 0x01)?8:4); /* start position */
358 cio_write(0,(version & 0x01)?8:4); /* length */
360 cio_write(0,4); /* Aux_i,j : Auxiliary value */
366 /* case 1: */ /* THIX */
367 /* cio_write(1,(version & 0x01)?8:4); */ /* NMAX */
368 /* cio_write(img.tw*img.th,(version & 0x01)?8:4); */ /* M */
369 /* for (i=0;i<img.tw*img.th;i++) */
371 /* cio_write(img.tile[i].start_pos,(version & 0x01)?8:4); */ /* start position */
372 /* cio_write(img.tile[i].end_header-img.tile[i].start_pos,(version & 0x01)?8:4); */ /* length */
373 /* if (version & 0x02)*/
374 /* cio_write(0,4); */ /* Aux_i,j : Auxiliary value */
378 case 2: /* PPIX NOT FINISHED !! */
379 cio_write(img.num_packet_max,(version & 0x01)?8:4); /* NMAX */
380 cio_write(img.tw*img.th,(version & 0x01)?8:4); /* M */
381 for(tileno=0;tileno<img.tw*img.th;tileno++)
383 info_tile_t *tile_Idx = &img.tile[tileno];
384 info_compo_t *compo_Idx = &tile_Idx->compo[compno];
389 if(j2k_cp->tcps[tileno].csty&J2K_CP_CSTY_EPH)
393 for(resno=0;resno<img.Decomposition+1;resno++)
395 info_reso_t *reso_Idx = &compo_Idx->reso[resno];
396 for (precno=0;precno<img.tile[tileno].pw*img.tile[tileno].ph;precno++)
398 info_prec_t *prec_Idx = &reso_Idx->prec[precno];
399 for(layno=0;layno<img.Layer;layno++)
401 info_layer_t *layer_Idx = &prec_Idx->layer[layno];
402 cio_write(layer_Idx->offset,(version & 0x01)?8:4); /* start position */
403 cio_write((layer_Idx->len_header-correction)?0:layer_Idx->len,(version & 0x01)?8:4); /* length */
405 cio_write(0,4); /* Aux_i,j : Auxiliary value */
411 while (num_packet < img.num_packet_max)
413 cio_write(0,(version & 0x01)?8:4); /* start position */
414 cio_write(0,(version & 0x01)?8:4); /* length */
416 cio_write(0,4); /* Aux_i,j : Auxiliary value */
423 case 3: /* PHIX NOT FINISHED !! */
424 cio_write(img.num_packet_max,(version & 0x01)?8:4); /* NMAX */
425 cio_write(img.tw*img.th,(version & 0x01)?8:4); /* M */
426 for(tileno=0;tileno<img.tw*img.th;tileno++)
428 info_tile_t *tile_Idx = &img.tile[tileno];
429 info_compo_t *compo_Idx = &tile_Idx->compo[compno];
433 if(j2k_cp->tcps[tileno].csty&J2K_CP_CSTY_EPH)
437 for(resno=0;resno<img.Decomposition+1;resno++)
439 info_reso_t *reso_Idx = &compo_Idx->reso[resno];
440 for (precno=0;precno<img.tile[tileno].pw*img.tile[tileno].ph;precno++)
442 info_prec_t *prec_Idx = &reso_Idx->prec[precno];
443 for(layno=0;layno<img.Layer;layno++)
445 info_layer_t *layer_Idx = &prec_Idx->layer[layno];
446 cio_write(layer_Idx->offset_header,(version & 0x01)?8:4); /* start position */
447 cio_write((layer_Idx->len_header-correction)?0:layer_Idx->len_header,(version & 0x01)?8:4); /* length */
449 cio_write(0,4); /* Aux_i,j : Auxiliary value */
455 while (num_packet<img.num_packet_max)
457 cio_write(0,(version & 0x01)?8:4); /* start position */
458 cio_write(0,(version & 0x01)?8:4); /* length */
460 cio_write(0,4); /* Aux_i,j : Auxiliary value */
469 cio_write(len, 4); /* L */
478 * Tile-part Index table box (superbox)
481 int jpip_write_tpix(info_image_t img, j2k_cp_t *j2k_cp, int version)
485 cio_skip(4); /* L [at the end] */
486 cio_write(JPIP_TPIX, 4); /* TPIX */
488 jpip_write_faix(0,0,img, j2k_cp, version);
492 cio_write(len, 4); /* L */
501 * Tile header Index table box (superbox)
504 //int jpip_write_thix(info_image_t img, j2k_cp_t *j2k_cp)
508 // cio_skip(4); /* L [at the end] */
509 // cio_write(JPIP_THIX, 4); /* THIX */
511 // jpip_write_faix(1,0,img, j2k_cp);
513 // len=cio_tell()-lenp;
515 // cio_write(len, 4); /* L */
516 // cio_seek(lenp+len);
521 int jpip_write_thix(info_image_t img, j2k_cp_t *j2k_cp)
525 info_marker_t *marker;
526 int num_marker_local_jpip;
528 marker = (info_marker_t*)calloc(sizeof(info_marker_t), j2k_cp->tw*j2k_cp->th);
530 for ( i = 0; i < 2 ; i++ )
532 if (i) cio_seek(lenp);
535 cio_skip(4); /* L [at the end] */
536 cio_write(JPIP_THIX, 4); /* THIX */
537 jpip_write_manf(i, j2k_cp->tw*j2k_cp->th, marker);
538 num_marker_local_jpip=img.Comp;
540 for (tileno = 0; tileno < j2k_cp->tw*j2k_cp->th; tileno++)
542 marker[tileno].len = jpip_write_mhix(img, 1, tileno);
543 marker[tileno].type = JPIP_MHIX;
548 cio_write(len, 4); /* L */
559 * Precinct Packet Index table box (superbox)
562 int jpip_write_ppix(info_image_t img,j2k_cp_t *j2k_cp)
564 int len, lenp, compno, i;
565 info_marker_t *marker;
566 int num_marker_local_jpip;
567 marker = (info_marker_t*)calloc(sizeof(info_marker_t), img.Comp);
571 if (i) cio_seek(lenp);
574 cio_skip(4); /* L [at the end] */
575 cio_write(JPIP_PPIX, 4); /* PPIX */
576 jpip_write_manf(i,img.Comp,marker);
577 num_marker_local_jpip=img.Comp;
579 for (compno=0; compno<img.Comp; compno++)
581 marker[compno].len=jpip_write_faix(2,compno,img, j2k_cp, 0);
582 marker[compno].type=JPIP_FAIX;
587 cio_write(len, 4); /* L */
599 * Packet Header Index table box (superbox)
602 int jpip_write_phix(info_image_t img, j2k_cp_t *j2k_cp)
604 int len, lenp=0, compno, i;
605 info_marker_t *marker;
607 marker = (info_marker_t*)calloc(sizeof(info_marker_t), img.Comp);
611 if (i) cio_seek(lenp);
614 cio_skip(4); /* L [at the end] */
615 cio_write(JPIP_PHIX, 4); /* PHIX */
617 jpip_write_manf(i,img.Comp,marker);
619 for (compno=0; compno<img.Comp; compno++)
621 marker[compno].len=jpip_write_faix(3,compno,img, j2k_cp, 0);
622 marker[compno].type=JPIP_FAIX;
627 cio_write(len, 4); /* L */
639 * Codestream Index box (superbox)
642 int jpip_write_cidx(int offset, info_image_t img, j2k_cp_t *j2k_cp, int version)
644 int len, lenp = 0, i;
645 info_marker_t *marker_jpip;
646 int num_marker_jpip = 0;
648 marker_jpip = (info_marker_t*)calloc(sizeof(info_marker_t), 32);
657 cio_skip(4); /* L [at the end] */
658 cio_write(JPIP_CIDX, 4); /* CIDX */
659 jpip_write_cptr(offset, img);
661 jpip_write_manf(i,num_marker_jpip, marker_jpip);
664 marker_jpip[num_marker_jpip].len=jpip_write_mhix(img, 0, 0);
665 marker_jpip[num_marker_jpip].type=JPIP_MHIX;
668 marker_jpip[num_marker_jpip].len=jpip_write_tpix(img, j2k_cp, version);
669 marker_jpip[num_marker_jpip].type=JPIP_TPIX;
672 marker_jpip[num_marker_jpip].len=jpip_write_thix(img, j2k_cp);
673 marker_jpip[num_marker_jpip].type=JPIP_THIX;
676 marker_jpip[num_marker_jpip].len=jpip_write_ppix(img, j2k_cp);
677 marker_jpip[num_marker_jpip].type=JPIP_PPIX;
680 marker_jpip[num_marker_jpip].len=jpip_write_phix(img, j2k_cp);
681 marker_jpip[num_marker_jpip].type=JPIP_PHIX;
686 cio_write(len, 4); /* L */
702 void jpip_write_iptr(int offset, int length)
706 cio_skip(4); /* L [at the end] */
707 cio_write(JPIP_IPTR, 4); /* IPTR */
714 cio_write(len, 4); /* L */
724 void jpip_write_prxy(int offset_jp2c, int length_jp2c, int offset_idx, int length_idx)
728 cio_skip(4); /* L [at the end] */
729 cio_write(JPIP_PRXY, 4); /* IPTR */
731 cio_write(offset_jp2c,8); /* OOFF */
732 cio_write(length_jp2c,4); /* OBH part 1 */
733 cio_write(JP2C,4); /* OBH part 2 */
735 cio_write(1,1); /* NI */
737 cio_write(offset_idx,8); /* IOFF */
738 cio_write(length_idx,4); /* IBH part 1 */
739 cio_write(JPIP_CIDX,4); /* IBH part 2 */
743 cio_write(len, 4); /* L */
751 * File Index (superbox)
754 int jpip_write_fidx(int offset_jp2c, int length_jp2c, int offset_idx, int length_idx)
758 cio_skip(4); /* L [at the end] */
759 cio_write(JPIP_FIDX, 4); /* IPTR */
761 jpip_write_prxy(offset_jp2c, length_jp2c, offset_idx, offset_jp2c);
765 cio_write(len, 4); /* L */