当前位置: 代码迷 >> 综合 >> Camera API1 相机参数设置流程一 framework层
  详细解决方案

Camera API1 相机参数设置流程一 framework层

热度:79   发布时间:2023-12-29 09:16:30.0

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 层。

  相关解决方案