Changeset 455 in 3DVCSoftware for branches/HTM-DEV-0.3-dev2/source/Lib
- Timestamp:
- 4 Jun 2013, 00:01:30 (12 years ago)
- Location:
- branches/HTM-DEV-0.3-dev2/source/Lib
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HTM-DEV-0.3-dev2/source/Lib/TLibCommon/TComDataCU.cpp
r446 r455 112 112 m_sliceStartCU = 0; 113 113 m_sliceSegmentStartCU = 0; 114 #if H_3D_NBDV 115 m_pDvInfo = NULL; 116 #endif 114 117 } 115 118 … … 169 172 m_pcTrCoeffCb = (TCoeff*)xMalloc(TCoeff, uiWidth*uiHeight/4); 170 173 m_pcTrCoeffCr = (TCoeff*)xMalloc(TCoeff, uiWidth*uiHeight/4); 174 #if H_3D_NBDV 175 m_pDvInfo = (DisInfo* )xMalloc(DisInfo, uiNumPartition); 176 #endif 171 177 memset( m_pcTrCoeffY, 0,uiWidth*uiHeight * sizeof( TCoeff ) ); 172 178 memset( m_pcTrCoeffCb, 0,uiWidth*uiHeight/4 * sizeof( TCoeff ) ); … … 284 290 if ( m_apiMVPNum[0] ) { delete[] m_apiMVPNum[0]; m_apiMVPNum[0] = NULL; } 285 291 if ( m_apiMVPNum[1] ) { delete[] m_apiMVPNum[1]; m_apiMVPNum[1] = NULL; } 286 292 #if H_3D_NBDV 293 if ( m_pDvInfo ) { xFree(m_pDvInfo); m_pDvInfo = NULL; } 294 #endif 287 295 m_acCUMvField[0].destroy(); 288 296 m_acCUMvField[1].destroy(); … … 652 660 memset( m_puhCbf[2], 0, iSizeInUchar ); 653 661 memset( m_puhDepth, uiDepth, iSizeInUchar ); 654 662 #if H_3D_NBDV 663 m_pDvInfo->bDV = false; 664 #endif 655 665 UChar uhWidth = g_uiMaxCUWidth >> uiDepth; 656 666 UChar uhHeight = g_uiMaxCUHeight >> uiDepth; … … 800 810 m_CUTransquantBypass = pcCU->getCUTransquantBypass()+uiPart; 801 811 812 #if H_3D_NBDV 813 m_pDvInfo = pcCU->getDvInfo() + uiPart; 814 #endif 802 815 m_pbMergeFlag = pcCU->getMergeFlag() + uiPart; 803 816 m_puhMergeIndex = pcCU->getMergeIndex() + uiPart; … … 862 875 memcpy(m_sliceSegmentStartCU,pcCU->m_sliceSegmentStartCU+uiPart,sizeof(UInt)*m_uiNumPartition); 863 876 } 864 877 #if H_3D_NBDV 878 Void TComDataCU::copyDVInfoFrom (TComDataCU* pcCU, UInt uiAbsPartIdx) 879 { 880 m_pDvInfo = pcCU->getDvInfo() + uiAbsPartIdx; 881 } 882 #endif 865 883 // Copy inter prediction info from the biggest CU 866 Void TComDataCU::copyInterPredInfoFrom ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefPicList ) 884 Void TComDataCU::copyInterPredInfoFrom ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefPicList 885 #if H_3D_NBDV 886 , Bool bNBDV 887 #endif 888 ) 867 889 { 868 890 m_pcPic = pcCU->getPic(); … … 886 908 887 909 m_pePartSize = pcCU->getPartitionSize () + uiAbsPartIdx; 910 #if H_3D_NBDV 911 if(bNBDV == true) 912 { 913 m_puhWidth = pcCU->getWidth () + uiAbsPartIdx; 914 m_puhHeight = pcCU->getHeight() + uiAbsPartIdx; 915 m_puhDepth = pcCU->getDepth () + uiAbsPartIdx; 916 } 917 else 918 { 919 #endif 888 920 m_pePredMode = pcCU->getPredictionMode() + uiAbsPartIdx; 889 921 m_CUTransquantBypass = pcCU->getCUTransquantBypass() + uiAbsPartIdx; … … 904 936 memcpy(m_sliceStartCU,pcCU->m_sliceStartCU+uiAbsPartIdx,sizeof(UInt)*m_uiNumPartition); 905 937 memcpy(m_sliceSegmentStartCU,pcCU->m_sliceSegmentStartCU+uiAbsPartIdx,sizeof(UInt)*m_uiNumPartition); 938 #if H_3D_NBDV 939 } 940 #endif 906 941 } 907 942 … … 1004 1039 1005 1040 memcpy( rpcCU->getQP() + m_uiAbsIdxInLCU, m_phQP, sizeInChar ); 1041 #if H_3D_NBDV 1042 memcpy( rpcCU->getDvInfo() + m_uiAbsIdxInLCU, m_pDvInfo, sizeof(* m_pDvInfo) * m_uiNumPartition ); 1043 #endif 1006 1044 1007 1045 memcpy( rpcCU->getPartitionSize() + m_uiAbsIdxInLCU, m_pePartSize, sizeof( *m_pePartSize ) * m_uiNumPartition ); … … 2406 2444 deriveLeftRightTopIdxGeneral( uiAbsPartIdx, uiPUIdx, uiPartIdxLT, uiPartIdxRT ); 2407 2445 deriveLeftBottomIdxGeneral ( uiAbsPartIdx, uiPUIdx, uiPartIdxLB ); 2408 2446 #if H_3D_NBDV //Notes from QC: DvMCP related variables. 2447 //acPdmMv[0].m_bDvMcp = acPdmMv[1].m_bDvMcp = acPdmMv[2].m_bDvMcp = acPdmMv[3].m_bDvMcp = false; 2448 #endif 2449 2450 #if H_3D_NBDV //Notes from QC: Some examples to show how to use the NBDV and DoNBDV variables. Remove this comment once it is done 2451 DisInfo cDisInfo; 2452 cDisInfo.bDV = false; 2453 //if(!bNoPdmMerge) 2454 //{ 2455 //cDisInfo.bDV = getDvInfo(uiAbsPartIdx).bDV; 2456 //cDisInfo.m_aVIdxCan = getDvInfo(uiAbsPartIdx).m_aVIdxCan; 2457 //cDisInfo.m_acNBDV = getDvInfo(uiAbsPartIdx).m_acNBDV; 2458 //#if H_3D_NBDV_REF 2459 //cDisInfo.m_acDoNBDV = getDvInfo(uiAbsPartIdx).m_acDoNBDV; 2460 //#endif 2461 //} 2462 #endif 2409 2463 //left 2410 2464 UInt uiLeftPartIdx = 0; … … 3846 3900 } 3847 3901 #endif 3848 3902 #if H_3D_NBDV 3903 //Notes from QC: 3904 //TBD#1: DoNBDV related contributions are just partially integrated under the marco of H_3D_NBDV_REF, remove this comment once DoNBDV and BVSP are done 3905 //TBD#2: set of DvMCP values need to be done as part of inter-view motion prediction process. Remove this comment once merge related integration is done 3906 //To be checked: Parallel Merge features for NBDV, related to DV_DERIVATION_PARALLEL_B0096 and LGE_IVMP_PARALLEL_MERGE_B0136 are not integrated. The need of these features due to the adoption of CU-based NBDV is not clear. We need confirmation on this, especially by proponents 3907 Bool TComDataCU::getDisMvpCandNBDV( DisInfo* pDInfo 3908 #if H_3D_NBDV_REF 3909 , Bool bDepthRefine 3910 #endif 3911 ) 3912 { 3913 //// ******* Init variables ******* ///// 3914 // Init disparity struct for results 3915 pDInfo->bDV = false; 3916 // Init struct for disparities from MCP neighboring blocks 3917 IDVInfo cIDVInfo; 3918 cIDVInfo.m_bFound = false; 3919 UInt uiPartIdx = 0; 3920 UInt uiPartAddr = 0; 3921 for (UInt iCurDvMcpCand = 0; iCurDvMcpCand < IDV_CANDS; iCurDvMcpCand++) 3922 { 3923 for (UInt iList = 0; iList < 2; iList++) 3924 { 3925 cIDVInfo.m_acMvCand[iList][iCurDvMcpCand].setZero(); 3926 cIDVInfo.m_aVIdxCan[iList][iCurDvMcpCand] = 0; 3927 cIDVInfo.m_bAvailab[iList][iCurDvMcpCand] = false; 3928 } 3929 } 3930 // Get Positions 3931 PartSize eCUMode = getPartitionSize( uiPartAddr ); 3932 assert(eCUMode == SIZE_2Nx2N); 3933 UInt uiPartIdxLT, uiPartIdxRT, uiPartIdxLB; 3934 3935 deriveLeftRightTopIdxGeneral(uiPartAddr, uiPartIdx, uiPartIdxLT, uiPartIdxRT ); 3936 deriveLeftBottomIdxGeneral (uiPartAddr, uiPartIdx, uiPartIdxLB ); 3937 3938 //// ******* Get disparity from temporal neighboring blocks ******* ///// 3939 if ( getSlice()->getEnableTMVPFlag() ) 3940 { 3941 TComMv cColMv; 3942 Int iTargetViewIdx = 0; 3943 Int iTStartViewIdx = 0; 3944 3945 ///*** Derive center position *** 3946 UInt uiPartIdxCenter; 3947 Int uiLCUIdx = getAddr(); 3948 xDeriveCenterIdx(uiPartIdx, uiPartIdxCenter ); 3949 3950 ///*** Derive bottom right neighbour position *** 3951 Int iLCUIdxRBNb = -1; 3952 Int iPartIdxRBNb = -1; 3953 xDeriveRightBottomNbIdx(iLCUIdxRBNb, iPartIdxRBNb ); 3954 3955 ///*** Search temporal candidate pictures for disparity vector *** 3956 const Int iNumCandPics = getPic()->getNumDdvCandPics(); 3957 for(Int curCandPic = 0; curCandPic < iNumCandPics; curCandPic++) 3958 { 3959 RefPicList eCurRefPicList = REF_PIC_LIST_0 ; 3960 Int curCandPicRefIdx = 0; 3961 if( curCandPic == 0 ) 3962 { 3963 eCurRefPicList = RefPicList(getSlice()->isInterB() ? 1-getSlice()->getColFromL0Flag() : 0); 3964 curCandPicRefIdx = getSlice()->getColRefIdx(); 3965 } 3966 else 3967 { 3968 eCurRefPicList = getPic()->getRapRefList(); 3969 curCandPicRefIdx = getPic()->getRapRefIdx(); 3970 } 3971 3972 // Check BR and Center 3973 for(Int curPosition = 0; curPosition < 2; curPosition++) 3974 { 3975 Bool bCheck = false; 3976 if ( curPosition == 0 && iLCUIdxRBNb >= 0 ) 3977 bCheck = xGetColDisMV( eCurRefPicList, curCandPicRefIdx, iLCUIdxRBNb, iPartIdxRBNb, cColMv, iTargetViewIdx, iTStartViewIdx); 3978 3979 if (curPosition == 1 ) 3980 bCheck = xGetColDisMV( eCurRefPicList, curCandPicRefIdx, uiLCUIdx, uiPartIdxCenter, cColMv, iTargetViewIdx, iTStartViewIdx ); 3981 3982 if( bCheck ) 3983 { 3984 clipMv(cColMv); 3985 pDInfo->m_acNBDV = cColMv; 3986 pDInfo->m_aVIdxCan = iTargetViewIdx; 3987 TComPic* picDepth = NULL; 3988 3989 #if H_3D_NBDV_REF 3990 /*Place DoNBDV*/ 3991 pDInfo->m_acDoNBDV = cColMv; 3992 #endif 3993 return true; 3994 } 3995 } 3996 } 3997 } 3998 3999 UInt uiIdx = 0; 4000 Bool bCheckMcpDv = false; 4001 TComDataCU* pcTmpCU = NULL; 4002 4003 //// ******* Get disparity from left block ******* ///// 4004 pcTmpCU = getPULeft(uiIdx, uiPartIdxLB, true, false); 4005 bCheckMcpDv = true; 4006 if ( xCheckSpatialNBDV( pcTmpCU, uiIdx, pDInfo, bCheckMcpDv, &cIDVInfo, DVFROM_LEFT 4007 #if H_3D_NBDV_REF 4008 , bDepthRefine 4009 #endif 4010 ) ) 4011 return true; 4012 4013 //// ******* Get disparity from above block ******* ///// 4014 pcTmpCU = getPUAbove(uiIdx, uiPartIdxRT, true, false, true); 4015 if(pcTmpCU != NULL ) 4016 { 4017 bCheckMcpDv = ( ( getAddr() - pcTmpCU->getAddr() ) == 0); 4018 if ( xCheckSpatialNBDV( pcTmpCU, uiIdx, pDInfo, bCheckMcpDv, &cIDVInfo, DVFROM_ABOVE 4019 #if H_3D_NBDV_REF 4020 , bDepthRefine 4021 #endif 4022 ) ) 4023 return true; 4024 } 4025 4026 //// ******* Get disparity from above right block ******* ///// 4027 pcTmpCU = getPUAboveRight(uiIdx, uiPartIdxRT, true); 4028 if(pcTmpCU != NULL ) 4029 { 4030 bCheckMcpDv = ( ( getAddr() - pcTmpCU->getAddr() ) == 0); 4031 if ( xCheckSpatialNBDV( pcTmpCU, uiIdx, pDInfo, bCheckMcpDv, &cIDVInfo, DVFROM_ABOVERIGHT 4032 #if H_3D_NBDV_REF 4033 , bDepthRefine 4034 #endif 4035 ) ) 4036 return true; 4037 } 4038 4039 //// ******* Get disparity from below left block ******* ///// 4040 pcTmpCU = getPUBelowLeft(uiIdx, uiPartIdxLB, true); 4041 if( pcTmpCU != NULL ) 4042 { 4043 bCheckMcpDv = true; 4044 if ( xCheckSpatialNBDV( pcTmpCU, uiIdx, pDInfo, bCheckMcpDv, &cIDVInfo, DVFROM_LEFTBELOW 4045 #if H_3D_NBDV_REF 4046 , bDepthRefine 4047 #endif 4048 ) ) 4049 return true; 4050 } 4051 4052 //// ******* Get disparity from above left block ******* ///// 4053 pcTmpCU = getPUAboveLeft(uiIdx, (m_uiAbsIdxInLCU + uiPartAddr), true); 4054 assert(uiPartIdxLT == (m_uiAbsIdxInLCU + uiPartAddr)); 4055 4056 if( pcTmpCU != NULL ) 4057 { 4058 bCheckMcpDv = (( getAddr() - pcTmpCU->getAddr() ) <= 1); 4059 if ( xCheckSpatialNBDV( pcTmpCU, uiIdx, pDInfo, bCheckMcpDv, &cIDVInfo, DVFROM_ABOVELEFT 4060 #if H_3D_NBDV_REF 4061 , bDepthRefine 4062 #endif 4063 ) ) 4064 return true; 4065 } 4066 4067 //// ******* Search MCP blocks ******* ///// 4068 if( cIDVInfo.m_bFound ) 4069 { 4070 for( Int curPos = 0 ; curPos < IDV_CANDS ; curPos++ ) 4071 { 4072 for(Int iList = 0; iList < (getSlice()->isInterB() ? 2: 1); iList ++) 4073 { 4074 if( cIDVInfo.m_bAvailab[iList][curPos] ) 4075 { 4076 TComMv cDispVec = cIDVInfo.m_acMvCand[iList][ curPos ]; 4077 clipMv( cDispVec ); 4078 pDInfo->m_acNBDV = cDispVec; 4079 pDInfo->m_aVIdxCan = 0; 4080 #if H_3D_NBDV_REF 4081 /*Place DoNBDV*/ 4082 4083 pDInfo->m_acDoNBDV = cDispVec; 4084 4085 #endif 4086 return true; 4087 } 4088 } 4089 } 4090 } 4091 4092 TComPic* picDepth = NULL; 4093 TComMv defaultDV(0, 0); 4094 pDInfo->m_acNBDV = defaultDV; 4095 pDInfo->m_aVIdxCan = 0; 4096 #if H_3D_NBDV_REF 4097 /*Place DoNBDV*/ 4098 4099 pDInfo->m_acDoNBDV = defaultDV; 4100 #endif 4101 return false; 4102 } 4103 4104 Bool TComDataCU::xCheckSpatialNBDV( TComDataCU* pcTmpCU, UInt uiIdx, DisInfo* pNbDvInfo, Bool bSearchForMvpDv, IDVInfo* paIDVInfo, UInt uiMvpDvPos 4105 #if H_3D_NBDV_REF 4106 , Bool bDepthRefine 4107 #endif 4108 ) 4109 { 4110 if( pcTmpCU != NULL && !pcTmpCU->isIntra( uiIdx ) ) 4111 { 4112 Bool bTmpIsSkipped = pcTmpCU->isSkipped( uiIdx ); 4113 for(Int iList = 0; iList < (getSlice()->isInterB() ? 2: 1); iList ++) 4114 { 4115 RefPicList eRefPicList = RefPicList(iList); 4116 Int refId = pcTmpCU->getCUMvField(eRefPicList)->getRefIdx(uiIdx) ; 4117 TComMv cMvPred = pcTmpCU->getCUMvField(eRefPicList)->getMv(uiIdx); 4118 4119 if( refId >= 0) 4120 { 4121 Int refViewIdx = pcTmpCU->getSlice()->getRefPic(eRefPicList, refId)->getViewIndex(); 4122 if (refViewIdx != m_pcSlice->getViewIndex()) 4123 { 4124 clipMv(cMvPred); 4125 pNbDvInfo->m_acNBDV = cMvPred; 4126 pNbDvInfo->m_aVIdxCan = refViewIdx; 4127 TComPic* picDepth = NULL; 4128 #if H_3D_NBDV_REF 4129 /*Place DoNBDV*/ 4130 4131 pNbDvInfo->m_acDoNBDV = cMvPred; 4132 #endif 4133 return true; 4134 } 4135 else if ( bSearchForMvpDv && cMvPred.getIDVFlag() && bTmpIsSkipped ) 4136 { 4137 assert( uiMvpDvPos < IDV_CANDS ); 4138 paIDVInfo->m_acMvCand[iList][ uiMvpDvPos ] = TComMv( cMvPred.getIDVHor(), cMvPred.getIDVVer() ); 4139 //Notes from QC: DvMCP is implemented in a way that doesnt carry the reference view identifier as NBDV. It only works for CTC and needs to be fixed to be aligned with other part of the NBDV design. 4140 paIDVInfo->m_aVIdxCan[iList][ uiMvpDvPos ] = 0; 4141 paIDVInfo->m_bAvailab[iList][ uiMvpDvPos ] = true; 4142 paIDVInfo->m_bFound = true; 4143 } 4144 } 4145 } 4146 } 4147 return false; 4148 } 4149 4150 Void TComDataCU::xDeriveRightBottomNbIdx(Int &riLCUIdxRBNb, Int &riPartIdxRBNb ) 4151 { 4152 UInt uiPartIdx = 0; 4153 UInt uiNumPartInCUWidth = m_pcPic->getNumPartInWidth(); 4154 Int uiLCUIdx = getAddr(); 4155 4156 UInt uiPartIdxRB; 4157 deriveRightBottomIdx(uiPartIdx, uiPartIdxRB ); 4158 UInt uiAbsPartIdxTmp = g_auiZscanToRaster[uiPartIdxRB]; 4159 4160 if (( m_pcPic->getCU(m_uiCUAddr)->getCUPelX() + g_auiRasterToPelX[uiAbsPartIdxTmp] + m_pcPic->getMinCUWidth() )>= m_pcSlice->getSPS()->getPicWidthInLumaSamples() ) 4161 { 4162 riLCUIdxRBNb = -1; 4163 riPartIdxRBNb = -1; 4164 } 4165 else if(( m_pcPic->getCU(m_uiCUAddr)->getCUPelY() + g_auiRasterToPelY[uiAbsPartIdxTmp] + m_pcPic->getMinCUHeight() )>= m_pcSlice->getSPS()->getPicHeightInLumaSamples() ) 4166 { 4167 riLCUIdxRBNb = -1; 4168 riPartIdxRBNb = -1; 4169 } 4170 else 4171 { 4172 if ( ( uiAbsPartIdxTmp % uiNumPartInCUWidth < uiNumPartInCUWidth - 1 ) && // is not at the last column of LCU 4173 ( uiAbsPartIdxTmp / uiNumPartInCUWidth < m_pcPic->getNumPartInHeight() - 1 ) ) // is not at the last row of LCU 4174 { 4175 riPartIdxRBNb = g_auiRasterToZscan[ uiAbsPartIdxTmp + uiNumPartInCUWidth + 1 ]; 4176 riLCUIdxRBNb = uiLCUIdx; 4177 } 4178 else if ( uiAbsPartIdxTmp % uiNumPartInCUWidth < uiNumPartInCUWidth - 1 ) // is not at the last column of LCU But is last row of LCU 4179 { 4180 riPartIdxRBNb = -1; 4181 riLCUIdxRBNb = -1; 4182 } 4183 else if ( uiAbsPartIdxTmp / uiNumPartInCUWidth < m_pcPic->getNumPartInHeight() - 1 ) // is not at the last row of LCU But is last column of LCU 4184 { 4185 riPartIdxRBNb = g_auiRasterToZscan[ uiAbsPartIdxTmp + 1 ]; 4186 riLCUIdxRBNb = uiLCUIdx + 1; 4187 } 4188 else //is the right bottom corner of LCU 4189 { 4190 riPartIdxRBNb = -1; 4191 riLCUIdxRBNb = -1; 4192 } 4193 } 4194 } 4195 4196 4197 Void TComDataCU::setDvInfoSubParts( DisInfo cDvInfo, UInt uiAbsPartIdx, UInt uiDepth ) 4198 { 4199 UInt uiCurrPartNumb = m_pcPic->getNumPartInCU() >> (uiDepth << 1); 4200 for (UInt ui = 0; ui < uiCurrPartNumb; ui++ ) 4201 { 4202 m_pDvInfo[uiAbsPartIdx + ui] = cDvInfo; 4203 } 4204 } 4205 4206 Bool TComDataCU::xGetColDisMV( RefPicList eRefPicList, Int refidx, Int uiCUAddr, Int uiPartUnitIdx, TComMv& rcMv , Int & iTargetViewIdx, Int & iStartViewIdx ) 4207 { 4208 4209 RefPicList eColRefPicList = REF_PIC_LIST_0; 4210 Int iColViewIdx, iColRefViewIdx; 4211 TComPic *pColPic = getSlice()->getRefPic( eRefPicList, refidx); 4212 TComDataCU *pColCU = pColPic->getCU( uiCUAddr ); 4213 iColViewIdx = pColCU->getSlice()->getViewIndex(); 4214 if (pColCU->getPic()==0||pColCU->getPartitionSize(uiPartUnitIdx)==SIZE_NONE||pColCU->isIntra(uiPartUnitIdx)) 4215 { 4216 return false; 4217 } 4218 for (Int ilist = 0; ilist < (pColCU->getSlice()->isInterB()? 2:1); ilist++) 4219 { 4220 if(pColCU->getSlice()->isInterB()) 4221 { 4222 eColRefPicList = RefPicList(ilist); 4223 } 4224 4225 Int iColRefIdx = pColCU->getCUMvField(eColRefPicList)->getRefIdx(uiPartUnitIdx); 4226 4227 if (iColRefIdx < 0) 4228 { 4229 continue; 4230 } 4231 4232 iColRefViewIdx = pColCU->getSlice()->getRefPic(eColRefPicList, iColRefIdx)->getViewIndex(); 4233 4234 if ( iColViewIdx == iColRefViewIdx ) // temporal vector 4235 { 4236 continue; 4237 } 4238 else 4239 { 4240 rcMv = pColCU->getCUMvField(eColRefPicList)->getMv(uiPartUnitIdx); 4241 rcMv.setIDVFlag(0); 4242 iTargetViewIdx = iColRefViewIdx ; 4243 iStartViewIdx = iColViewIdx ; 4244 return true; 4245 } 4246 } 4247 4248 return false; 4249 } 4250 #endif 3849 4251 //! \} -
branches/HTM-DEV-0.3-dev2/source/Lib/TLibCommon/TComDataCU.h
r446 r455 187 187 Char* m_apiMVPNum[2]; ///< array of number of possible motion vectors predictors 188 188 Bool* m_pbIPCMFlag; ///< array of intra_pcm flags 189 189 #if H_3D_NBDV 190 DisInfo* m_pDvInfo; 191 #endif 190 192 // ------------------------------------------------------------------------------------------------------------------- 191 193 // misc. variables … … 241 243 Void initSubCU ( TComDataCU* pcCU, UInt uiPartUnitIdx, UInt uiDepth, Int qp ); 242 244 Void setOutsideCUPart ( UInt uiAbsPartIdx, UInt uiDepth ); 243 245 #if H_3D_NBDV 246 Void copyDVInfoFrom (TComDataCU* pcCU, UInt uiAbsPartIdx); 247 #endif 244 248 Void copySubCU ( TComDataCU* pcCU, UInt uiPartUnitIdx, UInt uiDepth ); 245 Void copyInterPredInfoFrom ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefPicList ); 249 Void copyInterPredInfoFrom ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefPicList 250 #if H_3D_NBDV 251 , Bool bNBDV = false 252 #endif 253 ); 246 254 Void copyPartFrom ( TComDataCU* pcCU, UInt uiPartUnitIdx, UInt uiDepth ); 247 255 … … 391 399 Void setIPCMFlag (UInt uiIdx, Bool b ) { m_pbIPCMFlag[uiIdx] = b; } 392 400 Void setIPCMFlagSubParts (Bool bIpcmFlag, UInt uiAbsPartIdx, UInt uiDepth); 393 401 #if H_3D_NBDV 402 Void setDvInfoSubParts ( DisInfo cDvInfo, UInt uiAbsPartIdx, UInt uiDepth ); 403 DisInfo* getDvInfo () { return m_pDvInfo; } 404 DisInfo getDvInfo (UInt uiIdx) { return m_pDvInfo[uiIdx]; } 405 #endif 394 406 /// get slice ID for SU 395 407 Int getSUSliceID (UInt uiIdx) {return m_piSliceSUMap[uiIdx]; } … … 406 418 ,Bool bTopTileBoundary, Bool bDownTileBoundary, Bool bLeftTileBoundary, Bool bRightTileBoundary 407 419 ,Bool bIndependentTileBoundaryEnabled ); 420 #if H_3D_NBDV 421 Void xDeriveRightBottomNbIdx(Int &uiLCUIdxRBNb, Int &uiPartIdxRBNb ); 422 Bool xCheckSpatialNBDV (TComDataCU* pcTmpCU, UInt uiIdx, DisInfo* pNbDvInfo, Bool bSearchForMvpDv, IDVInfo* paMvpDvInfo, 423 UInt uiMvpDvPos 424 #if H_3D_NBDV_REF 425 , Bool bDepthRefine = false 426 #endif 427 ); 428 Bool xGetColDisMV ( RefPicList eRefPicList, Int refidx, Int uiCUAddr, Int uiPartUnitIdx, TComMv& rcMv, Int & iTargetViewIdx, Int & iStartViewIdx ); 429 Bool getDisMvpCandNBDV ( DisInfo* pDInfo 430 #if H_3D_NBDV_REF 431 , Bool bDepthRefine = false 432 #endif 433 ); 434 435 #endif 408 436 // ------------------------------------------------------------------------------------------------------------------- 409 437 // member functions for accessing partition information -
branches/HTM-DEV-0.3-dev2/source/Lib/TLibCommon/TComMotionInfo.h
r324 r455 58 58 } AMVPInfo; 59 59 60 #if H_3D_NBDV 61 typedef struct _DisCand 62 { 63 Bool bDV; 64 TComMv m_acNBDV; // DV from NBDV 65 #if H_3D_NBDV_REF 66 TComMv m_acDoNBDV; // DV from DoNBDV 67 #endif 68 Int m_aVIdxCan; // View order index (the same with the NBDV and the DoNBDV) 69 } DisInfo; 70 71 typedef struct _IDVCand // IDV 72 { 73 TComMv m_acMvCand[2][ IDV_CANDS ]; 74 Int m_aVIdxCan[2][ IDV_CANDS ]; 75 Bool m_bAvailab[2][ IDV_CANDS ]; 76 Bool m_bFound; 77 } IDVInfo; 78 #endif 60 79 // ==================================================================================================================== 61 80 // Class definition -
branches/HTM-DEV-0.3-dev2/source/Lib/TLibCommon/TComMv.h
r324 r455 54 54 Short m_iHor; ///< horizontal component of motion vector 55 55 Short m_iVer; ///< vertical component of motion vector 56 56 #if H_3D_NBDV 57 Bool m_bIDV; 58 Short m_iIDVHor; 59 Short m_iIDVVer; 60 #endif 57 61 public: 58 62 … … 64 68 m_iHor(0), 65 69 m_iVer(0) 70 #if H_3D_NBDV 71 , m_bIDV(false) 72 , m_iIDVHor(0) 73 , m_iIDVVer(0) 74 #endif 66 75 { 67 76 } … … 70 79 m_iHor(iHor), 71 80 m_iVer(iVer) 81 #if H_3D_NBDV 82 , m_bIDV(false) 83 , m_iIDVHor(0) 84 , m_iIDVVer(0) 85 #endif 72 86 { 73 87 } … … 81 95 Void setVer ( Short i ) { m_iVer = i; } 82 96 Void setZero () { m_iHor = m_iVer = 0; } 83 97 #if H_3D_NBDV 98 Void setIDVHor (Short i) {m_iIDVHor = i;} 99 Void setIDVVer (Short i) {m_iIDVVer = i;} 100 Void setIDVFlag (Bool b ) {m_bIDV = b;} 101 #endif 84 102 // ------------------------------------------------------------------------------------------------------------------ 85 103 // get … … 90 108 Int getAbsHor () const { return abs( m_iHor ); } 91 109 Int getAbsVer () const { return abs( m_iVer ); } 92 110 #if H_3D_NBDV 111 Short getIDVHor () const { return m_iIDVHor; } 112 Short getIDVVer () const { return m_iIDVVer; } 113 Bool getIDVFlag() const { return m_bIDV; } 114 #endif 93 115 // ------------------------------------------------------------------------------------------------------------------ 94 116 // operations -
branches/HTM-DEV-0.3-dev2/source/Lib/TLibCommon/TComPic.cpp
r446 r455 77 77 m_apcPicYuv[0] = NULL; 78 78 m_apcPicYuv[1] = NULL; 79 #if H_3D_NBDV 80 m_iNumDdvCandPics = 0; 81 m_eRapRefList = REF_PIC_LIST_0; 82 m_uiRapRefIdx = 0; 83 #endif 79 84 } 80 85 … … 553 558 #endif // H_3D 554 559 #endif // H_MV 560 #if H_3D_NBDV 561 Int TComPic::getDisCandRefPictures(Int iColPOC) 562 { 563 UInt uiTempLayerCurr=7; 564 TComSlice* currSlice = getSlice(getCurrSliceIdx()); 565 UInt NumDdvCandPics = 0; 566 if ( !currSlice->getEnableTMVPFlag() ) 567 return NumDdvCandPics; 568 NumDdvCandPics +=1; 569 570 UInt iPOCCurr=currSlice->getPOC(); 571 UInt iPOCDiff = 255; 572 Bool bCheck = false; 573 574 for(UInt lpNr = 0; lpNr < (currSlice->isInterB() ? 2: 1); lpNr ++) 575 { 576 UInt X = lpNr? currSlice->getColFromL0Flag() : 1-currSlice->getColFromL0Flag(); 577 for (UInt i = 0; i < currSlice->getNumRefIdx(RefPicList(X)); i++) 578 { 579 if(currSlice->getViewIndex() == currSlice->getRefPic((RefPicList)X, i)->getViewIndex() 580 && (X == currSlice->getColFromL0Flag()||currSlice->getRefPOC((RefPicList)X, i)!= iColPOC) && NumDdvCandPics!=2) 581 { 582 TComSlice* refSlice = currSlice->getRefPic((RefPicList)X, i)->getSlice(getCurrSliceIdx()); 583 Bool bRAP = (refSlice->getViewIndex() && refSlice->isIRAP())? 1: 0; 584 UInt uiTempLayer = currSlice->getRefPic((RefPicList)X, i)->getSlice(getCurrSliceIdx())->getTLayer(); 585 Int iTempPoc = currSlice->getRefPic((RefPicList)X, i)->getPOC(); 586 Int iTempDiff = (iTempPoc > iPOCCurr) ? (iTempPoc - iPOCCurr): (iPOCCurr - iTempPoc); 587 if(bRAP) 588 { 589 this->setRapRefIdx(i); 590 this->setRapRefList((RefPicList)X); 591 NumDdvCandPics = 2; 592 return NumDdvCandPics; 593 } 594 else if (uiTempLayerCurr > uiTempLayer) 595 uiTempLayerCurr = uiTempLayer; 596 } 597 } 598 } 599 UInt Z; 600 UInt idx=0; 601 for(UInt lpNr = 0; lpNr < (currSlice->isInterB() ? 2: 1); lpNr ++) 602 { 603 UInt X = lpNr? currSlice->getColFromL0Flag() : 1-currSlice->getColFromL0Flag(); 604 for (UInt i = 0; i < currSlice->getNumRefIdx(RefPicList(X)); i++) 605 { 606 Int iTempPoc = currSlice->getRefPic((RefPicList)X, i)->getPOC(); 607 Int iTempDiff = (iTempPoc > iPOCCurr) ? (iTempPoc - iPOCCurr): (iPOCCurr - iTempPoc); 608 if(currSlice->getViewIndex() == currSlice->getRefPic((RefPicList)X, i)->getViewIndex() && (X == currSlice->getColFromL0Flag()||currSlice->getRefPOC((RefPicList)X, i)!= iColPOC) 609 && currSlice->getRefPic((RefPicList)X, i)->getSlice(getCurrSliceIdx())->getTLayer() == uiTempLayerCurr && iPOCDiff > iTempDiff) 610 { 611 iPOCDiff=iTempDiff; 612 Z=X; 613 idx = i; 614 } 615 } 616 } 617 if(iPOCDiff<255) 618 { 619 this->setRapRefIdx(idx); 620 this->setRapRefList((RefPicList)Z); 621 NumDdvCandPics = 2; 622 } 623 624 return NumDdvCandPics; 625 } 626 #endif 555 627 //! \} -
branches/HTM-DEV-0.3-dev2/source/Lib/TLibCommon/TComPic.h
r446 r455 96 96 #endif 97 97 #endif 98 #if H_3D_NBDV 99 UInt m_uiRapRefIdx; 100 RefPicList m_eRapRefList; 101 Int m_iNumDdvCandPics; 102 #endif 98 103 public: 99 104 TComPic(); … … 194 199 Void print( Bool legend ); 195 200 #endif 201 #if H_3D_NBDV 202 Int getNumDdvCandPics() {return m_iNumDdvCandPics; } 203 Int getDisCandRefPictures(Int iColPOC); 204 Void setRapRefIdx(UInt uiRapRefIdx) {m_uiRapRefIdx = uiRapRefIdx;} 205 Void setRapRefList(RefPicList eRefPicList) {m_eRapRefList = eRefPicList;} 206 Void setNumDdvCandPics (Int i) {m_iNumDdvCandPics = i; } 207 UInt getRapRefIdx() {return m_uiRapRefIdx; } 208 RefPicList getRapRefList() {return m_eRapRefList; } 209 #endif 196 210 /** transfer ownership of seis to this picture */ 197 211 void setSEIs(SEIMessages& seis) { m_SEIs = seis; } -
branches/HTM-DEV-0.3-dev2/source/Lib/TLibCommon/TypeDef.h
r446 r455 78 78 // SAIT_VSO_EST_A0033, JCT3V-A0033 modification 3 79 79 // LGE_WVSO_A0119 80 #define H_3D_NBDV 1 // Neighboring block disparity derivation 81 // JCT3V-A0097 82 // LGE_DVMCP_A0126 83 // LGE_DVMCP_MEM_REDUCTION_B0135 84 // QC_SIMPLE_NBDV_B0047 85 // FIX_LGE_DVMCP_B0133 86 // QC_NBDV_LDB_FIX_C0055 87 // MTK_SAIT_TEMPORAL_FIRST_ORDER_C0141_C0097 88 // MTK_SIMPLIFY_DVTC_C0135 89 // QC_CU_NBDV_D0181 90 // SEC_DEFAULT_DV_D0112 80 91 #endif 81 92 … … 92 103 #define H_3D_VSO_SYNTH_DIST_OUT 0 // Output of synthesized view distortion instead of depth distortion in encoder output 93 104 #endif 94 105 //// ****** Neighbouring block-based Disparity Vector ********* 106 #if H_3D_NBDV 107 #define IDV_CANDS 6 108 #define DVFROM_LEFTBELOW 1 109 #define DVFROM_LEFT 2 110 #define DVFROM_ABOVERIGHT 3 111 #define DVFROM_ABOVE 4 112 #define DVFROM_ABOVELEFT 5 113 #endif 95 114 ///////////////////////////////////////////////////////////////////////////////////////// 96 115 /////////////////////////////////// HM RELATED DEFINES //////////////////////////////// -
branches/HTM-DEV-0.3-dev2/source/Lib/TLibDecoder/TDecCu.cpp
r324 r455 269 269 pcCU->setQPSubParts( pcCU->getRefQP(uiAbsPartIdx), uiAbsPartIdx, uiDepth ); // set QP to default QP 270 270 } 271 271 #if H_3D_NBDV 272 DisInfo DvInfo; 273 DvInfo.bDV = false; 274 DvInfo.m_acNBDV.setZero(); 275 DvInfo.m_aVIdxCan = 0; 276 #if H_3D_NBDV_REF 277 DvInfo.m_acDoNBDV.setZero(); 278 #endif 279 280 281 if(!pcCU->getSlice()->isIntra()) 282 { 283 if(pcCU->getSlice()->getViewIndex() && !pcCU->getSlice()->getIsDepth()) //Notes from QC: this condition shall be changed once the configuration is completed, e.g. in pcSlice->getSPS()->getMultiviewMvPredMode() || ARP in prev. HTM. Remove this comment once it is done. 284 { 285 m_ppcCU[uiDepth]->copyInterPredInfoFrom( pcCU, uiAbsPartIdx, REF_PIC_LIST_0, true ); 286 m_ppcCU[uiDepth]->copyDVInfoFrom( pcCU, uiAbsPartIdx); 287 PartSize ePartTemp = m_ppcCU[uiDepth]->getPartitionSize(0); 288 UChar cWidTemp = m_ppcCU[uiDepth]->getWidth(0); 289 UChar cHeightTemp = m_ppcCU[uiDepth]->getHeight(0); 290 m_ppcCU[uiDepth]->setWidth ( 0, pcCU->getSlice()->getSPS()->getMaxCUWidth ()/(1<<uiDepth) ); 291 m_ppcCU[uiDepth]->setHeight ( 0, pcCU->getSlice()->getSPS()->getMaxCUHeight()/(1<<uiDepth) ); 292 m_ppcCU[uiDepth]->setPartSizeSubParts( SIZE_2Nx2N, 0, uiDepth ); 293 #if H_3D_NBDV_REF 294 if(pcCU->getSlice()->getSPS()->getUseDVPRefine()) //Notes from QC: please check the condition for DoNBDV. Remove this comment once it is done. 295 DvInfo.bDV = m_ppcCU[uiDepth]->getDisMvpCandNBDV(&DvInfo, true); 296 else 297 #endif 298 DvInfo.bDV = m_ppcCU[uiDepth]->getDisMvpCandNBDV(&DvInfo); 299 300 pcCU->setDvInfoSubParts(DvInfo, uiAbsPartIdx, uiDepth); 301 m_ppcCU[uiDepth]->setPartSizeSubParts( ePartTemp, 0, uiDepth ); 302 m_ppcCU[uiDepth]->setWidth ( 0, cWidTemp ); 303 m_ppcCU[uiDepth]->setHeight ( 0, cHeightTemp ); 304 } 305 } 306 #endif 272 307 if (pcCU->getSlice()->getPPS()->getTransquantBypassEnableFlag()) 273 308 { -
branches/HTM-DEV-0.3-dev2/source/Lib/TLibDecoder/TDecGop.cpp
r446 r455 152 152 m_LFCrossSliceBoundaryFlag.push_back( pcSlice->getLFCrossSliceBoundaryFlag()); 153 153 } 154 #if H_3D_NBDV 155 if(pcSlice->getViewIndex() && !pcSlice->getIsDepth()) //Notes from QC: this condition shall be changed once the configuration is completed, e.g. in pcSlice->getSPS()->getMultiviewMvPredMode() || ARP in prev. HTM. Remove this comment once it is done. 156 { 157 Int iColPoc = pcSlice->getRefPOC(RefPicList(1-pcSlice->getColFromL0Flag()), pcSlice->getColRefIdx()); 158 rpcPic->setNumDdvCandPics(rpcPic->getDisCandRefPictures(iColPoc)); 159 } 160 #endif 154 161 m_pcSbacDecoders[0].load(m_pcSbacDecoder); 155 162 m_pcSliceDecoder->decompressSlice( ppcSubstreams, rpcPic, m_pcSbacDecoder, m_pcSbacDecoders); -
branches/HTM-DEV-0.3-dev2/source/Lib/TLibEncoder/TEncCu.cpp
r446 r455 457 457 458 458 rpcTempCU->initEstData( uiDepth, iQP ); 459 459 #if H_3D_NBDV 460 DisInfo DvInfo; 461 DvInfo.bDV = false; 462 DvInfo.m_acNBDV.setZero(); 463 DvInfo.m_aVIdxCan = 0; 464 #if H_3D_NBDV_REF 465 DvInfo.m_acDoNBDV.setZero(); 466 #endif 467 468 if( rpcTempCU->getSlice()->getSliceType() != I_SLICE ) 469 { 470 if(rpcTempCU->getSlice()->getViewIndex() && !rpcTempCU->getSlice()->getIsDepth()) //Notes from QC: this condition shall be changed once the configuration is completed, e.g. in pcSlice->getSPS()->getMultiviewMvPredMode() || ARP in prev. HTM. Remove this comment once it is done. Remove this comment once it is done. 471 { 472 PartSize ePartTemp = rpcTempCU->getPartitionSize(0); 473 rpcTempCU->setPartSizeSubParts( SIZE_2Nx2N, 0, uiDepth ); 474 #if H_3D_NBDV_REF 475 if(m_pcSlice->getSPS()->getUseDVPRefine()) //Notes from QC: please check the condition for DoNBDV. Remove this comment once it is done. 476 DvInfo.bDV = rpcTempCU->getDisMvpCandNBDV(&DvInfo, true); 477 else 478 #endif 479 DvInfo.bDV = rpcTempCU->getDisMvpCandNBDV(&DvInfo); 480 481 rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth); 482 rpcBestCU->setDvInfoSubParts(DvInfo, 0, uiDepth); 483 rpcTempCU->setPartSizeSubParts( ePartTemp, 0, uiDepth ); 484 } 485 } 486 #endif 460 487 // do inter modes, SKIP and 2Nx2N 461 488 if( rpcBestCU->getSlice()->getSliceType() != I_SLICE ) -
branches/HTM-DEV-0.3-dev2/source/Lib/TLibEncoder/TEncGOP.cpp
r446 r455 1028 1028 m_storedStartCUAddrForEncodingSliceSegment.push_back(nextCUAddr); 1029 1029 startCUAddrSliceSegmentIdx++; 1030 1030 #if H_3D_NBDV 1031 if(pcSlice->getViewIndex() && !pcSlice->getIsDepth()) //Notes from QC: this condition shall be changed once the configuration is completed, e.g. in pcSlice->getSPS()->getMultiviewMvPredMode() || ARP in prev. HTM. Remove this comment once it is done. 1032 { 1033 Int iColPoc = pcSlice->getRefPOC(RefPicList(1-pcSlice->getColFromL0Flag()), pcSlice->getColRefIdx()); 1034 pcPic->setNumDdvCandPics(pcPic->getDisCandRefPictures(iColPoc)); 1035 } 1036 #endif 1031 1037 while(nextCUAddr<uiRealEndAddress) // determine slice boundaries 1032 1038 {
Note: See TracChangeset for help on using the changeset viewer.