Android 高通Camx架构学习(初篇)

  一篇关于高通Camx架构介绍的文章,我会尽自己能力尽可能讲多点,讲的通俗明白点。我们先来看下camx整体的架构图:

  一、Camx整体架构图
  目前Android主流的机型,采用高通芯片的,使用的基本都是camx架构。
  之前旧的架构叫做mm-camera,camx架构和之前架构的主要区别是芯片接口层的代码从hardware/qcom迁移到 vendor/qcom/proprietary/下面。
  高通camx架构图从上图我们可以看到,在hal层,高通是结合自己的芯片硬件,添加了一层逻辑,这层逻辑高通内部命名为camx架构。
  下面我们来看下高通camx架构上,camera数据流向大体上是怎样的?高通camera数据处理流向
  从上图我们可以清晰的看到,Camera数据从sensor出来,首先会经过IFE,然后分预览/视频和拍照2种情况。如果是预览或者录像,是先经过IPE处理,最后输出到显示。如果是拍照,则是先经过BSP处理,然后再经过JPEG编码器,最后保存为图片输出。
  IFE、IPE、BPS、JPEG,它们表示的是芯片内部的一个硬件处理单元,数据在这些单元内部的处理还是比较复杂的,在不同的处理单元里面,会进行一些复杂的算法处理,这里大家先有个认识,有个基本概念。
  IFE:图像前端
  IPE:图像处理引擎
  BPS:Bayer 处理区段复制代码
  二、Camx基本组件及其概念
  一个架构总是由一些基本组件构成的,接下来我们来了解下构成camx架构的基本组件有那些。
  1) UseCase
  A set of streams configured by the client combined with a set of static
  properties specifying the processing of those streams
  (由客户端配置的一组流,这组流是有着一系列静态属性相结合描述的流。)
  See createCaptureSession in the Android CameraDevice documentation复制代码
  See createCaptureSession in the Android CameraDevice
  那我们结合下面这段代码来好好理解下。
  熟悉Camera2 API的小伙伴(不熟悉也没关系,我会讲的明白点)应该知道,下面的这段代码,是把预览的surface和录像的surface都设进去,然后去创建session,就是表示我预览和录像都需要拿到camera数据。假设我预览设置的size是1080 x 720,录像是1080p的,那这个1080 x 720预览+1080p录像就是一个usecase(用例)。其它类推。
  //UseCase: 预览+录像
  List surfaces = new ArrayList<>();
  if(previewSurface != null && previewSurface.isValid()){
  surfaces.add(previewSurface);
  mPreviewBuilder.addTarget(previewSurface);
  }
  if(mMediaRecorder != null && mMediaRecorderSurface != null
  && mMediaRecorderSurface.isValid()){
  surfaces.add(mMediaRecorderSurface);
  mPreviewBuilder.addTarget(mMediaRecorderSurface);
  }
  mCameraDevice.createCaptureSession(surfaces,…,…);复制代码
  UseCase在camx中很有很多衍生类,这是camx针对不同的stream来建立不同的usecase对象,用来管理选择feature,并且创建 pipeline以及session。
  UseCase衍生类
  2)Feature
  代表一个特定的功能。高通上的feature有HDR(高动态范围)、SuperNight(超级夜景)、MFNR(多帧降噪)等等,usecase选择相应的feature,然后关联一组pipeline,上层下发request请求,hal层会根据request去选择对应的feature。Feature类图
  3)Node
  Node是单个具有独立处理功能的抽象模块,可以是软件单元也可以是硬件单元。Node是camx中非常重要的一个父类,是处理camera 请求的一个中间节点,用于处理pipeline下发的请求。
  Node 节点在camx chi架构中至关重要,数据的处理都是通过封装好的Node节点来进行的。
  node节点
  4) pipeline
  一连串node的集合。pipeline提供单一特定功能的所有资源集合,维护着所有硬件资源以及数据的流转。
  5)session
  若干个有关联的pipeline的集合,用于管理pipeline的抽象控制单元,其中至少包含一个pipeline,并控制着所有的硬件资源,管控着每个pipeline内部的request流转以及数据的输入输出。
  6)Link
  定义不同的Port的连接端口(输入端口和输出端口)。
  7) Port
  作为Node的输入输出端口,使用SrcPort以及DstPort结构定义XML文件。
  image.png
  8)Topologies
  A topology is a directed acyclic graph (DAG) specifying an instantiation of
  a use case
  (拓扑是一个指定用例实例化的有向无环图(DAG))
  XML definition of use cases and associated topologies
  For CamX, this graph defines the HW, SW, and non-Qualcomm processing nodes,
  and the data flow between the nodes复制代码
  组件之间的关系
  最后来总结下各个基本组件之间的关系。上层根据需求,config对应的stream下来,下面会根据申请的stream来选择对应的usecase,usecase选择完成后,又会去选择需要的feature,然后不同的feature会去关联对应的pipeline。我们知道pipeline是由一系列node组成的,那最终上层config的stream,就会交由各个node去处理。

请使用浏览器的分享功能分享到微信等