LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 5916|回复: 27

今天把yuv的视频数据通过directfb显示出来了,一些心得和疑惑

[复制链接]
发表于 2007-6-28 20:09:17 | 显示全部楼层 |阅读模式
yuv的的数据是通过视频压缩卡的的sdk获取,能够得到各通道的预览流的地址和大小。

directfb下我是这样做的:
###################################################
首先初始化,建立一个primary surface。

然后为每个通道建立预览的chan_surface,建立该surface时,描述子(dsc)很重要,要设定width,height,设定pixelformat为YV12,其中重要的是dsc.cap,
设为“DSCAPS_VIDEOONLY”,显示时巨卡,我用的是vesafb驱动;设定“DSCAPS_DOUBLE”时,无法显示图像,显示的是绿屏;而且一定要设定”DSCAPS_STATIC_ALLOC“,否则无法显示出图像,有时会收到报错信号(signal:invalid address)。

具体显示是这样做的:
chan_surface->lock得到该surface的数据缓冲的指针,然后把yuv的数据拷贝至该surface中,然后unlock此surface,然后blit至primary surface。
#####################################################

以上是我的做法,但是我觉得似乎不够地道,应该要用到displaylay和硬件加速的功能才行,另外如果我还要显示自制的gui控件的话,比如说一个图形化的button,选中和不选中是两副不同的图片,如何和视频surface一起显示呢?blit至primary surface时需要同步吗?似乎这个涉及到gui设计的范畴,很多疑惑。
请大家来说说吧,希望有前辈能指点一二~~~
发表于 2007-6-29 09:02:04 | 显示全部楼层
vesafb的驱动没有硬件加速功能,所以不能双缓冲,也不支持垂直同步.
不要用自制的控件,lite库已经提供了很好的控件,你说的需求也能满足,用它就行了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-29 10:09:03 | 显示全部楼层
谢谢realtang,你说的lite库是指minigui-lite吗?
#################################################
刚才用google.cn查,都是minigui-lite
后来用google.com查,才知道是LiTE
回复 支持 反对

使用道具 举报

发表于 2007-6-29 10:42:24 | 显示全部楼层
搞我们这行的,获取专业知识,搜索引擎最好别用baidu.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-29 13:35:18 | 显示全部楼层
又有问题了,昨天我只开启一个通道的预览,没问题;今天开启多个通道显示,使用primary->Blit各通道surface时,图像闪烁的很厉害,有什么办法吗?

“vesafb的驱动没有硬件加速功能,所以不能双缓冲,也不支持垂直同步.”
好像不对,因为DFBTutorials中的simple例子,其中primary就是设置了FLPPING,使用了双缓冲,能够正常执行啊!

对于Toolkit和视频显示还是有不明白的地方,LiteOpen中初始化了dfb,创建了primary surface,这些被LiTE隐藏在了背后,我的理解是要显示出来只能通过primary surface,而这个被LiTE封装在了后头,用户只能调用Lite的接口,那视频显示如何实现呢?
回复 支持 反对

使用道具 举报

发表于 2007-6-29 14:51:32 | 显示全部楼层
在硬件驱动不支持的情况下,dfb自动fallback到软件模拟。所以代码是可以执行的,只不过是软件模拟的效果。
lite的gui有提供获取dfb接口的方法,自己留意一下,包括获取主表面。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-29 17:06:44 | 显示全部楼层
我会注意看一下的。

另外,下午看了一下lite的实现,lite初始化dfb,然后得到primary的dfbdisplaylayer--lite_layer,用户调用lite_new_window,在参数layer为NULL的情况下使用lite_layer创建dfb window,由dfb window得到dfb surface,其他的lite控件都是lite window的child,这些控件的surface都是由lite window的surface调用dfb的GetSubSurface得到的。show的时候就Blit。

主surface应该是唯一的,但是我没有见到"主surface",难道由主displaylayer创建的window就能自动显示出来吗?不需要Blit这个window的surface到主surface?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-3 16:57:53 | 显示全部楼层

尝试了三种方法显示

1.
dfb建立primary surface,并为每个通道建立pixelformat为yv12的小surface,在各通道的显示线程中lock,copy data,unlock各自的小surface,然后blit到primary surface。单通道可行,多通道会闪烁,图像卡。

2.
dfb建立primary surface,然后建立一个yv12的大surface,从这个surface中为每个通道得到一个小的subsurface,在各通道的显示线程中,lock,copy data,unlock各自的subsurface。在主线程中把这个大的surface blit到primary surface,此方法显示花屏,没死机。

3
从dfb得到primary displaylayer,在此layer建立8个通道的window,pixelformat为yv12,从各window中得到对应的surface,在各通道显示线程中,lock,copy data,unlock,blit自己对应的surface,flip自己对应的surface。在单通道下,显示花屏,没死机;在多通道下,显示了4个花屏的窗口后,死机

btw:一共有8个通道。
回复 支持 反对

使用道具 举报

发表于 2007-7-3 17:25:26 | 显示全部楼层
这种应用呢,最好采集卡设备支持多通道的overlay,不然完全让dfb软件模拟的话,基本上,很难。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-3 20:44:43 | 显示全部楼层
采集卡支持多通道overlay,是什么意思呢?
我用的hikvision的视频压缩卡,他们的demo是x11下的,用SDL做预览显示的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表