張昊,占海燕,鄧月堂,蔣明
1.中南大學(xué)信息科學(xué)與工程學(xué)院,長(zhǎng)沙 410083
2.騰訊公司,廣東深圳 518057
3.智誠(chéng)思創(chuàng)科技公司,北京 100000
基于比特流修改的H.264解碼器錯(cuò)誤自動(dòng)定位
張昊1,占海燕1,鄧月堂2,蔣明3
1.中南大學(xué)信息科學(xué)與工程學(xué)院,長(zhǎng)沙 410083
2.騰訊公司,廣東深圳 518057
3.智誠(chéng)思創(chuàng)科技公司,北京 100000
現(xiàn)代視頻編碼效率不斷提高,隨之而來(lái)的是編解碼標(biāo)準(zhǔn)越來(lái)越復(fù)雜[1]。此外,編解碼器中的一些模塊采用了SIMD指令,對(duì)于不同平臺(tái)其指令存在差異,因而很容易產(chǎn)生錯(cuò)誤[2]。視頻編解碼器的錯(cuò)誤可能導(dǎo)致視覺(jué)效果的不理想,因此這些錯(cuò)誤需要盡可能早地發(fā)現(xiàn)并剔除。由些可見(jiàn),測(cè)試技術(shù)對(duì)諸如H.264等標(biāo)準(zhǔn)的現(xiàn)代視頻編解碼器十分重要。之前,研究人員主要關(guān)心被測(cè)解碼器(Decoder Under Test,DUT)是否符合標(biāo)準(zhǔn)[3-6]。直到最近,張昊等人才提出了運(yùn)用軟件測(cè)試技術(shù)檢測(cè)視頻壓縮模塊的方法[2]。但是,通過(guò)文獻(xiàn)[2]中的方法來(lái)測(cè)試視頻編解碼器仍然很難找到所有的錯(cuò)誤。這是因?yàn)橛械腻e(cuò)誤只有在視覺(jué)觀察或程序崩潰時(shí)才能被發(fā)現(xiàn)。這類(lèi)錯(cuò)誤往往是在一些特定環(huán)境下某些條件被觸發(fā)時(shí)才發(fā)生。當(dāng)發(fā)生此類(lèi)錯(cuò)誤時(shí),一種常用的方法是捕捉引起錯(cuò)誤的碼流然后進(jìn)行人工的調(diào)試。同時(shí)用DUT和標(biāo)準(zhǔn)解碼器對(duì)捕捉到的碼流進(jìn)行解碼,通過(guò)比較兩者的解碼結(jié)果來(lái)確定出錯(cuò)的模塊。當(dāng)確定了出錯(cuò)的模塊后,再交給編寫(xiě)這個(gè)模塊的開(kāi)發(fā)人員進(jìn)行詳細(xì)的分析,直到查出引起錯(cuò)誤的原因。需要指出的是:這個(gè)過(guò)程非常耗時(shí),一個(gè)經(jīng)驗(yàn)豐富的編碼工程師可能要花半天的時(shí)間來(lái)查找錯(cuò)誤的原因。軟件測(cè)試的方法很多[7],傳統(tǒng)軟件測(cè)試的錯(cuò)誤定位方法往往需要軟件源代碼作為輸入[8]。然而,在多數(shù)情況下測(cè)試人員對(duì)解碼器的源代碼并不了解(比如使用的是購(gòu)買(mǎi)的開(kāi)發(fā)包)或測(cè)試人員并不是編寫(xiě)這部分代碼的程序員。為了解決這個(gè)問(wèn)題,本文提出了在H.264解碼器中無(wú)需源代碼分析的錯(cuò)誤定位方法。本文方法不僅適用于上述的情形,而且對(duì)編碼工程師們的日常調(diào)試過(guò)程也有很大的幫助。
在具體介紹錯(cuò)誤自動(dòng)定位方法之前,作如下假設(shè):視頻比特流和DUT使用baseline profile和CAVLC編碼;每次只考慮存在一個(gè)錯(cuò)誤的情況。由DUT和標(biāo)準(zhǔn)解碼器同時(shí)對(duì)比特流進(jìn)行解碼:若兩者解碼后的視頻不同,則說(shuō)明DUT中存在錯(cuò)誤。如果在第n幀出錯(cuò),則修改比特流使解碼器在解碼時(shí)跳過(guò)可能出錯(cuò)的模塊,然后再分別用DUT和標(biāo)準(zhǔn)解碼器來(lái)解碼修改后的比特流(如圖1),再次比較解碼后的第n幀。若此時(shí)兩個(gè)解碼序的第n幀完全相同,則判定錯(cuò)誤是位于前面跳過(guò)的那個(gè)模塊中;否則再檢查其他模塊。不斷重復(fù)上面的過(guò)程,直到找到出錯(cuò)的模塊或者所有測(cè)試模塊都搜索完為止。為了重現(xiàn)引起視覺(jué)效果下降的解碼過(guò)程,本質(zhì)上采用的是比特流編碼時(shí)的一系列參數(shù)。使用不同的技術(shù)使解碼過(guò)程跳過(guò)可能出錯(cuò)的模塊,由于篇幅的限制,無(wú)法對(duì)所有的模塊進(jìn)行詳細(xì)的分析說(shuō)明,僅對(duì)baseline中的主要模塊:去方塊濾波模塊,計(jì)算殘差模塊和插值模塊的錯(cuò)誤定位的方法并進(jìn)行具體介紹。其他模塊(如幀內(nèi)預(yù)測(cè))和更深層次(如判定幀內(nèi)預(yù)測(cè)中是哪種預(yù)測(cè)方法出錯(cuò))的診斷技術(shù)是以后的研究?jī)?nèi)容。

