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) 即從相對地址轉換到絕對地址

相關文章
相關標籤/搜索