📄 pktdecoder.java
字号:
return cbI; } /** * Retrives precincts and code-blocks coordinates in the given resolution, * level and component. Finishes TagTreeEncoder initialization as well. * * @param c Component index. * * @param r Resolution level index. * * @param mdl Number of decomposition level in component <tt>c</tt>. * */ private void fillPrecInfo(int c,int r,int mdl) { if(ppinfo[c][r].length==0) return; // No precinct in this // resolution level Coord tileI = src.getTile(null); Coord nTiles = src.getNumTiles(null); int xsiz,ysiz,x0siz,y0siz; int xt0siz,yt0siz; int xtsiz,ytsiz; xt0siz = src.getTilePartULX(); yt0siz = src.getTilePartULY(); xtsiz = src.getNomTileWidth(); ytsiz = src.getNomTileHeight(); x0siz = hd.getImgULX(); y0siz = hd.getImgULY(); xsiz = hd.getImgWidth(); ysiz = hd.getImgHeight(); int tx0 = (tileI.x==0) ? x0siz : xt0siz+tileI.x*xtsiz; int ty0 = (tileI.y==0) ? y0siz : yt0siz+tileI.y*ytsiz; int tx1 = (tileI.x!=nTiles.x-1) ? xt0siz+(tileI.x+1)*xtsiz : xsiz; int ty1 = (tileI.y!=nTiles.y-1) ? yt0siz+(tileI.y+1)*ytsiz : ysiz; int xrsiz = hd.getCompSubsX(c); int yrsiz = hd.getCompSubsY(c); int tcx0 = src.getResULX(c,mdl); int tcy0 = src.getResULY(c,mdl); int tcx1 = tcx0 + src.getTileCompWidth(tIdx,c,mdl); int tcy1 = tcy0 + src.getTileCompHeight(tIdx,c,mdl); int ndl = mdl-r; int trx0 = (int)Math.ceil(tcx0/(double)(1<<ndl)); int try0 = (int)Math.ceil(tcy0/(double)(1<<ndl)); int trx1 = (int)Math.ceil(tcx1/(double)(1<<ndl)); int try1 = (int)Math.ceil(tcy1/(double)(1<<ndl)); int cb0x = src.getCbULX(); int cb0y = src.getCbULY(); double twoppx = (double)getPPX(tIdx,c,r); double twoppy = (double)getPPY(tIdx,c,r); int twoppx2 = (int)(twoppx/2); int twoppy2 = (int)(twoppy/2); // Precincts are located at (cb0x+i*twoppx,cb0y+j*twoppy) // Valid precincts are those which intersect with the current // resolution level int maxPrec = ppinfo[c][r].length; int nPrec = 0; int istart = (int)Math.floor((try0-cb0y)/twoppy); int iend = (int)Math.floor((try1-1-cb0y)/twoppy); int jstart = (int)Math.floor((trx0-cb0x)/twoppx); int jend = (int)Math.floor((trx1-1-cb0x)/twoppx); int acb0x,acb0y; SubbandSyn root = src.getSynSubbandTree(tIdx,c); SubbandSyn sb = null; int p0x,p0y,p1x,p1y; // Precinct projection in subband int s0x,s0y,s1x,s1y; // Active subband portion int cw,ch; int kstart,kend,lstart,lend,k0,l0; int prg_ulx,prg_uly; int prg_w = (int)twoppx<<ndl; int prg_h = (int)twoppy<<ndl; int tmp1,tmp2; CBlkCoordInfo cb; for(int i=istart; i<=iend; i++) { // Vertical precincts for(int j=jstart; j<=jend; j++,nPrec++) { // Horizontal precincts if(j==jstart && (trx0-cb0x)%(xrsiz*((int)twoppx))!=0) { prg_ulx = tx0; } else { prg_ulx = cb0x+j*xrsiz*((int)twoppx<<ndl); } if(i==istart && (try0-cb0y)%(yrsiz*((int)twoppy))!=0) { prg_uly = ty0; } else { prg_uly = cb0y+i*yrsiz*((int)twoppy<<ndl); } ppinfo[c][r][nPrec] = new PrecInfo(r,(int)(cb0x+j*twoppx),(int)(cb0y+i*twoppy), (int)twoppx,(int)twoppy, prg_ulx,prg_uly,prg_w,prg_h); if(r==0) { // LL subband acb0x = cb0x; acb0y = cb0y; p0x = acb0x+j*(int)twoppx; p1x = p0x + (int)twoppx; p0y = acb0y+i*(int)twoppy; p1y = p0y + (int)twoppy; sb = (SubbandSyn)root.getSubbandByIdx(0,0); s0x = (p0x<sb.ulcx) ? sb.ulcx : p0x; s1x = (p1x>sb.ulcx+sb.w) ? sb.ulcx+sb.w : p1x; s0y = (p0y<sb.ulcy) ? sb.ulcy : p0y; s1y = (p1y>sb.ulcy+sb.h) ? sb.ulcy+sb.h : p1y; // Code-blocks are located at (acb0x+k*cw,acb0y+l*ch) cw = sb.nomCBlkW; ch = sb.nomCBlkH; k0 = (int)Math.floor((sb.ulcy-acb0y)/(double)ch); kstart = (int)Math.floor((s0y-acb0y)/(double)ch); kend = (int)Math.floor((s1y-1-acb0y)/(double)ch); l0 = (int)Math.floor((sb.ulcx-acb0x)/(double)cw); lstart = (int)Math.floor((s0x-acb0x)/(double)cw); lend = (int)Math.floor((s1x-1-acb0x)/(double)cw); if(s1x-s0x<=0 || s1y-s0y<=0) { ppinfo[c][r][nPrec].nblk[0] = 0; ttIncl[c][r][nPrec][0] = new TagTreeDecoder(0,0); ttMaxBP[c][r][nPrec][0] = new TagTreeDecoder(0,0); } else { ttIncl[c][r][nPrec][0] = new TagTreeDecoder(kend-kstart+1,lend-lstart+1); ttMaxBP[c][r][nPrec][0] = new TagTreeDecoder(kend-kstart+1,lend-lstart+1); ppinfo[c][r][nPrec].cblk[0] = new CBlkCoordInfo[kend-kstart+1][lend-lstart+1]; ppinfo[c][r][nPrec]. nblk[0] = (kend-kstart+1)*(lend-lstart+1); for(int k=kstart; k<=kend; k++) { // Vertical cblks for(int l=lstart; l<=lend; l++) { // Horiz. cblks cb = new CBlkCoordInfo(k-k0,l-l0); if(l==l0) { cb.ulx = sb.ulx; } else { cb.ulx = sb.ulx+l*cw-(sb.ulcx-acb0x); } if(k==k0) { cb.uly = sb.uly; } else { cb.uly = sb.uly+k*ch-(sb.ulcy-acb0y); } tmp1 = acb0x+l*cw; tmp1 = (tmp1>sb.ulcx) ? tmp1 : sb.ulcx; tmp2 = acb0x+(l+1)*cw; tmp2 = (tmp2>sb.ulcx+sb.w) ? sb.ulcx+sb.w : tmp2; cb.w = tmp2-tmp1; tmp1 = acb0y+k*ch; tmp1 = (tmp1>sb.ulcy) ? tmp1 : sb.ulcy; tmp2 = acb0y+(k+1)*ch; tmp2 = (tmp2>sb.ulcy+sb.h) ? sb.ulcy+sb.h : tmp2; cb.h = tmp2-tmp1; ppinfo[c][r][nPrec]. cblk[0][k-kstart][l-lstart] = cb; } // Horizontal code-blocks } // Vertical code-blocks } } else { // HL, LH and HH subbands // HL subband acb0x = 0; acb0y = cb0y; p0x = acb0x+j*twoppx2; p1x = p0x + twoppx2; p0y = acb0y+i*twoppy2; p1y = p0y + twoppy2; sb = (SubbandSyn)root.getSubbandByIdx(r,1); s0x = (p0x<sb.ulcx) ? sb.ulcx : p0x; s1x = (p1x>sb.ulcx+sb.w) ? sb.ulcx+sb.w : p1x; s0y = (p0y<sb.ulcy) ? sb.ulcy : p0y; s1y = (p1y>sb.ulcy+sb.h) ? sb.ulcy+sb.h : p1y; // Code-blocks are located at (acb0x+k*cw,acb0y+l*ch) cw = sb.nomCBlkW; ch = sb.nomCBlkH; k0 = (int)Math.floor((sb.ulcy-acb0y)/(double)ch); kstart = (int)Math.floor((s0y-acb0y)/(double)ch); kend = (int)Math.floor((s1y-1-acb0y)/(double)ch); l0 = (int)Math.floor((sb.ulcx-acb0x)/(double)cw); lstart = (int)Math.floor((s0x-acb0x)/(double)cw); lend = (int)Math.floor((s1x-1-acb0x)/(double)cw); if(s1x-s0x<=0 || s1y-s0y<=0) { ppinfo[c][r][nPrec].nblk[1] = 0; ttIncl[c][r][nPrec][1] = new TagTreeDecoder(0,0); ttMaxBP[c][r][nPrec][1] = new TagTreeDecoder(0,0); } else { ttIncl[c][r][nPrec][1] = new TagTreeDecoder(kend-kstart+1,lend-lstart+1); ttMaxBP[c][r][nPrec][1] = new TagTreeDecoder(kend-kstart+1,lend-lstart+1); ppinfo[c][r][nPrec].cblk[1] = new CBlkCoordInfo[kend-kstart+1][lend-lstart+1]; ppinfo[c][r][nPrec]. nblk[1] = (kend-kstart+1)*(lend-lstart+1); for(int k=kstart; k<=kend; k++) { // Vertical cblks for(int l=lstart; l<=lend; l++) { // Horiz. cblks cb = new CBlkCoordInfo(k-k0,l-l0); if(l==l0) { cb.ulx = sb.ulx; } else { cb.ulx = sb.ulx+l*cw-(sb.ulcx-acb0x); } if(k==k0) { cb.uly = sb.uly; } else { cb.uly = sb.uly+k*ch-(sb.ulcy-acb0y); } tmp1 = acb0x+l*cw; tmp1 = (tmp1>sb.ulcx) ? tmp1 : sb.ulcx; tmp2 = acb0x+(l+1)*cw; tmp2 = (tmp2>sb.ulcx+sb.w) ? sb.ulcx+sb.w : tmp2; cb.w = tmp2-tmp1; tmp1 = acb0y+k*ch; tmp1 = (tmp1>sb.ulcy) ? tmp1 : sb.ulcy; tmp2 = acb0y+(k+1)*ch; tmp2 = (tmp2>sb.ulcy+sb.h) ? sb.ulcy+sb.h : tmp2; cb.h = tmp2-tmp1; ppinfo[c][r][nPrec]. cblk[1][k-kstart][l-lstart] = cb; } // Horizontal code-blocks } // Vertical code-blocks } // LH subband acb0x = cb0x; acb0y = 0; p0x = acb0x+j*twoppx2; p1x = p0x + twoppx2; p0y = acb0y+i*twoppy2; p1y = p0y + twoppy2; sb = (SubbandSyn)root.getSubbandByIdx(r,2); s0x = (p0x<sb.ulcx) ? sb.ulcx : p0x; s1x = (p1x>sb.ulcx+sb.w) ? sb.ulcx+sb.w : p1x; s0y = (p0y<sb.ulcy) ? sb.ulcy : p0y; s1y = (p1y>sb.ulcy+sb.h) ? sb.ulcy+sb.h : p1y; // Code-blocks are located at (acb0x+k*cw,acb0y+l*ch) cw = sb.nomCBlkW; ch = sb.nomCBlkH; k0 = (int)Math.floor((sb.ulcy-acb0y)/(double)ch); kstart = (int)Math.floor((s0y-acb0y)/(double)ch); kend = (int)Math.floor((s1y-1-acb0y)/(double)ch); l0 = (int)Math.floor((sb.ulcx-acb0x)/(double)cw); lstart = (int)Math.floor((s0x-acb0x)/(double)cw); lend = (int)Math.floor((s1x-1-acb0x)/(double)cw); if(s1x-s0x<=0 || s1y-s0y<=0) { ppinfo[c][r][nPrec].nblk[2] = 0; ttIncl[c][r][nPrec][2] = new TagTreeDecoder(0,0); ttMaxBP[c][r][nPrec][2] = new TagTreeDecoder(0,0); } else { ttIncl[c][r][nPrec][2] = new TagTreeDecoder(kend-kstart+1,lend-lstart+1); ttMaxBP[c][r][nPrec][2] = new TagTreeDecoder(kend-kstart+1,lend-lstart+1); ppinfo[c][r][nPrec].cblk[2] = new CBlkCoordInfo[kend-kstart+1][lend-lstart+1]; ppinfo[c][r][nPrec]. nblk[2] = (kend-kstart+1)*(lend-lstart+1); for(int k=kstart; k<=kend; k++) { // Vertical cblks for(int l=lstart; l<=lend; l++) { // Horiz cblks cb = new CBlkCoordInfo(k-k0,l-l0); if(l==l0) { cb.ulx = sb.ulx; } else { cb.ulx = sb.ulx+l*cw-(sb.ulcx-acb0x); } if(k==k0) { cb.uly = sb.uly; } else { cb.uly = sb.uly+k*ch-(sb.ulcy-acb0y); } tmp1 = acb0x+l*cw; tmp1 = (tmp1>sb.ulcx) ? tmp1 : sb.ulcx; tmp2 = acb0x+(l+1)*cw; tmp2 = (tmp2>sb.ulcx+sb.w) ? sb.ulcx+sb.w : tmp2; cb.w = tmp2-tmp1; tmp1 = acb0y+k*ch; tmp1 = (tmp1>sb.ulcy) ? tmp1 : sb.ulcy; tmp2 = acb0y+(k+1)*ch; tmp2 = (tmp2>sb.ulcy+sb.h) ? sb.ulcy+sb.h : tmp2; cb.h = tmp2-tmp1; ppinfo[c][r][nPrec]. cblk[2][k-kstart][l-lstart] = cb; } // Horizontal code-blocks } // Vertical code-blocks } // HH subband acb0x = 0; acb0y = 0; p0x = acb0x+j*twoppx2; p1x = p0x + twoppx2; p0y = acb0y+i*twoppy2; p1y = p0y + twoppy2; sb = (SubbandSyn)root.getSubbandByIdx(r,3); s0x = (p0x<sb.ulcx) ? sb.ulcx : p0x; s1x = (p1x>sb.ulcx+sb.w) ? sb.ulcx+sb.w : p1x; s0y = (p0y<sb.ulcy) ? sb.ulcy : p0y; s1y = (p1y>sb.ulcy+sb.h) ? sb.ulcy+sb.h : p1y; // Code-blocks are located at (acb0x+k*cw,acb0y+l*ch) cw = sb.nomCBlkW; ch = sb.nomCBlkH; k0 = (int)Math.floor((sb.ulcy-acb0y)/(double)ch); kstart = (int)Math.floor((s0y-acb0y)/(double)ch); kend = (int)Math.floor((s1y-1-acb0y)/(double)ch); l0 = (int)Math.floor((sb.ulcx-acb0x)/(double)cw); lstart = (int)Math.floor((s0x-acb0x)/(double)cw); lend = (int)Math.floor((s1x-1-acb0x)/(double)cw); if(s1x-s0x<=0 || s1y-s0y<=0) { ppinfo[c][r][nPrec].nblk[3] = 0; ttIncl[c][r][nPrec][3] = new TagTreeDecoder(0,0); ttMaxBP[c][r][nPrec][3] = new TagTreeDecoder(0,0); } else { ttIncl[c][r][nPrec][3] = new TagTreeDecoder(kend-kstart+1,lend-lstart+1); ttMaxBP[c][r][nPrec][3] = new TagTreeDecoder(kend-kstart+1,lend-lstart+1); ppinfo[c][r][nPrec].cblk[3] =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -