Android Camera架构分析
源代碼版本:allwinner 4.0.4
frameworks代碼:
frameworks/base/core/java/Android/hardware/Camera.java
JNI層代碼:
frameworks/base/core/jni/android_hardware_Camera.cpp
client端代碼:
frameworks/base/libs/camera/
server端代碼:
frameworks/base/services/camera/libcameraservice/
HAL層代碼:
device/softwinner/common/hardware/camera/
camera配置文件:
system/etc/ camera.cfg
先從應用程序open camera分析,其調用流程如下圖:
? ? ? ? 圖中,JNI的Camera::connect函數通過跨進程調用,服務端CameraService會創建Client實體BnCamera, 并且經過binder轉換,返回給JNI connet函數一個BpCamera代理,有了這個代理,就可以遠程調用CameraService內嵌類client的方法,如startPreview,autoFocus等等;
? ? ? ? 并且,Camera::connect將Camera對象作為參數傳遞給服務端,Camera類繼承自BnCameraClient,所以JNI 端Camera自身也創建了BnCameraClient實體,跨進程后,CameraService獲得其代理BpCameraClient,有了這個代理,服務端就可以回調Camera端的notifyCallback,dataCallback,dataCallbackTimestamp等方法。在這種情景下,可以把CameraService視為客戶端,而Camera則為服務端。
? ? ? ?framework層的調用流程大概就如上所述,HAL層是廠商自己實現的,不同方案代碼結構各有不同,這里分析的是allwinner的源代碼。接著以startPreview為例子,看framework層是如何調用HAL層的。調用流程如下圖所示:
對上述圖中簡要說明幾點:
? ? ? ? 1. framework的幾個callback函數在構造函數初始化時候就已經注冊到了HAL中,以實現HAL層有數據時候回調framework, 最終framework回調app中的注冊函數
? ? ? ? 2.?CameraHardware類在初始化時候開啟了DoCommandThread和DoAutoFocusThread線程,用來監聽上層的命令和動作,前者監聽如設置攝像頭的白光平衡,曝光度,快門模式等;后者用來監聽自動對焦命令。
? ? ? ? 3.?doStartPreview最終會調用V4L2Camera類的startWorkerThread來啟動線程,該線程實現方法在V4L2CameraDevice類的inWorkerThread函數。該函數首先調用ioctl(mCamFd, VIDIOC_DQBUF, buf)獲取圖像數據,并將數據進行格式轉換和大小縮放。最后用OSAL_Queue方法將數據入隊列并發出通知信號。
? ? ? ? 4.??V4L2CameraDevice類的previewThread線程收到信號,調用onNextFrameCB,回調framwork函數將數據返回上層;并調用onNextFramePreview將數據在窗口中進行預覽,這就是打開攝像頭看到的預覽圖像。
? ? ? 其他流程如takePicture,startRecording等和上述差不多,下面給出takePicture的流程圖,其它不再重述。
最后看應用層調用takePicture拍照時候的數據回調過程。
應用層拍照的調用函數是?camera.takePicture(shutterCallback, rawCallback, jpegCallback);
shutterCallback類要實現Camera.ShutterCallback接口;?rawCallback, jpegCallback類要實現Camera.PictureCallback接口,他們的一般形式如下:? ? ?
[cpp]?view plaincopy
[cpp]?view plaincopy
而 rawCallback則為返回未壓縮的數據,一般用不上。
其framework層的回調過程如下圖:
前面已經分析,hal層取得數據后回調了cameraservice的dataCallback方法和notifyCallback方法;經過binder跨進程,回調Camera端的對應方法。
? ? ? ? 1. 在JNI中,包含了一個內部類JNICameraContext,其繼承自CameraListener并實現了其notify,postData和postDataTimestamp方法。在camera初始化的時候android_hardware_Camera_native_setup方法中就已經為mListener賦值了一個JNICameraContext對象。Camera類就是通過listener->postData,listener->notify等方法調用JNICameraContext類的實現方法;JNICameraContext用env->SetByteArrayRegion(obj, 0, size, data)創建空間保存壓縮過的JPEG格式圖片,再通過CallStaticVoidMethod回調framework中Camera.java中的方法。
? ? ? ? 2. 在Camera.java中通過EventHandler類的handleMessage來處理JNI回調的方法,swith根據參數的不同,回調APP中相應的方法,而這些方法正是是APP當初在takePicture時候傳進來的。
? ? ? ? 通過上述流程就實現了數據從HAL層到APP層的回調過程。
原文地址:http://blog.csdn.net/lushengchu_luis/article/details/11033095
總結
以上是生活随笔為你收集整理的Android Camera架构分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Camera服务之--架构浅析
- 下一篇: Android Camera 系统架构源