diff --git a/applications/jpip/CHANGES b/applications/jpip/CHANGES index 6c5334bd..13dfe69b 100644 --- a/applications/jpip/CHANGES +++ b/applications/jpip/CHANGES @@ -7,6 +7,7 @@ What's New for OpenJPIP August 24, 2011 + [kaori] added cachemodel_manager, which had been managed in target_manager previously ++ [kaori] added tid request support August 16, 2011 * [antonin] fixed cmake support for openjpip diff --git a/applications/jpip/libopenjpip/box_manager.c b/applications/jpip/libopenjpip/box_manager.c index 41f5043b..d3332576 100644 --- a/applications/jpip/libopenjpip/box_manager.c +++ b/applications/jpip/libopenjpip/box_manager.c @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include diff --git a/applications/jpip/libopenjpip/box_manager.h b/applications/jpip/libopenjpip/box_manager.h index 29d824e4..72f451bf 100644 --- a/applications/jpip/libopenjpip/box_manager.h +++ b/applications/jpip/libopenjpip/box_manager.h @@ -31,7 +31,6 @@ #ifndef BOX_MANAGER_H_ # define BOX_MANAGER_H_ -#include #include "byte_manager.h" //! box parameters diff --git a/applications/jpip/libopenjpip/boxheader_manager.c b/applications/jpip/libopenjpip/boxheader_manager.c index 09253e2a..2f465a3b 100644 --- a/applications/jpip/libopenjpip/boxheader_manager.c +++ b/applications/jpip/libopenjpip/boxheader_manager.c @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include diff --git a/applications/jpip/libopenjpip/byte_manager.c b/applications/jpip/libopenjpip/byte_manager.c index e2ce484b..288adb42 100644 --- a/applications/jpip/libopenjpip/byte_manager.c +++ b/applications/jpip/libopenjpip/byte_manager.c @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include diff --git a/applications/jpip/libopenjpip/byte_manager.h b/applications/jpip/libopenjpip/byte_manager.h index d5b8a0b6..8b90fa90 100644 --- a/applications/jpip/libopenjpip/byte_manager.h +++ b/applications/jpip/libopenjpip/byte_manager.h @@ -31,8 +31,6 @@ #ifndef BYTE_MANAGER_H_ # define BYTE_MANAGER_H_ -#include - //! 1Byte parameter type typedef unsigned char Byte_t; diff --git a/applications/jpip/libopenjpip/codestream_manager.h b/applications/jpip/libopenjpip/codestream_manager.h index eb6aba6a..fcefbeea 100644 --- a/applications/jpip/libopenjpip/codestream_manager.h +++ b/applications/jpip/libopenjpip/codestream_manager.h @@ -31,7 +31,6 @@ #ifndef CODESTREAM_MANAGER_H_ # define CODESTREAM_MANAGER_H_ -#include #include "byte_manager.h" //! codestream parameters diff --git a/applications/jpip/libopenjpip/index_manager.c b/applications/jpip/libopenjpip/index_manager.c index 5a9d187a..96ae6b32 100644 --- a/applications/jpip/libopenjpip/index_manager.c +++ b/applications/jpip/libopenjpip/index_manager.c @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include diff --git a/applications/jpip/libopenjpip/metadata_manager.c b/applications/jpip/libopenjpip/metadata_manager.c index 780a741b..c60f437a 100644 --- a/applications/jpip/libopenjpip/metadata_manager.c +++ b/applications/jpip/libopenjpip/metadata_manager.c @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include diff --git a/applications/jpip/libopenjpip/msgqueue_manager.c b/applications/jpip/libopenjpip/msgqueue_manager.c index 13845bb3..7d0d8dff 100644 --- a/applications/jpip/libopenjpip/msgqueue_manager.c +++ b/applications/jpip/libopenjpip/msgqueue_manager.c @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include @@ -742,31 +743,45 @@ Byte_t * recons_codestream( msgqueue_param_t *msgqueue, Byte_t *jpipstream, Byte Byte_t *codestream = NULL; int last_tileID; int tileID; - + bool found; + Byte8_t binOffset; + *codelen = 0; // main header first ptr = msgqueue->first; + binOffset = 0; while(( ptr = search_message( MAINHEADER_MSG, -1, csn, ptr))!=NULL){ - codestream = add_msgstream( ptr, jpipstream, codestream, codelen); + if( ptr->bin_offset == binOffset){ + codestream = add_msgstream( ptr, jpipstream, codestream, codelen); + binOffset += ptr->length; + } ptr = ptr->next; } last_tileID = get_last_tileID( msgqueue, csn); for( tileID=0; tileID <= last_tileID; tileID++){ - bool found = false; + found = false; + binOffset = 0; + ptr = msgqueue->first; while(( ptr = search_message( TILE_MSG, tileID, csn, ptr))!=NULL){ - found = true; - codestream = add_msgstream( ptr, jpipstream, codestream, codelen); + if( ptr->bin_offset == binOffset){ + found = true; + codestream = add_msgstream( ptr, jpipstream, codestream, codelen); + binOffset += ptr->length; + } ptr = ptr->next; } ptr = msgqueue->first; while(( ptr = search_message( EXT_TILE_MSG, tileID, csn, ptr))!=NULL){ if( ptr->aux >= minlev){ - found = true; - codestream = add_msgstream( ptr, jpipstream, codestream, codelen); + if( ptr->bin_offset == binOffset){ + found = true; + codestream = add_msgstream( ptr, jpipstream, codestream, codelen); + binOffset += ptr->length; + } } ptr = ptr->next; } diff --git a/applications/jpip/libopenjpip/placeholder_manager.c b/applications/jpip/libopenjpip/placeholder_manager.c index 803889b4..d76dbf3c 100644 --- a/applications/jpip/libopenjpip/placeholder_manager.c +++ b/applications/jpip/libopenjpip/placeholder_manager.c @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include "placeholder_manager.h" diff --git a/applications/jpip/libopenjpip/target_manager.c b/applications/jpip/libopenjpip/target_manager.c index 0f085442..1117551d 100644 --- a/applications/jpip/libopenjpip/target_manager.c +++ b/applications/jpip/libopenjpip/target_manager.c @@ -35,6 +35,7 @@ #include #include #include +#include #include "target_manager.h" #ifdef SERVER @@ -91,6 +92,7 @@ target_param_t * gene_target( targetlist_param_t *targetlist, char *targetname) } target = (target_param_t *)malloc( sizeof(target_param_t)); + snprintf( target->tid, MAX_LENOFTID, "%x-%x", (unsigned int)time(NULL), (unsigned int)rand()); strcpy( target->filename, targetname); target->fd = fd; target->csn = last_csn++; @@ -99,6 +101,8 @@ target_param_t * gene_target( targetlist_param_t *targetlist, char *targetname) target->next=NULL; + fprintf( FCGI_stdout, "JPIP-tid: %s\r\n", target->tid); + if( targetlist->first) // there are one or more entries targetlist->last->next = target; else // first entry @@ -170,6 +174,7 @@ void delete_targetlist(targetlist_param_t **targetlist) void print_target( target_param_t *target) { fprintf( logstream, "target:\n"); + fprintf( logstream, "\t tid=%s\n", target->tid); fprintf( logstream, "\t csn=%d\n", target->csn); fprintf( logstream, "\t target=%s\n\n", target->filename); } @@ -201,6 +206,26 @@ target_param_t * search_target( char targetname[], targetlist_param_t *targetlis return NULL; } +target_param_t * search_targetBytid( char tid[], targetlist_param_t *targetlist) +{ + target_param_t *foundtarget; + + foundtarget = targetlist->first; + + while( foundtarget != NULL){ + + if( strcmp( tid, foundtarget->tid) == 0) + return foundtarget; + + foundtarget = foundtarget->next; + } + + fprintf( FCGI_stdout, "Status: 404\r\n"); + fprintf( FCGI_stdout, "Reason: tid %s not found\r\n", tid); + + return NULL; +} + int open_jp2file( char filename[]) { int fd; diff --git a/applications/jpip/libopenjpip/target_manager.h b/applications/jpip/libopenjpip/target_manager.h index 5de22ba6..fc872ea8 100644 --- a/applications/jpip/libopenjpip/target_manager.h +++ b/applications/jpip/libopenjpip/target_manager.h @@ -33,11 +33,15 @@ #include "index_manager.h" +//! maximum length of target identifier +#define MAX_LENOFTID 30 + //! maximum length of target name #define MAX_LENOFTARGET 128 //! target parameters typedef struct target_param{ + char tid[MAX_LENOFTID]; //!< taregt identifier char filename[MAX_LENOFTARGET]; //!< file name int fd; //!< file descriptor int csn; //!< codestream number @@ -138,5 +142,15 @@ void print_alltarget( targetlist_param_t *targetlist); */ target_param_t * search_target( char targetname[], targetlist_param_t *targetlist); + +/** + * search a target by tid + * + * @param[in] tid target identifier + * @param[in] targetlist target list pointer + * @return found target pointer + */ +target_param_t * search_targetBytid( char tid[], targetlist_param_t *targetlist); + #endif /* !TARGET_MANAGER_H_ */ diff --git a/applications/jpip/opj_client/opj_dec_server/jp2k_decoder.c b/applications/jpip/opj_client/opj_dec_server/jp2k_decoder.c index 41d1a31f..0a58d52a 100644 --- a/applications/jpip/opj_client/opj_dec_server/jp2k_decoder.c +++ b/applications/jpip/opj_client/opj_dec_server/jp2k_decoder.c @@ -28,6 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include "jp2k_decoder.h" diff --git a/applications/jpip/opj_client/opj_dec_server/opj_dec_server.c b/applications/jpip/opj_client/opj_dec_server/opj_dec_server.c index 895ade5c..9779d93b 100644 --- a/applications/jpip/opj_client/opj_dec_server/opj_dec_server.c +++ b/applications/jpip/opj_client/opj_dec_server/opj_dec_server.c @@ -201,7 +201,7 @@ int main(int argc, char *argv[]){ if( msgqueue) delete_msgqueue( &msgqueue); - // save_codestream( jpipstream, jpipstreamlen, "jpt"); + //save_codestream( jpipstream, jpipstreamlen, "jpt"); free( jpipstream); #ifdef _WIN32 diff --git a/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110711.jar b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110824.jar similarity index 78% rename from applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110711.jar rename to applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110824.jar index 1024d50a..b821db33 100644 Binary files a/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110711.jar and b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110824.jar differ diff --git a/applications/jpip/opj_client/opj_viewer/dist/opj_viewer.jar b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer.jar index 5f7ec56d..031f9e68 120000 --- a/applications/jpip/opj_client/opj_viewer/dist/opj_viewer.jar +++ b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer.jar @@ -1 +1 @@ -opj_viewer-20110711.jar \ No newline at end of file +opj_viewer-20110824.jar \ No newline at end of file diff --git a/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java b/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java index c6bdb556..466370b6 100644 --- a/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java +++ b/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java @@ -40,6 +40,7 @@ public class JPIPHttpClient protected int rx, ry; protected int rw, rh; protected String cid; + protected String tid; public JPIPHttpClient( String URI) { @@ -48,6 +49,7 @@ public class JPIPHttpClient rx = ry = -1; rw = rh = -1; cid = null; + tid = null; } public int getFw(){ return fw;} @@ -177,6 +179,12 @@ public class JPIPHttpClient 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); + tid = hvalueline.substring( hvalueline.indexOf('=')+1); + System.err.println("tid: " + tid); + } InputStream input = urlconn.getInputStream(); buflen = input.available(); diff --git a/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110711.jar b/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110824.jar similarity index 83% rename from applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110711.jar rename to applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110824.jar index 30b824b7..b5ad639d 100644 Binary files a/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110711.jar and b/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110824.jar differ diff --git a/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces.jar b/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces.jar index 5288da8f..0362316b 120000 --- a/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces.jar +++ b/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces.jar @@ -1 +1 @@ -opj_viewer_xerces-20110711.jar \ No newline at end of file +opj_viewer_xerces-20110824.jar \ No newline at end of file diff --git a/applications/jpip/opj_server/channel_manager.c b/applications/jpip/opj_server/channel_manager.c index 961c73c9..3523161b 100644 --- a/applications/jpip/opj_server/channel_manager.c +++ b/applications/jpip/opj_server/channel_manager.c @@ -68,7 +68,7 @@ channel_param_t * gene_channel( query_param_t query_param, cachemodel_param_t *c channel->cachemodel = cachemodel; // set channel ID and get present time - snprintf( channel->cid, MAX_LENOFCID, "%x%x", (unsigned int)time( &channel->start_tm), (unsigned int)rand());; + snprintf( channel->cid, MAX_LENOFCID, "%x%x", (unsigned int)time( &channel->start_tm), (unsigned int)rand()); channel->next=NULL; diff --git a/applications/jpip/opj_server/opj_server.c b/applications/jpip/opj_server/opj_server.c index 3a7e1087..93fffc7e 100644 --- a/applications/jpip/opj_server/opj_server.c +++ b/applications/jpip/opj_server/opj_server.c @@ -113,10 +113,11 @@ int main(void) #ifndef SERVER print_queryparam( query_param); #endif - - msgqueue = NULL; - parse_status = parse_JPIPrequest( query_param, sessionlist, targetlist, &msgqueue); + msgqueue = NULL; + if( !(parse_status = parse_JPIPrequest( query_param, sessionlist, targetlist, &msgqueue))) + fprintf( FCGI_stderr, "Error: JPIP request failed\n"); + fprintf( FCGI_stdout, "\r\n"); #ifndef SERVER @@ -136,6 +137,15 @@ int main(void) return 0; } +/** + * REQUEST: target identification by target or tid request + * + * @param[in] query_param structured query + * @param[in] targetlist target list pointer + * @param[out] target address of target pointer + * @return if succeeded (true) or failed (false) + */ +bool identify_target( query_param_t query_param, targetlist_param_t *targetlist, target_param_t **target); /** * REQUEST: channel association @@ -205,16 +215,15 @@ bool parse_JPIPrequest( query_param_t query_param, target_param_t *target = NULL; session_param_t *cursession = NULL; channel_param_t *curchannel = NULL; - - if( query_param.target[0] !='\0') - if( !( target = search_target( query_param.target, targetlist))) - if(!( target = gene_target( targetlist, query_param.target))) - return false; - - if( query_param.cid[0] != '\0') + + if( !identify_target( query_param, targetlist, &target)) + return false; + + if( query_param.cid[0] != '\0'){ if( !associate_channel( query_param, sessionlist, &cursession, &curchannel)) return false; - + } + if( query_param.cnew){ if( !open_channel( query_param, sessionlist, target, &cursession, &curchannel)) return false; @@ -230,6 +239,36 @@ bool parse_JPIPrequest( query_param_t query_param, return true; } +bool identify_target( query_param_t query_param, targetlist_param_t *targetlist, target_param_t **target) +{ + if( query_param.target[0] !='\0') + if( !( *target = search_target( query_param.target, targetlist))) + if(!( *target = gene_target( targetlist, query_param.target))) + return false; + + if( query_param.tid[0] !='\0'){ + if( strcmp( query_param.tid, "0") != 0 ){ + if( query_param.cid[0] != '\0'){ + fprintf( FCGI_stdout, "Reason: Target can not be specified both through tid and cid\r\n"); + fprintf( FCGI_stdout, "Status: 400\r\n"); + return false; + } + if( !( *target = search_targetBytid( query_param.tid, targetlist))) + return false; + } + else{ + if( *target) + fprintf( FCGI_stdout, "JPIP-tid: %s\r\n", (*target)->tid); + else{ + fprintf( FCGI_stdout, "Reason: target not specified\r\n"); + fprintf( FCGI_stdout, "Status: 400\r\n"); + return false; + } + } + } + return true; +} + bool associate_channel( query_param_t query_param, sessionlist_param_t *sessionlist, session_param_t **cursession, diff --git a/applications/jpip/opj_server/query_parser.c b/applications/jpip/opj_server/query_parser.c index 53317d88..b5dc4144 100644 --- a/applications/jpip/opj_server/query_parser.c +++ b/applications/jpip/opj_server/query_parser.c @@ -99,6 +99,9 @@ void parse_query( char *query_string, query_param_t *query_param) if( strcasecmp( fieldname, "target") == 0) strcpy( query_param->target,fieldval); + else if( strcasecmp( fieldname, "tid") == 0) + strcpy( query_param->tid, fieldval); + else if( strcasecmp( fieldname, "fsiz") == 0) sscanf( fieldval, "%d,%d", &query_param->fx, &query_param->fy); @@ -128,6 +131,7 @@ void init_queryparam( query_param_t *query_param) int i; query_param->target[0]='\0'; + query_param->tid[0]='\0'; query_param->fx=-1; query_param->fy=-1; query_param->rx=-1; @@ -183,6 +187,7 @@ void print_queryparam( query_param_t query_param) fprintf( logstream, "query parameters:\n"); fprintf( logstream, "\t target: %s\n", query_param.target); + fprintf( logstream, "\t tid: %s\n", query_param.tid); fprintf( logstream, "\t fx,fy: %d, %d\n", query_param.fx, query_param.fy); fprintf( logstream, "\t rx,ry: %d, %d \t rw,rh: %d, %d\n", query_param.rx, query_param.ry, query_param.rw, query_param.rh); fprintf( logstream, "\t cnew: %d\n", query_param.cnew); diff --git a/applications/jpip/opj_server/query_parser.h b/applications/jpip/opj_server/query_parser.h index b511a711..db46f332 100644 --- a/applications/jpip/opj_server/query_parser.h +++ b/applications/jpip/opj_server/query_parser.h @@ -35,6 +35,9 @@ //! maximum length of target name #define MAX_LENOFTARGET 128 + +//! maximum length of target identifier +#define MAX_LENOFTID 30 //! maximum length of channel identifier #define MAX_LENOFCID 30 @@ -48,6 +51,7 @@ //! Query parameters typedef struct query_param{ char target[MAX_LENOFTARGET]; //!< target name + char tid[MAX_LENOFTID]; //!< target identifier int fx, fy; //!< frame size (fx,fy) int rx, ry, rw, rh; //!< roi region char cid[MAX_LENOFCID]; //!< channel identifier