Android的Camera架構介紹之一

  第一部分 Camera概述


  Android的Camera包含取景器(viewfinder)和拍攝照片的功能。目前Android發布版的Camera程序雖然功能比較簡單,但是其程序的架構分成客戶端和服務器兩個部分,它們建立在Android的進程間通訊Binder的結構上。

  以開源的Android為例,Camera的代碼主要在以下的目錄中:

Camera的JAVA程序的路徑:
packages/apps/Camera/src/com/android/camera/
在其中Camera.java是主要實現的文件

frameworks/base/core/java/android/hardware/Camera.java
這個類是和JNI中定義的類是一個,有些方法通過JNI的方式調用本地代碼得到,有些方法自己實現。


Camera的JAVA本地調用部分(JNI):
frameworks/base/core/jni/android_hardware_Camera.cpp

這部分內容編譯成為目標是libandroid_runtime.so。

主要的頭文件在以下的目錄中:
frameworks/base/include/ui/

Camera底層庫在以下的目錄中:
frameworks/base/libs/ui/
這部分的內容被編譯成庫libui.so。

Camera服務部分:
frameworks/base/camera/libcameraservice/ 
這部分內容被編譯成庫libcameraservice.so。

  為了實現一個具體功能的Camera,在最底層還需要一個硬件相關的Camer庫(例如通過調用video for linux驅動程序和Jpeg編碼程序實現)。這個庫將被Camera的服務庫libcameraservice.so調用。


  第二部分 Camera的接口與架構


2.1 Camera的整體框架圖Camera的各個庫之間的結構可以用下圖的表示:

  在Camera系統的各個庫中,libui.so位于核心的位置,它對上層的提供的接口主要是Camera類,類libandroid_runtime.so通過調用Camera類提供對JAVA的接口,并且實現了android.hardware.camera類。
  libcameraservice.so是Camera的服務器程序,它通過繼承libui.so的類實現服務器的功能,并且與libui.so中的另外一部分內容則通過進程間通訊(即Binder機制)的方式進行通訊。
libandroid_runtime.so和libui.so兩個庫是公用的,其中除了Camera還有其他方面的功能。

  Camera部分的頭文件在frameworks/base/include/ui/目錄中,這個目錄是和libmedia.so庫源文件的目錄frameworks/base/libs/ui/相對應的。

  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客戶端的接口,定義如下所示:
class ICameraClient: public IInterface 

public: 
    DECLARE_META_INTERFACE(CameraClient); 
    virtual void shutterCallback() = 0; 
    virtual void rawCallback(const sp& picture) = 0; 
    virtual void jpegCallback(const sp& picture) = 0; 
    virtual void frameCallback(const sp& frame) = 0; 
    virtual void errorCallback(status_t error) = 0; 
    virtual void autoFocusCallback(bool focused) = 0; 
};

class BnCameraClient: public BnInterface 

public: 
    virtual status_t onTransact( uint32_t code, 
                                const Parcel& data, 
                                Parcel* reply, 
                                uint32_t flags = 0); 
};

    在定義中,ICameraClient 類繼承IInterface,并定義了一個Camera客戶端的接口,BnCameraClient 繼承了BnInterface,這是為基于Android的基礎類Binder機制實現在進程通訊而構建的。根據BnInterface類模版的定義BnInterface類相當于雙繼承了BnInterface和ICameraClient。

    IcameraClient這個類的主要接口是幾個回調函數shutterCallback、rawCallback和jpegCallback等,它們在相應動作發生的時候被調用。作為Camera的“客戶端”,需要自己實現幾個回調函數,讓服務器程序去“間接地”調用它們。

2.3 頭文件Camera.h

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

