H.264解碼糾錯在軟硬件協(xié)同系統中的實(shí)現
1 引言
本文引用地址:http://dyxdggzs.com/article/166192.htmH.264 視頻壓縮標準具有很高的壓縮效率和很好的網(wǎng)絡(luò )支持, 非常適應于無(wú)線(xiàn)多媒體和基于Internet 的應用。在信息傳輸的過(guò)程中,不可避免的就是噪聲。H.264 本身具有很好的抗噪聲技術(shù),如SPS,PPS 和圖像數據的分開(kāi)打包, 一幀中可有多個(gè)Slice,靈活宏塊順序(FMO)等。但是也有很多情況錯誤無(wú)法被完全修復。H.264 具有很高的壓縮率(7~50 倍),這就意味著(zhù)圖像中的冗余已經(jīng)被大大消除,要從其余的碼流中恢復圖像有很大困難。此外,H.264 壓縮標準采用變長(cháng)編碼的CAVLC 和CABAC,一旦在這些地方出錯, 解碼器將無(wú)法判斷下一個(gè)變長(cháng)碼開(kāi)始的位置,導致錯誤的擴散。
在硬件方面,解碼過(guò)程中各部分的實(shí)現都有其固定的結構,如果不及時(shí)檢出錯誤,會(huì )導致如內存溢出、查表錯誤、狀態(tài)機進(jìn)入死循環(huán)等。解碼出的圖像會(huì )錯位或者變形, 更嚴重的時(shí)候整個(gè)解碼器會(huì )停止運行。
所以在解碼器中加入糾錯功能,及早地發(fā)現碼流噪聲并將解碼器恢復到正常的狀態(tài)是非常有意義而且非常必要的。
本項目的解碼器是基于SoC 的ASIC 解決方案,它具有高速、低功耗、低成本的特點(diǎn)。添加糾錯功能可以提高解碼器的適用性和穩定性,另一方面,應該盡量減少糾錯模塊對原有芯片的面積和速度的影響。
2 碼流結構和錯誤檢出
H.264 標準壓縮的碼流具有嚴格的格式。公共信息被提取出來(lái)作為SPS(序列參數集), PPS(圖像參數集)單獨打包,與像素信息分離。SPS 和PPS 是碼流中極為重要的信息,將它們單獨打包可以在傳輸環(huán)境較差的情況下多次傳送,這在一定程度上增強了碼流傳輸的抗干擾能力。每個(gè)包被稱(chēng)作一個(gè)NAL 單元,根據NAL 類(lèi)型,各個(gè)數據包中的數據按照協(xié)議中規定的句法元素順序緊密排列。這為糾錯提供了兩點(diǎn)便利:(1)各個(gè)NAL 中的錯誤不會(huì )蔓延,即如果當前NAL 中檢測出了錯誤而且又無(wú)法確定錯誤終止的地方,那么可以將當前包丟棄,直到下一個(gè)NAL 開(kāi)始;(2)很多句法元素都有其固定的范圍。檢測解碼出的元素值是否超出范圍限制是一個(gè)非常有用的辦法,也能盡早發(fā)現錯誤,避免解碼器進(jìn)入異常狀態(tài)。
H.264 視頻碼流包括五個(gè)層次的信息: 序列層,圖像層,片層,宏塊層,子宏塊層,分別與NAL 類(lèi)型的SPS,PPS,Slice(包括片頭,宏塊,子宏塊信息)相對應。
宏塊是編解碼處理的基本單位,也是進(jìn)行錯誤修補的基本單位。H.264 視頻碼流結構如圖1 所示。
圖1 H.264 碼流結構
在上面的幾個(gè)層次中,每一層都具有其特定的句法元素結構,以及相應句法的處理辦法,整個(gè)錯誤檢測功能就是基于此實(shí)現的。目前可以檢測到的錯誤基于以下幾類(lèi):
?。?)保留位錯誤。這是最容易檢測出的錯誤。在H.264 協(xié)議中規定了一些保留位, 如NAL 起始的forbidden_zero_bit,SPS 中的reserved_zero_4bits 等。解碼器順序讀入碼流時(shí)要確定這些保留位的值是正確的,如果有誤,就應該丟棄當前的包或者標記錯誤,做進(jìn)一步的處理。
?。?)句法元素值不在指定范圍。大多數的句法元素,尤其是在SPS 和PPS,都有一個(gè)指定的范圍。如用于計算最大幀數的log2_max_frame_num_minus4 必須在0~12 之間,如果讀入的值超出這個(gè)范圍,即可以判斷當前讀入的碼流有錯誤。
?。?)相關(guān)句法元素矛盾。有一些句法元素讀入了一個(gè)錯誤的值,但仍然在正確的范圍內,單單通過(guò)當前語(yǔ)句是無(wú)法檢測出的。這時(shí)候就要利用句法元素之間的相關(guān)性,判斷讀出的值是否合理。例如PPS 中要指定當前圖像所引用的序列參數信息, 即PPS->seq_parAMEter_set_id。如果當前引用的SPS 的ID 在所有收到的SPS 中不存在, 即可判斷SPS 或者當前PPS 有一方出了問(wèn)題; 對于slice_type 的I,B,P 各種類(lèi)型,mb_type 的查表方法也不同, 如果在I slice 中出現了幀間預測的宏塊類(lèi)型,也可以判斷出錯。
以上方法都是可以通過(guò)句法元素本身的值判斷出來(lái)的,可以在讀入碼流的同時(shí)處理,即在處理PPS、SPS 的相應語(yǔ)句后加入判斷,不會(huì )對原有解碼器造成太大的影響。
評論