由于自己是做手机软件的,所以也很想知道别的手机是怎么做的。知己知彼,百战不殆嘛。可惜手里缺乏足够的技术资料。幸好身边有一台多普达828+(系统为Windows Mobile Pocket PC Phone 2003第二版)的机器,我可以拿来好好分析一下。没有源代码,咋分析呢?亲身使用使用嘛,真正的程序员从软件操作的过程中就可以分析出这个软件大概是如何编写的。

使用了一段时间,不得不说,Pocket PC的功能的确强大。由于和桌面PC很强的关联性,在上面编程C主要利用Windows的API,所以开发程序十分方便。这不,我还可以在上面玩《帝国时代》呢。呵呵,这个游戏是PC版的一个精良的移植版,看了一下游戏的Credits,PPC版移植的程序员也就一个人,所以说,PPC软件的开发基本和桌面PC Windows程序的开发没有多大区别,很容易上手,这也造就了上面成千上万的软件。且PPC拥有触摸笔操作,类似PC的鼠标,触摸笔长按操作类似PC的鼠标右键,所以,它的操作灵活性也非常强,很适合一些小型办公软件的操作,比如PPC上自带的Pocket WORD,Pocket Excel等。

由于自己也做过摄像头驱动,所以着重看了一下它的摄像头程序。这款机器用的处理器是Intel的PXA272,LCD的颜色是16位色。16位色为了颜色的丰富性,当然首选是RGB565了。不过为了提升系统速度,PXA272的文档上建议摄像头预览的时候一般把摄像头CMOS芯片出来的数据放到Overlay2上面。所谓的Overlay2,是不同于LCD显示主缓存(Baseplane)的另外一个附加层,它不仅可以接收平常我们所用的RGB格式的数据,还可以接收YCbCr格式的数据。也就是说,平常我们看到的窗口啦,控件啦,都是显示在Baseplane上面的,它上面的像素都是由红、绿、蓝三种基本颜色组成,颜色格式即为RGB格式。16位色,就是每个像素有16位,常用的RGB565格式的数据,就是说,红绿蓝的位数分别位5,6,5。那些截图软件截取屏幕数据,一般也都是直接取Baseplane的数据。Overlay2可以被理解为另外一块显示缓存,存放独立的数据,如果打开了Overlay2,硬件会自动把Overlay2和baseplane的数据合成输出。Overlay2的一个优势就是不仅仅可以接收RGB的数据,还可以接收YCbCr的数据。YCbCr格式的数据不是按照红绿蓝三种基本颜色来存储的,是按照亮度(Y)、蓝色色度分量(Cb)、红色色度分量(Cr)来存储的。一般来说,电视的输出数据是YCbCr格式的,摄像头出来的数据一般也支持这种格式,且这种格式对于编码来说效率更高。如果Baseplane和Overlay2要同时输出,一个典型的做法就是让Baseplane的像素多一个透明位,如果某个像素的透明位为1,则显示Overlay2,否则不显示。RGB565不带透明位,如果要透明位,则一般采用RGBT555,T表示透明,占用了像素的最高位,且绿色分量从6位减少到了5位,该格式仍然是16位的。那828+到底用到了Overlay2没有呢?看看就知道了。

下图是我选用了相框模式进行取景的截图:

图1

下图是我在相框模式下,点击了设置按钮,进入设置界面的截图:

图2

图1的相框颜色混乱,且偏绿。相框中间的取景窗口一片红色。实际上手机中看到的不是这个样子的,相框画得很漂亮,以红色为主要色调,且取景窗口就是通过摄像头拍到的范围。图2一切正常。为什么会出现这种情况呢?一个很好的解释,就是,取景的时候用到了Overlay2,且取景的时候,Baseplane的颜色格式为RGBT555,带一个透明位。普通操作的时候 ,颜色格式为RGB565。截图软件认为颜色一直是RGB565的。图1中间为一片红色,是因为这个区域为了让Overlay显示出来,baseplane的最高位(透明位)置成了1,且其他位为0(这样可以全透,否则只能半透,就是baseplane和Overlay2的像素简单合成)。截图以后,把它当成了RGB565,透明位就变成了红色的最高位了,自然看到的是一片红,但不是正红,因为正红的话,需要红色分量全部为1。相框的颜色偏绿也是因为颜色转换的问题,RGBT555直接当成RGB565以后,透明位没有了,红色最低位变成了绿色最高位,所以本来应该偏红的地方偏绿了。图1 中的按钮都是图片按钮,不是标准控件,估计是因为标准的控件只支持标准的RGB565的缘故,所以用一个图片来代替了按钮。由于RGBT555是一个特殊的格式,图形系统也许没有对它进行处理,即使处理,也不会提供对于普通颜色格式的所有功能(毕竟这是嵌入式系统,需要考虑代码体积和效率),所以图1中显示的文字和图片都是特殊处理的,可能是直接从打包的资源中取出来直接显示即可。图2是一个设置界面,用的都是标准的控件,不过此时已经整个屏幕切换,且到了RGB565格式了。由于颜色格式的不同,图1 的界面不会直接弹出一个复杂的设置窗口。

