丁建桥,周 磊,张正华
(扬州大学信息工程学院,江苏扬州225000)
多媒体信息技术和计算机网络得到飞速发展,视频作为信息的核心载体之一,能够给人最大直观的视觉感受,所以已成为电子信息技术领域研究的热点,得到了最广泛的应用[1]。但是视频信号数字化后的数据量非常庞大,这无疑给存储器的存储容量、通信线路的信道传输率以及计算机的处理速度都带来了极大的压力。解决这一问题,单纯通过扩大存储器容量和增加通信线路的传输率是不现实的,因此需要对视频数据进行压缩编码。现如今,对视频的压缩编码从实现方式来分可分为软件编码和硬件编码[2]。由于在相同硬件平台上,硬件编码速率要比软件编码快的多,并且在运行过程中占用平台的资源也很少,因此采用Frescale公司的IMX53对多种分辨率的原始视频序列进行编解码。
IMX53中的VPU是一个高性能和多标准的视频编解码引擎,支持对高达1 280×720像素的视频序列进行编码。VPU的内部工作流程如图1所示。主处理器通过IP总线对BIT处理器进行控制。在视频编解码器编码或解码一个宏块之前,BIT处理器配置各子块,使能它们,并且配置如何创建该编解码器管道。然后,宏块处理器根据BIT处理器的配置来对视频编码模块的运行进行控制。视频编码模块通过AXI总线在外部存储器中读取YUV格式的原始视频序列,并对其进行H.264格式的编码,然后再把编码后的视频通过AXI总线存储到外部存储器。如果对一个宏块的处理全部完成,宏块处理器就会通知BIT处理器对宏块的编解码已经完成,然后BIT处理器把整个操作的结果和状态信息通过IP总线返回给主处理器。
图1 VPU内部工作流程
VPU的 API提供了一个简单的方法来控制VPU。API控制VPU的大体框图如图2所示。主处理器向VPU发送命令和相应的参数来预定义API,然后主机应用程序通过调用一系列的API函数来控制VPU,接着从API函数中给出的命令被写入到一个特定的I/O寄存器上,而输入输出的数据结构通过一系列的命令I/O寄存器传输,这些寄存器包含输入的参数和输出的结果。VPU系统管理器按照接收到的命令和参数执行相应的操作,然后编解码模块根据相应编解码库对原始视频进行处理。最后ARM主机从VPU接收到一个操作完成的中断请求后,主机应用程序接收到对应的处理结果,并且调用API函数结束本次帧的处理或继续处理下一个帧。
图2 主机接口和VPU的软件控制
编码的原始数据流来自外部存储器。具体的视频编码操作流程如图3所示。
图3 编码操作流程
要对这些数据流进行编码操作,应用程序要完成以下操作:
首先,调用vpu_Init()函数完成对VPU的初始化,接着调用vpu_Encopen()函数启动一个新的编码操作,创建一个编码器实例。在创建该实例之前,调用IOGetPhyMem()来分配连续的物理比特流缓冲区,其中入口参数为encop.bitstreamBuffer。调用IOGetVirMem()得到比特流缓冲区的相对应的虚拟地址,然后在用户空间把比特流写入到该地址。
使用命令EBC_SET_SEARCHRAM_PARAM和IOGetIramBase()来查询系统中内部RAM对于VPU的使用情况,然后使用vpu_EncGetInitialInfo()获得对于编码器操作来说至关重要的参数,例如所需的帧缓冲区大小等等,再按照从vpu_EncGetInitialInfo()返回的所需的帧缓冲区大小,分配一个合适大小的帧缓冲区,调用vpu_EncRegisterFrameBuffer()来通知VPU。接着调用vpu_EncGiveCommand()通过特定的命令和参数来为编码后的数据创建高等级的报头语法(创建了一个编码器实例后,必须从新配置编码器操作)。
调用vpu_EncStartOneFrame()开始对视频序列进行逐帧的编码操作。调用vpu_WaitforInt()来等待帧编码操作完成的中断信号,并且使用vpu_Is-Busy()检查VPU是否处于空闲状态,如果VPU空闲,继续下一步;否则,继续等待。当对一个帧编码完成后,使用vpu_EncGetOutputInfo()得到编码器的输出信息以及检查编码器操作结果,例如图像类型、地址以及产生的比特流的大小等。如果还有其他的帧需要编码,则再次调用vpu_EncStartOneFrame()继续对视频进行编码操作;否则通过关闭实例来终止对该序列的编码处理,该操作通过调用vpu_Enc-Close()来完成。使用IOFreePhyMem()和IOFree-VirtMem()释放所有的分配的存储空间。最后调用vpu_UnInit()释放系统的资源。
为原始视频的图像帧分配帧缓冲区的应用程序操作步骤如下:
首先,根据帧缓冲区的个数和大小为其分配内存空间。然后,再分配用于存储帧缓冲区指针地址的内存空间。接着,根据所需的个数分配帧缓冲区,并分别把每一个帧缓冲区中图像帧亮度地址和色度地址等信息存储到之前分配的内存空间中。根据通过vpu_EncGetInitialInfo()函数得到的信息参数,调用vpu_EncRegisterFrameBuffer()函数为VPU内部图像帧分配寄存器帧缓冲区,其中包括参考帧、重建帧等等。最后,如果原始视频来自视频传感器则要对视频传感器进行相应的配置,否则为原始视频的图像帧分配一个单独的帧缓冲区,并且把原始视频的图像帧的地址信息存储到之前分配的内存空间中。
本文的实验测试平台为Freescale公司的IMX53 Quick Start Board。VPU的固件版本是13.4.41,VPU代码库版本是5.3.2。使用的操作系统为由LTIB内核配置系统构建的Linux操作系统。开发板和PC主机通过串口和网口进行通信,串口用于控制终端Minicom对开发板的控制通信,网口用于NFS服务通信。通过编译VPU测试程序,然后在IMX53上运行,来测试VPU的H.264标准的编码性能。
由于1 280×720像素的视频是现在主流的高清视频格式,而CIF格式视频在监控领域得到广泛应用。因此,测试对象是从测试视频网站 http://media.xiph.org/video/derf/下载的 8段 YUV 格式的原始视频序列,规格分别为1 280×720像素的高清视频(如表4所示)与352×288像素CIF格式的视频(如表5所示)。
表4 1 280×720像素高清视频实验结果
表5 CIF格式视频实验结果
视频压缩的目标是在保证视频的主观质量的前提下尽可能地提高压缩率[3],因此对编码器性能的评价分为客观评价和主观评价。主观评价就是通过人在给定的观察条件下观察视频图像,对视频图像的优劣做主观评定,然后对评分进行统计平均来得到评价结果[3,4]。客观评价通常采用压缩比Cr和编码率来衡量。设图像的尺寸为M×N个像素,每个像素为BpBit,压缩后的总比特数为Bc。
压缩比定义为:
由文献[5]了解,对视频进行H.264标准的编码在保证较高压缩比的情况下有很好的视频图像质量,并且本文是测试视频编码器VPU对视频编码标准H.264的编码性能。因此在实验中主要对编码器VPU的性能进行客观评价。
通过调用VPU对表4和表5中的8段YUV格式的原始视频进行H.264格式的视频编码。完成编码后使用支持H.264标准的播放器对编码后的8段视频分别进行播放。这8段视频均能够流畅播放,视频图像画面清晰,无失真和块效应。在编码后的视频Shields和Paris中截取的图像如图4和图5所示。
图4 Shields的视频截图
图5 Paris视频截图
测试后得到的数据分别记入表4和表5中。由于VPU对视频的处理是基于帧的,因此在本实验中使用编码率的单位为fps(Frame Per Second)。
由表4和表5中的实验结果看出,在IMX53上对YUV格式的原始视频序列进行H.264标准的压缩编码,能够在保证视频的主观视觉质量的前提下得到很高的压缩比,尤其是对于像CIF格式的低分辨率视频压缩效果更为显著,但是对于像parkrun图像背景和对象运动剧烈的视频压缩比较低。VPU对视频进行编码的速率也很高,最高可对帧频为30 fps的1 280×720像素高清视频进行实时的压缩编码。
以IMX53开发板为平台,通过调用VPU模块对YUV格式的原始视频进行H.264标准的压缩编码。该方案支持通过不同方式获得的不同分辨率的原始视频的压缩编码。IMX53实验结果证明该方案对原始视频的压缩效率非常高,从而更加有利于视频的存储和传输。
[1] 毕厚杰.新一代视频压缩编码标准—H264/AVC[M].北京:人民邮电出版社,2005:11 -12.
[2] 刘恩虹,周兵,葛宝珊,等.基于H.264的嵌入式视频编码器[J].计算机工程,2009,35(9):227 -230.
[3] 刘峰.视频图像编码技术及国际标准[M].北京:北京邮电大学出版社,2005.
[4] 李健.视频质量的主观评估方法研究[D].西安:西安电子科技大学,2009:23 -27.
[5] 邓中亮,段大高,崔岩松,等.基于H.264的视频编/解码与控制技术[M].北京:北京邮电大学出版社,2010.
[6] LUTHRA A,SULLIVAN G J,WIEGAND T.Introduction to the Special Issue on the H.264/AVC Video Coding Standard [J].IEEE Journals and Magazines,2003:557 -559.
[7] HALLINAN Christopher.Embedded Linux Primer(Second Edition)[M].北京:人民邮电出版社,2012.
[8] 鸟哥.鸟哥的Linux私房菜[M].北京:人民邮电出版社,2010.
[9] MTTHEW N,STONES R.Linux程序设计(第 4版)[M].陈建,宋健健,译.北京:人民邮电出版社,2010.
[10]莫尔勒.深入 Linux内核架构[M].郭旭,译.北京:人民邮电出版社,2010.
[11]STEVENS W R,RAGO S A.UNIX 环境高级编程(第2版)[M].尤晋元,张亚英,戚正伟,译.北京:人民邮电出版社,2006.