HM TEncCu相关说明

本文详细介绍了HEVC编码器中TEncCu类中CU( Coding Unit)的处理流程,包括TComYuv与TComPicYuv的区别,以及在xcompressCU函数中CU数据的复制、比较和存储过程。通过对CU的深度遍历和率失真性能比较,优化编码决策,并最终将最佳CU数据复制到图像中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class TComYuv的注释是:general YUV buffer class。该注释不清楚,其实TComYuv就是用于存放一个CU的相关数据。例如,在class TEncCu中的各个depth的CU的数据:

/// CU encoder class
class TEncCu
{
private:

  TComDataCU**            m_ppcBestCU;      ///< Best CUs in each depth
  TComDataCU**            m_ppcTempCU;      ///< Temporary CUs in each depth
  UChar                   m_uhTotalDepth;

  TComYuv**               m_ppcPredYuvBest; ///< Best Prediction Yuv for each depth
  TComYuv**               m_ppcResiYuvBest; ///< Best Residual Yuv for each depth
  TComYuv**               m_ppcRecoYuvBest; ///< Best Reconstruction Yuv for each depth
  TComYuv**               m_ppcPredYuvTemp; ///< Temporary Prediction Yuv for each depth
  TComYuv**               m_ppcResiYuvTemp; ///< Temporary Residual Yuv for each depth
  TComYuv**               m_ppcRecoYuvTemp; ///< Temporary Reconstruction Yuv for each depth
  TComYuv**               m_ppcOrigYuv;     ///< Original Yuv for each depth
  ...
}

而TComPicYuv的注释就很清楚:picture YUV buffer class,用于存放一幅图像的数据。
以下讨论TEncCu::xcompressCU中的代码。
将子CU的最好划分pcSubBestPartCU(m_ppcBestCU[uhNextDepth])的数据复制给上一层CU的临时划分rpcTempCU:
rpcTempCU->copyPartFrom( pcSubBestPartCU, uiPartUnitIdx, uhNextDepth ); // Keep best part data to current temporary data.
xCopyYuv2Tmp( pcSubBestPartCU->getTotalNumPart()*uiPartUnitIdx, uhNextDepth );
将当前深度的CU的信息给图像中的CU且把数据复制过去:
rpcBestCU->copyToPic(uiDepth); // Copy Best data to Picture for next partition prediction.
xCopyYuv2Pic( rpcBestCU->getPic(), rpcBestCU->getCtuRsAddr(), rpcBestCU->getZorderIdxInCtu(), uiDepth, uiDepth ); // Copy Yuv data to picture Yuv
当前深度的CU:rpcBestCU与CU:rpcTempCU的率失真性能比较:
xCheckBestMode( rpcBestCU, rpcTempCU, uiDepth DEBUG_STRING_PASS_INTO(sDebug) DEBUG_STRING_PASS_INTO(sTempDebug) DEBUG_STRING_PASS_INTO(false) ); // RD compare current larger prediction with sub partitioned prediction.
下一层划分为四个子CU,这四个子CU均用pcSubTempPartCU表示,且在使用前均会在initSubCU函数中m_dTotalCost= MAX_DOUBLE,反复利用同一个变量m_ppcTempCU[uhNextDepth]进行遍历,所以一层只需要一个rpcTempCU。
数据流是这样的:
当前层在不划分的遍历时通过xCheckBestMode将m_ppcTempCU[uiDepth]赋值给m_ppcBestCU[uiDepth],CU递归调用下一层的的m_ppcTempCU[uhNextDepth]也在遍历时通过xCheckBestMode赋值给m_ppcBestCU[uhNextDepth],四个下一层的m_ppcBestCU[uhNextDepth]把数据上交给m_ppcBestCU[uiDepth],rpcTempCU[i]再与m_ppcBestCU[uiDepth]在xCheckBestMode中进行比较。
Void TComDataCU::copyToPic( UChar uhDepth )用于将m_ppcBestCU[0]拷贝到图像的CTU中,也就是TEncCu::compressCtu的参数pCtu。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值