另外,虽然无法确定Overlay2用的格式是YCbCr,不过按照通常的做法,应该是这个格式。毕竟进行图像编码的时候,RGB格式的数据也要转成YCbCr进行编码,所以直接采用该格式,效率更高。

以上只是本人使用该手机的一些分析,可能有一些不正确的地方,希望大家多多指教。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=893144

以下是请教的对话:

david 发表于2006-08-02 23:26:00  IP: 221.218.173.*

真不错,你知道RGBT555的文件格式吗,怎样把RGB565转换成RGBT555,这些天要用到,能否交流一下,先谢了,wlzjcai@163.com

gene_zhang 发表于2006-08-10 13:07:00  IP: 218.249.88.*

inter 平台支持overlay2,overlay2是底层数据,图片是base层数据,需要把两个层叠加显示,实现透明。

overlay2支持YUV pannel数据,要把sensor的数据按照4:2:2分成3部分放在3个指针上,使用的是Extescape逃避windows GDI层。

我们现在遇到了一个问题,发现inter给的文档有一些问题,不能实现图片的透明,我想问一下base层的数据原始图片格式是什么?转换的透明色是黑色么?我们现在不能实现透明,怀疑黑色不是透明色。请帮忙,能否提供原图和转换以后的图各一张,我想看看图片数据,谢谢。

我的邮箱bin.zhang@mail.techfaith.cn.

大哥哪里混,希望交个朋友:)

#   gene_zhang 发表于2006-08-10 13:21:00  IP: 218.249.88.*

你所说的RGB565是否是标准16位图经过photoshop转换后的RGB565?好像565是不能够通过GDI显示的,loadimage,loadbitmap,SHloadbitmapfile都不能成功,在pc window也不能直接显示

#   freemancqcsdn 发表于2006-08-13 17:21:00  IP: 218.1.151.*

好久都没有到我的blog上面看了,想不到这篇文章受到了一定的关注:)RGB565到RGBT555就是一个简单的移位操作,最高位保留作为透明位:

#define RGB565_TO_RGBT555(color, T) (((T & 0x1) << 15) | ((color & 0xF800) >> 1) | ((color & 0x7e0) >> 1) | (color & 0x1f))

color表示颜色,T表示透明。这个宏是随便写的,没有优化,也没有验证,呵呵。RGBT555的红色比RGB565靠右一位,绿色比RGB565少一位,蓝色保持不变。

图片的透明有软件和硬件支持两种,如果要用硬件支持,则需要把base的各式设置成带透明位的,比如RGBT666或者RGBT555,且需要结合overlay1或者overlay2才能显示出效果。如果是软件的话,则让图形系统自己处理alpha混合。

黑色当然不是透明色,透不透明关键在于颜色中有没有透明位,透明位置位没有。

#   freemancqcsdn 发表于2006-08-13 21:47:00  IP: 58.38.106.*

15位色(RGB555)和16位色(RGB565)应该都是标准的颜色,Windows会直接支持的。

#   gene_zhang 发表于2006-08-14 10:08:00  IP: 218.249.88.*

已经搞定了,谢谢你

有个关键点应该是给你补充一下

1.WMobile会自动把555的图片转成565,转换的规律是RG左移一位,在G的最低位补上原来G的最高位。

2.关键的颜色是"(保留一位)10000 00000 00000",经过第一点的规律转换得到 "10000 000000 00000"正好是最高位是1,全部透明。

3.我们要做的是在WMobile转换之前把图片做一步处理。

交流经验,弘扬民资软件:)

另外,我对你的YUV旋转算法比较感兴趣:),我们这面也样面临这样的问题,效率太致命了:)

能否赐教?希望我们可以更多的交流积累,谢谢!

#   freemancqcsdn 发表于2006-08-15 12:06:00  IP: 210.22.155.*

