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.
};
/* 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 */
! : 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
% ../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
----------
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
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;
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;
//! 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
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);
/**
else
return n2;
}
+
+bool isJPTfeasible( index_param_t index)
+{
+ if( 1 < get_nmax( index.tilepart))
+ return true;
+ else
+ return false;
+}
#include "faixbox_manager.h"
#include "metadata_manager.h"
#include "mhixbox_manager.h"
+#include "bool.h"
//! progression order
typedef enum porder {
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_ */
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
thstream += ((thstream[0]<<8)+(thstream[1])); // marker length
}
- if( (*j2klen)-SOToffset < Psot){
+ if( (*j2klen)-SOToffset != Psot){
Psot = (*j2klen)-SOToffset;
modify_4Bytecode( Psot, Psot_stream);
}
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);
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);
}
ptr = ptr->next;
}
- if(!foundPrec)
+ if(!foundPrec && COD.Scod & 0x01)
j2kstream = add_padding( 1, j2kstream, j2klen);
}
}
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;
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;
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;
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);
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;
*/
void enqueue_mainheader( msgqueue_param_t *msgqueue);
-
/**
* enqueue tile headers data-bin into message queue
*
*/
void enqueue_tileheader( int tile_id, msgqueue_param_t *msgqueue);
-
/**
* enqueue tile data-bin into message queue
*
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
#ifndef TARGET_MANAGER_H_
# define TARGET_MANAGER_H_
+#include "bool.h"
#include "index_manager.h"
//! maximum length of target identifier
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;
-opj_viewer-20110930.jar
\ No newline at end of file
+opj_viewer-20111007.jar
\ No newline at end of file
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){
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;
imgmanager = manager;
- img = imgmanager.getImage( j2kfilename, vw, vh, session);
+ img = imgmanager.getImage( j2kfilename, vw, vh, session, jppstream, !jppstream);
addMouseListener(myMML);
addMouseMotionListener(myMML);
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);
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);
protected int rw, rh;
protected String cid;
protected String tid;
+ private boolean JPTstream;
+ private boolean JPPstream;
public JPIPHttpClient( String URI)
{
rw = rh = -1;
cid = null;
tid = null;
+ JPTstream = false;
+ JPPstream = false;
}
public int getFw(){ return fw;}
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,
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);
}
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();
}
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);
}
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;
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;
}
-opj_viewer_xerces-20110930.jar
\ No newline at end of file
+opj_viewer_xerces-20111010.jar
\ No newline at end of file
public class ImageViewer extends JPanel
{
- private MML myMML;
- private ResizeListener myRL;
private ImageManager imgmanager;
private int vw, vh;
private int iw, ih;
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;
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()
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);
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);
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);
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);
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
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);
}
*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
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);
// 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);
}
// 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;
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;
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);
- }
}
}
}
clean:
rm -f $(ALL) *.o *~
- make clean -C indexer -f Makefile.nix
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);
applications/jpip/opj_client/Makefile
applications/jpip/opj_client/opj_dec_server/Makefile
applications/jpip/tools/Makefile
-applications/jpip/tools/indexer/Makefile
doc/Makefile
])