在执行完xCheckRDCostAffineMerge2N*2N函数后,执行此函数,在HEVC中,merge的候选模式个数为5个,在JEM中,候选模式的个数增加到了7个(加了两个额外ATMVP和STMVP推导得到的merge模式)。并且为了加速,先对7个候选模式计算SATD,选取其中4个最小的模式,并且如果在前四个中有模式的代价大于最小SATD的1.25倍,则该模式及其后面模式被取消候选资格。最后,对有效的候选模式(小于等于4个)进行RD COST的比较,选取最优merge模式。

Void TEncCu::xCheckRDCostMerge2Nx2N( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU DEBUG_STRING_FN_DECLARE(sDebug), Bool *earlyDetectionSkipMode )
{
#if JVET_C0024_QTBTUInt uiWIdx = g_aucConvertToBit[rpcBestCU->getWidth(0)];UInt uiHIdx = g_aucConvertToBit[rpcBestCU->getHeight(0)];
#else
#if COM16_C806_LARGE_CTUif( m_pcEncCfg->getUseFastLCTU() && rpcTempCU->getHeight( 0 ) * 2 > rpcTempCU->getSlice()->getSPS()->getPicHeightInLumaSamples() ){rpcTempCU->getTotalCost() = MAX_DOUBLE / 4;rpcTempCU->getTotalDistortion() = MAX_INT;xCheckBestMode(rpcBestCU, rpcTempCU, rpcTempCU->getDepth( 0 ));return;}
#endif
#endifassert( rpcTempCU->getSlice()->getSliceType() != I_SLICE );if(getFastDeltaQp()){return;   // never check merge in fast deltaqp mode}TComMvField  cMvFieldNeighbours[2 * MRG_MAX_NUM_CANDS]; // double length for mv of both lists,MRG_MAX_NUM_CANDS=7;UChar uhInterDirNeighbours[MRG_MAX_NUM_CANDS];Int numValidMergeCand = 0;const Bool bTransquantBypassFlag = rpcTempCU->getCUTransquantBypass(0);
#if COM16_C806_VCEG_AZ10_SUB_PU_TMVPUChar  eMergeCandTypeNieghors[MRG_MAX_NUM_CANDS];memset ( eMergeCandTypeNieghors, MGR_TYPE_DEFAULT_N, sizeof(UChar)*MRG_MAX_NUM_CANDS );
#endif
#if VCEG_AZ06_ICBool abICFlag[MRG_MAX_NUM_CANDS];
#endif//初始化 uhInterDirNeighbours[];for( UInt ui = 0; ui < rpcTempCU->getSlice()->getMaxNumMergeCand(); ++ui ){uhInterDirNeighbours[ui] = 0;}UChar uhDepth = rpcTempCU->getDepth( 0 );
#if !JVET_C0024_QTBTrpcTempCU->setPartSizeSubParts( SIZE_2Nx2N, 0, uhDepth ); // interprets depth relative to CTU level
#endif#if COM16_C806_VCEG_AZ10_SUB_PU_TMVP
#if !JVET_C0024_QTBT  for (Int i=0 , i2 = 0 ; i< rpcTempCU->getTotalNumPart(); i++ , i2 += 2){
#if JVET_C0035_ATMVP_SIMPLIFICATIONfor (Int j=0; j < NUM_MGR_TYPE ; j++){m_phInterDirSP[j][i] = 0;m_pMvFieldSP[j][i2].setRefIdx(-1);m_pMvFieldSP[j][i2+1].setRefIdx(-1);}
#elsem_phInterDirSP[1][i] = 0;m_pMvFieldSP[1][i2].setRefIdx(-1);m_pMvFieldSP[1][i2+1].setRefIdx(-1);
#endif}
#endif
#endif//得到帧间merge候选模式,7个;rpcTempCU->getInterMergeCandidates( 0, 0, cMvFieldNeighbours,uhInterDirNeighbours, numValidMergeCand
#if VCEG_AZ06_IC, abICFlag
#endif
#if COM16_C806_VCEG_AZ10_SUB_PU_TMVP, eMergeCandTypeNieghors, m_pMvFieldSP, m_phInterDirSP
#endif);Int mergeCandBuffer[MRG_MAX_NUM_CANDS];for( UInt ui = 0; ui < numValidMergeCand; ++ui )//numValidMergeCand=7;{mergeCandBuffer[ui] = 0;}#if JVET_C0024_FAST_MRGBool bestIsSkip = rpcBestCU->getPic()->getSkiped(rpcBestCU->getZorderIdxInCtu(), rpcBestCU->getWidth(0), rpcBestCU->getHeight(0));UInt uiNumMrgSATDCand = NUM_MRG_SATD_CAND;//4UInt uiRdModeList[MRG_MAX_NUM_CANDS];Double CandCostList[MRG_MAX_NUM_CANDS];for (UInt i=0; i<MRG_MAX_NUM_CANDS; i++)//初始化;{uiRdModeList[i] = i;CandCostList[i] = MAX_DOUBLE;}Bool bMrgTempBufSet = false;if (!bestIsSkip)//如果最优模式不是skip{
#if JVET_D0123_ME_CTX_LUT_BITSUInt uiMrgIdxBits[MRG_MAX_NUM_CANDS];m_pcPredSearch->getMrgCandBits(rpcBestCU, 0, uiMrgIdxBits);
#endifbMrgTempBufSet = true;for( UInt uiMergeCand = 0; uiMergeCand < numValidMergeCand; ++uiMergeCand )//遍历7种有效的merge候选模式,计算每个候选的SATD;{// set MC parameters,设置预测补偿参数rpcTempCU->setPredModeSubParts( MODE_INTER, 0, uhDepth ); // interprets depth relative to CTU levelrpcTempCU->setCUTransquantBypassSubParts( bTransquantBypassFlag, 0, uhDepth );rpcTempCU->setChromaQpAdjSubParts( bTransquantBypassFlag ? 0 : m_cuChromaQpOffsetIdxPlus1, 0, uhDepth );rpcTempCU->setMergeFlagSubParts( true, 0, 0, uhDepth ); // interprets depth relative to CTU levelrpcTempCU->setMergeIndexSubParts( uiMergeCand, 0, 0, uhDepth ); // interprets depth relative to CTU level
#if COM16_C806_OBMCrpcTempCU->setOBMCFlagSubParts( true, 0, uhDepth );
#endif
#if VCEG_AZ06_ICrpcTempCU->setICFlagSubParts( rpcTempCU->getSlice()->getApplyIC() ? abICFlag[uiMergeCand] : 0, 0, uhDepth );
#endif
#if COM16_C806_VCEG_AZ10_SUB_PU_TMVPrpcTempCU->setMergeTypeSubParts(eMergeCandTypeNieghors[uiMergeCand] , 0, 0, uhDepth ); //设置merge类型,什么鬼???if( eMergeCandTypeNieghors[uiMergeCand]){UInt uiSPAddr;Int iWidth = rpcTempCU->getWidth(0);Int iHeight = rpcTempCU->getHeight(0);Int iNumSPInOneLine, iNumSP, iSPWidth, iSPHeight;
#if JVET_C0035_ATMVP_SIMPLIFICATIONUInt uiSPListIndex = eMergeCandTypeNieghors[uiMergeCand];
#elseUInt uiSPListIndex = eMergeCandTypeNieghors[uiMergeCand] == MGR_TYPE_SUBPU_TMVP?0:1;
#endifrpcTempCU->getSPPara(iWidth, iHeight, iNumSP, iNumSPInOneLine, iSPWidth, iSPHeight);for (Int iPartitionIdx = 0; iPartitionIdx < iNumSP; iPartitionIdx++)//iNumSP=1024,即遍历每个4*4的block;{rpcTempCU->getSPAbsPartIdx(0, iSPWidth, iSPHeight, iPartitionIdx, iNumSPInOneLine, uiSPAddr);rpcTempCU->setInterDirSP(m_phInterDirSP[uiSPListIndex][iPartitionIdx], uiSPAddr, iSPWidth, iSPHeight);rpcTempCU->getCUMvField( REF_PIC_LIST_0 )->setMvFieldSP(rpcTempCU, uiSPAddr, m_pMvFieldSP[uiSPListIndex][2*iPartitionIdx], iSPWidth, iSPHeight);rpcTempCU->getCUMvField( REF_PIC_LIST_1 )->setMvFieldSP(rpcTempCU, uiSPAddr, m_pMvFieldSP[uiSPListIndex][2*iPartitionIdx + 1], iSPWidth, iSPHeight);}}else//eMergeCandTypeNieghors[uiMergeCand]==0{
#endifrpcTempCU->setInterDirSubParts( uhInterDirNeighbours[uiMergeCand], 0, 0, uhDepth ); // interprets depth relative to CTU levelrpcTempCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvField( cMvFieldNeighbours[0 + 2*uiMergeCand], SIZE_2Nx2N, 0, 0 ); // interprets depth relative to rpcTempCU levelrpcTempCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( cMvFieldNeighbours[1 + 2*uiMergeCand], SIZE_2Nx2N, 0, 0 ); // interprets depth relative to rpcTempCU level
#if COM16_C806_VCEG_AZ10_SUB_PU_TMVP}
#endifm_pcMrgPredTempYuv[uiMergeCand]->setWidth(rpcBestCU->getWidth(0));m_pcMrgPredTempYuv[uiMergeCand]->setHeight(rpcBestCU->getHeight(0));//在merge模式中,MVP直接被当作MV(意味着没有MVD),因此没有运动估计这一步骤,直接进行运动补偿m_pcPredSearch->motionCompensation ( rpcTempCU, m_pcMrgPredTempYuv[uiMergeCand] );
#if COM16_C806_OBMCm_pcPredSearch->subBlockOBMC( rpcTempCU, 0, m_pcMrgPredTempYuv[uiMergeCand], m_pppcTmpYuv1[uiWIdx][uiHIdx], m_pppcTmpYuv2[uiWIdx][uiHIdx] );
#endif
#if JVET_E0052_DMVR
// the mv may be changed in the mv refinement during the MC,运动补偿期间在MV细化中MV可能会改变if (uhInterDirNeighbours[uiMergeCand]==3 && eMergeCandTypeNieghors[uiMergeCand]== MGR_TYPE_DEFAULT_N){cMvFieldNeighbours[0 + 2*uiMergeCand].getMv() = rpcTempCU->getCUMvField(REF_PIC_LIST_0)->getMv(0);cMvFieldNeighbours[1 + 2*uiMergeCand].getMv() = rpcTempCU->getCUMvField(REF_PIC_LIST_1)->getMv(0);}else if (eMergeCandTypeNieghors[uiMergeCand] != MGR_TYPE_DEFAULT_N){UInt uiSPAddr;Int iWidth = rpcTempCU->getWidth(0);Int iHeight = rpcTempCU->getHeight(0);Int iNumSPInOneLine, iNumSP, iSPWidth, iSPHeight;
#if JVET_C0035_ATMVP_SIMPLIFICATIONUInt uiSPListIndex = eMergeCandTypeNieghors[uiMergeCand];
#elseUInt uiSPListIndex = eMergeCandTypeNieghors[uiMergeCand] == MGR_TYPE_SUBPU_TMVP ? 0 : 1;
#endifrpcTempCU->getSPPara(iWidth, iHeight, iNumSP, iNumSPInOneLine, iSPWidth, iSPHeight);for (Int iPartitionIdx = 0; iPartitionIdx < iNumSP; iPartitionIdx++){if (m_phInterDirSP[uiSPListIndex][iPartitionIdx] == 3){rpcTempCU->getSPAbsPartIdx(0, iSPWidth, iSPHeight, iPartitionIdx, iNumSPInOneLine, uiSPAddr);m_pMvFieldSP[uiSPListIndex][2 * iPartitionIdx].getMv() = rpcTempCU->getCUMvField(REF_PIC_LIST_0)->getMv(uiSPAddr);m_pMvFieldSP[uiSPListIndex][2 * iPartitionIdx + 1].getMv() = rpcTempCU->getCUMvField(REF_PIC_LIST_1)->getMv(uiSPAddr);}}}
#endif// use hadamard transform here,使用哈达玛变换;DistParam distParam;const Bool bUseHadamard=rpcTempCU->getCUTransquantBypass(0) == 0;m_pcRdCost->setDistParam(distParam, rpcTempCU->getSlice()->getSPS()->getBitDepth(CHANNEL_TYPE_LUMA), m_pppcOrigYuv[uiWIdx][uiHIdx]->getAddr(COMPONENT_Y), m_pppcOrigYuv[uiWIdx][uiHIdx]->getStride(COMPONENT_Y), m_pcMrgPredTempYuv[uiMergeCand]->getAddr(COMPONENT_Y), m_pcMrgPredTempYuv[uiMergeCand]->getStride(COMPONENT_Y), rpcTempCU->getWidth(0), rpcTempCU->getHeight(0), bUseHadamard);distParam.bApplyWeight = false;UInt uiSad = distParam.DistFunc(&distParam);
#if JVET_D0123_ME_CTX_LUT_BITSUInt uiBitsCand = uiMrgIdxBits[uiMergeCand];Double cost  = (Double)uiSad + (Double)uiBitsCand/((Double)EPBIT) * m_pcRdCost->getSqrtLambda();
#elseUInt uiBitsCand = uiMergeCand + 1;                                         if (uiMergeCand == rpcTempCU->getSlice()->getMaxNumMergeCand() -1){uiBitsCand--;}   Double cost      = (Double)uiSad + (Double)uiBitsCand * m_pcRdCost->getSqrtLambda();
#endifTEncSearch::updateCandList( uiMergeCand, cost, uiNumMrgSATDCand, uiRdModeList, CandCostList );}/7种merge候选模式遍历结束,4个SATD最小的候选模式被挑选出来,CandCostList前面4个的代价进行了更新///for (UInt i=1; i<uiNumMrgSATDCand; i++){//如果4个候选模式中的后面3个中有模式的代价大于最小代价的1.25倍,则把它及其后面的候选模式取消候选资格,退出;if (CandCostList[i] > MRG_FAST_RATIO*CandCostList[0])//MRG_FAST_RATIO=1.25:{uiNumMrgSATDCand = i;break;}}}
#elseBool bestIsSkip = false;
#endifUInt iteration;if ( rpcTempCU->isLosslessCoded(0))//默认是false,所以iteration=2;{iteration = 1;}else{iteration = 2;}DEBUG_STRING_NEW(bestStr)//bestIsSkip==false则进行第一次迭代过程,残差系数不全为0才进行第二次迭代过程//for( UInt uiNoResidual = 0; uiNoResidual < iteration; ++uiNoResidual ){
#if JVET_C0024_FAST_MRGfor( UInt uiMrgHADIdx = 0; uiMrgHADIdx < uiNumMrgSATDCand; ++uiMrgHADIdx )//遍历剩余的有效的merge候选(最多是4),计算RD cost,选取最优的模式;{UInt uiMergeCand = uiRdModeList[uiMrgHADIdx];
#elsefor( UInt uiMergeCand = 0; uiMergeCand < numValidMergeCand; ++uiMergeCand ){
#endifif(!(uiNoResidual==1 && mergeCandBuffer[uiMergeCand]==1))//第一次迭代时这个if条件一定成立;{if( !(bestIsSkip && uiNoResidual == 0) )//如果bestIsSkip==false时则if条件成立;{DEBUG_STRING_NEW(tmpStr)// set MC parameters,设置运动补偿参数rpcTempCU->setPredModeSubParts( MODE_INTER, 0, uhDepth ); // interprets depth relative to CTU levelrpcTempCU->setCUTransquantBypassSubParts( bTransquantBypassFlag, 0, uhDepth );rpcTempCU->setChromaQpAdjSubParts( bTransquantBypassFlag ? 0 : m_cuChromaQpOffsetIdxPlus1, 0, uhDepth );
#if !JVET_C0024_QTBTrpcTempCU->setPartSizeSubParts( SIZE_2Nx2N, 0, uhDepth ); // interprets depth relative to CTU level
#endifrpcTempCU->setMergeFlagSubParts( true, 0, 0, uhDepth ); // interprets depth relative to CTU levelrpcTempCU->setMergeIndexSubParts( uiMergeCand, 0, 0, uhDepth ); // interprets depth relative to CTU level
#if COM16_C806_OBMCrpcTempCU->setOBMCFlagSubParts( true, 0, uhDepth );
#endif
#if VCEG_AZ06_ICrpcTempCU->setICFlagSubParts( rpcTempCU->getSlice()->getApplyIC() ? abICFlag[uiMergeCand] : 0, 0, uhDepth );
#endif
#if COM16_C806_VCEG_AZ10_SUB_PU_TMVPrpcTempCU->setMergeTypeSubParts(eMergeCandTypeNieghors[uiMergeCand] , 0, 0, uhDepth ); if( eMergeCandTypeNieghors[uiMergeCand]){UInt uiSPAddr;Int iWidth = rpcTempCU->getWidth(0);Int iHeight = rpcTempCU->getHeight(0);Int iNumSPInOneLine, iNumSP, iSPWidth, iSPHeight;
#if JVET_C0035_ATMVP_SIMPLIFICATIONUInt uiSPListIndex = eMergeCandTypeNieghors[uiMergeCand];
#elseUInt uiSPListIndex = eMergeCandTypeNieghors[uiMergeCand] == MGR_TYPE_SUBPU_TMVP?0:1;
#endifrpcTempCU->getSPPara(iWidth, iHeight, iNumSP, iNumSPInOneLine, iSPWidth, iSPHeight);for (Int iPartitionIdx = 0; iPartitionIdx < iNumSP; iPartitionIdx++){rpcTempCU->getSPAbsPartIdx(0, iSPWidth, iSPHeight, iPartitionIdx, iNumSPInOneLine, uiSPAddr);rpcTempCU->setInterDirSP(m_phInterDirSP[uiSPListIndex][iPartitionIdx], uiSPAddr, iSPWidth, iSPHeight);rpcTempCU->getCUMvField( REF_PIC_LIST_0 )->setMvFieldSP(rpcTempCU, uiSPAddr, m_pMvFieldSP[uiSPListIndex][2*iPartitionIdx], iSPWidth, iSPHeight);rpcTempCU->getCUMvField( REF_PIC_LIST_1 )->setMvFieldSP(rpcTempCU, uiSPAddr, m_pMvFieldSP[uiSPListIndex][2*iPartitionIdx + 1], iSPWidth, iSPHeight);}}else//eMergeCandTypeNieghors[uiMergeCand]==0{
#endifrpcTempCU->setInterDirSubParts( uhInterDirNeighbours[uiMergeCand], 0, 0, uhDepth ); // interprets depth relative to CTU levelrpcTempCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvField( cMvFieldNeighbours[0 + 2*uiMergeCand], SIZE_2Nx2N, 0, 0 ); // interprets depth relative to rpcTempCU levelrpcTempCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( cMvFieldNeighbours[1 + 2*uiMergeCand], SIZE_2Nx2N, 0, 0 ); // interprets depth relative to rpcTempCU level
#if COM16_C806_VCEG_AZ10_SUB_PU_TMVP}
#endif// do MC,做运动补偿
#if JVET_C0024_QTBT
#if JVET_C0024_FAST_MRGif (bMrgTempBufSet){m_pcMrgPredTempYuv[uiMergeCand]->copyToPartYuv(m_pppcPredYuvTemp[uiWIdx][uiHIdx], 0);}else{m_pcPredSearch->motionCompensation ( rpcTempCU, m_pppcPredYuvTemp[uiWIdx][uiHIdx] );
#if COM16_C806_OBMCm_pcPredSearch->subBlockOBMC( rpcTempCU, 0, m_pppcPredYuvTemp[uiWIdx][uiHIdx], m_pppcTmpYuv1[uiWIdx][uiHIdx], m_pppcTmpYuv2[uiWIdx][uiHIdx] );
#endif}
#elsem_pcPredSearch->motionCompensation ( rpcTempCU, m_pppcPredYuvTemp[uiWIdx][uiHIdx] );
#if COM16_C806_OBMCm_pcPredSearch->subBlockOBMC( rpcTempCU, 0, m_pppcPredYuvTemp[uiWIdx][uiHIdx], m_pppcTmpYuv1[uiWIdx][uiHIdx], m_pppcTmpYuv2[uiWIdx][uiHIdx] );
#endif
#endif// estimate residual and encode everything,估计残差并计算失真m_pcPredSearch->encodeResAndCalcRdInterCU( rpcTempCU,m_pppcOrigYuv    [uiWIdx][uiHIdx],m_pppcPredYuvTemp[uiWIdx][uiHIdx],m_pppcResiYuvTemp[uiWIdx][uiHIdx],m_pppcResiYuvBest[uiWIdx][uiHIdx],m_pppcRecoYuvTemp[uiWIdx][uiHIdx],(uiNoResidual != 0)
#if COM16_C806_EMT, rpcBestCU->getTotalCost()
#endifDEBUG_STRING_PASS_INTO(tmpStr) );#if DEBUG_STRINGDebugInterPredResiReco(tmpStr, *(m_ppcPredYuvTemp[uhDepth]), *(m_ppcResiYuvBest[uhDepth]), *(m_ppcRecoYuvTemp[uhDepth]), DebugStringGetPredModeMask(rpcTempCU->getPredictionMode(0)));
#endif
#elsem_pcPredSearch->motionCompensation ( rpcTempCU, m_ppcPredYuvTemp[uhDepth] );
#if COM16_C806_OBMCm_pcPredSearch->subBlockOBMC( rpcTempCU, 0, m_ppcPredYuvTemp[uhDepth], m_ppcTmpYuv1[uhDepth], m_ppcTmpYuv2[uhDepth] );
#endif// estimate residual and encode everythingm_pcPredSearch->encodeResAndCalcRdInterCU( rpcTempCU,m_ppcOrigYuv    [uhDepth],m_ppcPredYuvTemp[uhDepth],m_ppcResiYuvTemp[uhDepth],m_ppcResiYuvBest[uhDepth],m_ppcRecoYuvTemp[uhDepth],(uiNoResidual != 0)
#if COM16_C806_EMT, rpcBestCU->getTotalCost()
#endifDEBUG_STRING_PASS_INTO(tmpStr) );#if DEBUG_STRINGDebugInterPredResiReco(tmpStr, *(m_ppcPredYuvTemp[uhDepth]), *(m_ppcResiYuvBest[uhDepth]), *(m_ppcRecoYuvTemp[uhDepth]), DebugStringGetPredModeMask(rpcTempCU->getPredictionMode(0)));
#endif
#endifif ((uiNoResidual == 0) && (rpcTempCU->getQtRootCbf(0) == 0)){// If no residual when allowing for one, then set mark to not try case where residual is forced to 0mergeCandBuffer[uiMergeCand] = 1;}Int orgQP = rpcTempCU->getQP( 0 );xCheckDQP( rpcTempCU );xCheckBestMode(rpcBestCU, rpcTempCU, uhDepth DEBUG_STRING_PASS_INTO(bestStr) DEBUG_STRING_PASS_INTO(tmpStr));rpcTempCU->initEstData( uhDepth, orgQP, bTransquantBypassFlag );if( m_pcEncCfg->getUseFastDecisionForMerge() && !bestIsSkip ){bestIsSkip = rpcBestCU->getQtRootCbf(0) == 0;//如果残差系数全为0,则bestIsSkip=true;}}}}///遍历merge候选模式循环结束if(uiNoResidual == 0 && m_pcEncCfg->getUseEarlySkipDetection()){if(rpcBestCU->getQtRootCbf( 0 ) == 0){if( rpcBestCU->getMergeFlag( 0 )){*earlyDetectionSkipMode = true;}else if(m_pcEncCfg->getFastSearch() != SELECTIVE){Int absoulte_MV=0;for ( UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx++ ){if ( rpcBestCU->getSlice()->getNumRefIdx( RefPicList( uiRefListIdx ) ) > 0 ){TComCUMvField* pcCUMvField = rpcBestCU->getCUMvField(RefPicList( uiRefListIdx ));Int iHor = pcCUMvField->getMvd( 0 ).getAbsHor();Int iVer = pcCUMvField->getMvd( 0 ).getAbsVer();absoulte_MV+=iHor+iVer;}}if(absoulte_MV == 0){*earlyDetectionSkipMode = true;}}}}}/迭代结束DEBUG_STRING_APPEND(sDebug, bestStr)
}

