Android Camera 模塊分析(一)

Camera主要的頭文件有如下幾個:
            ICameraClient.h
            Camera.h 
            ICamera.h
            ICameraService.h
            CameraHardwareInterface.h
        在這些頭文件Camera.h提供了對上層的接口,而其餘的幾個頭文件都是提供一些接口類(即包含了純虛函數的類),這些接口類必須被實現類繼承纔可以使用。

        整個Camera在運行的時候,能夠大體上分紅Client和Server兩個部分,它們分別在兩個進程中運行,它們之間使用Binder機制實現進程間通信。這樣在客戶端調用接口,功能則在服務器中實現,可是在客戶端中調用就好像直接調用服務器中的功能,進程間通信的部分對上層程序不可見。

       從框架結構上來看,ICameraService.h、ICameraClient.h和ICamera.h三個類定義了MeidaPlayer的接口和架構,ICameraService.cpp和Camera.cpp兩個文件用於Camera架構的實現,Camera的具體功能在下層調用硬件相關的接口來實現。

       從Camera的總體結構上,類Camera是整個系統核心,ICamera類提供了Camera主要功能的接口,在客戶端方面調用, CameraService是Camera服務,它經過調用實際的Camera硬件接口來實現功能。事實上,圖中紅色虛線框的部分都是Camera程序的框架部分,它主要利用了Android的系統的Binder機制來完成通信。藍色的部分經過調用Camera硬件相關的接口完成具體的Camera服務功能,其它的部分是爲上層的JAVA程序提供JNI接口。在總體結構上,左邊能夠視爲一個客戶端,右邊是一個能夠視爲服務器,兩者經過Android的Bimder來實現進程間的通信。

        2.2 頭文件ICameraClient.h

       ICameraClient.h用於描述一個Camera客戶端的接口,定義以下所示:java

class ICameraClient: public IInterface 
{ 
public: 
DECLARE_META_INTERFACE(CameraClient); 
virtual void shutterCallback() = 0; 
virtual void rawCallback(const sp<IMemory>& picture) = 0; 
virtual void jpegCallback(const sp<IMemory>& picture) = 0; 
virtual void frameCallback(const sp<IMemory>& frame) = 0; 
virtual void errorCallback(status_t error) = 0; 
virtual void autoFocusCallback(bool focused) = 0; 
};

class BnCameraClient: public BnInterface<ICameraClient> 
{ 
public: 
virtual status_t onTransact( uint32_t code, 
const Parcel& data, 
Parcel* reply, 
uint32_t flags = 0); 
};
在定義中,ICameraClient 類繼承IInterface,並定義了一個Camera客戶端的接口,BnCameraClient 繼承了BnInterface<ICameraClient>,這是爲基於Android的基礎類Binder機制實如今進程通信而構建的。根據BnInterface類模版的定義BnInterface<ICameraClient>類至關於雙繼承了BnInterface和 ICameraClient。

       IcameraClient這個類的主要接口是幾個回調函數shutterCallback、rawCallback和jpegCallback等,它們在相應動做發生的時候被調用。做爲Camera的「客戶端」,須要本身實現幾個回調函數,讓服務器程序去「間接地」調用它們。

        2.3 頭文件Camera.h

       Camera.h是Camera對外的接口頭文件,它被實現Camera JNI的文件android_hardware_Camera.cpp所調用。Camera.h最主要是定義了一個Camera類:android

class Camera : public BnCameraClient, public IBinder:: DeathRecipient 
{ 
public: 
static sp<Camera> connect(); 
~Camera(); 
void disconnect(); 
status_t getStatus() { return mStatus; } 
status_t setPreviewDisplay(const sp<Surface>& surface); 
status_t startPreview(); 
void stopPreview(); 
status_t autoFocus(); 
status_t takePicture(); 
status_t setParameters(const String8& params); 
String8 getParameters() const; 
void setShutterCallback(shutter_callback cb, void *cookie); 
void setRawCallback(frame_callback cb, void *cookie); 
void setJpegCallback(frame_callback cb, void *cookie); 
void setFrameCallback(frame_callback cb, void *cookie); 
void setErrorCallback(error_callback cb, void *cookie); 
void setAutoFocusCallback(autofocus_callback cb, void *cookie); 
// ICameraClient interface 
virtual void shutterCallback(); 
virtual void rawCallback(const sp<IMemory>& picture); 
virtual void jpegCallback(const sp<IMemory>& picture); 
virtual void frameCallback(const sp<IMemory>& frame); 
virtual void errorCallback(status_t error); 
virtual void autoFocusCallback(bool focused);
//……
}
從接口中能夠看出Camera類恰好實現了一個Camera的基本操做,例如播放(startPreview)、中止(stopPreview)、暫停(takePicture)等。在Camera類中connect()是一個靜態函數,它用於獲得一個Camera的實例。在這個類中,具備設置回調函數的幾個函數:setShutterCallback、setRawCallback和setJpegCallback等,這幾個函數是爲了提供給上層使用,上層利用這幾個設置回調函數,這些回調函數在相應的回調函數中調用,例如使用setShutterCallback設置的回調函數指針被 shutterCallback所調用。

        在定義中,ICameraClient 類雙繼承了IInterface和IBinder DeathRecipient,並定義了一個Camera客戶端的接口,BnCameraClient 繼承了BnInterface<ICameraClient>,這是爲基於Android的基礎類Binder機制實如今進程通信而構建的。事實上,根據BnInterface類模版的定義BnInterface<ICameraClient>類至關於雙繼承了 BnInterface和ICameraClient。這是Android一種經常使用的定義方式。

        繼承了DeathNotifier類以後,這樣當這個類做爲IBinder使用的時候,當這個Binder即將Died的時候被調用其中的binderDied函數。繼承這個類基本上實現了一個回調函數的功能。
相關文章
相關標籤/搜索