1. 程式人生 > >【mpeg2】MPEG-2標準總結文件

【mpeg2】MPEG-2標準總結文件

Date: 2018.10.24


0、前言

    本文件是MPEG-2標準的學習總結文件,主要講述了MPEG-2標準基本知識、碼流分層結構、碼流的句法和語義以及視訊流的解碼過程,相對比較詳細,可供學習標準層面的知識。

1、MPEG-2簡介

    MPEG組織於1994年正式推出MPEG-2壓縮標準,以實現視/音訊服務與應用互操作的可能性。最典型和成功的應用就是DVD產品。MPEG-2標準包括了系統層、視訊層、音訊層等9個部分,本文件主要講述ISO/IEC 13818 Part2 視訊部分。MPEG-2標準就是定義了一個標準的MPEG-2碼流中每一位的具體含義,MPEG-2碼流的結構以及視訊解碼的過程。 
    MPEG-2標準是針對標準數字電視和高清晰度電視

在各種應用下的壓縮方案和系統層的詳細規定,編碼位元速率從每秒3M位元~100M位元,標準的正式規範在ISO/IEC13818中。MPEG-2不是MPEG-1的簡單升級,MPEG-2在系統和傳送方面作了更加詳細的規定和進一步的完善。MPEG-2特別適用於廣播級的數字電視的編碼和傳送,被認定為SDTV和HDTV的編碼標準。
    MPEG-2影象壓縮的原理是利用了影象中的兩種特性:空間相關性和時間相關性。這兩種相關性使得影象中存在大量的冗餘資訊。如果我們能將這些冗餘資訊去除,只保留少量非相關資訊進行傳輸,就可以大大節省傳輸頻帶。而接收機利用這些非相關資訊,按照一定的解碼演算法,可以在保證一定的影象質量的前提下恢復原始影象。一個好的壓縮編碼方案就是能夠最大限度地去除影象中的冗餘資訊。
     MPEG-2的編碼影象被分為三類,分別稱為I幀,P幀和B幀。 I幀影象採用幀內編碼方式,即只利用了單幀影象內的空間相關性,而沒有利用時間相關性。P幀和B幀影象採用幀間編碼方式,即同時利用了空間和時間上的相關性。P幀影象只採用前向時間預測,可以提高壓縮效率和影象質量。P幀影象中可以包含幀內編碼的部分,即P幀中的每一個巨集塊可以是前向預測,也可以是幀內編碼。B幀影象採用雙向時間預測,可以大大提高壓縮倍數。

2、檔次和級別 (Profile && Level)

    為了實現標準的語法體系的實用性(滿足不同的應用),定義了Profile和Level的方式來限定有限數目的語法子集。Profile是標準中定義個完整位元流語法一個子集(偏向於功能性約束);Level是對位元流語法中各個引數進行限定的集合(偏向於引數限定)。
    MPEG-2標準定義了7種Profile和4種Level,如下表所示:
