Camera API1 相機參數設置流程一 framework層

Android P Camera API1 是基於 API2 新框架做的兼容。

Camera 參數的傳輸:APK -> CameraServer -> camerahalserver -> kernel driver ->  cameraDevice

Package

APK發送相機參數

Camera.Parameters parameters = mCamera.getParameters();
parameters.set(…, …);

 

Framework

一 java

frameworks/base/core/java/android/hardware/Camera.java

Camera.java 是跨語言的核心文件。

Camera.Parameters.set 方法調用 Camera.Parameters.put 方法, 在 put 方法中調用 mMap 保存待發送的 camera 參數。

打印系統日誌, 過濾出 camera parameter 的日誌

MtkCam/ParamsManager: fb-enlarge-eye=0;fb-enlarge-eye-max=4;fb-enlarge-eye-min=-4;fb-extreme-beauty=false;fb-face-pos=-2000:-2000;fb-sharp=0;fb-sharp-max=12;fb-sharp-max-values=12;fb-sharp-min=-12;fb-sharp-min-values=-12;fb-skin-color=0;fb-skin-color-default=9;fb-skin-color-max=12;fb-skin-color-max-values=12;fb-skin-color-min=-12;fb-skin-color-min-values=-12;fb-slim-face=0;fb-slim-face-max=12;fb-slim-face-max-values=12;fb-slim-face-min=-12;fb-slim-face-min-values=-12;fb-smooth-level=0;fb-smooth-level-default=3;fb-smooth-level-max=12;fb-smooth-level-max-values=12;fb-smooth-level-min=-12;fb-smooth-level-min-values=-12;fb-touch-pos=-2000:-2000;first-preview-frame-black=0;flash-duty-max=1;flash-duty-min=0;flash-duty-value=-1;flash-mode=off;flash-mode-values=off;flash-step-max=0;

 

在  Camera.Parameters.flatten 中組裝成上述日誌的樣式,在 Camera.setParameters 中下發參數到  native_setParameters  中處理。接下來進入熟悉 native  C/CPP 空間 。

 

二 native 層

frameworks/base/core/jni/android_hardware_Camera.cpp

JNI 接口方法 andriod_hardware_Camera_setParameters

frameworks/av/camera/Camera.cpp

調用  camera interface 發送相機參數

frameworks/av/camera/CameraBase.cpp

frameworks/av/services/camera/libcameraservice/CameraService.cpp

Camera 如何連接到 Cameraserver 建立 binder 通信,詳見: 《 CameraService 和 Client 鏈接到 HAL

Camera API2 有所不同,整理好思路後,抽空寫 Camera API2 <--> HAL3 的流程。

如下 CameraBase, 成員函數 connect 中的 asBinder 使用binder實現client <--> server 跨進程通信。 

frameworks/av/services/camera/libcameraservice/api1/Camera2Client.cpp

status_t Camera2Client::setParameters(const String8& params)

frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.cpp

status_t Parameters::set(const String8& paramString)

frameworks/av/services/camera/libcameraservice/device1/CameraHardwareInterface.cpp

sp<hardware::camera::device::V1_0::ICameraDevice> mHidlDevice;

HIDL 全稱是 Hardware Interface Definition Language。目的是使 Android 可以在不重新編譯 HAL 的情況下對 Framework 進行 OTA 升級。詳見:《Android HIDL 簡介

如下代碼是 Camera HAL3 中兼容 HAL1 接口。 詳見: 《Treble 框架下的 Android Camera HAL3 一

至此進入 Camera HAL 層。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章