public: 
    static  sp  connect(); 
                        ~Camera(); 
            void        disconnect();  
            status_t    getStatus() { return mStatus; } 
            status_t    setPreviewDisplay(const sp& 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& picture); 
    virtual void        jpegCallback(const sp& picture); 
    virtual void        frameCallback(const sp& 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,這是為基于Android的基礎類Binder機制實現在進程通訊而構建的。事實上,根據BnInterface類模版的定義BnInterface類相當于雙繼承了BnInterface和ICameraClient。這是Android一種常用的定義方式。
        繼承了DeathNotifier類之后,這樣當這個類作為IBinder使用的時候,當這個Binder即將Died的時候被調用其中的binderDied函數。繼承這個類基本上實現了一個回調函數的功能。

  2.4 頭文件ICamera.h

  ICamera.h描述的內容是一個實現Camera功能的接口,其定義如下所示:
class ICamera: public IInterface 

public: 
    DECLARE_META_INTERFACE(Camera);  
    virtual void       disconnect() = 0; 
    virtual status_t  setPreviewDisplay(const sp& surface) = 0; 
    virtual void       setHasFrameCallback(bool installed) = 0; 
    virtual status_t  startPreview() = 0; 
    virtual void       stopPreview() = 0; 
    virtual status_t  autoFocus() = 0; 
    virtual status_t  takePicture() = 0; 
    virtual status_t  setParameters(const String8& params) = 0; 
    virtual String8   getParameters() const = 0; 
}; 
class BnCamera: public BnInterface 

public: 
    virtual status_t    onTransact( uint32_t code, 
                                    const Parcel& data, 
                                    Parcel* reply, 
                                    uint32_t flags = 0); 
};

  ICamera.h描述的內容是一個實現Camera功能的接口,其定義如下所示:
在camera類中,主要定義Camera的功能接口,這個類必須被繼承才能夠使用。值得注意的是,這些接口和Camera類的接口有些類似,但是它們并沒有直接的關系。事實上,在Camera類的各種實現中,一般都會通過調用ICamera類的實現類來完成。

  2.5 頭文件ICameraService .h
  ICameraService.h用于描述一個Camera的服務,定義方式如下所示:
class ICameraService : public IInterface 

public: 
    DECLARE_META_INTERFACE(CameraService); 
    virtual sp     connect(const sp& cameraClient) = 0; 
}; 
class BnCameraService: public BnInterface 

public: 
    virtual status_t    onTransact( uint32_t code, 
                                    const Parcel& data, 
                                    Parcel* reply, 
                                    uint32_t flags = 0); 
};

    由于具有純虛函數, ICameraService 以及BnCameraService必須被繼承實現才能夠使用,在ICameraService 只定義了一個connect()接口,它的返回值的類型是sp,這個ICamera 是提供實現功能的接口。注意,ICameraService只有連接函數connect(),沒有斷開函數,斷開的功能由ICamera接口來提供。

  2.6 頭文件CameraHardwareInterface.h

  CameraHardwareInterface.h定義的是一個Camera底層的接口,這個類的實現者是最終實現Camera的。

  CameraHardwareInterface 定以Camera硬件的接口,如下所示:
class CameraHardwareInterface : public virtual RefBase { 
public: 
    virtual ~CameraHardwareInterface() { } 
    virtual sp         getPreviewHeap() const = 0; 
    virtual status_t   startPreview(preview_callback cb, void* user) = 0; 
    virtual void        stopPreview() = 0; 
    virtual status_t   autoFocus(autofocus_callback, 
                                  void* user) = 0; 
    virtual status_t   takePicture(shutter_callback, 
                                    raw_callback, 
                                    jpeg_callback, 
                                    void* user) = 0; 
    virtual status_t   cancelPicture(bool cancel_shutter, 
                                      bool cancel_raw, 
                                      bool cancel_jpeg) = 0; 
    virtual status_t   setParameters(const CameraParameters& params) = 0; 
    virtual CameraParameters  getParameters() const = 0; 
    virtual void release() = 0; 
    virtual status_t dump(int fd, const Vector& args) const = 0; 
};


    使用C語言的方式導出符號:
extern "C" spopenCameraHardware();

     在程序的其他地方,使用openCameraHardware()就可以得到一個 CameraHardwareInterface,然后調用 CameraHardwareInterface的接口完成Camera的功能。


上一篇: Android 一些名詞解釋

下一篇: Android的底層庫libutils介紹

分享到: 更多
重庆时时开奖结果记录现场 pk10滚雪球计划软件 大乐透预测 赌博龙虎牌怎么包赢不输 极速赛车倍投方法 龙虎稳赢的公式方法 利赢棋牌游戏送10元 时时计划群有用吗 亚洲杯女篮比赛直播 马会提供免费精准6码 老重庆时时彩 北京pk赛车全天稳定版 稳中六肖 足球财富 新平台电子送免费彩金不限id 捕鱼赚钱一天5000