(參考自:https://www.cs.rutgers.edu/~elgammal/classes/cs334/slide11_short.pdf)
在這裡插入圖片描述
其中在Main Profile中分為High,High 1440,Main和Low四種Level,具體規定如下圖:
在這裡插入圖片描述

說明:
MPEG-2是向下相容MPEG-1的,因此MPEG-2解碼器可以解碼滿足一定條件的MPEG-1碼流。
MPEG-2中的Simple,Main,SNR可分級、空域可分級和High Profile的所有level對於MPEG-1中的約束引數的位元流都是可解碼的。

3、碼流的分層結構

    編碼的視訊資料由稱作layer的位元流序列組成。如果僅有一層,那麼這個視訊流就是不可分級的視訊位元流。如果有兩層或多層,則稱為分級的視訊位元流。
     MPEG-2的編碼碼流共分為六個層次。為更好地表示編碼資料,MPEG-2用句法Syntax規定了一個層次性結構。它共分為六層,自上到下分別是:影象序列層(Video Sequence)、影象組層(GOP)、影象層(Picture)、巨集塊條層(Slice)、巨集塊層(MacroBlock)和塊層(Block)。

3.1、Video Sequence 視訊序列

    編碼的位元流中的最高語法結構就是視訊序列。一個視訊序列以一個序列頭開始,後面可選地跟著一組影象頭和一個或多個編碼幀。視訊序列以一個sequence_end_code終止。序列頭、影象組頭和影象頭在視訊序列中可能是重複出現的,通過重複第一個序列頭的資料單元,從而使得對視訊序列的隨機訪問成為可能。
  在這裡插入圖片描述

3.2、Group of Pictures(GOP) 影象組

     影象組是由一系列的編碼影象組成。在編碼位元流中,影象組頭後面的第一個編碼幀是I幀。

3.3、逐行序列和隔行序列

     MPEG-2標準支援逐行編碼和隔行編碼。

3.4、Picture 影象

     一個重構圖可以通過對一個編碼圖的解碼獲得。一個編碼圖是由一個影象頭、緊跟後面的可選擴充套件以及影象資料組成。一個編碼圖可以是一個幀圖或一個場圖。一個重構圖可以是一個重構幀,或是一個重構幀的一個場。

MPEG-2支援三種影象型別:

  • I 圖 : 只使用當前幀的編碼資訊。
  • P 圖 :利用前面的I圖或P圖使用運動補償預測進行編碼的圖。
  • B 圖: 利用前面的或後面的I圖或P圖使用運動補償預測進行編碼的圖。
3.5、Slice 條帶(塊組)

    Slice是由一系列任意數目的連續巨集塊組成。Slice的第一個和最後一個巨集塊不能是Skip塊。一個Slice中至少要包含一個巨集塊。Slice之間不能重疊。Slice的第一個和最後一個巨集塊要在同一巨集塊水平行上。 Slice可以獨立編解碼,Slice的設計是為了錯誤恢復。

注意:Slice的句法元素最早是在MPEG-1標準中引入的,MPEG-1標準中Slice的第一個巨集塊和最後 一個巨集塊可以不在同一個巨集塊水平行上。但是這種設計不利於錯誤恢復。

3.6、Macroblock 巨集塊

    巨集塊包含亮度分離和對應的色度分量。MPEG-2支援3種色度格式:4:2:0,4:2:2和4:4:4。對於4:2:0格式的影象,亮度巨集塊的大小為16x16,色度塊的大小為8x8。一個巨集塊是由6個塊組成的,分別是4個亮度塊和2個色度塊。
    對於隔行掃描的影象,亮度塊有2種組織方式:
(1)幀DCT編碼中,每個塊由兩場的行交替組成;
(2)場DCT編碼中,每個塊僅由兩場中之一個場的行組成。
所以對場DCT編碼的影象中,一個亮度塊解碼之後,要按照隔行的方式去存放,才能恢復出原來的影象。

3.7、Block 塊

    塊是視訊編碼中處理的最小單元。一般來說,DCT變換和量化的基本單元就是8x8的塊。
    這裡塊既可以指源影象資料和重構影象資料,也可以指DCT係數或相應的編碼資料單元。

4、視訊位元流的語法

4.1、 起始碼

    起始碼是不會在視訊中另外出現的特定位模式。
    每個起始碼由一個起始碼字首和跟在後面的一個起始碼值組成。起始碼字首是由一串23個零值和跟在後面的一位1值組成,即“0000 0000 0000 0000 0000 00001”。
    起始碼值是個8bit整數,表明了起始碼的型別。大部分起始碼型別只有一個起始碼值,而slice_start_code由許多起始碼值表示,在這種情況下slice的起始碼值是slice_vertical_position。

表1. MPEG-2標準定義的起始碼值
在這裡插入圖片描述

4.2、 Sytax of Video Sequence

詳見標準P22。包括了Sequence header、Extension and user data、Sequence extension、Sequence display extension、Sequence scalable extension和Group of pictures header的句法。

4.3、Sytax of Picture header

詳見標準P27。包括了Picture coding extension、Quant matrix extension、Picture display extension和Picture temporal scalable extension、Copyright extension等句法。

4.4、Sytax of Picture data

詳見標準P30。

4.5、Sytax of Slice

詳見標準P32。

4.6、Sytax of Macroblock

詳見標準P33。

4.7、Sytax of Block

詳見標準P35。

5、視訊位元流的語義

5.1 視訊位元流的語法結構

圖1 高層位元流組織方式

在這裡插入圖片描述

下面的語義規則適用於:

  • 如果視訊序列的第一個sequence_header()後面沒有緊跟著sequence_extension(),那麼視訊流將與ISO/IEC 11172-2一致。
  • 如果視訊序列的第一個sequence_header()後面緊跟著一個sequence_extension(),那麼後面所有出現sequence_header的後面都要緊跟一個sequence_extension()。
  • sequence_extension僅緊跟在sequence_header後面。
  • 如果sequence_extension在位元流中出現,那麼每個picture_header後面都將緊跟一個picture_coding_extension。
  • picture_coding_extension僅緊跟在picture_header後面。
  • 跟在group_of_picure_header後面的第一個編碼影象應該是I影象。
5.2、語義分析

詳細語義參見標準P38~60。

6、視訊流解碼過程

    視訊流解碼過程就是從編碼碼流中恢復出重建影象的過程,主要包括可變長解碼VLD、反掃描、反量化、反變換IDCT和運動補償5個過程。
簡化的視訊流解碼流程如下圖所示:
在這裡插入圖片描述

視訊解碼流程

6.1、高層語法結構

    碼流中針對巨集塊和所有其他語法結構中的各種引數和標誌都應該按照第6小節(參考文獻)的語法和語義進行解釋。很多引數和標誌將會影響下面的解碼過程。一旦給定影象中所有巨集塊都解碼完,整幅影象就可以重建出來了。
    重構場圖將成對形成重構幀。
    重構幀序列需要按照6.1.1.11進行幀重排序。
    如果progressive_sequence ==1,則重構幀將以幀週期為時間間隔從解碼過程輸出。如果progressive_sequence ==0,則重構幀將被分成一個重構場的序列,在解碼過程中,以由規律的場週期為時間間隔出現。

6.2、可變長解碼VLD(Variable length decoding)

    可變長解碼的過程實質上是將編碼碼流中的VLC碼按照一定的語法規則轉化成一維殘差係數QFS[n]。

(1)幀內塊DC係數(DC coefficient(n=0))

    dct_dc = dct_dc_pred[cc] + dct_dc_diff ; 其中dct_dc_pred[cc]為DC係數預測值, dct_dc_diff為DC係數差分值。

  • 1)差分值dct_dc_diff的確定
        幀內巨集塊中塊的DC係數按照標準中附錄II-B的表II-B-12和II-B-13所定義的變長碼進行編碼,並指明dct_dc_size。如果dct_dc_size等於0,則當前幀內塊的DC係數就等於DC係數的預測值;否則,後面要跟著一個固定長度碼(以dct_dc_size為位數的dc_dct_differential)。這個DC係數差分值首先從編碼的資料中恢復出來,然後加上預測值就可以恢復出最終的解碼係數。
  • 2)預測值dct_dc_pred[cc]的確定
        有三個DC係數的預測器,每個顏色分量一個。每次對幀內巨集塊中的塊的DC係數進行解碼時,將預測值與差分值相加來恢復實際的DC係數值。然後預測器的值被設定為剛剛解碼的係數值。在下面描述的不同時刻,預測器的值需要被重置。
    • 在一個Slice的開始;
    • 當解碼的巨集塊是非幀內巨集塊時;
    • 當解碼的巨集塊時Skip塊,即當macroblock_address_increment > 1時。

