Changeset 247 in 3DVCSoftware for branches/HTM-5.1-dev3-Mediatek/source/Lib
- Timestamp:
- 31 Jan 2013, 08:40:24 (12 years ago)
- Location:
- branches/HTM-5.1-dev3-Mediatek/source/Lib/TLibCommon
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HTM-5.1-dev3-Mediatek/source/Lib/TLibCommon/TComDataCU.cpp
r246 r247 5608 5608 #if QC_SIMPLE_NBDV_B0047 5609 5609 const Int iNumofDvMCP = 7; 5610 #if MTK_RELEASE_DV_CONSTRAINT 5611 Int aiDvMcpDvCandX[2][iNumofDvMCP] = {{0,}, {0,}}; // dummy, 5 spatial + 1 temporal 5612 Int aiDvMcpDvCandY[2][iNumofDvMCP] = {{0,}, {0,}}; // dummy, 5 spatial + 1 temporal 5613 #else 5610 5614 Int aiDvMcpDvCand[2][iNumofDvMCP] = {{0,}, {0,}}; // dummy, 5 spatial + 1 temporal 5615 #endif 5611 5616 Bool abDvMcpFlag [2][iNumofDvMCP] = {{false,},{false,}}; 5612 5617 #else … … 6007 6012 if( cTmpMvPred.m_bDvMcp && bTmpIsSkipped ) 6008 6013 { 6014 #if MTK_RELEASE_DV_CONSTRAINT 6015 aiDvMcpDvCandX[iList][DVFROM_LEFT] = cTmpMvPred.m_iDvMcpDispX; 6016 aiDvMcpDvCandY[iList][DVFROM_LEFT] = cTmpMvPred.m_iDvMcpDispY; 6017 #else 6009 6018 aiDvMcpDvCand[iList][DVFROM_LEFT] = cTmpMvPred.m_iDvMcpDispX; 6019 #endif 6010 6020 abDvMcpFlag [iList][DVFROM_LEFT] = true; 6011 6021 bDvMcpIsFound = true; … … 6093 6103 if( cTmpMvPred.m_bDvMcp && bTmpIsSkipped ) 6094 6104 { 6105 #if MTK_RELEASE_DV_CONSTRAINT 6106 aiDvMcpDvCandX[iList][DVFROM_ABOVE] = cTmpMvPred.m_iDvMcpDispX; 6107 aiDvMcpDvCandY[iList][DVFROM_ABOVE] = cTmpMvPred.m_iDvMcpDispY; 6108 #else 6095 6109 aiDvMcpDvCand[iList][DVFROM_ABOVE] = cTmpMvPred.m_iDvMcpDispX; 6110 #endif 6096 6111 abDvMcpFlag [iList][DVFROM_ABOVE] = true; 6097 6112 bDvMcpIsFound = true; … … 6173 6188 if( cTmpMvPred.m_bDvMcp && bTmpIsSkipped ) 6174 6189 { 6190 #if MTK_RELEASE_DV_CONSTRAINT 6191 aiDvMcpDvCandX[iList][DVFROM_ABOVERIGHT] = cTmpMvPred.m_iDvMcpDispX; 6192 aiDvMcpDvCandY[iList][DVFROM_ABOVERIGHT] = cTmpMvPred.m_iDvMcpDispY; 6193 #else 6175 6194 aiDvMcpDvCand[iList][DVFROM_ABOVERIGHT] = cTmpMvPred.m_iDvMcpDispX; 6195 #endif 6176 6196 abDvMcpFlag [iList][DVFROM_ABOVERIGHT] = true; 6177 6197 bDvMcpIsFound = true; … … 6245 6265 if( cTmpMvPred.m_bDvMcp && bTmpIsSkipped ) 6246 6266 { 6267 #if MTK_RELEASE_DV_CONSTRAINT 6268 aiDvMcpDvCandX[iList][DVFROM_LEFTBELOW] = cTmpMvPred.m_iDvMcpDispX; 6269 aiDvMcpDvCandY[iList][DVFROM_LEFTBELOW] = cTmpMvPred.m_iDvMcpDispY; 6270 #else 6247 6271 aiDvMcpDvCand[iList][DVFROM_LEFTBELOW] = cTmpMvPred.m_iDvMcpDispX; 6272 #endif 6248 6273 abDvMcpFlag [iList][DVFROM_LEFTBELOW] = true; 6249 6274 bDvMcpIsFound = true; … … 6327 6352 if( cTmpMvPred.m_bDvMcp && bTmpIsSkipped ) 6328 6353 { 6354 #if MTK_RELEASE_DV_CONSTRAINT 6355 aiDvMcpDvCandX[iList][DVFROM_ABOVELEFT] = cTmpMvPred.m_iDvMcpDispX; 6356 aiDvMcpDvCandY[iList][DVFROM_ABOVELEFT] = cTmpMvPred.m_iDvMcpDispY; 6357 #else 6329 6358 aiDvMcpDvCand[iList][DVFROM_ABOVELEFT] = cTmpMvPred.m_iDvMcpDispX; 6359 #endif 6330 6360 abDvMcpFlag [iList][DVFROM_ABOVELEFT] = true; 6331 6361 bDvMcpIsFound = true; … … 6678 6708 if( abDvMcpFlag[iList][i]==true ) 6679 6709 { 6710 #if MTK_RELEASE_DV_CONSTRAINT 6711 TComMv dv( aiDvMcpDvCandX[iList][ i ], aiDvMcpDvCandY[iList][ i ] ); 6712 #else 6680 6713 TComMv dv( aiDvMcpDvCand[iList][ i ], 0 ); 6714 #endif 6681 6715 clipMv( dv ); 6682 6716 #if !MERL_MTK_VSP_DVP_REFINE_C0152_C0131 … … 8843 8877 else 8844 8878 { 8879 #if MTK_RELEASE_DV_CONSTRAINT 8880 Bool bAvailable = pcResidualGenerator->getResidualSamples( this, uiPartIdx, pcYuv, cDisInfo.m_acMvCand[0] 8881 #if QC_SIMPLIFIEDIVRP_M24938 8882 , bRecon 8883 #endif 8884 ); 8885 #else 8845 8886 Bool bAvailable = pcResidualGenerator->getResidualSamples( this, uiPartIdx, pcYuv, cDisInfo.m_acMvCand[0].getHor() 8846 8887 #if QC_SIMPLIFIEDIVRP_M24938 … … 8848 8889 #endif 8849 8890 ); 8891 #endif 8850 8892 m_pePartSize[0] = m_peSaved; 8851 8893 return bAvailable; -
branches/HTM-5.1-dev3-Mediatek/source/Lib/TLibCommon/TComDepthMapGenerator.cpp
r231 r247 723 723 cMv.m_bDvMcp = true; 724 724 cMv.m_iDvMcpDispX = pDInfo->m_acMvCand[0].getHor(); 725 #if MTK_RELEASE_DV_CONSTRAINT 726 cMv.m_iDvMcpDispY = pDInfo->m_acMvCand[0].getVer(); 727 #endif 725 728 #endif 726 729 pcCU->clipMv( cMv ); … … 920 923 rcMv.m_bDvMcp = true; 921 924 rcMv.m_iDvMcpDispX = pDInfo->m_acMvCand[0].getHor(); 925 #if MTK_RELEASE_DV_CONSTRAINT 926 rcMv.m_iDvMcpDispY = pDInfo->m_acMvCand[0].getVer(); 927 #endif 922 928 } 923 929 else { // AMVP ? -
branches/HTM-5.1-dev3-Mediatek/source/Lib/TLibCommon/TComMv.h
r189 r247 60 60 Bool m_bDvMcp; // is dv-mcp ? 61 61 Int m_iDvMcpDispX; // disparity for dv-mcp 62 #if MTK_RELEASE_DV_CONSTRAINT 63 Int m_iDvMcpDispY; // disparity for dv-mcp 64 #endif 62 65 #endif 63 66 … … 72 75 , m_bDvMcp(false) 73 76 , m_iDvMcpDispX(0) 77 #if MTK_RELEASE_DV_CONSTRAINT 78 , m_iDvMcpDispY(0) 79 #endif 74 80 #endif 75 81 { … … 82 88 , m_bDvMcp(false) 83 89 , m_iDvMcpDispX(0) 90 #if MTK_RELEASE_DV_CONSTRAINT 91 , m_iDvMcpDispY(0) 92 #endif 84 93 #endif 85 94 { -
branches/HTM-5.1-dev3-Mediatek/source/Lib/TLibCommon/TComResidualGenerator.cpp
r189 r247 220 220 221 221 #if QC_MULTI_DIS_CAN_A0097 222 #if MTK_RELEASE_DV_CONSTRAINT 223 Bool 224 TComResidualGenerator::getResidualSamples( TComDataCU* pcCU, UInt uiPUIdx, TComYuv* pcYuv, TComMv iDisp 225 #if QC_SIMPLIFIEDIVRP_M24938 226 , Bool bRecon 227 #endif 228 ) 229 #else 222 230 Bool 223 231 TComResidualGenerator::getResidualSamples( TComDataCU* pcCU, UInt uiPUIdx, TComYuv* pcYuv, Int iDisp … … 226 234 #endif 227 235 ) 236 #endif 228 237 #else 229 238 Bool … … 244 253 pcCU->getPic()->getPicYuvRec()->getTopLeftSamplePos( pcCU->getAddr(), pcCU->getZorderIdxInCU() + uiPartAddr, iXPos, iYPos ); 245 254 #if QC_MULTI_DIS_CAN_A0097 255 #if MTK_RELEASE_DV_CONSTRAINT 246 256 return getResidualSamples( pcCU->getPic(), (UInt)iXPos, (UInt)iYPos, (UInt)iBlkWidth, (UInt)iBlkHeight, pcYuv, iDisp 247 257 #if QC_SIMPLIFIEDIVRP_M24938 … … 249 259 #endif 250 260 ); 261 #else 262 return getResidualSamples( pcCU->getPic(), (UInt)iXPos, (UInt)iYPos, (UInt)iBlkWidth, (UInt)iBlkHeight, pcYuv, iDisp 263 #if QC_SIMPLIFIEDIVRP_M24938 264 , bRecon 265 #endif 266 ); 267 #endif 251 268 #else 252 269 return getResidualSamples( pcCU->getPic(), (UInt)iXPos, (UInt)iYPos, (UInt)iBlkWidth, (UInt)iBlkHeight, pcYuv … … 259 276 260 277 #if QC_MULTI_DIS_CAN_A0097 278 #if MTK_RELEASE_DV_CONSTRAINT 279 Bool 280 TComResidualGenerator::getResidualSamples( TComPic* pcPic, UInt uiXPos, UInt uiYPos, UInt uiBlkWidth, UInt uiBlkHeight, TComYuv* pcYuv, TComMv iDisp 281 #if QC_SIMPLIFIEDIVRP_M24938 282 , Bool bRecon 283 #endif 284 ) 285 #else 261 286 Bool 262 287 TComResidualGenerator::getResidualSamples( TComPic* pcPic, UInt uiXPos, UInt uiYPos, UInt uiBlkWidth, UInt uiBlkHeight, TComYuv* pcYuv, Int iDisp … … 265 290 #endif 266 291 ) 292 #endif 267 293 #else 268 294 Bool … … 284 310 #endif 285 311 #if QC_MULTI_DIS_CAN_A0097 312 #if MTK_RELEASE_DV_CONSTRAINT 313 xSetPredResidualBlock( pcPic, uiBaseViewId, uiXPos, uiYPos, uiBlkWidth, uiBlkHeight, pcYuv, iDisp 314 #if QC_SIMPLIFIEDIVRP_M24938 315 , &uiXPosInRefView , &uiYPosInRefView , bRecon 316 #endif 317 ); 318 #else 286 319 xSetPredResidualBlock( pcPic, uiBaseViewId, uiXPos, uiYPos, uiBlkWidth, uiBlkHeight, pcYuv, iDisp 287 320 #if QC_SIMPLIFIEDIVRP_M24938 … … 289 322 #endif 290 323 ); 324 #endif 291 325 #else 292 326 xSetPredResidualBlock( pcPic, uiBaseViewId, uiXPos, uiYPos, uiBlkWidth, uiBlkHeight, pcYuv … … 518 552 519 553 #if QC_MULTI_DIS_CAN_A0097 554 #if MTK_RELEASE_DV_CONSTRAINT 555 Void 556 TComResidualGenerator::xSetPredResidualBlock( TComPic* pcPic, UInt uiBaseViewId, UInt uiXPos, UInt uiYPos, UInt uiBlkWidth, UInt uiBlkHeight, TComYuv* pcYuv, TComMv iDisp 557 #if QC_SIMPLIFIEDIVRP_M24938 558 , UInt * puiXPosInRefView , UInt * puiYPosInRefView , Bool bRecon 559 #endif 560 ) 561 #else 520 562 Void 521 563 TComResidualGenerator::xSetPredResidualBlock( TComPic* pcPic, UInt uiBaseViewId, UInt uiXPos, UInt uiYPos, UInt uiBlkWidth, UInt uiBlkHeight, TComYuv* pcYuv, Int iDisp … … 524 566 #endif 525 567 ) 568 #endif 526 569 #else 527 570 Void … … 549 592 //===== get disparity ===== 550 593 #if QC_MULTI_DIS_CAN_A0097 594 #if MTK_RELEASE_DV_CONSTRAINT 595 Int iDisparity_y = iDisp.getVer(); 596 Int iDisparity = iDisp.getHor(); 597 #else 551 598 Int iDisparity = iDisp; 599 #endif 552 600 #else 553 601 Int iMidPosX = Int( uiXPos + ( ( uiBlkWidth - 1 ) >> 1 ) ) >> m_pcDepthMapGenerator->getSubSampExpX(); … … 562 610 Int iYRefPosX0 = Int( uiXPos ) + ( iDisparity >> 2 ); 563 611 Int iYRefPosX1 = iYRefPosX0 + 1; 612 #if MTK_RELEASE_DV_CONSTRAINT 613 Int iYMaxPosY = Int( uiPicHeight ) - 1; 614 Int iYWeight3 = ( iDisparity_y & 3 ); 615 Int iYWeight2 = 4 - iYWeight3; 616 Int iYRefPosY0 = Max( 0, Min( iYMaxPosY, Int( uiYPos ) + ( iDisparity_y >> 2 )) ); 617 Int iYRefPosY1 = Max( 0, Min( iYMaxPosY, iYRefPosY0 + 1 )); 618 #endif 564 619 Int iYMaxPosX = Int( uiPicWidth ) - 1; 565 620 Int iSrcStrideY = pcBaseRes->getStride (); 566 621 Int iDesStrideY = pcYuv ->getStride (); 622 #if MTK_RELEASE_DV_CONSTRAINT 623 Pel* pSrcSamplesY0= pcBaseRes->getLumaAddr ( 0 ) + iYRefPosY0 * iSrcStrideY; 624 Pel* pSrcSamplesY1= pcBaseRes->getLumaAddr ( 0 ) + iYRefPosY1 * iSrcStrideY; 625 #else 567 626 Pel* pSrcSamplesY= pcBaseRes->getLumaAddr ( 0 ) + uiYPos * iSrcStrideY; 627 #endif 568 628 Pel* pDesSamplesY= pcYuv ->getLumaAddr (); 569 629 … … 576 636 return; 577 637 #endif 578 638 #if MTK_RELEASE_DV_CONSTRAINT 639 for( Int iY = 0; iY < iYHeight; iY++, pSrcSamplesY0 += iSrcStrideY, pSrcSamplesY1 += iSrcStrideY, pDesSamplesY += iDesStrideY ) 640 #else 579 641 for( Int iY = 0; iY < iYHeight; iY++, pSrcSamplesY += iSrcStrideY, pDesSamplesY += iDesStrideY ) 642 #endif 580 643 { 581 644 for( Int iX = 0; iX < iYWidth; iX++ ) … … 583 646 Int iXPic0 = Max( 0, Min( iYMaxPosX, iYRefPosX0 + iX ) ); 584 647 Int iXPic1 = Max( 0, Min( iYMaxPosX, iYRefPosX1 + iX ) ); 648 #if MTK_RELEASE_DV_CONSTRAINT 649 Pel Temp1,Temp2; 650 Temp1 =( iYWeight0 * pSrcSamplesY0[iXPic0] + iYWeight1 * pSrcSamplesY0[iXPic1] + 2 ) >> 2; 651 Temp2 =( iYWeight0 * pSrcSamplesY1[iXPic0] + iYWeight1 * pSrcSamplesY1[iXPic1] + 2 ) >> 2; 652 pDesSamplesY[iX] = ( iYWeight2 * Temp1 + iYWeight3 * Temp2 + 2 ) >> 2; 653 #else 585 654 pDesSamplesY[iX] = ( iYWeight0 * pSrcSamplesY[iXPic0] + iYWeight1 * pSrcSamplesY[iXPic1] + 2 ) >> 2; 655 #endif 586 656 } 587 657 } … … 594 664 Int iCRefPosX0 = Int( uiXPos >> 1 ) + ( iDisparity >> 3 ); 595 665 Int iCRefPosX1 = iCRefPosX0 + 1; 666 #if MTK_RELEASE_DV_CONSTRAINT 667 Int iCMaxPosY = Int( uiPicHeight >> 1 ) - 1; 668 Int iCWeight3 = ( iDisparity_y & 7 ); 669 Int iCWeight2 = 8 - iCWeight3; 670 Int iCRefPosY0 = Max( 0, Min( iCMaxPosY, Int( uiYPos ) + ( iDisparity_y >> 3 )) ); 671 Int iCRefPosY1 = Max( 0, Min( iCMaxPosY, iCRefPosY0 + 1 )); 672 #endif 596 673 Int iCMaxPosX = Int( uiPicWidth >> 1 ) - 1; 597 674 Int iSrcStrideC = pcBaseRes->getCStride(); 598 675 Int iDesStrideC = pcYuv ->getCStride(); 676 #if MTK_RELEASE_DV_CONSTRAINT 677 Pel* pSrcSamplesU0= pcBaseRes->getCbAddr ( 0 ) + ( iYRefPosY0 >> 1 ) * iSrcStrideC; 678 Pel* pSrcSamplesU1= pcBaseRes->getCbAddr ( 0 ) + ( iYRefPosY1 >> 1 ) * iSrcStrideC; 679 Pel* pSrcSamplesV0= pcBaseRes->getCrAddr ( 0 ) + ( iYRefPosY0 >> 1 ) * iSrcStrideC; 680 Pel* pSrcSamplesV1= pcBaseRes->getCrAddr ( 0 ) + ( iYRefPosY1 >> 1 ) * iSrcStrideC; 681 #else 599 682 Pel* pSrcSamplesU= pcBaseRes->getCbAddr ( 0 ) + ( uiYPos >> 1 ) * iSrcStrideC; 600 683 Pel* pSrcSamplesV= pcBaseRes->getCrAddr ( 0 ) + ( uiYPos >> 1 ) * iSrcStrideC; 684 #endif 601 685 Pel* pDesSamplesU= pcYuv ->getCbAddr (); 602 686 Pel* pDesSamplesV= pcYuv ->getCrAddr (); 687 #if MTK_RELEASE_DV_CONSTRAINT 688 for( Int iY = 0; iY < iCHeight; iY++, pSrcSamplesU0 += iSrcStrideC, pSrcSamplesU1 += iSrcStrideC, pDesSamplesU += iDesStrideC, 689 pSrcSamplesV0 += iSrcStrideC, pSrcSamplesV1 += iSrcStrideC, pDesSamplesV += iDesStrideC ) 690 #else 603 691 for( Int iY = 0; iY < iCHeight; iY++, pSrcSamplesU += iSrcStrideC, pDesSamplesU += iDesStrideC, 604 692 pSrcSamplesV += iSrcStrideC, pDesSamplesV += iDesStrideC ) 693 #endif 605 694 { 606 695 for( Int iX = 0; iX < iCWidth; iX++ ) … … 608 697 Int iXPic0 = Max( 0, Min( iCMaxPosX, iCRefPosX0 + iX ) ); 609 698 Int iXPic1 = Max( 0, Min( iCMaxPosX, iCRefPosX1 + iX ) ); 699 #if MTK_RELEASE_DV_CONSTRAINT 700 Pel Temp1,Temp2; 701 Temp1 =( iCWeight0 * pSrcSamplesU0[iXPic0] + iCWeight1 * pSrcSamplesU0[iXPic1] + 4 ) >> 3; 702 Temp2 =( iCWeight0 * pSrcSamplesU1[iXPic0] + iCWeight1 * pSrcSamplesU1[iXPic1] + 4 ) >> 3; 703 pDesSamplesU[iX] = ( iYWeight2 * Temp1 + iYWeight3 * Temp2 + 2 ) >> 2; 704 Temp1 =( iCWeight0 * pSrcSamplesV0[iXPic0] + iCWeight1 * pSrcSamplesV0[iXPic1] + 4 ) >> 3; 705 Temp2 =( iCWeight0 * pSrcSamplesV1[iXPic0] + iCWeight1 * pSrcSamplesV1[iXPic1] + 4 ) >> 3; 706 pDesSamplesV[iX] = ( iYWeight2 * Temp1 + iYWeight3 * Temp2 + 2 ) >> 2; 707 #else 610 708 pDesSamplesU[iX] = ( iCWeight0 * pSrcSamplesU[iXPic0] + iCWeight1 * pSrcSamplesU[iXPic1] + 4 ) >> 3; 611 709 pDesSamplesV[iX] = ( iCWeight0 * pSrcSamplesV[iXPic0] + iCWeight1 * pSrcSamplesV[iXPic1] + 4 ) >> 3; 710 #endif 612 711 } 613 712 } -
branches/HTM-5.1-dev3-Mediatek/source/Lib/TLibCommon/TComResidualGenerator.h
r189 r247 70 70 71 71 #if QC_MULTI_DIS_CAN_A0097 72 #if MTK_RELEASE_DV_CONSTRAINT 73 Bool getResidualSamples ( TComDataCU* pcCU, UInt uiPUIdx, TComYuv* pcYuv, TComMv iDisp_x 74 #if QC_SIMPLIFIEDIVRP_M24938 75 , Bool bRecon 76 #endif 77 ); 78 Bool getResidualSamples ( TComPic* pcPic, UInt uiXPos, UInt uiYPos, UInt uiBlkWidth, UInt uiBlkHeight, TComYuv* pcYuv , TComMv iDisp_x 79 #if QC_SIMPLIFIEDIVRP_M24938 80 , Bool bRecon 81 #endif 82 ); 83 #else 72 84 Bool getResidualSamples ( TComDataCU* pcCU, UInt uiPUIdx, TComYuv* pcYuv, Int iDisp 73 85 #if QC_SIMPLIFIEDIVRP_M24938 … … 80 92 #endif 81 93 ); 94 #endif 82 95 #else 83 96 Bool getResidualSamples ( TComDataCU* pcCU, UInt uiPUIdx, TComYuv* pcYuv … … 101 114 Void xClearResidual ( TComYuv* pcCUResidual, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight ); 102 115 #if QC_MULTI_DIS_CAN_A0097 116 #if MTK_RELEASE_DV_CONSTRAINT 117 Void xSetPredResidualBlock ( TComPic* pcPic, UInt uiBaseViewId, UInt uiXPos, UInt uiYPos, UInt uiBlkWidth, UInt uiBlkHeight, TComYuv* pcYuv, TComMv iDisp 118 #if QC_SIMPLIFIEDIVRP_M24938 119 , UInt * puiXPosInRefView , UInt * puiYPosInRefView , Bool bRecon 120 #endif 121 ); 122 #else 103 123 Void xSetPredResidualBlock ( TComPic* pcPic, UInt uiBaseViewId, UInt uiXPos, UInt uiYPos, UInt uiBlkWidth, UInt uiBlkHeight, TComYuv* pcYuv, Int iDisp 104 124 #if QC_SIMPLIFIEDIVRP_M24938 … … 106 126 #endif 107 127 ); 128 #endif 108 129 #else 109 130 Void xSetPredResidualBlock ( TComPic* pcPic, UInt uiBaseViewId, UInt uiXPos, UInt uiYPos, UInt uiBlkWidth, UInt uiBlkHeight, TComYuv* pcYuv -
branches/HTM-5.1-dev3-Mediatek/source/Lib/TLibCommon/TypeDef.h
r246 r247 145 145 #define MTK_SAIT_TEMPORAL_FIRST_ORDER 1 // JCT3V-C00141/C0097 146 146 #define MTK_SIMPLIFY_DVTC 1 // JCT3V-C00135 147 #define MTK_RELEASE_DV_CONSTRAINT 1 // JCT3V-C00129 147 148 ///// ***** MOTION PARAMETER INHERITANCE ********* 148 149 #define HHI_MPI 1 // motion parameter inheritance from texture picture for depth map coding
Note: See TracChangeset for help on using the changeset viewer.