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;




猜你喜欢

转载自blog.csdn.net/bgk112358/article/details/79762019