张昊,占海燕,邓月堂,蒋明
1.中南大学信息科学与工程学院,长沙 410083
2.腾讯公司,广东深圳 518057
3.智诚思创科技公司,北京 100000
基于比特流修改的H.264解码器错误自动定位
张昊1,占海燕1,邓月堂2,蒋明3
1.中南大学信息科学与工程学院,长沙 410083
2.腾讯公司,广东深圳 518057
3.智诚思创科技公司,北京 100000
现代视频编码效率不断提高,随之而来的是编解码标准越来越复杂[1]。此外,编解码器中的一些模块采用了SIMD指令,对于不同平台其指令存在差异,因而很容易产生错误[2]。视频编解码器的错误可能导致视觉效果的不理想,因此这些错误需要尽可能早地发现并剔除。由些可见,测试技术对诸如H.264等标准的现代视频编解码器十分重要。之前,研究人员主要关心被测解码器(Decoder Under Test,DUT)是否符合标准[3-6]。直到最近,张昊等人才提出了运用软件测试技术检测视频压缩模块的方法[2]。但是,通过文献[2]中的方法来测试视频编解码器仍然很难找到所有的错误。这是因为有的错误只有在视觉观察或程序崩溃时才能被发现。这类错误往往是在一些特定环境下某些条件被触发时才发生。当发生此类错误时,一种常用的方法是捕捉引起错误的码流然后进行人工的调试。同时用DUT和标准解码器对捕捉到的码流进行解码,通过比较两者的解码结果来确定出错的模块。当确定了出错的模块后,再交给编写这个模块的开发人员进行详细的分析,直到查出引起错误的原因。需要指出的是:这个过程非常耗时,一个经验丰富的编码工程师可能要花半天的时间来查找错误的原因。软件测试的方法很多[7],传统软件测试的错误定位方法往往需要软件源代码作为输入[8]。然而,在多数情况下测试人员对解码器的源代码并不了解(比如使用的是购买的开发包)或测试人员并不是编写这部分代码的程序员。为了解决这个问题,本文提出了在H.264解码器中无需源代码分析的错误定位方法。本文方法不仅适用于上述的情形,而且对编码工程师们的日常调试过程也有很大的帮助。
在具体介绍错误自动定位方法之前,作如下假设:视频比特流和DUT使用baseline profile和CAVLC编码;每次只考虑存在一个错误的情况。由DUT和标准解码器同时对比特流进行解码:若两者解码后的视频不同,则说明DUT中存在错误。如果在第n帧出错,则修改比特流使解码器在解码时跳过可能出错的模块,然后再分别用DUT和标准解码器来解码修改后的比特流(如图1),再次比较解码后的第n帧。若此时两个解码序的第n帧完全相同,则判定错误是位于前面跳过的那个模块中;否则再检查其他模块。不断重复上面的过程,直到找到出错的模块或者所有测试模块都搜索完为止。为了重现引起视觉效果下降的解码过程,本质上采用的是比特流编码时的一系列参数。使用不同的技术使解码过程跳过可能出错的模块,由于篇幅的限制,无法对所有的模块进行详细的分析说明,仅对baseline中的主要模块:去方块滤波模块,计算残差模块和插值模块的错误定位的方法并进行具体介绍。其他模块(如帧内预测)和更深层次(如判定帧内预测中是哪种预测方法出错)的诊断技术是以后的研究内容。
图1 解码器错误自动定位流程图
下面是修改比特流使解码器跳过上述三种模块的方法:
(1)通过把图像参数集(picture parameter set)里面的deblocking_filter_control_present_flag设为1来跳过第n帧的去方块滤波。此外,把第n帧的slice header里面disable_ deblocking_filter_idc设为1。需要注意的是,如果在原始比特流中deblocking_filter_control_present_flag为0,则对前m帧(m<n),要将m帧的slice头中的disable_deblocking_filter_ idc,slice_alpha_c0_offset_div2和slice_beta_offset_div2全部设为0,保证解码后的前m帧没有改变。
(2)计算残差的过程包括系数分析、系数扫描和变换。输入的比特流是修改过后跳过第n帧的去块滤波过程的比特流,这样确保去块滤波过程不会影响残差的计算。残差的计算过程可以通过设置所有的残差系数为0来跳过。有两种情况需要考虑,一种是无帧内16×16模式,coded_block_pattern应该设为0(其编码后的值可能非0),同时跳过原始比特流中的所有的残差系数;另一种情况是使用了帧内16×16模式,此时块的方块编码模式(CBP)不是作为一个独立的元素来编码的,而是与预测模式编在一起。因而,设置mb_mode(在I_slice和p_slice中是不一样的)的值,使其中的CBP为0。此外,对于帧内16×16宏块,其DC直流系数是单独编码的。适当地设置coeff_token的值使得全部的系数值为零就可以跳过其计算。
(3)插值过程是在帧间预测中对整数像素应用6抽头滤波器得到1/2像素,再由线性内插得到1/4像素。与残差计算过程类似,输入的比特流跳过了去块滤波过程。假设纯粹的数据复制过程中不存在错误(一定要仔细地检查确保其中没有错误),因此,通过设置所有的运动矢量为0就可以使解码过程跳过插值。
当比特流中含有IPCM模式的宏块时,对比特流还需要做相应的调整。首先,由于对比特流进行了修改,要调整pcm_alignment_zero_bit使IPCM数据保持字节对齐。其次,编码coeff_token时,如果相邻宏块是IPCM模式,其值也要做相应的调整。
针对文中提出的错误自动定位方法做了两类实验:一是验证各种错误是否都能被正确的定位;二是测试实现错误定位所需要的时间。
实验中的参考解码器是JM16.0。多个错误版本是根据文献[9]中给出的错误类型设计的。错误自动定位工具是基于JM16.0开发,每个DUT中只包含一个错误。为了方便,所有的错误都设计在亮度去块滤波器,计算残差和亮度插值里面。这些模块的运算复杂度都很高且常常采用SIMD指令编写,发生错误的可能性很大。为了与平台无关,所有的模块和错误都采用C语言。实验中用到的视频序列是foreman CIF的前100帧,码率是500 Kb/s,IPPP模式。在这样的参数下,大多数错误发生在前面的几帧中。实验中有35个DUT,其中13个DUT分别在亮度去方块滤波模块中包含单一错误,9个DUT分别在计算残差模块中含有单一错误,13个分别在亮度插值模块中有单一错误,如表1所示。
表1 模块中存在的错误和实现自动定位的错误数
对于亮度去方块滤波模块错误定位,其比特流修改详细过程如下:
(1)分析比特流,得到图像参数集在比特流中的位置,确定其中编码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全部设为0,使n帧之外的帧解码结果不变;跳到(4)。
(4)在第n帧的slice header中确定编码disable_ deblocking_filter_idc的比特位,并设为1,表示在此帧中不进行亮度去块滤波。
若DUT中包含错误,用DUT与标准解码器对上述修改后的比特流进行解码,两者的输出相同,则错误发生在上述解码过程中被跳过的模块中,即错误定位到去方块滤波模块。另外两个模块的过程与去方块滤波模块的过程类似。实验结果表明,自动定位工具能够正确定位实验中所有错误。
在实际中,发现一些模块必须在某些条件下才会被执行,而该条件可能要在解码很多帧以后才达到。这样,定位工具必须要解码相当多的帧后才能发现错误,大大影响定位速度。为了测量该工具的定位速度,设计了如下实验。该实验以亮度去方块滤波为例进行了测试。方法是首先通过编码构造特定的比特流,使其只在第n帧进行去方块滤波,进而该工具只有解码到第n帧才会发现错误。将调整n的大小,然后记录相应的错误定位时间。对去方块滤波,注意到可以利用这样一个性质:当该帧的QP≤15时,滤波条件不成立[10]。因此,修改编码器使之对0~n-1帧都采用QP=15,而第n帧QP设置为30,因而只会在第n帧发现由滤波产生的错误。在实验中分别设n为1、50、100、150、200、250时,可得到错误定位所需时间,如图2。由图可见,错误定位的时间与出错帧的位置有关,越是靠后的帧出错,定位错误需要的时间就越长。当n=250时,错误定位时间达到了近18 s。虽然这在工程实践中是可以接受的,但是认为还有一定的优化空间。
图2 错误定位时间与出错误帧数关系图
实验结果表明,提出的错误定位工具的性能良好。该工具对包含错误的三个模块都能有效定位,而且该方法不需要阅读和分析解码器源代码,有望降低工程师的调试压力。该工具虽然是针对H.264 baseline解码器的,但本文提出的方法具有通用性,有望推广至遵守其他标准的解码器。另外,由于出错的帧越靠后,定位时间越长。而且如果在被分析视频的分辨率很高的情况下,定位将耗时更长。本文开发出的H.264解码器错误定位工具只是初级版本,目前还只考虑了单个错误的情况,以后将通过进一步的研究和优化使之能够更快地对多个错误实现定位。
[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]许静,陈宏刚,王庆人.软件测试方法简述与展望[J].计算机工程与应用,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
针对H.264解码器的测试问题,提出了一种简单实用的自动错误定位方法。对导致错误的比特流进行修改,在不进行源代码分析的情况下就达到错误定位的目的;开发了一个错误定位工具,利用这个工具可以加快调试过程。实验结果表明,此方法有良好的效率。
软件测试;错误定位;比特流;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—),男,博士,副教授,主要研究领域为多媒体信号处理与通信,软件测试技术及其应用,科技评价理论;占海燕(1989—),女,硕士研究生,主要研究领域为视频压缩中的软件测试技术;邓月堂,男,博士,主要研究领域为软件测试技术;蒋明,男,博士,主要研究领域为多媒体通信技术。E-mail:hao@csu.edu.cn
2012-01-04
2012-05-24
1002-8331(2013)19-0177-03