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] );
}
本文深入探讨了编码器在处理chroma子采样时的内部实现细节,特别是QT方法如何在不同路径中进行优化以达到最佳编码效率。文章详细解释了如何初始化模型列表、检查chroma模式、重构上下文模型并计算比特数和成本,最终确定最佳模式以提高编码质量。
2324

被折叠的 条评论
为什么被折叠?



