]> granicus.if.org Git - openjpeg/commitdiff
[1.5] backport r987:990 to branch 1.5
authorAntonin Descampe <antonin@gmail.com>
Tue, 11 Oct 2011 07:24:58 +0000 (07:24 +0000)
committerAntonin Descampe <antonin@gmail.com>
Tue, 11 Oct 2011 07:24:58 +0000 (07:24 +0000)
28 files changed:
CHANGES
applications/codec/image_to_j2k.c
applications/jpip/CHANGES
applications/jpip/README
applications/jpip/libopenjpip/cachemodel_manager.c
applications/jpip/libopenjpip/cachemodel_manager.h
applications/jpip/libopenjpip/index_manager.c
applications/jpip/libopenjpip/index_manager.h
applications/jpip/libopenjpip/j2kheader_manager.c
applications/jpip/libopenjpip/jp2k_encoder.c
applications/jpip/libopenjpip/msgqueue_manager.c
applications/jpip/libopenjpip/msgqueue_manager.h
applications/jpip/libopenjpip/target_manager.c
applications/jpip/libopenjpip/target_manager.h
applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110930.jar [deleted file]
applications/jpip/opj_client/opj_viewer/dist/opj_viewer.jar
applications/jpip/opj_client/opj_viewer/src/ImageManager.java
applications/jpip/opj_client/opj_viewer/src/ImageViewer.java
applications/jpip/opj_client/opj_viewer/src/ImageWindow.java
applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java
applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20111010.jar [moved from applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110930.jar with 54% similarity]
applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces.jar
applications/jpip/opj_client/opj_viewer_xerces/src/ImageViewer.java
applications/jpip/opj_client/opj_viewer_xerces/src/ImageWindow.java
applications/jpip/opj_server/opj_server.c
applications/jpip/tools/Makefile.nix
applications/jpip/tools/jpip_to_j2k.c
configure.ac

diff --git a/CHANGES b/CHANGES
index 5f417dfe1935bc5f44b1c8eefaee25efb4dbf959..505346676c224a562bf87ff52e7bf71ed9cae0ef 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -8,6 +8,7 @@ What's New for OpenJPEG
 October 10, 2011
 * [vincent] fix 'distcheck' rule
 * [antonin] modified indexer for JPIP, JPP-stream
+! [kaori]   change -v option was reactivated for JPIP
 
 October 7, 2011
 + [mickael] enhance non regression test suite generation (and some test names). It is based on a file as encoder previously.  
index 4ab7445b3089e460d3352b8e7d387901ec7bf308..93d0c6ff6029b64b0879160cc9aa47f21e90de59 100644 (file)
@@ -591,7 +591,7 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
        };
 
        /* parse the command line */
-       const char optlist[] = "i:o:r:q:n:b:c:t:p:s:SEM:x:R:d:T:If:P:C:F:"
+       const char optlist[] = "i:o:r:q:n:b:c:t:p:s:SEM:x:R:d:T:If:P:C:F:v:"
 #ifdef USE_JPWL
                "W:"
 #endif /* USE_JPWL */
index b86a345151cf472f32fd7378a89d51bfe6cbfda2..34fa3cfca7ca0adca55c4a9a80e37a98a8d063fb 100644 (file)
@@ -5,9 +5,12 @@ What's New for OpenJPIP
 ! : changed
 + : added
 
+October 11, 2011
++ [antonin] enable JPT-stream request from client viewer option (credit to kaori)
+
 October 10, 2011
-- [antonin] removed obsolete indexer utility
-+ [antonin] enabled JPP-stream
+- [antonin] removed obsolete indexer utility (credit to kaori)
++ [antonin] enabled JPP-stream (credit to kaori)
 
 September 16, 2011
 + [kaori] enabled stateless requests from the opj_viewers
index 727964604f0f885d1345eb4cc425f17bb35cb5fc..0bd22fdaf164845869f8c4309986a0ed30ec622f 100644 (file)
@@ -103,11 +103,12 @@ Client:
     % ../opj_dec_server
 
  2. Open image viewers (as many as needed)
-    % java -jar opj_viewer.jar http://hostname/myFCGI JP2_filename.jp2 [stateless]
+    % java -jar opj_viewer.jar http://hostname/myFCGI JP2_filename.jp2 [stateless/session] [jptstream/jppstream]
     ( The arguments 
       - http://hostname/myFCGI is the HTTP server URI (myFCGI refers to opj_server by the server setting)
       - JP2_filename.jp2 is the name of a JP2 file available on the server.
-      - stateless if stateless request is desired, otherwise session request is implemented
+      - request type stateless for no caching, session (default) for caching
+      - return media type, JPT-stream tile based stream, or JPP-stream (default) precinct based stream  
     Image viewer GUI instructions:
       Scale up request: Enlarge the window
       ROI request:      Select a region by mouse click and drag, then click inside the red frame of the selected region
@@ -125,7 +126,11 @@ Client:
 ----------
 
 An example to encode a TIF image "copenhague1.tif" at resolution 4780x4050, 8bit/pixel, grayscale.
-   % ./image_to_j2k -i copenhague1.tif -o copenhague1.jp2 -p RPCL -c [64,64] -t 640,480 -jpip
+   % ./image_to_j2k -i copenhague1.tif -o copenhague1.jp2 -p RPCL -c [64,64] -t 640,480 -jpip -v R
+
+ options
+  -jpip : embed index table box into the output JP2 file (obligation for JPIP)
+  -v R  : partition a tile into tile parts of different resolution levels (obligation for JPT-stream)
 
 <Option>
  3. Embed metadata into JP2 file
index d710e1492cd1d857a29a9950199dd37224d24392..7a97ee34e13b167be16d8a1351fa21796f4c94ec 100644 (file)
@@ -55,7 +55,7 @@ cachemodellist_param_t * gene_cachemodellist()
   return cachemodellist;
 }
 
-cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, target_param_t *target)
+cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, target_param_t *target, bool reqJPP)
 {
   cachemodel_param_t *cachemodel;
   faixbox_param_t *tilepart;
@@ -67,6 +67,19 @@ cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, ta
   cachemodel = (cachemodel_param_t *)malloc( sizeof(cachemodel_param_t));
 
   refer_target( target, &cachemodel->target);
+  
+  if( reqJPP){
+    if( target->jppstream)
+      cachemodel->jppstream = true;
+    else
+      cachemodel->jppstream = false;
+  } else{ // reqJPT
+    if( target->jptstream)
+      cachemodel->jppstream = false;
+    else
+      cachemodel->jppstream = true;
+  }
+
   cachemodel->mhead_model = false;
   
   tilepart = target->codeidx->tilepart;
index 03ae18cd69dccb87e5b72820b267a375c73d331d..77387a29d8fd2af1b2b510842d8491cfcfa3aa6c 100644 (file)
@@ -37,6 +37,7 @@
 //! Cache model parameters
 typedef struct cachemodel_param{
   target_param_t *target;        //!< reference pointer to the target
+  bool jppstream;                //!< return type, true: JPP-stream, false: JPT-stream
   bool mhead_model;              //!< main header model, if sent, 1, else 0
   bool *tp_model;                //!< dynamic array pointer of tile part model, if sent, 1, else 0
   bool *th_model;                //!< dynamic array pointer of tile header model
@@ -59,13 +60,14 @@ typedef struct cachemodellist_param{
 cachemodellist_param_t * gene_cachemodellist();
 
 /**
- * generate a session under the sesion list
+ * generate a cache model under a list
  *
- * @param[in] cachemodellist cachemodel list to insert the generated cache model
+ * @param[in] cachemodellist cachemodel list to insert the generated cache model, NULL for stateless
  * @param[in] target         pointer the reference target
+ * @param[in] reqJPP         if JPP-stream is desired true, JPT-stream false
  * @return                   pointer to the generated cache model
  */
-cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, target_param_t *target);
+cachemodel_param_t * gene_cachemodel( cachemodellist_param_t *cachemodellist, target_param_t *target, bool reqJPP);
 
 
 /**
index 7a603e8db2f5ee435d0067331b8ec614c830ad8b..2f8268a578e78be7ed205a66b7759c0fce0ddf8d 100644 (file)
@@ -706,3 +706,11 @@ Byte4_t min( Byte4_t n1, Byte4_t n2)
   else
     return n2;
 }
+
+bool isJPTfeasible( index_param_t index)
+{
+  if( 1 < get_nmax( index.tilepart))
+    return true;
+  else
+    return false;
+}
index 1d5226e438c74aa8811fc59ef7590db4b5912872..74e25c7244e14230dfea9f013d753f2c3d1a97aa 100644 (file)
@@ -35,6 +35,7 @@
 #include "faixbox_manager.h"
 #include "metadata_manager.h"
 #include "mhixbox_manager.h"
+#include "bool.h"
 
 //! progression order 
 typedef enum porder {
@@ -166,4 +167,13 @@ range_param_t get_tile_Yrange( SIZmarker_param_t SIZ, Byte4_t tile_id, int level
 Byte4_t get_tile_XSiz( SIZmarker_param_t SIZ, Byte4_t tile_id, int level);
 Byte4_t get_tile_YSiz( SIZmarker_param_t SIZ, Byte4_t tile_id, int level);
 
+
+/**
+ * answers if the target is feasible to JPT-stream
+ *
+ * @param[in] index index parameters
+ * @return    true if JPT-stream is feasible
+ */
+bool isJPTfeasible( index_param_t index);
+
 #endif             /* !INDEX_MANAGER_H_ */
index 3a069bcd12223d9379db5b89f270fad20e181365..ad94d587329bfac1694d71bf3a7991796f5a8731 100644 (file)
@@ -212,11 +212,16 @@ Byte2_t modify_CODmkrstream( CODmarker_param_t COD, int numOfdecomp, Byte_t *COD
     return 0;
   }
   
-  newLcod  = 13+numOfdecomp;
-
-  *CODstream++ = (Byte_t)((Byte2_t)(newLcod & 0xff00) >> 8);
-  *CODstream++ = (Byte_t)(newLcod & 0x00ff);
+  if( COD.Scod & 0x01){
+    newLcod  = 13+numOfdecomp;
 
+    *CODstream++ = (Byte_t)((Byte2_t)(newLcod & 0xff00) >> 8);
+    *CODstream++ = (Byte_t)(newLcod & 0x00ff);
+  }
+  else{
+    newLcod = COD.Lcod;
+    CODstream += 2;
+  }
   CODstream += 5; // skip Scod & SGcod
   
   // SPcod
@@ -258,7 +263,7 @@ bool modify_tileheader( Byte_t *j2kstream, Byte8_t SOToffset, int numOfdecomp, B
     thstream += ((thstream[0]<<8)+(thstream[1])); // marker length
   }
 
-  if( (*j2klen)-SOToffset < Psot){
+  if( (*j2klen)-SOToffset != Psot){
     Psot = (*j2klen)-SOToffset;
     modify_4Bytecode( Psot, Psot_stream);
   }
index 18735cf4d34eaacc67af528c1164a58b2eaeb169..e1488cde306082cdd1c99abc2d17343738e29579 100644 (file)
@@ -248,12 +248,12 @@ Byte_t * recons_codestream_from_JPPstream( msgqueue_param_t *msgqueue, Byte_t *j
     fprintf( FCGI_stderr, "Error, Only RPCL order supported\n");
     return j2kstream;
   }
-  
+
   if( fw == 0 || fh == 0)
     mindeclev = 0;
   else
     mindeclev = comp_decomplev( fw, fh, SIZ.Xsiz, SIZ.Ysiz);
-
+  
   max_reslev = -1;
   last_tileID = get_last_tileID( msgqueue, csn, true); 
   
@@ -312,17 +312,23 @@ Byte_t * recons_RPCLbitstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, B
                               Byte8_t tileID, SIZmarker_param_t SIZ, CODmarker_param_t COD, int mindeclev, 
                               int *max_reslev, Byte8_t *j2klen)
 {
-  int r, p, c;
+  int r, p, c, numOfprcts;
   bool foundPrec;
   Byte8_t binOffset, precID, seqID;
   Byte4_t XTsiz, YTsiz;
   message_param_t *ptr;
   
   for( r=0, seqID=0; r<=(COD.numOfdecomp-mindeclev); r++){
-    XTsiz = get_tile_XSiz( SIZ, tileID, COD.numOfdecomp-r);
-    YTsiz = get_tile_YSiz( SIZ, tileID, COD.numOfdecomp-r);
     
-    for( p=0; p<ceil((double)XTsiz/(double)COD.XPsiz[r])*ceil((double)YTsiz/(double)COD.YPsiz[r]); p++, seqID++){      
+    if( COD.Scod & 0x01){
+      XTsiz = get_tile_XSiz( SIZ, tileID, COD.numOfdecomp-r);
+      YTsiz = get_tile_YSiz( SIZ, tileID, COD.numOfdecomp-r);
+      numOfprcts = ceil((double)XTsiz/(double)COD.XPsiz[r])*ceil((double)YTsiz/(double)COD.YPsiz[r]);
+    }
+    else
+      numOfprcts = 1;
+    
+    for( p=0; p<numOfprcts; p++, seqID++){      
       for( c=0; c<SIZ.Csiz; c++){
 
        precID = comp_precinct_id( tileID, c, seqID, SIZ.Csiz, SIZ.XTnum*SIZ.YTnum);
@@ -341,7 +347,7 @@ Byte_t * recons_RPCLbitstream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, B
          }
          ptr = ptr->next;
        }
-       if(!foundPrec)
+       if(!foundPrec && COD.Scod & 0x01)
          j2kstream = add_padding( 1, j2kstream, j2klen);
       }
     }
index ef1fb62a2d1eed08c5e2d2e1e3ac5070b9f4e4be..8cc89f487dce413bae48a8106ac114839f9424f5 100644 (file)
@@ -154,7 +154,7 @@ void enqueue_tileheader( int tile_id, msgqueue_param_t *msgqueue)
   cachemodel = msgqueue->cachemodel;
   target = cachemodel->target;
   codeidx = target->codeidx;
-  
+
   if( !cachemodel->th_model[ tile_id]){
     msg = (message_param_t *)malloc( sizeof(message_param_t));
     msg->last_byte = true;
@@ -164,7 +164,7 @@ void enqueue_tileheader( int tile_id, msgqueue_param_t *msgqueue)
     msg->bin_offset = 0;
     msg->length = codeidx->tileheader[tile_id]->tlen;
     msg->aux = 0; // non exist
-    msg->res_offset = codeidx->offset + get_elemOff( codeidx->tilepart, 0, tile_id); // Changed from Lucian's
+    msg->res_offset = codeidx->offset + get_elemOff( codeidx->tilepart, 0, tile_id);
     msg->phld = NULL;
     msg->next = NULL;
     
@@ -183,7 +183,7 @@ void enqueue_tile( int tile_id, int level, msgqueue_param_t *msgqueue)
   index_param_t *codeidx;
   faixbox_param_t *tilepart;
   message_param_t *msg;
-  Byte8_t binOffset, binLength;
+  Byte8_t binOffset, binLength, class_id;
   int i;
 
   cachemodel = msgqueue->cachemodel;
@@ -194,13 +194,15 @@ void enqueue_tile( int tile_id, int level, msgqueue_param_t *msgqueue)
   numOftparts = get_nmax( tilepart);
   numOftiles  = get_m( tilepart);
 
+  class_id = (numOftparts==1) ? TILE_MSG : EXT_TILE_MSG;
+  
   if( tile_id < 0 || numOftiles <= tile_id){
     fprintf( FCGI_stderr, "Error, Invalid tile-id %d\n", tile_id);
     return;
   }
   
   tp_model = &cachemodel->tp_model[ tile_id*numOftparts];
-  
+
   binOffset=0;
   for( i=0; i<numOftparts-level; i++){
     binLength = get_elemLen( tilepart, i, tile_id);
@@ -210,11 +212,7 @@ void enqueue_tile( int tile_id, int level, msgqueue_param_t *msgqueue)
       
       msg->last_byte = i==numOftparts-1? true : false;
       msg->in_class_id = tile_id;
-#if 0
-      msg->class_id = TILE_MSG;
-#else
-      msg->class_id = EXT_TILE_MSG;
-#endif
+      msg->class_id = class_id;
       msg->csn = target->csn;
       msg->bin_offset = binOffset;
       msg->length = binLength;
index 8f36bbc65ee40dd40eb11fe2df9d9340cc6ddab3..d75a551856e7d621803d5ac79f234af2cd2fe8b7 100644 (file)
@@ -106,7 +106,6 @@ void print_msgqueue( msgqueue_param_t *msgqueue);
  */
 void enqueue_mainheader( msgqueue_param_t *msgqueue);
 
-
 /**
  * enqueue tile headers data-bin into message queue
  *
@@ -115,7 +114,6 @@ void enqueue_mainheader( msgqueue_param_t *msgqueue);
  */
 void enqueue_tileheader( int tile_id, msgqueue_param_t *msgqueue);
 
-
 /**
  * enqueue tile data-bin into message queue
  *
index 6aea9aec68a6fb4374b328e0caaf31d83d081ff0..692dd59f4cfec60910c333bdea88f49385301cb0 100644 (file)
@@ -97,8 +97,9 @@ target_param_t * gene_target( targetlist_param_t *targetlist, char *targetname)
   target->fd = fd;
   target->csn = last_csn++;
   target->codeidx = jp2idx;
-  target->num_of_use = 0;
-  
+  target->num_of_use = 0; 
+  target->jppstream = true;
+  target->jptstream = isJPTfeasible( *jp2idx);
   target->next=NULL;
 
   if( targetlist->first) // there are one or more entries
index fc872ea8d444b5fdd4e6882068db14e477a464d6..027ac2432f9e0dd0203672aaf41486ac82e5072a 100644 (file)
@@ -31,6 +31,7 @@
 #ifndef        TARGET_MANAGER_H_
 # define       TARGET_MANAGER_H_
 
+#include "bool.h"
 #include "index_manager.h"
 
 //! maximum length of target identifier
@@ -47,6 +48,8 @@ typedef struct target_param{
   int csn;                        //!< codestream number
   index_param_t *codeidx;         //!< index information of codestream
   int num_of_use;                 //!< numbers of sessions refering to this target
+  bool jppstream;                 //!< if this target can return JPP-stream
+  bool jptstream;                 //!< if this target can return JPP-stream
   struct target_param *next;      //!< pointer to the next target
 } target_param_t;
 
diff --git a/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110930.jar b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110930.jar
deleted file mode 100644 (file)
index 15ecf90..0000000
Binary files a/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110930.jar and /dev/null differ
index 02f0435bda0148e71a8eae0d9584b568e31c60df..2c3fead77e5aa94e2740c0961831c802da07c8cb 120000 (symlink)
@@ -1 +1 @@
-opj_viewer-20110930.jar
\ No newline at end of file
+opj_viewer-20111007.jar
\ No newline at end of file
index 557c9038be533f0150ec48a56a5150142e1cc071..5634123fb449f0085e73c6064e283d68efcddba3 100644 (file)
@@ -43,25 +43,26 @@ public class ImageManager extends JPIPHttpClient
     public int getOrigWidth(){ return pnmimage.get_width();}
     public int getOrigHeight(){ return pnmimage.get_height();}
     
-    public Image getImage( String j2kfilename, int reqfw, int reqfh, boolean reqcnew)
+    public Image getImage( String j2kfilename, int reqfw, int reqfh, boolean reqcnew, boolean reqJPP, boolean reqJPT)
     {
        System.err.println();
        
        String refcid = null;
        byte[] jpipstream;
        
+       // Todo: check if the cid is for the same stream type
        if( reqcnew)
-           refcid = ImgdecClient.query_cid( j2kfilename);
-           
+           refcid = ImgdecClient.query_cid( j2kfilename);      
+       
        if( refcid == null){
            String reftid = ImgdecClient.query_tid( j2kfilename);
            if( reftid == null)
-               jpipstream = super.requestViewWindow( j2kfilename, reqfw, reqfh, reqcnew);
+               jpipstream = super.requestViewWindow( j2kfilename, reqfw, reqfh, reqcnew, reqJPP, reqJPT);
            else
-               jpipstream = super.requestViewWindow( j2kfilename, reftid, reqfw, reqfh, reqcnew);
+               jpipstream = super.requestViewWindow( j2kfilename, reftid, reqfw, reqfh, reqcnew, reqJPP, reqJPT);
        }
        else
-           jpipstream = super.requestViewWindow( reqfw, reqfh, refcid, reqcnew);
+           jpipstream = super.requestViewWindow( reqfw, reqfh, refcid, reqcnew, reqJPP, reqJPT);
        
        System.err.println( "decoding to PNM image");
        if((pnmimage = ImgdecClient.decode_jpipstream( jpipstream, j2kfilename, tid, cid, fw, fh))!=null){
index 0b1c2b3d18db9f846256434196cddcb173afd594..dcd661412def80ca0c151f6d8b1afcc40fd66688 100644 (file)
@@ -53,7 +53,7 @@ public class ImageViewer extends JPanel
     private Rectangle roirect[] = null;
     private String roiname[] = null;
       
-    public ImageViewer( String j2kfilename, ImageManager manager, boolean session)
+    public ImageViewer( String j2kfilename, ImageManager manager, boolean session, boolean jppstream)
     {
        String str;
        MML myMML;
@@ -69,7 +69,7 @@ public class ImageViewer extends JPanel
 
        imgmanager = manager;
 
-       img = imgmanager.getImage( j2kfilename, vw, vh, session);
+       img = imgmanager.getImage( j2kfilename, vw, vh, session, jppstream, !jppstream);
 
        addMouseListener(myMML);
        addMouseMotionListener(myMML);
index 5ffe9a5e65687d7e2f843448a9c0814bb4513fa6..4f44cced129eece0a42da72af618b9b4ed22c98e 100644 (file)
@@ -35,24 +35,20 @@ import java.awt.*;
 public class ImageWindow extends JFrame
 {
     private ImageViewer imgviewer;
-    //    private OptionPanel optpanel;
     private ImageManager imgmanager;
     
-    public ImageWindow( String uri, String j2kfilename, boolean session)
+    public ImageWindow( String uri, String j2kfilename, boolean session, boolean jppstream)
     {
        super( j2kfilename);
 
        imgmanager = new ImageManager( uri);
     
-       imgviewer = new ImageViewer( j2kfilename, imgmanager, session);
+       imgviewer = new ImageViewer( j2kfilename, imgmanager, session, jppstream);
        imgviewer.setOpaque(true); //content panes must be opaque
-    
-       //      optpanel = new OptionPanel( imgmanager, imgviewer);
 
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add( imgviewer, BorderLayout.CENTER);
-       //      panel.add( optpanel, BorderLayout.EAST);
 
        setContentPane( panel);
         
@@ -71,21 +67,26 @@ public class ImageWindow extends JFrame
     public static void main(String s[])
     {
        String j2kfilename, uri;
-       boolean session;
+       boolean session, jppstream;
 
-       if(s.length > 0){
+       if(s.length >= 2){
            uri = s[0];
            j2kfilename = s[1];
            if( s.length > 2)
                session = !s[2].equalsIgnoreCase( "stateless");
            else
                session = true;
+
+           if( s.length > 3)
+               jppstream = !s[3].equalsIgnoreCase( "JPT");
+           else
+               jppstream = true;
        }
        else{
-           System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2 [stateless/session]");
+           System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2 [stateless/session] [JPT/JPP]");
            return;
        }
-       ImageWindow frame = new ImageWindow( uri, j2kfilename, session);
+       ImageWindow frame = new ImageWindow( uri, j2kfilename, session, jppstream);
     
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
index dcf7d013bb1cbd0865e5d40a3634392b6ec37eaf..eee20f7141032e077bd420f79005c3a41fe3e25f 100644 (file)
@@ -41,6 +41,8 @@ public class JPIPHttpClient
     protected int rw, rh;
     protected String cid;
     protected String tid;
+    private boolean JPTstream;
+    private boolean JPPstream;
     
     public JPIPHttpClient( String URI)
     {
@@ -50,6 +52,8 @@ public class JPIPHttpClient
        rw = rh = -1;
        cid = null;
        tid = null;
+       JPTstream = false;
+       JPPstream = false;
     }
 
     public int getFw(){ return fw;}
@@ -72,53 +76,52 @@ public class JPIPHttpClient
        if( cid != null)
            return requestViewWindow( reqfw, reqfh, reqrx, reqry, reqrw, reqrh, cid);
        else
-           //          return null;
            if( tid != null)
-               return requestViewWindow( null, tid, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, null, false);
+               return requestViewWindow( null, tid, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, null, false, false, false);
            else
                return null;
     }
 
     public byte[] requestViewWindow( int reqfw, int reqfh, String reqcid)
     {
-       return requestViewWindow( null, null, reqfw, reqfh, -1, -1, -1, -1, reqcid, false);
+       return requestViewWindow( null, null, reqfw, reqfh, -1, -1, -1, -1, reqcid, false, false, false);
     }
 
     public byte[] requestViewWindow( int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh, String reqcid)
     {
-       return requestViewWindow( null, null, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, reqcid, false);
+       return requestViewWindow( null, null, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, reqcid, false, false, false);
     }
 
     public byte[] requestViewWindow( String target, int reqfw, int reqfh)
     {
-       return requestViewWindow( target, null, reqfw, reqfh, -1, -1, -1, -1, null, false);
+       return requestViewWindow( target, null, reqfw, reqfh, -1, -1, -1, -1, null, false, false, false);
     }
     
-    public byte[] requestViewWindow( String target, int reqfw, int reqfh, boolean reqcnew)
+    public byte[] requestViewWindow( String target, int reqfw, int reqfh, boolean reqcnew, boolean reqJPP, boolean reqJPT)
     {
        if( cid == null) // 1 channel allocation only
-           return requestViewWindow( target, null, reqfw, reqfh, -1, -1, -1, -1, null, reqcnew);
+           return requestViewWindow( target, null, reqfw, reqfh, -1, -1, -1, -1, null, reqcnew, reqJPP, reqJPT);
        else
            return null;
     }
 
-    public byte[] requestViewWindow( String target, String reqtid, int reqfw, int reqfh, boolean reqcnew)
+    public byte[] requestViewWindow( String target, String reqtid, int reqfw, int reqfh, boolean reqcnew, boolean reqJPP, boolean reqJPT)
     {
        if( cid == null) // 1 channel allocation only
-           return requestViewWindow( target, reqtid, reqfw, reqfh, -1, -1, -1, -1, null, reqcnew);
+           return requestViewWindow( target, reqtid, reqfw, reqfh, -1, -1, -1, -1, null, reqcnew, reqJPP, reqJPT);
        else
            return null;
     }
     
     public byte[] requestViewWindow( String target, int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh)
     {
-       return requestViewWindow( target, null, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, null, false);
+       return requestViewWindow( target, null, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, null, false, false, false);
     }
 
  
-    public byte[] requestViewWindow( int reqfw, int reqfh, String reqcid, boolean reqcnew)
+    public byte[] requestViewWindow( int reqfw, int reqfh, String reqcid, boolean reqcnew, boolean reqJPP, boolean reqJPT)
     {
-       return requestViewWindow( null, null, reqfw, reqfh, -1, -1, -1, -1, reqcid, reqcnew);
+       return requestViewWindow( null, null, reqfw, reqfh, -1, -1, -1, -1, reqcid, reqcnew, reqJPP, reqJPT);
     }
     
     public byte[] requestViewWindow( String target,
@@ -126,12 +129,12 @@ public class JPIPHttpClient
                                     int reqfw, int reqfh, 
                                     int reqrx, int reqry, 
                                     int reqrw, int reqrh, 
-                                    String reqcid, boolean reqcnew)
+                                    String reqcid, boolean reqcnew, boolean reqJPP, boolean reqJPT)
     {
        if( reqtid != null)
            tid = reqtid;
 
-       String urlstring = const_urlstring( target, reqtid, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, reqcid, reqcnew);
+       String urlstring = const_urlstring( target, reqtid, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, reqcid, reqcnew, reqJPP, reqJPT);
        return GETrequest( urlstring);
     }
     
@@ -167,16 +170,24 @@ public class JPIPHttpClient
            
            Map<String,java.util.List<String>> headers = urlconn.getHeaderFields();
            java.util.List<String> hvaluelist;
+           String hvalueline;
            
            String status = headers.get(null).get(0);
            
            System.err.println( status);
            if( !status.contains("OK"))
                System.err.println( headers.get("Reason"));
-           System.err.println( headers.get("Content-type"));
+           
+           hvalueline = headers.get("Content-type").get(0);
+           System.err.println( hvalueline);
+
+           if( hvalueline.endsWith("jpt-stream"))
+               JPTstream = true;
+           else if( hvalueline.endsWith("jpp-stream"))
+               JPPstream = true;
            
            if(( hvaluelist = headers.get("JPIP-fsiz")) != null){
-               String hvalueline = hvaluelist.get(0);
+               hvalueline = hvaluelist.get(0);
                fw = Integer.valueOf( hvalueline.substring( 0, hvalueline.indexOf(','))).intValue();
                fh = Integer.valueOf( hvalueline.substring( hvalueline.indexOf(',')+1 )).intValue();
        
@@ -184,27 +195,27 @@ public class JPIPHttpClient
            }
       
            if(( hvaluelist = headers.get("JPIP-roff")) != null){
-               String hvalueline = hvaluelist.get(0);
+               hvalueline = hvaluelist.get(0);
                rx = Integer.valueOf( hvalueline.substring( 0, hvalueline.indexOf(','))).intValue();
                ry = Integer.valueOf( hvalueline.substring( hvalueline.indexOf(',')+1 )).intValue();
                System.err.println("rx,ry: " + rx + "," + ry);
            }
     
            if(( hvaluelist = headers.get("JPIP-rsiz")) != null){
-               String hvalueline = hvaluelist.get(0);
+               hvalueline = hvaluelist.get(0);
                rw = Integer.valueOf( hvalueline.substring( 0, hvalueline.indexOf(','))).intValue();
                rh = Integer.valueOf( hvalueline.substring( hvalueline.indexOf(',')+1 )).intValue();
                System.err.println("rw,rh: " + rw + "," + rh);
            }
-    
+           
            if(( hvaluelist = headers.get("JPIP-cnew")) != null){
-               String hvalueline = hvaluelist.get(0);
+               hvalueline = hvaluelist.get(0);
                cid = hvalueline.substring( hvalueline.indexOf('=')+1, hvalueline.indexOf(','));
                System.err.println("cid: " + cid);
            }
 
            if(( hvaluelist = headers.get("JPIP-tid")) != null){
-               String hvalueline = hvaluelist.get(0);
+               hvalueline = hvaluelist.get(0);
                tid = hvalueline.substring( hvalueline.indexOf('=')+1);
                System.err.println("tid: " + tid);
            }
@@ -270,7 +281,7 @@ public class JPIPHttpClient
                                    int reqfw, int reqfh, 
                                    int reqrx, int reqry, 
                                    int reqrw, int reqrh, 
-                                   String reqcid, boolean reqcnew)
+                                   String reqcid, boolean reqcnew, boolean reqJPP, boolean reqJPT)
     {
        String urlstring = comURL;
 
@@ -313,9 +324,24 @@ public class JPIPHttpClient
            urlstring = urlstring.concat( "cnew=http");
        }
 
-       if( !urlstring.endsWith("?"))
-           urlstring = urlstring.concat( "&");
-       urlstring = urlstring.concat( "type=jpp-stream");
+       if( reqJPP && !JPTstream){
+           if( !urlstring.endsWith("?"))
+               urlstring = urlstring.concat( "&");
+           urlstring = urlstring.concat( "type=jpp-stream");
+       }
+       else if( reqJPT && !JPPstream){
+           if( !urlstring.endsWith("?"))
+               urlstring = urlstring.concat( "&");
+           urlstring = urlstring.concat( "type=jpt-stream");
+       }
+       else{ // remove this option later
+           if( !urlstring.endsWith("?"))
+               urlstring = urlstring.concat( "&");
+           if( JPTstream)
+               urlstring = urlstring.concat( "type=jpt-stream");
+           else if( JPPstream)
+               urlstring = urlstring.concat( "type=jpp-stream");
+       }
 
        return urlstring;
     }
similarity index 54%
rename from applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110930.jar
rename to applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20111010.jar
index 6c77243e5d01e28524194a15724c5287c09f0f51..e2f78889c4b534474ce2df0b623a844211eb2857 100644 (file)
Binary files a/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110930.jar and b/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20111010.jar differ
index dcd965802d5fb3bc07d4f3777a73773ada434b6b..8fbb188c1071ff176f5fb6923ea24b12f80af334 120000 (symlink)
@@ -1 +1 @@
-opj_viewer_xerces-20110930.jar
\ No newline at end of file
+opj_viewer_xerces-20111010.jar
\ No newline at end of file
index 9fab7f0a973e9c3f7ccba1bc6112324a976d53f9..0fa2a84ec271267852b4ba698c2022d785672f64 100644 (file)
@@ -40,8 +40,6 @@ import java.io.*;
 
 public class ImageViewer extends JPanel
 {  
-    private MML myMML;
-    private ResizeListener myRL;
     private ImageManager imgmanager;
     private int vw, vh;
     private int iw, ih;
@@ -54,12 +52,13 @@ public class ImageViewer extends JPanel
     private Rectangle rect = new Rectangle();
     private Rectangle roirect[] = null;
     private String roiname[] = null;
-      
-    public ImageViewer( String j2kfilename, ImageManager manager)
+
+    public ImageViewer( String j2kfilename, ImageManager manager, boolean session, boolean jppstream)      
     {
        String str;
+       MML myMML;
 
-       this.setSize( 200, 200);
+       this.setSize( 170, 170);
        Dimension asz = this.getSize();
     
        vw = asz.width;
@@ -67,14 +66,14 @@ public class ImageViewer extends JPanel
     
        setBackground(Color.black);
        myMML = new MML(this);
-       myRL = new ResizeListener(this);
-
+       
        imgmanager = manager;
-       img = imgmanager.getImage( j2kfilename, vw, vh);
+
+       img = imgmanager.getImage( j2kfilename, vw, vh, session, jppstream, !jppstream);
 
        addMouseListener(myMML);
        addMouseMotionListener(myMML);
-       addComponentListener(myRL);
+       addComponentListener( new ResizeListener(this));
     }
 
     public Image getImage()
@@ -87,8 +86,8 @@ public class ImageViewer extends JPanel
        roirect = null;
        roiname = null;
 
-       double scalex = vw/(double)rect.width;
-       double scaley = vh/(double)rect.height;
+       double scalex = (double)vw/(double)rect.width;
+       double scaley = (double)vh/(double)rect.height;
     
        int fw = (int)(imgmanager.getFw()*scalex);
        int fh = (int)(imgmanager.getFh()*scaley);
index dd12eee225489834870a645ab5dd0c703f03d695..cbf546cca424aee4095c2ccadb9935e35abacd50 100644 (file)
@@ -38,13 +38,13 @@ public class ImageWindow extends JFrame
     private OptionPanel optpanel;
     private ImageManager imgmanager;
     
-    public ImageWindow( String uri, String j2kfilename)
+    public ImageWindow( String uri, String j2kfilename, boolean session, boolean jppstream)
     {
        super( j2kfilename);
 
        imgmanager = new ImageManager( uri);
-    
-       imgviewer = new ImageViewer( j2kfilename, imgmanager);
+
+       imgviewer = new ImageViewer( j2kfilename, imgmanager, session, jppstream);
        imgviewer.setOpaque(true); //content panes must be opaque
     
        optpanel = new OptionPanel( imgmanager, imgviewer);
@@ -71,16 +71,26 @@ public class ImageWindow extends JFrame
     public static void main(String s[])
     {
        String j2kfilename, uri;
+       boolean session, jppstream;
 
-       if(s.length > 0){
+       if(s.length >= 2){
            uri = s[0];
            j2kfilename = s[1];
+           if( s.length > 2)
+               session = !s[2].equalsIgnoreCase( "stateless");
+           else
+               session = true;
+
+           if( s.length > 3)
+               jppstream = !s[3].equalsIgnoreCase( "JPT");
+           else
+               jppstream = true;
        }
        else{
-           System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2");
+           System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2 [stateless/session] [JPT/JPP]");
            return;
        }
-       ImageWindow frame = new ImageWindow( uri, j2kfilename);
+       ImageWindow frame = new ImageWindow( uri, j2kfilename, session, jppstream);
     
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
index a66a7b57daf9f7f50fdfd286294799b714301570..a9778cd4a992d4930b41303720bfb393be0041d3 100644 (file)
@@ -115,15 +115,6 @@ int main(void)
       msgqueue_param_t *msgqueue;
 
       parse_query( query_string, &query_param); 
-      
-      switch( query_param.return_type){
-      case JPPstream:
-       fprintf( FCGI_stdout, "Content-type: image/jpp-stream\r\n");
-       break;
-      default:
-       fprintf( FCGI_stdout, "Content-type: image/jpt-stream\r\n");
-       break;
-      }
 
 #ifndef SERVER
       print_queryparam( query_param);
@@ -315,7 +306,7 @@ bool open_channel( query_param_t query_param,
     if( !(*cursession))
       *cursession = gene_session( sessionlist);
     if( !( cachemodel = search_cachemodel( target, (*cursession)->cachemodellist)))
-      if( !(cachemodel = gene_cachemodel( (*cursession)->cachemodellist, target)))
+      if( !(cachemodel = gene_cachemodel( (*cursession)->cachemodellist, target, query_param.return_type==JPPstream)))
        return false;
   }
   else
@@ -406,7 +397,7 @@ bool gene_JPIPstream( query_param_t query_param,
   if( !cursession || !curchannel){ // stateless
     if( !target)
       return false;
-    if( !(cachemodel = gene_cachemodel( NULL, target)))
+    if( !(cachemodel = gene_cachemodel( NULL, target, query_param.return_type==JPPstream)))
       return false;
     *msgqueue = gene_msgqueue( true, cachemodel);
   }
@@ -416,6 +407,11 @@ bool gene_JPIPstream( query_param_t query_param,
     *msgqueue = gene_msgqueue( false, cachemodel);
   }
   
+  if( cachemodel->jppstream)
+    fprintf( FCGI_stdout, "Content-type: image/jpp-stream\r\n");
+  else
+    fprintf( FCGI_stdout, "Content-type: image/jpt-stream\r\n");
+
   codeidx = target->codeidx;
 
   //meta
@@ -467,13 +463,19 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue)
   range_param_t tile_Xrange, tile_Yrange;
   int u, v, tile_id;
   int xmin, xmax, ymin, ymax;
+  int numOfreslev;
 
   codeidx = msgqueue->cachemodel->target->codeidx;
 
+  if( !(msgqueue->cachemodel->jppstream)  &&  get_nmax( codeidx->tilepart) == 1) // normally not the case
+    numOfreslev = 1;
+  else
+    numOfreslev = codeidx->COD.numOfdecomp+1;
+
   imgreg  = map_viewin2imgreg( query_param.fx, query_param.fy, 
                               query_param.rx, query_param.ry, query_param.rw, query_param.rh,
                               codeidx->SIZ.XOsiz, codeidx->SIZ.YOsiz, codeidx->SIZ.Xsiz, codeidx->SIZ.Ysiz, 
-                              codeidx->COD.numOfdecomp+1);
+                              numOfreslev );
 
   for( u=0, tile_id=0; u<codeidx->SIZ.YTnum; u++){
     tile_Yrange = get_tile_Yrange( codeidx->SIZ, tile_id, imgreg.level);
@@ -496,7 +498,7 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue)
          // Tile completely contained within view-window
          // high priority
          //printf("Tile completely contained within view-window %d\n", tile_id);
-         if( query_param.return_type == JPPstream){
+         if( msgqueue->cachemodel->jppstream){
            enqueue_tileheader( tile_id, msgqueue);
            enqueue_allprecincts( tile_id, imgreg.level, query_param.lastcomp, query_param.comps, msgqueue);
          }
@@ -507,8 +509,9 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue)
          // Tile partially overlaps view-window
          // low priority
          //printf("Tile partially overlaps view-window %d\n", tile_id);
-         if( query_param.return_type == JPPstream){
+         if( msgqueue->cachemodel->jppstream){
            enqueue_tileheader( tile_id, msgqueue);
+
            xmin = tile_Xrange.minvalue >= imgreg.xosiz + imgreg.ox ? 0 : imgreg.xosiz + imgreg.ox - tile_Xrange.minvalue;
            xmax = tile_Xrange.maxvalue <= imgreg.xosiz + imgreg.ox + imgreg.sx ? tile_Xrange.maxvalue - tile_Xrange.minvalue -1 : imgreg.xosiz + imgreg.ox + imgreg.sx - tile_Xrange.minvalue -1;
            ymin = tile_Yrange.minvalue >= imgreg.yosiz + imgreg.oy ? 0 : imgreg.yosiz + imgreg.oy - tile_Yrange.minvalue;
@@ -543,9 +546,9 @@ void enqueue_precincts( int xmin, int xmax, int ymin, int ymax, int tile_id, int
        XTsiz = get_tile_XSiz( codeidx->SIZ, tile_id, dec_lev);
        YTsiz = get_tile_YSiz( codeidx->SIZ, tile_id, dec_lev);
        
-       XPsiz = codeidx->COD.XPsiz[ res_lev];
-       YPsiz = codeidx->COD.YPsiz[ res_lev];
-       
+       XPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.XPsiz[ res_lev] : XTsiz;
+       YPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.YPsiz[ res_lev] : YTsiz;
+         
        for( u=0; u<ceil((double)YTsiz/(double)YPsiz); u++){
          yminP = u*YPsiz;
          ymaxP = (u+1)*YPsiz-1;
@@ -594,13 +597,12 @@ void enqueue_allprecincts( int tile_id, int level, int lastcomp, bool *comps, ms
        
        XTsiz = get_tile_XSiz( codeidx->SIZ, tile_id, dec_lev);
        YTsiz = get_tile_YSiz( codeidx->SIZ, tile_id, dec_lev);
-
-       XPsiz = codeidx->COD.XPsiz[ res_lev];
-       YPsiz = codeidx->COD.YPsiz[ res_lev];
        
-       for( i=0; i<ceil((double)YTsiz/(double)YPsiz)*ceil((double)XTsiz/(double)XPsiz); i++, seq_id++){
+       XPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.XPsiz[ res_lev] : XTsiz;
+       YPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.YPsiz[ res_lev] : YTsiz;
+       
+       for( i=0; i<ceil((double)YTsiz/(double)YPsiz)*ceil((double)XTsiz/(double)XPsiz); i++, seq_id++)
          enqueue_precinct( seq_id, tile_id, c, msgqueue);
-       }
       }
     }
 }
index 707f3f9e4e26e39b9273af8d094401141de1a8d1..87fcda74d8867ed0c28e9a45c475acdebdaf01e0 100644 (file)
@@ -18,4 +18,3 @@ test_index: test_index.o $(LIBFNAME)
 
 clean:
        rm -f $(ALL) *.o *~
-       make clean -C indexer -f Makefile.nix
index 3eab0c3e981003b21bced231a448458d28d3dd2c..dfceb69ff1a8e4eb12b71b4fc1e6aa2d8db70ec8 100644 (file)
@@ -88,9 +88,9 @@ int main(int argc,char *argv[])
   parse_JPIPstream( jpipstream, jpiplen, 0, msgqueue);
   
   //print_msgqueue( msgqueue);
-
-  j2kstream = recons_j2k( msgqueue, jpipstream, msgqueue->first->csn, 0, 0, &j2klen);
   
+  j2kstream = recons_j2k( msgqueue, jpipstream, msgqueue->first->csn, 0, 0, &j2klen);
+    
   delete_msgqueue( &msgqueue);
   free( jpipstream);
 
index f1e68b3110c24702a36b9c13f8df96c6cf63ea61..4a592f9088abe796bd60dd039f7ef4754d858750 100644 (file)
@@ -415,7 +415,6 @@ applications/jpip/opj_server/Makefile
 applications/jpip/opj_client/Makefile
 applications/jpip/opj_client/opj_dec_server/Makefile
 applications/jpip/tools/Makefile
-applications/jpip/tools/indexer/Makefile
 doc/Makefile
 ])