Camera: Brew中的龙潭虎穴

来源:互联网 发布:售电软件市场 编辑:程序博客网 时间:2024/03/29 12:54

Camera慢慢的成为手机的标配之一的时候给手机编程带来的麻烦也越来越大.尤其是能有一段通用的代码在各种不同屏幕尺寸手机上顺利运行更是非常困难。这次就谈谈Brew平台的Camera编程. 这次只讲Preview和Snapshot模式.Movie我们暂且不谈。和很多Brew接口很类似 Camera接口需要createinstance, 然后SetProperties(包括Size, Preview Size等等)当然很重要的就是要设置一个Callback function在每次得到新的Frame的时候做上相印的渲染操作

所以大致的代码看上去就是这个样子的
ISHELL_CreateInstance(iShell, AEECLSID_CAMERA, (void **)&m_pCamera);
ICAMERA_RegisterNotify(m_pCamera, _CameraNotify, pMe);
ICAMERA_SetSize(m_pCamera, &sz);
ICAMERA_Start(m_pCamera, CAM_MODE_PREVIEW, 0);

好问题就来了
第一个问题是有的手机非常恶心, For some devices,the camera works properly providedthat there's an interval of at least 300 milliseconds between creatingthe ICamera instance and callingICAMERA_Preview.所以在有的手机上需要用一个非常规的手段去打开Preview,那就是MSLEEP(500),尽管这是一个强烈不推荐使用的接口.

第二个问题就是SetSize的问题了,GetSize这样的接口实际上是几乎不工作的。而且每个手机支持的size也是不同的,在这样的情况下怎么去填写size值呢.我们的办法也是比较极端的。其实所有的size都逃不出一定的范围
VGA(640*480) QVGA(320*240) QQVGA(160*120) CIF(352*288) QCIF(176*144)
在每次SetSize的时候都检查返回值,范围正确的那一次大致就是你想要的分辨率. 当然你可以按照自己的需求排序(在支持很多个分辨率的情况下)

其实第二个问题还是有潜在的问题的。那就是返回值并不是在每个手机上都表现的一致,因为有的手机根本返回的就是一个错的值.正确的值会在Callback中有所体现。所以这样的操作还是可能存在问题的.碰到这个情况就职能用宏将特殊代码隔开而为这个特殊手机做一个特殊版本了。

 

说到CallBack带来的就是另一个问题,先定义为问题三。就是这个异步操作的问题, 异步操作可能会有的问题在哪里呢
假设我们首先是ICAMERA_Start, 之后马上调用ICAMERA_Stop, 直观的想法是Camera被开启了然后马上关闭了.
但实际的情况是开启了没有关闭, 为什吗呢???Stop这个异步操作在Start的范围值没有在Callback中得意体现的时候被抛弃了.所以在处理这种类似的操作的时候,必须有一个event queue,在Camera busy处于等待CallBack的时候把后面的消息暂时保存起来。等空闲的时候在继续操作,这样可以帮助减少很多诡异的问题.

当然即使以上的这些都做到了还是有可能失败, 因为有的手机本身就存在着Bug. 比如著名的巧克力手机LG vx8550,按键是触摸式的, 有一个Heat Sensor去感应温度的不同而产生按键消息.但是原本没有关系的照相机去出了问题,可能Heat Sensor的中断优先级已经比较高了,但是热感应需要一定的时间来产生结果. 但是如果长时间的CPU被Camera抢占(比如1s 4-5个frame)那Heat Sensor总是没有时间去探测温度,去产生按键消息.这样的结果就是在打开Camera的时候所有的按键消息都失灵了, 你只能拔电池来解决了 还有一些恶心的手机像LG的vx9400,vx9800,vx9900,vx10000都是拿不到frame的bitmap,拿到的都是全黑色的像素,不知道他们是怎么搞的。有没有做过unittest(怎么都是LG...)

还有第四个问题就是
ICAMERA_SetParm(m_pCamera, CAM_PARM_PREVIEW_TYPE, CAM_PREVIEW_SNAPSHOT, 0);
的问题了, 这个频频出现在3.x的手机上, 不知道是手机实现的问题还是怎样,总是需要这个API的调用以帮助打开Preview Mode.
琢磨琢磨挺滑稽的 preivew_param with snapshot....彻底无语了
但是有的手机没有还不行, 世道世道...