復位值的確定通過引數intra_dc_precision按下表確定:
在這裡插入圖片描述

  • 3)Intra塊DC係數值QFS[0]的計算:
    在這裡插入圖片描述

    • 4)範圍限定
      位元流中有一個規定,QFS[0]必須在以下範圍內取值:
      0~((2^(8 + intra_dc_precision)) - 1)

(2)其他係數(AC係數(n>0)和非幀內塊的DC係數)
    除了幀內DC係數外的其他係數都採用標準中表B.14,B.15和B.16進行編碼。

  • 1)所有變長碼首先都要使用表B.14或表B.15來解碼,解碼值指明瞭採用下面三種行動中的哪一種。

    • 塊結束。此時塊中再沒有別的係數,塊中剩餘的係數應被置為0。採用句法"End of block"表示 。

    • 正常係數。解碼得到的run和level值的後面緊跟一個bit的s值,s給出了這個係數的符號。run個係數應該設定為0,剩餘係數應該設定為signed_level。
      if (s ==0)
      signed_level = level;
      else
      signed_level = (-level);

    • Escape編碼係數。其中run和signed_level採用定長編碼,具體見 4)Escape編碼。

  • 2)碼錶選擇
    下表指明瞭DCT係數的解碼將用到哪個表。
    在這裡插入圖片描述

  • 3)非幀內塊DC係數的解碼
        對於非幀內塊的第一個係數的解碼,需要將表B.14按照表下面的Note2和Note3所指示的那樣進行修改。這個修改僅影響了表示run=0,level=+/-1的表項。
    (此處有疑問? Note 3 & Note 4)