YUV的旋转算法一般用IPP提供的函数。也可以自己写,不过一定要注意一次性读和写至少都需要4个字节,减少和内存打交道的操作,可以大幅度提高效率。

#   jason 发表于2006-09-04 23:36:00  IP: 222.68.117.*

补充一点,如果不用IPP5.0提供的函数,也尽量要去使用WMMX指令集。

#   zozowit 发表于2007-11-19 10:17:26  IP: 124.207.41.*

您好,我从一开始就看见了您的文章,深受启发,但作为一个初学者,我遇到了很大的障碍

我用的是pxa270,希望在overlay2上实时播放yuv420数据,然后在base或overlay1上显示界面

现在遇到的问题是怎么才能让overlay2播放视频的同时,界面又正常显示呢?

我已经通过修改相关寄存器使得base层在最上,overlay2层在最下,设置了相应寄存器使base透明,但混合显示效果很差,overlay2图像失真

透明方面,寄存器我只是设置了lccr3最高两位为11,

我这么做是否正确呢,你可以给我一些提示吗?

zozowit@126.com,谢谢

#   freemancqcsdn 发表于2007-11-19 10:53:41  IP: 210.22.155.*

To zozowit:

你在base上面用的颜色格式是不是RGBT555?如果是这种格式的话,overlay2的效果不会很好。如果你换用了RGB565(LCCR3最高两位设成00),缺少了透明位,overlay2又会被base给盖住。

我在猜测,这个可能是PXA控制器在进行颜色合成的时候,会以base的颜色为基准进行合成。15位色的效果比16位色的效果还是要差一些。

如果你硬要画界面,可以选择在overlay1上面进行,但是把overlay1配置成RGBT666的颜色格式。这种组合在PXA的文档上面没有说,所以可能会有一些潜在的问题。基本可以用一用。

PS:base采用RGBT555,效果会比RGB565差一些,但不会很差。检查一下其他地方的设置,以及图像数据是否正常输出

#   zozowit 发表于2007-11-19 13:07:16  IP: 124.207.41.*

非常感谢您的解答,实际上RGBT555和RGB565两种我都尝试过,通过设置lccr3寄存器,都能透明,但效果都不好,时不时我修改了lccr3寄存器后,pxa270能自动地将base层上的像素转换成RGBT555呢,对此我一直感到疑惑。实际上我是用minigui或QT做界面,我查了一下二者的源码,它们都是操纵/dev/fb0,如果要在overlay1上显示界面的话,是否应该修改minigui或QT的源码呢,这样做是否可行呢。

还望您再给我一些提示

#   zozowit 发表于2007-11-19 13:11:38  IP: 124.207.41.*

当我通过修改lccr0而将overlay2置于最上层时,yuv图像输出是正常的

base层的颜色格式我是通过修改内核驱动里的pxafb.c文件中的数组实现的,看了您的解答,是否lccr3的最高两位还影响颜色的格式呢

#   freemancqcsdn 发表于2007-11-19 13:19:07  IP: 210.22.155.*

lccr3的最高两位 00 - RGB565

11 - RGBT555

修改了LCCR3寄存器,PXA是不会自动把base上面的像素转换的。这个转换必须软件来做,不然屏幕就会花掉。

#   zozowit 发表于2007-11-19 13:39:52  IP: 124.207.41.*

您指的是把base上的像素转成RGBT555对么,谢谢您的解答,我现在就去试试

#   zozowit 发表于2007-11-19 15:41:00  IP: 124.207.41.*

您好,我做了了一些尝试

我通过更内核驱动中的数组,

86 static struct pxafb_rgb def_rgb_16 = {

87 blue: { offset: 11, length: 5, msb_right: 1},

88 green: { offset: 5, length: 6, msb_right: 1},

89 red: { offset: 0, length: 5, msb_right: 1},

90 transp: { offset: 0, length: 0, msb_right: 1},

91 };

将base层改成RGBT555

然后在base层将一幅白色的jpeg转成RGBT555显示

190 unsigned short B = (blue >> 3) & 0x001F;

191 unsigned short G = ((green >> 3) << 5) & 0x03E0;

192 unsigned short R = ((red >> 3) << 10) & 0x7c00;

193

194 return (unsigned short) (R | G | B | 0x8000);

将lccr3的高两位置1,在overlay2上播放yuv420的图像,效果一样很差,只能见人物轮廓,而当将overlay2置于base之上时是很好的播放效果

期待您的解答,谢谢

#   freemancqcsdn 发表于2007-11-19 15:49:29  IP: 210.22.155.*

你是不是透明度设置得不对?你尝试改一下透明度看看?先开始把base全部置0(最高位透明为置1)。看看效果如何,如果能正常显示,就改一下寄存器中透明度的设置。

如果效果不好,那么画菜单的部分,可以不用透明(其他部分全透)即可。

#   zozowit 发表于2007-11-19 16:25:03  IP: 124.207.41.*

您好,显示不清的部分是overlay2

我试过,将图片的每一个像素都设置成0x8000,在改变lccr3之前是一个红色矩形,改变lccr3后,出现透明,但overlay2中显示的视频透出来还是不行,只有轮廓

谢谢您的指点

#   freemancqcsdn 发表于2007-11-19 16:35:38  IP: 210.22.155.*

如果overlay2放在上面能够正常显示,那么,把它放在下面,只要上面一层是全透,也能正常显示。可能效果会稍微差一点点,但是不会只变成轮廓了。你把LCCR3的高两位设成11,然后把overlay2放在下面,显示也是正常的吗?

还有,你是直接操纵LCD 的 framebuffer的吧?我担心问题会卡在miniGUI或者QT等软件设置的某些步骤当中。

#   zozowit 发表于2007-11-19 16:52:44  IP: 124.207.41.*

您好,很感激来至您的帮助

我现在是直接操纵framebuffer,与minigui和QT无关

”你把LCCR3的高两位设成11,然后把overlay2放在下面,显示也是正常的吗?“

显示却不正常,现在我这个小菜鸟变得无从下手,芯片手册也反复比对,没有头绪,如果您有时间可以在msn或QQ里向您求教么,或者邮箱zozowit@126.com

#   freemancqcsdn 发表于2007-11-19 16:57:55  IP: 210.22.155.*

刚才说错了,应该问

你把LCCR3的高两位设成11,然后把overlay2放在上面,显示也是正常的吗?

#   zozowit 发表于2007-11-19 17:08:32  IP: 124.207.41.*

显示不正常

#   freemancqcsdn 发表于2007-11-19 17:16:41  IP: 210.22.155.*

你把图片做成纯色(某种单一颜色),然后再显示看看,颜色有啥变化。这样比较便于调试。

#   zozowit 发表于2007-11-19 17:31:12  IP: 124.207.41.*

如果显示不正常能说明一些什么问题呢,您能在给我一些提示么,谢谢您

#   zozowit 发表于2007-11-19 17:33:02  IP: 124.207.41.*

这个我之前已经做了尝试,设置成白色,还是一样,有点像看相片的底片

#   freemancqcsdn 发表于2007-11-19 17:44:54  IP: 210.22.155.*

不要设置成白色,因为白色的所有位都是1,不好便于对比。最好设置成只有一个二进制位为1,且RGBT555和RGB565表示的含义不一样的颜色,比如0x0400。

另外,如果设置成白色,看上去也有问题,那很可能你改了代码之后,overlay2的YUV输入也有问题。你把overlay2上的数据读出来看看,看是不是想要输入的数据。

#   zozowit 发表于2007-11-20 09:41:43  IP: 124.207.41.*

很感谢您的建议,实际上之前我用0x8000测试过,lccr3最高两位为00时,显示红色,改为11,变为没有颜色

#   zozowit 发表于2007-11-20 09:47:17  IP: 124.207.41.*

当我将lccr3最高位置成11,尝试得到透明时,发现图像如之前一直说的那样,这是,我改变lccr0,使得overlay层在 base层之上,此时显示的yuv图像非常正常,这样是否可以确定overlay2的yuv输入没有问题呢

#   freemancqcsdn 发表于2007-11-20 09:55:40  IP: 210.22.155.*

由于很难马上看出到底是什么原因导致了显示不正常,所以,最好你在显示出问题的时候,把所有的寄存器都DUMP出来,同时把overlay2和base上面的像素也取出来看看,看是不是自己想设的值。说不定整个流程都没有问题,就是代码中的某些不容易发现的小错误,导致了显示不正常。

#   zozowit 发表于2007-11-20 10:14:41  IP: 124.207.41.*

但0x0400,对lccr3的改变前后都是绿色,是否最高位要置一呢,这就是问题所在么

