基于CUDA的H.264视频编码实现
摘要:H.264视频编码压缩比率高,但计算复杂度高,编码效率低。该文通过分析H.264编码器中各模块的编码性能,提出了基于CUDA编程模型的H.264视频编码并行框架实现方法,对H.264视频编码的各个关键模块进行CUDA实现,有效的提高了编码的速度。
关键词:H.264视频编码;CUDA;并行框架
中图分类号:TP311 文献标识码:A 文章编号:1009-304420-4966-02
The Realization of H.264 Video Coding based on CUDA
ZHAO Hai-guo
Abstract: H.264 video coding has the highest compression ratio, but the computational complexity greatly increases and its encoding efficiency is very low. Through analyzing the complexity of the key modules of the H.264 video coding, this paper proposes parallel framework implementation method of the H.264 video coding based on CUDA programming model, and implements each key module of the H.264 video coding based on CUDA programming model, which can accelerate the encoding and decoding process significantly.
Key words: H.264 video coding; Computeฒ Unified Device Architecture; parallel framework
H.264是由ITU-T VCEG和ISO/IEC MPEG联合推出的国际视频编码标准,具有较高的视频编码压缩率和网络适应性。由于H.264的高效率编码主要来自于新的关键技术,而每一个新的关键技术都会造成计算复杂度的提升,因而导致H.264视频编码在编解码时计算量显著增加。故H.264的高效压缩编码性能是以增加编解码时间为代价的,如何降低H.264的计算复杂度,有效的提高H.264的编码速度是一个重要的研究课题。
CUDA(Compute Unified Device Architecture)是一种由NVIDIA推出的通用并行计算架构,可进行大规模并行计算和处理密集型数据。系统地分析H.264编码器各模块的编码性能及复杂性,基于CUDA研究H.264标准编码在可编程图形处理器上的实现,充分利用CUDA存储器资源与并行计算能力可加速编码的各关键模块处理过程,可提高H.264的编码速度。
1 H.264编码器中各模块的编码性能
H.264❥的主要编码流程包括:帧内预测、运动估计/运动补偿、整数变换/量化、熵编码、去块效应滤波。分析H.264编码器的典型运行周期,采用JVT的JM软件,在Pentium Dual-Core 2.93GHz,内存4GB的平台下运行,对三个不同分辨率大小的视频序列suzie_qcif 176×144,news_cif 352×288,soccer 704×576测试各个模块的时间比例,可知三个视频序列各个模块的平均时间比例如表1所示。
在H.264编码过程中,复杂度最高、耗时最长的是运动估计/补偿部分,占81.73%;其次是帧内预测和整数变换/量化部分,分别占5.84%和5.46%,熵编码、滤波和其它占6.97%。为了提高整体的编码速度,满足系统实时性要求,非常有必要降低各个模块尤其是运动估计、帧内预测和整数变换/量化部分的计算时间。
2 基于CUDA的H.264视频编码并行框架
NVIDIA推出了支持CUDA的GPU架构,既采用了统一处理架构,又引入了片内共享存储器,支持随机写入和线程间通信。为了充分利用CUDA存储器资源与并行计算能力,考虑关键模块的数据相关性与可并行性,提出一个基于CUDA的H.264视频编码的并行框架,如图1所示。把运动估计/运动补偿、帧内预测、整数变换及量化、去方块滤波 、熵编码放入GPU内完成,CPU端只负责视频数据和码流的传输,最大程度发挥GPU的并行度。
运动估计/运动补偿在H.264视频编码中是计算密度最大的部分,用CUDA实现运动估计对提高整体编码速度起着相当重要的作用。本框架充分利用资源的并行度,帧间预测使用整帧图像中宏块与宏块之间进行并行计算的策略,大大减少视频编码的时间;并使用可变尺寸块的全搜索运动估计算法,合理地分配线程,尽可能多的利用共享存储器以减少对全局存储器的访问,高效地实现了全搜索运动估计算法在CUDA架构下的并行过程。
帧内预测在H.264视频编码中是一个耗时的模块。本框架采用一种块级并行的帧内模式选择方法,即改进原有的块内并行方法,使用基于宏块之间的并行实现。该方法打破了原来块与块之间像素的依赖关系,用原始块像素代替重构像素来预测当前块的像素值以便达到块级之间并行,用CUDA并行执行,可加快编码的速度。
H.264视频编码中整数变换是针对4×4大小的残差块进行的一种变换,残差块之间的数据是相互独立的,每一块的像素都执行相同的变换操作,非常适合并行计算。本框架通过优化的整数DCT变换采用宏块间并行实现对残差数据的变换及量化,这样便能充分利用CUDA的并行计算能力,提高并行度。
量化后的系数矩阵要进行Zigzag排序与熵编码。本框架可采用霍夫曼编码代替CAVLC熵编码。在熵编码之前先进行zigzag扫描,把一个宏块划分✍为一个线程块,这样,一个宏块包括16个线程,用一个线程对4×4的块进行扫描、编码。使用CUDA实现编码时,数据操作过程的控制方式如下:
dim3 blocksize;
dim3 gridsize;
kernel_function;
其中kernel_function为实现各环节的核函数。此外,在GPU端还需要声明一些 __device__ 类型的函数用于实现核函数的子过程。
通过对H.264视频编码各个关键模块的CUDA实现,基本建立起一个基于CUDA编程模型的H.264标准并行框架,下面通过具体的实验来分析,基于CUDA的H.264并行框架在具体的编码过程中的编码速度与普通的CPU编码速度相比所产生的加速效果。
3 实验分析
应用基于CUDA的H.264视频编码并行框架进行程序实现与实验测试,在JVT提供的JM16.1参考软件做测试平台下,对三个不同分辨率大小的视频序列suzie_qcif 176×144,news_cif 352×288,soccer 704×576测试进行测试:各测试序列取50帧,搜索范围为16×16,运动估Ⓐ计采用全搜索算法,参考帧数量为3帧。视频编码的各个模块在CPU和GPU上分别运行的整个编码时间如表2(时间单位为秒)所示。
实验可知,对不同分辨率大小的视频序列进行视频编码过程,在GPU上运行的时间比CPU明显降低,各个分辨率大小的加速比为两倍左右,充分体现了GPU强大的并行计算能力,但是由于各个模块之间的参数需要来回拷贝,花费大量的时间,从而整体加速比CPU的编码速度只提高了两倍左右;从分辨率大小为176×144、352×288、704×576的加速比来看,其加速比例一直在提升,可见在一定范围内,数据越密集,数据量越大,越有利于CUDA的加速。
4 结论
系统地分析H.264编码器各模块的유编码性能及复杂性,对H.264视频编码的各个关键模块进行CUDA实现:帧内预测使用原始像素代替重构像素来预测当前块的像素值以便达到块级之间并行;帧间预测则通过改进原有的块内并行方法,使用基于宏块之间的并行实现;然后通过优化的整数DCT变换采用宏块之间并行实现对残差数据的变换及量化;最后对量化后的系数矩阵完成Zigzag排序与熵编码。基本建立了一个基于CUDA的H.264视频编码并行框架。并用程序实现前面研究的并行模块,在CPU和GPU上测试不同分辨率的视频序列,对整个编码时间进行比较。通过实验结果的分析得出结论,基于CUDA的H.264视频编码并行框架的编码过程与普通的CPU编码相比有两倍左右的加速效果。
参考文献:
[1] 毕厚杰.新一代视频压缩编码标准[M].北京:人民邮电出版社,2005:105-289.
[2] 张舒,褚艳利.GPU高性能运算之CUDA[M].北京:中国水利水电出版社,2009:2-141.
[3] 孙立,王健,郭春辉.基于CUDA的H.264去方块滤波的设计与实现[J].器件与应用,2010,5:44-46.
[4] 甘新标,沈立,王志英.基于CUDA的并行全搜索运动估计算法[J].计算机辅助设计与图形学学报,2010,22:457-460.
[5] 王晗,林涛.超线程技术以及H.264编码器中的并行运算分析[J].计算机工程,2006,32:224-226.
[6] Zhuo Zhao.Ping Liang.A highly efficient parallel algorithm for H.264 video encoder[J].Proceedings of 2006 IEEE International Conference on Acoustics,Speech and Signal Processing,2006:489-492.