iMX6 应用叠加--OVERLAY

两个应用的叠加可以使用overlay的方式

本文和开机动画一文大部分概念相同,只是用途不同做不同的修改,本质都是对overlay的操作

在imx6qd中,发fb1是fb0的overlay,fb3是fb2的overlay
在最初开机的时候,fb1并不是fb0的overlay此时对fb1的操作不会有显示

使用overlay可以通过如下两个示例打开,关闭overlay还找到方法,目前的做法是直接设置为透明或者直接应用到别的场景,比如将fb1的内容通过HDMI输出

可到freescale community找如下俩个代码例子,开启alpha和colorkey之旅

用例

colorkey on:      ./alpha_test colorkey_on <colorkey value>     //colorkey value, such as 0xFF0000 for red

colorkey off:      ./alpha_test colorkey_off

global alpha:     ./alpha_test alpha_global <alpha value>          //alpha value, such as 0x80

local alpha:      ./alpha_test alpha_local         //alpha effect is accordant with alpha buffer set in step 2

alpha in pixel:  ./alpha_test alpha_pixel         //alpha effect is accordant with alpha value in pixel set in step 2

alpha off:         ./alpha_test alpha_off

当执行fb_setup的时候就打开了overlay

主要操作是

    struct mxcfb_gbl_alpha gbl_alpha;
    struct mxcfb_loc_alpha loc_alpha;

    gbl_alpha.enable = 1;

    loc_alpha.enable = 1;

但将enable置为0,overlay会响应,但关闭似乎不完全

对fb1作半透明的设置,主要是通过local_alpha的phy_addr0,phy_addr1进行设置

如需做不规则的半透设置,算法比较困难时,可以用PS画出不规则的半透图,格式保存为8位灰度图,如下格式,保存为bmp格式


因为local_alpha的phy_addr0,phy_addr1物理地址一个像素的透明设置为8位

所以将8位灰度图每一位应用到物理地址上(要求8位灰度图分辨率和屏幕分辨率相同,如特殊需要也可以应用到局部并使用算法配合)

cat /unit_tests/wall-1024x768-565.rgb > /dev/fb0(imx6-sabresd开发板的自带测试程序)

./hint360_test(一个写到fb1的的应用,如图中为色条)

./alpha_test alpha_local

得到如下效果


对Qt环境变量的设置可以参考Qt官方文档

http://doc.qt.io/qt-5/embedded-linux.html

实现两个Qt app在不同的fb显示,需要如下操作

1、设置Qt环境变量使Qt在fb0运行

        export QT_QPA_EGLFS_FB=linuxfb:fb=/dev/fb0

        ./myTest -platform eglfs &

2、设置Qt环境变量使Qt在fb1运行

        export QT_QPA_EGLFS_FB=linuxfb:fb=/dev/fb1

3、还要关闭垂直同步,否则会有闪烁,原因不明,看实际情况而定

        export QT_QPA_EGLFS_SWAPINTERVAL=0

4、打开overlay;对于当前程序,接下来三个步骤要按顺序执行

        ./hint360_test

5、在fb1上运行Qt程序

        ./haxc -platform eglfs &

6、使能local_alpha,开启半透效果

        ./alpha_test alpha_local

得到如下效果





第二篇     overlay与video融合

按照以上的方法与video融合会出现视频闪烁现象

原因是以上程序只用了alpha_local_phy_addr0

alpha_local_phy_addr0和alpha_local_phy_addr1都做相同的设置可以解决这个问题

如下video代码会对分辨路宽和高做4和8求余数

融合时需要设置分辨率宽高为8的倍数,否则图像overlay会变形(和开机动画不能有奇数分辨率类似,看起来像照片的摩尔纹)

其中遇到的问题是设置overlay不能放在video代码中,否则会遇到概率性打开失败或打开成功


对于imx6平台,在fsl-L3.14.28_1.0.0-bsp和fsl-4.1.15_2.0.0-bsp之间,显示是不一样的位深不同

在使用时注意fb格式的区别

    vinfo.bits_per_pixel = 32;
    vinfo.activate |= FB_ACTIVATE_FORCE;

    vinfo.nonstd = v4l2_fourcc('A', 'B', 'G', 'R');
    vinfo.red.offset = 24;
    vinfo.red.length = 8;
    vinfo.green.offset = 16;
    vinfo.green.length = 8;
    vinfo.blue.offset = 8;
    vinfo.blue.length = 8;
    vinfo.transp.offset = 0;

    vinfo.transp.length = 8;

------------------------------------------------------------------------------

    vinfo.bits_per_pixel = 16;
    vinfo.activate |= FB_ACTIVATE_FORCE;
    vinfo.nonstd = V4L2_PIX_FMT_RGB565;
    vinfo.red.offset = 11;
    vinfo.red.length = 5;
    vinfo.green.offset = 5;
    vinfo.green.length = 6;
    vinfo.blue.offset = 0;
    vinfo.blue.length = 5;
    vinfo.transp.offset = 0;
    vinfo.transp.length = 8;




  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值