AMVP候选理论回顾
根据图像中块与块的相关性计算,针对当前块,空域上与其相关性最强的块的位置如下图所示:
时域上相关性的最强的块如下图所示:
HM中该MVP填充流程如下:
- 计算得到当前PU左上、左下、右上的4x4块的索引值.将ZScan转换成Raster来找更好计算位置
- 预先判断当前PU左方的CU能不能获取,不能获取的话 isScaledFlagLX=false
- 依次找无需缩放的A0、A1。根据当前参考帧以及所选块参考帧来确定,若两个参考帧相同,则就无需缩放。如果无需缩放的MVP找不到,则寻找可以缩放的MVP。
- 依次找上方的CU:B0、B1、B2(此步只找无需缩放的MVP)
- 如果左方的CU不能用,再依次找可以缩放的 B0 B1 B2填入AMVP候选
- 判断当前MVP候选个数,同时去冗余
- 去完冗余后,若还不满足AMVP候选个数最大值,则寻找时域同位块的MV。
- 先找右下方的CU、右下方CU不可用或者是当前PU右下角的4x4块在当前CTU角落、在最后一行不在最后一列时也不可用。就开始寻找中心块
- 若还填不满 则填充0矢量.
代码如下:
/** Constructs a list of candidates for AMVP (See specification, section "Derivation process for motion vector predictor candidates")
* \param uiPartIdx -当前处理PU的索引
* \param uiPartAddr - 当前处理PU的起始地址(后续需要根据当前CU的地址来判断)
* \param eRefPicList - 当前参考图像列表
* \param iRefIdx - 当前参考帧
* \param pInfo - 要存入的MVP信息
*/
Void TComDataCU::fillMvpCand ( const UInt partIdx, const UInt partAddr, const RefPicList eRefPicList, const Int refIdx, AMVPInfo* pInfo ) const
{
pInfo->iN = 0;
if (refIdx < 0)
{
return;
}
//-- Get Spatial MV
// 得到当前PU左上,右上,左下4x4CU块的索引(4x4为默认最小CU)
// Zscan为Z扫, Raster为逐行扫描
UInt partIdxLT, partIdxRT, partIdxLB;
deriveLeftRightTopIdx( partIdx, partIdxLT, partIdxRT ); //要以当前CU起始位置开始找
deriveLeftBottomIdx( partIdx, partIdxLB );
Bool isScaledFlagLX = false; /// variable name from specification; true when the PUs below left or left are available (availableA0 || availableA1).
//判断左方的CTU,左下方CU能不能获取
{
UInt idx;
const TComDataCU* tmpCU = getPUBelowLeft(idx, partIdxLB);
isScaledFlagLX = (tmpCU != NULL) && (tmpCU->isInter(idx));
if (!isScaledFlagLX)
{
tmpCU = getPULeft(idx, partIdxLB);
isScaledFlagLX = (tmpCU != NULL) &&