Android Camera API2架构和流程介绍

目录

一、简介

二、Camera API2 架构

        2.1 Camera应用框架

        2.2 Camera AIDL

        2.3 Camera Native 框架

        2.4 Camera binder IPC 接口

        2.5 CameraService

        2.6 Camera HAL

三、Camera API 2 操作流程

3.1 Camera参数获取操作

3.2 openCamera操作

3.3 CreateCaptureSession

3.4 request下发(起预览、拍照等操作)

3.5 Camera Hal回帧

四、参考


一、简介

        Camera API 2 (下面用Camera2简称)是最新的 Android 相机框架 API,它取代了已弃用的相机框架库(Camera API 1)。 Camera2 为复杂的用例提供深入的控制,但需要用户管理特定于设备的配置。用户可以在相应的参考文档中了解 Camera2 中的特定类和函数。总体上Camera遵循Client-Server架构,通过Binder通讯完成Camera APP -> Camera API2 -> CameraService -> Camera Hal流程。

二、Camera API2 架构

        图2.1描述了Camera整体软件架构。

图2.1 Camera软件架构

        Camera软件架构图从上到下可分为Camera应用框架、Camera AIDL、Camera Native 框架、Camera binder IPC 接口、Camera HAL六大部分。

        2.1 Camera应用框架

        Camera应用框架是Camera APP代码,它使用 Camera2 API 与Camera硬件进行交互,交互过程中会调用相应的 Binder 接口,以访问与Camera底层交互的原生代码。

        Camera API2中CameraManager用于openCamera、CameraDevice用于创建CameraCaptureSession(配流)。

        2.2 Camera AIDL

        Camera AIDL接口是Camera API2与CameraService的连接桥梁,与 CameraService关联的 binder 接口可在frameworks/av/camera/aidl/android/hardware中找到。生成的代码会调用Camera hal的原生代码以获取对实体Camera的访问权限,并返回用于在框架级别创建  CameraDevice并最终创建 CameraCaptureSession对象的数据。

        2.3 Camera Native 框架

        此框架位于 frameworks/av/中,并提供相当于 CameraDevice和 CameraCaptureSession类的原生类,另请参阅 NDK camera2 参考。Camera Native框架包含了CameraService、Camera metadata等

        2.4 Camera binder IPC 接口

        IPC binder 接口用于实现跨越进程边界的通信。调用相机服务的若干个相机 binder 类位于 /frameworks/av/camera/aidl/android/hardware/目录中。

  • ICameraService 是相机服务的接口
  • ICameraDeviceUser 是已打开的特定相机设备的接口
  • ICameraServiceListener 和 ICameraDeviceCallbacks 分别是对应用框架的 CameraService 和 CameraDevice 回调接口

        2.5 CameraService

        路径: frameworks/av/services/camera/libcameraservice/CameraService.cpp ,相机服务是与 HAL 进行互动的实际代码

        2.6 Camera HAL

        硬件抽象层定义了由相机服务调用、且您必须实现以确保相机硬件正常运行的标准接口。

三、Camera API 2 操作流程

图 3.1 Camera API 2 操作流程

        Camera API2的核心操作流程如图3.1。从左到右分为三个模块,分别是Camera APP、Camera2 API、Camera Device HardWare(由Camera hal控制)。

        下面简要介绍Camera API2操作流程:

3.1 Camera参数获取操作

        当app调用 Context.getSystemService()获得CameraManager后。其一,需要通过CameraManager对象注册Camera可用的回调(AvailabilityCallback),用于判断Camera是否可用,可用的状态下才执行CameraManager.openCamera操作;其二,需要通过getCameraIdList获取可用的Camera逻辑id;其三,通过getCameraCharacteristics获取Camera Characteristic信息,如Camera尺寸,3A参数等描述CameraDevice的信息。

3.2 openCamera操作

        CameraManager.openCamera用于打开相机,openCamera成功会返回CameraDevice,失败会返回错误码。详见/frameworks/base/core/java/android/hardware/camera2/CameraDevice.java,app侧可通过重写的 CameraDevice.StateCallback 的 onOpened、onDisconnected、onError 方法得知当前 CameraDevice 的状态。

        openCamera简要流程:CameraManager.openCamera - > CameraService.connectDevice -> CameraManagerProvider.openSession -> Camera hal openCamera。