圖1 解碼器錯(cuò)誤自動(dòng)定位流程圖
下面是修改比特流使解碼器跳過(guò)上述三種模塊的方法:
(1)通過(guò)把圖像參數(shù)集(picture parameter set)里面的deblocking_filter_control_present_flag設(shè)為1來(lái)跳過(guò)第n幀的去方塊濾波。此外,把第n幀的slice header里面disable_ deblocking_filter_idc設(shè)為1。需要注意的是,如果在原始比特流中deblocking_filter_control_present_flag為0,則對(duì)前m幀(m<n),要將m幀的slice頭中的disable_deblocking_filter_ idc,slice_alpha_c0_offset_div2和slice_beta_offset_div2全部設(shè)為0,保證解碼后的前m幀沒(méi)有改變。
(2)計(jì)算殘差的過(guò)程包括系數(shù)分析、系數(shù)掃描和變換。輸入的比特流是修改過(guò)后跳過(guò)第n幀的去塊濾波過(guò)程的比特流,這樣確保去塊濾波過(guò)程不會(huì)影響殘差的計(jì)算。殘差的計(jì)算過(guò)程可以通過(guò)設(shè)置所有的殘差系數(shù)為0來(lái)跳過(guò)。有兩種情況需要考慮,一種是無(wú)幀內(nèi)16×16模式,coded_block_pattern應(yīng)該設(shè)為0(其編碼后的值可能非0),同時(shí)跳過(guò)原始比特流中的所有的殘差系數(shù);另一種情況是使用了幀內(nèi)16×16模式,此時(shí)塊的方塊編碼模式(CBP)不是作為一個(gè)獨(dú)立的元素來(lái)編碼的,而是與預(yù)測(cè)模式編在一起。因而,設(shè)置mb_mode(在I_slice和p_slice中是不一樣的)的值,使其中的CBP為0。此外,對(duì)于幀內(nèi)16×16宏塊,其DC直流系數(shù)是單獨(dú)編碼的。適當(dāng)?shù)卦O(shè)置coeff_token的值使得全部的系數(shù)值為零就可以跳過(guò)其計(jì)算。
(3)插值過(guò)程是在幀間預(yù)測(cè)中對(duì)整數(shù)像素應(yīng)用6抽頭濾波器得到1/2像素,再由線性?xún)?nèi)插得到1/4像素。與殘差計(jì)算過(guò)程類(lèi)似,輸入的比特流跳過(guò)了去塊濾波過(guò)程。假設(shè)純粹的數(shù)據(jù)復(fù)制過(guò)程中不存在錯(cuò)誤(一定要仔細(xì)地檢查確保其中沒(méi)有錯(cuò)誤),因此,通過(guò)設(shè)置所有的運(yùn)動(dòng)矢量為0就可以使解碼過(guò)程跳過(guò)插值。
當(dāng)比特流中含有IPCM模式的宏塊時(shí),對(duì)比特流還需要做相應(yīng)的調(diào)整。首先,由于對(duì)比特流進(jìn)行了修改,要調(diào)整pcm_alignment_zero_bit使IPCM數(shù)據(jù)保持字節(jié)對(duì)齊。其次,編碼coeff_token時(shí),如果相鄰宏塊是IPCM模式,其值也要做相應(yīng)的調(diào)整。
針對(duì)文中提出的錯(cuò)誤自動(dòng)定位方法做了兩類(lèi)實(shí)驗(yàn):一是驗(yàn)證各種錯(cuò)誤是否都能被正確的定位;二是測(cè)試實(shí)現(xiàn)錯(cuò)誤定位所需要的時(shí)間。
實(shí)驗(yàn)中的參考解碼器是JM16.0。多個(gè)錯(cuò)誤版本是根據(jù)文獻(xiàn)[9]中給出的錯(cuò)誤類(lèi)型設(shè)計(jì)的。錯(cuò)誤自動(dòng)定位工具是基于JM16.0開(kāi)發(fā),每個(gè)DUT中只包含一個(gè)錯(cuò)誤。為了方便,所有的錯(cuò)誤都設(shè)計(jì)在亮度去塊濾波器,計(jì)算殘差和亮度插值里面。這些模塊的運(yùn)算復(fù)雜度都很高且常常采用SIMD指令編寫(xiě),發(fā)生錯(cuò)誤的可能性很大。為了與平臺(tái)無(wú)關(guān),所有的模塊和錯(cuò)誤都采用C語(yǔ)言。實(shí)驗(yàn)中用到的視頻序列是foreman CIF的前100幀,碼率是500 Kb/s,IPPP模式。在這樣的參數(shù)下,大多數(shù)錯(cuò)誤發(fā)生在前面的幾幀中。實(shí)驗(yàn)中有35個(gè)DUT,其中13個(gè)DUT分別在亮度去方塊濾波模塊中包含單一錯(cuò)誤,9個(gè)DUT分別在計(jì)算殘差模塊中含有單一錯(cuò)誤,13個(gè)分別在亮度插值模塊中有單一錯(cuò)誤,如表1所示。

