Camera API1 相机参数设置流程一 framework层
Camera API1 相机参数设置流程二 hardware层
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 层。