您的位置:首页 > 编程语言 > Qt开发

HEVC代码追踪(八。二):estIntraPredChromaQT

2014-11-30 16:18 417 查看
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] );
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: