H.264解码核

关键词: 指令 芯片 处理 视频

H.264解码核(精选七篇)

H.264解码核 篇1

Blackfin533 是美国模拟器件公司(ADI)开发的一款高性能视频处理芯片,其主频高达600 MHz,每秒可处理1 200 M次乘加运算,具有大量针对视频的专用指令,可以并行处理多条指令,这些特性使得该DSP芯片能处理广泛用于互联网的大量图像﹑声音﹑文本和数据流,适用于通信和各种互联网设备。Blackfin DSP开发平台如图1所示:

开发平台的中心处理器Blackfin533是一种单核、加载/存储结构的DSP,拥有双MAC以及正交RISC微处理指令集。除此之外,Blackfin533还具有以下特点:双40 b算法逻辑单元(ALU);一个40 b的移位器;4个视频ALU;一个8通道的32 b数据寄存器;148 kB的片内存储器(16 kB可作为指令CACHE,32 kB可作为数据CACHE);动态电源管理功能等。另外,在Blackfin533的存储器结构中,DMA 控制器提供高带宽数据转移,能够完成L1/L2 存储器和外部存储器之间编码或数据块转移,并且高速缓冲存储器可以设置,以便处理器和DMA可独立地访问。此开发平台的外设中有ADV7171视频编码器(用于视频显示)和ADV7183视频解码器(用于视频采集)。其中ADV7171可提供3种模拟视频输出方式,而ADV7183可提供3个模拟视频的输入通道。视频编码器连接到PPI1口,解码器连接到PPI0口,每个PPI口都有其独立的时钟信号。

2 H.264解码显示的设计模块

H.264解码器的视频显示采用PPI口的DMA操作,他将缓冲区中的视频数据传输到ADV进行数/模转换后到监视器进行显示播放,其中BF533的PPI口支持ITU-R656的3种输入模式和1种输出模式。

2.1 ITU-R 656简介

BF533处理器支持ITU-R 656的并行数字视频输出,对8 b和10 b精度的数字视频都支持,图2和图3分别给出了输出模式下NTSC/PAL制式显示的行结构和帧结构,只要按照这个结构配置帧缓冲区就可以实现视频显示。

在这种输出模式下,水平标志位H、垂直标志位V和场标志位F(如图3所示)都插入到视频数据中进行传送,不需要单独传送。活动视频开始标志(SAV)和结束标志(EAV)表示视频数据读入的开始和结束,SAV发生在H的1-to-0的转变,EAV发生在H的0-to-1转变。完整的视频场(field)应包含视频的水平扫描消隐和和以及垂直扫描消隐信号。隔行扫描的视频由奇场和偶场组成,两场的扫描行呈交插关系,逐行扫描视频则没有奇偶场的区别。

如图2所示,EAV和SAV标志有3个已定义的字节(0xFF,0x00,0x00),紧跟着是XY状态字,XY状态字除了F,V,H位外,包含4个保护位(P0~P4)来进行单个位错误检测和修正。注意F和V仅可以作为EAV序列的一部分来改变(即H从而变到1)。标志位的定义如下:F=0,奇数场,F=1,偶数场;V=0,垂直消隐,V=1,活动视频;H=0,SAV,H=1,EAV;P3=V xor H,P2=F xor H,P1=F xor V,P0=F xor V xor H。

其中各个标志位在8 b和10 b情况下的定义如表1所示。开发平台的处理器接口能适应不同长度的行和场。一般来说,只要引入的视频有合适的EAV和SAV标志,PPI就可以读入。一个CIF图像可以被转换格式以适应ITU-R656帧格式的要求,其中EAV和SAV定义了每个数据流的图像排列,V和F标志可以用来限定场和帧。

ITU-R 656输出模式下通过PPI口从内存中输出数据和标志字节,数据和控制标志必须在输出前在内存的帧缓冲区中放置好。本文中采用的监视器显示制式为NTSC,根据图2和图3可知每行为1 716 B,每帧为525行,因此开辟的帧缓冲区大小应为1 716×525。视频显示流程图如图2所示。

2.2 相关寄存器的配置

H.264解码视频显示涉及到的硬件相关寄存器配置主要有:PLL的初始化、中断寄存器的配置、DMA、PPI、ADV、FALSH等有关寄存器进行配置。其中DMA传送可以是基于描述符的,也可以是基于自动缓冲的。在2种方式下都需要对各个寄存器进行相应的配置。

2.3 H.264解码显示的实现

本文的H.264解码器的软件模块的设计主要是面向DSP硬件实现。从NAL层的比特流经逆量化和反变换后根据帧内或帧间预测模式进行相应的还原得到解码重构帧,对重构帧的YUV数据进行视频显示。

将H.264解码器输出的YUV数据暂存到SDRAM中,然后插值为ITU-R656格式数据存储到以frame_buffer为首地址的帧缓冲区中相应的位置,在加上合适的控制信号字节,完成ITU-R656一帧数据的初始化,用DMA传输帧缓冲区中的数据到PPI端口经ADV数模变换后到监视器显示播放。框图如图5所示。

其中DMA传输分别采用了自动缓冲方式和描述符方式。在自动缓冲方式下实现图像的动态输出,可以在DMA中断时按照单帧显示的方法不断将YUV数据写入帧缓冲区,这样对同一块缓冲区边读边写的方式使得缓冲区的数据产生了冲突,在两帧图像的显示之间有不定的图像,而且从计算机中读取数据的效率不高导致显示延时较大,图像显示不连续,因此要加以改进。在描述符方式下开辟一块连续N个缓冲区,一起读入数N帧数据,把这N个缓冲区全部初始化为单帧显示的形式。

然后DMA将这N帧数据连续传送来实现了图像的动态显示。但由于硬件的内部资源有限,所读入的数据帧数N也是有限的。为了克服存储器资源的限制,在描述符方式下实现多帧图像的显示,采用“乒乓”机制来实现边写边显示。“乒乓”机制的实现方法如下:

其中data是帧缓冲区的起始地址;flag为帧缓冲区写操作完成的标志。定义类型为结构体vout_frame的2个帧缓冲区buffer[2],对缓冲区进行写操作,如果完成就置标志位flag为1,表示帧缓冲区写操作完成,每次中断产生时就检测这个非显示的帧缓冲区的标志位 flag,如果为0,就无操作;如果为1,就把DMA描述符的传送地址改为这个帧缓冲区的起始地址,同时把刚才使用的那个帧缓冲区的标志位flag置0。例如当帧缓冲区1写操作完成,则置buffer[0].flag=1,当中断产生时检测到这个帧缓冲区的标志位为1,则把DMA描述符的传送地址修改为这个帧缓冲区的起始地址buffer[0].data,就可以读取这个帧缓冲区中的数据进行显示,然后对帧缓冲区2进行写操作,如此循环。这样在任意时刻,两个缓冲区都有一个处于写操作状态,一个处于读操作状态,互不干扰,实现了视频的显示播放。

3 实验结果

图6所示显示为claire和mobile序列YUV数据在DMA以自动缓冲方式、描述符方式传输数据时,播放在监视器屏幕上的截图:

从图6可以看出,DMA在两种传输数据方式下,在显示单帧图像时没什么区别,但是在动态显示时,自动缓冲方式不能改变传送的帧缓冲区的地址,而描述符方式在中断完成时可以修改DMA传输的地址,实现“乒乓”机制,因此动态显示时应采用描述符方式传送数据。

4 结 语

本文是在BF533开发平台上实现H.264解码器的视频显示播放,完善一个基于低功耗DSP的实时H.264解码器系统,为完成移动和无线视频的接收终端的实现打下良好的基础。调试结果表明,已基本满足H.264实时解码显示的要求,具有较好的应用意义。但是本文的主要程序大都是用C语言编写的,没有进行DSP硬件语言优化,运行效率不是很高,下一阶段将对程序代码进行优化。

摘要:在简要介绍BF533 DSP开发平台的基础上,着重描述如何对BF533的PPI,DMA等硬件资源进行配置,以及如何将解码器输出的YUV数据按照ITU-R 656帧格式配置成帧后传送到监视器进行显示,实现H.264解码器输出的视频播放。测试结果表明,视频显示播放可以达到实时要求,完成了一个基于低功耗DSP的实时H.264解码器系统,为移动和无线视频的接收终端的实现打下良好的基础。

关键词:H.264,DSP,ITU-R656,视频解码,视频显示

参考文献

[1]Thomas Wiegand,Gary J Sullivan.Overview of the H.264/AVC Video Coding Standard,IEEE,2003.

[2]Draft ITU-T Recommendation and Final Draft InternationalStandard of Joint Video Specification(ITU-T Rec.H.264|ISO/IEC 14496-10 AVC),7th Meeting:Pattaya,Thailand,7-14 March,2003.

[3]陈峰.Blackfin系列DSP原理与系统设计[M].北京:电子工业出版社,2004.

[4]毕厚杰.新一代视频压缩编码标准[M].北京:人民邮电出版社,2005.

[5]胡栋,朱秀昌.图像通信技术与应用[M].南京:东南大学出版社,1996.

[6]朱秀昌,刘峰,胡栋.数字图像处理与图像通信[M].北京:北京邮电大学出版社,2002.

[7]谭浩强.C程序设计[M].北京:清华大学出版社,1999.

H.264视频编解码标准及其应用 篇2

H.264是一种高性能的视频编解码技术, 是由ITU-T和ISO/IEC联合开发的, 定位于覆盖整个视频应用领域, 包括:低码率的无线应用、标准清晰度和高清晰度的电视广播应用、Internet上的视频流应用, 传输高清晰度的DVD视频以及应用于数码相机的高质量视频应用等等。

相对先前的标准, H.264/AVC无论在压缩效率、还是在网络适应性方面都有明显的提高, 因此, 业界普遍预测其将在未来的视频应用中替代现有的视频压缩标准。从标准制定到颁布, H.264 一直是ITU、MPEG、DVD、DVB、3GPP 等工业化组织共同推进的视频编码国际标准, 可以想见, 在众多行业巨擘的推动下, H.264 技术的应用将迅速进入到视频服务、媒体制作发行、固定及移动运营网络、平台开发、设备终端制造、芯片开发等多个领域。

H.264标准可分为三类:

(1) 基本类 (简单版本, 应用面广) ;

(2) 主类 (采用了多项提高图像质量和增加压缩比的技术措施, 可用于SDTV、HDTV和DVD等) ;

(3) 扩展类 (可用于各种网络的视频流传输) 。

1H.264标准的技术特色

H.264最大的优势是具有很高的数据压缩比率, 在同等图像质量的条件下, H.264的压缩比是MPEG-2的2倍以上, 是MPEG-4的1.5~2倍。举个例子, 原始文件的大小如果为88GB, 采用MPEG-2压缩标准压缩后变成3.5GB, 压缩比为25∶1, 而采用H.264压缩标准压缩后变为879MB, 从88GB到879MB, H.264的压缩比达到惊人的102∶1。之所以H.264有那么高的压缩比, 低码率 (Low Bit Rate) 起了重要的作用, 与MPEG-2和MPEG-4 ASP等压缩技术相比, H.264压缩技术将大大节省用户的下载时间和数据流量收费。尤其值得一提的是, H.264在具有高压缩比的同时还拥有高质量流畅的图像。

(1) 更高的编码效率:

同H.263等标准的特率效率相比, 能够平均节省大于50%的码率。

(2) 高质量的视频画面:

H.264能够在低码率情况下提供高质量的视频图像, 在较低带宽上提供高质量的图像传输是H.264的应用亮点。

(3) 提高网络适应能力:

H.264可以工作在实时通信应用 (如视频会议) 低延时模式下, 也可以工作在没有延时的视频存储或视频流服务器中。

(4) 采用混合编码结构:

同H.263相同, H.264也使用采用DCT变换编码加DPCM的差分编码的混合编码结构, 还增加了如多模式运动估计、帧内预测、多帧预测、基于内容的变长编码、4×4二维整数变换等新的编码方式, 提高了编码效率。

(5) H.264的编码选项较少:

在H.263中编码时往往需要设置相当多选项, 增加了编码的难度, 而H.264做到了力求简洁的“回归基本”, 降低了编码时复杂度。

(6) H.264可以应用在不同场合:

H.264可以根据不同的环境使用不同的传输和播放速率, 并且提供了丰富的错误处理工具, 可以很好地控制或消除丢包和误码。

(7) 错误恢复功能:

H.264提供了解决网络传输包丢失问题的工具, 适用在高误码率传输的无线网络中传输视频数据。

(8) 较高的复杂度:

H.264性能的改进是以增加复杂性为代价而获得的。据估计, H.264编码的计算复杂度大约相当于H.263的3倍, 解码复杂度大约相当于H.263的2倍。

H.264不仅比H.263和MPEG-4节约了50%的码率, 而且对网络传输具有更好的支持功能。它引入了面向IP包的编码机制, 有利于网络中的分组传输, 支持网络中视频的流媒体传输。H.264具有较强的抗误码特性, 可适应丢包率高、干扰严重的无线信道中的视频传输。H.264支持不同网络资源下的分级编码传输, 从而获得平稳的图像质量。H.264能适应于不同网络中的视频传输, 网络亲和性好。

2H.264标准的关键技术

H.264是在MPEG-4技术的基础之上建立起来的, 其编解码流程主要包括5个部分:帧间预测和帧内预测 (Estimation) 、变换 (Transform) 和反变换、量化 (Quantization) 和反量化、环路滤波 (Loop Filter) 、熵编码 (Entropy Coding) 。

(1) 帧间预测:

帧间预测编码利用连续帧中的时间冗余来进行运动估计和补偿。H.264的运动补偿支持以往的视频编码标准中的大部分关键特性, 而且灵活地添加了更多的功能, 除了支持P帧、B帧外, H.264还支持一种新的流间传送帧——SP帧。码流中包含SP帧后, 能在有类似内容但有不同码率的码流之间快速切换, 同时支持随机接入和快速回放模式。

(2) 帧内预测:

帧内编码用来缩减图像的空间冗余。为了提高H.264帧内编码的效率, 在给定帧中充分利用相邻宏块的空间相关性, 相邻的宏块通常含有相似的属性。因此, 在对一给定宏块编码时, 首先可以根据周围的宏块预测 (典型的是根据左上角的宏块, 因为此宏块已经被编码处理) , 然后对预测值与实际值的差值进行编码, 这样, 相对直接对该帧编码而言, 可以大大减小码率。

(3) 变换与反变换:

H.264使用了基于4×4像素块的类似DCT的变换, 但使用的是以整数为基础的空间变换, 不存在反变换, 因为取舍而存在误差的问题。与浮点运算相比, 整数DCT变换会引起一些额外的误差, 但因为DCT变换后的量化也存在量化误差, 与之相比, 整数DCT变换引起的量化误差影响并不大。此外, 整数DCT变换还具有减少运算量和复杂度, 有利于向定点DSP移植的优点。

(4) 量化:

H.264中可选32种不同的量化步长, 这与H.263中有31个量化步长很相似, 但是在H.264中, 步长是以12.5%的复合率递进的, 而不是一个固定常数。在H.264中, 变换系数的读出方式也有两种, 之字形 (Zigzag) 扫描和双扫描。大多数情况下使用简单的之字形扫描;双扫描仅用于使用较小量化级的块内, 有助于提高编码效率。

(5) 熵编码:

视频编码处理的最后一步就是熵编码, 在H.264中采用了两种不同的熵编码方法, 通用可变长编码 (UVLC) 和基于文本的自适应二进制算术编码 (CABAC) 。不管符号表述什么类型的数据, 都使用统一变字长编码表, 其优点是简单; CABAC方法是在建立基本概率模型时通过内容建模, 提高算术编码的效率[1]。

3H.264标准的新发展

H.264标准发布之后, 为了将视频源从娱乐级视频源扩大到高分辨率视频源, 进一步提高编码效率及保真度, ISO/IEC与ITU-T组成的联合视频组 (JVT) 对H.264标准作出了改善。

(1) 进一步引入一些先进的编码工具, 提高了压缩效率, 其中大部分是在取样点比特深度和色度格式方面;而在提高编码效率方面, 主要是利用8×8的亮度帧内预测、4×4变换及8×8变换、量化矩阵等技术。

(2) 视频源的每个样值均可超过8b, 最高可达12b, 最初的标准仅支持源图像为每像素8b。

(3) 增加了4∶2∶2与4∶4∶4的采样格式, 最初的H.264标准支持的采样方式仅限于4∶2∶0。

(4) 更高的比特率, 更高的图像分辨率。

(5) 可达到图像高保真的要求, 支持无损压缩, 为满足视频信号高保真的要求, H.264/AVC引入了无损压缩编码方案。第一个是PCM方案, 它没有预测、变换和量化, 直接传送取样点的值以达到无损编码的目的;第二个是无变换的无损编码方案, 运用预测与熵编码技术来表示图像高效无损, 相对第一个方案提高了编码效率。