理解:對於非幀內塊DC係數的解碼,如果第一個係數為run=0,level=+/-1的情況,則VLC碼位1s;如果其他係數為run=0,level=+/-1的情況,則VLC編碼為11s。

   部分DCT係數表如下圖表所示:
在這裡插入圖片描述

  • 4)Escape編碼
        很多可能的run和level值的組合並沒有變長碼來表示它們。為了編碼這些統計上很少出現的組合, 採用了Escape編碼方法。
    Escape編碼方法:
    Escape VLC採用6位的固定長度碼來表示run,緊跟12位的固定長度碼錶示signed_level,表B.16中定義了緊跟ESCAPE碼後的run和level的固定長度編碼方法。
    在這裡插入圖片描述
  • 5) 其餘係數解碼的小結
    在其餘係數解碼開始,對於幀內塊n=1,對於非幀內塊,n=0。
    在這裡插入圖片描述
6.3、反掃描 Inverse scan

    以QFS[n]表示變長碼解碼器輸出端的資料,n在0~63的區間內。
    反掃描的過程就是將一維資料QFS[n]轉換成二維繫數矩陣QF[v][u],其中u和v均在區間0~7中。反掃描的塊大小為8x8。
    MPEG-2標準定義了2個掃描模板。將要採用的掃描模板通過編碼在picture_coding_extension中的句法alternate_scan來確定。

   下面圖7-2和圖7-3分別是2種掃描模板:
在這裡插入圖片描述
在這裡插入圖片描述
圖7-2為alternate_scan為0的情況,是常用的zig_zag掃描順序。
圖7-3為alternae_scan位1的情況,是垂直交替掃描方式,與MPEG-4標準中的垂直交替掃描方式一樣。

反掃描過程等效於下面過程:
在這裡插入圖片描述

6.3.1 載入矩陣的反掃描

    當量化矩陣被載入時,它們以一種掃描順序在位元流中編碼,被轉化成反量化器中使用的二維矩陣,就像係數使用的方法一樣。
    對於矩陣載入,通常採用zigzag掃描方式,即圖7-2中的掃描方式。
    以W[w][u]][v]表示反量化器中的加權矩陣,W[w][n]表示碼流中編碼的矩陣。則載入矩陣等效於下面過程:
在這裡插入圖片描述

6.4 反量化 Inverse quantisation

    二維繫數矩陣QF[v][u]通過反量化生成重構DCT係數 F[v][u]。這個過程本質上是乘以量化步長。量化步長可以通過2種方式進行修改:

  • 通過權重矩陣改變一個塊的量化步長;
  • 使用尺度因子在很少幾個位元的花費下(和編碼整個全新矩陣相比)改變數化步長。

下圖7-4描述了反量化的整個過程。通過適當的反量化演算法得到係數F’’[v][u]後,經飽和運算得到了F’[v][u],最後進行了錯誤匹配控制操作,得到最終的重建DCT係數F[v][u]。

在這裡插入圖片描述

1)幀內DC係數的反量化
F’’[0][0] = intra_dc_mult * QF[0][0]

