Changeset 459 in 3DVCSoftware for branches/HTM-DEV-0.3-dev1/source/Lib/TLibCommon/TComRom.cpp
- Timestamp:
- 6 Jun 2013, 11:46:05 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HTM-DEV-0.3-dev1/source/Lib/TLibCommon/TComRom.cpp
r446 r459 82 82 delete[] g_auiSigLastScan[2][i]; 83 83 } 84 85 #if H_3D_DIM_DMM 86 if( !g_dmmWedgeLists.empty() ) 87 { 88 for( UInt ui = 0; ui < g_dmmWedgeLists.size(); ui++ ) { g_dmmWedgeLists[ui].clear(); } 89 g_dmmWedgeLists.clear(); 90 } 91 if( !g_dmmWedgeRefLists.empty() ) 92 { 93 for( UInt ui = 0; ui < g_dmmWedgeRefLists.size(); ui++ ) { g_dmmWedgeRefLists[ui].clear(); } 94 g_dmmWedgeRefLists.clear(); 95 } 96 97 if( !g_dmmWedgeNodeLists.empty() ) 98 { 99 for( UInt ui = 0; ui < g_dmmWedgeNodeLists.size(); ui++ ) { g_dmmWedgeNodeLists[ui].clear(); } 100 g_dmmWedgeNodeLists.clear(); 101 } 102 #endif 84 103 } 85 104 … … 312 331 313 332 // ==================================================================================================================== 333 // Depth coding modes 334 // ==================================================================================================================== 335 #if H_3D_DIM_DMM 336 const WedgeResolution g_dmmWedgeResolution[6] = 337 { 338 HALF_PEL, // 4x4 339 HALF_PEL, // 8x8 340 FULL_PEL, // 16x16 341 DOUBLE_PEL, // 32x32 342 DOUBLE_PEL, // 64x64 343 DOUBLE_PEL // 128x128 344 }; 345 346 const UChar g_dmm1TabIdxBits[6] = 347 { //2x2 4x4 8x8 16x16 32x32 64x64 348 0, 7, 10, 11, 11, 13 }; 349 const UChar g_dmm3IntraTabIdxBits[6] = 350 { //2x2 4x4 8x8 16x16 32x32 64x64 351 0, 6, 9, 9, 9, 0 }; 352 353 extern std::vector< std::vector<TComWedgelet> > g_dmmWedgeLists; 354 extern std::vector< std::vector<TComWedgeRef> > g_dmmWedgeRefLists; 355 extern std::vector< std::vector<TComWedgeNode> > g_dmmWedgeNodeLists; 356 #endif 357 358 // ==================================================================================================================== 314 359 // Misc. 315 360 // ==================================================================================================================== … … 518 563 Int g_eTTable[4] = {0,3,1,2}; 519 564 565 #if H_3D_DIM_DMM 566 std::vector< std::vector<TComWedgelet> > g_dmmWedgeLists; 567 std::vector< std::vector<TComWedgeRef> > g_dmmWedgeRefLists; 568 std::vector< std::vector<TComWedgeNode> > g_dmmWedgeNodeLists; 569 std::vector< std::vector< std::vector<UInt> > > g_aauiWdgLstM3; 570 571 Void initWedgeLists( Bool initRefinements ) 572 { 573 if( !g_dmmWedgeLists.empty() ) return; 574 575 for( UInt ui = g_aucConvertToBit[DIM_MIN_SIZE]; ui < (g_aucConvertToBit[DIM_MAX_SIZE]+1); ui++ ) 576 { 577 UInt uiWedgeBlockSize = ((UInt)DIM_MIN_SIZE)<<ui; 578 std::vector<TComWedgelet> acWedgeList; 579 std::vector<TComWedgeRef> acWedgeRefList; 580 createWedgeList( uiWedgeBlockSize, uiWedgeBlockSize, acWedgeList, acWedgeRefList, g_dmmWedgeResolution[ui] ); 581 g_dmmWedgeLists.push_back( acWedgeList ); 582 g_dmmWedgeRefLists.push_back( acWedgeRefList ); 583 584 // create WedgeNodeList 585 std::vector<TComWedgeNode> acWedgeNodeList; 586 for( UInt uiPos = 0; uiPos < acWedgeList.size(); uiPos++ ) 587 { 588 if( acWedgeList[uiPos].getIsCoarse() ) 589 { 590 TComWedgeNode cWedgeNode; 591 cWedgeNode.setPatternIdx( uiPos ); 592 593 if( initRefinements ) 594 { 595 UInt uiRefPos = 0; 596 for( Int iOffS = -1; iOffS <= 1; iOffS++ ) 597 { 598 for( Int iOffE = -1; iOffE <= 1; iOffE++ ) 599 { 600 if( iOffS == 0 && iOffE == 0 ) { continue; } 601 602 Int iSx = (Int)acWedgeList[uiPos].getStartX(); 603 Int iSy = (Int)acWedgeList[uiPos].getStartY(); 604 Int iEx = (Int)acWedgeList[uiPos].getEndX(); 605 Int iEy = (Int)acWedgeList[uiPos].getEndY(); 606 607 switch( acWedgeList[uiPos].getOri() ) 608 { 609 case( 0 ): { iSx += iOffS; iEy += iOffE; } break; 610 case( 1 ): { iSy += iOffS; iEx -= iOffE; } break; 611 case( 2 ): { iSx -= iOffS; iEy -= iOffE; } break; 612 case( 3 ): { iSy -= iOffS; iEx += iOffE; } break; 613 case( 4 ): { iSx += iOffS; iEx += iOffE; } break; 614 case( 5 ): { iSy += iOffS; iEy += iOffE; } break; 615 default: assert( 0 ); 616 } 617 618 for( UInt k = 0; k < acWedgeRefList.size(); k++ ) 619 { 620 if( iSx == (Int)acWedgeRefList[k].getStartX() && 621 iSy == (Int)acWedgeRefList[k].getStartY() && 622 iEx == (Int)acWedgeRefList[k].getEndX() && 623 iEy == (Int)acWedgeRefList[k].getEndY() ) 624 { 625 if( acWedgeRefList[k].getRefIdx() != cWedgeNode.getPatternIdx() ) 626 { 627 Bool bNew = true; 628 for( UInt m = 0; m < uiRefPos; m++ ) { if( acWedgeRefList[k].getRefIdx() == cWedgeNode.getRefineIdx( m ) ) { bNew = false; break; } } 629 630 if( bNew ) 631 { 632 cWedgeNode.setRefineIdx( acWedgeRefList[k].getRefIdx(), uiRefPos ); 633 uiRefPos++; 634 break; 635 } 636 } 637 } 638 } 639 } 640 } 641 } 642 acWedgeNodeList.push_back( cWedgeNode ); 643 } 644 } 645 g_dmmWedgeNodeLists.push_back( acWedgeNodeList ); 646 } 647 return; 648 } 649 650 Void createWedgeList( UInt uiWidth, UInt uiHeight, std::vector<TComWedgelet> &racWedgeList, std::vector<TComWedgeRef> &racWedgeRefList, WedgeResolution eWedgeRes ) 651 { 652 assert( uiWidth == uiHeight ); 653 654 UChar uhStartX = 0, uhStartY = 0, uhEndX = 0, uhEndY = 0; 655 Int iStepStartX = 0, iStepStartY = 0, iStepEndX = 0, iStepEndY = 0; 656 657 UInt uiBlockSize = 0; 658 switch( eWedgeRes ) 659 { 660 case( DOUBLE_PEL ): { uiBlockSize = (uiWidth>>1); break; } 661 case( FULL_PEL ): { uiBlockSize = uiWidth; break; } 662 case( HALF_PEL ): { uiBlockSize = (uiWidth<<1); break; } 663 } 664 665 TComWedgelet cTempWedgelet( uiWidth, uiHeight ); 666 for( UInt uiOri = 0; uiOri < 6; uiOri++ ) 667 { 668 // init the edge line parameters for each of the 6 wedgelet types 669 switch( uiOri ) 670 { 671 case( 0 ): { uhStartX = 0; uhStartY = 0; uhEndX = 0; uhEndY = 0; iStepStartX = +1; iStepStartY = 0; iStepEndX = 0; iStepEndY = +1; break; } 672 case( 1 ): { uhStartX = (uiBlockSize-1); uhStartY = 0; uhEndX = (uiBlockSize-1); uhEndY = 0; iStepStartX = 0; iStepStartY = +1; iStepEndX = -1; iStepEndY = 0; break; } 673 case( 2 ): { uhStartX = (uiBlockSize-1); uhStartY = (uiBlockSize-1); uhEndX = (uiBlockSize-1); uhEndY = (uiBlockSize-1); iStepStartX = -1; iStepStartY = 0; iStepEndX = 0; iStepEndY = -1; break; } 674 case( 3 ): { uhStartX = 0; uhStartY = (uiBlockSize-1); uhEndX = 0; uhEndY = (uiBlockSize-1); iStepStartX = 0; iStepStartY = -1; iStepEndX = +1; iStepEndY = 0; break; } 675 case( 4 ): { uhStartX = 0; uhStartY = 0; uhEndX = 0; uhEndY = (uiBlockSize-1); iStepStartX = +1; iStepStartY = 0; iStepEndX = +1; iStepEndY = 0; break; } 676 case( 5 ): { uhStartX = (uiBlockSize-1); uhStartY = 0; uhEndX = 0; uhEndY = 0; iStepStartX = 0; iStepStartY = +1; iStepEndX = 0; iStepEndY = +1; break; } 677 } 678 679 for( Int iK = 0; iK < uiBlockSize; iK++ ) 680 { 681 for( Int iL = 0; iL < uiBlockSize; iL++ ) 682 { 683 cTempWedgelet.setWedgelet( uhStartX + (iK*iStepStartX) , uhStartY + (iK*iStepStartY), uhEndX + (iL*iStepEndX), uhEndY + (iL*iStepEndY), (UChar)uiOri, eWedgeRes, ((iL%2)==0 && (iK%2)==0) ); 684 addWedgeletToList( cTempWedgelet, racWedgeList, racWedgeRefList ); 685 } 686 } 687 } 688 689 UInt uiThrSz = DMM3_SIMPLIFY_TR; 690 std::vector< std::vector<UInt> > auiWdgListSz; 691 for( Int idxM=2; idxM<=34 ; idxM++) 692 { 693 std::vector<UInt> auiWdgList; 694 for( Int idxW=0; idxW<racWedgeList.size(); idxW++) 695 { 696 UInt uiAbsDiff = abs(idxM-(Int)racWedgeList[idxW].getAng()); 697 if( uiAbsDiff <= uiThrSz ) 698 { 699 auiWdgList.push_back(idxW); 700 } 701 } 702 auiWdgListSz.push_back(auiWdgList); 703 } 704 g_aauiWdgLstM3.push_back(auiWdgListSz); 705 } 706 707 Void addWedgeletToList( TComWedgelet cWedgelet, std::vector<TComWedgelet> &racWedgeList, std::vector<TComWedgeRef> &racWedgeRefList ) 708 { 709 Bool bValid = cWedgelet.checkNotPlain(); 710 if( bValid ) 711 { 712 for( UInt uiPos = 0; uiPos < racWedgeList.size(); uiPos++ ) 713 { 714 if( cWedgelet.checkIdentical( racWedgeList[uiPos].getPattern() ) ) 715 { 716 TComWedgeRef cWedgeRef; 717 cWedgeRef.setWedgeRef( cWedgelet.getStartX(), cWedgelet.getStartY(), cWedgelet.getEndX(), cWedgelet.getEndY(), uiPos ); 718 racWedgeRefList.push_back( cWedgeRef ); 719 bValid = false; 720 return; 721 } 722 } 723 } 724 if( bValid ) 725 { 726 for( UInt uiPos = 0; uiPos < racWedgeList.size(); uiPos++ ) 727 { 728 if( cWedgelet.checkInvIdentical( racWedgeList[uiPos].getPattern() ) ) 729 { 730 TComWedgeRef cWedgeRef; 731 cWedgeRef.setWedgeRef( cWedgelet.getStartX(), cWedgelet.getStartY(), cWedgelet.getEndX(), cWedgelet.getEndY(), uiPos ); 732 racWedgeRefList.push_back( cWedgeRef ); 733 bValid = false; 734 return; 735 } 736 } 737 } 738 if( bValid ) 739 { 740 cWedgelet.findClosestAngle(); 741 racWedgeList.push_back( cWedgelet ); 742 TComWedgeRef cWedgeRef; 743 cWedgeRef.setWedgeRef( cWedgelet.getStartX(), cWedgelet.getStartY(), cWedgelet.getEndX(), cWedgelet.getEndY(), (UInt)(racWedgeList.size()-1) ); 744 racWedgeRefList.push_back( cWedgeRef ); 745 } 746 } 747 #endif //H_3D_DIM_DMM 520 748 //! \}
Note: See TracChangeset for help on using the changeset viewer.