引言
H.264是由ISO(国际标准化组织)/IEC(国际电工协会)和ITU(国际电信标准化部门)合作制定的新一代视频编码标准,目前正处于应用开发阶段。h.264具有更高的压缩效率和更好的网络适应能力,在相同的图像质量下,h.264所需码率约为MPEG.2的36%、H.263的5l%、MPEG-4的61%u-31。伴随着效率的提高,算法的复杂度也提高很多,因此需要研究h.264的压缩算法和它的嵌入式应用。
1.1 pxa255处理器的特点
Intel Xscale PXA255蜘是基于Intel XScale微体系结构的Intel PCA处理器,内部采用XScale内核构架,频率高达400MHz,内核扩充许多DSP指令极大提高了多媒体处理能力,同时了提供LCD(液晶显示器)控制器、无线局域网(802.1Ib)、蓝牙、高速红外、USB等多种功能模块。PXA255处理器还使用了BranchTargetBuffer技术,可以提高指令执行(流水线)的效率。作为便携移动设备的首选嵌入式处理器,PXA255内核具有Intel最先进的动态电源管理技术,可以根据处理器所执行的任务情况动态调整工作频率和多种节电模式,适合嵌入式视频采集系统的应用。
1.2 系统的硬件结构
视频编码器的硬件结构如图1所示。从摄像头输出的原始视频流通过USB接口进入PXA255芯片进行h.264压缩,压缩后的码流由网口(ETHERNET)传到主机进行显示,Flash中烧写了嵌入式Linux系统和应用程序,SDRAM用于存储编码过程中的一些临时数据。
2 视频采集的实现
Linux操作系统中使用vide041inux内核模块来进行视频操作的,它针对视频设备提供了一系列的API函数。本文就是利用videAlinux提供的API函数来实现视频采集功能的。视频采集流程如图2所示。
具体视频采集的实现介绍如下:
先调用函数fd=open(“dcv/video",O 来打开摄像头RDWR)设备,成功后返回摄像头的文件描述符fd。然后通过调用vi.
dco_get capability0和video_get pictureO两个函数来获得摄像头和图像的基本信息。利用ictol(fd,VIDIOCGPICT,&grab pic.ture)函数设定图像的亮度、对比度、色度等信息。接着调用函数ictol(fd,V1DIoCMCAPTRUE,&grab 开始抓取一帧图像,。bur)再调用函数ictol(fd,VIDIOSYNC,&grab buf)判断这一帧图像抓取是否结束。这样连续的抓取多帧图。像就完成了原始视频信息的采集。图3就是抓取的一帧原始图像。
3 h.264编码算法
h.264编码标准是目前提出的最新的视频压缩标准。与以前的压缩标准相比,h.264通过对帧内预测、帧问预测、变换编码和熵编码等算法的改进来进一步提高编码效率和图像质量。
这些改进包括:
(1)运动估计时,可以灵活地选择宏块(MB)的大小。在宏块划分上,h,264采用了16x6,16x8,8x16,8x8这4种模式;当划分为8x8模式时,又可进一步采用8x4,4x8,4x4这3种子宏块划分模式(如图4所示)进一步划分,这样做既可以使运动物体的划分更加精确,减小运动物体边缘的衔接误差,又可以减小变换过程中的计算量。
(2)1/4像素精度的运动估值。在h.264中通过6阶FIR滤波器的内插获得l/2像素位置的预测值。当l/2像素值获得后,通过取整数像素位置和l/2像素位置像素值均值的方式获得l/4像素位置的值,这样迸一步减小帧间预测误差,减少了经变换和量化后的非零比特数,提高了编码效率。
(3)多参考帧运动估值。以往的编码技术在对P帧(场)图像进行帧间预测时,只允许以前一个I帧(场)图像或P帧(场)图像为参考帧。对B图像进行预测时只允许以前后两个I帧(场)图像或P帧(场)图像为参考图像。h.264则允许在ReferenceBuffer中的多个图像中选取一个(P预测方式)或两个(B预测方式,图像作为参考图像。参考图像甚至可以是采用双向预测编码方式的图像。
(4)参考图像的选取与其编码方式无关。允许选取与当前图像更加匹配的图像为参考图像进行预测,减小了预测误差,提高编码效率。
(5)更精确的帧内预测。在h.264中,每个4*4块中的每个像素都可用17个最接近先前已编码的像素的不同加权和来进行帧内预测。
(6)环路去方块滤波器。h.264/AVC把去方块滤波引入运动估计预测环路中,既可去除方块效应,又能保护图像细节边缘,同时亦改善了图像的主、客观评定质量。而且经过滤波后的图像根据需要放在缓存中用于帧间预测,进一步提高预测精度。
(7)h.264使用统一的可交长度编码国Ⅵz)码表。以往标准的熵编码通常采用变长度的哈夫曼编码,其码表不统一,不能适应变化多端的视频内容,从而影响编码效率的提高。在此,即对h.263不同系数采用不同码表进行VLC作了改进,采用了一个统一码表的IrvIC,同时,又对h.26L中的VCL方法进行了改进,使量化后的DCT变换系数使用基于内容的自适应可变长度编码(CAⅥC),此外还定义了一种基于上下文内容的自适应二进制算术编码(CABAC),其性能比CAVLC更好。从而,借助UVLC,CAVLC及CABAC较好地提高了压缩编码效率。
4 PXA255上的h.264编码算法的实现
ITU-T(国际电信标准化部门)提供了h.264的核心算法,本文使用的是开源编码软件x264。将其通过交叉编译后移植到PXA255嵌入式开发平台上。由于h.264编码算法复杂度高、运算量大等特点导致h.264编码效率不高,经初步测试编码速率为QCIF格式图像10帧/秒,不能达到实时视频编码的要求。
因此需要对编码程序进行相应的优化。
4.1 C语言优化
编码软件包含了解码和传输部分的程序,而本文只对视频进行编码,并不需要解码和传输。所以对代码进行调整,删除解码和传输部分的代码,再重新改写makefile文件。这样可以缩小程序的空间大小,减少程序的运行时间,提高编码效率。
使用尽量小的数据类型。能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(10ng in0,能不使用浮点型(float)变量就不要使用双精度浮点型(doubles)变量。
程序中被多次调用的、函数体代码不是很大的函数使用内联函数。使用内联函数可以避免由于保护现场和记忆执行的地址所带来的时间和空间方面的开销,以提高程序的执行效率。
4.2 Itrm汇编优化
用C语言编程结构化程度高,易于编写,但执行速度相对较慢:与之相反,汇编程序速度快,但很难有较好的结构,而且编写起来耗时,不易调试。C和汇编混合编程结合了各自的优势,往往能构造出结构好且执行速度快的程序。利用汇编语言优化C语言代码,优化后的汇编程序可以被C语言程序调用,并且在汇编程序中也可以调用C语言程序。
将编码程序中的较复杂的部分程序段使用arm汇编进行改写,这样可以很大程度的提高代码的运行速度。例如下面就是宏块预测predict.c中的一段汇编优化的代码,C代码如下:
4.3 基于PXA255结构的优化
结合PXA255硬件结构特点,从以下几个方面对h.264编码程序进行优化处理:
(1)合理分配变量的存储位置。根据片内存储器容量小而存取速度快,片外存储器容量大但存取速度慢的特点,在分配存储器的时候对于那些经常使用的变量放在片内,如VLC表、运动矢量、反量化、反DCT的系数以及其它中间变量等,而对于那些执行次数比较少或者比较大的变量如参考帧则放在片外。此外由于编译和分配空间是以文件为单位的,所以把频繁使用的函数放在同一文件中,再将这个文件放入片内存储器以高效地利用有限的片内资源。
(2)PXA255处理器中集成了大量的DSP多媒体操作指令,使用这些指令可以极大的提高程序的运行效率。
(3)指令并行执行是提高程序执行效率的很好的方法,PXA255处理器中引入了Branch Target Buffer技术,以实现指令执行的流水线。
5 实验结果
为了验证程序优化的效果,改变每次采集的帧数进行实验结果分析。结果如表1所示。由表l中的实验结果可知,经过优化的h.264编码器每秒能处理20帧左右的QCIF图像,而图像的质量没有什么影响。因此,优化后,h.264压缩算法能够对采集到的图像进行实时压缩,具有很好的实用性。图5为采集的视频经过h.264压缩后的视频流。
6 结束语
研究基于嵌入式平台的h.264视频编码算法有很大的实用价值,它的优异的压缩性能也将在嵌入式数字电视广播以及视频实时通信等各个方面发挥作用。
评论
查看更多