在幀內塊中,F’’[0][0]通過一個常數因子與QF[0][0]相乘而得到,這個常數因子intra_dc_mult既不會被加權矩陣修改,也不會被比例因子修改。常數因子的值與編碼在碼中的picure_coding_extension的引數intra_dc_precision有關,具體關係如下表所示:
在這裡插入圖片描述
2)其他係數
除了幀內塊DC係數以外的其他係數的反量化在這一節中進行講述。

  • 權重矩陣
       當使用4:2:0格式時,要用到兩個加權矩陣。一個用於幀內巨集塊,另一個用於非幀內巨集塊。當使用4:2:2或4:4:4格式資料時,用到4個矩陣,允許亮度和色度資料分別使用不同矩陣。每個矩陣都有一套預設值,但可以通過載入使用者定義的矩陣而被重寫。
        以W[w][v][u]表示加權矩陣,其中w取值為0~3,表明正在使用哪一個矩陣。表7-5總結了選擇w的規則。
    在這裡插入圖片描述
  • 量化比例因子
        量化比例因子被編碼成5bit的固定長度碼,即quantiser_scale_code。這個值表示用於反量化演算法中適當的quantiser_scale值。
        q_scale_type(編碼在picture_coding_extension中)表明了應該使用哪一種quantiser_scale_code與quantiser_scale之間的對應對映關係。具體關係如下表7-6所示:
    在這裡插入圖片描述
  • 重構公式
    下面的公式表示從QF[v][u]重建得到F’’[v][u]的演算法(針對除了幀內DC係數外的其他係數):
    在這裡插入圖片描述
    這就是MPEG反量化方法。在MPEG-4標準中採用了2種反量化方法,分別是MPEG反量化方法和H263反量化方法
  • 飽和 Saturation
    反量化得到的係數要飽和到[-2048, +2047]之間,因此,飽和滿足如下公式:
    在這裡插入圖片描述
  • 錯誤匹配控制 Mismatch control
    錯誤匹配控制可以使用和下面等效的過程。首先對塊中所有重建的飽和係數F’[v][u]求和,然後判斷這個值是奇數還是偶數。如果它是偶數,那麼係數F[7][7]將要被修正。
    在這裡插入圖片描述
    在這裡插入圖片描述

3) 反量化小結
反量化過程為任何與下面在數字結果相等價的過程:
在這裡插入圖片描述

6.5 反變換 IDCT

    一旦DCT係數F[v][u]被重構,那麼就可以用反DCT變換獲得反變換值f[y][x],這些值要被飽和到 [-256, 255]。

6.5.1 相容IDCT的說明

NxN的二維DCT計算公式如下所示:
在這裡插入圖片描述

數學上實數IDCT定義如下:
在這裡插入圖片描述

整數IDCT定義如下:
    f '(x, y) = round(f(x, y)) ,其中round是取整函式,取整到最相近的整數,中間值取整到遠離0的值。
飽和的整數IDCT定義如下:
    f "(x, y) = saturate(f '(x, y))
在這裡插入圖片描述
只要滿足標準附錄A中的4個要求,解碼過程中使用的IDCT函式f[y][x]可以等於飽和的整數IDCT f "(x, y)的多個近似值。

6.5.2 非編碼塊和跳過巨集塊

    在一個非跳過巨集塊中,針對巨集塊中的特定塊,如果pattern_code[i]等於1,那麼碼流中含有這個塊的殘差資料,這將使用前面章節所述的方法進行解碼。否則,如果pattern_code[i]等於0或者當前巨集塊是Skip塊,那麼這個塊不包含殘差資料。因此這種塊畫素域係數f[y][x]都將取零值(即非編碼塊和跳過巨集塊的殘差為0)。

6.6 運動補償 Motion compensation

    運動補償過程是利用前面解碼的影象形成預測,然後與殘差係數資料(IDCT過程的輸出)結合恢復出最終解碼影象。前面6.2~6.5過程都是在講述殘差資料的解碼過程,本小節重點講述預測影象的建立過程,即基於插值的運動補償過程。
圖7-5表示這個過程的簡化流程圖。
在這裡插入圖片描述
通常,對於每個塊最多可以形成4種獨立的預測,組合起來形成最終的預測塊p[y][x]。

  • 對於幀內編碼巨集塊,沒有預測,因而p[y][x]為0。
  • 對於不編碼的巨集塊,則可能是由於整個巨集塊都是Skip塊,或者是由於這個不編碼的塊沒有殘差係數。在這種情況下,f[y][x]為0,解碼樣本僅為預測值p[y][x]。
6.6.1 預測方式 Prediction modes

預測方式主要有2種:場預測和幀預測
在場預測中,通過使用一個或多個以前解碼場中的資料,每個場都可以獨立的進行預測。幀預測由一個或多個以前的解碼幀形成幀的預測。

注意:
(1)用來產生預測的這些場和幀本身是可以按照場圖或幀圖進行解碼的。
(2)在一個場圖中,所有預測都是場預測。而在幀圖中,既可能用到場預測,也可能用到幀預測(在巨集塊基礎上選擇)。