3.3 CreateCaptureSession

        CameraDevice.CreateCaptureSession就是配流的操作,一般配置预览、拍照、录像流,对应的surface有surfaceview或者surfaceTexture、imageReader创建的surface、MediaRecorder;配流会配置设置默认的CaptureRequest模板参数,如预览的CameraDevice.TEMPLATE_PREVIEW,录像的CameraDevice.TEMPLATE_RECORD,拍照的CameraDevice.TEMPLATE_STILL_CAPTURE。配流可以理解为配置流的输出容器,以Camera hal为buffer的生产者,那么就是配置outConfigurations。

        CreateCaptureSession简要流程:CameraDevice.CreateCaptureSession -> CameraDeviceImpl.createStreams -> CameraDeviceClient.mHidlSession.configureStreams -> Camera hal configureStreams。

3.4 request下发(起预览、拍照等操作)

        request下发是是processCaptureRequest流程。配流完成后,通过CameraCaptureSession.StateCallback可以获取CameraCaptureSession对象用于后续的起预览(setRepeatingRequest)、拍照或者对焦(capture)、停预览(stopRepeating)、关相机操作(abortCaptures)等操作,这些操作都是通过下发request或者移除request实现,其中,预览request连续的,拍照的request是单一的,预览和拍照的request都会放到队列中,然后下发到camera hal。app只需通过setRepeatingRequest下发预览的request,而预览request的循环下发在/frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp的RequestThread:threadloop中完成,预览轮转buffer个数是4。

        值得注意的是:拍照的优先级高于预览的优先级,如果预览的过程中收到拍照的请求,会以插队的形式将拍照的请求查到队列中。       

3.5 Camera Hal回帧

        Camera Hal回帧是processCaptureResult流程。processCaptureResult流程是camera hal buffer和参数回调的过程。大致流程是:其一,Camera hal将预览帧或者拍照帧的buffer填充到app配流的surface中,如果时预览帧,surface通过queen buffer形式消费buff;如果是拍照帧,拍照的buffer返回给app,app做图片保存。其二是。Camera hal将处理的预览帧和拍照帧的参数信息通过metadata返回给app。

        Camera API2关键操作流程见图 3.2 。

图 3.2 Camera API2关键操作流程

四、参考

        https://source.android.google.cn/docs/core/camera?hl=enhuoqhuo'q

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在三星 Android Camera 驱动中,ISP(Image Signal Processor,图像信号处理器)驱动的架构通常可以分为以下几个部分: 1. Sensor Driver:该部分驱动程序负责与摄像头传感器进行通信,读取从传感器中采集的原始图像数据,并将其传递给 ISP 驱动程序进行处理。在 Android Camera 驱动中,Sensor Driver 通常由 HAL 层实现,具体实现方式可能会因不同的设备而有所不同。 2. ISP Driver:该部分驱动程序通常由 SoC(System on Chip,芯片系统)供应商提供,用于控制和配置 ISP 芯片,处理从传感器中读取的原始图像数据,并将其转换为可用于显示或保存的图像数据。ISP Driver 通常会包含多个模块,如 ISP Driver Core、AWB(Auto White Balance,自动白平衡)模块、AF(Auto Focus,自动对焦)模块、AE(Auto Exposure,自动曝光)模块、NR(Noise Reduction,降噪)模块等。 3. HAL(Hardware Abstraction Layer):该部分是 Android Camera 驱动程序的一个重要组成部分,负责将 Android 系统的请求与底层硬件进行交互,实现对摄像头的控制和图像处理。在 ISP 驱动中,HAL 层通常会将请求传递给 ISP Driver,控制和配置 ISP 芯片,并对处理后的图像数据进行进一步处理和传递。 4. Camera Application:该部分是 Android 系统中用于控制和管理摄像头的应用程序。Camera Application 通常会使用 Android API 接口与 HAL 层进行交互,从而实现对摄像头的控制和图像采集。Camera Application 可以使用预览模式、拍照模式、录像模式等多种模式进行操作,并可以对图像数据进行进一步处理和保存。 总体来说,ISP 驱动是 Android Camera 驱动中一个非常重要的组成部分,负责处理从摄像头传感器中采集的原始图像数据,并将其转换为可用于显示或保存的图像数据。ISP 驱动通常由 Sensor Driver、ISP Driver、HAL 和 Camera Application 四个部分组成,每个部分都具有不同的功能和责任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值