(6) 支持RGB格式的压缩, 同时避免了色度空间转换的舍入误差, RGB与YCbCr相互之间的颜色转换使用的都是浮点运算, 这必将引入舍入误差。为了消除在浮点运算中引入的舍入误差, H.264/AVC在支持RGB的同时引入了新的彩色空间YCgCo。

Y=1/2 (G+ (R+B) /2) , Cg=1/2 (G- (R+B) /2) , Co= (R-B) /2

上面的公式减小了色彩空间转换的复杂度;但是, 为了避免舍入误差, 要求增加额外的比特以保持精确性。为了把这个额外比特降到1b, 使用下面的公式:

Co=R-B, Cg=G- (B+ (Co≫1) ) , Y= (B+ (Co≫1) ) +Cg≫1) [2]

4H.264标准的应用前景

据国外媒体报道, 视频搜索网站MeFeedia最新调查研究报告显示, 自今年1月份以来, H.264格式越来越多地被采用, 增长了160%。MeFeedia网站的索引目录包含3万项源视频网站地址, 例如, Hulu, CBS, ABC, CNN, MTV, YouTube等等。据MeFeedia网站5月份的数据显示, 26%的视频采用H.264编码格式。而在1月份时, 只有10%的视频采用H.264编码格式。MeFeedia网站的研究报告显示许多旧格式视频 (比如新闻和电视节目) 没有改用H.264编码格式, 而大多数新的视频都采用了这一标准。多家媒体公司宣布计划采用H.264编码格式, 放弃原先的Flash播放器。

与此同时, 微软日前正式宣布, 下一代Web浏览器IE9将支持H.264视频格式, 而不支持Flash。

此外, 视频编码服务商Encoding.com 的消息也证实, 今年第一季度2/3的视频以H.264格式编码, 相较去年同期增长了两倍多。视频搜索引擎blinkx和Encoding.com的数据显示, H.264已经成为主流的网络视频编码技术。blinkx称, 在该公司目前索引的网络视频中, 85%~90%采用H.264编码技术。

鉴于H.264作为全球通用标准的优势, 国内大部分企业在部署新的视频应用时都有可能采用H.264, 并且, 正因为应用的广泛性, H.264的相关设备价格将会迅速下降, 部署成本也将因此得以降低。

我国的广电系统和电信运营商曾经将H.264作为主要的推动方向, 并取得了一系列的成绩。在目前电信已经实行运营的IPTV项目中, 几乎全部采用了H.264; 广电系统的各大电视台在进行从模拟向数字转换, 以及网络双向改造中, 也大量采用了H.264技术标准。

国内在H.264标准产品化方面比较领先的是上海富翰微电子的编解码芯片和深圳海思半导体的编解码芯片, 投入研究的单位主要包括清华大学、上海交通大学、暨南大学等。上海富翰微电子已经发布了基于H.264标准的高清网络摄像机和多通道网络视频服务器解决方案。

H.264的应用, 能够促进以下几个方面的发展:

(1) 视频监控的全IP化和高清化;

(2) 蓝光DVD及上下游硬件设备的发展;

(3) 局域网容量需求的上升, 以及由此带动的网络存储容量升级;

(4) 数字电视、IPTV发展的提速, 以及上下游产品和容源质量提升;

(5) 网络带宽的进一步升级等。

由于H.264标准能在较低的码率下实现更高的画质, 并且编码工具较为简单, 适应性强 (高低码率、各种分辨率) , 适合于各类网络 (宽带、窄带) 与系统 (组播、DVD存储、RTP/IP包网络、ITU-T多媒体电话系统) 应用。H.264/MPEG-4AVC视频编码技术已经得到了BD蓝光光盘、数字电视、通讯与多媒体组织及厂商的普遍支持。

结论

总体而言, H.264标准制定以来, 使运动图像压缩技术上升到了一个更高的阶段, 能在较低带宽上提供高质量的图像传输, 被视做下一代视频编解码应用的最佳实现之一, 普遍认为其会是将来更具竞争力的标准。

摘要:对H.264视频编解码技术标准的发展、技术特色、关键技术作了简要介绍, 并介绍了H.264标准的新发展与其在网络、广播电视领域的应用。H.264视频编解码标准是一种低码率、高压缩率、高适应性的视频技术, 在全球具有非常广阔的发展和应用前景。

关键词:H.264标准,视频,编码

参考文献

[1]Thomas Wiegand, Gary J.Sullivan, Gisle Bjontegaard, Ajay Luthra.Overview of the H.264/AVC Video Coding Standard.IEEE TRANSACTIONS ON CIRCUITS AND SYSTEMS FOR VIDEO TECHNOLOGY, JULY2003.

H.264解码核 篇3

H.264由于其编码的高复杂度从一开始就限制了它的应用,随着人们对编码算法的改进,去除了对编码效果有限但复杂度高的一些算法,使得H.264的视频编解码技术逐渐得到应用,现在使用得最多的编码器就是X264[1,2,3]。相对而言,解码器的速度要快得多,目前流行的H.264解码器包括JM Decoder、T264 Decoder、X264 Decoder、ffmpeg和Intel的IPP库。JM decoder是H.264的官方源码,也是校验模型,支持特性好但是实用性较差;T264是国内的开源项目,只能解T264本身的码流;X264本身没有decoder,但包含解码器的部分函数雏形;ffmpeg是包含各种音视频标准的codec,支持的标准全而且解码速度也很快;IPP用于在Intel的各种处理平台上实现信号处理常用算法以及音视频编解码算法,实现算法速度较快[4,5,6]。所有的解码器中,除了Intel的商用IPP库外,以ffmpeg的解码最快最稳定,ffmpeg集合了多种音、视频的编解码协议,可完成MPEG4和H.264等协议的解码。基于此并结合现有的图像传输研究现状,对视频图像在嵌入式终端上的解码方式进行了研究。

1 ffmpeg 视频解码播放步骤

基于ffmpeg的视频解码播放流程如图1所示。

打开一个视频文件并从中得到流,首先就是初始化libavformat/libavcodec;接着调用av_register_all()函数注册库中含有的所有可用的文件格式和编解码器,这样当打开文件时就能够自动选择相应的文件格式和编解码器;然后调av_open_input_file()函数读取文件头并将文件信息存储到pFormatCtx结构体中;调用av_find_stream_info()函数取出文件中的流信息;再调用avcodec_find_decode r()函数用来寻找频流的解码器,并得到指向视频流的上下文的指针;最后调用avcodec_open()函数用来打开解码器。

经过评测发现,各种H.264解码器中,速度最快的是intel IPP,但是由于其是商用软件,而其他的各种解码器都属于开源项目,所以最适合的选择就是解码速度第二的ffmpeg,而且其速度完全可以满足实时播放的要求。

2 SDL、ffmpeg和ffplay

由于ffplay是一个基于ffmpeg和开放源代码的跨平台多媒体开发库(Simple DirectMedia Layer,SDL)的播放器,因此,如果想在嵌入式平台上使用ffplay来播放视频文件,需要加入SDL的支持[7,8]。下面首先交叉编译SDL,这里采用的版本为SDL-1.2.13,然后编译ffplay和ffmpeg。

① 下载SDL安装包,解压缩并进入SDL所在目录。

② 运行配置。键入“./configure--help”,由于ARM板资源有限,根据需要设置参数,看情况改变prefix目录和各种选项,配置中指定使用帧缓冲设备,使用arm-linux-gcc交叉编译。本文中,使用的编译选项如下:

./configure --disable-video-qtopia --disable-video-dummy --enable-video-fbcon --disable-video-dga --disable-arts --disable-esd --disable-alsa --disable-cdrom --disable-video-x11 --disable-nasm --target=arm-linux --host=arm-linux --cc=arm-linux-gcc

③ make和make install,make install之后便在prefix目录下生成所需的动态库和include头文件等。下面使用SDL自带的例程测试交叉编译的SDL是否可以在ARM上使用,运行成功后会生成二进制应用程序“testwin”,将交叉编译好的SDL库和例程通过nfs挂载到ARM板,运行屏幕上出现移动的“SDL”说明交叉编译成功。具体的测试选项如下:

#cd test

#./configure --cc=arm-linux-gcc --host=arm-linux –with-sdl-prefix=/usr/local

#make

④ 下载ffmpeg安装包,创建依赖环境,在编译ffmpeg之前可以根据需要安装相应的codec和依赖包,ffmpeg的支持库包括xvid、x264、mp3和3gp等,可以网上下载相应的源码进行安装。

