4 * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
5 * Copyright (c) 2002-2011, Professor Benoit Macq
6 * Copyright (c) 2003-2004, Yannick Verschueren
7 * Copyright (c) 2010-2011, Kaori Hagihara
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
33 * \brief Modification of jpip.c from 2KAN indexer
39 #include "indexbox_manager.h"
44 * Write tile-part headers mhix box
46 * @param[in] coff offset of j2k codestream
47 * @param[in] cstr_info codestream information
48 * @param[in] tileno tile number
49 * @param[in] cio file output handle
50 * @return length of mhix box
52 int write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_cio_t *cio);
54 int write_thix( int coff, opj_codestream_info_t cstr_info, opj_cio_t *cio)
61 box = (opj_jp2_box_t *)calloc( cstr_info.tw*cstr_info.th, sizeof(opj_jp2_box_t));
63 for ( i = 0; i < 2 ; i++ ){
67 lenp = cio_tell( cio);
68 cio_skip( cio, 4); /* L [at the end] */
69 cio_write( cio, JPIP_THIX, 4); /* THIX */
70 write_manf( i, cstr_info.tw*cstr_info.th, box, cio);
72 for (tileno = 0; tileno < cstr_info.tw*cstr_info.th; tileno++){
73 box[tileno].length = write_tilemhix( coff, cstr_info, tileno, cio);
74 box[tileno].type = JPIP_MHIX;
77 len = cio_tell( cio)-lenp;
79 cio_write( cio, len, 4); /* L */
80 cio_seek( cio, lenp+len);
92 * @param[in] coff offset of j2k codestream
93 * @param[in] startpos tile start byte position
94 * @param[in] endpos tile end position
95 * @param[in] cio file output handle
96 * @param[out] marknum pointer to number of markers
97 * @return found marker information array
99 opj_marker_info_t * find_tile_markers( int coff, int startpos, int endpos, opj_cio_t *cio, int *marknum);
101 int write_tilemhix( int coff, opj_codestream_info_t cstr_info, int tileno, opj_cio_t *cio)
104 opj_tile_info_t tile;
108 opj_marker_info_t *marker;
110 lenp = cio_tell( cio);
111 cio_skip( cio, 4); /* L [at the end] */
112 cio_write( cio, JPIP_MHIX, 4); /* MHIX */
114 tile = cstr_info.tile[tileno];
117 cio_ext_write( cio, tp.tp_end_header-tp.tp_start_pos+1, 8); /* TLEN */
119 marker = find_tile_markers( coff, tile.start_pos, tile.end_header, cio, &marknum);
121 for( i=0; i<marknum; i++){ /* Marker restricted to 1 apparition */
122 cio_write( cio, marker[i].type, 2);
123 cio_write( cio, 0, 2);
124 cio_ext_write( cio, marker[i].pos, 8);
125 cio_write( cio, marker[i].len, 2);
130 len = cio_tell( cio) - lenp;
131 cio_seek( cio, lenp);
132 cio_write( cio, len, 4); /* L */
133 cio_seek( cio, lenp+len);
140 * Get tile marker size
142 * @param[in] type marker type
143 * @param[in] cio file input handle
144 * @return marker size
146 unsigned short get_tile_markersize( unsigned short type, opj_cio_t *cio);
148 opj_marker_info_t * find_tile_markers( int coff, int startpos, int endpos, opj_cio_t *cio, int *marknum)
151 opj_marker_info_t *marker, *tmp;
152 int max_num_of_markers = 100;
154 marker = (opj_marker_info_t *)malloc( max_num_of_markers*sizeof(opj_marker_info_t));
156 fprintf( stderr, "malloc error for marker in find_tile_markers()\n");
161 org_pos = cio_tell( cio);
162 cio_seek( cio, coff+startpos);
165 while( pos < coff+endpos){
166 if( *marknum >= max_num_of_markers){
168 marker = (opj_marker_info_t *)malloc( (max_num_of_markers+100)*sizeof(opj_marker_info_t));
169 memcpy( marker, tmp, max_num_of_markers*sizeof(opj_marker_info_t));
171 max_num_of_markers += 100;
174 marker[*marknum].type = cio_read( cio, 2);
175 marker[*marknum].pos = cio_tell( cio)-coff;
176 marker[*marknum].len = get_tile_markersize( marker[*marknum].type, cio);
177 cio_skip( cio, marker[*marknum].len);
180 pos += 2+marker[*marknum].len;
183 cio_seek( cio, org_pos);
188 unsigned short get_tile_markersize( unsigned short type, opj_cio_t *cio)
202 pos = cio_tell( cio);
203 siz = cio_read( cio, 2);