/* * 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 #include #include #include #include #include #include "j2k.h" #include "cio.h" #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 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; void jpip_write_cptr(int offset, info_image_t img) // Codestream finder box (box) { 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 len=cio_tell()-lenp; cio_seek(lenp); cio_write(len, 4); // L cio_seek(lenp+len); } void jpip_write_manf(int second, int v, info_marker_t *marker) // Manifest box (box) { int len, lenp, i; lenp=cio_tell(); cio_skip(4); // L [at the end] cio_write(JPIP_MANF,4); // T if (second) // Write only during the second pass { 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_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 { int len, lenp, i; int version = 0; int tileno, resno, precno, layno, num_packet=0; lenp=cio_tell(); cio_skip(4); // L [at the end] cio_write(JPIP_FAIX, 4); // MHIX cio_write(version,1); // Version 0 = 4 bytes switch(v) { case 0: // TPIX cio_write(1,version?8:4); // NMAX cio_write(img.tw*img.th,version?8:4); // M for (i=0;icompo[compno]; int correction; if(j2k_cp->tcps[tileno].csty&J2K_CP_CSTY_EPH) correction=3; else correction=1; for(resno=0;resnoreso[resno]; for (precno=0;precnoprec[precno]; 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); num_packet++; } } } } // PADDING while (num_packetcompo[compno]; int correction; if(j2k_cp->tcps[tileno].csty&J2K_CP_CSTY_EPH) correction=3; else correction=1; for(resno=0;resnoreso[resno]; for (precno=0;precnoprec[precno]; 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); num_packet++; } } } } // PADDING while (num_packet