硬件加速播放的工作原理

互联网 | 编辑: 2005-08-05 00:00:00 返回原文

DXVA是视频硬件加速的统称,不仅仅是视频数据解码(包括H261,MPEG1,MPEG2,H263,MPEG4), 还有Alpha blending, Picture resampling等。但对于播放时CPU利用率影响最大的,则是视频解码,尤其是HDTV的解码。

硬件加速播放的工作原理1

    DXVA是视频硬件加速的统称,不仅仅是视频数据解码(包括H261,MPEG1,MPEG2,H263,MPEG4), 还有Alpha blending, Picture resampling等。但对于播放时CPU利用率影响最大的,则是视频解码,尤其是HDTV的解码。对于低端系统来说,让GPU来负责硬件解码是不二之选。但使用硬件解码,在整个功能上也受到很多限制,尤其是解压以后的视频数据的后期处理(如deinterlace,锐化,去马赛克). 因此对于追求画质的烧友,宁可放弃硬件解码,当然代价是需要升级整个系统。稍后再谈。


    硬件解码生效的时候,系统是怎么运转的呢?现在我们有两个处理器,CPU和GPU。他们通过PCI/AGP/PCIE总线交换数据。
    1。CPU从文件系统里读出原始数据(DirectSHow的源滤镜),分离出压缩的视频数据(分离器)。放在系统内存中。 GPU 发呆
    2。CPU把压缩视频数据交给GPU, 这时总线上开始忙了,压缩数据从系统内存拷贝到显卡上的显存里。
    3. CPU要求 GPU开始硬件解码,现在 CPU进入发呆期,GPU开始忙。当然CPU会定期查询一下GPU忙的怎么样了。
    4。GPU开始用自己的电路解码视频数据(已经在显存里了),解压后的数据还是放在显存里面。CPU继续发呆。
    5. 视频数据刚解码完成以后还不能立刻拿去显示,因为还需要后期处理,如deinterlace, 3:2pulldown,等等。GPU再用自己的后期处理电路来进行处理。CPU还是发呆
    6。后期处理以后的未压缩数据拿去显示到屏幕上, GPU再开始忙视频的缩放,亮度,gamma等事情。CPU还是闲
    7. GPU终于忙完了,下面的视频数据在哪里?通知CPU,GPU先歇会。 CPU又开始忙了,回到第1步。

    上面可以看到,硬件解码生效的时候,CPU真的可以很闲,但是为了让它生效,有些条件必须满足。最关键的原因是,与CPu->系统内存和GPU->显卡显存比起来,PCI、AGP、PCIE总线是龟速。PCI是133MB/S, AGP8X是2.1GB/S, PCIE16X是4GB/S, 而CPU-系统内存,GPU-显存则快若干倍。有兴趣的可以把不同时代的内存总线和AGP/PCIE总线速度进行一下对比。因为CPU和GPU互连的总线很慢,因此,视频数据(无论是解压前还是解压后)一旦交给GPU,GPU就要负责把它处理完,直到最终显示。
    如果在前面1-5步里有哪一步GPU不能做或你不让它做,视频硬件解码就不生效,CPU要负责。
    当然,你可能会问,也许CPU很慢,说不定在龟速总线上传输数据,GPU分担一部分工作,还是比全部CPU做要快呢? 也许如此,但在Directshow架构里,代表视频数据处理各环节的滤镜(分离器,解码器,后期处理,渲染器)需要协商出一个大家都接受的视频数据存储方式,如果某个滤镜说我只能在系统内存里玩,大家都得要在内存里玩,GPU和显存只好放弃。

硬件加速播放的工作原理2

    了解了这样的步骤,我们看什么时候硬件解码会失败。
    1. GPU自己没办法独立搞定解码,比如太老的显卡,显存太少,或者象GF2MX,GF4TI这种太监(MC和IDCT只支持一个)。
    2. GPU的视频后期处理太差劲,你要找其他软件来做,这个对于发烧友是很常见的情况,比如放DVD加ffdshow锐化倍线。ffdshow只能在系统内存里工作,它没办法把手伸到显卡显存上,那么硬件解码只好让位给软件解码。
    3。非常常见的一个情况,就是用vobsub加字幕。vobsub滤镜是加在解码器之后,渲染器之前的。它怎么把字幕放到图像上去? 原始图像进来,它修改原始图像,把字幕的图案画上去,再送给后面的渲染器(或者别的后期处理滤镜)。 vobsub同样只能在系统内存里工作,ok, 解码也要软件了。
vobsub不能用,那字幕要怎么加?所幸渲染器提供了混合模式,就是把几种视频数据揉在一起,这些数据可以是在系统内存中(软件解码或软件生成),也可以是在显卡显存中(硬件解码)。最大的好处是各种视频数据可以独立生成,不会互相牵制。可以硬件解压的用硬件解压,可以软件生存的用软件生存。(类似电路里串联和并联的关系)、 哪些软件呢?比如MPC, KMP, BSPlayer, 他们自带字幕引擎。而ZoomPlayer借助于vobsub生成字幕。只能用软解压。

    Media Player Classic(MPC),不要把它和暴风影音等套件混起来。MPC是一个播放器内带了一些滤镜和字幕工具,全部是Gabest这个牛人开发的Opensource软件,暴风里除了MPC以外还有一堆其他公司的滤镜,包括vobsub, 理论上可能有版权问题。vobsub虽然也是gabest开发的,但它显示字幕的工作方式和MPC里的不同。vobsub在视频数据交给渲染器之前插入字幕, MPC把视频数据和字幕分开,一起交给渲染器。 如果套件里包涵vobsub, 建议删除之,我不确定禁用vobsub的效果如何。【alban911确认,禁用vobsub没有问题】

    KMP也是一个较常用的播放器,值得主要的是,除了自带字幕引擎以外,它内部自带了一个视频后期处理引擎,如果选画质模式等,这个引擎会生效。同样道理,这个引擎只能在系统内存里玩,那么硬件解码只能放弃。必须要选择极速/高速模式,禁用这个引擎,或者在系统选项里明确禁用此引擎,才能允许硬件解码工作。

 

