Camera: Brew中的龍潭虎穴

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 provided that there's an interval of at least 300 milliseconds between creating the ICamera instance and calling ICAMERA_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....徹底無語了
但是有的手機沒有還不行, 世道世道...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章