2007-11-20 多普达828+不完全技术分析 [zozo转及对话]相关推荐

  1. 【操作日志11.19】【原创】技术分析之主力筹码加跳空高开

    在成交量持续走低的情况下,三根大阳线持续放量,尤其在第三根柱子的时候直接跳空,最重要的是第三天的收盘价直接突破前高,而且上影线的抛压几乎为0,第四天直接9%的涨幅,主力强力拉升,第三天收盘是一个非常不 ...

  2. Image Processing and Computer Vision_Review:Local Invariant Feature Detectors: A Survey——2007.11...

    翻译 局部不变特征探测器:一项调查 摘要 -在本次调查中,我们概述了不变兴趣点探测器,它们如何随着时间的推移而发展,它们如何工作,以及它们各自的优点和缺点.我们首先定义理想局部特征检测器的属性.接下来 ...

  3. 东北大学计算机硬件题库,东北大学20春学期《计算机硬件技术基础》在线平时作业123答案100...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 东北大学20春学期<计算机硬件技术基础>在线平时作业123答案100 20春学期<计算机硬件技术基础>在线平时作业1 试卷总分:1 ...

  4. 陀螺研究院 | 产业区块链发展周报(11.14—11.20)

    摘要 产业动态: 由建行发起的价值30亿美元数字债券将推迟上市 15国正式签署RCEP,全球规模最大自贸协定达成 浙江省首个产业区块链赋能中心落地宁波江北 越南教育和培训部计划在2021年实施区块链技 ...

  5. 20秋PHP作业3,大工20秋《模拟电子技术》在线作业3答案

    大工20秋<模拟电子技术>在线作业3: T' Z1 {# q0 N) D' m+ |( N 1.[单选题] 根据反馈的极性,反馈可分为()反馈.+ S. T; `7 n2 l! w5 i! ...

  6. 尚硅谷——谷粒商城项目开发记录——2021.11.20

    尚硅谷--谷粒商城项目开发记录--2021.11.20 概念: 1.SpringCloud Alibaba: 简介: Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此 ...

  7. 验证码 -图形图像识别的算法。http://blog.csdn.net/xtalk2008/archive/2007/11/01/1861310.aspx...

    验证码 -图形图像识别的算法.http://blog.csdn.net/xtalk2008/archive/2007/11/01/1861310.aspx 图像经过处理后,还需要进行分割,才能进行比较 ...

  8. python题库刷题训练软件_Python基础练习100题 ( 11~ 20)

    刷题继续 上一期和大家分享了前10道题,今天继续来刷11~20 Question 11: Write a program which accepts a sequence of comma separ ...

  9. 一张图看懂2017双11中的网络产品和技术

    摘要: 大家都知道,2017年双11又创造了新纪录,全天交易额1682亿,交易峰值32.5万笔/秒,支付峰值25.6W笔/秒,狂欢的背后是极其复杂庞大的技术系统,其中就有大量阿里云云计算相关的产品和技 ...

最新文章

  1. Chrome 浏览器降级后浏览网站不保留用户数据问题原因及解决方法
  2. VC2019 使用GDI+ 显示PNG图片
  3. 纯CSS3画出小黄人并实现动画效果
  4. MapReduce-流量统计求和-排序-JobMain代码和测试运行
  5. 成为技术大牛,只能靠天赋吗?
  6. JAVA入门级教学之(定义一个学生类)
  7. 光伏农业七大问题不解决 投资者恐“先驱”变“先烈”
  8. linux建立数列文本,Linux实验内容.doc
  9. 卸载计算机系统,卸载完360安全卫士及其安装的补丁之后电脑各种系统问题
  10. 自定义 View 实现汉字笔顺动画
  11. python 查询oracle数据库返回具体字段名
  12. Java输出字符串中的叠词_java中正则表达式的简单运用 | iamxiarui
  13. 如何分析数据建立数据表
  14. 33岁跳槽无路,濒临绝望之际受贵人指点,成功上岸阿里(Java岗)
  15. 【漏洞复现】ApacheShiro1.2.4反序列化漏洞复现(CVE-2016-4437)
  16. 秀米如何在布局里面画图_如何提高CAD绘图速度?
  17. 【20220504】软件开发模式
  18. DP(动态规划)总结
  19. gif动图表情包如何制作?教你一键生成gif表情包
  20. 车辆动力学知识总结(三) 二自由度动力学模型

热门文章

  1. 51单片机学习:LED闪烁实验
  2. Faster RCNN超详细入门 02 网络细节与训练方法
  3. 正则表达式验证中文或者英文
  4. doolittle分解法解线性方程
  5. sfm算法之三角化(三角测量)
  6. 纠正几个不好的工作习惯
  7. echarts tooltips 自定义 formatter 显示图例颜色
  8. APP多平台快速切换
  9. uniapp小程序一键连接wifi
  10. JavaScript中查找关键词