VVC/JEM代码学习16:xCheckRDCostMerge2Nx2N相关推荐

  1. VVC/JEM代码学习26:m_pcTrQuant-transformN*N

    在H.266中,做完主变换后,还要进行二次变换,然后才进行量化: Void TComTrQuant::transformNxN( TComTU & rTu,const ComponentID ...

  2. VVC/JEM代码学习12:transformNxN

    对残差次数进行量化编码的函数,相比于HEVC,JEM中加入了二次变换,即在第一次主变换又进行第二次变换:此外,还加入了EMT,和DCT2是并列关系,根据相关索引进行选择; Void TComTrQua ...

  3. H.266/VVC代码学习21:帧内角度预测的实现 / 近对角模式的PDPC(xPredIntraAng)

    xPredIntraAng函数的作用是对任意大小的块和任意模式,如何将参考像素的值根据其模式的角度填充进每一个像素. 下图是basketball drill的一个16*16的块,其预测模式为10(偏斜 ...

  4. H.266/VVC代码学习20:角度预测入口 / 特殊模式的PDPC技术(predIntraAng)

    1.predIntraAng函数 predIntraAng是帧内0~66这67种预测的入口.其中可细分为: 模式0:PLANAR模式 模式1:DC模式 模式2~66:角度模式 此函数在亮度预测和色度预 ...

  5. H.266代码学习:JEM使用方法

    之前在HEVC代码学习0:HM使用+码流分析教程中详细介绍了HM使用方法,而H.266参考代码JEM已经成型,因此这里简单介绍下JEM的使用方法. 阅读建议: JEM使用方法与HM类似,使用中改动在于 ...

  6. H.266/VVC代码学习17:帧内亮度预测的编解码(intra_luma_pred_modes)

    引--亮度预测:H.266/VVC代码学习5:VTM4.0帧内亮度预测代码(estIntraPredLumaQT) 一.结论: 亮度编解码根据MPM列表的值分为两个阶段: 1 亮度模式在MPM列表中: ...

  7. H.266/VVC-VTM代码学习-帧内预测05-Angular模式下计算预测像素值xPredIntraAng

    H.266/VVC专栏传送 上一篇:H.266/VVC-VTM代码学习-帧内预测04-Planar模式下计算预测像素值xPredIntraPlanar 下一篇:H.266/VVC-VTM代码学习-帧内 ...

  8. H.266代码学习:xIntraCodingTUBlock函数

    今天来继续学习帧内编码的重要函数xIntraCodingTUBlock,上次 H.266代码学习:xRecurIntraCodingLumaQT函数 学习中提到,xIntraCodingTUBlock ...

  9. H.266代码学习:xEncodeCU函数

    之前在HEVC代码学习35:xEncodeCU函数中介绍过xEncodeCU函数,今天来看JEM中的xEncodeCU,其中难点在于QTBT编码结构. HM中使用compressCtu对每个CTU进行 ...

  10. H.266代码学习:estIntraPredLumaQT函数

    之前 HEVC代码学习42:estIntraPredLumaQT函数 对HM中的estIntraPredLumaQT函数进行了学习,下面将对JEM中的该函数进行学习. estIntraPredLuma ...

最新文章

  1. javascript中 (function(){})();如何理解?
  2. FD.io/VPP — L3 vRouter
  3. SpringBoot之CommandLineRunner,预先加载系统数据
  4. Struts2使用!动态方法调用无效
  5. 连线IBM大数据案例 让大数据接地气
  6. C#连接Sqlite 出现:混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。的解决方案...
  7. STL中的multimap---顺便说说如何查找同一关键字对应的所有值
  8. mybatis java类注解式_Spring整合Mybatis注解方式
  9. 异常:Software caused connection abort: socket write error
  10. Crackeme021
  11. 在线编程网站收集-备用
  12. read H264 Nal
  13. Selenium和Appium教程合集
  14. python pandas Excel 生成图片
  15. postman下载及安装
  16. 如何比较两种方法的灵敏度和特异度
  17. 服务器远程一直显示欢迎界面,windows server 2008R2 卡在欢迎界面
  18. 2022年Q1手机银行用户规模达6.5亿,加强ESG个人金融产品创新
  19. 在Macbook Pro 上安装refind以引导os x + ubuntu双系统
  20. Win10安装Kafka步骤

热门文章

  1. ubuntu上的翻译软件,看论文神器
  2. AJAX培训第一讲:AJAX基础
  3. svn中文语言安装包使用
  4. 计算机中汉字的顺序用什么牌,最常用汉字频率排序
  5. 在群晖NAS上使用Docker 蒲公英
  6. C#反编译工具ilspy下载地址
  7. CO_P0(logisim)
  8. 机器学习--文本分析(jieba)
  9. 数据结构 复习攻略 新手必看
  10. 解决markdown快捷键在输入法和chrome浏览器下的冲突问题