AVS-M與H.264(Baseline)視頻解碼器結(jié)構(gòu)的分析
H.264是JVT組織起草的一個(gè)覆蓋多種應(yīng)用和面向多種傳輸環(huán)境的國際標(biāo)準(zhǔn),它規(guī)定了三種檔次,基本檔次(Baseline profile)、主要檔次(Main profile)和擴(kuò)展檔次(Extended profile),其中基本檔次利用I片和P片支持幀內(nèi)和幀間編碼,支持利用基于上下文的自適應(yīng)的變長編碼進(jìn)行的熵編碼(CAVLC),主要用于會(huì)議電視、可視電話和無線通信等實(shí)時(shí)視頻通信。
AVS(Audio video coding)標(biāo)準(zhǔn)是由我國自主制定,擁有自主知識(shí)產(chǎn)權(quán)的音視頻編解碼技術(shù)標(biāo)準(zhǔn)。AVS-M(Mobile video)是AVS系列標(biāo)準(zhǔn)中的第七部分――移動(dòng)視頻,應(yīng)用于數(shù)字存儲(chǔ)媒體、寬帶視頻業(yè)務(wù)、遠(yuǎn)程監(jiān)控和可視電話等。
AVS-M和H.264(Baseline)視頻解碼器在結(jié)構(gòu)上十分相似,但又各有其核心思想,本文基于JM10.2和WM3.3源代碼對(duì)兩解碼器的關(guān)鍵技術(shù)作了詳細(xì)分析。程序中并未單獨(dú)有H.264(Baseline)的代碼,是筆者從JM10.2中抽取出來分析的,下文中H.264均表示從基本檔次上考慮。
兩種標(biāo)準(zhǔn)的解碼器結(jié)構(gòu)
AVS-M和H.264視頻解碼器都只需考慮I幀和P幀(為了兩標(biāo)準(zhǔn)視頻解碼器更好地比較,本文對(duì)H.264只考慮幀圖像,不考慮場圖像)的解碼,總體思想是從比特流中解出頭信息,產(chǎn)生預(yù)測塊,熵解碼得到的量化系數(shù)經(jīng)反量化、反變換得到殘差塊,預(yù)測塊和殘差塊相加后,經(jīng)過濾波器即可得到重建的圖像,其結(jié)構(gòu)框圖如圖1所示。
圖1 解碼器總體框架
在實(shí)際應(yīng)用當(dāng)中,這兩種標(biāo)準(zhǔn)設(shè)計(jì)出來的解碼器應(yīng)用領(lǐng)域有所不同,現(xiàn)就以下幾個(gè)方面分析兩種標(biāo)準(zhǔn)的差異。
1 比特流信息
①NALU(Network Abstract Layer Unit):兩標(biāo)準(zhǔn)中的比特流都是以NAL為單位,每個(gè)NAL單元包含一個(gè)RBSP,NALU的頭信息定義了RBSP所屬類型。類型一般包括序列參數(shù)集(SPS)、圖像參數(shù)集(PPS)、增強(qiáng)信息(SEI)、條帶(Slice)等,其中,SPS和PPS屬于參數(shù)集,兩標(biāo)準(zhǔn)采用參數(shù)集機(jī)制是為了將一些重要的序列、圖像參數(shù)(解碼圖像尺寸、片組數(shù)、參考幀數(shù)、量化和濾波參數(shù)標(biāo)記等)與其他參數(shù)分離,通過解碼器先解碼出來。此外,為了增強(qiáng)圖像的清晰度,AVS-M增加了圖像頭(Picture head)信息。讀取NALU過程中,每個(gè)NALU前有一個(gè)起始碼0x000001,為防止內(nèi)部0x000001序列競爭,H.264編碼器在最后一字節(jié)前插入一個(gè)新的字節(jié)――0x03,所以解碼器檢測到該序列時(shí),需將0x03刪掉,而AVS-M只需識(shí)別出起始碼0x000001。
②讀取宏塊類型(mb type)和宏塊編碼模板(cbp):編解碼圖像以宏塊劃分,一個(gè)宏塊由一個(gè)16*16亮度塊和相應(yīng)的一個(gè)8*8cb和一個(gè)8*8cr色度塊組成。
(a) 兩標(biāo)準(zhǔn)的幀內(nèi)、幀間預(yù)測時(shí)宏塊的劃分是有區(qū)別的。H.264中,I_slice亮度塊有Intra_4*4和Intra_16*16兩種模式,色度塊只有8*8模式;P_slice宏塊分為16*16、16*8、8*16、8*8、8*4、4*8、4*4共7種模式。而AVS-M中,I_slice亮度塊有I_4*4和I_Direct兩模式,P_slice時(shí)宏塊的劃分和H.264中的劃分一致。
(b) 兩標(biāo)準(zhǔn)的宏塊cbp值計(jì)算也不相同。H.264中,Intra_16*16宏塊的亮度(色度)cbp直接通過讀mb type得到;非Intra_16*16宏塊的亮度cbp=coded_block_pattern%16,色度cbp=coded_block_pattern/16 。其中,亮度cbp最低4位有效,每位決定對(duì)應(yīng)宏塊的殘差系數(shù)是否為0;色度cbp為0時(shí),對(duì)應(yīng)殘差系數(shù)為0,cbp為1時(shí),DC殘差系數(shù)不為0,AC系數(shù)為0,cbp為2時(shí),DC、AC殘差系數(shù)都不為0。AVS-M中,當(dāng)宏塊類型不是P_skip時(shí),直接從碼流中得到cbp的索引值,并以此索引值查表得到codenum值,再以codenum查表分別得到幀內(nèi)/幀間cbp。此cbp為6位,每位代表宏塊按8*8劃分時(shí)是否包含非零系數(shù),當(dāng)變換系數(shù)不為0時(shí),需進(jìn)一步讀cbp_4*4中每位值來判斷一個(gè)8*8塊中4個(gè)4*4塊的系數(shù)是否為0。
2 幀內(nèi)預(yù)測
H.264中Intra_16*16亮度塊和8*8色度塊都有4種預(yù)測模式(垂直、水平、直流、平面),AVS-M中8*8色度塊只有3種(垂直、水平、直流),H.264中Intra_4*4和AVS-M中的4*4亮度塊都有9種預(yù)測模式,但排列順序不一樣。H.264中的Intra_4*4和AVS-M中的4*4亮度塊的模式可以通過鄰塊的幀內(nèi)模式來預(yù)測,預(yù)測方法不同。H.264中,當(dāng)前亮度塊的最可能模式由左塊(A)、上塊(B)中較小的決定,如果相鄰塊不存在,則A、B模塊的模式置為DC。而預(yù)測模式的選定要看碼流中標(biāo)志信息prev_intra4*4_pred_mode,該標(biāo)志為1時(shí),則用最可能模式,該標(biāo)志不為0時(shí),還需看參數(shù)rem_intra4*4_pred_mode,如果它小于最可能模式,則預(yù)測模式即為rem_intra4*4_pred_mode,否則為rem_intra4*4_pred_mode+1。AVS-M中,左塊(A)、上塊(B)的預(yù)測模式(若不存在,置為-1)形成表格后,通過查表可獲得當(dāng)前塊的最可能模式。對(duì)I_Direct,其預(yù)測模式即為最可能模式;對(duì)I_4*4,需看標(biāo)志信息pred_mode_flag,該標(biāo)志為0時(shí),預(yù)測模式即為最可能模式;該標(biāo)志為1時(shí),當(dāng)碼流中讀到的intra_luma_pred_mode小于最可能模式,則預(yù)測模式為最可能模式,否則,預(yù)測模式為intra_luma_pred_mode+1。另外, H.264中的Intra_16*16和色度預(yù)測模式從碼流中讀取,AVS-M的色度預(yù)測模式也從碼流中讀取。
3 幀間預(yù)測
兩標(biāo)準(zhǔn)下亮度塊的運(yùn)動(dòng)矢量等于預(yù)測運(yùn)動(dòng)矢量(MVPred)加上比特流中讀取到的運(yùn)動(dòng)矢量差(MVD)。由于亮度MV精度為1/4像素,而色度精度為1/8像素,因此,色度塊的運(yùn)動(dòng)矢量等于亮度塊的兩倍。AVS-M和H.264的當(dāng)前亮度塊E和鄰塊A、B、C、D的空間位置分別如圖2、3所示。E的大小可以是16*16、16*8、8*16、8*8、8*4、4*8或4*4。顯然,AVS-M中,A是與E的左下角樣本緊鄰的塊,B、D與E的左上角樣本緊鄰的塊,C是與E的右上角樣本緊鄰的塊。H.264中,A是與E的左上角樣本緊鄰的塊,B、D與E的左上角樣本緊鄰的塊,C是與E的右上角樣本緊鄰的塊。
圖2 AVS-M預(yù)測塊鄰塊位置
圖3 H.264預(yù)測塊鄰塊位置
4 熵解碼
H.264中采用基于上下自適應(yīng)的可變長編碼(CAVLC),其原理: 4*4塊殘差數(shù)據(jù)經(jīng)整數(shù)變換、量化后非零系數(shù)主要集中在低頻部分,高頻系數(shù)大部分是零,且高頻位置上非零系數(shù)值大部分是+1和-1。AVS-M熵編碼也采用變長編碼技術(shù),在AVS-M熵編碼過程中,所有的語法元素和殘差數(shù)據(jù)都是以指數(shù)哥倫布碼的形式映射成二進(jìn)制比特流。
5 環(huán)路濾波
兩標(biāo)準(zhǔn)都是采用基于塊的殘差系數(shù)反變換、反量化,量化過程相對(duì)粗糙,反量化恢復(fù)的變換系數(shù)必定帶來誤差,另一方面,運(yùn)動(dòng)補(bǔ)償塊可能來自不同幀位置的內(nèi)插樣本塊,將導(dǎo)致邊界不連續(xù),因此,需采用環(huán)路濾波來消除塊預(yù)測誤差造成的失真。H.264中根據(jù)相鄰塊模式、參考索引、運(yùn)動(dòng)矢量和解碼塊確定濾波強(qiáng)度,濾波強(qiáng)度參數(shù)Bs值為0~4,對(duì)于Bs為1~3的采用4抽頭濾波器,對(duì)于Bs為4的采用6抽頭濾波器。H.264中濾波器能適應(yīng)片級(jí)、邊界級(jí)和樣點(diǎn)級(jí)的需要。而在AVS-M中根據(jù)當(dāng)前宏塊是幀內(nèi)(幀間)編碼宏塊來選擇幀內(nèi)(幀間)濾波器,當(dāng)滿足濾波條件后,采用4抽頭濾波器對(duì)邊界先垂直后水平濾波。AVS-M濾波器相對(duì)H.264而言,像素少,強(qiáng)度弱,但在消除方塊效應(yīng)的同時(shí)能大大地減少濾波時(shí)間。
應(yīng)用前景
直播衛(wèi)星電視和高清電視是其中進(jìn)展最快的項(xiàng)目。與整機(jī)廠商互動(dòng),AVS標(biāo)準(zhǔn)組可從實(shí)際應(yīng)用中得到反饋,對(duì)標(biāo)準(zhǔn)、實(shí)現(xiàn)算法、軟件、IP內(nèi)核、專用芯片進(jìn)行及時(shí)的修改和改進(jìn),從而真正適應(yīng)產(chǎn)業(yè)的需求。
上廣電主持的衛(wèi)星電視實(shí)驗(yàn)系統(tǒng)項(xiàng)目中的AVS編碼器則采用了“轉(zhuǎn)碼器+DSP”的實(shí)現(xiàn)方案。該系統(tǒng)高度兼容MPEG-2,這是由于MPEG-2的節(jié)目較多,所以AVS與它有一個(gè)融合-取代的過程。如加密、用戶管理、收費(fèi)系統(tǒng)、編輯系統(tǒng)等其他配套系統(tǒng)不變。
總結(jié)
由上分析可知,兩種視頻解碼器結(jié)構(gòu)有很多共同之處。目前,關(guān)于H.264視頻解碼器的優(yōu)化、硬件移植的方法及其應(yīng)用很多,這些也可被AVS-M采納。本文根據(jù)優(yōu)化H.264的相關(guān)文獻(xiàn)中的一些方法對(duì)AVS-M作過軟件上的優(yōu)化。算法上的優(yōu)化主要包括插值、環(huán)路濾波和熵解碼的優(yōu)化。插值時(shí)可以將像素分為內(nèi)部像素和邊界像素,避免重復(fù)的判斷。環(huán)路濾波時(shí)每個(gè)4*4塊中的每個(gè)點(diǎn)有相同的邊界門限,其相應(yīng)的濾波操作也可以4次完成。熵解碼時(shí),可通過重新建表減少轉(zhuǎn)化程序。代碼上的優(yōu)化主要包括程序結(jié)構(gòu)優(yōu)化、循環(huán)展開、數(shù)據(jù)類型選擇和數(shù)據(jù)的移動(dòng)等,例如,Decode_one_macroblock函數(shù)中,可根據(jù)宏塊類型采用不同的函數(shù)來解碼,對(duì)臨時(shí)的緩存區(qū)可簡化。此外,對(duì)插值運(yùn)算(可轉(zhuǎn)化為矩陣運(yùn)算)、反量化和反變換等涉及到矩陣運(yùn)算的函數(shù)都可使用MMX/SSE指令集優(yōu)化。
H.264是國際通用標(biāo)準(zhǔn),而AVS-M是我國自主制定的標(biāo)準(zhǔn),因而,兩標(biāo)準(zhǔn)兼容的視頻解碼器的出現(xiàn)是種必然。本課題接下來的工作即是在對(duì)已有結(jié)構(gòu)對(duì)比分析的基礎(chǔ)上結(jié)合兩套代碼,將兩解碼器結(jié)構(gòu)相同部分進(jìn)行復(fù)用,不同部分通過開關(guān)進(jìn)行選擇,實(shí)現(xiàn)對(duì)兩種不同格式的碼流進(jìn)行識(shí)別并實(shí)時(shí)解碼
評(píng)論