Changeset 25 in SHVCSoftware for branches/SHM-1.0-dev/source/Lib/TLibCommon
- Timestamp:
- 4 Feb 2013, 08:30:23 (12 years ago)
- Location:
- branches/SHM-1.0-dev/source/Lib/TLibCommon
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/SHM-1.0-dev/source/Lib/TLibCommon/TComDataCU.h
r23 r25 597 597 }; 598 598 599 #if REF_IDX_MFM 600 class TComUpsampledMvFieldCU 601 { 602 TComCUMvField m_acCUMvField[2]; //array of motion vector field 603 UInt m_uiCUAddr; 604 UInt m_uiCUPelX; 605 UInt m_uiCUPelY; 606 607 public: 608 Void createMvField(Int CUAddr, Int uiWidthInCU, UInt uiNumPartitions) 609 { 610 m_uiCUAddr = CUAddr; 611 m_uiCUPelX = (CUAddr % uiWidthInCU) * g_uiMaxCUWidth; 612 m_uiCUPelY = (CUAddr / uiWidthInCU) * g_uiMaxCUWidth; 613 614 m_acCUMvField[0].create( uiNumPartitions ); 615 m_acCUMvField[1].create( uiNumPartitions ); 616 return; 617 } 618 619 Void initMvField() 620 { 621 m_acCUMvField[0].clearMvField(); 622 m_acCUMvField[1].clearMvField(); 623 return; 624 } 625 Void destroy() 626 { 627 m_acCUMvField[0].destroy(); 628 m_acCUMvField[1].destroy(); 629 return; 630 } 631 TComCUMvField* getCUMvField ( RefPicList e ) { return &m_acCUMvField[e]; } 632 UInt getAddr () { return m_uiCUAddr;} 633 UInt getCUPelX () { return m_uiCUPelX; } 634 UInt getCUPelY () { return m_uiCUPelY; } 635 }; 636 #endif 637 599 638 namespace RasterAddress 600 639 { -
branches/SHM-1.0-dev/source/Lib/TLibCommon/TComMotionInfo.h
r2 r25 158 158 Void compress(Char* pePredMode, Int scale); 159 159 #endif 160 161 #if REF_IDX_MFM 162 UInt getNumPartition() { return m_uiNumPartition; } 163 Void setMvField( TComMvField const & mvField, Int iIdx) 164 { 165 m_pcMv[iIdx] = mvField.getMv(); 166 m_piRefIdx[iIdx] = mvField.getRefIdx(); 167 return; 168 } 169 170 Void setMvField( TComMv cMv, Int iRefIdx, Int iIdx) 171 { 172 m_pcMv[iIdx] = cMv; 173 m_piRefIdx[iIdx] = iRefIdx; 174 return; 175 } 176 #endif 160 177 }; 161 178 -
branches/SHM-1.0-dev/source/Lib/TLibCommon/TComPic.cpp
r21 r25 68 68 , m_bSpatialEnhLayer( false ) 69 69 , m_pcFullPelBaseRec( NULL ) 70 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE 70 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE || REF_IDX_MFM 71 71 , m_bIsILR (false) 72 #endif 73 #if REF_IDX_MFM 74 , m_bIsUpsampledMvField (false) 75 , m_apcTComUpsampledMvFieldCU (NULL) 76 , m_peUpsampledPredMode (NULL) 77 , m_iNumCUInUpsampledPic (-1) 72 78 #endif 73 79 #endif … … 554 560 upsampledRowWidthCroma); 555 561 } 562 563 #if REF_IDX_MFM 564 Void TComPic::createUpSampledMvField(Int upSampledHeight, Int upSampledWidth, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth ) 565 { 566 UInt uiNumPartitions = 1<<(uiMaxDepth<<1); 567 UInt uiWidthInCU = ( upSampledWidth % uiMaxWidth ) ? upSampledWidth /uiMaxWidth + 1 : upSampledWidth /uiMaxWidth; 568 UInt uiHeightInCU = ( upSampledHeight% uiMaxHeight ) ? upSampledHeight/uiMaxHeight + 1 : upSampledHeight/uiMaxHeight; 569 UInt uiNumCUsInFrame = uiWidthInCU * uiHeightInCU; 570 m_iNumCUInUpsampledPic = uiNumCUsInFrame; 571 572 m_apcTComUpsampledMvFieldCU = new TComUpsampledMvFieldCU*[uiNumCUsInFrame]; 573 m_peUpsampledPredMode = new char*[uiNumCUsInFrame]; 574 575 for (Int i = 0; i < uiNumCUsInFrame; i++ ) 576 { 577 m_apcTComUpsampledMvFieldCU[i] = new TComUpsampledMvFieldCU; 578 m_apcTComUpsampledMvFieldCU[i]->createMvField(i, uiWidthInCU, uiNumPartitions); //create Mv field 579 m_apcTComUpsampledMvFieldCU[i]->initMvField(); //initialize Mv field 580 581 m_peUpsampledPredMode[i] = new char[uiNumPartitions]; 582 } 583 584 return; 585 } 586 587 Void TComPic::deriveUnitIdxBase(UInt uiUpsamplePelX, UInt uiUpsamplePelY, float ratio, UInt& uiBaseCUAddr, UInt& uiBaseAbsPartIdx) 588 { 589 //pixel in the base layer 590 UInt uiPelX = (UInt)((float)uiUpsamplePelX/ratio); 591 UInt uiPelY = (UInt)((float)uiUpsamplePelY/ratio); 592 UInt uiBaseWidth = getPicYuvRec()->getWidth(); 593 UInt uiBaseHeight = getPicYuvRec()->getHeight(); 594 595 UInt uiWidthInCU = ( uiBaseWidth % g_uiMaxCUWidth ) ? uiBaseWidth /g_uiMaxCUWidth + 1 : uiBaseWidth /g_uiMaxCUWidth; 596 UInt uiHeightInCU = ( uiBaseHeight% g_uiMaxCUHeight ) ? uiBaseHeight/ g_uiMaxCUHeight + 1 : uiBaseHeight/ g_uiMaxCUHeight; 597 598 uiPelX = (UInt)Clip3<UInt>(0, uiWidthInCU * g_uiMaxCUWidth - 1, uiPelX); 599 uiPelY = (UInt)Clip3<UInt>(0, uiHeightInCU * g_uiMaxCUHeight - 1, uiPelY); 600 601 uiBaseCUAddr = uiPelY / g_uiMaxCUHeight * uiWidthInCU + uiPelX / g_uiMaxCUWidth; 602 603 UInt uiWidthMinPU = g_uiMaxCUWidth / (1<<g_uiMaxCUDepth); 604 UInt uiHeightMinPU = g_uiMaxCUHeight/(1<<g_uiMaxCUDepth); 605 606 UInt uiAbsPelX = uiPelX - (uiPelX / g_uiMaxCUWidth) * g_uiMaxCUWidth; 607 UInt uiAbsPelY = uiPelY - (uiPelY / g_uiMaxCUHeight) * g_uiMaxCUHeight; 608 609 UInt RasterIdx = uiAbsPelY / uiHeightMinPU * (g_uiMaxCUWidth/uiWidthMinPU) + uiAbsPelX / uiWidthMinPU; 610 uiBaseAbsPartIdx = g_auiRasterToZscan[RasterIdx]; 611 612 return; 613 } 614 615 616 //MV field up-sampling 617 Void TComPic::doTheUpSampleMvField(UInt upSampleRatio) 618 { 619 UInt uiWidthMinPU = g_uiMaxCUWidth/(1<<g_uiMaxCUDepth); 620 UInt uiHeightMinPU = g_uiMaxCUHeight/(1<<g_uiMaxCUDepth); 621 UInt uiNumPartitions = 1<<(g_uiMaxCUDepth<<1); 622 UInt uiPelX, uiPelY; 623 UInt uiBaseCUAddr, uiBaseAbsPartIdx; 624 float ratio = 0; 625 626 //???????????????????????????? 627 if(upSampleRatio == 0) //ONE_TO_ONE 628 ratio = 1.0; 629 else if(upSampleRatio == 1) //ONE_TO_TWO 630 ratio = 2.0; 631 else if(upSampleRatio == 2) //TWO_TO_THREE 632 ratio = 1.5; 633 634 for(UInt uiCUAddr = 0; uiCUAddr < m_iNumCUInUpsampledPic; uiCUAddr++) //each LCU 635 { 636 TComUpsampledMvFieldCU*& pcMvFieldCU = getUpsampledMvFieldCU(uiCUAddr); 637 pcMvFieldCU->initMvField(); //MV field initialization 638 639 Int unitNum = max (1, (Int)((16/uiWidthMinPU)*(16/uiHeightMinPU)) ); 640 for(UInt uiAbsPartIdx = 0; uiAbsPartIdx < uiNumPartitions; uiAbsPartIdx+=unitNum ) //each 16x16 unit 641 { 642 //pixel position of each unit in up-sampled layer 643 uiPelX = pcMvFieldCU->getCUPelX() + g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsPartIdx] ]; 644 uiPelY = pcMvFieldCU->getCUPelY() + g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsPartIdx] ]; 645 646 //???????????????????????????? 647 deriveUnitIdxBase(uiPelX + 8, uiPelY + 8, ratio, uiBaseCUAddr, uiBaseAbsPartIdx); 648 if( (getCU(uiBaseCUAddr)->getPredictionMode(uiBaseAbsPartIdx) != MODE_NONE) && (getCU(uiBaseCUAddr)->getPredictionMode(uiBaseAbsPartIdx) != MODE_INTRA) ) //base layer unit not skip and invalid mode 649 { 650 for(UInt list = 0; list < 2; list++) //each list 651 { 652 TComMv cMv = getCU(uiBaseCUAddr)->getCUMvField((RefPicList)list)->getMv(uiBaseAbsPartIdx); 653 Int refIdx = getCU(uiBaseCUAddr)->getCUMvField((RefPicList)list)->getRefIdx(uiBaseAbsPartIdx); 654 //???????????????????????????? 655 Int Hor = (Short) (ratio * cMv.getHor()); 656 Int Ver = (Short) (ratio * cMv.getVer()); 657 658 TComMv cScaledMv(Hor, Ver); 659 TComMvField sMvField; 660 sMvField.setMvField(cScaledMv, refIdx); 661 662 pcMvFieldCU->getCUMvField((RefPicList)list)->setMvField(sMvField, uiAbsPartIdx); 663 m_peUpsampledPredMode[uiCUAddr][uiAbsPartIdx] = MODE_INTER; 664 } 665 } 666 else 667 { 668 TComMvField zeroMvField; //zero MV and invalid reference index 669 pcMvFieldCU->getCUMvField(REF_PIC_LIST_0)->setMvField(zeroMvField, uiAbsPartIdx); 670 pcMvFieldCU->getCUMvField(REF_PIC_LIST_1)->setMvField(zeroMvField, uiAbsPartIdx); 671 672 m_peUpsampledPredMode[uiCUAddr][uiAbsPartIdx] = MODE_INTRA; 673 } 674 675 //MV compression 676 for(UInt i = 1; i < unitNum; i++ ) 677 { 678 pcMvFieldCU->getCUMvField(REF_PIC_LIST_0)->setMvField(pcMvFieldCU->getCUMvField(REF_PIC_LIST_0)->getMv(uiAbsPartIdx), pcMvFieldCU->getCUMvField(REF_PIC_LIST_0)->getRefIdx(uiAbsPartIdx), uiAbsPartIdx + i); 679 pcMvFieldCU->getCUMvField(REF_PIC_LIST_1)->setMvField(pcMvFieldCU->getCUMvField(REF_PIC_LIST_1)->getMv(uiAbsPartIdx), pcMvFieldCU->getCUMvField(REF_PIC_LIST_1)->getRefIdx(uiAbsPartIdx), uiAbsPartIdx + i); 680 m_peUpsampledPredMode[uiCUAddr][uiAbsPartIdx+i] = m_peUpsampledPredMode[uiCUAddr][uiAbsPartIdx]; 681 } 682 683 } //ending for(UInt uiAbsPartIdx = 0; uiAbsPartIdx < uiNumPartitions; uiAbsPartIdx++) 684 } //ending for(UInt uiCUAddr = 0; uiCUAddr < m_iNumCUInUpsampledPic; uiCUAddr++) 685 return; 686 } 687 688 Void TComPic::copyUpsampledMvField(TComPic* pcPicBase) 689 { 690 assert( getPicSym()->getNumberOfCUsInFrame() == pcPicBase->getNumCUInUpsampledPic() ); 691 692 for(UInt cuIdx = 0; cuIdx < getPicSym()->getNumberOfCUsInFrame(); cuIdx++) //each LCU 693 { 694 UInt uiNumPartitions = 1<<(g_uiMaxCUDepth<<1); 695 696 TComDataCU* pcCUDes = getCU(cuIdx); 697 TComUpsampledMvFieldCU* pcMvFieldCU = pcPicBase->getUpsampledMvFieldCU(cuIdx); 698 for(UInt list = 0; list < 2; list++) //each reference list 699 { 700 TComCUMvField* pcCUMvFieldDes = pcCUDes->getCUMvField((RefPicList)list); 701 TComCUMvField* pcCUMvFieldOrg = pcMvFieldCU->getCUMvField((RefPicList)list); 702 703 assert(pcCUMvFieldDes->getNumPartition() == pcCUMvFieldOrg->getNumPartition()); 704 assert(pcCUMvFieldDes->getNumPartition() == uiNumPartitions); 705 706 pcCUMvFieldDes->clearMvField(); 707 pcCUMvFieldDes->copyFrom(pcCUMvFieldOrg, pcCUMvFieldDes->getNumPartition(), 0); 708 } 709 710 char* pPredModeSrc = pcPicBase->getUpsampledPreModeCU(cuIdx); 711 char* pPredModeDst = pcCUDes->getPredictionMode(); 712 memcpy(pPredModeDst, pPredModeSrc, sizeof(char)*uiNumPartitions); 713 memset( pcCUDes->getPartitionSize(), SIZE_2Nx2N, sizeof(char)*uiNumPartitions); 714 } 715 } 556 716 #endif 557 717 718 #endif 719 558 720 //! \} -
branches/SHM-1.0-dev/source/Lib/TLibCommon/TComPic.h
r21 r25 88 88 Bool m_bSpatialEnhLayer; // whether current layer is a spatial enhancement layer, 89 89 TComPicYuv* m_pcFullPelBaseRec; // upsampled base layer recontruction for difference domain inter prediction 90 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE 90 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE || REF_IDX_MFM 91 91 Bool m_bIsILR; // Is ILR picture 92 #endif 93 #if REF_IDX_MFM 94 Bool m_bIsUpsampledMvField; 95 TComUpsampledMvFieldCU** m_apcTComUpsampledMvFieldCU; 96 Char** m_peUpsampledPredMode; 97 Int m_iNumCUInUpsampledPic; 92 98 #endif 93 99 #endif … … 118 124 TComPicYuv* getFullPelBaseRec () { return m_pcFullPelBaseRec; } 119 125 #endif 120 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE 126 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE || REF_IDX_MFM 121 127 Void setIsILR( Bool bIsILR) {m_bIsILR = bIsILR;} 122 128 Bool getIsILR() {return m_bIsILR;} 129 #endif 130 #if REF_IDX_MFM 131 Bool IsUpsampledMvField() { return m_bIsUpsampledMvField; } 132 Void setUpsampledMvField(Bool isUpsampledMvField) { m_bIsUpsampledMvField = isUpsampledMvField; } 133 Bool upsampledMvFieldIsNull() 134 { 135 if (m_apcTComUpsampledMvFieldCU == NULL) 136 return true; 137 else 138 return false; 139 } 140 Void createUpSampledMvField( Int upSampledHeight, Int upSampledWidth, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth ); 141 Void doTheUpSampleMvField ( UInt upSampleRatio ); 142 Void copyUpsampledMvField ( TComPic* pcPicBase ); 143 Void deriveUnitIdxBase(UInt uiUpsamplePelX, UInt uiUpsamplePelY, float ratio, UInt& uiBaseCUAddr, UInt& uiBaseAbsPartIdx); 144 145 Int getNumCUInUpsampledPic() { return m_iNumCUInUpsampledPic; } 146 TComUpsampledMvFieldCU*& getUpsampledMvFieldCU( UInt uiCUAddr ) { return m_apcTComUpsampledMvFieldCU[uiCUAddr]; } 147 char* getUpsampledPreModeCU( UInt uiCUAddr ) { return m_peUpsampledPredMode[uiCUAddr]; } 148 149 123 150 #endif 124 151 -
branches/SHM-1.0-dev/source/Lib/TLibCommon/TComSlice.cpp
r11 r25 519 519 if(getSPS()->getLayerId() && m_eSliceType != I_SLICE) 520 520 { 521 #if REF_IDX_MFM 522 assert(iRefPicNum == 1); 523 if(getPOC() != 0) 524 { 525 assert(getBaseColPic()->IsUpsampledMvField() == true); 526 pIlpPicList[0]->copyUpsampledMvField(getBaseColPic()); 527 } 528 #endif 521 529 //add to list 0; 522 530 Int iOffset; … … 546 554 } 547 555 } 556 557 #if REF_IDX_MFM 558 Void TComSlice::setRefPOCListILP(TComPic** ilpPic, TComPic *pcRefPicBL) 559 { 560 //set reference picture POC of each ILP reference 561 Int thePoc = ilpPic[0]->getPOC(); 562 assert(thePoc >= 0); 563 assert(thePoc == pcRefPicBL->getPOC()); 564 565 //initialize reference POC of ILP 566 for(Int refIdx = 0; refIdx < MAX_NUM_REF; refIdx++) 567 { 568 ilpPic[0]->getSlice(0)->setRefPOC(0, REF_PIC_LIST_0, refIdx); 569 ilpPic[0]->getSlice(0)->setRefPOC(0, REF_PIC_LIST_1, refIdx); 570 571 ilpPic[0]->getSlice(0)->setRefPic(NULL, REF_PIC_LIST_0, refIdx); 572 ilpPic[0]->getSlice(0)->setRefPic(NULL, REF_PIC_LIST_1, refIdx); 573 } 574 575 //set reference POC of ILP 576 ilpPic[0]->getSlice(0)->setNumRefIdx(REF_PIC_LIST_0, pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_0)); 577 assert(ilpPic[0]->getSlice(0)->getNumRefIdx(REF_PIC_LIST_0) <= MAX_NUM_REF); 578 ilpPic[0]->getSlice(0)->setNumRefIdx(REF_PIC_LIST_1, pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_1)); 579 assert(ilpPic[0]->getSlice(0)->getNumRefIdx(REF_PIC_LIST_1) <= MAX_NUM_REF); 580 581 for(Int refIdx = 0; refIdx < pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_0); refIdx++) 582 ilpPic[0]->getSlice(0)->setRefPOC(pcRefPicBL->getSlice(0)->getRefPOC(REF_PIC_LIST_0, refIdx), REF_PIC_LIST_0, refIdx); 583 584 for(Int refIdx = 0; refIdx < pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_1); refIdx++) 585 ilpPic[0]->getSlice(0)->setRefPOC(pcRefPicBL->getSlice(0)->getRefPOC(REF_PIC_LIST_1, refIdx), REF_PIC_LIST_1, refIdx); 586 587 for(Int refIdx = 0; refIdx < pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_0); refIdx++) 588 ilpPic[0]->getSlice(0)->setRefPic(pcRefPicBL->getSlice(0)->getRefPic(REF_PIC_LIST_0, refIdx), REF_PIC_LIST_0, refIdx); 589 590 for(Int refIdx = 0; refIdx < pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_1); refIdx++) 591 ilpPic[0]->getSlice(0)->setRefPic(pcRefPicBL->getSlice(0)->getRefPic(REF_PIC_LIST_1, refIdx), REF_PIC_LIST_1, refIdx); 592 return; 593 } 594 #endif 595 548 596 #endif 549 597 -
branches/SHM-1.0-dev/source/Lib/TLibCommon/TComSlice.h
r11 r25 649 649 UInt m_layerId; 650 650 #endif 651 #if REF_IDX_MFM 652 Bool m_bMFMEnabledFlag; 653 #endif 651 654 public: 652 655 TComSPS(); … … 837 840 UInt getLayerId() { return m_layerId; } 838 841 #endif 842 #if REF_IDX_MFM 843 Void setMFMEnabledFlag(Bool flag) {m_bMFMEnabledFlag = flag;} 844 Bool getMFMEnabledFlag() {return m_bMFMEnabledFlag;} 845 #endif 839 846 }; 840 847 … … 1448 1455 TComPicYuv* getFullPelBaseRec () { return m_pcFullPelBaseRec; } 1449 1456 #endif 1457 1458 #if REF_IDX_MFM 1459 Void setRefPOCListILP(TComPic** ilpPic, TComPic *pcRefPicBL); 1460 #endif 1461 1450 1462 Void setRefPicList ( TComList<TComPic*>& rcListPic ); 1451 1463 Void setRefPOCList (); -
branches/SHM-1.0-dev/source/Lib/TLibCommon/TypeDef.h
r21 r25 60 60 #define REF_IDX_ME_ZEROMV 1 ///< L0051: use zero motion for inter-layer reference picture (without fractional ME) 61 61 #define ENCODER_FAST_MODE 1 ///< L0174: enable encoder fast mode. TestMethod 1 is enabled by setting to 1 and TestMethod 2 is enable by setting to 2. By default it is set to 1. 62 #define REF_IDX_MFM 1 ///< L0336: motion vector mapping of inter-layer reference picture 62 63 #else 63 64 #define INTRA_BL 1 ///< inter-layer texture prediction
Note: See TracChangeset for help on using the changeset viewer.