2 * $Id: msgqueue_manager.c 53 2011-05-09 16:55:39Z kaori $
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.
34 #include <sys/types.h>
40 #include "msgqueue_manager.h"
41 #include "metadata_manager.h"
45 #include "fcgi_stdio.h"
46 #define logstream FCGI_stdout
48 #define FCGI_stdout stdout
49 #define FCGI_stderr stderr
50 #define logstream stderr
53 #define PRECINCT_MSG 0
54 #define EXT_PRECINCT_MSG 1
55 #define TILE_HEADER_MSG 2
57 #define EXT_TILE_MSG 5
58 #define MAINHEADER_MSG 6
59 #define METADATA_MSG 8
61 msgqueue_param_t * gene_msgqueue( bool stateless, cachemodel_param_t *cachemodel)
63 msgqueue_param_t *msgqueue;
65 msgqueue = (msgqueue_param_t *)malloc( sizeof(msgqueue_param_t));
67 msgqueue->first = NULL;
68 msgqueue->last = NULL;
70 msgqueue->stateless = stateless;
71 msgqueue->cachemodel = cachemodel;
76 void delete_msgqueue( msgqueue_param_t **msgqueue)
78 message_param_t *ptr, *next;
83 ptr = (*msgqueue)->first;
90 if( (*msgqueue)->stateless && (*msgqueue)->cachemodel)
91 delete_cachemodel( &((*msgqueue)->cachemodel));
96 void print_msgqueue( msgqueue_param_t *msgqueue)
103 fprintf( logstream, "message queue:\n");
104 ptr = msgqueue->first;
107 fprintf( logstream, "\t class_id: %lld\n", ptr->class_id );
108 fprintf( logstream, "\t in_class_id: %lld\n", ptr->in_class_id );
109 fprintf( logstream, "\t csn: %lld\n", ptr->csn );
110 fprintf( logstream, "\t bin_offset: %#llx\n", ptr->bin_offset );
111 fprintf( logstream, "\t length: %#llx\n", ptr->length );
112 fprintf( logstream, "\t aux: %lld\n", ptr->aux );
113 fprintf( logstream, "\t last_byte: %d\n", ptr->last_byte );
115 print_placeholder( ptr->phld);
117 fprintf( logstream, "\t res_offset: %#llx\n", ptr->res_offset );
118 fprintf( logstream, "\n");
124 void enqueue_message( message_param_t *msg, msgqueue_param_t *msgqueue);
126 void enqueue_mainheader( msgqueue_param_t *msgqueue)
128 cachemodel_param_t *cachemodel;
129 target_param_t *target;
130 message_param_t *msg;
132 cachemodel = msgqueue->cachemodel;
133 target = cachemodel->target;
135 msg = (message_param_t *)malloc( sizeof(message_param_t));
137 msg->last_byte = true;
138 msg->in_class_id = 0;
139 msg->class_id = MAINHEADER_MSG;
140 msg->csn = target->csn;
142 msg->length = target->codeidx->mhead_length;
143 msg->aux = 0; // non exist
144 msg->res_offset = target->codeidx->offset;
148 enqueue_message( msg, msgqueue);
150 cachemodel->mhead_model = true;
153 void enqueue_tile( int tile_id, int level, msgqueue_param_t *msgqueue)
155 cachemodel_param_t *cachemodel;
156 target_param_t *target;
158 Byte8_t numOftparts; // num of tile parts par tile
160 index_param_t *codeidx;
161 faixbox_param_t *tilepart;
162 message_param_t *msg;
163 Byte8_t binOffset, binLength;
166 cachemodel = msgqueue->cachemodel;
167 target = cachemodel->target;
168 codeidx = target->codeidx;
169 tilepart = codeidx->tilepart;
171 numOftparts = get_nmax( tilepart);
172 numOftiles = get_m( tilepart);
174 if( tile_id < 0 || numOftiles <= tile_id){
175 fprintf( FCGI_stderr, "Error, Invalid tile-id %d\n", tile_id);
179 tp_model = &cachemodel->tp_model[ tile_id*numOftparts];
182 for( i=0; i<numOftparts-level; i++){
183 binLength = get_elemLen( tilepart, i, tile_id);
186 msg = (message_param_t *)malloc( sizeof(message_param_t));
188 msg->last_byte = i==numOftparts-1? true : false;
189 msg->in_class_id = tile_id;
191 msg->class_id = TILE_MSG;
193 msg->class_id = EXT_TILE_MSG;
195 msg->csn = target->csn;
196 msg->bin_offset = binOffset;
197 msg->length = binLength;
198 msg->aux = numOftparts-i;
199 msg->res_offset = codeidx->offset+get_elemOff( tilepart, i, tile_id)/*-1*/;
203 enqueue_message( msg, msgqueue);
207 binOffset += binLength;
211 void enqueue_box( int meta_id, boxlist_param_t *boxlist, msgqueue_param_t *msgqueue, Byte8_t *binOffset);
212 void enqueue_phld( int meta_id, placeholderlist_param_t *phldlist, msgqueue_param_t *msgqueue, Byte8_t *binOffset);
213 void enqueue_boxcontents( int meta_id, boxcontents_param_t *boxcontents, msgqueue_param_t *msgqueue, Byte8_t *binOffset);
215 void enqueue_metadata( int meta_id, msgqueue_param_t *msgqueue)
217 metadatalist_param_t *metadatalist;
218 metadata_param_t *metadata;
221 metadatalist = msgqueue->cachemodel->target->codeidx->metadatalist;
222 metadata = search_metadata( meta_id, metadatalist);
225 fprintf( FCGI_stderr, "Error: metadata-bin %d not found\n", meta_id);
230 if( metadata->boxlist)
231 enqueue_box( meta_id, metadata->boxlist, msgqueue, &binOffset);
233 if( metadata->placeholderlist)
234 enqueue_phld( meta_id, metadata->placeholderlist, msgqueue, &binOffset);
236 if( metadata->boxcontents)
237 enqueue_boxcontents( meta_id, metadata->boxcontents, msgqueue, &binOffset);
239 msgqueue->last->last_byte = true;
242 message_param_t * gene_metamsg( int meta_id, Byte8_t binoffset, Byte8_t length, Byte8_t res_offset, placeholder_param_t *phld, Byte8_t csn);
244 void enqueue_box( int meta_id, boxlist_param_t *boxlist, msgqueue_param_t *msgqueue, Byte8_t *binOffset)
247 message_param_t *msg;
249 box = boxlist->first;
251 msg = gene_metamsg( meta_id, *binOffset, box->length, box->offset, NULL, msgqueue->cachemodel->target->csn);
252 enqueue_message( msg, msgqueue);
254 *binOffset += box->length;
259 void enqueue_phld( int meta_id, placeholderlist_param_t *phldlist, msgqueue_param_t *msgqueue, Byte8_t *binOffset)
261 placeholder_param_t *phld;
262 message_param_t *msg;
264 phld = phldlist->first;
266 msg = gene_metamsg( meta_id, *binOffset, phld->LBox, 0, phld, msgqueue->cachemodel->target->csn);
267 enqueue_message( msg, msgqueue);
269 *binOffset += phld->LBox;
274 void enqueue_boxcontents( int meta_id, boxcontents_param_t *boxcontents, msgqueue_param_t *msgqueue, Byte8_t *binOffset)
276 message_param_t *msg;
278 msg = gene_metamsg( meta_id, *binOffset, boxcontents->length, boxcontents->offset, NULL, msgqueue->cachemodel->target->csn);
279 enqueue_message( msg, msgqueue);
281 *binOffset += boxcontents->length;
284 message_param_t * gene_metamsg( int meta_id, Byte8_t binOffset, Byte8_t length, Byte8_t res_offset, placeholder_param_t *phld, Byte8_t csn)
286 message_param_t *msg;
288 msg = (message_param_t *)malloc( sizeof(message_param_t));
290 msg->last_byte = false;
291 msg->in_class_id = meta_id;
292 msg->class_id = METADATA_MSG;
294 msg->bin_offset = binOffset;
295 msg->length = length;
296 msg->aux = 0; // non exist
297 msg->res_offset = res_offset;
304 void enqueue_message( message_param_t *msg, msgqueue_param_t *msgqueue)
307 msgqueue->last->next = msg;
309 msgqueue->first = msg;
311 msgqueue->last = msg;
315 void emit_bin_id_vbas( Byte_t bb, Byte_t c, Byte8_t in_class_id);
316 void emit_vbas( Byte8_t code);
317 void emit_body( message_param_t *msg, int fd);
318 void emit_placeholder( placeholder_param_t *phld);
320 void emit_stream_from_msgqueue( msgqueue_param_t *msgqueue)
322 message_param_t *msg;
323 Byte8_t class_id, csn;
329 msg = msgqueue->first;
333 if( msg->csn == csn){
334 if( msg->class_id == class_id)
338 class_id = msg->class_id;
343 class_id = msg->class_id;
347 c = msg->last_byte ? 1 : 0;
349 emit_bin_id_vbas( bb, c, msg->in_class_id);
352 emit_vbas( class_id);
356 emit_vbas( msg->bin_offset);
357 emit_vbas (msg->length);
359 if( msg->class_id%2) // Aux is present only if the id is odd
360 emit_vbas( msg->aux);
363 emit_placeholder( msg->phld);
365 emit_body( msg, msgqueue->cachemodel->target->fd);
371 void emit_vbas_with_bytelen( Byte8_t code, int bytelength);
372 void print_binarycode( Byte8_t n, int segmentlen);
374 void emit_bin_id_vbas( Byte_t bb, Byte_t c, Byte8_t in_class_id)
379 // A.2.3 In-class identifiers
380 // 7k-3bits, where k is the number of bytes in the VBAS
382 tmp = in_class_id >> 4;
388 in_class_id |= (((bb & 3) << 5) | (c & 1) << 4) << ((bytelength-1)*7);
390 emit_vbas_with_bytelen( in_class_id, bytelength);
393 void emit_vbas( Byte8_t code)
403 emit_vbas_with_bytelen( code, bytelength);
406 void emit_vbas_with_bytelen( Byte8_t code, int bytelength)
413 seg = ( code >> (n*7)) & 0x7f;
416 fputc(( Byte4_t)seg, FCGI_stdout);
421 void emit_body( message_param_t *msg, int fd)
425 if( lseek( fd, msg->res_offset, SEEK_SET)==-1){
426 fprintf( FCGI_stderr, "Error: fseek in emit_body()\n");
430 data = (Byte_t *)malloc( msg->length);
431 if( read( fd, data, msg->length) != msg->length){
433 fprintf( FCGI_stderr, "Error: fread in emit_body()\n");
437 if( fwrite( data, msg->length, 1, FCGI_stdout) < 1){
439 fprintf( FCGI_stderr, "Error: fwrite in emit_body()\n");
445 void emit_bigendian_bytes( Byte8_t code, int bytelength);
447 void emit_placeholder( placeholder_param_t *phld)
449 emit_bigendian_bytes( phld->LBox, 4);
450 if( fwrite( phld->TBox, 4, 1, FCGI_stdout) < 1){
451 fprintf( FCGI_stderr, "Error: fwrite in emit_placeholder()\n");
454 emit_bigendian_bytes( phld->Flags, 4);
455 emit_bigendian_bytes( phld->OrigID, 8);
457 if( fwrite( phld->OrigBH, phld->OrigBHlen, 1, FCGI_stdout) < 1){
458 fprintf( FCGI_stderr, "Error: fwrite in emit_placeholder()\n");
463 void emit_bigendian_bytes( Byte8_t code, int bytelength)
470 seg = ( code >> (n*8)) & 0xff;
471 fputc(( Byte4_t)seg, FCGI_stdout);
475 void print_binarycode( Byte8_t n, int segmentlen)
481 buf[i++] = n%2 ? '1' : '0';
484 for( j=segmentlen-1; j>=i; j--)
487 for( j=i-1, k=0; j>=0; j--, k++){
489 if( !((k+1)%segmentlen))
495 Byte_t * parse_bin_id_vbas( Byte_t *streamptr, Byte_t *bb, Byte_t *c, Byte8_t *in_class_id);
496 Byte_t * parse_vbas( Byte_t *streamptr, Byte8_t *elem);
498 void parse_JPIPstream( Byte_t *JPIPstream, Byte8_t streamlen, Byte8_t offset, msgqueue_param_t *msgqueue)
500 Byte_t *ptr; // stream pointer
501 message_param_t *msg;
503 Byte8_t class_id, csn;
505 class_id = -1; // dummy
508 while( ptr-JPIPstream < streamlen){
509 msg = (message_param_t *)malloc( sizeof(message_param_t));
511 ptr = parse_bin_id_vbas( ptr, &bb, &c, &msg->in_class_id);
513 msg->last_byte = c == 1 ? true : false;
516 ptr = parse_vbas( ptr, &class_id);
517 // fprintf( stdout, "class_id: %lld\n", class_id);
519 msg->class_id = class_id;
522 ptr = parse_vbas( ptr, &csn);
525 ptr = parse_vbas( ptr, &msg->bin_offset);
526 ptr = parse_vbas( ptr, &msg->length);
528 if( msg->class_id%2) // Aux is present only if the id is odd
529 ptr = parse_vbas( ptr, &msg->aux);
533 msg->res_offset = ptr-JPIPstream+offset;
538 msgqueue->last->next = msg;
540 msgqueue->first = msg;
541 msgqueue->last = msg;
547 void parse_metadata( metadata_param_t *metadata, message_param_t *msg, Byte_t *stream);
549 void parse_metamsg( msgqueue_param_t *msgqueue, Byte_t *stream, Byte8_t streamlen, metadatalist_param_t *metadatalist)
551 message_param_t *msg;
553 if( metadatalist == NULL)
556 msg = msgqueue->first;
558 if( msg->class_id == METADATA_MSG){
559 metadata_param_t *metadata = gene_metadata( msg->in_class_id, NULL, NULL, NULL);
560 insert_metadata_into_list( metadata, metadatalist);
561 parse_metadata( metadata, msg, stream+msg->res_offset);
567 placeholder_param_t * parse_phld( Byte_t *datastream, Byte8_t metalength);
569 void parse_metadata( metadata_param_t *metadata, message_param_t *msg, Byte_t *datastream)
571 char *boxtype = (char *)(datastream+4);
575 if( strncmp( boxtype, "phld", 4) == 0){
576 if( !metadata->placeholderlist)
577 metadata->placeholderlist = gene_placeholderlist();
579 placeholder_param_t *phld = parse_phld( datastream, msg->length);
581 insert_placeholder_into_list( phld, metadata->placeholderlist);
583 else if( isalpha(boxtype[0]) && isalpha(boxtype[1]) &&
584 (isalnum(boxtype[2])||isblank(boxtype[2])) &&
585 (isalpha(boxtype[3])||isblank(boxtype[3]))){
586 if( !metadata->boxlist)
587 metadata->boxlist = gene_boxlist();
589 box_param_t *box = gene_boxbyOffinStream( datastream, msg->res_offset);
590 insert_box_into_list( box, metadata->boxlist);
593 metadata->boxcontents = gene_boxcontents( msg->res_offset, msg->length);
596 placeholder_param_t * parse_phld( Byte_t *datastream, Byte8_t metalength)
598 placeholder_param_t *phld;
600 phld = (placeholder_param_t *)malloc( sizeof(placeholder_param_t));
602 phld->LBox = big4( datastream);
603 strcpy( phld->TBox, "phld");
604 phld->Flags = big4( datastream+8);
605 phld->OrigID = big8( datastream+12);
606 phld->OrigBHlen = metalength - 20;
607 phld->OrigBH = (Byte_t *)malloc(phld->OrigBHlen);
608 memcpy( phld->OrigBH, datastream+20, phld->OrigBHlen);
614 Byte_t * parse_bin_id_vbas( Byte_t *streamptr, Byte_t *bb, Byte_t *c, Byte8_t *in_class_id)
622 *bb = (code >> 5) & 3;
623 *c = (code >> 4) & 1;
625 *in_class_id = code & 15;
629 *in_class_id = (*in_class_id << 7) | (code & 0x7f);
634 Byte_t * parse_vbas( Byte_t *streamptr, Byte8_t *elem)
643 *elem = (*elem << 7) | (code & 0x7f);
650 * search a message by class_id
652 * @param[in] class_id class identifiers
653 * @param[in] in_class_id in-class identifiers, -1 means any
654 * @param[in] csn codestream number
655 * @param[in] msg first message pointer of the searching list
656 * @return found message pointer
658 message_param_t * search_message( Byte8_t class_id, Byte8_t in_class_id, Byte8_t csn, message_param_t *msg);
662 * delete a message in msgqueue
664 * @param[in] message address of the deleting message pointer
665 * @param[in] msgqueue message queue pointer
667 void delete_message_in_msgqueue( message_param_t **message, msgqueue_param_t *msgqueue);
670 * reconstruct j2k codestream from JPT- (in future, JPP-) stream
672 * @param[in] msgqueue message queue pointer
673 * @param[in] jpipstream original JPT- JPP- stream
674 * @param[in] csn codestream number
675 * @param[in] minlev minimum decomposition level
676 * @param[out] codelen codestream length
677 * @return generated reconstructed j2k codestream
679 Byte_t * recons_codestream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, int minlev, Byte8_t *codelen);
681 Byte_t * recons_j2k( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, int minlev, Byte8_t *j2klen)
683 Byte_t *j2kstream = NULL;
688 j2kstream = recons_codestream( msgqueue, jpipstream, csn, minlev, j2klen);
693 Byte_t * add_emptyboxstream( placeholder_param_t *phld, Byte_t *jp2stream, Byte8_t *jp2len);
694 Byte_t * add_msgstream( message_param_t *message, Byte_t *origstream, Byte_t *j2kstream, Byte8_t *j2klen);
696 Byte_t * recons_jp2( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, Byte8_t *jp2len)
698 message_param_t *ptr;
699 Byte_t *jp2stream = NULL;
700 Byte_t *codestream = NULL;
702 Byte8_t jp2cDBoxOffset = 0, jp2cDBoxlen = 0;
709 ptr = msgqueue->first;
710 while(( ptr = search_message( METADATA_MSG, -1, csn, ptr))!=NULL){
712 if( strncmp( (char *)ptr->phld->OrigBH+4, "jp2c", 4) == 0){
713 jp2cDBoxOffset = *jp2len + ptr->phld->OrigBHlen;
714 jp2stream = add_emptyboxstream( ptr->phld, jp2stream, jp2len); // header only
715 jp2cDBoxlen = *jp2len - jp2cDBoxOffset;
718 jp2stream = add_emptyboxstream( ptr->phld, jp2stream, jp2len); // header only
720 jp2stream = add_msgstream( ptr, jpipstream, jp2stream, jp2len);
724 codestream = recons_codestream( msgqueue, jpipstream, csn, 0, &codelen);
726 if( jp2cDBoxOffset != 0 && codelen <= jp2cDBoxlen)
727 memcpy( jp2stream+jp2cDBoxOffset, codestream, codelen);
734 int get_last_tileID( msgqueue_param_t *msgqueue, Byte8_t csn);
735 Byte_t * add_emptytilestream( const int tileID, Byte_t *j2kstream, Byte8_t *j2klen);
736 Byte_t * add_EOC( Byte_t *j2kstream, Byte8_t *j2klen);
738 // usable only to JPT-stream messages
739 // PRECINCT_MSG, EXT_PRECINCT_MSG, TILE_HEADER_MSG need to be handled
740 Byte_t * recons_codestream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, int minlev, Byte8_t *codelen)
742 message_param_t *ptr;
743 Byte_t *codestream = NULL;
752 ptr = msgqueue->first;
754 while(( ptr = search_message( MAINHEADER_MSG, -1, csn, ptr))!=NULL){
755 if( ptr->bin_offset == binOffset){
756 codestream = add_msgstream( ptr, jpipstream, codestream, codelen);
757 binOffset += ptr->length;
762 last_tileID = get_last_tileID( msgqueue, csn);
764 for( tileID=0; tileID <= last_tileID; tileID++){
768 ptr = msgqueue->first;
769 while(( ptr = search_message( TILE_MSG, tileID, csn, ptr))!=NULL){
770 if( ptr->bin_offset == binOffset){
772 codestream = add_msgstream( ptr, jpipstream, codestream, codelen);
773 binOffset += ptr->length;
777 ptr = msgqueue->first;
778 while(( ptr = search_message( EXT_TILE_MSG, tileID, csn, ptr))!=NULL){
779 if( ptr->aux >= minlev){
780 if( ptr->bin_offset == binOffset){
782 codestream = add_msgstream( ptr, jpipstream, codestream, codelen);
783 binOffset += ptr->length;
789 codestream = add_emptytilestream( tileID, codestream, codelen);
791 codestream = add_EOC( codestream, codelen);
796 int get_last_tileID( msgqueue_param_t *msgqueue, Byte8_t csn)
799 message_param_t *msg;
801 msg = msgqueue->first;
803 if((msg->class_id == TILE_MSG || msg->class_id == EXT_TILE_MSG) && msg->csn == csn && last_tileID < msg->in_class_id)
804 last_tileID = msg->in_class_id;
810 message_param_t * search_message( Byte8_t class_id, Byte8_t in_class_id, Byte8_t csn, message_param_t *msg)
813 if( in_class_id == -1){
814 if( msg->class_id == class_id && msg->csn == csn)
818 if( msg->class_id == class_id && msg->in_class_id == in_class_id && msg->csn == csn)
826 void delete_message_in_msgqueue( message_param_t **msg, msgqueue_param_t *msgqueue)
828 message_param_t *ptr;
833 if( *msg == msgqueue->first)
834 msgqueue->first = (*msg)->next;
836 ptr = msgqueue->first;
837 while( ptr->next != *msg){
841 ptr->next = (*msg)->next;
843 if( *msg == msgqueue->last)
844 msgqueue->last = ptr;
849 Byte_t * gene_msgstream( message_param_t *message, Byte_t *stream, Byte8_t *length);
850 Byte_t * gene_emptytilestream( const int tileID, Byte8_t *length);
853 Byte_t * add_msgstream( message_param_t *message, Byte_t *origstream, Byte_t *j2kstream, Byte8_t *j2klen)
862 newstream = gene_msgstream( message, origstream, &newlen);
864 buf = (Byte_t *)malloc(( *j2klen)+newlen);
866 memcpy( buf, j2kstream, *j2klen);
867 memcpy( buf+(*j2klen), newstream, newlen);
872 if(j2kstream) free(j2kstream);
878 Byte_t * add_emptyboxstream( placeholder_param_t *phld, Byte_t *jp2stream, Byte8_t *jp2len)
884 if( phld->OrigBHlen == 8)
885 newlen = big4(phld->OrigBH);
887 newlen = big8(phld->OrigBH+8);
889 newstream = (Byte_t *)malloc( newlen);
890 memset( newstream, 0, newlen);
891 memcpy( newstream, phld->OrigBH, phld->OrigBHlen);
893 buf = (Byte_t *)malloc(( *jp2len)+newlen);
895 memcpy( buf, jp2stream, *jp2len);
896 memcpy( buf+(*jp2len), newstream, newlen);
901 if(jp2stream) free(jp2stream);
906 Byte_t * add_emptytilestream( const int tileID, Byte_t *j2kstream, Byte8_t *j2klen)
912 newstream = gene_emptytilestream( tileID, &newlen);
914 buf = (Byte_t *)malloc(( *j2klen)+newlen);
916 memcpy( buf, j2kstream, *j2klen);
917 memcpy( buf+(*j2klen), newstream, newlen);
922 if(j2kstream) free(j2kstream);
927 Byte_t * add_EOC( Byte_t *j2kstream, Byte8_t *j2klen)
929 Byte2_t EOC = 0xd9ff;
933 buf = (Byte_t *)malloc(( *j2klen)+2);
935 memcpy( buf, j2kstream, *j2klen);
936 memcpy( buf+(*j2klen), &EOC, 2);
940 if(j2kstream) free(j2kstream);
945 Byte_t * gene_msgstream( message_param_t *message, Byte_t *stream, Byte8_t *length)
952 *length = message->length;
953 buf = (Byte_t *)malloc( *length);
954 memcpy( buf, stream+message->res_offset, *length);
959 Byte_t * gene_emptytilestream( const int tileID, Byte8_t *length)
962 const Byte2_t SOT = 0x90ff;
963 const Byte2_t Lsot = 0xa << 8;
965 const Byte4_t Psot = 0xe << 24;
966 const Byte_t TPsot = 0, TNsot = 0;
967 const Byte2_t SOD = 0x93ff;
970 buf = (Byte_t *)malloc(*length);
974 memcpy( buf, &SOT, 2);
975 memcpy( buf+2, &Lsot, 2);
976 memcpy( buf+4, &Isot, 2);
977 memcpy( buf+6, &Psot, 4);
978 memcpy( buf+10, &TPsot, 1);
979 memcpy( buf+11, &TNsot, 1);
980 memcpy( buf+12, &SOD, 2);