[1.5] backport r909, r922-925 to branch 1.5 (terminating status of opj_server in debug/non-server mode and stateless requests)

This commit is contained in:
Antonin Descampe 2011-10-10 07:03:28 +00:00
parent d35f647aaa
commit 9e60c2f8e9
18 changed files with 96 additions and 36 deletions

View File

@ -5,6 +5,12 @@ What's New for OpenJPIP
! : changed ! : changed
+ : added + : added
September 16, 2011
+ [kaori] enabled stateless requests from the opj_viewers
Septempber 1, 2011
* [kaori] changed terminating status of opj_server in debug/non-server mode
August 27, 2011 August 27, 2011
* [antonin] fixed missing include directory in opj_client/opj_dec_server/CMakeLists.txt * [antonin] fixed missing include directory in opj_client/opj_dec_server/CMakeLists.txt

View File

@ -106,10 +106,11 @@ Client:
% ../opj_dec_server % ../opj_dec_server
2. Open image viewers (as many as needed) 2. Open image viewers (as many as needed)
% java -jar opj_viewer.jar http://hostname/myFCGI JP2_filename.jp2 % java -jar opj_viewer.jar http://hostname/myFCGI JP2_filename.jp2 [stateless]
( The arguments ( The arguments
- http://hostname/myFCGI is the HTTP server URI (myFCGI refers to opj_server by the server setting) - 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.) - 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
Image viewer GUI instructions: Image viewer GUI instructions:
Scale up request: Enlarge the window 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 ROI request: Select a region by mouse click and drag, then click inside the red frame of the selected region

View File

@ -154,6 +154,20 @@ cache_param_t * search_cacheBycid( char cid[], cachelist_param_t *cachelist)
return NULL; return NULL;
} }
cache_param_t * search_cacheBytid( char tid[], cachelist_param_t *cachelist)
{
cache_param_t *foundcache;
foundcache = cachelist->first;
while( foundcache != NULL){
if( strcmp( tid, foundcache->tid) == 0)
return foundcache;
foundcache = foundcache->next;
}
return NULL;
}
void add_cachecid( char *cid, cache_param_t *cache) void add_cachecid( char *cid, cache_param_t *cache)
{ {
char **tmp; char **tmp;

View File

@ -121,7 +121,7 @@ cache_param_t * search_cacheBycsn( int csn, cachelist_param_t *cachelist);
/** /**
* search codestream number (csn) by cid * search a cache by cid
* *
* @param[in] cid channel identifer * @param[in] cid channel identifer
* @param[in] cachelist cache list pointer * @param[in] cachelist cache list pointer
@ -129,6 +129,16 @@ cache_param_t * search_cacheBycsn( int csn, cachelist_param_t *cachelist);
*/ */
cache_param_t * search_cacheBycid( char cid[], cachelist_param_t *cachelist); cache_param_t * search_cacheBycid( char cid[], cachelist_param_t *cachelist);
/**
* search a cache by tid
*
* @param[in] tid target identifer
* @param[in] cachelist cache list pointer
* @return found cache pointer
*/
cache_param_t * search_cacheBytid( char tid[], cachelist_param_t *cachelist);
/** /**
* add cid into a cache * add cid into a cache
* *

View File

@ -123,6 +123,7 @@ Byte_t * receive_JPIPstream( SOCKET connected_socket, char *target, char *tid, c
target[0] = 0; target[0] = 0;
cid[0] = 0; cid[0] = 0;
tid[0] = 0;
if((linelen = receive_line( connected_socket, buf)) == 0) if((linelen = receive_line( connected_socket, buf)) == 0)
return NULL; return NULL;
@ -140,11 +141,13 @@ Byte_t * receive_JPIPstream( SOCKET connected_socket, char *target, char *tid, c
if((linelen = receive_line( connected_socket, buf)) == 0) if((linelen = receive_line( connected_socket, buf)) == 0)
return NULL; return NULL;
strcpy( tid, buf); if( strcmp( buf, "0") != 0)
strcpy( tid, buf);
if((linelen = receive_line( connected_socket, buf)) == 0) if((linelen = receive_line( connected_socket, buf)) == 0)
return NULL; return NULL;
strcpy( cid, buf); if( strcmp( buf, "0") != 0)
strcpy( cid, buf);
if((linelen = receive_line( connected_socket, buf)) == 0) if((linelen = receive_line( connected_socket, buf)) == 0)
return NULL; return NULL;

View File

@ -141,7 +141,7 @@ int receive_line(SOCKET connected_socket, char *buf);
*\section sec2 PNM request *\section sec2 PNM request
* Get decoded PGM/PPM image * Get decoded PGM/PPM image
* *
* client -> server: PNM request\\n cidstring\\n fw\\n fh\\n \n * client -> server: PNM request\\n [cid/tid]string\\n fw\\n fh\\n \n
* server -> client: P6 or P5 (2Byte) width (2Byte Big endian) height (2Byte Big endian) maxval (1Byte) data * server -> client: P6 or P5 (2Byte) width (2Byte Big endian) height (2Byte Big endian) maxval (1Byte) data
* *
*\section sec3 XML request *\section sec3 XML request

View File

@ -247,10 +247,12 @@ void handle_JPIPstreamMSG( SOCKET connected_socket, cachelist_param_t *cachelist
parse_metamsg( msgqueue, *jpipstream, *streamlen, metadatalist); parse_metamsg( msgqueue, *jpipstream, *streamlen, metadatalist);
// cid registration // cid registration
if( target[0] != 0 && tid[0] != 0 && cid[0] != 0){ if( target[0] != 0){
if((cache = search_cache( target, cachelist))){ if((cache = search_cache( target, cachelist))){
add_cachecid( cid, cache); if( tid[0] != 0)
update_cachetid( tid, cache); update_cachetid( tid, cache);
if( cid[0] != 0)
add_cachecid( cid, cache);
} }
else{ else{
cache = gene_cache( target, msgqueue->last->csn, tid, cid); cache = gene_cache( target, msgqueue->last->csn, tid, cid);
@ -277,7 +279,8 @@ void handle_PNMreqMSG( SOCKET connected_socket, Byte_t *jpipstream, msgqueue_par
receive_line( connected_socket, cid); receive_line( connected_socket, cid);
if(!(cache = search_cacheBycid( cid, cachelist))) if(!(cache = search_cacheBycid( cid, cachelist)))
return; if(!(cache = search_cacheBytid( cid, cachelist)))
return;
receive_line( connected_socket, tmp); receive_line( connected_socket, tmp);
fw = atoi( tmp); fw = atoi( tmp);

View File

@ -1 +1 @@
opj_viewer-20110825.jar opj_viewer-20110916.jar

View File

@ -43,22 +43,25 @@ public class ImageManager extends JPIPHttpClient
public int getOrigWidth(){ return pnmimage.width;} public int getOrigWidth(){ return pnmimage.width;}
public int getOrigHeight(){ return pnmimage.height;} public int getOrigHeight(){ return pnmimage.height;}
public Image getImage( String j2kfilename, int reqfw, int reqfh) public Image getImage( String j2kfilename, int reqfw, int reqfh, boolean reqcnew)
{ {
System.err.println(); System.err.println();
String refcid = ImgdecClient.query_cid( j2kfilename); String refcid = null;
byte[] jpipstream; byte[] jpipstream;
if( reqcnew)
refcid = ImgdecClient.query_cid( j2kfilename);
if( refcid == null){ if( refcid == null){
String reftid = ImgdecClient.query_tid( j2kfilename); String reftid = ImgdecClient.query_tid( j2kfilename);
if( reftid == null) if( reftid == null)
jpipstream = super.requestViewWindow( j2kfilename, reqfw, reqfh, true); jpipstream = super.requestViewWindow( j2kfilename, reqfw, reqfh, reqcnew);
else else
jpipstream = super.requestViewWindow( j2kfilename, reftid, reqfw, reqfh, true); jpipstream = super.requestViewWindow( j2kfilename, reftid, reqfw, reqfh, reqcnew);
} }
else else
jpipstream = super.requestViewWindow( reqfw, reqfh, refcid, true); jpipstream = super.requestViewWindow( reqfw, reqfh, refcid, reqcnew);
System.err.println( "decoding to PNM image"); System.err.println( "decoding to PNM image");
pnmimage = ImgdecClient.decode_jpipstream( jpipstream, j2kfilename, tid, cid, fw, fh); pnmimage = ImgdecClient.decode_jpipstream( jpipstream, j2kfilename, tid, cid, fw, fh);
@ -70,11 +73,11 @@ public class ImageManager extends JPIPHttpClient
public Image getImage( int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh) public Image getImage( int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh)
{ {
System.err.println(); System.err.println();
byte[] jpipstream = super.requestViewWindow( reqfw, reqfh, reqrx, reqry, reqrw, reqrh); byte[] jpipstream = super.requestViewWindow( reqfw, reqfh, reqrx, reqry, reqrw, reqrh);
System.err.println( "decoding to PNM image"); System.err.println( "decoding to PNM image");
pnmimage = ImgdecClient.decode_jpipstream( jpipstream, cid, fw, fh); pnmimage = ImgdecClient.decode_jpipstream( jpipstream, tid, cid, fw, fh);
System.err.println( " done"); System.err.println( " done");
return pnmimage.createROIImage( rx, ry, rw, rh); return pnmimage.createROIImage( rx, ry, rw, rh);
@ -96,7 +99,9 @@ public class ImageManager extends JPIPHttpClient
} }
public void closeChannel() public void closeChannel()
{ {
ImgdecClient.destroy_cid( cid); if( cid != null){
super.closeChannel(); ImgdecClient.destroy_cid( cid);
super.closeChannel();
}
} }
} }

View File

@ -55,7 +55,7 @@ public class ImageViewer extends JPanel
private Rectangle roirect[] = null; private Rectangle roirect[] = null;
private String roiname[] = null; private String roiname[] = null;
public ImageViewer( String j2kfilename, ImageManager manager) public ImageViewer( String j2kfilename, ImageManager manager, boolean session)
{ {
String str; String str;
@ -70,7 +70,7 @@ public class ImageViewer extends JPanel
myRL = new ResizeListener(this); myRL = new ResizeListener(this);
imgmanager = manager; imgmanager = manager;
img = imgmanager.getImage( j2kfilename, vw, vh); img = imgmanager.getImage( j2kfilename, vw, vh, session);
addMouseListener(myMML); addMouseListener(myMML);
addMouseMotionListener(myMML); addMouseMotionListener(myMML);

View File

@ -38,13 +38,13 @@ public class ImageWindow extends JFrame
// private OptionPanel optpanel; // private OptionPanel optpanel;
private ImageManager imgmanager; private ImageManager imgmanager;
public ImageWindow( String uri, String j2kfilename) public ImageWindow( String uri, String j2kfilename, boolean session)
{ {
super( j2kfilename); super( j2kfilename);
imgmanager = new ImageManager( uri); imgmanager = new ImageManager( uri);
imgviewer = new ImageViewer( j2kfilename, imgmanager); imgviewer = new ImageViewer( j2kfilename, imgmanager, session);
imgviewer.setOpaque(true); //content panes must be opaque imgviewer.setOpaque(true); //content panes must be opaque
// optpanel = new OptionPanel( imgmanager, imgviewer); // optpanel = new OptionPanel( imgmanager, imgviewer);
@ -71,16 +71,21 @@ public class ImageWindow extends JFrame
public static void main(String s[]) public static void main(String s[])
{ {
String j2kfilename, uri; String j2kfilename, uri;
boolean session;
if(s.length > 0){ if(s.length > 0){
uri = s[0]; uri = s[0];
j2kfilename = s[1]; j2kfilename = s[1];
if( s.length > 2)
session = !s[2].equalsIgnoreCase( "stateless");
else
session = true;
} }
else{ 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]");
return; return;
} }
ImageWindow frame = new ImageWindow( uri, j2kfilename); ImageWindow frame = new ImageWindow( uri, j2kfilename, session);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

View File

@ -33,17 +33,17 @@ import java.net.*;
public class ImgdecClient{ public class ImgdecClient{
public static PnmImage decode_jpipstream( byte[] jpipstream, String cid, int fw, int fh) public static PnmImage decode_jpipstream( byte[] jpipstream, String tid, String cid, int fw, int fh)
{ {
if( jpipstream != null) if( jpipstream != null)
send_JPIPstream( jpipstream); send_JPIPstream( jpipstream);
return get_PNMstream( cid, fw, fh); return get_PNMstream( cid, tid, fw, fh);
} }
public static PnmImage decode_jpipstream( byte[] jpipstream, String j2kfilename, String tid, String cid, int fw, int fh) public static PnmImage decode_jpipstream( byte[] jpipstream, String j2kfilename, String tid, String cid, int fw, int fh)
{ {
send_JPIPstream( jpipstream, j2kfilename, tid, cid); send_JPIPstream( jpipstream, j2kfilename, tid, cid);
return get_PNMstream( cid, fw, fh); return get_PNMstream( cid, tid, fw, fh);
} }
public static void send_JPIPstream( byte[] jpipstream) public static void send_JPIPstream( byte[] jpipstream)
@ -91,10 +91,13 @@ public class ImgdecClient{
os.writeBytes( "0\n"); os.writeBytes( "0\n");
else else
os.writeBytes( tid + "\n"); os.writeBytes( tid + "\n");
os.writeBytes( cid + "\n"); if( cid == null)
os.writeBytes( "0\n");
else
os.writeBytes( cid + "\n");
os.writeBytes( length + "\n"); os.writeBytes( length + "\n");
os.write( jpipstream, 0, length); os.write( jpipstream, 0, length);
byte signal = is.readByte(); byte signal = is.readByte();
if( signal == 0) if( signal == 0)
@ -106,7 +109,7 @@ public class ImgdecClient{
} }
} }
public static PnmImage get_PNMstream( String cid, int fw, int fh) public static PnmImage get_PNMstream( String cid, String tid, int fw, int fh)
{ {
PnmImage pnmstream = new PnmImage(); PnmImage pnmstream = new PnmImage();
try { try {
@ -116,7 +119,13 @@ public class ImgdecClient{
byte []header = new byte[7]; byte []header = new byte[7];
os.writeBytes("PNM request\n"); os.writeBytes("PNM request\n");
os.writeBytes( cid + "\n"); if( cid != null)
os.writeBytes( cid + "\n");
else
if( tid != null)
os.writeBytes( tid + "\n");
else
os.writeBytes( "0\n");
os.writeBytes( fw + "\n"); os.writeBytes( fw + "\n");
os.writeBytes( fh + "\n"); os.writeBytes( fh + "\n");

View File

@ -72,7 +72,11 @@ public class JPIPHttpClient
if( cid != null) if( cid != null)
return requestViewWindow( reqfw, reqfh, reqrx, reqry, reqrw, reqrh, cid); return requestViewWindow( reqfw, reqfh, reqrx, reqry, reqrw, reqrh, cid);
else else
return null; // return null;
if( tid != null)
return requestViewWindow( null, tid, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, null, false);
else
return null;
} }
public byte[] requestViewWindow( int reqfw, int reqfh, String reqcid) public byte[] requestViewWindow( int reqfw, int reqfh, String reqcid)

View File

@ -1 +1 @@
opj_viewer_xerces-20110825.jar opj_viewer_xerces-20110916.jar

View File

@ -98,7 +98,7 @@ int main(void)
#else #else
char query_string[128]; char query_string[128];
while((fgets( query_string, 128, stdin))[0] != '\n' ) while( fgets( query_string, 128, stdin) && query_string[0]!='\n')
#endif #endif
{ {