|
作者:劉洪濤,華清遠見嵌入式培訓中心講師。 1. Android-Camera架構分析
Android的camera系統(tǒng)架構自上而下分別為應用層-框架層-硬件抽象層-linux驅動層。層與層之間通過Binder、回調函數(shù)或者系統(tǒng)調用聯(lián)系。 我們主要關心的是CameraService與CameraHAL之間的聯(lián)系以及CameraHAL本身的實現(xiàn)。 2. CameraService 系統(tǒng)初始化時會開啟一個CameraService的守護進程,為上層應用提供camera對應的功能接口。并與與硬件抽象層之間通過回調函數(shù)傳遞數(shù)據。 CameraService的實現(xiàn)位于: frameworks/base/camera/libcameraservice/CameraService.cpp CameraService的主要功能有取景Preview,拍照takePicture和攝影Recording CameraService在整個Android-Camera架構處于如下位置:
3. Camera-HAL HAL層的實現(xiàn)和具體硬件平臺相關。Android定義好了它的接口,是一個C++的類和幾個回調函數(shù),定義位于頭文件: frameworks/base/include/ui/CameraHardwareInterface.h FS_S5PC100平臺的Camera-HAL的實現(xiàn)位于: vendor/farsight/fs_proprietary/libcamera/ 其中,SecCameraHWInterface.cpp是真正的HAL實現(xiàn),SecCamera.cpp則是對攝像頭具體操作的封裝,SecCameraHWInterface中會包含一個SecCamera類的對象。 需要注意的是雖然Camera-HAL已經實現(xiàn)好了,我們還是需要稍作改動才能讓它工作。 首先,需要修改攝像頭對應的設備文件名: vendor/farsight/fs_proprietary/libcamera/SecCamera.h 默認設備文件是/dev/video0,但是在這個定制過的éclair里面,video0已經被libfimc打開,這里再次打開的話就會失敗。我們也不能用video1,因為它會被libcopybit打開,因此只能使用video2: #define CAMERA_DEV_NAME "/dev/video2" 其次,需要對預覽和拍照的格式進行設置: vendor/farsight/fs_proprietary/libcamera/SecCameraHWInterface.cpp 4. CameraService與Camera-HAL的聯(lián)系 在CameraHardwareInterface.h中,定義了一個由C語言方式導出符號的函數(shù): /** factory function to instantiate a camera hardware object */ 這樣,CameraService就可以調用openCameraHardware得到一個CameraHardwareInterface,從而實現(xiàn)Camera的底層操作。 另外,在CameraHardwareInterface.h中,還定義了三個回調函數(shù)原型: typedef void (*notify_callback)(int32_t msgType, typedef void (*data_callback)(int32_t msgType, typedef void (*data_callback_timestamp)(nsecs_t timestamp, 這三個回調函數(shù)均由CameraService::client來實現(xiàn),繼而在Cmaera-HAL中回調這些函數(shù)來向CameraService傳遞消息或者視頻數(shù)據流。 其中,notify_callback主要用于傳遞一些消息,如按下快門或者開始/停止預覽等等; data_callback用于返回Camera-HAL得到的raw data; CameraHardwareInterface還需實現(xiàn)消息使能的方法: virtual void enableMsgType(int32_t msgType) = 0; 用于指定msg對應的callback是否可用。比如: enableMsgType(CAMERA_MSG_PREVIEW_FRAME),則data_callback可用。 二者的調用關系如下圖:
|
|
|