h.264 mvp求解过程

h.264标准中因为分为宏块分割块(8x8),子宏块分割块(4x4),因此各类各样的求解过程比较繁琐编码

下面整理出标准中mvp的求解过程blog

 

8.4.1.3

已知条件有当前块的属性:位置、块类型
须要获得当前块的mvp索引

已知条件(当前块位置,类型)
     |
     |8.4.1.3.2                         (步骤1)
     |
获得相邻块(ABC(4x4))的mv与refIdx
     |
     |8.4.1.3.1 或 8.4.1.3 后半段 (步骤2)
     |
获得mvpip

 

另外还须要注意的一点是,mvp是具备方向性的。意思是说在预测B slice的mvp时,须要分为前向mvp:mvL0;后向mvp:mvL1;他们分别对应的参考图像索引为refIdxL0与refIdxL1。也就是说,当在进行前向运动预测时,计算mvp阶段获得的是mvL0以及refIdxL0;当在进行后向运动预测时,计算mvp阶段获得的是mvL1以及refIdxL1。变量

 

 

8.4.1.3.2

  1. 规定一个D块做为备用
  2. 调用6.4.8.5获得ABC块位置

 

6.4.8.5

子宏块分割块A,B,C中包含有如下像素点(xN,yN)mvp

$\begin{align*} xN &= x + xS + xD\\ yN &= y + yS + yD \end{align*}$ 遍历

  • (x,y)为当前宏块分割块左上角点
  • (xS,yS)为当前子宏块分割块左上角点
  • (xD,yD)跟据A,B,C变化选择不一样点

他们各自有如下特色im

  • (x,y)采用6.4.2.1的反向宏块分割块扫描
  • (xS,yS)只有mb_type为P_8x8,P_8x8ref0,或者B_8x8时采用6.4.2.1的反向子宏块分割块扫描,不然为(0,0)
  • (xD,yD)须要经过查表6-2获得,表当中有个变量predPartWidth

 predPartWidth计算方式以下d3

  • 当mb_type为P_Skip,B_Skip,B_Direct_16x16时,predPartWidth = 16
  • 当mb_type为B_8x8,
    • 若是currSubMbType为B_Direct_8x8时,predPartWidth = 16
    • 不然 predPartWidth = SubMbPartWidth( sub_mb_type[ mbPartIdx ] )
  • 当mb_type为P_8x8或P_8x8ref0,

    $predPartWidth = SubMbPartWidth( sub_mb_type[ mbPartIdx ] )$margin

  • 不然 predPartWidth = MbPartWidth( mb_type )

获得(xN,yN)以后须要知道(xN,yN)所在的宏块mbAddrN以及其在宏块内的地址(xW,yW),即从相对地址转换到绝对地址

 

6.4.9

这一小节会经过(xN,yN)的相对地址获得它们的绝对地址。

首先须要知道宏块大小

  • luma: maxW = maxH = 16
  • chroma: maxW = MbWidthC maxH = MbHeightC

所在的宏块mbAddrN,根据MbaffFrameFlag不一样,有不一样求法

  • 若是MbaffFrameFlag为0,    6.4.9.1
  • 若是MbaffFrameFlag为1,    6.4.9.2

 

6.4.9.1

表6-3获得mbAddrN

 

$\begin{align*}
xW &= ( xN + maxW )\ \%\ maxW\\
yW &= ( yN + maxH )\ \%\ maxH
\end{align*}$
 

6.4.9.2

表6-4,即mbaff的状况,能够经过脑补得到,大概比B_Direct时容易

 
从mbAddrN获得该宏块是否可用
从(xW,yW)获得该子宏块分割块(4x4)位置,若是mbAddrN不可用则该4x4块不可用,若是该4x4块未解码那么也不可用

 

 

ABC的运动矢量与参考索引处理

本小节的目的是获得获得A,B,C的参考图像索引refIdxLXN(refIdxLXA,refIdxLXB,refIdxLXC)以及运动矢量mvLXN(mvLXA,mvLXB,mvLXC)。不过因为咱们已经获得了A、B、C块的位置,所以他们的这两个参数确定是能获取获得的,除非出现如下的情况

首先,若是C不可用则用D来代替(4x4)

A,B,C的运动矢量mvLXN以及参考图像索引refIdxLXN在下面的状况下会进行特殊处理

  • 某个N不可用
  • 某个N为Intra编码
  • 某个N的predFlagLX等于0(即该X方向不采用帧间预测编码)

则mvLXN的两个份量均置为0且refIdxLXN置为−1

(注:通常来讲mv以4x4为单位,refIdx以8x8为单位)

 

进一步处理:

  • 若是当前宏块为场宏块,且宏块mbAddrN为帧宏块,则

    $\begin{align*}mvLXN[ 1 ] &= mvLXN[ 1 ] / 2 \\ refIdxLXN &= refIdxLXN \times 2 \end{align*}$

  • 不然,若是当前宏块为帧宏块且宏块mbAddrN为场宏块,那么

    $\begin{align*}mvLXN[ 1 ] &= mvLXN[ 1 ] \times 2 \\ refIdxLXN &= refIdxLXN / 2 \end{align*}$

  • 不然,运动矢量垂直份量mvLXN[ 1 ]和参考索引refIdxLXN保持不变

 

8.4.1.3后半段

8*16以及16*8的状况,参照表8-3

 

8.4.1.3.1

  • 若是B,C都不可用,用A代替
  • 若是A,B,C中只有一个refIdxLX等于当前宏块分割块的refIdxLX(遍历获得的,即每一个都会遍历到),那么取该块的mv做为mvp
  • 不然取中值(中位数)

 

 

至于JM,因为采用的是4x4块的计数方式,因此很容易就能够获得相邻块的位置,而后用所得相邻块mv与ref进行比较获得mvp

 

整个选取结果可参考下图:

  • 蓝色为各个已选定用于编码的相邻块,
  • 红色为4x4块,也就是蓝色块的一部分,固然包含蓝色块所含有的mv与refIdx
  • 绿色为当前处理块,这里以16x16为例

 

获得(xN,yN)以后须要知道(xN,yN)所在的宏块mbAddrN以及其在宏块内的地址(xW,yW) 即从相对地址转换到绝对地址

相关文章
相关标签/搜索