H.264解碼器中CABAC硬體加速器的實現

來源:互聯網
上載者:User

 

H.264解碼器中CABAC硬體加速器的實現   H.264有兩種熵編碼方案:一種是從可變長編碼方案發展而來的基於內容相關的自適應可變長編碼CAVLC;另
一種是從算術編碼發展而來的基於內容相關的自適應二進位算術編碼CABAC。與CAVLC相比,CABAC可以節省約7%的碼流,但增加了10%的計算時
間。在解高清碼流時,用軟體來做CABAC這樣複雜的熵解碼,無法完成即時解碼的任務,因此,設計硬體加速器是非常必要的。   CABAC解碼演算法   在H.264解碼器的輸入碼流中,資料的基本單位是句法元素(Syntax
Element),碼流是由一個個句法元素依次銜接而成的。每個句法元素由若干位元組成,表示某個特定的物理意義。在H.264定義的碼流中,句法元素被
組織成有層次的結構,分別描述序列(Sequence)、映像(Picture)、片(Slice)、宏塊(Macroblock)、子宏塊
(Subblock)五個層次的資訊,CABAC主要負責對片層以下的句法元素進行解碼。   CABAC解碼的總體過程可以分為三個步驟:初始化、二進位算術解碼歸一化、反二進位。   初始化   該過程在每一個片開始時執行,包括上下文模型變數(Context Variable)的初始化和解碼引擎(Decoding Engine)的初始化。   二進位算術解碼和歸一化   二進位算術解碼是CABAC解碼的核心部分,該過程實現1bit資料的解碼,對每個句法元素進行解碼都需要調
用該過程。H.264中二進位算術解碼有三種模式:規則解碼(Decode Decision)、旁路解碼(Decode
Bypass)和結束解碼(Decode Terminate)。對不同句法元素進行解碼時,分別調用這三種模式的一種或多種。   反二進位化   CABAC定義了四種二進位化方法:一元碼(Unary)、截斷一元碼(Truncated
Unary)、K階指數哥倫布碼(kth order
Exp-Golomb)和定長碼(Fixed-Length)。一個句法元素可以對應一種或兩種上述二進位化方法,但特殊的是,句法元素mb_type和
sub_mb_type的反二進位化獨立於上述四種方法,它們通過查表來實現。
  
  CABAC硬體加速器的架構設計   H.264解碼器的軟/硬體劃分   H.264解碼過程採用軟/硬體聯合的解碼方案,整個解碼器由32位CPU、DSP結構的運算單元和硬體加速器組成。CABAC熵解碼部分,主要是一些判斷和分支操作,資料介面、輸送量不大,這些任務由軟體和硬體加速器共同完成。本文設計的CABAC解碼模組就是一個CABAC硬體加速器。   CABAC硬體加速器的總體構架   CABAC硬體加速器的總體架構分為兩層:頂層是CABAC_TOP;底層有7個模組,包括
CABAC_Center_ Control_Unit、Context、 Neighbor_MB_Information,
Context_Init、AC_next_ state_LPS、 AC_next_state_MPS和RangeLPS。   CABAC_Center_Control_Unit模組負責上下文模型變數的初始化,解句法元素,更新
Context,並將解出的殘差資料傳給IQ&IDCT模組;Context模組是雙口RAM,存放459個上下文模型變數,可同時對一個地址的
上下文模型變數進行讀操作並對另外一個地址的上下文模型變數進行寫操作;Neighbor_MB_Information模組是SRAM,存放宏塊信
息,CABAC解碼器在解析當前宏塊中的句法元素時,需要參考上面和左面宏塊的資訊,因此,需要在該SRAM內儲存映像中當前宏塊的上一行宏塊和該行之前
宏塊的資訊,每解完一個宏塊更新該SRAM;Context_Init模組是一塊片內ROM,用於初始設定變數;3個尋找表模組
AC_next_state_LPS、AC_next_ state_MPS和RangeLPS由組合邏輯實現,用於二進位算術解碼過程中的查表運算。 本設計的目標是使整個H.264解碼器的晶片能夠對高清映像(1920×1088)進行即時解碼。假設晶片工作在166MHz的頻率下,映像播放速率是
25fps,則平均解一個宏塊的時間是823個刻度。考慮到H.264熵解碼部分的運算總體上是串列解碼,並行性較差,因此CABAC硬體加速器需要
在3個刻度內完成1bit資料的解碼。假設視頻映像的壓縮比為20:1,YUV為4:2:0取樣,因為取樣值是8bit,則每個像素為8bit×1.5=12bit。CABAC的解碼率約為
1:1.2,所以CABAC要解的碼流是(1920×1088×12bit/20)×1.2,約1.43Mb。晶片工作頻率是166MHz,每3個時鐘解
出1bit,則解碼資料率約為55.3Mbps,本設計在解碼時CABAC佔用了90%,約為49.8Mbps。因此解碼速度為49.8/1.43,約
34.7fps,即1s可以解34.7幀,則解1幀(1920×1088)大約需要28.8ms。 為了達到該目標,CABAC硬體加速器的設計必須對核心的二進位算術解碼進行最佳化。根據歸一化演算法的特點,即迴圈的次數可由輸入的codIRange、
codIOffset和查表得到的codIRangeLPS事先判斷出來,因此可以合并二進位化和歸一化這兩個步驟,使其在1個刻度內完成。由於篇幅
有限,下面僅以三種模式中的規則解碼為例,說明二進位算術解碼和歸一化的硬體化,旁路解碼和結束解碼可參考H.264標準。規則解碼的二進位算術解碼和歸一化過程主要包括比較、減法、查表、移位操作。在H.264中,為了減少計算的複雜度,CABAC首先建立一個64×4的二
維表格rangeTabLPS[64][4],存放預先計算好的乘法結果。表格的入口參數是pStateIdx和qCodIRangeIdx,其中
qCodIRangeIdx由變數codIRange量化而來,量化方法是(codIRange>>6)&3。其Verilog
HDL實現如下:     assign qCodIRangeIdx= (codIRange>>6)&2'b11;
always@(pStateIdx or qCodIRangeIdx)
begin 
case{pStateIdx, qCodIRangeIdx}
       0: codIRangeLPS=0;
        … …
       255:codIRangeLPS=63;
    endcase
