主题 : 请问怎么把ui层调到video层之上? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 92179
精华: 0
发帖: 21
金钱: 105 两
威望: 21 点
综合积分: 42 分
注册时间: 2013-05-24
最后登录: 2014-04-03
楼主  发表于: 2013-07-29 17:57

 请问怎么把ui层调到video层之上?

我们在tiny210开发板上实现一款产品,程序中使用QT来写界面ui,用overlay(/dev/video1)来显示视频。使用开发板处自带的linux 3.0.8 内核。

现在问题是:
   当视频打开和显示后,视频层覆盖了QT的显示。 而我们期望的效果是,QT界面在video层之上,这样就可以让视频与QT界面结合显示了。
那怎么修改什么地方才能让QT层不被video遮住呢?

比较急的问题,有谁能告知一下。谢谢!

如果有高手知道这个问题的解决办法,可以指教或技术交流一下。 QQ: 1926583112
级别: 新手上路
UID: 93759
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2013-06-30
最后登录: 2014-03-26
1楼  发表于: 2013-07-30 09:58
不太熟悉,fimd 的5个window,应该对应5个/dev/videoX吧
看了代码 貌似是
video0对应window 2,
video1对应window 3,
video2对应window 4,
video3对应window 0,
video4对应window 1

而window的上下次序是window 4 在最上,window 0 在最下
qt用的应该是video0,也就是window 2
视频用video1的话就是window 3, 在window 2 上面了
不过我觉得这个好像无所谓,只要在上面的那个window把下面那个window需要显示的部分区域设为透明就行了吧

CONFIG_FB_S3C_DEFAULT_WINDOW=2
static struct s3c_platform_fb mini210_fb_data __initdata = {
    .hw_ver            = 0x62,
    .clk_name       = "sclk_fimd",
    .nr_wins        = 5,
    .default_win    = CONFIG_FB_S3C_DEFAULT_WINDOW,
    .swap            = FB_SWAP_WORD | FB_SWAP_HWORD,

    .cfg_gpio        = lcd_cfg_gpio,
    .backlight_on    = lcd_backlight_on,
    .backlight_onoff= lcd_backlight_off,
    .reset_lcd        = lcd_reset_lcd,
};

static int s3cfb_register_framebuffer(struct s3cfb_global *ctrl)
{
    struct s3c_platform_fb *pdata = to_fb_plat(ctrl->dev);
    int ret, i, j;

    for (i = pdata->default_win;
        i < pdata->nr_wins + pdata->default_win; i++) {
            j = i % pdata->nr_wins;
            ret = register_framebuffer(ctrl->fb[j]);
            if (ret) {
                dev_err(ctrl->dev, "failed to register "
                        "framebuffer device\n");
                ret = -EINVAL;
                goto err_register_fb;
            }
#ifndef CONFIG_FRAMEBUFFER_CONSOLE
            if (j == pdata->default_win) {
                s3cfb_check_var(&ctrl->fb[j]->var, ctrl->fb[j]);
                s3cfb_set_par(ctrl->fb[j]);
                s3cfb_draw_logo(ctrl->fb[j]);
            }
#endif
    }

    return 0;

err_register_fb:
    while (--i >= pdata->default_win) {
        j = i % pdata->nr_wins;
        unregister_framebuffer(ctrl->fb[j]);
    }
    return ret;
}
级别: 新手上路
UID: 92179
精华: 0
发帖: 21
金钱: 105 两
威望: 21 点
综合积分: 42 分
注册时间: 2013-05-24
最后登录: 2014-04-03
2楼  发表于: 2013-07-30 11:40
我的理解是
video0 (CAMIF0)  恒为 win0
video1(CAMIF1)   恒为 win1
video2 (CAMIF2)  恒为 win2

而fb0 ~ fb4则是你说的
fb0 ~ win2 (default window)
fb1 ~ win3
fb2 ~ win4
fb3 ~ win0
fb4 ~ win1

我再试一下。

像你说的,现在video在上面,把video层设置透明即可。不过怎么设置透明呢?
int v4l2_overlay_set_colorkey(int fd, int enable, int colorkey);
int v4l2_overlay_set_global_alpha(int fd, int enable, int alpha);
我试了set_global_alpha(fd, 1, 0)没有用。

而且这个video层在stream off后不会被关闭,真是郁闷。
级别: 新手上路
UID: 92179
精华: 0
发帖: 21
金钱: 105 两
威望: 21 点
综合积分: 42 分
注册时间: 2013-05-24
最后登录: 2014-04-03
3楼  发表于: 2013-07-30 11:43
我好像试过把default window设置为4,好像不行,再试一下吧。

video0 -> win4
video1 -> win0
video2 -> win1
video3 -> win2
video4 -> win3

是这样子吗? -- 不知道video0 和fb0是不是一一对应的。

//////////////////////////////////////////////////////////////////
default = 4 , number of overlay = 0 (或3) 都不行
反正没有遇到成功的,video总是会盖住qt的界面
[ 此帖被iamshaofa在2013-07-30 12:21重新编辑 ]
级别: 新手上路
UID: 93759
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2013-06-30
最后登录: 2014-03-26
4楼  发表于: 2013-07-30 14:19
引用第2楼iamshaofa于2013-07-30 11:40发表的  :
我的理解是
video0 (CAMIF0)  恒为 win0
video1(CAMIF1)   恒为 win1
video2 (CAMIF2)  恒为 win2

.......

你这个说法好像是对的,我刚才没弄明白友善的内核里的video0,1,2原来是fimc设备。长知识了。
级别: 新手上路
UID: 93759
精华: 0
发帖: 20
金钱: 100 两
威望: 20 点
综合积分: 40 分
注册时间: 2013-06-30
最后登录: 2014-03-26
5楼  发表于: 2013-08-01 00:57
我猜测会不会是QT把像素的alpha全设为0了,那样的话如果fb0下面的几个window都没启用时,它是不透明的,因为alpha blend是和下层的窗口进行混合,下层的窗口没启用的话,alpha值大概会被忽略,所以平常的显示是正常的。但当下层有窗口启用时,因为fb0每个像素的alpha全是0,就成透明了。
可以hexdump -C /dev/fb0 验证下,其中的alpha是否是0