硬件加速播放的工作原理3

    最后回到主题,低端系统要放HDTV流畅,多半需要借助于显卡硬件解压。几个注意事项
    1. 视频格式要mpeg2,显卡GPU才能协助解压 (WMV目前没有硬件解压方案)。【注:2005年5月微软终于放出了WMV硬件解码补丁,但对显卡和系统要求颇高,且不少中低端系统上效果不明显甚至更差】
    2。显卡及驱动要支持mpeg2硬件解压。
    3。视频解码器要能把mpeg2解压工作分担给显卡
    4。视频渲染器要用overlay,不要用VMR
    5. 字幕要用播放器自带的,绝对不能用vobsub。 不用字幕最好啦。
    6. 不能用ffdshow, nvvpp等软件视频后期处理,要用显卡里自带的后期视频处理(虽然可能烂了点)。
    7。KMP必须用极速、高速模式
    8。硬件方面,最好不要用多头显示(overlay对多头显示支持不好,VMR支持好但开销大)。如果需要多头显示,再加上很多人依赖的字幕,你可能被迫使用软解压或VMR,一个相关案例在此
http://www.silu.info/read.php?tid=20851
    9. 硬件方面,PCI显卡因为是诸多设备共享PCI总线,带宽也只有133MB/S,尽可能不要用(虽然压缩视频数据流一般也就是10-20MbpS). AGP是独享且至少是266MB/S(AGP1X),但有可能的话还是应该优化一下,比如打开FastWrite, SideBandAddessing什么的,只要系统稳定。PCIE? 低端系统会有PCIE吗?

    如果你不确定现有的配置是否能够使用硬件解码,建议在调整的时候使用NVIDIA decoder, 它可以明确指示是否工作于硬件解码方式下。调整好了,你可以再改回你喜欢的硬件解码器,如sonic, cyberlink等。

    还有一点很重要的,就是强烈不建议用大杂烩似的解码器包比如暴风影音等,里面很多的滤镜会把directshow架构弄得非常复杂,如果你不确定某个滤镜的作用而安装了,可能会严重干扰你的系统。建议重新安装windows系统,然后只安装你需要的播放器和滤镜。

 

关于DXVA 硬件加速解码的框图,从DXVA 官方文档里摘出来。
我的理解:
Host指的是CPU和操作系统,Accelerators是显卡GPU。
二者通过PCI/AGP/PCIE总线交换数据。

硬件加速播放的工作原理4

    CPU把压缩视频数据(读文件->分离器)通过总线送到显卡里的显存video data buffer。这部分显存是不显示在屏幕的。CPU要求GPU去执行解码,然后GPU就会运用自己的 MC,IDCT电路开始解码,得到原始(未压缩)视频数据。由于视频数据压缩算法用到了很多帧间压缩技术,如I,B,P帧,因此显存里需要保留若干份原始数据,DXVA文档里提到至少需要4份,5个以上更好。未压缩视频数据的格式可以为YUY2。UYVY, YV12, IYUV, NV12, NV21, IMC1~IMC4等。

 

    这是摘自GPU视频处理的一幅图片,介绍的是NV4X的流程,但应该具有普遍意义。
    绿色的部分是由GPU完成的(当然是指硬件加速时候)


    关于DXVA情况的一些介绍,susanstone网友提供。

    不好意思,我没有时间翻译。大致是讲DxVA是微软和硬解压的接口。GF3好像不行。要到GF4MX420,440。然后GF4Ti又不行,要到FX系列。
What is DxVA?  
DVD or HDTV uses video compression technique called MPEG2.
It requires lots of computing power to decode MPEG2 streams to uncompressed video.
Even current fastest CPU does not have enough power to decode full resolution HDTV.
Graphics chips manufacturers integrated some function of the MPEG2 decoding algorithm in their graphics chip to aid decoding of the MPEG2 streams.
But it was proprietary architecture and it was hard to use the function for the developers of outside of the chip company.
So Microsoft Corp. made a common API that MPEG2 decoding programs can make use of the Graphics chips capability of MPEG2 decoding regardless of the graphics chips used. This driver is called DxVA(DirectX Video Acceleration).
Unfortunately not all graphics chips and/or driver combination support DxVA.
At the time of this writing ATI Radeon series and drivers are the graphics chips that support DxVA well.
Using DxVA full resolution (1920x1080) HDTV stream can be decoded 30fps/sec using less than 50% of CPU on P4 1.8GHz.

Graphics : ATI Raden7000, 7200,7500 with DDR video memory or
        ATI Radeon 8500,9000,9500,9700,9800
        nVidia MX420, 440, FX series

DXVA Support: the good news here is that ATI was heavily involved with Microsoft when it formed the DXVA standards for MPEG2 acceleration. The original Radeon supported the full feature set of what would become DxVA even before the standard was finalized. On the NVIDIA side, NVIDIA added a new video processor to their GeForce 4 MX series that is fully DXVA compliant. The GeForce 4 Ti was focoused on 3D gaming and so the silicon went to 3D piplines rather than the video processor the GF4MX had. By the GeForce FX series technology has progressed enough for NVIDIA to put the GeForce 4 MX's video processor into every one of the FX line.

(转载自思路)

返回原文

本文导航

相关阅读

每日精选

点击查看更多

首页 手机 数码相机 笔记本 游戏 DIY硬件 硬件外设 办公中心 数字家电 平板电脑