diff options
Diffstat (limited to 'src/lib/openjp2/phix_manager.c')
| -rw-r--r-- | src/lib/openjp2/phix_manager.c | 249 |
1 files changed, 124 insertions, 125 deletions
diff --git a/src/lib/openjp2/phix_manager.c b/src/lib/openjp2/phix_manager.c index 5a3e8838..2444b4e0 100644 --- a/src/lib/openjp2/phix_manager.c +++ b/src/lib/openjp2/phix_manager.c @@ -36,7 +36,7 @@ #include "opj_includes.h" -/* +/* * Write faix box of phix * * @param[in] coff offset of j2k codestream @@ -49,143 +49,142 @@ */ int opj_write_phix( int coff, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio, - opj_event_mgr_t * p_manager ) + opj_event_mgr_t * p_manager ) { - OPJ_BYTE l_data_header [8]; - OPJ_UINT32 len, compno, i; - opj_jp2_box_t *box; - OPJ_OFF_T lenp = 0; - - box = (opj_jp2_box_t *)opj_calloc( (size_t)cstr_info.numcomps, sizeof(opj_jp2_box_t)); - - for( i=0;i<2;i++){ - if (i) - opj_stream_seek( cio, lenp, p_manager); - - lenp = opj_stream_tell(cio); - opj_stream_skip(cio, 4, p_manager); /* L [at the end] */ - opj_write_bytes(l_data_header,JPIP_PHIX,4); /* PHIX */ - opj_stream_write_data(cio,l_data_header,4,p_manager); - - opj_write_manf( (int)i, cstr_info.numcomps, box, cio, p_manager ); - - for( compno=0; compno<(OPJ_UINT32)cstr_info.numcomps; compno++){ - box[compno].length = (OPJ_UINT32)opj_write_phixfaix( coff, (int)compno, cstr_info, EPHused, j2klen, cio,p_manager); - box[compno].type = JPIP_FAIX; + OPJ_BYTE l_data_header [8]; + OPJ_UINT32 len, compno, i; + opj_jp2_box_t *box; + OPJ_OFF_T lenp = 0; + + box = (opj_jp2_box_t *)opj_calloc( (size_t)cstr_info.numcomps, sizeof(opj_jp2_box_t)); + + for( i=0; i<2; i++) { + if (i) + opj_stream_seek( cio, lenp, p_manager); + + lenp = opj_stream_tell(cio); + opj_stream_skip(cio, 4, p_manager); /* L [at the end] */ + opj_write_bytes(l_data_header,JPIP_PHIX,4); /* PHIX */ + opj_stream_write_data(cio,l_data_header,4,p_manager); + + opj_write_manf( (int)i, cstr_info.numcomps, box, cio, p_manager ); + + for( compno=0; compno<(OPJ_UINT32)cstr_info.numcomps; compno++) { + box[compno].length = (OPJ_UINT32)opj_write_phixfaix( coff, (int)compno, cstr_info, EPHused, j2klen, cio,p_manager); + box[compno].type = JPIP_FAIX; + } + + len = (OPJ_UINT32)(opj_stream_tell(cio)-lenp); + opj_stream_seek(cio, 4, p_manager); + opj_write_bytes(l_data_header,len,4);/* L */ + opj_stream_write_data(cio,l_data_header,4,p_manager); + opj_stream_seek( cio, lenp+len,p_manager); } - len = (OPJ_UINT32)(opj_stream_tell(cio)-lenp); - opj_stream_seek(cio, 4, p_manager); - opj_write_bytes(l_data_header,len,4);/* L */ - opj_stream_write_data(cio,l_data_header,4,p_manager); - opj_stream_seek( cio, lenp+len,p_manager); - } + opj_free(box); - opj_free(box); - - return (int)len; + return (int)len; } int opj_write_phixfaix( int coff, int compno, opj_codestream_info_t cstr_info, OPJ_BOOL EPHused, int j2klen, opj_stream_private_t *cio, - opj_event_mgr_t * p_manager ) + opj_event_mgr_t * p_manager ) { - OPJ_UINT32 tileno, version, i, nmax, size_of_coding; /* 4 or 8 */ - opj_tile_info_t *tile_Idx; - opj_packet_info_t packet; - int resno, precno, layno; - OPJ_UINT32 num_packet; - int numOfres, numOfprec, numOflayers; - OPJ_BYTE l_data_header [8]; - OPJ_OFF_T lenp; - OPJ_UINT32 len; - - packet.end_ph_pos = packet.start_pos = -1; - (void)EPHused; /* unused ? */ - - - if( j2klen > pow( 2, 32)){ - size_of_coding = 8; - version = 1; - } - else{ - size_of_coding = 4; - version = 0; - } - - lenp = opj_stream_tell(cio); - opj_stream_skip(cio, 4, p_manager); /* L [at the end] */ - opj_write_bytes(l_data_header,JPIP_FAIX,4); /* FAIX */ - opj_stream_write_data(cio,l_data_header,4,p_manager); - opj_write_bytes(l_data_header,version,1); /* Version 0 = 4 bytes */ - opj_stream_write_data(cio,l_data_header,1,p_manager); - - nmax = 0; - for( i=0; i<=(OPJ_UINT32)cstr_info.numdecompos[compno]; i++) - nmax += (OPJ_UINT32)(cstr_info.tile[0].ph[i] * cstr_info.tile[0].pw[i] * cstr_info.numlayers); - - opj_write_bytes(l_data_header,nmax,size_of_coding); /* NMAX */ - opj_stream_write_data(cio,l_data_header,size_of_coding,p_manager); - opj_write_bytes(l_data_header,(OPJ_UINT32)(cstr_info.tw*cstr_info.th),size_of_coding); /* M */ - opj_stream_write_data(cio,l_data_header,size_of_coding,p_manager); - - for( tileno=0; tileno<(OPJ_UINT32)(cstr_info.tw*cstr_info.th); tileno++){ - tile_Idx = &cstr_info.tile[ tileno]; - - num_packet = 0; - numOfres = cstr_info.numdecompos[compno] + 1; - - for( resno=0; resno<numOfres ; resno++){ - numOfprec = tile_Idx->pw[resno]*tile_Idx->ph[resno]; - for( precno=0; precno<numOfprec; precno++){ - numOflayers = cstr_info.numlayers; - for( layno=0; layno<numOflayers; layno++){ - - switch ( cstr_info.prog){ - case OPJ_LRCP: - packet = tile_Idx->packet[ ((layno*numOfres+resno)*cstr_info.numcomps+compno)*numOfprec+precno]; - break; - case OPJ_RLCP: - packet = tile_Idx->packet[ ((resno*numOflayers+layno)*cstr_info.numcomps+compno)*numOfprec+precno]; - break; - case OPJ_RPCL: - packet = tile_Idx->packet[ ((resno*numOfprec+precno)*cstr_info.numcomps+compno)*numOflayers+layno]; - break; - case OPJ_PCRL: - packet = tile_Idx->packet[ ((precno*cstr_info.numcomps+compno)*numOfres+resno)*numOflayers + layno]; - break; - case OPJ_CPRL: - packet = tile_Idx->packet[ ((compno*numOfprec+precno)*numOfres+resno)*numOflayers + layno]; - break; - default: - fprintf( stderr, "failed to ppix indexing\n"); - } - - opj_write_bytes(l_data_header,(OPJ_UINT32)(packet.start_pos-coff),size_of_coding); /* start position */ + OPJ_UINT32 tileno, version, i, nmax, size_of_coding; /* 4 or 8 */ + opj_tile_info_t *tile_Idx; + opj_packet_info_t packet; + int resno, precno, layno; + OPJ_UINT32 num_packet; + int numOfres, numOfprec, numOflayers; + OPJ_BYTE l_data_header [8]; + OPJ_OFF_T lenp; + OPJ_UINT32 len; + + packet.end_ph_pos = packet.start_pos = -1; + (void)EPHused; /* unused ? */ + + + if( j2klen > pow( 2, 32)) { + size_of_coding = 8; + version = 1; + } else { + size_of_coding = 4; + version = 0; + } + + lenp = opj_stream_tell(cio); + opj_stream_skip(cio, 4, p_manager); /* L [at the end] */ + opj_write_bytes(l_data_header,JPIP_FAIX,4); /* FAIX */ + opj_stream_write_data(cio,l_data_header,4,p_manager); + opj_write_bytes(l_data_header,version,1); /* Version 0 = 4 bytes */ + opj_stream_write_data(cio,l_data_header,1,p_manager); + + nmax = 0; + for( i=0; i<=(OPJ_UINT32)cstr_info.numdecompos[compno]; i++) + nmax += (OPJ_UINT32)(cstr_info.tile[0].ph[i] * cstr_info.tile[0].pw[i] * cstr_info.numlayers); + + opj_write_bytes(l_data_header,nmax,size_of_coding); /* NMAX */ opj_stream_write_data(cio,l_data_header,size_of_coding,p_manager); - opj_write_bytes(l_data_header,(OPJ_UINT32)(packet.end_ph_pos-packet.start_pos+1),size_of_coding); /* length */ + opj_write_bytes(l_data_header,(OPJ_UINT32)(cstr_info.tw*cstr_info.th),size_of_coding); /* M */ opj_stream_write_data(cio,l_data_header,size_of_coding,p_manager); - - num_packet++; - } - } - } - /* PADDING */ - while( num_packet < nmax){ - opj_write_bytes(l_data_header,0,size_of_coding);/* start position */ - opj_stream_write_data(cio,l_data_header,size_of_coding,p_manager); - opj_write_bytes(l_data_header,0,size_of_coding);/* length */ - opj_stream_write_data(cio,l_data_header,size_of_coding,p_manager); - num_packet++; + for( tileno=0; tileno<(OPJ_UINT32)(cstr_info.tw*cstr_info.th); tileno++) { + tile_Idx = &cstr_info.tile[ tileno]; + + num_packet = 0; + numOfres = cstr_info.numdecompos[compno] + 1; + + for( resno=0; resno<numOfres ; resno++) { + numOfprec = tile_Idx->pw[resno]*tile_Idx->ph[resno]; + for( precno=0; precno<numOfprec; precno++) { + numOflayers = cstr_info.numlayers; + for( layno=0; layno<numOflayers; layno++) { + + switch ( cstr_info.prog) { + case OPJ_LRCP: + packet = tile_Idx->packet[ ((layno*numOfres+resno)*cstr_info.numcomps+compno)*numOfprec+precno]; + break; + case OPJ_RLCP: + packet = tile_Idx->packet[ ((resno*numOflayers+layno)*cstr_info.numcomps+compno)*numOfprec+precno]; + break; + case OPJ_RPCL: + packet = tile_Idx->packet[ ((resno*numOfprec+precno)*cstr_info.numcomps+compno)*numOflayers+layno]; + break; + case OPJ_PCRL: + packet = tile_Idx->packet[ ((precno*cstr_info.numcomps+compno)*numOfres+resno)*numOflayers + layno]; + break; + case OPJ_CPRL: + packet = tile_Idx->packet[ ((compno*numOfprec+precno)*numOfres+resno)*numOflayers + layno]; + break; + default: + fprintf( stderr, "failed to ppix indexing\n"); + } + + opj_write_bytes(l_data_header,(OPJ_UINT32)(packet.start_pos-coff),size_of_coding); /* start position */ + opj_stream_write_data(cio,l_data_header,size_of_coding,p_manager); + opj_write_bytes(l_data_header,(OPJ_UINT32)(packet.end_ph_pos-packet.start_pos+1),size_of_coding); /* length */ + opj_stream_write_data(cio,l_data_header,size_of_coding,p_manager); + + num_packet++; + } + } + } + + /* PADDING */ + while( num_packet < nmax) { + opj_write_bytes(l_data_header,0,size_of_coding);/* start position */ + opj_stream_write_data(cio,l_data_header,size_of_coding,p_manager); + opj_write_bytes(l_data_header,0,size_of_coding);/* length */ + opj_stream_write_data(cio,l_data_header,size_of_coding,p_manager); + num_packet++; + } } - } - len = (OPJ_UINT32)(opj_stream_tell(cio)-lenp); - opj_stream_seek(cio, lenp,p_manager); - opj_write_bytes(l_data_header,len,4);/* L */ - opj_stream_write_data(cio,l_data_header,4,p_manager); - opj_stream_seek(cio, lenp+len,p_manager); + len = (OPJ_UINT32)(opj_stream_tell(cio)-lenp); + opj_stream_seek(cio, lenp,p_manager); + opj_write_bytes(l_data_header,len,4);/* L */ + opj_stream_write_data(cio,l_data_header,4,p_manager); + opj_stream_seek(cio, lenp+len,p_manager); - return (int)len; + return (int)len; } |
