阅读:6731回复:11
如何利用directdraw Overlay方式实现多路视频显示?
各位大侠:
我想利用directdraw的overlay方式实现多路视频的显示数据格式是YUV422,请问怎样创建overlay表面,我是这样做的: 1.利用DirectdrawCreate()创建多个DirectDraw对象; 2.给每一个Directdraw 对象创建一个Primary surface; 以上两个步骤都成功了 3.创建overlay表面,创建第一个overlay表面是成功的,当为第二个 DirectDraw 对象创建Overlay表面时不成功。请问怎样才能为每一个Directdraw对象都创建一个overlay表面呢? |
|
沙发#
发布于:2003-08-11 03:02
支持Overlay的个数由硬件决定
|
|
板凳#
发布于:2003-08-12 13:07
OVERLAY平面最好只建一个。这是目前显卡最低的要求。
要多路显示,利用当前显卡高性能(现在的显卡都支持),在显卡内建立缓冲区。利用显卡的自身来进行缩放。(现在至少16MB,可以分配二十个以上CIF格式BUFFER。呵呵,并且它的特点与SYSTEM MEMORY不一样(很方便,本来就是为视频准备的嘛),显示性能会得到很大提升)。 |
|
|
地板#
发布于:2003-08-12 15:19
怎样建立显卡的缓冲区实现缩放,能否说的更详细一点儿?thank you!!!!
|
|
地下室#
发布于:2003-08-15 09:11
这个问题我也很关心,愿意另外开贴给分。
to Sunbeam: 缓冲区多个,但是overlay只有一个也不成啊。你的方案能写的具体一点吗?比如,已经在显卡上开了四个缓冲区,凭且每个缓冲区中已经有了要显示的视频图像(四个不同的视频)。而显卡只有一个overlay,这是应该怎样做? |
|
|
5楼#
发布于:2003-08-20 07:53
偶也想知道!
|
|
6楼#
发布于:2003-08-20 12:14
你可以按照这个步骤做: 1。创建一个overlay表面。 2。 调用overlay lock,得到虚拟内存地址, 将这个地址传给驱动程序,得到物理地址。 unlock. 3。编程硬件,让硬件将数据直接写道对应的物理地址里边去。 4。如果除了视频,你还要显示一些菜单,logo,状态之类的, 请使用color key. 这样子做的问题: 1. 图像会出现\"撕裂\". 2. 当overlay表面lost的时候,会出错。 3. 当改变大小等操作时,速度比较慢。 4. 有些显卡和采集芯片不支持,或者要求比较苛刻。 5. 你要写一个驱动程序,一个应用程序,驱动和应用要很好的 配合,调试的时候很容易死机。 优点: 1. 占用cpu很少,为0. 附注: Directx 9出来了,overlay技术已经快要被淘汰了。 最好不要使用。;) |
|
7楼#
发布于:2003-08-20 12:44
hi,
ppl,你说的方法只能实现一路的视频显示,如果要显示多路视频的话一个overlay表面怕是不行了吧,硬件只能支持创建一个overlay表面,如果在一个overlay表面实现多路,怎样对每一路都实现缩放呢? 另外,你说利用directx9.0实现,请问怎样实现能不能说的详细一点儿?thank you very much |
|
8楼#
发布于:2003-08-26 02:49
if you thread the overlay surface as a surface then you will be able to find a way to handle more than one video.
that say you create an overlay surface: 640x480; {0,0,639,479} then you have four 320x240 video data:a,b,c,d each is {0,0,319,239} after you got the overlay surface buffer pointer then you copy the video a data to overlay surface {0,0,319,239} copy the video b data to overlay surface {0,320,639,239} copy the video c data to overlay surface {240,0,319,479} copy the video d data to overlay surface {240,320,639,479} then update this overlay you will got four video. the other way you can do is: create four offscreen surface for each video; copy each video data on that surface; blt each offscreen surface onto overlay surface; update overlay surface; this way is more flexible and easy to use. [编辑 - 8/26/03 by hong] [编辑 - 8/26/03 by hong] |
|
9楼#
发布于:2003-08-26 09:06
hi,hong
谢谢你提供的方法,这样能实现任意一路的缩放吗?先前就是用的这种方法,但是没有实现任意一路的缩放,所以最后就放弃了,改用Blt: 我以前的做法是: 1.CreateDirectDraw Object; 2.CreatePrimarySurface; 3.CreateOverlaySurface; 4.CreateOffScreenSurface: 5.Copy yuv422 data to offScreen Surface; 6.blt offscreensurface to overlaysurface;在这一步根目标矩形和源矩形的大小不同实现缩放; 7.UpdateOverlay; 结果得到的图像形状和颜色都不对,图像花花的看不出原来的模样,不知什么地方不对,请hong多多指教? |
|
10楼#
发布于:2003-08-26 09:38
多谢hong的回答,我另外开贴给分。
顺便说说,我在Direct3D的例子中看到了一个有趣的东西。它将一个AVI文件中的视频图像作为纹理贴在一个立方体上,效果还不错。我在想是不是能将视频数据放入纹理(texture)surface,再显示出来?它好像没有数量的限制。 |
|
|
11楼#
发布于:2004-06-08 18:00
好傥!
|
|