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] );
}