H.264解碼糾錯(cuò)在軟硬件協(xié)同系統(tǒng)中的實(shí)現(xiàn)
硬件主要負(fù)責(zé)宏塊層和子宏塊層的解碼,能夠發(fā)現(xiàn)預(yù)測(cè)模式、熵解碼的錯(cuò)誤。如果硬件解碼過(guò)程中檢測(cè)出錯(cuò)誤,硬件會(huì)向軟件發(fā)送HasErr_h(yuǎn)w 信號(hào)。例如在幀內(nèi)預(yù)測(cè)時(shí),需要判斷相鄰宏塊的可用情況。在讀幀內(nèi)預(yù)測(cè)模式的語(yǔ)句后加入以下判斷:
整個(gè)糾錯(cuò)過(guò)程由軟件控制,修補(bǔ)過(guò)程由軟件直接發(fā)送數(shù)據(jù)給硬件后端。硬件檢測(cè)出錯(cuò)誤并向軟件傳遞HasErr 信號(hào),軟件會(huì)做相應(yīng)的數(shù)據(jù)處理,向硬件發(fā)送Err_Processing 信號(hào), 并根據(jù)錯(cuò)誤修補(bǔ)方案代替前端數(shù)據(jù)處理部分為解碼器后端提供數(shù)據(jù),如圖3 中虛線所示。
圖3 H.264 解碼器結(jié)構(gòu)圖
在修補(bǔ)過(guò)程中, 由于采用基于空間連續(xù)性的預(yù)測(cè),所以可以使用原有硬件中的幀內(nèi)預(yù)測(cè)部分。但是,出錯(cuò)后原有的一些信號(hào)需要做相應(yīng)的處理,否則控制部分的一些狀態(tài)機(jī)會(huì)進(jìn)入異常狀態(tài)導(dǎo)致硬件無(wú)法繼續(xù)正常運(yùn)行。
4 實(shí)驗(yàn)結(jié)果
本實(shí)驗(yàn)先在PC 機(jī)上對(duì)C 模型修改和完善,硬件測(cè)試平臺(tái)則采用Xilinx Virtex4 系列的開(kāi)發(fā)板。解碼器軟件部分使用C 語(yǔ)言編寫,Linux 下gcc 編譯,生成的二進(jìn)制文件運(yùn)行于基于開(kāi)放核OPENRISC1200 的CPU;硬件部分使用Verilog HDL 描述。測(cè)試所用輸入碼流為ITU-T 提供的參考序列[2],加入11 個(gè)固定噪聲樣本。實(shí)驗(yàn)證明解碼器能順利解碼的噪聲碼流比例有了很大提高,圖像播放流暢,很多受損的地方得到了較好的修補(bǔ),但是也有一些能看出明顯的修補(bǔ)痕跡。
5 結(jié)論
在解碼器中加入錯(cuò)誤檢查和修補(bǔ)功能,提高了解碼器處理受損碼流的能力,解碼器因此可以在更復(fù)雜的環(huán)境中使用,穩(wěn)定性也有所提高。H.264 視頻壓縮標(biāo)準(zhǔn)本身具有一些支持錯(cuò)誤修補(bǔ)的技術(shù),比如可以多次重復(fù)傳輸SPS 和PPS,多個(gè)Slice,F(xiàn)MO 等。多次傳輸SPS 和PPS 以降低傳輸效率為代價(jià)獲得接收端更高的準(zhǔn)確率, 這在某些環(huán)境中是非常必要的。多個(gè)Slice 和FMO 在一定程度上增加了編碼和解碼的復(fù)雜度,但是它使得更多的周邊宏塊信息可以用于受損宏塊的預(yù)測(cè)和修補(bǔ)。此外,就修補(bǔ)方式而言,也有基于幀間相關(guān)性和其它幀內(nèi)預(yù)測(cè)插值方法的研究。本實(shí)驗(yàn)的主要目標(biāo)是使解碼器能順利解碼并且盡量重復(fù)利用已有的硬件單元,減少由于添加糾錯(cuò)功能帶來(lái)的硬件面積增加。采用16×16 幀內(nèi)預(yù)測(cè)的方法修補(bǔ),圖像質(zhì)量相對(duì)于未修補(bǔ)時(shí)有了很大提高,但是有些地方還是有比較明顯的修補(bǔ)痕跡。尋找更好的圖像修補(bǔ)辦法,使修補(bǔ)后的圖像盡量接近原始圖像,減少可以明顯分辨的修補(bǔ)痕跡,這些是需要繼續(xù)研究的內(nèi)容。
評(píng)論