先看一下CameraHAL總體的類圖。html
很亂,咱們一塊一塊的看。android
第一部分,CameraAdapter的繼承關係:ide
V4LCameraAdapter:函數
V4LCameraAdapter是處於最底層的類,他負責跟硬件的通信,而且實現了大部分的控制功能。學習
V4LCameraAdapter內部定義了PreviewThread線程。spa
V4LCameraAdapter的mVideoinfo實現了對VideoInfo的引用,而VideoInfo定義了Camera Video的相關信息。線程
BaseCameraAdapter:htm
BaseCameraAdapter實現了MessageNotifier及FrameNotifier的所有接口,及一些不須要與硬件交互的接口。而下列接口都由V4LCameraAdapter實現:blog
takePicture [android::BaseCameraAdapter]
stopImageCapture [android::BaseCameraAdapter]
startBracketing [android::BaseCameraAdapter]
stopBracketing [android::BaseCameraAdapter]
beginAutoFocusThread [android]
autoFocus [android::BaseCameraAdapter]
cancelAutoFocus [android::BaseCameraAdapter]
startSmoothZoom [android::BaseCameraAdapter]
stopSmoothZoom [android::BaseCameraAdapter]
startPreview [android::BaseCameraAdapter]
stopPreview [android::BaseCameraAdapter]
useBuffers [android::BaseCameraAdapter]
fillThisBuffer [android::BaseCameraAdapter]
getFrameSize [android::BaseCameraAdapter]
getFrameDataSize [android::BaseCameraAdapter]
getPictureBufferSize [android::BaseCameraAdapter]
startFaceDetection [android::BaseCameraAdapter]
stopFaceDetection [android::BaseCameraAdapter]
switchToExecuting [android::BaseCameraAdapter]
disableMirror [android::BaseCameraAdapter]繼承
BaseCameraAdapter定義了兩個消息隊列mFrameQ及mAdapterQ,但這兩個消息隊列沒有被使用到。因此,初步推斷,CameraAdapter與其餘線程交互的接口徹底是FrameNotifier的回調函數實現的。在回調函數的實現中會調用到消息隊列,從而達到與其餘線程交互的目的。
現有的理解,須要格外關注的實現是enableMsgType相關的應用,TODO:由此入手,學習AdapterCamera的相關內容:Android CameraHal CameraAdapter相關(1)
CameraAdapter:
CameraAdapter是接口類,成員函數徹底由其子類實現。
另外定義了一些枚舉變量,用於指示狀態,命令類型等:
AdapterActiveStates [android::CameraAdapter]
CameraCommands [android::CameraAdapter]
CameraMode [android::CameraAdapter]
AdapterState [android::CameraAdapter]
第二部分:從線程入手:
右下兩個線程,NotificationThread及DisplayThread,二者都是使用消息隊列實現調用的。
NotificationThread定義在AppCallbackNotifier中,負責與上層應用的交互,主要是消息通知及傳遞Frame等。
DisplayThread定義在ANativeWindowDisplayAdapter中,負責與NativeWindow的交互,負責顯示部分的交互。
而ANativeWindowDisplayAdapter與AppCallbackNotifier則是經過引用FrameProvider實現與CameraAdapter的交互。