⑤ 交叉编译。交叉编译完成后,将会在目标目录下生成目标平台处理器格式的二进制可执行文件ffplay和ffmpeg,将生成的ffplay和ffmpeg移植到开发板上,同时将生成的库文件移植到ARM上Linux系统的根目录lib下运行。具体的编译选项如下:

#./configure --prefix=/usr/local/ffmpeg/install --enable-static --disable-shared --enable-libx264 --enable-libxvid --cross-compile --cc=arm-linux-gcc --arch=arm --enable-gpl --disable-strip --disable-network --disable-ipv6 --disable-vhook --disable-audio-beos --disable-audio-oss --disable-mpegaudio-hp --enable-pthreads --enable-small --disable-parsers --disable-debug

#make

#make install

3 部分程序源码

以下为基于ffmpeg的H.264视频解码的部分代码:

Decode (const char *outfilename, const char *filename)

{

AVCodec *codec;

AVCodecContext *c= NULL;

int frame, got_picture, len;

FILE *f;

AVFrame *picture;

uint8_t inbuf[INBUF_SIZE+FF_INPUT_BUFFER_PADDING_SIZE];

char buf[1024];

AVPacket avpkt;

av_init_packet(&avpkt);

memset(inbuf+INBUF_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);

avcodec_init();

avcodec_register_all();

codec=avcodec_find_decoder(CODEC_ID_H264);

if (!codec) {

return 0;}

c= avcodec_alloc_context();

if(!c){

return 0;}

picture= avcodec_alloc_frame();

if(!picture){

return 0;}

if(codec->capabilities&CODEC_CAP_TRUNCATED)

c->flags|=CODEC_FLAG_TRUNCATED;

if (avcodec_open(c, codec) < 0) {

return 0;}

f = fopen(test.264, "rb");

if (!f) {

printf("could not open file");

exit(1);}

frame=0;

for(;;) {

avpkt.size=fread(inbuf, 1, INBUF_SIZE, f);

if (avpkt.size == 0)

break;}

avpkt.data = inbuf;

while (avpkt.size > 0) {

len=avcodec_decode_video (c, picture, &got_picture, &avpkt);

if (len < 0) {

fprintf(stderr, "Error while decoding frame %d", frame);

exit(1);}

if (got_picture) {

fflush(stdout);

snprintf(buf, sizeof(buf), outfilename, frame);

pgm_save(picture->data[0], picture->linesize[0],

c->width, c->height, buf);

frame++;}

avpkt.size -= len;

avpkt.data += len;}

}

avpkt.data=NULL;

avpkt.size=0;

len=avcodec_decode_video(c, picture, &got_picture, &avpkt);

if (got_picture) {

fflush(stdout);

snprintf(buf, sizeof(buf), outfilename, frame);

pgm_save(picture->data[0], picture->linesize[0],

c->width, c->height, buf);

frame++;}

fclose(f);

avcodec_close(c);

av_free(c);

av_free(picture);

printf("");

}

4 测试结果

这里使用了foreman、news、carphone和highway四个视频序列,编码30帧,生成4个不同的H.264格式码流,将生成的码流分别在嵌入式平台上和PC机上进行了测试,测试结果的对比如表1和表2所示。

表1反映了4个视频序列分别在嵌入式平台和PC机上解码后视频图像的质量对比,从表中数据可以看出,图像质量相差不大,嵌入式平台上的解码效果与PC机上解码效果相近。表2反映出2个平台对同一视频流解码速度的对比,从表中数据可以看出,PC机的解码速度稍快于嵌入式平台,单纯地从嵌入式平台的解码时间来看,其已经能够满足工程应用中的实时性要求。

为了能够更鲜明地说明目标板的解码效果,图2和图3给出了foraman视频序列解码前后的图像对比效果。图2是在目标板上用ffplay运行的带误码的码流效果,图3给出了经过ffmpeg解码带误码的码流后的物理效果图,从图中可以得出,在嵌入式终端平台上可以对视频流进行实时的解码处理,且能够比较真实地反映源图像的品质。

5 结束语

在分析了各种解码器的性能后选用了ffmpeg对H.264进行解码。研究了ffmpeg的解码流程和实现以及ffmpeg解码H.264的实现,最后实现了ffmpeg和ffplay在嵌入式平台上的移植并给出了实现图。从实验结果分析,研究是切实可行的。目前,智能交通行业的发展已经迎来了新浪潮,智能监控已成为智能交通行业车辆信息采集的主要方式[9],嵌入式系统在智能交通上的应用已成可能,随着技术的不断深入,交通智能化必定会在各领域的共同努力下成为不可逆转的趋势。从实际运用看,上述研究可以依托视频传感器采集的图像,利用现阶段路口大范围普及的视频摄像头,利用现有的资源获取极大的效益,无需增加额外的成本。

参考文献

[1]毕厚杰.新一代视频压缩编码标准——H.264/AVC[M].北京:人民邮电出版社,2005:68-128.

[2]郭宝龙,倪伟,闫允一.通信中的视频信号处理[M].北京:电子工业出版社,2007:30-55.

[3]马宇峰,魏维,杨科利.视频通信中的错误隐藏技术[M].北京:国防工业出版社,2007:44-58.

[4]WIEGAND T,SULLIVAN G J.Overview of the H.264/AVC Video Coding Standard[J].IEEE Transactions onCircuits and Systems for Video Technology,2003,13(7):560-576.

[5]SULLIVAN G J,TOPIWALA P,LUTHRA A.The H.264/AVC Advanced Video Coding Standard:Overview andIntroduction to the Fidelity Range Extensions[C]∥SPIEConference on Applications of Digital Image Processing,2004:376-382.

[6]IAIN E,RICHARDSON G.H.264 and MPEG-4 VideoCompression[M].The Robert Gordon University,Aberdeen,UK,2004:159-187.

[7]周立功.ARM嵌入式系统基础教程[M].北京:北京航空航天大学出版社,2005:415-449.

[8]何勋,周鹰,王亚非.基于S3C2440的H.264软编解码器实现[J].现代电子技术,2010,38(6):38-39.

H.264解码核 篇4

随着人类文明的高度发展, 人类对信息的实时需求也越来越丰富。能够通过文字、语音、图像和视频等各种方式进行随时随地的信息交流是人们十分渴望的, 近代飞速发展的科学技术, 也正在不断满足人类的这些需求。随着视频压缩技术和网络技术的发展, 可视对讲、可视电话、视频会议、视频监控、网络直播等多媒体业务成为了人们关注的热点。

1 H.264视频压缩标准及流媒体技术

1.1 H.264视频压缩技术

1.1.1 H.264标准的主要特点

(1) 具有更高的编码效率;

(2) 具有高质量的视频画面;

(3) 具有更强的网络适应能力;

(4) 采用混合编码结构;

(5) 具有较少编码选项;

(6) 可应用在多种环境下;

(7) 具有错误恢复功能。

1.1.2 H.264标准的关键技术

(1) 分层设计

H.264的算法在概念上可以分为两层:视频编码层和网络提取层。视频编码层主要用来更高效的视频内容编码, 网络提取层则主要用来根据网络的要求, 以恰当的方式对数据进行打包和传送。在视频编码层和网络提取层之间定义了一个基于分组方式的接口, 打包和相应的信令属于网络提取层的一部分。这样, 高效的编码率和良好的网络适应任务可以分别由它们来完成。

(2) 帧内预测编码

帧内预测编码包括:4×4亮度帧内预测模式、16×16亮度帧内预测模式、8×8色度块帧内预测模式。

(3) 帧间预测编码

H.264采用了更加先进的技术, 允许编码器使用多于一帧的先前帧用于运动估计, 以提高运动估计和运动补偿的精度和效率。一般我们是通过运动估值和运动补偿来利用时域相关性的。

(4) 熵编码

熵编码是无损压缩编码方法, 它生成的码流可以经解码无失真地恢复出原数据。H.264提供了两种熵编码方法:一种是基于上下文的自适应变长编码与普通变字长编码相结合的编码, 另一种是基于上下文的自适应二进制算术编码。

1.2 视频网络传输的流媒体技术

流媒体本质上是指采用流式传输的方式在互联网播放的多媒体格式。流式传输的过程一般如下:当用户选择流媒体服务后, Web浏览器与服务器之间通过使用HTTP/TCP交换控制信息, 来把需要传输的实时数据从原始信息中检索出来;然后Web浏览器启动音视频客户端程序, 使用HTTP从Web服务器检索相关参数对音视频客户端程序进行初始化;音视频客户程序及音视频服务器运行实时流协议, 用来交换音视频传输所需的控制信息, 实时流协议提供执行播放、快进、快倒、暂停及录制等命令的方法;音视频服务器使用RTP/UDP协议将音视频数据传输给音视频客户端程序, 一旦音视频数据抵达客户端, 音视频客户程序即可播放输出。

