使用D3D渲染YUV视频数据

摘要:
OVERLAY技术是一种在视频卡上实现的基于硬件的技术,用于解决在PC上播放VCD的问题。还需要完成从YUV到RGB的颜色空间转换。颜色空间转换被传送到视频卡以实现。OVERLAY技术属于视频卡上的2D模块,这意味着所有渲染算法都内置在视频卡中。当前的视频卡使用可编程渲染管道。视频卡已广泛应用于图像处理、视频处理、科学计算等领域。它是将视频数据填充到二维纹理中。

源代码下载

在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渲染管线中去渲染。

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

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

       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类似。

      对于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/5807694

免责声明:文章转载自《使用D3D渲染YUV视频数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇STM32 ADC基础与多通道采样鲜为人知的maven标签解说下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[笔记]VGA 接口电阻网络阻抗

一、ADV7123 DA视频转换器(CMOS, 330MHz Triple 10-Bit high Speed Video DAC)         ADV7123由完全独立的三个10位告诉D/A转换器组成,RGB视频数据分别从R9~R0、G9~G0、B9~B0输入,在时钟CLOCK的上升沿锁存到数据寄存器中,然后经告诉D/A转换器转换成模拟信号。三个独...

jQ效果:jQuery和css自定义video播放控件

下面介绍一下通过jquery和css自定义video播放控件。 Html5 Video是现在html5最流行的功能之一,得到了大多数最新版本的浏览器支持.包括IE9,也是如此.不同的浏览器提供了不同的原生态浏览器视频空间.我们制作自定义视频控件为了在所有的浏览器中有一个相同的Html5视频控件而不受默认视频控件的控制. 实际上,自定义视频控件并不困难.本...

Direct3D 11入门级知识介绍

  本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7707628 作者:毛星云    邮箱: happylifemxy@qq.com    期待着与志同道合的朋友们相互交流   上一节里我们介绍了在迈入DirectX 11的学习旅程之后第一个...

songshu-video-uniapp-YYC松鼠短视频前端源码-开源--优雅草科技官方发布

songshu-video-uniapp-YYC松鼠短视频前端源码-开源–优雅草科技官方发布 介绍 songshu-video-uniapp-YYC松鼠短视频前端源码-开源–优雅草科技官方发布----开源代码仅供学习研究参考禁止用于商业用途,前端部分将持续更新,此做法是为了杜绝网络上部分不怀好意的网友和部分同行拿着我们的开源版各种胡乱改并且发布宣称官方最...

黑苹果10.12 sierra 安装笔记

先上成果 再说感慨 有钱还是直接上mbp或者imac吧,比较折腾。 当然不想太折腾又想装黑苹果,也是可以滴。去Tonymacx86根据配置单攒机(保证最大兼容性),照着它的教程一步步做,还是很简单的,我是早就买台式机了,所以不能照那个来 软硬件准备 台式机 处理器 英特尔 i7-4790K @ 4.00GHz 四核 主板 华硕 Z87-K 显卡 英特尔...

[小技巧]window10删除此电脑左侧栏中的非磁盘文件夹

一、问题说明    在初始的 此电脑 中,有置顶的文件夹栏,包含图片、视频、下载等多个文件夹 二、解决方式    通过 WIN+R 键,输入 regedit 后确认,打开注册表。定位到  HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerFolderDescriptions  中...