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) 2010-2011, Kaori Hagihara
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
36 #include "box_manager.h"
37 #include "opj_inttypes.h"
40 #include "fcgi_stdio.h"
41 #define logstream FCGI_stdout
43 #define FCGI_stdout stdout
44 #define FCGI_stderr stderr
45 #define logstream stderr
48 boxlist_param_t * gene_boxlist(void)
50 boxlist_param_t *boxlist;
52 boxlist = (boxlist_param_t *)malloc( sizeof(boxlist_param_t));
54 boxlist->first = NULL;
60 boxlist_param_t * get_boxstructure( int fd, OPJ_OFF_T offset, OPJ_SIZE_T length)
62 boxlist_param_t *boxlist;
68 assert( (OPJ_OFF_T)length>=0);
70 if(!(box = gene_boxbyOffset( fd, pos)))
73 assert( (OPJ_OFF_T)box->length >= 0);
74 pos += (OPJ_OFF_T)box->length;
77 boxlist = gene_boxlist();
78 insert_box_into_list( box, boxlist);
79 }while( pos < offset+(OPJ_OFF_T)length);
84 box_param_t * gene_boxbyOffset( int fd, OPJ_OFF_T offset)
92 /* read LBox and TBox*/
93 if(!(data = fetch_bytes( fd, offset, 8))){
94 fprintf( FCGI_stderr, "Error: error in gene_boxbyOffset( %d, %" PRId64 ")\n", fd, offset);
99 boxlen = (Byte8_t)big4(data);
100 boxtype = (char *)(data+4);
102 /* box type constraint*/
103 if( !isalpha(boxtype[0]) || !isalpha(boxtype[1]) ||
104 (!isalnum(boxtype[2])&&!isspace(boxtype[2])) ||
105 (!isalpha(boxtype[3])&&!isspace(boxtype[3]))){
114 if((data2 = fetch_bytes( fd, offset+8, 8))){
115 boxlen = big8(data2);
119 fprintf( FCGI_stderr, "Error: error in gene_boxbyOffset( %d, %" PRId64 ")\n", fd, offset);
124 box = (box_param_t *)malloc( sizeof( box_param_t));
126 box->offset = offset;
127 box->headlen = headlen;
128 box->length = boxlen;
129 strncpy( box->type, boxtype, 4);
135 box_param_t * gene_boxbyOffinStream( Byte_t *stream, OPJ_OFF_T offset)
142 /* read LBox and TBox*/
144 boxlen = (Byte8_t)big4( stream);
145 boxtype = (char *)( stream+4);
147 /* box type constraint*/
148 if( !isalpha(boxtype[0]) || !isalpha(boxtype[1]) ||
149 (!isalnum(boxtype[2])&&!isspace(boxtype[2])) ||
150 (!isalpha(boxtype[3])&&!isspace(boxtype[3]))){
156 boxlen = big8( stream+8); /* read XLBox*/
158 box = (box_param_t *)malloc( sizeof( box_param_t));
160 box->offset = offset;
161 box->headlen = headlen;
162 box->length = boxlen;
163 strncpy( box->type, boxtype, 4);
170 box_param_t * gene_boxbyType( int fd, OPJ_OFF_T offset, OPJ_SIZE_T length, const char TBox[])
177 box_param_t *foundbox;
180 if( length==0){ /* set the max length*/
181 if( get_filesize( fd) <= offset )
183 assert( get_filesize( fd) > offset );
184 assert( offset >= 0 );
185 length = (OPJ_SIZE_T)(get_filesize( fd) - offset);
190 assert( (OPJ_OFF_T)length >= 0 );
191 while( pos < offset+(OPJ_OFF_T)length-7){ /* LBox+TBox-1=7*/
193 /* read LBox and TBox*/
194 if((data = fetch_bytes( fd, pos, 8))){
196 boxlen = (Byte8_t)big4(data);
197 boxtype = (char *)(data+4);
203 if((data2 = fetch_bytes( fd, pos+8, 8))){
204 boxlen = big8(data2);
208 fprintf( FCGI_stderr, "Error: error in gene_boxbyType( %d, %" PRId64 ", %" PRId64 ", %s)\n", fd, offset, length, TBox);
212 if( strncmp ( boxtype, TBox, 4) == 0){
213 foundbox = (box_param_t *)malloc( sizeof( box_param_t));
215 foundbox->offset = pos;
216 foundbox->headlen = headlen;
217 foundbox->length = boxlen;
218 strncpy( foundbox->type, TBox, 4);
219 foundbox->next = NULL;
226 fprintf( FCGI_stderr, "Error: error in gene_boxbyType( %d, %" PRId64 ", %" PRId64 ", %s)\n", fd, offset, length, TBox);
229 assert( ((Byte8_t)pos+boxlen)>=(Byte8_t)pos);
230 pos+= (OPJ_OFF_T)boxlen;
232 fprintf( FCGI_stderr, "Error: Box %s not found\n", TBox);
237 box_param_t * gene_boxbyTypeinStream( Byte_t *stream, OPJ_OFF_T offset, OPJ_SIZE_T length, const char TBox[])
244 box_param_t *foundbox;
248 assert( (OPJ_OFF_T)length >= 0 );
249 while( pos < offset+(OPJ_OFF_T)(length)-7){ /* LBox+TBox-1=7*/
251 /* read LBox and TBox*/
254 boxlen = (Byte8_t)big4(data);
255 boxtype = (char *)(data+4);
260 boxlen = big8( data+8);
263 if( strncmp ( boxtype, TBox, 4) == 0){
264 foundbox = (box_param_t *)malloc( sizeof( box_param_t));
266 foundbox->offset = pos;
267 foundbox->headlen = headlen;
268 foundbox->length = boxlen;
269 strncpy( foundbox->type, TBox, 4);
270 foundbox->next = NULL;
273 assert( ((Byte8_t)pos+boxlen)>=(Byte8_t)pos);
274 pos+= (OPJ_OFF_T)boxlen;
276 fprintf( FCGI_stderr, "Error: Box %s not found\n", TBox);
281 box_param_t * gene_childboxbyOffset( box_param_t *superbox, OPJ_OFF_T offset)
283 return gene_boxbyOffset( superbox->fd, get_DBoxoff( superbox)+offset);
286 box_param_t * gene_childboxbyType( box_param_t *superbox, OPJ_OFF_T offset, const char TBox[])
288 OPJ_SIZE_T DBOXlen = get_DBoxlen(superbox);
289 assert( offset >= 0 );
290 if( DBOXlen < (OPJ_SIZE_T)offset )
292 fprintf( FCGI_stderr, "Error: Impossible happen %lu < %ld\n", DBOXlen, offset);
295 return gene_boxbyType( superbox->fd, get_DBoxoff( superbox)+offset, DBOXlen-(OPJ_SIZE_T)offset, TBox);
298 OPJ_OFF_T get_DBoxoff( box_param_t *box)
300 return box->offset+box->headlen;
303 OPJ_SIZE_T get_DBoxlen( box_param_t *box)
305 return box->length - box->headlen;
308 Byte_t * fetch_headbytes( box_param_t *box)
310 return fetch_bytes( box->fd, box->offset, box->headlen);
313 Byte_t * fetch_DBoxbytes( box_param_t *box, OPJ_OFF_T offset, OPJ_SIZE_T size)
315 return fetch_bytes( box->fd, get_DBoxoff( box)+offset, size);
318 Byte_t fetch_DBox1byte( box_param_t *box, OPJ_OFF_T offset)
320 return fetch_1byte( box->fd, get_DBoxoff( box)+offset);
323 Byte2_t fetch_DBox2bytebigendian( box_param_t *box, OPJ_OFF_T offset)
325 return fetch_2bytebigendian( box->fd, get_DBoxoff( box)+offset);
328 Byte4_t fetch_DBox4bytebigendian( box_param_t *box, OPJ_OFF_T offset)
330 return fetch_4bytebigendian( box->fd, get_DBoxoff( box)+offset);
333 Byte8_t fetch_DBox8bytebigendian( box_param_t *box, OPJ_OFF_T offset)
335 return fetch_8bytebigendian( box->fd, get_DBoxoff( box)+offset);
338 box_param_t * search_box( const char type[], boxlist_param_t *boxlist)
340 box_param_t *foundbox;
342 foundbox = boxlist->first;
344 while( foundbox != NULL){
346 if( strncmp( type, foundbox->type, 4) == 0)
349 foundbox = foundbox->next;
351 fprintf( FCGI_stderr, "Error: Box %s not found\n", type);
356 void print_box( box_param_t *box)
358 fprintf( logstream, "box info:\n"
360 "\t offset: %" PRId64 " %#" PRIx64 "\n"
361 "\t header length: %d\n"
362 "\t length: %" PRId64 " %#" PRIx64 "\n", box->type, box->offset,
363 box->offset, box->headlen, box->length, box->length);
366 void print_allbox( boxlist_param_t *boxlist)
373 ptr = boxlist->first;
375 fprintf( logstream, "no box\n");
377 fprintf( logstream, "all box info: \n");
384 void delete_box_in_list( box_param_t **box, boxlist_param_t *boxlist)
388 if( *box == boxlist->first)
389 boxlist->first = (*box)->next;
391 ptr = boxlist->first;
392 while( ptr->next != *box){
395 ptr->next = (*box)->next;
397 if( *box == boxlist->last)
403 void delete_box_in_list_by_type( const char type[], boxlist_param_t *boxlist)
407 box = search_box( type, boxlist);
408 delete_box_in_list( &box, boxlist);
411 void delete_boxlist( boxlist_param_t **boxlist)
413 box_param_t *boxPtr, *boxNext;
418 boxPtr = (*boxlist)->first;
419 while( boxPtr != NULL){
420 boxNext=boxPtr->next;
427 void insert_box_into_list( box_param_t *box, boxlist_param_t *boxlist)
430 boxlist->last->next = box;
432 boxlist->first = box;