流媒体技术的实现主要是流式传输的实现, 而流式传输除了需要经过处理的多媒体数据和足够的缓存外, 更重要的是需要适当的协议, 才能保证流式传输的顺利进行, 流式传输中主要使用实时传输协议RTP与实时传输控制协议RTCP、实时流放协议RTSP、资源保留协议RSVP协议。

2 视频网络传输系统的实现

网络摄像机可以将影像通过网络传至地球另一端, 也可用于局域网内。网络摄像机是网络视频监控系统的主要组成部分, 它在网络视频监控系统中是视频监控终端, 由摄相机捕捉到的视频画面, 被其进行视频编码、打包, 然后依靠流媒体技术, 通过网络将其传送到显示终端。

网络摄像机的视频数据先以单播RTP的方式传输到Darwin流媒体服务器, 再由该服务器直接存储, 或以广播或多播的方式使用RTSP协议中转到每个客户端, 从而可以实现在多个客户端的视频点播或实时视频直播。

3 小结

H.264技术具有更精确的预测能力和更高的容错能力, 因此可实现更高的压缩效率, 它将有可能推动视频编码器进一步向前发展。随着H.264格式更加广泛地应用于网络摄像机, 系统设计商和集成商将需要确保他们所选择的产品和厂商能够支持这一全新的开放标准。

参考文献

[1]王彩霞, 赵刚, 刘三民.H.264的视频压缩技术的研究与分析[J].计算机与信息技术, 2009, 1 (Z1) :46-52.

[2]楼剑, 虞露.新一代的视频编解码标准:H.264[J].当代通信, 2003 (5) :27-31.

[3]周华.音视频编解码技术H.264的应用研究[J].福建电脑, 2006 (6) :42-43.

[4]杜晔.流媒体技术的原理和应用[J].光盘技术, 2008 (7) :9-11.

[5]张银才.流媒体技市及其应用[J].有线电视技术, 2009 (3) :38-40.

H.264解码核 篇5

H.264的编解码算法中采用了大量的先进技术[2]。这些新技术使得H.264与H.263++或MPEG-4相比,在编码质量相同的情况下,最多可以节省50%的比特率,但这些技术也极大地增加了算法的复杂度。尽管该标准目前仍然在不断完善中,但最新发布的测试模型目前还远不能达到实时的要求。这使得H.264的实时解码成为人们非常关注的问题之一。本文采用ChipWrights公司生产的CW5521芯片。在经历了解码器的提取,代码的C语言级优化及并行优化后,使得编码器的运行速度和优化前相比,提高了近15倍,实现了VGA解析度下的25 f/s以上的实时解码。

1 H.264解码器构架及问题分析

目前可用的H.264的解码器开源代码有多个版本,从解码的效率和质量上考虑,本文选用FFmpeg集成的H.264的解码器。FFmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案。它支持AVI、MPEG、ASF、H.264等90多种解码。以其代码简洁、功能强大、执行效率高等优点得到广泛地应用。

经提取出来的H.264解码器,本文设计了h.264_open、h.264_parse、h.264_decode、h.264_close四个主要接口。 针对h.264_decode这一部分,图1中给出了H.264解码器的框图[3]。H.264仍然采用了基于块变换的混合编码方案,输入码流元素熵解码后将分为两条主要路径,一路利用头信息生成帧内或帧间预测块,另一路则用于重建预测残差块,两条路径的输出经过组合后送入去块效应滤波器,从而得到重建图像。

PC机上仿真分析可以发现解码器中占CPU时间最多的功能模块依次为帧内与帧间预测、熵解码、去块效应滤波,并且仅这3个模块占用时间和,就为解码器总时间的84.1%。其中帧内与帧间预测模块是解码器中最耗时的模块,占解码器总时间32.8%,其次是熵解码的29.1%及去块滤波的22.2%。由于熵解码的处理过程比较分散,对不同元素的处理方法各有不同,并行优化难度比较大,而且效果不会很好。但其占用时间主要为等待时间。因此,对这部分的优化侧重于加快读取速度、减少等待时间。对帧内与帧间预测和去块滤波部分进行了重点优化,而对解码器中的其它模块中比较耗时的操作,如反变换、内存拷贝、大块数据赋值等进行了局部优化。

2 CW5521芯片结构简介

CW5521是ChipWrights公司CW5xxx系列中的一款高性能数字信号处理器。该芯片采用单指令多数据(SIMD)架构。CW5521的基本组件如图 2所示。

CW5521支持精简指令集(RISC),并包含16个并行处理单元,每个处理单元包括1个96 bit的累加器和31个32位的寄存器。每个处理单元可分别在不同的数据片上执行相同的操作,以此达到并行处理的目的,显著提高了数据处理的效率。同时,这些并行通路也可以根据需要开启或关闭。CW5521最多每秒钟可实现高达192亿次的乘加运算。

CW5521只有一个串行处理单元,类似于传统的精简指令集处理器。它负责访问控制寄存器、管理程序计数器等。CW5521的主内存是一个256 KB的SRAM,被分成8个8K×32的交叉访问的块。也就是说,每一个指令周期内可以读/写8个32位的数据。

当前图象及视频的压缩处理,大都是以宏块为基本单元。CW系列处理器的并行结构使其非常适合于做视频图象的处理,可以一次处理图象中一行或一列的宏块,每个宏块都有许多独立于其他的运算操作,而这些操作的指令可以同时在一个时钟周期内完成。因此,大大增加了视频图象的处理速度。

3 基于CW5521的H.264解码器的优化

本文优化设计的理念就是合理使用片主内存(PMEM),并使其运行能充分利用16个并行的处理单元。因此,优化其代码,首先必须考虑解码结构、工作过程有利于并行处理。优化的过程大体可分为以下两个步骤。

3.1 解码器设计的C语言级优化

3.1.1 数据结构优化

FFmpeg设计了统一的接口来调用其内部集成的各种编解码器。它通过公用的结构体AVCodecContext来描述各种编解码器所需用到的中间变量。本文中专门针对解码器定义一个新的结构体H264DecodeContext,去掉了和H.264解码器无关和解码过程中用不到,或累赘使用的变量、如和音频相关的变量与和h264_decoder结构体内存分配相关的变量。文中不再采用FFmpeg里面的指针调用函数的形式。从而使得这套代码达到最佳的精简效果。这样尽量的少占用片内的主内存,也就减少了内存访问的时间,同时可以在256 K的片内存中空出大块的连续空间来存放经常访问的数据。

3.1.2 H.264去块滤波

边界强度(Bs)决定去块滤波器的滤波参数,并控制去除方块效应的程度。对所有4×4亮度块间的边界,边界强度的参数值在0~4之间,它与边界的性质有关。在实际的滤波算法中,Bs决定对边界的滤波强度,包括对两个主要滤波模式的选择。当其值为4时,表示要用特定最强的滤波模式,而其值为0时表示不需要对边界进行滤波。对其值为1~3的标准滤波模式,Bs值影响滤波器对样点的最大修正程度。

滤波是基于宏块基础上,按标准每个编码图象的滤波运算必须按规定顺序进行,并且在适当的位置上进行,但并不拘泥于每个宏块单独来做。我们修改了原始代码中滤波处理这部分代码,其工作流程的区别如图3所示。原始代码是以宏块或宏块对为单位,每做完一个宏块的解码后,计算Bs并根据Bs马上进行去块滤波。经修改后的代码,解码完一宏块或宏块对以后,计算出其边界强度值,并存储于我们定义的数组中,当整个片的宏块解码完成后,我们将利用边界强度数组值,对整个片的宏块进行去块滤波处理。这样做的好处是在宏块内水平及垂直滤波阶段,我们每次缓冲16个宏块,并同时做每一个宏块的滤波,从而充分利用了16个并行的处理单元,大大提高了解码运算的速度。

3.2 重点函数的并行优化

