X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=applications%2Fjpip%2Flibopenjpip%2Fjpip_parser.c;h=663214e4f8afb6e6550750982d46af1e6b2e3184;hb=7e28fdc1761388d4cafae840612ac402891be83d;hp=7697297decb22d32648a2b29e2a9beb2d43dcec6;hpb=b158c25dc3c9262aa29fed2ca9e45b2cf0019be2;p=openjpeg.git diff --git a/applications/jpip/libopenjpip/jpip_parser.c b/applications/jpip/libopenjpip/jpip_parser.c index 7697297d..663214e4 100644 --- a/applications/jpip/libopenjpip/jpip_parser.c +++ b/applications/jpip/libopenjpip/jpip_parser.c @@ -43,7 +43,7 @@ #define FCGI_stdout stdout #define FCGI_stderr stderr #define logstream stderr -#endif //SERVER +#endif /*SERVER*/ bool identify_target( query_param_t query_param, targetlist_param_t *targetlist, target_param_t **target) @@ -132,35 +132,35 @@ bool close_channel( query_param_t query_param, #ifndef SERVER fprintf( logstream, "local log: close all\n"); #endif - // all channels associatd with the session will be closed + /* all channels associatd with the session will be closed */ if( !delete_session( cursession, sessionlist)) return false; } else{ - // check if all entry belonging to the same session + /* check if all entry belonging to the same session */ for( i=0, cclose=query_param.cclose; ichannellist))){ fprintf( FCGI_stdout, "Reason: Cclose id %s is from another session\r\n", cclose); return false; } } - // delete channels + /* delete channels */ for( i=0, cclose=query_param.cclose; ichannellist); delete_channel( curchannel, (*cursession)->channellist); } if( (*cursession)->channellist->first == NULL || (*cursession)->channellist->last == NULL) - // In case of empty session + /* In case of empty session */ delete_session( cursession, sessionlist); } return true; @@ -181,8 +181,9 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue); * @param[in] query_param structured query * @param[in] metadatalist pointer to metadata bin list * @param[in,out] msgqueue message queue pointer + * @return if succeeded (true) or failed (false) */ -void enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue); +bool enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue); bool gene_JPIPstream( query_param_t query_param, @@ -194,14 +195,14 @@ bool gene_JPIPstream( query_param_t query_param, index_param_t *codeidx; cachemodel_param_t *cachemodel; - if( !cursession || !curchannel){ // stateless + if( !cursession || !curchannel){ /* stateless */ if( !target) return false; if( !(cachemodel = gene_cachemodel( NULL, target, query_param.return_type==JPPstream))) return false; *msgqueue = gene_msgqueue( true, cachemodel); } - else{ // session + else{ /* session */ cachemodel = curchannel->cachemodel; target = cachemodel->target; *msgqueue = gene_msgqueue( false, cachemodel); @@ -221,16 +222,22 @@ bool gene_JPIPstream( query_param_t query_param, } } - //meta + /*meta*/ if( query_param.box_type[0][0] != 0 && query_param.len != 0) - enqueue_metabins( query_param, codeidx->metadatalist, *msgqueue); + if( !enqueue_metabins( query_param, codeidx->metadatalist, *msgqueue)) + return false; + + if( query_param.metadata_only) + return true; - // image codestream - if( query_param.fx > 0 && query_param.fy > 0){ - if( !cachemodel->mhead_model && query_param.len != 0) + /* main header */ + if( !cachemodel->mhead_model && query_param.len != 0) enqueue_mainheader( *msgqueue); + + /* image codestream */ + if( (query_param.fx > 0 && query_param.fy > 0)) enqueue_imagedata( query_param, *msgqueue); - } + return true; } @@ -270,20 +277,20 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue) index_param_t *codeidx; imgreg_param_t imgreg; range_param_t tile_Xrange, tile_Yrange; - int u, v, tile_id; + Byte4_t 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 + 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, + (int)codeidx->SIZ.XOsiz, (int)codeidx->SIZ.YOsiz, (int)codeidx->SIZ.Xsiz, (int)codeidx->SIZ.Ysiz, numOfreslev ); if( query_param.len == 0) @@ -296,39 +303,40 @@ void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue) tile_Xrange = get_tile_Xrange( codeidx->SIZ, tile_id, imgreg.level); if( tile_Xrange.minvalue < tile_Xrange.maxvalue && tile_Yrange.minvalue < tile_Yrange.maxvalue){ - if( tile_Xrange.maxvalue <= imgreg.xosiz + imgreg.ox || - tile_Xrange.minvalue >= imgreg.xosiz + imgreg.ox + imgreg.sx || - tile_Yrange.maxvalue <= imgreg.yosiz + imgreg.oy || - tile_Yrange.minvalue >= imgreg.yosiz + imgreg.oy + imgreg.sy) { - //printf("Tile completely excluded from view-window %d\n", tile_id); - // Tile completely excluded from view-window + if( tile_Xrange.maxvalue <= (Byte4_t)(imgreg.xosiz + imgreg.ox) || + tile_Xrange.minvalue >= (Byte4_t)(imgreg.xosiz + imgreg.ox + imgreg.sx) || + tile_Yrange.maxvalue <= (Byte4_t)(imgreg.yosiz + imgreg.oy) || + tile_Yrange.minvalue >= (Byte4_t)(imgreg.yosiz + imgreg.oy + imgreg.sy)) { + /*printf("Tile completely excluded from view-window %d\n", tile_id);*/ + /* Tile completely excluded from view-window */ } - else if( tile_Xrange.minvalue >= imgreg.xosiz + imgreg.ox && - tile_Xrange.maxvalue <= imgreg.xosiz + imgreg.ox + imgreg.sx && - tile_Yrange.minvalue >= imgreg.yosiz + imgreg.oy && - tile_Yrange.maxvalue <= imgreg.yosiz + imgreg.oy + imgreg.sy) { - // Tile completely contained within view-window - // high priority - //printf("Tile completely contained within view-window %d\n", tile_id); + else if( tile_Xrange.minvalue >= (Byte4_t)(imgreg.xosiz + imgreg.ox) && + tile_Xrange.maxvalue <= (Byte4_t)(imgreg.xosiz + imgreg.ox + imgreg.sx) && + tile_Yrange.minvalue >= (Byte4_t)(imgreg.yosiz + imgreg.oy) && + tile_Yrange.maxvalue <= (Byte4_t)(imgreg.yosiz + imgreg.oy + imgreg.sy)) { + /* Tile completely contained within view-window */ + /* high priority */ + /*printf("Tile completely contained within view-window %d\n", tile_id);*/ if( msgqueue->cachemodel->jppstream){ - enqueue_tileheader( tile_id, msgqueue); - enqueue_allprecincts( tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue); + enqueue_tileheader( (int)tile_id, msgqueue); + enqueue_allprecincts( (int)tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue); } else enqueue_tile( tile_id, imgreg.level, msgqueue); } else{ - // Tile partially overlaps view-window - // low priority - //printf("Tile partially overlaps view-window %d\n", tile_id); + /* Tile partially overlaps view-window */ + /* low priority */ + /*printf("Tile partially overlaps view-window %d\n", tile_id);*/ 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; - ymax = tile_Yrange.maxvalue <= imgreg.yosiz + imgreg.oy + imgreg.sy ? tile_Yrange.maxvalue - tile_Yrange.minvalue -1 : imgreg.yosiz + imgreg.oy + imgreg.sy - tile_Yrange.minvalue -1; - enqueue_precincts( xmin, xmax, ymin, ymax, tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue); + enqueue_tileheader( (int)tile_id, msgqueue); + + /* FIXME: The following code is suspicious it implicitely cast an unsigned int to int, which truncates values */ + xmin = tile_Xrange.minvalue >= (Byte4_t)(imgreg.xosiz + imgreg.ox) ? 0 : imgreg.xosiz + imgreg.ox - (int)tile_Xrange.minvalue; + xmax = tile_Xrange.maxvalue <= (Byte4_t)(imgreg.xosiz + imgreg.ox + imgreg.sx) ? (int)(tile_Xrange.maxvalue - tile_Xrange.minvalue -1) : (int)(imgreg.xosiz + imgreg.ox + imgreg.sx - (int)tile_Xrange.minvalue - 1); + ymin = tile_Yrange.minvalue >= (Byte4_t)(imgreg.yosiz + imgreg.oy) ? 0 : imgreg.yosiz + imgreg.oy - (int)tile_Yrange.minvalue; + ymax = tile_Yrange.maxvalue <= (Byte4_t)(imgreg.yosiz + imgreg.oy + imgreg.sy) ? (int)(tile_Yrange.maxvalue - tile_Yrange.minvalue - 1) : (int)(imgreg.yosiz + imgreg.oy + imgreg.sy - (int)tile_Yrange.minvalue - 1); + enqueue_precincts( xmin, xmax, ymin, ymax, (int)tile_id, imgreg.level, query_param.lastcomp, query_param.comps, query_param.layers, msgqueue); } else enqueue_tile( tile_id, imgreg.level, msgqueue); @@ -349,41 +357,47 @@ void enqueue_precincts( int xmin, int xmax, int ymin, int ymax, int tile_id, int Byte4_t xminP, xmaxP, yminP, ymaxP; codeidx = msgqueue->cachemodel->target->codeidx; + /* MM: shouldnt xmin/xmax be Byte4_t instead ? */ + if( xmin < 0 || xmax < 0 || ymin < 0 || ymax < 0) + return; + /* MM: I think the API should not really be int should it ? */ + if( tile_id < 0 ) + return; for( c=0; cSIZ.Csiz; c++) if( lastcomp == -1 /*all*/ || ( c<=lastcomp && comps[c])){ seq_id = 0; for( res_lev=0, dec_lev=codeidx->COD.numOfdecomp; dec_lev>=level; res_lev++, dec_lev--){ - XTsiz = get_tile_XSiz( codeidx->SIZ, tile_id, dec_lev); - YTsiz = get_tile_YSiz( codeidx->SIZ, tile_id, dec_lev); + XTsiz = get_tile_XSiz( codeidx->SIZ, (Byte4_t)tile_id, dec_lev); + YTsiz = get_tile_YSiz( codeidx->SIZ, (Byte4_t)tile_id, dec_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 xmax || ymaxP < ymin || yminP > ymax){ - // Precinct completely excluded from view-window + if( xmaxP < (Byte4_t)xmin || xminP > (Byte4_t)xmax || ymaxP < (Byte4_t)ymin || yminP > (Byte4_t)ymax){ + /* Precinct completely excluded from view-window */ } - else if( xminP >= xmin && xmaxP <= xmax && yminP >= ymin && ymaxP <= ymax){ - // Precinct completely contained within view-window - // high priority + else if( xminP >= (Byte4_t)xmin && xmaxP <= (Byte4_t)xmax && yminP >= (Byte4_t)ymin && ymaxP <= (Byte4_t)ymax){ + /* Precinct completely contained within view-window + high priority */ enqueue_precinct( seq_id, tile_id, c, (dec_lev>level)?-1:layers, msgqueue); } else{ - // Precinct partially overlaps view-window - // low priority + /* Precinct partially overlaps view-window + low priority */ enqueue_precinct( seq_id, tile_id, c, (dec_lev>level)?-1:layers, msgqueue); } } @@ -401,14 +415,16 @@ void enqueue_allprecincts( int tile_id, int level, int lastcomp, bool *comps, in Byte4_t XPsiz, YPsiz; codeidx = msgqueue->cachemodel->target->codeidx; + if( tile_id < 0 ) + return; for( c=0; cSIZ.Csiz; c++) if( lastcomp == -1 /*all*/ || ( c<=lastcomp && comps[c])){ seq_id = 0; for( res_lev=0, dec_lev=codeidx->COD.numOfdecomp; dec_lev>=level; res_lev++, dec_lev--){ - XTsiz = get_tile_XSiz( codeidx->SIZ, tile_id, dec_lev); - YTsiz = get_tile_YSiz( codeidx->SIZ, tile_id, dec_lev); + XTsiz = get_tile_XSiz( codeidx->SIZ, (Byte4_t)tile_id, dec_lev); + YTsiz = get_tile_YSiz( codeidx->SIZ, (Byte4_t)tile_id, dec_lev); XPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.XPsiz[ res_lev] : XTsiz; YPsiz = ( codeidx->COD.Scod & 0x01) ? codeidx->COD.YPsiz[ res_lev] : YTsiz; @@ -419,18 +435,26 @@ void enqueue_allprecincts( int tile_id, int level, int lastcomp, bool *comps, in } } -void enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue) +bool enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue) { int i; for( i=0; query_param.box_type[i][0]!=0 && i