首先,對Camera架構有個大概的認識。 java
Android的Camera架構基本由Camera APP, Application Framework(Camera.java), Camera JNI, MediaFramework(CameraService) , Camera HAL, Camera driver等部分構成。 android
其中CameraService以上部分都基本和硬件沒有關係,Camera HAL如下則和硬件關係比較密切。 架構
總體來看,CameraService的架構屬於Client/Server架構。Camera APP屬於Client端, Camera Service屬於Server端。 Camera App和Camera Service經過IPC調用(Binder傳輸數據), SurfaceFinger和CameraService也是經過IPC調用來實現的。CameraService是運行在MediaServer進程的。SurfaceFlinger也是一個單獨進程。 post
2 Camera.java要點
spa
Camera.java提供了操做Camera的幾大功能: 翻譯
1.open 和 release功能。 對象
2.操縱Camera的參數的功能。 進程
3.Preview功能: 內存
a.將Preview的顯示到屏幕上或者是SurfaceTexture上。 ci
b.獲取Camera preview Frame的callstack
4.Capture
1.onShutter, JPEG, RAW, " PostView"
5. Lock 和Unlock功能
6. Focus,Zoom及FaceDetection功能
幾個輔助小類:
Camera Parameter
camera parameter的設置,包含white balance, color effect, exposure, scene mode, anti-banding, focus mode, preview size, picture size。
Camera.CameraInfo
每一個攝像頭的前置後置信息,Camera 照片的orientation
Camera.Size
Camera 照片的高和寬
Camera.Face
face-id, 左眼,有眼,嘴的座標及超出的區域
Camera.Area
高和寬,Auto Focus, Auto Exposure, Auto White Balance的區域(3A)
Camera JNI的要點
1.建立一個持久的Context用於傳遞Callback從native到Java。
2.持有Java Camera, Face及Area的引用。
3.若是APP請求傳遞Preview Frame的Copy, 完成 native到Java的 Buffer copy。
4. 從Java Memory Heap分配JPEG照片的內存。
CameraService的要點
1.管理 Camera硬件資源
2.運行在MediaServer進程中
3.是一個SharedLibrary libCameraService.so
主要功能:
a android.permissions.Camera的檢查
b 確保只有一個Client 連接到一個Camera硬件對象
c 確保進程鏈接到一個Camera硬件對象
d 返回Callback給APP層
e 經過Binder訪問
f 可用的攝像頭個數
g Camera攝像頭信息細節
本文基本屬於對exposing the android camera stack一文的部分翻譯,因爲本文是後續文章的基礎。所以載於此。在這裏感謝原文做者的PPT,總結架構確實挺好。
英文原版見:https://thenewcircle.com/s/post/1268/Exposing_the_Android_Camera_Stack.pdf