Changeset 854 in 3DVCSoftware for branches/HTM-10.0-dev0/source/Lib/TLibEncoder/TEncSearch.cpp
- Timestamp:
- 13 Feb 2014, 22:58:51 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HTM-10.0-dev0/source/Lib/TLibEncoder/TEncSearch.cpp
r852 r854 3950 3950 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvField( cMvFieldNeighbours[0 + 2*uiMergeCand], ePartSize, uiAbsPartIdx, 0, iPUIdx ); 3951 3951 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField( cMvFieldNeighbours[1 + 2*uiMergeCand], ePartSize, uiAbsPartIdx, 0, iPUIdx ); 3952 3952 3953 #if NTT_STORE_SPDV_VSP_G0148 3953 3954 } … … 4042 4043 m_cYuvPredTemp.clear(); 4043 4044 rpcPredYuv->clear(); 4044 4045 4045 4046 if ( !bUseRes ) 4046 4047 { 4047 4048 rpcResiYuv->clear(); 4048 4049 } 4049 4050 4050 4051 rpcRecoYuv->clear(); 4051 4052 4052 4053 TComMv cMvSrchRngLT; 4053 4054 TComMv cMvSrchRngRB; 4054 4055 4055 4056 TComMv cMvZero; 4056 4057 TComMv TempMv; //kolya 4057 4058 4058 4059 TComMv cMv[2]; 4059 4060 TComMv cMvBi[2]; 4060 4061 TComMv cMvTemp[2][33]; 4061 4062 4062 4063 Int iNumPart = pcCU->getNumPartInter(); 4063 4064 Int iNumPredDir = pcCU->getSlice()->isInterP() ? 1 : 2; 4064 4065 4065 4066 TComMv cMvPred[2][33]; 4066 4067 4067 4068 TComMv cMvPredBi[2][33]; 4068 4069 Int aaiMvpIdxBi[2][33]; 4069 4070 4070 4071 Int aaiMvpIdx[2][33]; 4071 4072 Int aaiMvpNum[2][33]; 4072 4073 4073 4074 AMVPInfo aacAMVPInfo[2][33]; 4074 4075 4075 4076 Int iRefIdx[2]={0,0}; //If un-initialized, may cause SEGV in bi-directional prediction iterative stage. 4076 4077 Int iRefIdxBi[2]; 4077 4078 4078 4079 UInt uiPartAddr; 4079 4080 Int iRoiWidth, iRoiHeight; 4080 4081 4081 4082 UInt uiMbBits[3] = {1, 1, 0}; 4082 4083 4083 4084 UInt uiLastMode = 0; 4084 4085 Int iRefStart, iRefEnd; 4085 4086 4086 4087 PartSize ePartSize = pcCU->getPartitionSize( 0 ); 4087 4088 … … 4110 4111 UInt uiCostBi = MAX_UINT; 4111 4112 UInt uiCostTemp; 4112 4113 4113 4114 UInt uiBits[3]; 4114 4115 UInt uiBitsTemp; … … 4135 4136 4136 4137 xGetBlkBits( ePartSize, pcCU->getSlice()->isInterP(), iPartIdx, uiLastMode, uiMbBits); 4137 4138 4138 4139 pcCU->getPartIndexAndSize( iPartIdx, uiPartAddr, iRoiWidth, iRoiHeight ); 4139 4140 … … 4141 4142 pcCU->setVSPFlagSubParts( 0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr) ); 4142 4143 #endif 4143 4144 4144 4145 #if AMP_MRG 4145 4146 Bool bTestNormalMC = true; … … 4152 4153 bTestNormalMC = false; 4153 4154 } 4154 4155 4155 4156 if (bTestNormalMC) 4156 4157 { 4157 4158 #endif 4158 4159 4159 // Uni-directional prediction 4160 for ( Int iRefList = 0; iRefList < iNumPredDir; iRefList++ ) 4161 { 4160 // Uni-directional prediction 4161 for ( Int iRefList = 0; iRefList < iNumPredDir; iRefList++ ) 4162 { 4163 RefPicList eRefPicList = ( iRefList ? REF_PIC_LIST_1 : REF_PIC_LIST_0 ); 4164 4165 for ( Int iRefIdxTemp = 0; iRefIdxTemp < pcCU->getSlice()->getNumRefIdx(eRefPicList); iRefIdxTemp++ ) 4166 { 4167 uiBitsTemp = uiMbBits[iRefList]; 4168 if ( pcCU->getSlice()->getNumRefIdx(eRefPicList) > 1 ) 4169 { 4170 uiBitsTemp += iRefIdxTemp+1; 4171 if ( iRefIdxTemp == pcCU->getSlice()->getNumRefIdx(eRefPicList)-1 ) uiBitsTemp--; 4172 } 4173 #if ZERO_MVD_EST 4174 xEstimateMvPredAMVP( pcCU, pcOrgYuv, iPartIdx, eRefPicList, iRefIdxTemp, cMvPred[iRefList][iRefIdxTemp], false, &biPDistTemp, &uiZeroMvdDistTemp); 4175 #else 4176 xEstimateMvPredAMVP( pcCU, pcOrgYuv, iPartIdx, eRefPicList, iRefIdxTemp, cMvPred[iRefList][iRefIdxTemp], false, &biPDistTemp); 4177 #endif 4178 aaiMvpIdx[iRefList][iRefIdxTemp] = pcCU->getMVPIdx(eRefPicList, uiPartAddr); 4179 aaiMvpNum[iRefList][iRefIdxTemp] = pcCU->getMVPNum(eRefPicList, uiPartAddr); 4180 4181 if(pcCU->getSlice()->getMvdL1ZeroFlag() && iRefList==1 && biPDistTemp < bestBiPDist) 4182 { 4183 bestBiPDist = biPDistTemp; 4184 bestBiPMvpL1 = aaiMvpIdx[iRefList][iRefIdxTemp]; 4185 bestBiPRefIdxL1 = iRefIdxTemp; 4186 } 4187 4188 uiBitsTemp += m_auiMVPIdxCost[aaiMvpIdx[iRefList][iRefIdxTemp]][AMVP_MAX_NUM_CANDS]; 4189 #if ZERO_MVD_EST 4190 if ( iRefList == 0 || pcCU->getSlice()->getList1IdxToList0Idx( iRefIdxTemp ) < 0 ) 4191 { 4192 uiZeroMvdBitsTemp = uiBitsTemp; 4193 uiZeroMvdBitsTemp += 2; //zero mvd bits 4194 4195 m_pcRdCost->getMotionCost( 1, 0 ); 4196 uiZeroMvdCostTemp = uiZeroMvdDistTemp + m_pcRdCost->getCost(uiZeroMvdBitsTemp); 4197 4198 if (uiZeroMvdCostTemp < uiZeroMvdCost) 4199 { 4200 uiZeroMvdCost = uiZeroMvdCostTemp; 4201 iZeroMvdDir = iRefList + 1; 4202 aiZeroMvdRefIdx[iRefList] = iRefIdxTemp; 4203 aiZeroMvdMvpIdx[iRefList] = aaiMvpIdx[iRefList][iRefIdxTemp]; 4204 auiZeroMvdBits[iRefList] = uiZeroMvdBitsTemp; 4205 } 4206 } 4207 #endif 4208 4209 #if GPB_SIMPLE_UNI 4210 if ( iRefList == 1 ) // list 1 4211 { 4212 if ( pcCU->getSlice()->getList1IdxToList0Idx( iRefIdxTemp ) >= 0 ) 4213 { 4214 cMvTemp[1][iRefIdxTemp] = cMvTemp[0][pcCU->getSlice()->getList1IdxToList0Idx( iRefIdxTemp )]; 4215 uiCostTemp = uiCostTempL0[pcCU->getSlice()->getList1IdxToList0Idx( iRefIdxTemp )]; 4216 /*first subtract the bit-rate part of the cost of the other list*/ 4217 uiCostTemp -= m_pcRdCost->getCost( uiBitsTempL0[pcCU->getSlice()->getList1IdxToList0Idx( iRefIdxTemp )] ); 4218 /*correct the bit-rate part of the current ref*/ 4219 m_pcRdCost->setPredictor ( cMvPred[iRefList][iRefIdxTemp] ); 4220 uiBitsTemp += m_pcRdCost->getBits( cMvTemp[1][iRefIdxTemp].getHor(), cMvTemp[1][iRefIdxTemp].getVer() ); 4221 /*calculate the correct cost*/ 4222 uiCostTemp += m_pcRdCost->getCost( uiBitsTemp ); 4223 } 4224 else 4225 { 4226 xMotionEstimation ( pcCU, pcOrgYuv, iPartIdx, eRefPicList, &cMvPred[iRefList][iRefIdxTemp], iRefIdxTemp, cMvTemp[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp ); 4227 } 4228 } 4229 else 4230 { 4231 xMotionEstimation ( pcCU, pcOrgYuv, iPartIdx, eRefPicList, &cMvPred[iRefList][iRefIdxTemp], iRefIdxTemp, cMvTemp[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp ); 4232 } 4233 #else 4234 xMotionEstimation ( pcCU, pcOrgYuv, iPartIdx, eRefPicList, &cMvPred[iRefList][iRefIdxTemp], iRefIdxTemp, cMvTemp[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp ); 4235 #endif 4236 xCopyAMVPInfo(pcCU->getCUMvField(eRefPicList)->getAMVPInfo(), &aacAMVPInfo[iRefList][iRefIdxTemp]); // must always be done ( also when AMVP_MODE = AM_NONE ) 4237 xCheckBestMVP(pcCU, eRefPicList, cMvTemp[iRefList][iRefIdxTemp], cMvPred[iRefList][iRefIdxTemp], aaiMvpIdx[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp); 4238 4239 if ( iRefList == 0 ) 4240 { 4241 uiCostTempL0[iRefIdxTemp] = uiCostTemp; 4242 uiBitsTempL0[iRefIdxTemp] = uiBitsTemp; 4243 } 4244 if ( uiCostTemp < uiCost[iRefList] ) 4245 { 4246 uiCost[iRefList] = uiCostTemp; 4247 uiBits[iRefList] = uiBitsTemp; // storing for bi-prediction 4248 4249 // set motion 4250 cMv[iRefList] = cMvTemp[iRefList][iRefIdxTemp]; 4251 iRefIdx[iRefList] = iRefIdxTemp; 4252 } 4253 4254 if ( iRefList == 1 && uiCostTemp < costValidList1 && pcCU->getSlice()->getList1IdxToList0Idx( iRefIdxTemp ) < 0 ) 4255 { 4256 costValidList1 = uiCostTemp; 4257 bitsValidList1 = uiBitsTemp; 4258 4259 // set motion 4260 mvValidList1 = cMvTemp[iRefList][iRefIdxTemp]; 4261 refIdxValidList1 = iRefIdxTemp; 4262 } 4263 } 4264 } 4265 // Bi-directional prediction 4266 if ( (pcCU->getSlice()->isInterB()) && (pcCU->isBipredRestriction(iPartIdx) == false) ) 4267 { 4268 4269 cMvBi[0] = cMv[0]; cMvBi[1] = cMv[1]; 4270 iRefIdxBi[0] = iRefIdx[0]; iRefIdxBi[1] = iRefIdx[1]; 4271 4272 ::memcpy(cMvPredBi, cMvPred, sizeof(cMvPred)); 4273 ::memcpy(aaiMvpIdxBi, aaiMvpIdx, sizeof(aaiMvpIdx)); 4274 4275 UInt uiMotBits[2]; 4276 4277 if(pcCU->getSlice()->getMvdL1ZeroFlag()) 4278 { 4279 xCopyAMVPInfo(&aacAMVPInfo[1][bestBiPRefIdxL1], pcCU->getCUMvField(REF_PIC_LIST_1)->getAMVPInfo()); 4280 pcCU->setMVPIdxSubParts( bestBiPMvpL1, REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4281 aaiMvpIdxBi[1][bestBiPRefIdxL1] = bestBiPMvpL1; 4282 cMvPredBi[1][bestBiPRefIdxL1] = pcCU->getCUMvField(REF_PIC_LIST_1)->getAMVPInfo()->m_acMvCand[bestBiPMvpL1]; 4283 4284 cMvBi[1] = cMvPredBi[1][bestBiPRefIdxL1]; 4285 iRefIdxBi[1] = bestBiPRefIdxL1; 4286 pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMv( cMvBi[1], ePartSize, uiPartAddr, 0, iPartIdx ); 4287 pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllRefIdx( iRefIdxBi[1], ePartSize, uiPartAddr, 0, iPartIdx ); 4288 TComYuv* pcYuvPred = &m_acYuvPred[1]; 4289 motionCompensation( pcCU, pcYuvPred, REF_PIC_LIST_1, iPartIdx ); 4290 4291 uiMotBits[0] = uiBits[0] - uiMbBits[0]; 4292 uiMotBits[1] = uiMbBits[1]; 4293 4294 if ( pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_1) > 1 ) 4295 { 4296 uiMotBits[1] += bestBiPRefIdxL1+1; 4297 if ( bestBiPRefIdxL1 == pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_1)-1 ) uiMotBits[1]--; 4298 } 4299 4300 uiMotBits[1] += m_auiMVPIdxCost[aaiMvpIdxBi[1][bestBiPRefIdxL1]][AMVP_MAX_NUM_CANDS]; 4301 4302 uiBits[2] = uiMbBits[2] + uiMotBits[0] + uiMotBits[1]; 4303 4304 cMvTemp[1][bestBiPRefIdxL1] = cMvBi[1]; 4305 } 4306 else 4307 { 4308 uiMotBits[0] = uiBits[0] - uiMbBits[0]; 4309 uiMotBits[1] = uiBits[1] - uiMbBits[1]; 4310 uiBits[2] = uiMbBits[2] + uiMotBits[0] + uiMotBits[1]; 4311 } 4312 4313 // 4-times iteration (default) 4314 Int iNumIter = 4; 4315 4316 // fast encoder setting: only one iteration 4317 if ( m_pcEncCfg->getUseFastEnc() || pcCU->getSlice()->getMvdL1ZeroFlag()) 4318 { 4319 iNumIter = 1; 4320 } 4321 4322 for ( Int iIter = 0; iIter < iNumIter; iIter++ ) 4323 { 4324 4325 Int iRefList = iIter % 2; 4326 if ( m_pcEncCfg->getUseFastEnc() ) 4327 { 4328 if( uiCost[0] <= uiCost[1] ) 4329 { 4330 iRefList = 1; 4331 } 4332 else 4333 { 4334 iRefList = 0; 4335 } 4336 } 4337 else if ( iIter == 0 ) 4338 { 4339 iRefList = 0; 4340 } 4341 if ( iIter == 0 && !pcCU->getSlice()->getMvdL1ZeroFlag()) 4342 { 4343 pcCU->getCUMvField(RefPicList(1-iRefList))->setAllMv( cMv[1-iRefList], ePartSize, uiPartAddr, 0, iPartIdx ); 4344 pcCU->getCUMvField(RefPicList(1-iRefList))->setAllRefIdx( iRefIdx[1-iRefList], ePartSize, uiPartAddr, 0, iPartIdx ); 4345 TComYuv* pcYuvPred = &m_acYuvPred[1-iRefList]; 4346 motionCompensation ( pcCU, pcYuvPred, RefPicList(1-iRefList), iPartIdx ); 4347 } 4162 4348 RefPicList eRefPicList = ( iRefList ? REF_PIC_LIST_1 : REF_PIC_LIST_0 ); 4163 4349 4164 for ( Int iRefIdxTemp = 0; iRefIdxTemp < pcCU->getSlice()->getNumRefIdx(eRefPicList); iRefIdxTemp++ ) 4165 { 4166 uiBitsTemp = uiMbBits[iRefList]; 4350 if(pcCU->getSlice()->getMvdL1ZeroFlag()) 4351 { 4352 iRefList = 0; 4353 eRefPicList = REF_PIC_LIST_0; 4354 } 4355 4356 Bool bChanged = false; 4357 4358 iRefStart = 0; 4359 iRefEnd = pcCU->getSlice()->getNumRefIdx(eRefPicList)-1; 4360 4361 for ( Int iRefIdxTemp = iRefStart; iRefIdxTemp <= iRefEnd; iRefIdxTemp++ ) 4362 { 4363 uiBitsTemp = uiMbBits[2] + uiMotBits[1-iRefList]; 4167 4364 if ( pcCU->getSlice()->getNumRefIdx(eRefPicList) > 1 ) 4168 4365 { … … 4170 4367 if ( iRefIdxTemp == pcCU->getSlice()->getNumRefIdx(eRefPicList)-1 ) uiBitsTemp--; 4171 4368 } 4369 uiBitsTemp += m_auiMVPIdxCost[aaiMvpIdxBi[iRefList][iRefIdxTemp]][AMVP_MAX_NUM_CANDS]; 4370 // call ME 4371 xMotionEstimation ( pcCU, pcOrgYuv, iPartIdx, eRefPicList, &cMvPredBi[iRefList][iRefIdxTemp], iRefIdxTemp, cMvTemp[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp, true ); 4372 xCopyAMVPInfo(&aacAMVPInfo[iRefList][iRefIdxTemp], pcCU->getCUMvField(eRefPicList)->getAMVPInfo()); 4373 xCheckBestMVP(pcCU, eRefPicList, cMvTemp[iRefList][iRefIdxTemp], cMvPredBi[iRefList][iRefIdxTemp], aaiMvpIdxBi[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp); 4374 4375 if ( uiCostTemp < uiCostBi ) 4376 { 4377 bChanged = true; 4378 4379 cMvBi[iRefList] = cMvTemp[iRefList][iRefIdxTemp]; 4380 iRefIdxBi[iRefList] = iRefIdxTemp; 4381 4382 uiCostBi = uiCostTemp; 4383 uiMotBits[iRefList] = uiBitsTemp - uiMbBits[2] - uiMotBits[1-iRefList]; 4384 uiBits[2] = uiBitsTemp; 4385 4386 if(iNumIter!=1) 4387 { 4388 // Set motion 4389 pcCU->getCUMvField( eRefPicList )->setAllMv( cMvBi[iRefList], ePartSize, uiPartAddr, 0, iPartIdx ); 4390 pcCU->getCUMvField( eRefPicList )->setAllRefIdx( iRefIdxBi[iRefList], ePartSize, uiPartAddr, 0, iPartIdx ); 4391 4392 TComYuv* pcYuvPred = &m_acYuvPred[iRefList]; 4393 motionCompensation( pcCU, pcYuvPred, eRefPicList, iPartIdx ); 4394 } 4395 } 4396 } // for loop-iRefIdxTemp 4397 4398 if ( !bChanged ) 4399 { 4400 if ( uiCostBi <= uiCost[0] && uiCostBi <= uiCost[1] ) 4401 { 4402 xCopyAMVPInfo(&aacAMVPInfo[0][iRefIdxBi[0]], pcCU->getCUMvField(REF_PIC_LIST_0)->getAMVPInfo()); 4403 xCheckBestMVP(pcCU, REF_PIC_LIST_0, cMvBi[0], cMvPredBi[0][iRefIdxBi[0]], aaiMvpIdxBi[0][iRefIdxBi[0]], uiBits[2], uiCostBi); 4404 if(!pcCU->getSlice()->getMvdL1ZeroFlag()) 4405 { 4406 xCopyAMVPInfo(&aacAMVPInfo[1][iRefIdxBi[1]], pcCU->getCUMvField(REF_PIC_LIST_1)->getAMVPInfo()); 4407 xCheckBestMVP(pcCU, REF_PIC_LIST_1, cMvBi[1], cMvPredBi[1][iRefIdxBi[1]], aaiMvpIdxBi[1][iRefIdxBi[1]], uiBits[2], uiCostBi); 4408 } 4409 } 4410 break; 4411 } 4412 } // for loop-iter 4413 } // if (B_SLICE) 4172 4414 #if ZERO_MVD_EST 4173 xEstimateMvPredAMVP( pcCU, pcOrgYuv, iPartIdx, eRefPicList, iRefIdxTemp, cMvPred[iRefList][iRefIdxTemp], false, &biPDistTemp, &uiZeroMvdDistTemp); 4174 #else 4175 xEstimateMvPredAMVP( pcCU, pcOrgYuv, iPartIdx, eRefPicList, iRefIdxTemp, cMvPred[iRefList][iRefIdxTemp], false, &biPDistTemp); 4176 #endif 4177 aaiMvpIdx[iRefList][iRefIdxTemp] = pcCU->getMVPIdx(eRefPicList, uiPartAddr); 4178 aaiMvpNum[iRefList][iRefIdxTemp] = pcCU->getMVPNum(eRefPicList, uiPartAddr); 4179 4180 if(pcCU->getSlice()->getMvdL1ZeroFlag() && iRefList==1 && biPDistTemp < bestBiPDist) 4415 if ( (pcCU->getSlice()->isInterB()) && (pcCU->isBipredRestriction(iPartIdx) == false) ) 4416 { 4417 m_pcRdCost->getMotionCost( 1, 0 ); 4418 4419 for ( Int iL0RefIdxTemp = 0; iL0RefIdxTemp <= pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_0)-1; iL0RefIdxTemp++ ) 4420 for ( Int iL1RefIdxTemp = 0; iL1RefIdxTemp <= pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_1)-1; iL1RefIdxTemp++ ) 4421 { 4422 UInt uiRefIdxBitsTemp = 0; 4423 if ( pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_0) > 1 ) 4424 { 4425 uiRefIdxBitsTemp += iL0RefIdxTemp+1; 4426 if ( iL0RefIdxTemp == pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_0)-1 ) uiRefIdxBitsTemp--; 4427 } 4428 if ( pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_1) > 1 ) 4429 { 4430 uiRefIdxBitsTemp += iL1RefIdxTemp+1; 4431 if ( iL1RefIdxTemp == pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_1)-1 ) uiRefIdxBitsTemp--; 4432 } 4433 4434 Int iL0MVPIdx = 0; 4435 Int iL1MVPIdx = 0; 4436 4437 for (iL0MVPIdx = 0; iL0MVPIdx < aaiMvpNum[0][iL0RefIdxTemp]; iL0MVPIdx++) 4438 { 4439 for (iL1MVPIdx = 0; iL1MVPIdx < aaiMvpNum[1][iL1RefIdxTemp]; iL1MVPIdx++) 4181 4440 { 4182 bestBiPDist = biPDistTemp; 4183 bestBiPMvpL1 = aaiMvpIdx[iRefList][iRefIdxTemp]; 4184 bestBiPRefIdxL1 = iRefIdxTemp; 4185 } 4186 4187 uiBitsTemp += m_auiMVPIdxCost[aaiMvpIdx[iRefList][iRefIdxTemp]][AMVP_MAX_NUM_CANDS]; 4188 #if ZERO_MVD_EST 4189 if ( iRefList == 0 || pcCU->getSlice()->getList1IdxToList0Idx( iRefIdxTemp ) < 0 ) 4190 { 4191 uiZeroMvdBitsTemp = uiBitsTemp; 4192 uiZeroMvdBitsTemp += 2; //zero mvd bits 4193 4194 m_pcRdCost->getMotionCost( 1, 0 ); 4195 uiZeroMvdCostTemp = uiZeroMvdDistTemp + m_pcRdCost->getCost(uiZeroMvdBitsTemp); 4196 4441 uiZeroMvdBitsTemp = uiRefIdxBitsTemp; 4442 uiZeroMvdBitsTemp += uiMbBits[2]; 4443 uiZeroMvdBitsTemp += m_auiMVPIdxCost[iL0MVPIdx][aaiMvpNum[0][iL0RefIdxTemp]] + m_auiMVPIdxCost[iL1MVPIdx][aaiMvpNum[1][iL1RefIdxTemp]]; 4444 uiZeroMvdBitsTemp += 4; //zero mvd for both directions 4445 pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvField( aacAMVPInfo[0][iL0RefIdxTemp].m_acMvCand[iL0MVPIdx], iL0RefIdxTemp, ePartSize, uiPartAddr, iPartIdx, 0 ); 4446 pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( aacAMVPInfo[1][iL1RefIdxTemp].m_acMvCand[iL1MVPIdx], iL1RefIdxTemp, ePartSize, uiPartAddr, iPartIdx, 0 ); 4447 4448 xGetInterPredictionError( pcCU, pcOrgYuv, iPartIdx, uiZeroMvdDistTemp, m_pcEncCfg->getUseHADME() ); 4449 uiZeroMvdCostTemp = uiZeroMvdDistTemp + m_pcRdCost->getCost( uiZeroMvdBitsTemp ); 4197 4450 if (uiZeroMvdCostTemp < uiZeroMvdCost) 4198 4451 { 4199 4452 uiZeroMvdCost = uiZeroMvdCostTemp; 4200 iZeroMvdDir = iRefList + 1; 4201 aiZeroMvdRefIdx[iRefList] = iRefIdxTemp; 4202 aiZeroMvdMvpIdx[iRefList] = aaiMvpIdx[iRefList][iRefIdxTemp]; 4203 auiZeroMvdBits[iRefList] = uiZeroMvdBitsTemp; 4204 } 4205 } 4206 #endif 4207 4208 #if GPB_SIMPLE_UNI 4209 if ( iRefList == 1 ) // list 1 4210 { 4211 if ( pcCU->getSlice()->getList1IdxToList0Idx( iRefIdxTemp ) >= 0 ) 4212 { 4213 cMvTemp[1][iRefIdxTemp] = cMvTemp[0][pcCU->getSlice()->getList1IdxToList0Idx( iRefIdxTemp )]; 4214 uiCostTemp = uiCostTempL0[pcCU->getSlice()->getList1IdxToList0Idx( iRefIdxTemp )]; 4215 /*first subtract the bit-rate part of the cost of the other list*/ 4216 uiCostTemp -= m_pcRdCost->getCost( uiBitsTempL0[pcCU->getSlice()->getList1IdxToList0Idx( iRefIdxTemp )] ); 4217 /*correct the bit-rate part of the current ref*/ 4218 m_pcRdCost->setPredictor ( cMvPred[iRefList][iRefIdxTemp] ); 4219 uiBitsTemp += m_pcRdCost->getBits( cMvTemp[1][iRefIdxTemp].getHor(), cMvTemp[1][iRefIdxTemp].getVer() ); 4220 /*calculate the correct cost*/ 4221 uiCostTemp += m_pcRdCost->getCost( uiBitsTemp ); 4222 } 4223 else 4224 { 4225 xMotionEstimation ( pcCU, pcOrgYuv, iPartIdx, eRefPicList, &cMvPred[iRefList][iRefIdxTemp], iRefIdxTemp, cMvTemp[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp ); 4453 iZeroMvdDir = 3; 4454 aiZeroMvdMvpIdx[0] = iL0MVPIdx; 4455 aiZeroMvdMvpIdx[1] = iL1MVPIdx; 4456 aiZeroMvdRefIdx[0] = iL0RefIdxTemp; 4457 aiZeroMvdRefIdx[1] = iL1RefIdxTemp; 4458 auiZeroMvdBits[2] = uiZeroMvdBitsTemp; 4226 4459 } 4227 4460 } 4228 else 4229 { 4230 xMotionEstimation ( pcCU, pcOrgYuv, iPartIdx, eRefPicList, &cMvPred[iRefList][iRefIdxTemp], iRefIdxTemp, cMvTemp[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp ); 4231 } 4232 #else 4233 xMotionEstimation ( pcCU, pcOrgYuv, iPartIdx, eRefPicList, &cMvPred[iRefList][iRefIdxTemp], iRefIdxTemp, cMvTemp[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp ); 4234 #endif 4235 xCopyAMVPInfo(pcCU->getCUMvField(eRefPicList)->getAMVPInfo(), &aacAMVPInfo[iRefList][iRefIdxTemp]); // must always be done ( also when AMVP_MODE = AM_NONE ) 4236 xCheckBestMVP(pcCU, eRefPicList, cMvTemp[iRefList][iRefIdxTemp], cMvPred[iRefList][iRefIdxTemp], aaiMvpIdx[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp); 4237 4238 if ( iRefList == 0 ) 4239 { 4240 uiCostTempL0[iRefIdxTemp] = uiCostTemp; 4241 uiBitsTempL0[iRefIdxTemp] = uiBitsTemp; 4242 } 4243 if ( uiCostTemp < uiCost[iRefList] ) 4244 { 4245 uiCost[iRefList] = uiCostTemp; 4246 uiBits[iRefList] = uiBitsTemp; // storing for bi-prediction 4247 4248 // set motion 4249 cMv[iRefList] = cMvTemp[iRefList][iRefIdxTemp]; 4250 iRefIdx[iRefList] = iRefIdxTemp; 4251 } 4252 4253 if ( iRefList == 1 && uiCostTemp < costValidList1 && pcCU->getSlice()->getList1IdxToList0Idx( iRefIdxTemp ) < 0 ) 4254 { 4255 costValidList1 = uiCostTemp; 4256 bitsValidList1 = uiBitsTemp; 4257 4258 // set motion 4259 mvValidList1 = cMvTemp[iRefList][iRefIdxTemp]; 4260 refIdxValidList1 = iRefIdxTemp; 4261 } 4262 } 4263 } 4264 // Bi-directional prediction 4265 if ( (pcCU->getSlice()->isInterB()) && (pcCU->isBipredRestriction(iPartIdx) == false) ) 4266 { 4267 4268 cMvBi[0] = cMv[0]; cMvBi[1] = cMv[1]; 4269 iRefIdxBi[0] = iRefIdx[0]; iRefIdxBi[1] = iRefIdx[1]; 4270 4271 ::memcpy(cMvPredBi, cMvPred, sizeof(cMvPred)); 4272 ::memcpy(aaiMvpIdxBi, aaiMvpIdx, sizeof(aaiMvpIdx)); 4273 4274 UInt uiMotBits[2]; 4275 4276 if(pcCU->getSlice()->getMvdL1ZeroFlag()) 4277 { 4278 xCopyAMVPInfo(&aacAMVPInfo[1][bestBiPRefIdxL1], pcCU->getCUMvField(REF_PIC_LIST_1)->getAMVPInfo()); 4279 pcCU->setMVPIdxSubParts( bestBiPMvpL1, REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4280 aaiMvpIdxBi[1][bestBiPRefIdxL1] = bestBiPMvpL1; 4281 cMvPredBi[1][bestBiPRefIdxL1] = pcCU->getCUMvField(REF_PIC_LIST_1)->getAMVPInfo()->m_acMvCand[bestBiPMvpL1]; 4282 4283 cMvBi[1] = cMvPredBi[1][bestBiPRefIdxL1]; 4284 iRefIdxBi[1] = bestBiPRefIdxL1; 4285 pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMv( cMvBi[1], ePartSize, uiPartAddr, 0, iPartIdx ); 4286 pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllRefIdx( iRefIdxBi[1], ePartSize, uiPartAddr, 0, iPartIdx ); 4287 TComYuv* pcYuvPred = &m_acYuvPred[1]; 4288 motionCompensation( pcCU, pcYuvPred, REF_PIC_LIST_1, iPartIdx ); 4289 4290 uiMotBits[0] = uiBits[0] - uiMbBits[0]; 4291 uiMotBits[1] = uiMbBits[1]; 4292 4293 if ( pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_1) > 1 ) 4294 { 4295 uiMotBits[1] += bestBiPRefIdxL1+1; 4296 if ( bestBiPRefIdxL1 == pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_1)-1 ) uiMotBits[1]--; 4297 } 4298 4299 uiMotBits[1] += m_auiMVPIdxCost[aaiMvpIdxBi[1][bestBiPRefIdxL1]][AMVP_MAX_NUM_CANDS]; 4300 4301 uiBits[2] = uiMbBits[2] + uiMotBits[0] + uiMotBits[1]; 4302 4303 cMvTemp[1][bestBiPRefIdxL1] = cMvBi[1]; 4304 } 4305 else 4306 { 4307 uiMotBits[0] = uiBits[0] - uiMbBits[0]; 4308 uiMotBits[1] = uiBits[1] - uiMbBits[1]; 4309 uiBits[2] = uiMbBits[2] + uiMotBits[0] + uiMotBits[1]; 4310 } 4311 4312 // 4-times iteration (default) 4313 Int iNumIter = 4; 4314 4315 // fast encoder setting: only one iteration 4316 if ( m_pcEncCfg->getUseFastEnc() || pcCU->getSlice()->getMvdL1ZeroFlag()) 4317 { 4318 iNumIter = 1; 4319 } 4320 4321 for ( Int iIter = 0; iIter < iNumIter; iIter++ ) 4322 { 4323 4324 Int iRefList = iIter % 2; 4325 if ( m_pcEncCfg->getUseFastEnc() ) 4326 { 4327 if( uiCost[0] <= uiCost[1] ) 4328 { 4329 iRefList = 1; 4330 } 4331 else 4332 { 4333 iRefList = 0; 4334 } 4335 } 4336 else if ( iIter == 0 ) 4337 { 4338 iRefList = 0; 4339 } 4340 if ( iIter == 0 && !pcCU->getSlice()->getMvdL1ZeroFlag()) 4341 { 4342 pcCU->getCUMvField(RefPicList(1-iRefList))->setAllMv( cMv[1-iRefList], ePartSize, uiPartAddr, 0, iPartIdx ); 4343 pcCU->getCUMvField(RefPicList(1-iRefList))->setAllRefIdx( iRefIdx[1-iRefList], ePartSize, uiPartAddr, 0, iPartIdx ); 4344 TComYuv* pcYuvPred = &m_acYuvPred[1-iRefList]; 4345 motionCompensation ( pcCU, pcYuvPred, RefPicList(1-iRefList), iPartIdx ); 4346 } 4347 RefPicList eRefPicList = ( iRefList ? REF_PIC_LIST_1 : REF_PIC_LIST_0 ); 4348 4349 if(pcCU->getSlice()->getMvdL1ZeroFlag()) 4350 { 4351 iRefList = 0; 4352 eRefPicList = REF_PIC_LIST_0; 4353 } 4354 4355 Bool bChanged = false; 4356 4357 iRefStart = 0; 4358 iRefEnd = pcCU->getSlice()->getNumRefIdx(eRefPicList)-1; 4359 4360 for ( Int iRefIdxTemp = iRefStart; iRefIdxTemp <= iRefEnd; iRefIdxTemp++ ) 4361 { 4362 uiBitsTemp = uiMbBits[2] + uiMotBits[1-iRefList]; 4363 if ( pcCU->getSlice()->getNumRefIdx(eRefPicList) > 1 ) 4364 { 4365 uiBitsTemp += iRefIdxTemp+1; 4366 if ( iRefIdxTemp == pcCU->getSlice()->getNumRefIdx(eRefPicList)-1 ) uiBitsTemp--; 4367 } 4368 uiBitsTemp += m_auiMVPIdxCost[aaiMvpIdxBi[iRefList][iRefIdxTemp]][AMVP_MAX_NUM_CANDS]; 4369 // call ME 4370 xMotionEstimation ( pcCU, pcOrgYuv, iPartIdx, eRefPicList, &cMvPredBi[iRefList][iRefIdxTemp], iRefIdxTemp, cMvTemp[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp, true ); 4371 xCopyAMVPInfo(&aacAMVPInfo[iRefList][iRefIdxTemp], pcCU->getCUMvField(eRefPicList)->getAMVPInfo()); 4372 xCheckBestMVP(pcCU, eRefPicList, cMvTemp[iRefList][iRefIdxTemp], cMvPredBi[iRefList][iRefIdxTemp], aaiMvpIdxBi[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp); 4373 4374 if ( uiCostTemp < uiCostBi ) 4375 { 4376 bChanged = true; 4377 4378 cMvBi[iRefList] = cMvTemp[iRefList][iRefIdxTemp]; 4379 iRefIdxBi[iRefList] = iRefIdxTemp; 4380 4381 uiCostBi = uiCostTemp; 4382 uiMotBits[iRefList] = uiBitsTemp - uiMbBits[2] - uiMotBits[1-iRefList]; 4383 uiBits[2] = uiBitsTemp; 4384 4385 if(iNumIter!=1) 4386 { 4387 // Set motion 4388 pcCU->getCUMvField( eRefPicList )->setAllMv( cMvBi[iRefList], ePartSize, uiPartAddr, 0, iPartIdx ); 4389 pcCU->getCUMvField( eRefPicList )->setAllRefIdx( iRefIdxBi[iRefList], ePartSize, uiPartAddr, 0, iPartIdx ); 4390 4391 TComYuv* pcYuvPred = &m_acYuvPred[iRefList]; 4392 motionCompensation( pcCU, pcYuvPred, eRefPicList, iPartIdx ); 4393 } 4394 } 4395 } // for loop-iRefIdxTemp 4396 4397 if ( !bChanged ) 4398 { 4399 if ( uiCostBi <= uiCost[0] && uiCostBi <= uiCost[1] ) 4400 { 4401 xCopyAMVPInfo(&aacAMVPInfo[0][iRefIdxBi[0]], pcCU->getCUMvField(REF_PIC_LIST_0)->getAMVPInfo()); 4402 xCheckBestMVP(pcCU, REF_PIC_LIST_0, cMvBi[0], cMvPredBi[0][iRefIdxBi[0]], aaiMvpIdxBi[0][iRefIdxBi[0]], uiBits[2], uiCostBi); 4403 if(!pcCU->getSlice()->getMvdL1ZeroFlag()) 4404 { 4405 xCopyAMVPInfo(&aacAMVPInfo[1][iRefIdxBi[1]], pcCU->getCUMvField(REF_PIC_LIST_1)->getAMVPInfo()); 4406 xCheckBestMVP(pcCU, REF_PIC_LIST_1, cMvBi[1], cMvPredBi[1][iRefIdxBi[1]], aaiMvpIdxBi[1][iRefIdxBi[1]], uiBits[2], uiCostBi); 4407 } 4408 } 4409 break; 4410 } 4411 } // for loop-iter 4412 } // if (B_SLICE) 4413 #if ZERO_MVD_EST 4414 if ( (pcCU->getSlice()->isInterB()) && (pcCU->isBipredRestriction(iPartIdx) == false) ) 4415 { 4416 m_pcRdCost->getMotionCost( 1, 0 ); 4417 4418 for ( Int iL0RefIdxTemp = 0; iL0RefIdxTemp <= pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_0)-1; iL0RefIdxTemp++ ) 4419 for ( Int iL1RefIdxTemp = 0; iL1RefIdxTemp <= pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_1)-1; iL1RefIdxTemp++ ) 4420 { 4421 UInt uiRefIdxBitsTemp = 0; 4422 if ( pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_0) > 1 ) 4423 { 4424 uiRefIdxBitsTemp += iL0RefIdxTemp+1; 4425 if ( iL0RefIdxTemp == pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_0)-1 ) uiRefIdxBitsTemp--; 4426 } 4427 if ( pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_1) > 1 ) 4428 { 4429 uiRefIdxBitsTemp += iL1RefIdxTemp+1; 4430 if ( iL1RefIdxTemp == pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_1)-1 ) uiRefIdxBitsTemp--; 4431 } 4432 4433 Int iL0MVPIdx = 0; 4434 Int iL1MVPIdx = 0; 4435 4436 for (iL0MVPIdx = 0; iL0MVPIdx < aaiMvpNum[0][iL0RefIdxTemp]; iL0MVPIdx++) 4437 { 4438 for (iL1MVPIdx = 0; iL1MVPIdx < aaiMvpNum[1][iL1RefIdxTemp]; iL1MVPIdx++) 4439 { 4440 uiZeroMvdBitsTemp = uiRefIdxBitsTemp; 4441 uiZeroMvdBitsTemp += uiMbBits[2]; 4442 uiZeroMvdBitsTemp += m_auiMVPIdxCost[iL0MVPIdx][aaiMvpNum[0][iL0RefIdxTemp]] + m_auiMVPIdxCost[iL1MVPIdx][aaiMvpNum[1][iL1RefIdxTemp]]; 4443 uiZeroMvdBitsTemp += 4; //zero mvd for both directions 4444 pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvField( aacAMVPInfo[0][iL0RefIdxTemp].m_acMvCand[iL0MVPIdx], iL0RefIdxTemp, ePartSize, uiPartAddr, iPartIdx, 0 ); 4445 pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( aacAMVPInfo[1][iL1RefIdxTemp].m_acMvCand[iL1MVPIdx], iL1RefIdxTemp, ePartSize, uiPartAddr, iPartIdx, 0 ); 4446 4447 xGetInterPredictionError( pcCU, pcOrgYuv, iPartIdx, uiZeroMvdDistTemp, m_pcEncCfg->getUseHADME() ); 4448 uiZeroMvdCostTemp = uiZeroMvdDistTemp + m_pcRdCost->getCost( uiZeroMvdBitsTemp ); 4449 if (uiZeroMvdCostTemp < uiZeroMvdCost) 4450 { 4451 uiZeroMvdCost = uiZeroMvdCostTemp; 4452 iZeroMvdDir = 3; 4453 aiZeroMvdMvpIdx[0] = iL0MVPIdx; 4454 aiZeroMvdMvpIdx[1] = iL1MVPIdx; 4455 aiZeroMvdRefIdx[0] = iL0RefIdxTemp; 4456 aiZeroMvdRefIdx[1] = iL1RefIdxTemp; 4457 auiZeroMvdBits[2] = uiZeroMvdBitsTemp; 4458 } 4459 } 4460 } 4461 } 4462 } 4461 } 4462 } 4463 } 4463 4464 #endif 4464 4465 … … 4476 4477 pcCU->setMVPIdxSubParts( -1, REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4477 4478 pcCU->setMVPNumSubParts( -1, REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4478 4479 4479 4480 UInt uiMEBits = 0; 4480 4481 // Set Motion Field_ … … 4488 4489 #endif 4489 4490 #if ZERO_MVD_EST 4490 if (uiZeroMvdCost <= uiCostBi && uiZeroMvdCost <= uiCost[0] && uiZeroMvdCost <= uiCost[1]) 4491 { 4492 if (iZeroMvdDir == 3) 4493 { 4494 uiLastMode = 2; 4495 4496 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvField( aacAMVPInfo[0][aiZeroMvdRefIdx[0]].m_acMvCand[aiZeroMvdMvpIdx[0]], aiZeroMvdRefIdx[0], ePartSize, uiPartAddr, iPartIdx, 0 ); 4497 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField( aacAMVPInfo[1][aiZeroMvdRefIdx[1]].m_acMvCand[aiZeroMvdMvpIdx[1]], aiZeroMvdRefIdx[1], ePartSize, uiPartAddr, iPartIdx, 0 ); 4498 4499 pcCU->setInterDirSubParts( 3, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 4500 4501 pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[0], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4502 pcCU->setMVPNumSubParts( aaiMvpNum[0][aiZeroMvdRefIdx[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4503 pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[1], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4504 pcCU->setMVPNumSubParts( aaiMvpNum[1][aiZeroMvdRefIdx[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4505 uiMEBits = auiZeroMvdBits[2]; 4506 } 4507 else if (iZeroMvdDir == 1) 4508 { 4509 uiLastMode = 0; 4510 4511 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvField( aacAMVPInfo[0][aiZeroMvdRefIdx[0]].m_acMvCand[aiZeroMvdMvpIdx[0]], aiZeroMvdRefIdx[0], ePartSize, uiPartAddr, iPartIdx, 0 ); 4512 4513 pcCU->setInterDirSubParts( 1, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 4514 4515 pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[0], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4516 pcCU->setMVPNumSubParts( aaiMvpNum[0][aiZeroMvdRefIdx[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4517 uiMEBits = auiZeroMvdBits[0]; 4518 } 4519 else if (iZeroMvdDir == 2) 4520 { 4521 uiLastMode = 1; 4522 4523 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField( aacAMVPInfo[1][aiZeroMvdRefIdx[1]].m_acMvCand[aiZeroMvdMvpIdx[1]], aiZeroMvdRefIdx[1], ePartSize, uiPartAddr, iPartIdx, 0 ); 4524 4525 pcCU->setInterDirSubParts( 2, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 4526 4527 pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[1], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4528 pcCU->setMVPNumSubParts( aaiMvpNum[1][aiZeroMvdRefIdx[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4529 uiMEBits = auiZeroMvdBits[1]; 4530 } 4531 else 4532 { 4533 assert(0); 4534 } 4491 if (uiZeroMvdCost <= uiCostBi && uiZeroMvdCost <= uiCost[0] && uiZeroMvdCost <= uiCost[1]) 4492 { 4493 if (iZeroMvdDir == 3) 4494 { 4495 uiLastMode = 2; 4496 4497 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvField( aacAMVPInfo[0][aiZeroMvdRefIdx[0]].m_acMvCand[aiZeroMvdMvpIdx[0]], aiZeroMvdRefIdx[0], ePartSize, uiPartAddr, iPartIdx, 0 ); 4498 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField( aacAMVPInfo[1][aiZeroMvdRefIdx[1]].m_acMvCand[aiZeroMvdMvpIdx[1]], aiZeroMvdRefIdx[1], ePartSize, uiPartAddr, iPartIdx, 0 ); 4499 4500 pcCU->setInterDirSubParts( 3, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 4501 4502 pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[0], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4503 pcCU->setMVPNumSubParts( aaiMvpNum[0][aiZeroMvdRefIdx[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4504 pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[1], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4505 pcCU->setMVPNumSubParts( aaiMvpNum[1][aiZeroMvdRefIdx[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4506 uiMEBits = auiZeroMvdBits[2]; 4507 } 4508 else if (iZeroMvdDir == 1) 4509 { 4510 uiLastMode = 0; 4511 4512 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvField( aacAMVPInfo[0][aiZeroMvdRefIdx[0]].m_acMvCand[aiZeroMvdMvpIdx[0]], aiZeroMvdRefIdx[0], ePartSize, uiPartAddr, iPartIdx, 0 ); 4513 4514 pcCU->setInterDirSubParts( 1, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 4515 4516 pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[0], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4517 pcCU->setMVPNumSubParts( aaiMvpNum[0][aiZeroMvdRefIdx[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4518 uiMEBits = auiZeroMvdBits[0]; 4519 } 4520 else if (iZeroMvdDir == 2) 4521 { 4522 uiLastMode = 1; 4523 4524 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField( aacAMVPInfo[1][aiZeroMvdRefIdx[1]].m_acMvCand[aiZeroMvdMvpIdx[1]], aiZeroMvdRefIdx[1], ePartSize, uiPartAddr, iPartIdx, 0 ); 4525 4526 pcCU->setInterDirSubParts( 2, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 4527 4528 pcCU->setMVPIdxSubParts( aiZeroMvdMvpIdx[1], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4529 pcCU->setMVPNumSubParts( aaiMvpNum[1][aiZeroMvdRefIdx[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4530 uiMEBits = auiZeroMvdBits[1]; 4535 4531 } 4536 4532 else 4537 #endif 4538 if ( uiCostBi <= uiCost[0] && uiCostBi <= uiCost[1]) 4539 { 4540 uiLastMode = 2; 4541 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMv( cMvBi[0], ePartSize, uiPartAddr, 0, iPartIdx ); 4542 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllRefIdx( iRefIdxBi[0], ePartSize, uiPartAddr, 0, iPartIdx ); 4543 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMv( cMvBi[1], ePartSize, uiPartAddr, 0, iPartIdx ); 4544 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllRefIdx( iRefIdxBi[1], ePartSize, uiPartAddr, 0, iPartIdx ); 4545 4546 TempMv = cMvBi[0] - cMvPredBi[0][iRefIdxBi[0]]; 4547 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvd ( TempMv, ePartSize, uiPartAddr, 0, iPartIdx ); 4548 4549 TempMv = cMvBi[1] - cMvPredBi[1][iRefIdxBi[1]]; 4550 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvd ( TempMv, ePartSize, uiPartAddr, 0, iPartIdx ); 4551 4552 pcCU->setInterDirSubParts( 3, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 4553 4554 pcCU->setMVPIdxSubParts( aaiMvpIdxBi[0][iRefIdxBi[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4555 pcCU->setMVPNumSubParts( aaiMvpNum[0][iRefIdxBi[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4556 pcCU->setMVPIdxSubParts( aaiMvpIdxBi[1][iRefIdxBi[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4557 pcCU->setMVPNumSubParts( aaiMvpNum[1][iRefIdxBi[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4558 4559 uiMEBits = uiBits[2]; 4560 } 4561 else if ( uiCost[0] <= uiCost[1] ) 4562 { 4563 uiLastMode = 0; 4533 { 4534 assert(0); 4535 } 4536 } 4537 else 4538 #endif 4539 if ( uiCostBi <= uiCost[0] && uiCostBi <= uiCost[1]) 4540 { 4541 uiLastMode = 2; 4542 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMv( cMvBi[0], ePartSize, uiPartAddr, 0, iPartIdx ); 4543 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllRefIdx( iRefIdxBi[0], ePartSize, uiPartAddr, 0, iPartIdx ); 4544 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMv( cMvBi[1], ePartSize, uiPartAddr, 0, iPartIdx ); 4545 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllRefIdx( iRefIdxBi[1], ePartSize, uiPartAddr, 0, iPartIdx ); 4546 4547 TempMv = cMvBi[0] - cMvPredBi[0][iRefIdxBi[0]]; 4548 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvd ( TempMv, ePartSize, uiPartAddr, 0, iPartIdx ); 4549 4550 TempMv = cMvBi[1] - cMvPredBi[1][iRefIdxBi[1]]; 4551 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvd ( TempMv, ePartSize, uiPartAddr, 0, iPartIdx ); 4552 4553 pcCU->setInterDirSubParts( 3, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 4554 4555 pcCU->setMVPIdxSubParts( aaiMvpIdxBi[0][iRefIdxBi[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4556 pcCU->setMVPNumSubParts( aaiMvpNum[0][iRefIdxBi[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4557 pcCU->setMVPIdxSubParts( aaiMvpIdxBi[1][iRefIdxBi[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4558 pcCU->setMVPNumSubParts( aaiMvpNum[1][iRefIdxBi[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4559 4560 uiMEBits = uiBits[2]; 4561 } 4562 else if ( uiCost[0] <= uiCost[1] ) 4563 { 4564 uiLastMode = 0; 4564 4565 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMv( cMv[0], ePartSize, uiPartAddr, 0, iPartIdx ); 4565 4566 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllRefIdx( iRefIdx[0], ePartSize, uiPartAddr, 0, iPartIdx ); 4566 4567 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvd ( TempMv, ePartSize, uiPartAddr, 0, iPartIdx );4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4567 TempMv = cMv[0] - cMvPred[0][iRefIdx[0]]; 4568 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvd ( TempMv, ePartSize, uiPartAddr, 0, iPartIdx ); 4569 pcCU->setInterDirSubParts( 1, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 4570 4571 pcCU->setMVPIdxSubParts( aaiMvpIdx[0][iRefIdx[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4572 pcCU->setMVPNumSubParts( aaiMvpNum[0][iRefIdx[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4573 4574 uiMEBits = uiBits[0]; 4575 } 4576 else 4577 { 4578 uiLastMode = 1; 4578 4579 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMv( cMv[1], ePartSize, uiPartAddr, 0, iPartIdx ); 4579 4580 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllRefIdx( iRefIdx[1], ePartSize, uiPartAddr, 0, iPartIdx ); 4580 4581 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvd ( TempMv, ePartSize, uiPartAddr, 0, iPartIdx );4582 4583 4584 4585 4586 4587 4588 4581 TempMv = cMv[1] - cMvPred[1][iRefIdx[1]]; 4582 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvd ( TempMv, ePartSize, uiPartAddr, 0, iPartIdx ); 4583 pcCU->setInterDirSubParts( 2, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 4584 4585 pcCU->setMVPIdxSubParts( aaiMvpIdx[1][iRefIdx[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4586 pcCU->setMVPNumSubParts( aaiMvpNum[1][iRefIdx[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4587 4588 uiMEBits = uiBits[1]; 4589 } 4589 4590 #if AMP_MRG 4590 4591 } // end if bTestNormalMC … … 4649 4650 xMergeEstimation( pcCU, pcOrgYuv, iPartIdx, uiMRGInterDir, cMRGMvField, uiMRGIndex, uiMRGCost, cMvFieldNeighbours, uhInterDirNeighbours 4650 4651 #if H_3D_VSP 4651 , vspFlag4652 , inheritedVSPDisInfo4652 , vspFlag 4653 , inheritedVSPDisInfo 4653 4654 #endif 4654 4655 #if H_3D_SPIVMP 4655 , bSPIVMPFlag, pcMvFieldSP, puhInterDirSP4656 , bSPIVMPFlag, pcMvFieldSP, puhInterDirSP 4656 4657 #endif 4657 , numValidMergeCand4658 );4658 , numValidMergeCand 4659 ); 4659 4660 if ( uiMRGCost < uiMECost ) 4660 4661 { … … 4669 4670 if( uiMRGIndex == pcCU->getUseDDDCandIdx() ) 4670 4671 { 4671 assert( vspFlag[uiMRGIndex] == 0 );4672 assert( bSPIVMPFlag[uiMRGIndex] == 0 );4673 pcCU->setUseDDD( true, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) );4674 pcCU->setDDDepthSubParts( pcCU->getDDTmpDepth(), uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) );4672 assert( vspFlag[uiMRGIndex] == 0 ); 4673 assert( bSPIVMPFlag[uiMRGIndex] == 0 ); 4674 pcCU->setUseDDD( true, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) ); 4675 pcCU->setDDDepthSubParts( pcCU->getDDTmpDepth(), uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) ); 4675 4676 } 4676 4677 else 4677 4678 { 4678 pcCU->setUseDDD( false, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) );4679 pcCU->setUseDDD( false, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) ); 4679 4680 } 4680 4681 #endif … … 4704 4705 #if NTT_STORE_SPDV_VSP_G0148 4705 4706 #if H_3D_DBBP 4706 4707 if ( vspFlag[uiMRGIndex] && !pcCU->getDBBPFlag(uiPartAddr) ) 4707 4708 #else 4708 if ( vspFlag[uiMRGIndex] ) 4709 #endif 4709 if ( vspFlag[uiMRGIndex] ) 4710 #endif 4711 { 4712 UInt partAddrTemp; 4713 Int vspSize; 4714 Int width, height; 4715 pcCU->getPartIndexAndSize( iPartIdx, partAddrTemp, width, height ); // true or pcCU->getTotalNumPart()==256 4716 if( uiMRGInterDir & 0x01 ) 4710 4717 { 4711 UInt partAddrTemp; 4712 Int vspSize; 4713 Int width, height; 4714 pcCU->getPartIndexAndSize( iPartIdx, partAddrTemp, width, height ); // true or pcCU->getTotalNumPart()==256 4715 if( uiMRGInterDir & 0x01 ) 4716 { 4717 pcCU->setMvFieldPUForVSP( pcCU, partAddrTemp, width, height, REF_PIC_LIST_0, cMRGMvField[0].getRefIdx(), vspSize ); 4718 pcCU->setVSPFlag( partAddrTemp, vspSize ); 4719 } 4720 else 4721 { 4722 pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvField( cMRGMvField[0], ePartSize, uiPartAddr, 0, iPartIdx ); 4723 } 4724 if( uiMRGInterDir & 0x02 ) 4725 { 4726 pcCU->setMvFieldPUForVSP( pcCU, partAddrTemp, width, height, REF_PIC_LIST_1, cMRGMvField[1].getRefIdx(), vspSize ); 4727 pcCU->setVSPFlag( partAddrTemp, vspSize ); 4728 } 4729 else 4730 { 4731 pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( cMRGMvField[1], ePartSize, uiPartAddr, 0, iPartIdx ); 4732 } 4733 pcCU->setInterDirSubParts ( uiMRGInterDir, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) ); 4718 pcCU->setMvFieldPUForVSP( pcCU, partAddrTemp, width, height, REF_PIC_LIST_0, cMRGMvField[0].getRefIdx(), vspSize ); 4719 pcCU->setVSPFlag( partAddrTemp, vspSize ); 4734 4720 } 4735 4721 else 4722 { 4723 pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvField( cMRGMvField[0], ePartSize, uiPartAddr, 0, iPartIdx ); 4724 } 4725 if( uiMRGInterDir & 0x02 ) 4726 { 4727 pcCU->setMvFieldPUForVSP( pcCU, partAddrTemp, width, height, REF_PIC_LIST_1, cMRGMvField[1].getRefIdx(), vspSize ); 4728 pcCU->setVSPFlag( partAddrTemp, vspSize ); 4729 } 4730 else 4731 { 4732 pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( cMRGMvField[1], ePartSize, uiPartAddr, 0, iPartIdx ); 4733 } 4734 pcCU->setInterDirSubParts ( uiMRGInterDir, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) ); 4735 } 4736 else 4736 4737 #if H_3D_FIX_G0148_BRACE 4737 4738 { 4738 4739 #endif 4739 4740 #endif 4740 4741 pcCU->setInterDirSubParts ( uiMRGInterDir, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) ); 4741 4742 pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvField( cMRGMvField[0], ePartSize, uiPartAddr, 0, iPartIdx ); 4742 4743 pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( cMRGMvField[1], ePartSize, uiPartAddr, 0, iPartIdx ); … … 4744 4745 } 4745 4746 #endif 4746 4747 4748 4749 4750 4751 4752 4747 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvd ( cMvZero, ePartSize, uiPartAddr, 0, iPartIdx ); 4748 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvd ( cMvZero, ePartSize, uiPartAddr, 0, iPartIdx ); 4749 4750 pcCU->setMVPIdxSubParts( -1, REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4751 pcCU->setMVPNumSubParts( -1, REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4752 pcCU->setMVPIdxSubParts( -1, REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4753 pcCU->setMVPNumSubParts( -1, REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 4753 4754 } 4754 4755 else … … 4767 4768 pcCU->setDvInfoSubParts(OriginalDvInfo, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) ); 4768 4769 #endif 4769 pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvField( cMEMvField[0], ePartSize, uiPartAddr, 0, iPartIdx );4770 pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( cMEMvField[1], ePartSize, uiPartAddr, 0, iPartIdx );4771 }4770 pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvField( cMEMvField[0], ePartSize, uiPartAddr, 0, iPartIdx ); 4771 pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( cMEMvField[1], ePartSize, uiPartAddr, 0, iPartIdx ); 4772 } 4772 4773 #if H_3D_SPIVMP 4773 4774 delete[] pcMvFieldSP; … … 4778 4779 // MC 4779 4780 motionCompensation ( pcCU, rpcPredYuv, REF_PIC_LIST_X, iPartIdx ); 4780 4781 4781 4782 } // end of for ( Int iPartIdx = 0; iPartIdx < iNumPart; iPartIdx++ ) 4782 4783 … … 5803 5804 dCostBest = dCost; 5804 5805 qpBest = qp; 5805 m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[ pcCU->getDepth( 0 ) ][ CI_TEMP_BEST ] );5806 }5806 m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[ pcCU->getDepth( 0 ) ][ CI_TEMP_BEST ] ); 5807 } 5807 5808 #if H_3D_VSO // M21 5808 5809 if( m_pcRdCost->getUseRenModel() && !m_pcRdCost->getUseEstimatedVSD() )
Note: See TracChangeset for help on using the changeset viewer.