X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fopenjpip%2Fjpip_parser.c;h=e921e92bad8337ce0d934feb6d9faa8ec64347cf;hb=563bd8499e63db976ca8358216138647593354bc;hp=d44c84c83f55e55076503c984852db024e38c137;hpb=99fc1ab306f9db0085adf648369404ce8aae22a9;p=openjpeg.git diff --git a/src/lib/openjpip/jpip_parser.c b/src/lib/openjpip/jpip_parser.c index d44c84c8..e921e92b 100644 --- a/src/lib/openjpip/jpip_parser.c +++ b/src/lib/openjpip/jpip_parser.c @@ -3,7 +3,7 @@ * * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium * Copyright (c) 2002-2014, Professor Benoit Macq - * Copyright (c) 2010-2011, Kaori Hagihara + * Copyright (c) 2010-2011, Kaori Hagihara * Copyright (c) 2011, Lucian Corlaciu, GSoC * All rights reserved. * @@ -46,124 +46,138 @@ #endif /*SERVER*/ -OPJ_BOOL identify_target( query_param_t query_param, targetlist_param_t *targetlist, target_param_t **target) +OPJ_BOOL identify_target(query_param_t query_param, + targetlist_param_t *targetlist, target_param_t **target) { - if( query_param.tid){ - 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 OPJ_FALSE; - } - if( ( *target = search_targetBytid( query_param.tid, targetlist))) - return OPJ_TRUE; + if (query_param.tid) { + 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 OPJ_FALSE; + } + if ((*target = search_targetBytid(query_param.tid, targetlist))) { + return OPJ_TRUE; + } + } } - } - if( query_param.target) - if( !( *target = search_target( query_param.target, targetlist))) - if(!( *target = gene_target( targetlist, query_param.target))) - return OPJ_FALSE; - - if( *target){ - fprintf( FCGI_stdout, "JPIP-tid: %s\r\n", (*target)->tid); - return OPJ_TRUE; - } - else{ - fprintf( FCGI_stdout, "Reason: target not found\r\n"); - fprintf( FCGI_stdout, "Status: 400\r\n"); - return OPJ_FALSE; - } + if (query_param.target) + if (!(*target = search_target(query_param.target, targetlist))) + if (!(*target = gene_target(targetlist, query_param.target))) { + return OPJ_FALSE; + } + + if (*target) { + fprintf(FCGI_stdout, "JPIP-tid: %s\r\n", (*target)->tid); + return OPJ_TRUE; + } else { + fprintf(FCGI_stdout, "Reason: target not found\r\n"); + fprintf(FCGI_stdout, "Status: 400\r\n"); + return OPJ_FALSE; + } } -OPJ_BOOL associate_channel( query_param_t query_param, - sessionlist_param_t *sessionlist, - session_param_t **cursession, - channel_param_t **curchannel) +OPJ_BOOL associate_channel(query_param_t query_param, + sessionlist_param_t *sessionlist, + session_param_t **cursession, + channel_param_t **curchannel) { - if( search_session_and_channel( query_param.cid, sessionlist, cursession, curchannel)){ - - if( !query_param.cnew) - set_channel_variable_param( query_param, *curchannel); - } - else{ - fprintf( FCGI_stderr, "Error: process canceled\n"); - return OPJ_FALSE; - } - return OPJ_TRUE; + if (search_session_and_channel(query_param.cid, sessionlist, cursession, + curchannel)) { + + if (!query_param.cnew) { + set_channel_variable_param(query_param, *curchannel); + } + } else { + fprintf(FCGI_stderr, "Error: process canceled\n"); + return OPJ_FALSE; + } + return OPJ_TRUE; } -OPJ_BOOL open_channel( query_param_t query_param, - sessionlist_param_t *sessionlist, - auxtrans_param_t auxtrans, - target_param_t *target, - session_param_t **cursession, - channel_param_t **curchannel) +OPJ_BOOL open_channel(query_param_t query_param, + sessionlist_param_t *sessionlist, + auxtrans_param_t auxtrans, + target_param_t *target, + session_param_t **cursession, + channel_param_t **curchannel) { - cachemodel_param_t *cachemodel = NULL; - - if( target){ - if( !(*cursession)) - *cursession = gene_session( sessionlist); - if( !( cachemodel = search_cachemodel( target, (*cursession)->cachemodellist))) - if( !(cachemodel = gene_cachemodel( (*cursession)->cachemodellist, target, query_param.return_type==JPPstream))) - return OPJ_FALSE; - } - else - if( *curchannel) - cachemodel = (*curchannel)->cachemodel; - - *curchannel = gene_channel( query_param, auxtrans, cachemodel, (*cursession)->channellist); - if( *curchannel == NULL) - return OPJ_FALSE; - - return OPJ_TRUE; + cachemodel_param_t *cachemodel = NULL; + + if (target) { + if (!(*cursession)) { + *cursession = gene_session(sessionlist); + } + if (!(cachemodel = search_cachemodel(target, (*cursession)->cachemodellist))) + if (!(cachemodel = gene_cachemodel((*cursession)->cachemodellist, target, + query_param.return_type == JPPstream))) { + return OPJ_FALSE; + } + } else if (*curchannel) { + cachemodel = (*curchannel)->cachemodel; + } + + *curchannel = gene_channel(query_param, auxtrans, cachemodel, + (*cursession)->channellist); + if (*curchannel == NULL) { + return OPJ_FALSE; + } + + return OPJ_TRUE; } -OPJ_BOOL close_channel( query_param_t query_param, - sessionlist_param_t *sessionlist, - session_param_t **cursession, - channel_param_t **curchannel) +OPJ_BOOL close_channel(query_param_t query_param, + sessionlist_param_t *sessionlist, + session_param_t **cursession, + channel_param_t **curchannel) { - char *cclose; - int i; - - if( query_param.cclose[0] =='*'){ + char *cclose; + int i; + + if (query_param.cclose[0] == '*') { #ifndef SERVER - fprintf( logstream, "local log: close all\n"); + fprintf(logstream, "local log: close all\n"); #endif - /* all channels associatd with the session will be closed */ - if( !delete_session( cursession, sessionlist)) - return OPJ_FALSE; - } - else{ - /* 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 OPJ_FALSE; - } - } - - /* delete channels */ - for( i=0, cclose=query_param.cclose; ichannellist); - delete_channel( curchannel, (*cursession)->channellist); + /* all channels associatd with the session will be closed */ + if (!delete_session(cursession, sessionlist)) { + return OPJ_FALSE; + } + } else { + /* check if all entry belonging to the same session */ + + for (i = 0, cclose = query_param.cclose; i < query_param.numOfcclose; + i++, cclose += (strlen(cclose) + 1)) { + + /* In case of the first entry of close cid */ + if (*cursession == NULL) { + if (!search_session_and_channel(cclose, sessionlist, cursession, curchannel)) { + return OPJ_FALSE; + } + } else /* second or more entry of close cid */ + if (!(*curchannel = search_channel(cclose, (*cursession)->channellist))) { + fprintf(FCGI_stdout, "Reason: Cclose id %s is from another session\r\n", + cclose); + return OPJ_FALSE; + } + } + + /* delete channels */ + for (i = 0, cclose = query_param.cclose; i < query_param.numOfcclose; + i++, cclose += (strlen(cclose) + 1)) { + *curchannel = search_channel(cclose, (*cursession)->channellist); + delete_channel(curchannel, (*cursession)->channellist); + } + + if ((*cursession)->channellist->first == NULL || + (*cursession)->channellist->last == NULL) + /* In case of empty session */ + { + delete_session(cursession, sessionlist); + } } - - if( (*cursession)->channellist->first == NULL || (*cursession)->channellist->last == NULL) - /* In case of empty session */ - delete_session( cursession, sessionlist); - } - return OPJ_TRUE; + return OPJ_TRUE; } @@ -171,74 +185,82 @@ OPJ_BOOL close_channel( query_param_t query_param, * enqueue tiles or precincts into the message queue * * @param[in] query_param structured query - * @param[in] msgqueue message queue pointer + * @param[in] msgqueue message queue pointer */ -void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue); +void enqueue_imagedata(query_param_t query_param, msgqueue_param_t *msgqueue); /** * enqueue metadata bins into the message queue * * @param[in] query_param structured query * @param[in] metadatalist pointer to metadata bin list - * @param[in,out] msgqueue message queue pointer + * @param[in,out] msgqueue message queue pointer * @return if succeeded (true) or failed (false) */ -OPJ_BOOL enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue); +OPJ_BOOL enqueue_metabins(query_param_t query_param, + metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue); -OPJ_BOOL gene_JPIPstream( query_param_t query_param, - target_param_t *target, - session_param_t *cursession, - channel_param_t *curchannel, - msgqueue_param_t **msgqueue) +OPJ_BOOL gene_JPIPstream(query_param_t query_param, + target_param_t *target, + session_param_t *cursession, + channel_param_t *curchannel, + msgqueue_param_t **msgqueue) { - index_param_t *codeidx; - cachemodel_param_t *cachemodel; - - if( !cursession || !curchannel){ /* stateless */ - if( !target) - return OPJ_FALSE; - if( !(cachemodel = gene_cachemodel( NULL, target, query_param.return_type==JPPstream))) - return OPJ_FALSE; - *msgqueue = gene_msgqueue( OPJ_TRUE, cachemodel); - } - else{ /* session */ - cachemodel = curchannel->cachemodel; - target = cachemodel->target; - *msgqueue = gene_msgqueue( OPJ_FALSE, cachemodel); - } - - codeidx = target->codeidx; - - if( cachemodel->jppstream) - fprintf( FCGI_stdout, "Content-type: image/jpp-stream\r\n"); - else - fprintf( FCGI_stdout, "Content-type: image/jpt-stream\r\n"); - - if( query_param.layers != -1){ - if( query_param.layers > codeidx->COD.numOflayers){ - fprintf( FCGI_stdout, "JPIP-layers: %d\r\n", codeidx->COD.numOflayers); - query_param.layers = codeidx->COD.numOflayers; + index_param_t *codeidx; + cachemodel_param_t *cachemodel; + + if (!cursession || !curchannel) { /* stateless */ + if (!target) { + return OPJ_FALSE; + } + if (!(cachemodel = gene_cachemodel(NULL, target, + query_param.return_type == JPPstream))) { + return OPJ_FALSE; + } + *msgqueue = gene_msgqueue(OPJ_TRUE, cachemodel); + } else { /* session */ + cachemodel = curchannel->cachemodel; + target = cachemodel->target; + *msgqueue = gene_msgqueue(OPJ_FALSE, cachemodel); } - } - - /*meta*/ - if( query_param.box_type[0][0] != 0 && query_param.len != 0) - if( !enqueue_metabins( query_param, codeidx->metadatalist, *msgqueue)) - return OPJ_FALSE; - - if( query_param.metadata_only) - return OPJ_TRUE; - /* main header */ - if( !cachemodel->mhead_model && query_param.len != 0) - enqueue_mainheader( *msgqueue); + codeidx = target->codeidx; + + if (cachemodel->jppstream) { + fprintf(FCGI_stdout, "Content-type: image/jpp-stream\r\n"); + } else { + fprintf(FCGI_stdout, "Content-type: image/jpt-stream\r\n"); + } + + if (query_param.layers != -1) { + if (query_param.layers > codeidx->COD.numOflayers) { + fprintf(FCGI_stdout, "JPIP-layers: %d\r\n", codeidx->COD.numOflayers); + query_param.layers = codeidx->COD.numOflayers; + } + } - /* image codestream */ - if( (query_param.fx > 0 && query_param.fy > 0)) - enqueue_imagedata( query_param, *msgqueue); - - return OPJ_TRUE; + /*meta*/ + if (query_param.box_type[0][0] != 0 && query_param.len != 0) + if (!enqueue_metabins(query_param, codeidx->metadatalist, *msgqueue)) { + return OPJ_FALSE; + } + + if (query_param.metadata_only) { + return OPJ_TRUE; + } + + /* 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 OPJ_TRUE; } @@ -257,7 +279,9 @@ OPJ_BOOL gene_JPIPstream( query_param_t query_param, * @param[in] msgqueue message queue * @return */ -void enqueue_precincts( int xmin, int xmax, int ymin, int ymax, int tile_id, int level, int lastcomp, OPJ_BOOL *comps, int layers, msgqueue_param_t *msgqueue); +void enqueue_precincts(int xmin, int xmax, int ymin, int ymax, int tile_id, + int level, int lastcomp, OPJ_BOOL *comps, int layers, + msgqueue_param_t *msgqueue); /** * enqueue all precincts inside a tile into the queue @@ -270,191 +294,219 @@ void enqueue_precincts( int xmin, int xmax, int ymin, int ymax, int tile_id, int * @param[in] msgqueue message queue * @return */ -void enqueue_allprecincts( int tile_id, int level, int lastcomp, OPJ_BOOL *comps, int layers, msgqueue_param_t *msgqueue); +void enqueue_allprecincts(int tile_id, int level, int lastcomp, OPJ_BOOL *comps, + int layers, msgqueue_param_t *msgqueue); -void enqueue_imagedata( query_param_t query_param, msgqueue_param_t *msgqueue) +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; - 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 */ - 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, - (int)codeidx->SIZ.XOsiz, (int)codeidx->SIZ.YOsiz, (int)codeidx->SIZ.Xsiz, (int)codeidx->SIZ.Ysiz, - numOfreslev ); - - if( query_param.len == 0) - return; - - for( u=0, tile_id=0; uSIZ.YTnum; u++){ - tile_Yrange = get_tile_Yrange( codeidx->SIZ, tile_id, imgreg.level); - - for( v=0; vSIZ.XTnum; v++, tile_id++){ - 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 <= (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 >= (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( (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);*/ - if( msgqueue->cachemodel->jppstream){ - 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); - } - } + index_param_t *codeidx; + imgreg_param_t imgreg; + range_param_t tile_Xrange, tile_Yrange; + 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 */ + 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, + (int)codeidx->SIZ.XOsiz, (int)codeidx->SIZ.YOsiz, (int)codeidx->SIZ.Xsiz, + (int)codeidx->SIZ.Ysiz, + numOfreslev); + + if (query_param.len == 0) { + return; + } + + for (u = 0, tile_id = 0; u < codeidx->SIZ.YTnum; u++) { + tile_Yrange = get_tile_Yrange(codeidx->SIZ, tile_id, imgreg.level); + + for (v = 0; v < codeidx->SIZ.XTnum; v++, tile_id++) { + 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 <= (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 >= (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((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);*/ + if (msgqueue->cachemodel->jppstream) { + 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); + } + } + } + } } - } } -void enqueue_precincts( int xmin, int xmax, int ymin, int ymax, int tile_id, int level, int lastcomp, OPJ_BOOL *comps, int layers, msgqueue_param_t *msgqueue) +void enqueue_precincts(int xmin, int xmax, int ymin, int ymax, int tile_id, + int level, int lastcomp, OPJ_BOOL *comps, int layers, + msgqueue_param_t *msgqueue) { - index_param_t *codeidx; - int c, u, v, res_lev, dec_lev; - int seq_id; - Byte4_t XTsiz, YTsiz; - Byte4_t XPsiz, YPsiz; - Byte4_t xminP, xmaxP, yminP, ymaxP; - - codeidx = msgqueue->cachemodel->target->codeidx; - /* MM: shouldn't 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, (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 (Byte4_t)xmax || ymaxP < (Byte4_t)ymin || yminP > (Byte4_t)ymax){ - /* Precinct completely excluded from view-window */ - } - 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 */ - enqueue_precinct( seq_id, tile_id, c, (dec_lev>level)?-1:layers, msgqueue); - } - } - } - } + index_param_t *codeidx; + int c, u, v, res_lev, dec_lev; + int seq_id; + Byte4_t XTsiz, YTsiz; + Byte4_t XPsiz, YPsiz; + Byte4_t xminP, xmaxP, yminP, ymaxP; + + codeidx = msgqueue->cachemodel->target->codeidx; + /* MM: shouldn't 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; c < codeidx->SIZ.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, (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 < ceil((double)YTsiz / (double)YPsiz); u++) { + yminP = (Byte4_t)u * YPsiz; + ymaxP = (Byte4_t)(u + 1) * YPsiz - 1; + if (YTsiz <= ymaxP) { + ymaxP = YTsiz - 1; + } + + for (v = 0; v < ceil((double)XTsiz / (double)XPsiz); v++, seq_id++) { + xminP = (Byte4_t)v * XPsiz; + xmaxP = (Byte4_t)(v + 1) * XPsiz - 1; + if (XTsiz <= xmaxP) { + xmaxP = XTsiz - 1; + } + + 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 >= (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 */ + enqueue_precinct(seq_id, tile_id, c, (dec_lev > level) ? -1 : layers, msgqueue); + } + } + } + } + } } -void enqueue_allprecincts( int tile_id, int level, int lastcomp, OPJ_BOOL *comps, int layers, msgqueue_param_t *msgqueue) +void enqueue_allprecincts(int tile_id, int level, int lastcomp, OPJ_BOOL *comps, + int layers, msgqueue_param_t *msgqueue) { - index_param_t *codeidx; - int c, i, res_lev, dec_lev; - int seq_id; - Byte4_t XTsiz, YTsiz; - 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, (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( i=0; ilevel)?-1:layers, msgqueue); - } + index_param_t *codeidx; + int c, i, res_lev, dec_lev; + int seq_id; + Byte4_t XTsiz, YTsiz; + Byte4_t XPsiz, YPsiz; + + codeidx = msgqueue->cachemodel->target->codeidx; + if (tile_id < 0) { + return; } + + for (c = 0; c < codeidx->SIZ.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, (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 (i = 0; + i < ceil((double)YTsiz / (double)YPsiz)*ceil((double)XTsiz / (double)XPsiz); + i++, seq_id++) { + enqueue_precinct(seq_id, tile_id, c, (dec_lev > level) ? -1 : layers, + msgqueue); + } + } + } } -OPJ_BOOL enqueue_metabins( query_param_t query_param, metadatalist_param_t *metadatalist, msgqueue_param_t *msgqueue) +OPJ_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