qvfb

1 关于QVFB

        Qvfb是为qtopia做的一个虚拟frambuffer的应用程序,它的最终目的就是把qtopia应用程序运行的的结果显示在qvfb上(实际中是要通过linux的frambuffer驱动显示在lcd屏上的),并提供键盘、鼠标的外设仿真。从而方便研发阶段,用户在pc端就可以完成qtopia的调试工作,极大的提高了工作效率。
 

2 QVFB概述

       Qvfb本身其实也是一个应用程序,qtopia也是一个应用程序,二者通过既定协议完成通信,如下图示。
更直观一点,如下图示。
Qpe和qvfb之间的通讯是基于既定的协议进行的,qpe和qvfb独立运行,它们处于不同的进程,它们之间以“共享内存”的方式完成通讯。
 

3 qpe端接口

       Qtopia中server 端启动时,会调用QVFbScreen::connect()函数来连接到屏幕,这里qpe会创建一块共享内存,模拟framebuffer,用于图象的输出,针对键盘鼠标分别创建两个文件,其名字由两个宏来决定,为QT_VFB_MOUSE_PIPE和QT_VFB_KEYBOARD_PIPE。
  • 关于图形绘制,qpe是通过QSCreen的派生类QVFbScreen来实现的,具体如下。
QSCreen定义了接口exposeRegion和blit,这两个函数会完成具体的绘制操作,不管是虚拟framebuffer还是真正的framebuffer,qtopia会将用于绘制的显示缓存映射到data变量,这样绘制操作就变成向data写数据了。
  • 关于鼠标
Qtopia通过QVFbMouseHandler来完成,其构造函数中会打开约定的文件,键盘数据的获取就变成了文件的读取。
  • 关于键盘
Qtopia通过QVFbKeyboardHandler来实现,其构造函数中会打开约定的文件,键盘数据的获取就变成了文件的读取。
 

4 qvfb端介绍

       Qvfb实际上是一个用qt实现的完整的应用程序,其架构层次图如下图示。
      
分别作如下阐述

4.1层次划分

    • QVFb是主控件,可以理解为qvfb应用的主窗口
    • Skin用来管理皮肤,QVFbView用于管理qpe绘制的窗口。
    • QVFb、Skin、QVFbView三者属于应用框架层,管理应用程序的架构。
    • QVFbViewProtocol是协议层,它是一个虚类,具体实现了两个类QMMapViewProtocol和QShMemViewProtocol,分别代表内存映射和共享内存,是两种实现linux上进程间通讯的方式,默认使用共享内存方式。协议层具体实现待绘制数据的获取以及屏幕的更新。
      • 架构和实现分离,层次清晰。

4.2图形绘制

讲述屏幕图象绘制的流程
    • QShMemViewProtocol的构造函数
    创建共享内存,影射到hdr指针,分配显示区域的内存空间,影射到dataCache,建立timer
    mRefreshTimer = new QTimer( this );
    connect( mRefreshTimer, SIGNAL(timeout()), this, SLOT(flushChanges()) );
    函数flushChanges会定期执行,它就是qvfb窗口绘制的源头。
    • QVFbView的构造函数
    mView = new QShMemViewProtocol(id, QSize(_w, _h), d, this);
    connect(mView, SIGNAL(displayDataChanged(const QRect &)),
            SLOT(refreshDisplay(const QRect &)));
    将QShMemViewProtocol中的信号displayDataChanged绑定到QVFbView的槽函数refreshDisplay。
    • 看看flushChanges函数的实现
void QShMemViewProtocol::flushChanges()
{
    // based of dirty rect, copy changes from hdr to hdrcopy
    QRect r;
    {
        DisplayLock();
        if (hdr->dirty) {
            r = hdr->update;
            hdr->dirty = false;
            hdr->update = QRect();
            /* copy the memory area */
            /* for now, be inefficient. */
            memcpy(dataCache, ((char *)hdr) + hdr->dataoffset, displaySize);
        }
    }
    emit displayDataChanged(r);
}
可以看到该函数作两件事情,一是从共享内存中copy数据到dataChche,二是发出displayDataChanged信号。
    • 看看refreshDisplay函数的实现
void QVFbView::refreshDisplay(const QRect &r)
{
    if ( animation ) {
           if ( r.isEmpty() ) {
              animation->appendBlankFrame();
           } else {
              int l;
              QImage img = getBuffer( r, l );
              animation->appendFrame(img,QPoint(r.x(),r.y()));
           }
    }
    if ( !r.isNull() )
       repaint();
}
       该函数最终会触发paintEvent来完成绘制,绘制过程会通过协议层(也就是dataCache)来获取数据,最终绘制到窗口上。
 

4.3 键盘鼠标

  • 关于skin
    Skin直接受鼠标事件,由mousePressEvent、mouseReleaseEvent负责。 最终会调用协议层QShMemViewProtocol中的QVFbMousePipe去发送鼠标事件,最终会写到协议规定的文件中去,qpe端通过读取该文件获取鼠标事件。
  • 关于QVFbView
    会接受鼠标、键盘事件,由mousePressEvent、mouseReleaseEvent、keyPressEvent、 keyReleaseEvent。最终也是调用协议层QShMemViewProtocol中的QVFbMousePipe和 QVFbKeyPipeProtocol去发送鼠标、键盘事件,也就是写到既定的文件中,最终由qpe通过读取文件来获取鼠标、键盘事件。
 

5 关于qvfb的扩展

    扩展qvfb,使其能够支持audio和video,从而方便在pc端调试多媒体方面的模块,也可以脱离开发板,也提高开发效率。 从qpe和qvfb配合工作的现有架构上看,上述工作的可行性是有的。

5.1 auido模块的添加

在现有的基础上添加audio模块,放到协议层中即可。
并添加QVFbAudioPipe *audioQShMemViewProtocol中去,定义一个audio文件存放音频数据,qpe端写入,qvfb端读出并写到声卡中去。
       至于如何实现音频播放,最简单的做法是在现有基础上添加。
void QShMemViewProtocol::flushChanges()函数是图象的绘制起点,可以在这里添加audio数据的获取,然后在void QVFbView::refreshDisplay(const QRect &r)里写入声卡,完成音频播放。
       当然qpe端音频相关的输出,要写入既定文件了,这里要实现一层替代als音频访问的接口。
 

5.2 video模块的添加

现有qvfb已经实现了绘制工作,要支持多媒体模块的pc端调试,qvfb这边不需要象audio那样添加新模块。 Qpe端要作些修改,添加一层v4l2的接口层,把其影射到既定的文件中去,qvfb端照常显示。
 

5.3 关于音视频同步

       音视频同步是多媒体应用层去负责的事情,qvfb端只要保证音视频数据的及时输出就可以了。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值