android摄像头框架,FS_S5PC100平台上Android Camera架构分析
1. Android-Camera架構(gòu)分析
Android的camera系統(tǒng)架構(gòu)自上而下分別為應(yīng)用層-框架層-硬件抽象層-linux驅(qū)動層。層與層之間通過Binder、回調(diào)函數(shù)或者系統(tǒng)調(diào)用聯(lián)系。
我們主要關(guān)心的是CameraService與CameraHAL之間的聯(lián)系以及CameraHAL本身的實(shí)現(xiàn)。
2. CameraService
系統(tǒng)初始化時會開啟一個CameraService的守護(hù)進(jìn)程,為上層應(yīng)用提供camera對應(yīng)的功能接口。并與與硬件抽象層之間通過回調(diào)函數(shù)傳遞數(shù)據(jù)。
CameraService的實(shí)現(xiàn)位于:
frameworks/base/camera/libcameraservice/CameraService.cpp
CameraService的主要功能有取景Preview,拍照takePicture和攝影Recording
CameraService在整個Android-Camera架構(gòu)處于如下位置:
3. Camera-HAL
HAL層的實(shí)現(xiàn)和具體硬件平臺相關(guān)。Android定義好了它的接口,是一個C++的類和幾個回調(diào)函數(shù),定義位于頭文件:
frameworks/base/include/ui/CameraHardwareInterface.h
FS_S5PC100平臺的Camera-HAL的實(shí)現(xiàn)位于:
vendor/farsight/fs_proprietary/libcamera/
其中,SecCameraHWInterface.cpp是真正的HAL實(shí)現(xiàn),SecCamera.cpp則是對攝像頭具體操作的封裝,SecCameraHWInterface中會包含一個SecCamera類的對象。
需要注意的是雖然Camera-HAL已經(jīng)實(shí)現(xiàn)好了,我們還是需要稍作改動才能讓它工作。
首先,需要修改攝像頭對應(yīng)的設(shè)備文件名:
vendor/farsight/fs_proprietary/libcamera/SecCamera.h
#define CAMERA_DEV_NAME "/dev/video0"
默認(rèn)設(shè)備文件是/dev/video0,但是在這個定制過的éclair里面,video0已經(jīng)被libfimc打開,這里再次打開的話就會失敗。我們也不能用video1,因?yàn)樗鼤籰ibcopybit打開,因此只能使用video2:
#define CAMERA_DEV_NAME "/dev/video2"
其次,需要對預(yù)覽和拍照的格式進(jìn)行設(shè)置:
vendor/farsight/fs_proprietary/libcamera/SecCameraHWInterface.cpp
p.setPreviewFormat("yuv420sp");
p.setPictureFormat("yuv422i");
4. CameraService與Camera-HAL的聯(lián)系
在CameraHardwareInterface.h中,定義了一個由C語言方式導(dǎo)出符號的函數(shù):
/** factory function to instantiate a camera hardware object */
extern "C" sp openCameraHardware();
這樣,CameraService就可以調(diào)用openCameraHardware得到一個CameraHardwareInterface,從而實(shí)現(xiàn)Camera的底層操作。
另外,在CameraHardwareInterface.h中,還定義了三個回調(diào)函數(shù)原型:
typedef void (*notify_callback)(int32_t msgType,
int32_t ext1,
int32_t ext2,
void* user);
typedef void (*data_callback)(int32_t msgType,
const sp& dataPtr,
void* user);
typedef void (*data_callback_timestamp)(nsecs_t timestamp,
int32_t msgType,
const sp& dataPtr,
void* user);
這三個回調(diào)函數(shù)均由CameraService::client來實(shí)現(xiàn),繼而在Cmaera-HAL中回調(diào)這些函數(shù)來向CameraService傳遞消息或者視頻數(shù)據(jù)流。
其中,notify_callback主要用于傳遞一些消息,如按下快門或者開始/停止預(yù)覽等等;
data_callback用于返回Camera-HAL得到的raw data;
data_callback_timestamp用于返回Camera-HAL得到的raw data并攜帶時間戳(用于同步);
CameraHardwareInterface還需實(shí)現(xiàn)消息使能的方法:
virtual void enableMsgType(int32_t msgType) = 0;
用于指定msg對應(yīng)的callback是否可用。比如:
enableMsgType(CAMERA_MSG_PREVIEW_FRAME),則data_callback可用。
二者的調(diào)用關(guān)系如下圖:
總結(jié)
以上是生活随笔為你收集整理的android摄像头框架,FS_S5PC100平台上Android Camera架构分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的世界怎么装水(桶怎么装水装岩浆)
- 下一篇: 经典安卓手机单机游戏有哪些(怎么才能经典