h.264標準中因爲分爲宏塊分割塊(8x8),子宏塊分割塊(4x4),因此各類各樣的求解過程比較繁瑣編碼
下面整理出標準中mvp的求解過程blog
已知條件有當前塊的屬性:位置、塊類型
須要獲得當前塊的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。變量
子宏塊分割塊A,B,C中包含有如下像素點(xN,yN)mvp
$\begin{align*} xN &= x + xS + xD\\ yN &= y + yS + yD \end{align*}$ 遍歷
他們各自有如下特色im
predPartWidth計算方式以下d3
$predPartWidth = SubMbPartWidth( sub_mb_type[ mbPartIdx ] )$margin
獲得(xN,yN)以後須要知道(xN,yN)所在的宏塊mbAddrN以及其在宏塊內的地址(xW,yW),即從相對地址轉換到絕對地址
這一小節會經過(xN,yN)的相對地址獲得它們的絕對地址。
首先須要知道宏塊大小
所在的宏塊mbAddrN,根據MbaffFrameFlag不一樣,有不一樣求法
表6-3獲得mbAddrN
$\begin{align*}
xW &= ( xN + maxW )\ \%\ maxW\\
yW &= ( yN + maxH )\ \%\ maxH
\end{align*}$
表6-4,即mbaff的狀況,能夠經過腦補得到,大概比B_Direct時容易
從mbAddrN獲得該宏塊是否可用
從(xW,yW)獲得該子宏塊分割塊(4x4)位置,若是mbAddrN不可用則該4x4塊不可用,若是該4x4塊未解碼那麼也不可用
本小節的目的是獲得獲得A,B,C的參考圖像索引refIdxLXN(refIdxLXA,refIdxLXB,refIdxLXC)以及運動矢量mvLXN(mvLXA,mvLXB,mvLXC)。不過因爲咱們已經獲得了A、B、C塊的位置,所以他們的這兩個參數確定是能獲取獲得的,除非出現如下的情況
首先,若是C不可用則用D來代替(4x4)
A,B,C的運動矢量mvLXN以及參考圖像索引refIdxLXN在下面的狀況下會進行特殊處理
則mvLXN的兩個份量均置爲0且refIdxLXN置爲−1
(注:通常來講mv以4x4爲單位,refIdx以8x8爲單位)
進一步處理:
$\begin{align*}mvLXN[ 1 ] &= mvLXN[ 1 ] / 2 \\ refIdxLXN &= refIdxLXN \times 2 \end{align*}$
$\begin{align*}mvLXN[ 1 ] &= mvLXN[ 1 ] \times 2 \\ refIdxLXN &= refIdxLXN / 2 \end{align*}$
8*16以及16*8的狀況,參照表8-3
至於JM,因爲採用的是4x4塊的計數方式,因此很容易就能夠獲得相鄰塊的位置,而後用所得相鄰塊mv與ref進行比較獲得mvp
整個選取結果可參考下圖:
獲得(xN,yN)以後須要知道(xN,yN)所在的宏塊mbAddrN以及其在宏塊內的地址(xW,yW) 即從相對地址轉換到絕對地址