所谓并行优化,就是根据CW5521的开发向导,将原代码中C语言实现的函数改写成由针对芯片的特殊的汇编语言写成的程序,并存入*.cas文件。cas文件中函数的写法并不复杂,限于篇幅这里不做过多说明,更多的介绍请参看文献[1]。最重要的是将函数中用到的变量归成不同的类,例如有的变量串并行处理单元能同时使用的整型变量要声明为spint类型,pint类型是只能应用于并行处理单元的,而int类型默认只能由串行单元使用。针对源代码中要经常使用的多重循环,而循环变量前后的变量没有强的依赖关系,通常要进行循环拆解,将多重循环拆解为单重循环,每次循环执行由一个并行单元来完成。达到并行处理的效果ChipWrights开发环境包括一个软件开发工具箱,它在Metrowerks CodeWarrior集成开发环境中集成了编译器、仿真器、性能评估器、链接器和调试器。芯片仿真器是一个在PC上运行的程序,它是ChipWrights集成开发环境(IDE)的一部分,可以从功能上仿真DSP硬件,而且仿真周期很准确。这使得开发者无需接触实际目标板就能编写和运行汇编代码。

芯片仿真器能为DSP的周期数建模,其内置仿图器(profiler)可生成一个特定仿真所执行的全部指令的HTML报告。对每一函数,仿图器的输出同时可以向我们用于某条指令的特定栈。我们关注的主要栈包括:DMA分块、一级高速缓存填充、指令排序和循环过程定时。借助这些信息,本文通过用汇编语言编写关键部分代码,同时确保以一种最适于并行处理的方式,重新安排输入数据,并利用如上介绍的方法,逐个改写那些占用CPU时间最多的函数,逐步实现代码的优化。

通过仿真分析可以发现,avcDeblockSection、avcMotionCompMbPlainLuma等这些函数及其子函数耗时较多,通过并行优化使得这些函数的运行速度大大提高。为了说明优化的程度,本文解码5帧图像,选择这些过程中的一些子函数,优化前后性能的比较如表2所示。

解码器中有些适合做并行处理的函数,优化后运行速度会提高4~10倍。对于Deblock过程,里面有许多的if判断语句。众所周知,这是很耗时的。对于某些函数,其占用CPU的时间大多为等待的时间,等待数据的读入。对于这样的函数,我们通常用DMA将数据一次性的从SDRAM中读PMEM中。其优化效果要远远好于列举的函数。实验证明采用上述的方法,结束了整个工程的优化后,在CW5521开发板测试,其速度至少为优化前15倍以上,远超过了我们项目需求。

4 结 论

在CW5521的开发板上进行测试,我们的H.264解码器在VGA解析度下能轻松实现25 fps以上的解码,达到了实时应用的要求。在实践中可以发现,并行处理效果较好的函数包括:离散余弦反变换、运动补偿部分及去块滤波。不太便于并行处理的程序算法有串行比特流、熵解码等等。

H.264标准一经问世,以其高压缩率、同等码流条件下的高质量视频,立刻得到了广泛的关注,可以实现无线移动视频通讯、高清电视,包括军事等等各个领域的应用。但因其算法复杂,难于在硬件上实现而并没有得到普及。因此,针对不同的应用对算法进行优化,以及针对不同的平台对代码进行优化,对这种优秀的视频标准的推广具有切实而深远的意义。本文的所做的优化可直接应用于数字机顶盒及IPTV领域。

参考文献

[1]Writing Code for CWvX Processors Training Guide

[2]Richardson I E G.Transform and Quantization.H.264/MPEG4Part10.White Paper.Mar.2003

[3]余兆明,查日勇,黄磊,等.图象编码标准H.264技术.北京:人民邮电出版社,2006

H.264解码核 篇6

H.264是目前视频压缩领域编码效率较高的视频编码标准,但是其运算复杂度较高,特别是随着高清数字电视(HDTV)技术广泛应用和互联网的快速发展,使编解码器对处理器的要求越来越高[1]。HD视频中较低的解析度即为720p分辨力,采样点高达1 280×720,而顶级格式的1 080p更是达到了1 920×1 080。在高分辨力的情况下,其码率是很高的。例如,720p格式中帧率为60 bit,10 bit量化、4∶2∶0采样方式,其码率为791 Mbit/s,如果采用视频压缩技术,压缩后码率也超过12 Mbit/s,这也就意味着视频解码和后期处理对处理器具有很大的挑战。

如何在现有计算机的基础上降低视频解码对硬件的要求,进而降低CPU的使用率已成为视频解码技术的研究热点。当前主流的方法是通过利用GPU(Graphic Processing Unit)来分担视频解码的部分工作[2]。而利用GPU来进行视频解码的技术主要有两种方式:第一种是利用GPU内部能够并行工作的流处理单元,编写在GPU上运行的代码,典型的代表有NVIDIA的CUDA和ATI的Stream技术;第二种是间接通过GPU来加速,通过制定统一的解码接口来实现,主要是微软的DXVA(Direct X Video Acceleration)。第一种方式在解码速度上有优势,但是实现起来比较复杂,而且必须熟悉GPU的架构和数据处理流程,针对不同的GPU设备,实现的代码不相同,跨平台性能差。而第二种在速度上可能有一点逊色,但是实现起来简单,可扩展性能好,针对不同的GPU设备,只要支持DXVA都可以使用。通过以上分析,本文采用基于DXVA的H.264视频解码设计。

1 H.264标准和DXVA技术

H.264是目前视频压缩领域编码效率较高的编解码标准。其软件解码框图如图1所示。主要完成以下功能:解码器首先提取H.264码流中的NAL单元,然后对NAL单元进行熵解码、反量化和反变换,根据参考帧和运动矢量进行预测和运动补偿,然后把解码出的图像进行环路滤波,最后对滤波的图像进行显示和参考帧缓存[3,4,5,6]。

DXVA是微软为加强视频播放效果所设立的一套API(Application Programming Interface)和DDI(Device Driver Interface)。通过DXVA可以把解码的部分工作和视频的后期处理操作从CPU转移到GPU,这样利用了GPU硬件单元的并行处理来加速视频播放的效果,从而降低了CPU的利用率[7]。

在H.264视频解码的过程中,运动补偿、反离散余弦变换和可变长编码这些操作占了解码总操作时间的80%以上[8],因此,如果能够减少这些操作的时间,那么解码的整个时间一定会减少很多,而且也会大大降低CPU的工作量。目前DXVA规范规定的硬件加速的操作也正是这些解码过程,不过DXVA是按等级来划分的。例如,对于H.264标准来说共分为6个等级,分别为DXVA2_Mode H264_A~DXVA2_Mode H264_F。因此,GPU厂商在实现这些接口的时候也只是实现了其中的一些子集,本文采用GF9500GT实现的等级是DXVA2_Mode H264_E,也就是MC,IDCT和VLC的解码操作都是在GPU上实现的。

2 高清解码器的设计和实现

要实现解码器的硬件加速功能,就是把软件解码器的部分工作转移到显卡的GPU上来完成,但是由于显存和内存之间数据总线的传输速率相对于处理器的处理速度比较慢,所以在设计解码器的过程中要尽量减少数据在内存和显存之间的传输次数,并且解码之后的数据尽量不要再传回内存,否则可能会降低解码器的性能,也就是说把视频数据的后期处理(如颜色空间转换、缩放等一些特效)也利用显卡进行。

如图2所示,DXVA硬件解码主要有3种处理架构:将解码的MC部分转移到GPU中;MC和IDCT转移到GPU中;将MC,IDCT和VLD转移到GPU中执行。图中虚线以上为CPU执行部分,虚线以下为GPU执行部分。本文按第3种架构来实现H.264视频解码器。

2.1 DXVA解码器使用的缓冲区

解码器如果要使用硬件解码单元,必须要给硬件单元传送一定的配置参数,DXVA同样也不例外,每个参数都是以对应的缓冲区来传送的,所以,如果要传送参数必须首先向DXVA申请缓冲区,然后填充对应类型的缓冲区。本文解码器需要传送4个解码参数,即4个缓冲区:图片参数缓冲区、条带控制命令缓冲区、码流缓冲区和量化值缓冲区。

1)图片参数。在DXVA解码器解码当前帧时需要一个对当前帧描述的参数,对于H.264标准用DX-VA_Pic Params_H264结构体描述。图片级别中每个图片的信息会不一样,所以每解码一帧图片之前,此结构体都要被传送。以下是DXVA_Pic Params_H264结构体的定义:

例如参数中的w Frame Width In Mbs Minus1对应于H.264标准中的同名参数。本文在传送该参数前需要先调用Idirect XVideo Decoder::Get Buffer()来获得图像参数的缓冲区,该函数共有3个参数,分别为缓冲区类型,指向缓冲区的指针地址和缓冲区的大小,对于图片参数来说,缓冲区类型为DXVA2_Picture Parameters Buffer Type,而这个缓冲区类型是枚举类型。得到此缓冲区之后即可以进行配置图片参数。

