From 544e8c9de0739bd6b2bc1399dab067c1b95cac11 Mon Sep 17 00:00:00 2001 From: Kaori Hagihara Date: Wed, 16 Nov 2011 15:43:01 +0000 Subject: [PATCH] [1.5][JPIP] fixed Region of Interest option, and memory leak of opj_dec_server --- applications/jpip/CHANGES | 3 ++ applications/jpip/libopenjpip/cache_manager.c | 4 +- .../jpip/libopenjpip/dec_clientmsg_handler.c | 37 +++++++++++++-- .../jpip/libopenjpip/dec_clientmsg_handler.h | 8 ++++ .../jpip/libopenjpip/imgsock_manager.c | 23 ++++++++-- .../jpip/libopenjpip/imgsock_manager.h | 27 ++++++++--- applications/jpip/libopenjpip/index_manager.c | 9 +++- applications/jpip/libopenjpip/index_manager.h | 8 ++++ applications/jpip/libopenjpip/jp2k_decoder.c | 4 +- applications/jpip/libopenjpip/jp2k_encoder.c | 12 ++++- applications/jpip/libopenjpip/jp2k_encoder.h | 10 ++++ .../jpip/libopenjpip/jpipstream_manager.c | 27 +++++++++++ .../jpip/libopenjpip/jpipstream_manager.h | 2 + applications/jpip/libopenjpip/openjpip.c | 6 ++- .../opj_viewer/dist/opj_viewer-20111018.jar | Bin 15873 -> 0 bytes ...r-20111026.jar => opj_viewer-20111116.jar} | Bin 15894 -> 16303 bytes .../jpip/util/opj_viewer/dist/opj_viewer.jar | 2 +- .../util/opj_viewer/src/ImageManager.java | 22 ++++++++- .../util/opj_viewer/src/ImgdecClient.java | 43 ++++++++++++++++++ .../dist/opj_viewer_xerces-20111010.jar | Bin 20390 -> 0 bytes ...026.jar => opj_viewer_xerces-20111116.jar} | Bin 20411 -> 20820 bytes .../dist/opj_viewer_xerces.jar | 2 +- 22 files changed, 225 insertions(+), 24 deletions(-) delete mode 100644 applications/jpip/util/opj_viewer/dist/opj_viewer-20111018.jar rename applications/jpip/util/opj_viewer/dist/{opj_viewer-20111026.jar => opj_viewer-20111116.jar} (61%) delete mode 100644 applications/jpip/util/opj_viewer_xerces/dist/opj_viewer_xerces-20111010.jar rename applications/jpip/util/opj_viewer_xerces/dist/{opj_viewer_xerces-20111026.jar => opj_viewer_xerces-20111116.jar} (72%) diff --git a/applications/jpip/CHANGES b/applications/jpip/CHANGES index 7d52da31..71fe35f7 100644 --- a/applications/jpip/CHANGES +++ b/applications/jpip/CHANGES @@ -5,6 +5,9 @@ What's New for OpenJPIP ! : changed + : added +November 16, 2011 +* [kaori] fixed Region of Interest option, and memory leak of opj_dec_server + November 8, 2011 ! [kaori] updated main page of doxygen diff --git a/applications/jpip/libopenjpip/cache_manager.c b/applications/jpip/libopenjpip/cache_manager.c index adc0ba87..77000439 100644 --- a/applications/jpip/libopenjpip/cache_manager.c +++ b/applications/jpip/libopenjpip/cache_manager.c @@ -180,8 +180,8 @@ void add_cachecid( char *cid, cache_param_t *cache) { if( !cid) return; - - if( realloc( cache->cid, (cache->numOfcid+1)*sizeof(char *)) == NULL){ + + if( (cache->cid = realloc( cache->cid, (cache->numOfcid+1)*sizeof(char *))) == NULL){ fprintf( stderr, "failed to add new cid to cache table in add_cachecid()\n"); return; } diff --git a/applications/jpip/libopenjpip/dec_clientmsg_handler.c b/applications/jpip/libopenjpip/dec_clientmsg_handler.c index 294285af2..5fd3b038 100644 --- a/applications/jpip/libopenjpip/dec_clientmsg_handler.c +++ b/applications/jpip/libopenjpip/dec_clientmsg_handler.c @@ -90,7 +90,7 @@ void handle_PNMreqMSG( SOCKET connected_socket, Byte_t *jpipstream, msgqueue_par char *CIDorTID, tmp[10]; cache_param_t *cache; int fw, fh; - + CIDorTID = receive_string( connected_socket); if(!(cache = search_cacheBycid( CIDorTID, cachelist))) @@ -107,11 +107,12 @@ void handle_PNMreqMSG( SOCKET connected_socket, Byte_t *jpipstream, msgqueue_par receive_line( connected_socket, tmp); fh = atoi( tmp); - pnmstream = jpipstream_to_pnm( jpipstream, msgqueue, cache->csn, fw, fh, &cache->ihdrbox); - ihdrbox = cache->ihdrbox; + ihdrbox = NULL; + pnmstream = jpipstream_to_pnm( jpipstream, msgqueue, cache->csn, fw, fh, &ihdrbox); send_PNMstream( connected_socket, pnmstream, ihdrbox->width, ihdrbox->height, ihdrbox->nc, ihdrbox->bpc > 8 ? 255 : (1 << ihdrbox->bpc) - 1); + free( ihdrbox); free( pnmstream); } @@ -185,6 +186,36 @@ void handle_dstCIDreqMSG( SOCKET connected_socket, cachelist_param_t *cachelist) free( cid); } +void handle_SIZreqMSG( SOCKET connected_socket, Byte_t *jpipstream, msgqueue_param_t *msgqueue, cachelist_param_t *cachelist) +{ + char *tid, *cid; + cache_param_t *cache; + Byte4_t width, height; + + tid = receive_string( connected_socket); + cid = receive_string( connected_socket); + + cache = NULL; + + if( tid[0] != '0') + cache = search_cacheBytid( tid, cachelist); + + if( !cache && cid[0] != '0') + cache = search_cacheBycid( cid, cachelist); + + free( tid); + free( cid); + + width = height = 0; + if( cache){ + if( !cache->ihdrbox) + cache->ihdrbox = get_SIZ_from_jpipstream( jpipstream, msgqueue, cache->csn); + width = cache->ihdrbox->width; + height = cache->ihdrbox->height; + } + send_SIZstream( connected_socket, width, height); +} + void handle_JP2saveMSG( SOCKET connected_socket, cachelist_param_t *cachelist, msgqueue_param_t *msgqueue, Byte_t *jpipstream) { char *cid; diff --git a/applications/jpip/libopenjpip/dec_clientmsg_handler.h b/applications/jpip/libopenjpip/dec_clientmsg_handler.h index 88a6fbed..58424bfd 100644 --- a/applications/jpip/libopenjpip/dec_clientmsg_handler.h +++ b/applications/jpip/libopenjpip/dec_clientmsg_handler.h @@ -91,6 +91,14 @@ void handle_CIDreqMSG( SOCKET connected_socket, cachelist_param_t *cachelist); */ void handle_dstCIDreqMSG( SOCKET connected_socket, cachelist_param_t *cachelist); +/** + * handle SIZ request message + * + * @param[in] connected_socket socket descriptor + * @param[in,out] cachelist cache list pointer + */ +void handle_SIZreqMSG( SOCKET connected_socket, Byte_t *jpipstream, msgqueue_param_t *msgqueue, cachelist_param_t *cachelist); + /** * handle saving JP2 file request message * diff --git a/applications/jpip/libopenjpip/imgsock_manager.c b/applications/jpip/libopenjpip/imgsock_manager.c index 79149f5f..0c1cbe6f 100644 --- a/applications/jpip/libopenjpip/imgsock_manager.c +++ b/applications/jpip/libopenjpip/imgsock_manager.c @@ -85,7 +85,7 @@ SOCKET open_listeningsocket() close_socket(listening_socket); exit(1); } - printf("port %d is listened\n", port); + fprintf( stderr, "port %d is listened\n", port); return listening_socket; } @@ -102,7 +102,7 @@ msgtype_t identify_clientmsg( SOCKET connected_socket) { int receive_size; char buf[BUF_LEN]; - char *magicid[] = { "JPIP-stream", "PNM request", "XML request", "TID request", "CID request", "CID destroy", "JP2 save", "QUIT"}; + char *magicid[] = { "JPIP-stream", "PNM request", "XML request", "TID request", "CID request", "CID destroy", "SIZ request", "JP2 save", "QUIT"}; int i; receive_size = receive_line( connected_socket, buf); @@ -114,7 +114,7 @@ msgtype_t identify_clientmsg( SOCKET connected_socket) for( i=0; i> 16) & 0xff; + responce[4] = (width >> 8) & 0xff; + responce[5] = width & 0xff; + responce[6] = (height >> 16) & 0xff; + responce[7] = (height >> 8) & 0xff; + responce[8] = height & 0xff; + + send_stream( connected_socket, responce, 9); +} + void send_stream( SOCKET connected_socket, void *stream, int length) { void *ptr = stream; diff --git a/applications/jpip/libopenjpip/imgsock_manager.h b/applications/jpip/libopenjpip/imgsock_manager.h index 5961a581..7da94b90 100644 --- a/applications/jpip/libopenjpip/imgsock_manager.h +++ b/applications/jpip/libopenjpip/imgsock_manager.h @@ -56,8 +56,8 @@ SOCKET open_listeningsocket(); SOCKET accept_socket( SOCKET listening_socket); -#define NUM_OF_MSGTYPES 8 -typedef enum eMSGTYPE{ JPIPSTREAM, PNMREQ, XMLREQ, TIDREQ, CIDREQ, CIDDST, JP2SAVE, QUIT, MSGERROR} msgtype_t; +#define NUM_OF_MSGTYPES 9 +typedef enum eMSGTYPE{ JPIPSTREAM, PNMREQ, XMLREQ, TIDREQ, CIDREQ, CIDDST, SIZREQ, JP2SAVE, QUIT, MSGERROR} msgtype_t; /** * indeitify client message type @@ -84,8 +84,8 @@ Byte_t * receive_JPIPstream( SOCKET connected_socket, char **target, char **tid, * * @param [in] connected_socket file descriptor of the connected socket * @param [in] pnmstream PGM/PPM image codestream - * @param [in] width width of the image - * @param [in] height height of the image + * @param [in] width width of the PGM/PPM image (different from the original image) + * @param [in] height height of the PGM/PPM image * @param [in] numofcomp number of components of the image * @param [in] maxval maximum value of the image (only 255 supported) */ @@ -118,6 +118,15 @@ void send_TIDstream( SOCKET connected_socket, char *tid, int tidlen); */ void send_CIDstream( SOCKET connected_socket, char *cid, int cidlen); +/** + * send SIZ data stream to the client + * + * @param [in] connected_socket file descriptor of the connected socket + * @param [in] width original width of the image + * @param [in] height original height of the image + */ +void send_SIZstream( SOCKET connected_socket, unsigned int width, unsigned int height); + /** * send response signal to the client * @@ -192,13 +201,19 @@ int close_socket( SOCKET sock); * client -> server: CID destroy\\n ciddata \n * server -> client: 1 or 0 (of 1Byte response signal) * - *\section sec7 JP2 save + *\section sec7 SIZ request + * Get original size of image + * + * client -> server: SIZ request\\n tidstring\\n cidstring\\n \n + * server -> client: SIZ (3Byte) width (3Byte Big endian) height (3Byte Big endian) + * + *\section sec8 JP2 save * Save in JP2 file format * * client -> server: JP2 save\\n ciddata \n * server -> client: 1 or 0 (of 1Byte response signal) * - *\section sec8 QUIT + *\section sec9 QUIT * Quit the opj_dec_server program * * client -> server: quit or QUIT diff --git a/applications/jpip/libopenjpip/index_manager.c b/applications/jpip/libopenjpip/index_manager.c index 83e2d3b5..6eafa40b 100644 --- a/applications/jpip/libopenjpip/index_manager.c +++ b/applications/jpip/libopenjpip/index_manager.c @@ -188,8 +188,7 @@ void delete_index( index_param_t **index) delete_metadatalist( &((*index)->metadatalist)); - free( (*index)->COD.XPsiz); - free( (*index)->COD.YPsiz); + delete_COD( (*index)->COD); delete_faixbox( &((*index)->tilepart)); @@ -204,6 +203,12 @@ void delete_index( index_param_t **index) free(*index); } +void delete_COD( CODmarker_param_t COD) +{ + if( COD.XPsiz) free( COD.XPsiz); + if( COD.YPsiz) free( COD.YPsiz); +} + bool check_JP2boxidx( boxlist_param_t *toplev_boxlist) { box_param_t *iptr, *fidx, *prxy; diff --git a/applications/jpip/libopenjpip/index_manager.h b/applications/jpip/libopenjpip/index_manager.h index 74e25c72..5aeee0db 100644 --- a/applications/jpip/libopenjpip/index_manager.h +++ b/applications/jpip/libopenjpip/index_manager.h @@ -129,6 +129,14 @@ void print_COD( CODmarker_param_t COD); */ void delete_index( index_param_t **index); +/** + * delete dynamic arrays in COD marker + * + * @param[in] COD COD marker information + */ +void delete_COD( CODmarker_param_t COD); + + //! 1-dimensional range parameters typedef struct range_param{ Byte4_t minvalue; //!< minimal value diff --git a/applications/jpip/libopenjpip/jp2k_decoder.c b/applications/jpip/libopenjpip/jp2k_decoder.c index 933331b2..28f33226 100644 --- a/applications/jpip/libopenjpip/jp2k_decoder.c +++ b/applications/jpip/libopenjpip/jp2k_decoder.c @@ -74,11 +74,11 @@ Byte_t * j2k_to_pnm( Byte_t *j2kstream, Byte8_t j2klen, ihdrbox_param_t **ihdrbo /* open a byte stream */ cio = opj_cio_open((opj_common_ptr)dinfo, j2kstream, j2klen); - fprintf( stderr, "opj_decode dinfo:%p cio:%p\n", dinfo, cio); /* decode the stream and fill the image structure */ image = opj_decode(dinfo, cio); - fprintf( stderr, "done\n"); + fprintf(stderr, "image is decoded!\n"); + if(!image) { fprintf(stderr, "ERROR -> jp2_to_image: failed to decode image!\n"); opj_destroy_decompress(dinfo); diff --git a/applications/jpip/libopenjpip/jp2k_encoder.c b/applications/jpip/libopenjpip/jp2k_encoder.c index 5025bf8e..013e4316 100644 --- a/applications/jpip/libopenjpip/jp2k_encoder.c +++ b/applications/jpip/libopenjpip/jp2k_encoder.c @@ -278,10 +278,14 @@ Byte_t * recons_codestream_from_JPPstream( msgqueue_param_t *msgqueue, Byte_t *j } if( max_reslev < COD.numOfdecomp) - if( !modify_mainheader( j2kstream, max_reslev, SIZ, COD, j2klen)) + if( !modify_mainheader( j2kstream, max_reslev, SIZ, COD, j2klen)){ + delete_COD( COD); return j2kstream; + } j2kstream = add_EOC( j2kstream, j2klen); + delete_COD( COD); + return j2kstream; } @@ -785,3 +789,9 @@ Byte_t * gene_emptytilestream( const Byte8_t tileID, Byte8_t *length) return buf; } + +Byte_t * recons_j2kmainhead( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, Byte8_t *j2klen) +{ + *j2klen = 0; + return add_mainhead_msgstream( msgqueue, jpipstream, NULL, csn, j2klen); +} diff --git a/applications/jpip/libopenjpip/jp2k_encoder.h b/applications/jpip/libopenjpip/jp2k_encoder.h index 9a86dd3f..3945e2a0 100644 --- a/applications/jpip/libopenjpip/jp2k_encoder.h +++ b/applications/jpip/libopenjpip/jp2k_encoder.h @@ -60,5 +60,15 @@ Byte_t * recons_j2k( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn */ Byte_t * recons_jp2( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, Byte8_t *jp2len); +/** + * reconstruct j2k codestream of mainheader from message queue + * + * @param[in] msgqueue message queue pointer + * @param[in] jpipstream original jpt- jpp- stream + * @param[in] csn codestream number + * @param[out] j2klen pointer to the j2k codestream length + * @return generated reconstructed j2k codestream + */ +Byte_t * recons_j2kmainhead( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte8_t csn, Byte8_t *j2klen); #endif /* !JP2K_ENCODER_H_ */ diff --git a/applications/jpip/libopenjpip/jpipstream_manager.c b/applications/jpip/libopenjpip/jpipstream_manager.c index 97b61526..bb1418f7 100644 --- a/applications/jpip/libopenjpip/jpipstream_manager.c +++ b/applications/jpip/libopenjpip/jpipstream_manager.c @@ -35,6 +35,8 @@ #include "jpipstream_manager.h" #include "jp2k_encoder.h" #include "jp2k_decoder.h" +#include "ihdrbox_manager.h" +#include "j2kheader_manager.h" Byte_t * update_JPIPstream( Byte_t *newstream, int newstreamlen, Byte_t *cache_stream, int *streamlen) { @@ -81,3 +83,28 @@ Byte_t * jpipstream_to_pnm( Byte_t *jpipstream, msgqueue_param_t *msgqueue, Byte return pnmstream; } + +ihdrbox_param_t * get_SIZ_from_jpipstream( Byte_t *jpipstream, msgqueue_param_t *msgqueue, Byte8_t csn) +{ + ihdrbox_param_t *ihdrbox; + Byte_t *j2kstream; + Byte8_t j2klen; + SIZmarker_param_t SIZ; + + j2kstream = recons_j2kmainhead( msgqueue, jpipstream, csn, &j2klen); + if( !get_mainheader_from_j2kstream( j2kstream, &SIZ, NULL)){ + free( j2kstream); + return NULL; + } + + ihdrbox = (ihdrbox_param_t *)malloc( sizeof(ihdrbox_param_t)); + + ihdrbox->width = SIZ.Xsiz; + ihdrbox->height = SIZ.Ysiz; + ihdrbox->nc = SIZ.Csiz; + ihdrbox->bpc = SIZ.Ssiz[0]; + + free( j2kstream); + + return ihdrbox; +} diff --git a/applications/jpip/libopenjpip/jpipstream_manager.h b/applications/jpip/libopenjpip/jpipstream_manager.h index d9e7702a..795ae4a0 100644 --- a/applications/jpip/libopenjpip/jpipstream_manager.h +++ b/applications/jpip/libopenjpip/jpipstream_manager.h @@ -37,3 +37,5 @@ Byte_t * update_JPIPstream( Byte_t *newstream, int newstreamlen, Byte_t *cache_s void save_codestream( Byte_t *codestream, Byte8_t streamlen, char *fmt); Byte_t * jpipstream_to_pnm( Byte_t *jpipstream, msgqueue_param_t *msgqueue, Byte8_t csn, int fw, int fh, ihdrbox_param_t **ihdrbox); + +ihdrbox_param_t * get_SIZ_from_jpipstream( Byte_t *jpipstream, msgqueue_param_t *msgqueue, Byte8_t csn); diff --git a/applications/jpip/libopenjpip/openjpip.c b/applications/jpip/libopenjpip/openjpip.c index a4f3000a..ee8bcfde 100644 --- a/applications/jpip/libopenjpip/openjpip.c +++ b/applications/jpip/libopenjpip/openjpip.c @@ -205,6 +205,10 @@ bool handle_clientreq( client_t client, dec_server_record_t *rec) case CIDDST: handle_dstCIDreqMSG( client, rec->cachelist); break; + + case SIZREQ: + handle_SIZreqMSG( client, rec->jpipstream, rec->msgqueue, rec->cachelist); + break; case JP2SAVE: handle_JP2saveMSG( client, rec->cachelist, rec->msgqueue, rec->jpipstream); @@ -218,7 +222,7 @@ bool handle_clientreq( client_t client, dec_server_record_t *rec) break; } - printf("\t end of the connection\n\n"); + fprintf( stderr, "\t end of the connection\n\n"); if( close_socket(client) != 0){ perror("close"); return false; diff --git a/applications/jpip/util/opj_viewer/dist/opj_viewer-20111018.jar b/applications/jpip/util/opj_viewer/dist/opj_viewer-20111018.jar deleted file mode 100644 index a17ca3b6a28603bc30d6f3ab53102e37b5e31203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15873 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 P#KgcZ(txi28sq-}(Gd&M diff --git a/applications/jpip/util/opj_viewer/dist/opj_viewer.jar b/applications/jpip/util/opj_viewer/dist/opj_viewer.jar index 4fceec6d..07d0dbd5 120000 --- a/applications/jpip/util/opj_viewer/dist/opj_viewer.jar +++ b/applications/jpip/util/opj_viewer/dist/opj_viewer.jar @@ -1 +1 @@ -opj_viewer-20111026.jar \ No newline at end of file +opj_viewer-20111116.jar \ No newline at end of file diff --git a/applications/jpip/util/opj_viewer/src/ImageManager.java b/applications/jpip/util/opj_viewer/src/ImageManager.java index 5634123f..bd4cadd1 100644 --- a/applications/jpip/util/opj_viewer/src/ImageManager.java +++ b/applications/jpip/util/opj_viewer/src/ImageManager.java @@ -33,15 +33,32 @@ import java.awt.Image; public class ImageManager extends JPIPHttpClient { private PnmImage pnmimage; + private int origwidth; + private int origheight; public ImageManager( String uri) { super( uri); pnmimage = null; + origwidth = 0; + origheight = 0; } - public int getOrigWidth(){ return pnmimage.get_width();} - public int getOrigHeight(){ return pnmimage.get_height();} + public int getOrigWidth(){ + if( origwidth == 0){ + if( cid != null || tid != null){ + java.awt.Dimension dim = ImgdecClient.query_imagesize( cid, tid); + if( dim != null){ + origwidth = dim.width; + origheight = dim.height; + } + } + else + System.err.println("Neither cid or tid obtained before to get Original Image Dimension"); + } + return origwidth; + } + public int getOrigHeight(){ return origheight;} public Image getImage( String j2kfilename, int reqfw, int reqfh, boolean reqcnew, boolean reqJPP, boolean reqJPT) { @@ -106,6 +123,7 @@ public class ImageManager extends JPIPHttpClient } return xmldata; } + public void closeChannel() { if( cid != null){ diff --git a/applications/jpip/util/opj_viewer/src/ImgdecClient.java b/applications/jpip/util/opj_viewer/src/ImgdecClient.java index 35c97128..f956d05b 100644 --- a/applications/jpip/util/opj_viewer/src/ImgdecClient.java +++ b/applications/jpip/util/opj_viewer/src/ImgdecClient.java @@ -253,6 +253,49 @@ public class ImgdecClient{ return id; } + + public static java.awt.Dimension query_imagesize( String cid, String tid) + { + java.awt.Dimension dim = null; + + try{ + Socket imgdecSocket = new Socket( "localhost", 5000); + DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream()); + DataInputStream is = new DataInputStream( imgdecSocket.getInputStream()); + byte []header = new byte[3]; + + os.writeBytes( "SIZ request\n"); + if( tid == null) + os.writeBytes( "0\n"); + else + os.writeBytes( tid + "\n"); + if( cid == null) + os.writeBytes( "0\n"); + else + os.writeBytes( cid + "\n"); + + read_stream( is, header, 3); + + if( header[0] == 83 && header[1] == 73 && header[2] == 90){ + + byte []data = new byte[ 3]; + read_stream( is, data, 3); + int w = (data[0]&0xff)<<16 | (data[1]&0xff)<<8 | (data[2]&0xff); + read_stream( is, data, 3); + int h = (data[0]&0xff)<<16 | (data[1]&0xff)<<8 | (data[2]&0xff); + dim = new java.awt.Dimension( w, h); + } + else + System.err.println("Error in query_imagesize("+ cid + ", " + tid + "), wrong to start with " + header); + } + catch (UnknownHostException e) { + System.err.println("Trying to connect to unknown host: " + e); + } catch (IOException e) { + System.err.println("IOException: " + e); + } + + return dim; + } public static void read_stream( DataInputStream is, byte []stream, int length) { diff --git a/applications/jpip/util/opj_viewer_xerces/dist/opj_viewer_xerces-20111010.jar b/applications/jpip/util/opj_viewer_xerces/dist/opj_viewer_xerces-20111010.jar deleted file mode 100644 index e2f78889c4b534474ce2df0b623a844211eb2857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20390 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 diff --git a/applications/jpip/util/opj_viewer_xerces/dist/opj_viewer_xerces-20111026.jar b/applications/jpip/util/opj_viewer_xerces/dist/opj_viewer_xerces-20111116.jar similarity index 72% rename from applications/jpip/util/opj_viewer_xerces/dist/opj_viewer_xerces-20111026.jar rename to applications/jpip/util/opj_viewer_xerces/dist/opj_viewer_xerces-20111116.jar index f67cfb5b9731d85d357c003921226d0e90a71ddc..0c3e0dbbe7206d95692cd498dbfc4ad9e5e9ee43 100644 GIT binary patch delta 4466 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 delta 3880 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 diff --git a/applications/jpip/util/opj_viewer_xerces/dist/opj_viewer_xerces.jar b/applications/jpip/util/opj_viewer_xerces/dist/opj_viewer_xerces.jar index f1df7c26..7e661773 120000 --- a/applications/jpip/util/opj_viewer_xerces/dist/opj_viewer_xerces.jar +++ b/applications/jpip/util/opj_viewer_xerces/dist/opj_viewer_xerces.jar @@ -1 +1 @@ -opj_viewer_xerces-20111026.jar \ No newline at end of file +opj_viewer_xerces-20111116.jar \ No newline at end of file