end建立了機率模型和乘法模型後,在遞進計算過程中CABAC必須儲存一下變數:當前區間的下限codIOffset、當前區間的大小codIRange、當
前MPS(大機率符號)字元valMPS、LPS(小機率符號)的機率編號pStateIdx。transIdxLPS[pStateIdx]和
transIdxMPS[pStateIdx]是兩個深度為64項的表格,其中pStateIdx的取值為0~63。接下來是歸一化判斷,當
codIRange小於0x0100時,需進行歸一化。這樣就能在1個刻度內完成二進位化和歸一化兩個步驟,其Verilog HDL實現如下:always@(posedge clk or negedge rst)
if( !rst)
   ... ...
  else
   begin
     if(codIOffset>= codIRange-codIRangeLPS)
       begin
       binVal<=~valMPS;
    codIOffset<=codIOffset-(codIRange-codIRangeLPS);
    codIRange<=codIRangeLPS;
 if(pStateIdx==0)
  valMPS<=1-valMPS;
  pStateIdx<=transIdxLPS[pStateIdx];
        end
     else
        begin
        binVal<=valMPS;
pStateIdx<=transIdxMPS[pStateIdx];
       end
       while(codIRange<0x100) //註:此語句不可綜合
       begin
         codIRange<= (codIRange-codIRangeLPS)<<1;
?codIOffset<=(codIOffset<<1) |read_bits(1);
       end
   endCABAC的加速策略狀態機器的設計     二進位算術解碼的狀態機器是本設計的核心,該部分效率的高低將直接影響到CABAC硬體加速器的解碼速度。在CABAC模組沒有被啟動時,狀態機器將一直停留
在初始狀態,當一個新片開始時,初始化解碼引擎;當收到CPU發出的解碼請求時,首先進入預解碼狀態,讀取上下文模型變數,然後在下一個時鐘進入二進位算
術解碼狀態,完成1bit資料的解碼。在CABAC解碼過程中,系統會根據句法元素的種類和當前資料的位置選擇解碼模式。 流水線的設計     CABAC對1bit資料進行解碼的過程可分為兩個步驟:讀取上下文模型變數、解碼並更新上下文模型變數。本設計採用兩級流水線結構,在對當前資料進行解碼的同時,可讀取下個資料的上下文模型變數,因此加快瞭解碼速度。  碼流讀取的雙緩衝設計     進行解碼的時候,為了提高傳輸效率,採用雙緩衝的形式。在匯流排給其中一個緩衝傳輸資料的時候,解碼器可從另外一個緩衝裡讀取資料進行解碼,從而使傳輸和解碼同時進行,有效提高了傳輸效率。     設計結果與效能模擬             在設計完成後,利用JVT提供的標準測試碼流進行測試,通過了模擬驗證。結果顯示,本設計平均每2個刻度可完成1bit資料的解碼。在SMIC 0.18mm CMOS工藝標準單元庫的基礎上進行DC(Design Compile)綜合,硬體加速器的面積為0.38mm2(不包括片外SRAM所佔用的面積),工作頻率可達166MHz,達到了預期要求。為了顯示硬體加速器的優勢,選擇參考軟體JM7.4的函數biari_decode_symbol完成二進位算術解碼和歸一化。Visual C++
6.0編譯器的編譯結果顯示該函數使用了109個彙編指令,因此用軟體完成1bit資料的解碼至少需要100個刻度。而利用本設計完成同樣的步驟時,最多隻需3個刻度,很好地達到了加速器的作用。
  
結語:          由於採用了一系列的最佳化方案,同時,在設計時考慮瞭解碼速度及解碼系統中各個模組之間的協調,本文實現了熵解碼CABAC的快速解碼,能完成高清碼流的即時解碼任務,在視頻解碼晶片中有很好的應用價值。

  • 上一篇:CAVLC中的首碼和尾碼
  • 下一篇:Android調試的必殺技——反組譯碼
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.