2)条带控制参数。条带控制参数是对当前码流的描述,用DXVA_Slice_H264_Short结构体来描述,其定义为:

其中,BSNALunit Data Location表示传送码流的NA-LU单元中编码数据的起始字节数,w Bad Slice Chopping表示传送的码流是否包含起始码,Slice Bytes In Buffer表示传送码流总的字节数,此数值不是用户实际传送的码流字节数,而是用户传送的码流按照128 byte对齐的数值,不足的部分用零填充,对齐的主要作用是在内存和显存之间能够高效快速地传送数据。

3)量化矩阵缓冲区和码流缓冲区。量化矩阵缓冲区是解码器进行反量化时所用矩阵的缓冲区,其定义为:

该缓冲区数据结构包括两种反量化矩阵,即4×4和8×8反量化矩阵。码流缓冲区是一块分配的显存地址,把解码的码流通过该缓冲区传送给GPU。

4)存放视频数据的缓冲区。码流在GPU中解码后的数据一般是YUV格式的,解码后的数据存放在叫“表面”(Surface)的硬件缓冲区,即存放视频数据的显存。存放数据的方式取决于表面的类型(视频数据的存放格式)以及显卡所支持的类型,对于DXVA解码来说,微软推荐的视频数据类型是NV12,所以大多数显卡都支持这种视频数据的存放格式。

NV12格式中每个视频数据采样点的每个分量用1 byte表示,存放的方式是一帧数据中所有的Y分量存储在第一个区域内,后面是UV数据的打包形式,即每个像素的UV分量交替存储。而数据在表面中存储也是按行存储的,即表面每行视频数据的字节数是和分辨力有关的,但每行的实际长度和分辨力不一定一样,这主要取决于显卡驱动程序。可以通过调用显卡驱动的API函数来获取表面中每行的实际长度。图3是NV12类型的表面示意图,其中视频的分辨力是1 280×720,驱动程序是NVIDIA 266.58版本。由图3可知,表面的实际长度是2 048,而不是1 280。

2.2 视频数据的后期处理

如前所述,视频解码后的数据是存储在显存中的,而且数据的格式和显示器能够显示的格式是不相同的,要显示解码后的视频图像必须对数据进行后期处理,例如反交织、图像缩放和颜色空间转换等操作。如果这些操作用软件的方式通过CPU进行处理,那么解码后的视频数据就必须从显存再传回内存中,数据处理过之后再传回显存进行显示,由于总线数据传送速度的限制,这样会大大降低解码器的性能,甚至会使解码器的解码速度达不到播放的要求。

现在的主流显卡一般都集成了视频的后期处理功能,这样就能够使解码后的数据不用再传回内存而在显卡内就可以进行处理,而且基于硬件的处理操作速度会比软件更快,这样也就进一步提高了解码器的性能。DXVA规范中关于后期处理的操作是DXVA Video Process-ing,该操作可以完成视频数据的后期处理,包括反交织、视频流混合、图像缩放、颜色空间转换和图像滤波等。其示意图如图4所示。

2.3 多路解码器的设计与实现

本文在设计解码器的过程中把大量的算术运算转移到GPU上,利用其硬件单元来解码,但是对于码流的头部解析包含大量的逻辑运算,如果也转移到GPU上进行,对解码器的性能有很大的损耗。所以在系统设计时把码流的头部解析通过软件来进行。

在整个程序的设计过程中,主要定义了代表显卡设备的数据结构和代表解码器的数据结构。因为驱动程序允许多个对象共享一个硬件设备,所以多个解码器可以关联一个显卡设备。显卡数据结构的定义为:

其中,Hwnd是程序创建的一个用来显示的窗口句柄,p D3D9和p D3DD9分别表示显卡对象和显卡设备,p D3Dmanager是一个显卡设备的管理器,主要是用来管理多个解码器共享显卡设备的,PCI_Vendor代表显卡的制造厂商,Decoder Cnt是表示和显卡关联的解码器个数。解码器定义的数据结构如下:

p D3Dmanager是解码器关联的显卡设备,p DX-VADecoder是所创建的解码器,p D3D9 Surface是解码后的数据存放的表面,Dxva Pic Params,Dxva Slice Short和Dxva Qmatrix是提到的解码硬件单元用到的数据缓冲区结构,sps和pps是H.264标准中所表示的条带控制参数和图像控制参数。在设计中,本文定义了设备的创建和解码接口,这样方便其他的程序或客户使用,在整个系统中,主要定义了5个接口函数:

1)HRESULT Init D3DManager(D3DManager*p Man-ager)。函数的主要功能是初始化显卡并创建一个显卡设备,检测显卡的类型等。

2)HRESULT Create Dxva Decoder(DXVADecoder H264*p Decoder)。函数的功能是根据所关联的D3Dmanager创建一个硬件解码器对象,并使所关联的D3Dmanager数据结构中的解码器的计数加1。

3)HRESULT Dxva Decode Frame(DXVADecoder H264*p Decoder,NALU_t*p H264NALU,RECT*p Rect)。函数是解码器的解码接口,主要有3个参数,第1个是代表解码器,p H264NALU是H.264码流中的一个NALU单元,p Rect是代表该解码器解码后的数据在显示窗口的显示区域。

4)HRESULT Destroy Dxva Decoder(DXVADecoder H264*p Decoder)。函数的功能是释放解码设备并使所关联的D3Dmanager数据结构中的解码器计数减1。

5)HRESULT Destroy D3DManager(D3DManager*p Manager)。函数的功能是释放显卡设备并销毁所创建的显示窗口,该函数在销毁之前会检测其关联的解码个数是否为0,如果不为0,则该函数什么也不执行并立即返回,所以在任何时候调用都能够确保安全。

整个系统的流程如图5所示,其中解码器在解码一帧数据时的内部解码流程如图6所示。其中在解码器内部加一个阻塞锁是为了防止多个解码器同时使用一个硬件解码单元,因此本文设计的系统可以开启多个解码线程进行多路解码。

3 解码器性能评测

由于显卡驱动程序对硬件解码单元最大的解码路数的限制,其限制最高同时执行4路解码,所以测试时开启4个解码线程同时解码分辨力为1 280×720的高清视频。评测的环境是双核CPU 2.5 GHz,内存DDR2 2 Gbyte,显卡GF9500GT,并在Visual Studio 2008环境下调试编译,计时采用C语言库的clock()函数,精确到毫秒级。解码器同时解码4路高清视频的显示效果如图7所示。

本文主要测试解码器的解码速度和CPU的占用率这两个指标。测试时,操作系统为Win7,CPU为奔腾双核E5200 2.5 GHz,显卡为中低端显卡NVIDIA Ge Force9500T。在测试解码速度时,采用固定码率的码流,码率的大小和蓝光DVD的码率大小相接近,达18 Mbit/s。解码速度指标用每秒能够解码的帧数来衡量。测试结果如表1和表2所示。

由表1和表2中可以看出,当在播放高清视频时打开DXVA功能时可以大大降低CPU的占用率,解码速度提升4倍左右。完全可以胜任同时解码4路720p的视频,此时CPU的占用率约为40%,仅和CPU解码一路视频时的CPU占用率相当。当把显卡更换为当前市面上主流的中端显卡GT440时,多路解码器可以同时开启12路高清解码,是GF9500解码能力的3倍,而且画面流畅。

4 小结

随着高清时代的到来,用户对于视频的清晰度有了更高的要求,而高的清晰度意味着对解码器的解码速度也提出了更高的要求。本文设计的基于GPU解码器利用DXVA接口和GPU实现了多路高清视频H.264解码,大大提高了解码速度,在实际应用中获得了很好的解码效果。

参考文献

[1]孙立,王健,郭春辉,等.基于CUDA的H.264去方块滤波的设计和实现[J].电视技术,2010,34(5):44-46.

[2]DirectX video acceleration specification for H.264/AVC decoding[EB/OL].[2010-12-10].http://download.microsoft.com/download/5/f/c/5fc4ec5c-bd8c-4624-8034-319c1bab7671/DXVA_H264.pdf.

[3]毕厚杰.新一代视频压缩编码标准[M].2版.北京:人民邮电出版社,2009.

[4]H.264/MPEG-4Part10white paper[EB/OL].[2010-12-10].http://www.vcodex.com.

[5]Joint Video Team(JVT)of ISO/IEC MPEG and ITU-T VCEG.H.264ISO/IEC 14496-10 AVC,Document JVT-G050[EB/OL].[2010-12-10].http://wftp3.itu.int/av-arch/jvt-site/2005_07_Poznan/JVT-P050.doc.