表1 模塊中存在的錯(cuò)誤和實(shí)現(xiàn)自動(dòng)定位的錯(cuò)誤數(shù)
對(duì)于亮度去方塊濾波模塊錯(cuò)誤定位,其比特流修改詳細(xì)過(guò)程如下:
(1)分析比特流,得到圖像參數(shù)集在比特流中的位置,確定其中編碼deblocking_filter_control_present_flag的比特位。
(2)若deblocking_filter_control_present_flag的比特位為0,則把它改為1,跳到(3);若deblocking_filter_control_present_flag為1,則直接跳到(4)。注:deblocking_filter_control_present_flag為1表示在此比特流中已包含deblock filter控制位(disable_deblocking_filter_idc)。
(3)把第n幀之外的所有幀的slice header中disable_ deblocking_filter_idc,slice_alpha_c0_offset_div2和slice_beta_ offset_div2全部設(shè)為0,使n幀之外的幀解碼結(jié)果不變;跳到(4)。
(4)在第n幀的slice header中確定編碼disable_ deblocking_filter_idc的比特位,并設(shè)為1,表示在此幀中不進(jìn)行亮度去塊濾波。
若DUT中包含錯(cuò)誤,用DUT與標(biāo)準(zhǔn)解碼器對(duì)上述修改后的比特流進(jìn)行解碼,兩者的輸出相同,則錯(cuò)誤發(fā)生在上述解碼過(guò)程中被跳過(guò)的模塊中,即錯(cuò)誤定位到去方塊濾波模塊。另外兩個(gè)模塊的過(guò)程與去方塊濾波模塊的過(guò)程類(lèi)似。實(shí)驗(yàn)結(jié)果表明,自動(dòng)定位工具能夠正確定位實(shí)驗(yàn)中所有錯(cuò)誤。
在實(shí)際中,發(fā)現(xiàn)一些模塊必須在某些條件下才會(huì)被執(zhí)行,而該條件可能要在解碼很多幀以后才達(dá)到。這樣,定位工具必須要解碼相當(dāng)多的幀后才能發(fā)現(xiàn)錯(cuò)誤,大大影響定位速度。為了測(cè)量該工具的定位速度,設(shè)計(jì)了如下實(shí)驗(yàn)。該實(shí)驗(yàn)以亮度去方塊濾波為例進(jìn)行了測(cè)試。方法是首先通過(guò)編碼構(gòu)造特定的比特流,使其只在第n幀進(jìn)行去方塊濾波,進(jìn)而該工具只有解碼到第n幀才會(huì)發(fā)現(xiàn)錯(cuò)誤。將調(diào)整n的大小,然后記錄相應(yīng)的錯(cuò)誤定位時(shí)間。對(duì)去方塊濾波,注意到可以利用這樣一個(gè)性質(zhì):當(dāng)該幀的QP≤15時(shí),濾波條件不成立[10]。因此,修改編碼器使之對(duì)0~n-1幀都采用QP=15,而第n幀QP設(shè)置為30,因而只會(huì)在第n幀發(fā)現(xiàn)由濾波產(chǎn)生的錯(cuò)誤。在實(shí)驗(yàn)中分別設(shè)n為1、50、100、150、200、250時(shí),可得到錯(cuò)誤定位所需時(shí)間,如圖2。由圖可見(jiàn),錯(cuò)誤定位的時(shí)間與出錯(cuò)幀的位置有關(guān),越是靠后的幀出錯(cuò),定位錯(cuò)誤需要的時(shí)間就越長(zhǎng)。當(dāng)n=250時(shí),錯(cuò)誤定位時(shí)間達(dá)到了近18 s。雖然這在工程實(shí)踐中是可以接受的,但是認(rèn)為還有一定的優(yōu)化空間。

