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