除了場預測和幀預測這兩種模式,還使用到兩種特殊的預測模式:

  • 16x8運動補償
    這種模式僅用於場圖。其中,每個巨集塊使用兩個運動向量,第一個運動向量用於上面的16x8區域,第二個運動向量用於下面的16x8區域。對於雙向預測巨集塊,總共要用到四個運動向量,兩個用於前向預測,兩個用於後向預測。

  • 雙基 dual-prime
    這種模式僅用於在參考場(幀)與被預測場(幀)之間沒有B圖的P圖。其中,在位元流中,僅有一個運動向量和一個小的差分運動向量被編碼。
    對於場圖,從這個資訊中可以得到兩個運動向量,它們用於分別從兩個參考場(一個頂場,一個底場)中形成預測,之後被平均來形成最終的預測?
    對於幀圖,兩個場都重複這一過程,因此總共進行4個場預測。

  • 換個角度小結一下
    從前向預測和後向預測的角度來看預測方式:

    • 前向預測
      對於幀影象,預測方式有幀預測、場預測和雙基預測;
      對於場影象,預測方式有場預測、16x8運動補償和雙基預測。
    • 後向預測
      對於幀影象,預測方式有幀預測和場預測;
      對於場影象,預測方式有場預測和16x8運動補償。
      因此,只有雙基預測方式,既可以用於幀影象,也可以用於場影象。
6.6.2 參考幀(場)的選擇
  1. 場預測
    P圖的場預測:
    在P圖中,採用最近解碼的兩個解碼場進行預測。
    有如下幾種情況:
    1)對幀圖進行場預測或者對編碼幀的一個場圖(頂場)進行預測:
    如下圖7-6所示:

注意:
1.參考場本身可能由兩個場圖或者單個幀圖重構而成;
2.在對一個場圖進行預測是,被預測的場既可以是頂場,也可以是底場。

2)對編碼幀的第二個場圖進行預測:
要用到兩個最近被解碼的參考場,其中最近一個參考場要通過對這個編碼幀的第一個場圖解碼得到。
如下圖7-7表示第二個場圖為底場的情形。(此處有疑問?)
在這裡插入圖片描述
圖7-8表示當第二個場圖為頂場的情形。
在這裡插入圖片描述

B圖的場預測:
在B圖中,場預測應該由最近重構的兩個參考幀的兩場進行預測。如下圖所示:
在這裡插入圖片描述

注意: 參考幀本身可能是由兩個場圖或者一個單一的幀影象重構而成。

  1. 幀預測
    對於P圖,利用最近重構的參考幀進行預測,如下圖7-10所示。
    在這裡插入圖片描述

注意:

  1. MPEG-2只支援單參考幀預測,一般是最近重構的前一幀(對於P幀)。MPEG-4中的P幀也支援單參考幀預測,到H264才支援多參考幀。
  2. 參考幀本身可能是由兩個場圖或者一個單一的幀影象重構而成。

對於B圖,幀預測通過兩個最近的重構參考幀進行,如圖7-11所示:
在這裡插入圖片描述

6.6.3 運動向量

    為了減少表示運動向量所需要的bit數,運動向量根據前一個運動向量進行差分編碼。為了解碼運動向量,解碼器必須保持4個運動向量預測器PMV[r][s][t]。對於每個預測,先得到一個運動向量 vector’[r][s][t],然後根據取樣格式(4:2:0或4:2:2或4:4:4)對其進行改變,為每個顏色分量給出一個運動向量vector[r][s][t]。這個陣列中維數的含義如圖表7-7所示:
在這裡插入圖片描述

  1. 運動向量解碼
    每個運動向量分量vector’[r][s][t]都應該按照與下面等價的過程進行計算。並且運動向量預測器也應按照這個過程進行修改。
    在這裡插入圖片描述

  2. 運動向量限制
    在幀圖中,場運動向量的垂直分量應該受到限制,以使它們僅覆蓋與那些運動向量相關的f_code所支援範圍的一半。這個限制保證了運動向量預測器對於解碼後續幀運動向量能夠具有合適的值。限制如表7-8所示:

  3. 更新和復位運動向量預測器
    復位運動向量預測器:
    當巨集塊中所有運動向量解碼完之後,有時需要修改一些運動向量預測器。這是因為在一些預測模式中,可能會使用少於最大可能數目的運動向量。
    運動向量預測器應按表7-9和表7-10所示進行修改。
    復位運動向量預測器:
    在下列情況下,所有的運動向量預測器都將被複位為零。

    • 在每個slice的開始;
    • 當沒有隱藏運動向量的幀內巨集塊被解碼時;
    • 在P圖中,當macroblock_motion_forward為零的非幀內巨集塊被解碼時;
    • 在P圖中,當一個巨集塊被跳過時。
  4. P幀的預測
    在P幀中,如果macroblock_motion_forward為0並且macroblock_intra為零,則這個巨集塊沒有運動向量編碼,然後必然形成預測。運動向量為(0, 0)。此時運動向量預測器應該被複位為0。

  5. 色度分量的運動向量確定
    前面章節所計算的運動向量都是針對亮度分量: vector[r][s][t] = vector’[r][s][t] (for all r, s and t)
    對於每個色度分量,運動向量按照如下方式進行改變:
    4:2:0 運動向量的水平和垂直分量都除以2
    vector[r][s][0] = vector’[r][s][0] / 2;
    vector[r][s][1] = vector’[r][s][1] / 2;
    4:2:2 運動向量的水平分量除以2,垂直分量不變
    vector[r][s][0] = vector’[r][s][0] / 2;
    vector[r][s][1] = vector’[r][s][1];
    4:4:4 不修改運動向量
    vector[r][s][0] = vector’[r][s][0];
    vector[r][s][1] = vector’[r][s][1];

  6. 隱藏的運動向量
    隱藏的運動向量是幀內巨集塊中所帶的運動向量,是為了資料錯誤阻礙了係數解碼時來掩蓋錯誤引入的。當且僅當concealment_motion_vectors(在picuture_coding_extension中)的值為1時,在所有幀內巨集塊中均會出現隱藏的運動向量。
    隱藏運動向量是用於由於資料錯誤而導致資訊丟失的情況。

  7. 雙基附加演算法
    雙基附加演算法詳見標準P77(7.6.3.6 Dual prime additional algorithm)。

6.6.4 形成預測

預測通過從參考幀或場中讀取預測畫素而形成。一個給定樣本通過讀取參考幀或參考場由運動向量指明的相應樣本而被預測。
所有運動向量被規定為半畫素精度。半畫素的情況通過簡單的線性插值獲得。
預測過程如下:
在這裡插入圖片描述
在這裡插入圖片描述

6.6.5 跳過巨集塊

跳過巨集塊(Skip巨集塊)表示沒有資料被編碼,跳過巨集塊是編碼的slice的一部分。
對於Skip巨集塊,預測值等於重構值。
除了在一個slice的開始,如果number(macroblock_address - previous_macroblock_address -1)大於1,則表示需要跳過number個巨集塊的編碼。

其中在P圖和B圖中對跳過巨集塊的處理不同,並且對於幀和場的處理也不同。

  • P場圖
    • 按照field_motion_type為基於場的方式進行預測;
    • 參考場應該為與當前場具有相同奇偶性的場;
    • 運動向量預測器應該被複位為0;
    • 運動向量應為0。
  • P幀圖
    • 按照frame_motion_type為基於幀的方式進行預測;
    • 運動向量預測器應復位為0;
    • 運動向量應為0。
  • B場圖
    • 按照field_motion_type為基於場的方式進行預測;
    • 參考場應該為與當前場具有相同奇偶性的場;
    • 預測方向(前向、後向或雙向)應該與前一個巨集塊相同 。
    • 運動向量預測器不受影響。
    • 運動向量通過合適的運動向量預測器得到。色度分量的運動向量的改變按照標準7.6.3.7所述。
  • B幀圖
    • 按照frame_motion_type為基於幀的方式進行預測;
    • 預測方向(前向、後向或雙向)應該與前一個巨集塊相同;
    • 運動向量預測器不受影響
    • 運動向量通過合適的運動向量預測器得到。色度分量的運動向量的改變按照標準7.6.3.7所述。
6.6.6 組合預測