圖2 錯(cuò)誤定位時(shí)間與出錯(cuò)誤幀數(shù)關(guān)系圖
實(shí)驗(yàn)結(jié)果表明,提出的錯(cuò)誤定位工具的性能良好。該工具對(duì)包含錯(cuò)誤的三個(gè)模塊都能有效定位,而且該方法不需要閱讀和分析解碼器源代碼,有望降低工程師的調(diào)試壓力。該工具雖然是針對(duì)H.264 baseline解碼器的,但本文提出的方法具有通用性,有望推廣至遵守其他標(biāo)準(zhǔn)的解碼器。另外,由于出錯(cuò)的幀越靠后,定位時(shí)間越長(zhǎng)。而且如果在被分析視頻的分辨率很高的情況下,定位將耗時(shí)更長(zhǎng)。本文開(kāi)發(fā)出的H.264解碼器錯(cuò)誤定位工具只是初級(jí)版本,目前還只考慮了單個(gè)錯(cuò)誤的情況,以后將通過(guò)進(jìn)一步的研究和優(yōu)化使之能夠更快地對(duì)多個(gè)錯(cuò)誤實(shí)現(xiàn)定位。
[1]Ostermann J,Bormans J,List P,et al.Video coding with H.264/ AVC:tools,performance and complexity[J].IEEE Circuits and Systems Magazine,2004,4:7-28.
[2]Zhang H,Deng Y T,Liu Z Y,et al.Unit testing optimized functions in H.264[C]//Proc Int Conf on Multimedia Technology,Hangzhou,China July,2011:3297-3300.
[3]Meehan P,Hurst N,Isnardi M,et al.Mpeg compliance bitstream design[C]//ProcIntConfonConsumerElectronics,Rosemont,June,1995:174-175.
[4]Kim C M,Lee B U,Park R H.Design of MPEG-2 video test bitstreams[J].IEEETransactionsonConsumerElectronics,1999,45:1213-1220.
[5]Cho J,Choi S,Chae S I.Constrained-random bitstream generationforH.264/AVCdecoderconformancetest[J].IEEE Transactions on Consumer Electronics,2010,56:848-855.
[6]Kim W S,Park I S,Park S H,et al.Conformance test of simple profileMPEG-4texturedecoding[J].JournalofElectronic Imaging,2002,11:375-380.
[7]許靜,陳宏剛,王慶人.軟件測(cè)試方法簡(jiǎn)述與展望[J].計(jì)算機(jī)工程與應(yīng)用,2003,39(13):65-67.
[8]Gonzalez-sanchez A,Piel E,Gross H G,et al.Prioritizing tests for software fault localization[C]//Proc Int Conf on Quality Software,July 2010:42-51.
[9]Wong W E,Horgan J R,London S,et al.Effect of test set minimization on fault detection effectiveness[C]//Proc Int Conf on Software engineering,New York:April 1995:41-50.
[10]ISO/IEC 14496-10 and ITU-T Rec H.264.advanced video coding[S].2003.
[11]JVT H.264/AVC reference software JM 16.0[CP].
ZHANG Hao1,ZHAN Haiyan1,DENG Yuetang2,JIANG Ming3
1.School of Information Science and Engineering,Central South University,Changsha 410083,China
2.Tencent,Inc.,Shenzhen,Guangdong 518057,China
3.Technovo Sci.&Tech.Company,Beijing 100000,China
A simple and useful method for fault localization for H.264 Decoder Under Test(DUT)is presented.The Bitstream that led to an error is modified to locate the faulty module without analyzing the source code.A useful tool is developed that can be used to speed up the debugging process.High efficiency of the proposed method is demonstrated in the experiments.
software testing;fault localization;Bitstream;H.264 decoder
針對(duì)H.264解碼器的測(cè)試問(wèn)題,提出了一種簡(jiǎn)單實(shí)用的自動(dòng)錯(cuò)誤定位方法。對(duì)導(dǎo)致錯(cuò)誤的比特流進(jìn)行修改,在不進(jìn)行源代碼分析的情況下就達(dá)到錯(cuò)誤定位的目的;開(kāi)發(fā)了一個(gè)錯(cuò)誤定位工具,利用這個(gè)工具可以加快調(diào)試過(guò)程。實(shí)驗(yàn)結(jié)果表明,此方法有良好的效率。
軟件測(cè)試;錯(cuò)誤定位;比特流;H.264解碼器
A
TP391
10.3778/j.issn.1002-8331.1112-0521
ZHANG Hao,ZHAN Haiyan,DENG Yuetang,et al.Automatic fault localization with bitstream modification for H.264 decoders.Computer Engineering and Applications,2013,49(19):177-179.
張昊(1978—),男,博士,副教授,主要研究領(lǐng)域?yàn)槎嗝襟w信號(hào)處理與通信,軟件測(cè)試技術(shù)及其應(yīng)用,科技評(píng)價(jià)理論;占海燕(1989—),女,碩士研究生,主要研究領(lǐng)域?yàn)橐曨l壓縮中的軟件測(cè)試技術(shù);鄧月堂,男,博士,主要研究領(lǐng)域?yàn)檐浖y(cè)試技術(shù);蔣明,男,博士,主要研究領(lǐng)域?yàn)槎嗝襟w通信技術(shù)。E-mail:hao@csu.edu.cn
2012-01-04
2012-05-24
1002-8331(2013)19-0177-03