Void TEncSearch::estIntraPredChromaQT( TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv* pcPredYuv, TComYuv* pcResiYuv, TComYuv* pcRecoYuv, UInt uiPreCalcDistC ) { UInt uiDepth = pcCU->getDepth(0); UInt uiBestMode = 0; UInt uiBestDist = 0; Double dBestCost = MAX_DOUBLE; //----- init mode list ----- UInt uiMinMode = 0; UInt uiModeList[ NUM_CHROMA_MODE ]; pcCU->getAllowedChromaDir( 0, uiModeList ); UInt uiMaxMode = NUM_CHROMA_MODE; //----- check chroma modes ----- for( UInt uiMode = uiMinMode; uiMode < uiMaxMode; uiMode++ ) { //----- restore context models ----- m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] ); //----- chroma coding ----- UInt uiDist = 0; pcCU->setChromIntraDirSubParts ( uiModeList[uiMode], 0, uiDepth ); xRecurIntraChromaCodingQT ( pcCU, 0, 0, pcOrgYuv, pcPredYuv, pcResiYuv, uiDist ); if( pcCU->getSlice()->getPPS()->getUseTransformSkip() ) { m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] ); } UInt uiBits = xGetIntraBitsQT( pcCU, 0, 0, false, true, false ); Double dCost = m_pcRdCost->calcRdCost( uiBits, uiDist ); //----- compare ----- if( dCost < dBestCost ) { dBestCost = dCost; uiBestDist = uiDist; uiBestMode = uiModeList[uiMode]; UInt uiQPN = pcCU->getPic()->getNumPartInCU() >> ( uiDepth << 1 ); xSetIntraResultChromaQT( pcCU, 0, 0, pcRecoYuv ); ::memcpy( m_puhQTTempCbf[1], pcCU->getCbf( TEXT_CHROMA_U ), uiQPN * sizeof( UChar ) ); ::memcpy( m_puhQTTempCbf[2], pcCU->getCbf( TEXT_CHROMA_V ), uiQPN * sizeof( UChar ) ); ::memcpy( m_puhQTTempTransformSkipFlag[1], pcCU->getTransformSkip( TEXT_CHROMA_U ), uiQPN * sizeof( UChar ) ); ::memcpy( m_puhQTTempTransformSkipFlag[2], pcCU->getTransformSkip( TEXT_CHROMA_V ), uiQPN * sizeof( UChar ) ); } } //----- set data ----- UInt uiQPN = pcCU->getPic()->getNumPartInCU() >> ( uiDepth << 1 ); ::memcpy( pcCU->getCbf( TEXT_CHROMA_U ), m_puhQTTempCbf[1], uiQPN * sizeof( UChar ) ); ::memcpy( pcCU->getCbf( TEXT_CHROMA_V ), m_puhQTTempCbf[2], uiQPN * sizeof( UChar ) ); ::memcpy( pcCU->getTransformSkip( TEXT_CHROMA_U ), m_puhQTTempTransformSkipFlag[1], uiQPN * sizeof( UChar ) ); ::memcpy( pcCU->getTransformSkip( TEXT_CHROMA_V ), m_puhQTTempTransformSkipFlag[2], uiQPN * sizeof( UChar ) ); pcCU->setChromIntraDirSubParts( uiBestMode, 0, uiDepth ); pcCU->getTotalDistortion () += uiBestDist - uiPreCalcDistC; //----- restore context models ----- m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] ); }