使用D3D渲染YUV视频数据

   源代码下载 算法

 

 

     在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,通常是采用DIRECTDRAW,使用显卡的OVERLAY表面显示。OVERLAY技术主要是为了解决在PC上播放VCD而在显卡上实现的一个基于硬件的技术。OVERLAY的出现,很好的解决了在PC上播放VCD所遇到的困难。早期PC处理能力有限,播放VCD时,不但要作视频解码工做,还须要作YUV到RGB的颜色空间转换,软件实现很是耗费资源,因而,YUV OVERLAY表面出现了,颜色空间转换被转移到显卡上去实现,显卡作这些工做是具备天生优点的。编程

 

      随着显卡技术的发展,OVERLAY的局限性也愈来愈充分的暴露出来。通常显卡只支持一个OVERLAY表面,用OVERLAY实现多画面比较困难,视频和文本的叠加也有困难,固然,要实现一些特效就更难了。更重要的是,OVERLAY技术在显卡上是属于2D模块,在高品质3D游戏的推进下,如今的显卡的功能和性能,主要体如今3D模块上,厂商投入最大的,也是在GPU的3D模块上。OVERLAY技术没法利用和发挥显卡GPU的3D性能。微软早就中止了对DIRECTDRAW的支持,鼓励开发人员转向DIRECT3D,因此OVERLAY也没法使用新的API。架构

 

      早期的3D渲染,主要是使用CPU作的,显卡作的较少。后来,显卡GPU的处理能力愈来愈强,承担的3D渲染功能也愈来愈多,开始使用的是固定渲染管线,也就是说全部的渲染算法都是显卡内置的,咱们只能组合使用这些算法。如今的显卡采用的都是可编程的渲染管线,也就是说咱们能够编写本身的渲染算法,下载到显卡上去执行,替换固定渲染管线算法,灵活性大大提升。随着GPU效能的提升,显卡在图像处理、视频处理、科学计算等领域获得了普遍的应用。性能

 

      使用D3D渲染YUV视频,能够采用D3D SURFACE渲染,也能够采用D3D纹理来渲染。SURFACE渲染比较简单,但功能限制较多,下面咱们只讨论D3D纹理视频渲染。纹理视频渲染,就是把视频数据填充到二维纹理中,结合咱们本身写的一段像素Shader代码,送到显卡的GPU渲染管线中去渲染。测试

 

      如下假设读者了解所讨论的视频格式细节。spa

 

       对于YV12视频数据,能够建立三个纹理,分别填充Y、U、V视频数据。对于缺失的U、V采样点,咱们能够利用显卡内置的双线性滤波算法插值出来,这是简单的方法。固然,也能够采用更好的图像插值算法,以达到更高的图像质量,这须要咱们经过Shader实现咱们的插值算法,而后分别把U、V渲染到纹理,实现更好的插值。相对与双线性滤波,缺点是复杂更度高,效率低。U、V插值后,视频数据从YUV420转换为YUV444,而后作颜色空间转换,从YUV444转换为RGB32,转换的Shader代码很简单,就是一个矩阵乘法运算。对于I420数据,就是把YV12数据的U、V数据在内存中的位置对调,其余处理和YV12同样。.net

 

       NV12格式,Y平面和YV12同样,UV部分是打包格式。因此UV部分须要单独处理,先把UV部分填充到一个纹理中,而后对UV纹理作两次简单的渲染到纹理,从而把U、V数据分别渲染到两个纹理。通过这样的处理,咱们获得的数据就和YV12的数据同样了,接下来的处理就能够参照YV12的处理流程和方法了。视频

 

      对于打包格式的数据YUY2,渲染时须要插值出缺失的U、V采样。YUY2在只在奇数像素上缺失U、V采样,这样处理的时候须要区分奇偶像素,对于偶数像素,不须要作U、V插值,直接作颜色空间转换。对于奇数像素,须要利用相邻的U、V采样作插值,能够采用Catmull-Rom插值算法或者线性插值算法。插值后,就能够作颜色空间转换。UYVY的作法和YUY2相似。blog

 

      对于RGB格式,我所使用的NVIDIA GeForce 9800 GT显卡支持RGB32,RGB555,RGB565,不支持RGB24。因此对于RGB24,须要在Shader代码中分别取出R、G、B,再组成RGB32输出便可。RGB32,RGB555,RGB565不须要额外处理,能够直接渲染。游戏

 

       对于平面文本叠加,采用了微软提供的CD3DFont类,但这个类不支持中文,我在这个类的基础上作了一些修改,实现了一个支持中文的文本叠加类。这两个类互相配合,能够高效地实现平面文本叠加。

 

       以上所讨论的内容,均使用Direct3D9.0c进行了验证测试。对OpenGL了解很少,但我想这些方法对于OpenGL应该一样适用,毕竟这两个3D架构在PC上实现的功能是相近的。

 

      使用3D渲染平面视频,能够实现多种特效,像多画面、画中画、文本叠加、缩放,都很容易实现,性能也很好。若是结合其余3D技术,还能够作出很炫很酷的特效,就看咱们的想象力了。

 

from:http://blog.csdn.net/dengzikun/article/details/5824874

相关文章
相关标签/搜索