[6]朱秀昌,刘峰,胡栋.数字图像处理与图像通信[M].2版.北京:北京邮电大学出版社,2008.

[7]张帆,史彩成.Windows驱动开发技术详解[M].北京:电子工业出版社,2008.

H.264解码核 篇7

1 非线性编辑系统中的主要压缩技

视频压缩技术是非线性编辑系统的核心技术, 正是由于视频压缩技术的飞速发展, 低码率的图像质量有很大提高, 才推动了非线性编辑在专业视频领域中的应用。目前, MPEG-2, DV是非线性编辑系统所采用的2种主要压缩技术。除此之外, 新一代视频压缩标准MPEG-4和H.264也被渐渐应用到非编系统中。

1.1 MPEG-2。

MPEG组织于1994年推出MPEG-2压缩标准, 是目前广播电视领域中应用最普遍的压缩方式, 其主观质量接近无损压缩的图像质量。它与M-JPEG最大的不同是, 不仅采用了帧内压缩, 还增加了帧间压缩。

1.2 DV。

DV (Digital Video) 格式目前已经成为一个国际标准。它采用帧内压缩的编码技术, 支持帧精确编辑, 而且DV格式的数据流与图像质量在整个过程中是恒定的, 能够保证较高的图像质量。但由于缺少帧间压缩处理, 图像质量低于MPEG-2。

1.3 MPEG-4。

MPEG-4于1999年正式成为国际标准, 基于对象编码, 是一种高效率的压缩标准。在开发低码率编码的同时, MPEG-4更注重具多媒体系统的交互性和灵活性, 旨在将众多的多媒体应用集成于一个完整的框架内, 建立一种能被多媒体传输、存储、检索等应用领域普遍采用的统一数据格式。

1.4 H.

264。H.264/AVC是由ITU-T VCEG (视频编码专家组) 和ISO/IEC MPEG (运动图像专家组) 成立的联合视频专家组制定的最新的视频编码标准。能够在较低带宽提供高质量的图像传输, 对网络传输有更好的支持。随着H.264应用的日益广泛以及编解码算法的不断优化, H.264必将逐渐成为非线性编辑系统的首选压缩格式之一。

2 H.264算法的优势

H.264是在MPEG-4技术的基础之上建立起来的, 其编解码流程主要包括5个部分:帧间和帧内预测 (Estimation) 、变换 (Transform) 和反变换、量化 (Quantization) 和反量化、环路滤波 (Loop Filter) 、熵编码 (Entropy Coding) 。H.264/MPEG-4 AVC (H.264) 是1995年自MPEG-2视频压缩标准发布以后的最新、最有前途的视频压缩标准。通过该标准, 在同等图象质量下的压缩效率比以前的标准提高了2倍以上, 因此, H.264被普遍认为是最有影响力的行业标准。

3 H.264与MPEG-2码流层次结构比较

MPEG-2是目前应用最广泛、技术最成熟的视频压缩标准, 尽管H.264编码技术较之前的编码标准有许多先进之处, 但基本的编解码框架并没有什么区别, 只是各功能模块实现的细节不同, 因此MPEG-2在非编系统中的应用对于H.264有很重要的参考意义。

3.1 MPEG-2码流的层次结构。

MPEG-2码流的构成分为6个层次:3.1.1视频序列 (Sequence) :序列头给出图像分辨率、帧率和所用量化表的类型等信息。3.1.2图像组 (GOP) :随机进行存取的单元。3.1.3图像 (Picture) :基本的编码单元, 其头信息中记录帧类型 (IBP) 和它在GOP中的次序号。3.1.4片 (Slice) :进行再同步的单元。一幅图像可以分成一个或多个片, 在每个片的开始, 对运动矢量和DC系数值做DPCM的预测值都重新置为零, 这可以防止解码时误差的积累。3.1.5宏块 (MB, Macro Block) :运动补偿的基本单元。3.1.6块 (Block) :DCT的基本单元。

3.2 H.

264码流的层次结构。H.264在系统层面上与以往标准不同, 它提出了一个新的概念, 即提出两个概念性的编码层:视频编码层 (VCL, Video Coding Layer) 和网络提取层 (NAL, Network AbstractionLayer) 。VCL层是视频内容的核心压缩内容的表述, NAL层则是将VCL表示的视频编码数据转化成特定类型网络传输或存储的视频格式。3.2.1 VCL层。H.264标准的视频编码 (VCL) 层在原理上与MPEG-2的视频编码层是一致的, 都采用变换编码, 并使用了空间和时间预测的混合编码。每一帧视频数据划分为片, 宏块, 子块, 块。3.2.2NAL层。NAL层是由NAL单元所构成的。每个NAL单元第一个字节是头信息, 说明NAL单元的数据类型。NAL头信息之后是负载数据 (RBSP) , 它包含整数个编码的图像数据字节。NAL单元总共分两类, VCL单元和非VCL单元。VCL单元中包含着图像数据的抽样值;非VCL单元包含着与图像数据相关的附加信息, 如参数集和增强信息。在NAL单元流中可能包含有一个或多个已编码视频序列, 每个序列是由一系列的接入单元组成的, 它们使用同样的序列参数集, 能够独立于其他序列进行解码。每个接入单元由一组NAL单元形成, 它包含一幅图像的信息, 解码后可构成一幅图像。

4 H.264的技术亮点

4.1 分层设计。

H.264的算法在概念上可以分为两层:视频编码层 (VCL) 负责高效的视频内容表示, 网络提取层 (NAL) 负责以网络所要求的恰当的方式对数据进行打包和传送。在VCL和NAL之间定义了一个基于分组方式的接口, 打包和相应的信令属于NAL的一部分。这样高编码效率和网络友好性的任务分别由VCL和NAL来完成。

4.2 高精度、多模式运动估计。

H.264支持1/4或1/8像素精度的运动矢量。在1/4像素精度时可使用6抽头滤波器来减少高频噪声, 对于1/8像素精度的运动矢量, 可使用更为复杂的8抽头的滤波器。在进行运动估计时, 编码器还可选择“增强”内插滤波器来提高预测的效果。

4.3 4×4块的整数变换。

H.264与先前的标准相似, 对残差采用基于块的变换编码, 但变换是整数操作而不是实数运算, 其过程和DCT基本相似。这种方法的优点在于:在编码器中和解码器中允许精度相同的变换和反变换, 便于使用简单的定点运算方式。变换的单位是4×4块, 而不是以往常用的8×8块。由于用于变换块的尺寸缩小, 运动物体的划分更精确,

4.4 统一的VLC。

H.264中熵编码有两种方法, 一种是对所有的待编码的符号采用统一的VLC, 另一种是采用内容自适应的二进制算术编码 (CABAC) 。CABAC是可选项, 其编码性能比UVLC稍好, 但计算复杂度也高。UVLC使用一个长度无限的码字集, 设计结构非常有规则, 用相同的码表可以对不同的对象进行编码。

4.5 帧内预测。

在先前的H.26x系列和MPEG-x系列标准中, 都是采用的帧间预测的方式。在H.264中, 当编码Intra图像时可用帧内预测。对于每个4×4块, 每个像素都可用17个最接近的先前已编码的像素的不同加权和来预测, 即此像素所在块的左上角的17个像素。显然, 这种帧内预测不是在时间上, 而是在空间域上进行的预测编码算法, 取得更为有效的压缩。

4.6 面向IP和无线环境。

H.264草案中包含了用于差错消除的工具, 便于压缩视频在误码、丢包多发环境中传输。为了抵御传输差错, H.264视频流中的时间同步可以通过采用帧内图像刷新来完成, 空间同步由条结构编码来支持。同时为了便于误码以后的再同步, 在一幅图像的视频数据中还提供了一定的重同步点。

结束语

H.264编解码标准作为目前最为热门的编码技术, 综合考虑了性能与编码代价, 支持它的产品众多, 而且与MPEG一样可以容易地引入帧间预测用于播出, 因而其在高清制作领域的应用前景看好。随着社会技术的不断进步, 我们相信H.264技术会越来越广泛的在各种场景中得到应用。

摘要:近年来, 随着计算机技术和数字化电视技术的高速发展, 非线性编辑被广泛应用于影视的后期制作。视频压缩技术是非线性编辑系统的关键技术之一, 目前, H.264作为一种新兴的压缩格式, 具有高压缩比和低带宽需求, 因此被广泛的应用到非线性编辑系统中, 并日趋重要。

注:本文为网友上传,旨在传播知识,不代表本站观点,与本站立场无关。若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:66553826@qq.com

上一篇:高清解码器 下一篇:编码和解码理论