最後的步驟是將各種預測組合到一塊,以形成最終的預測塊。
將這些資料按場或幀的方式組織到塊中,並且使其可以直接加到解碼係數上。
變換系數是以場組織方式還是以幀組織方式是由dct_type決定的。

  • 簡單幀預測
    對於簡單的幀預測來說,所需要做的進一步處理就是將B圖中的前向預測和後向預測求平均。
    如果pel_pred_forward[y][x]是前向預測樣本,且pel_pred_backward[y][x]是對應的後向預測樣本,則最終的預測樣本應如下形成:
    在這裡插入圖片描述
    對於4:2:0格式、4:2:2格式和4:4:4格式的色度分量預測,對應塊尺寸應分別為8x8,16x8和16x8。

  • 簡單場預測
    對於簡單的場預測來說,所需要做的進一步處理僅是將B圖中前向和後向預測求平均。這將按照上一節中幀預測那樣實現。

    • 對於幀影象中的簡單場預測,每個場中的4:2:0格式、4:2:2格式和4:4:4格式的色度分量的塊尺寸應分別4x8,8x8和16x8。
    • 對於場影象中的簡單場預測,每個場中4:2:0格式、4:2:2格式和4:4:4格式的色度分量的塊尺寸應分別8x8,16x8和16x16。
  • 16x8運動補償
    在這種預測模式中,巨集塊的上邊16x8區域和下邊16x8區域會分別形成預測。
    對於每個16x8區域的色度分量的預測,4:2:0格式、4:2:2格式和4:4:4格式對應的塊尺寸分別為4x8,8x8和8x16。

  • 雙基預測
    在雙基模式中,對於每個場都形成預測,採用與B圖中的後向和前向預測的方式。如果pel_pred_same_parity[y][x]是由相同奇偶性場中得到的預測樣本,pel_opposite_parity[y][x]是由相反奇偶性場中得到的樣本,則最終的預測樣本按照如下公式形成:
    在這裡插入圖片描述

    • 對於幀圖中的雙基預測,對於每個場中4:2:0格式、4:2:2格式和4:4:4格式的色度分量預測,對應的塊尺寸應分別為8x4,8x8和16x8。
    • 對於場圖中的雙基預測,對於每個場中:2:0格式、4:2:2格式和4:4:4格式的色度分量預測,對應的塊尺寸應分別8x8,16x8和16x16。
6.6.7 預測和殘差資料求和

預測塊得到之後 ,並按照與變換資料塊所用的幀/場結構相匹配的方式重組為預測畫素塊p[y][x]。
變換資料塊f[y][x]加上預測資料塊並飽和後形成最終的解碼樣本d[y][x],如下所示:
在這裡插入圖片描述

6.7 可分級編碼

MPEG-2標準支援空域分級、時域分級、SNR分級和資料分割四種基本可分級方式。
下面進行簡單介紹,詳細解碼過程可以參見標準7.7~7.11節。

  • 空域分級擴充套件
    主要用於電信、視訊標準交替、視訊資料庫瀏覽、HDTV和TV交替等應用中,即我們需要一個至少有兩個空間解析度層次的視訊系統。空域分級包括從一個視訊源中產生兩個空間解析度的視訊層。這樣,低層自己編碼來提供基本的空間解析度;增強層利用這個空域插值的低層來生成輸入視訊源的全解析度。
  • 時域分級擴充套件
    時域分級擴充套件主要用於與從電信到HDTV的不同視訊應用中,對它們來說,從低時域解析度到高時域解析度的轉變是必要的。時域可分級將視訊幀分割成層,這樣,低層自身編碼提供基本的時域解析度,而增強層通過對低層進行時域預測編碼,最後通過對這些層解碼和時域多路複合來產生視訊源的全時域解析度。
  • SNR可分級擴充套件
    SNR可分級主要用於電信、多質量視訊服務、TV和HDTV的應用中,即我們需要一個至少有兩個視訊質量層的視訊系統。 SNR分級包括從一個視訊源中產生兩個具有相同的空間解析度和不同的視訊質量的視訊層,其中,低層自己編碼來提供基本的視訊質量,而增強層被編碼來增強低層。當把增強層加回到低層時,將會重新產生輸入視訊的一個高質量的重構。
  • 資料分割擴充套件
    在ATM網路、陸上廣播等應用中,我們可以有兩個通道供視訊流進行儲存和傳送,這種情況下可以用到資料分割。在這兩個通道間位元流被分割,這樣,位元流中的重要部分(比如頭資訊、運動向量、DC係數)可以在錯誤率低的通道中傳送,而不重要的部分(比如DCT係數)可以在較差的通道中傳送。這樣,可以將通道錯誤造成的損失降到最小。
7、參考文獻

https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-H.262-200002-S!!PDF-E&type=itemshttp://ecee.colorado.edu/~ecen5653/ecen5653/papers/iso13818-2.pdf


THE END!