[Android O] HAL3 之 Open Camera2 流程(三,完结)—— 从 HAL Service 到 Camera HAL

相关文章


打开相机流程中,从 APP 到 CameraService 再到 HAL Service 的连路创建流程都已经简略分析了一遍。现在需要分析最后的阶段,即从 HAL Service 连接到 Camera HAL 的部分。
其实 HAL 层真正的运作流程我也还没真正弄清楚,好在现在只需要分析它的构造与初始化部分,这相对来说还是比较简单的。

在 HAL3 中,Camera HAL 的接口转化层(以及流解析层)由 QCamera3HardwareInterface 担当,而接口层与实现层与 HAL1 中基本没什么差别,都是在 mm_camera_interface.cmm_camera.c 中。

那么接口转化层的实例是何时创建的,又是怎么初始化的,创建它的时候,与接口层、实现层又有什么交互?通过下图展示的主要调用流程可以简单了解了解。
@图. HAL Service 到 CameraHAL 的调用流程

接下来可以看看代码流程。

HAL Service

CameraModule

文件路径:hardware\interfaces\camera\common\1.0\default\CameraModule.cpp

上回说到,CameraDevice::open 的实现中,调用了 mModule->open,即 CameraModule::open。来看看它的具体实现。

通过代码来看,它做的事并不多,主要是调用 mModule->common.methods->open,来进入下一层级的流程。
而这里则需要注意了,open 是一个函数指针,它指向的是 QCamera2Factory 的 camera_device_open 方法,至于为什么和 QCamera2Factory 有关,这就要回头看 HAL Service 的启动初始化流程了。对我来说这不重要,就不赘述了。

int CameraModule::open(const char* id, struct hw_device_t** device) {
    int res;
    ATRACE_BEGIN("camera_module->open");
    res = filterOpenErrorCode(mModule->common.methods->open(&mModule->common, id, device));
    ATRACE_END();
    return res;
}

Camera HAL

QCamera2Factory

文件路径:hardware\qcom\camera\qcamera2\QCamera2Factory.cpp

省略一些不关心的内容,这里实际上做的事也不多。
- 首先注意第 31~33 行,这里就将前面所说的 open 函数指针指定为了 camera_device_open 这个方法。
- 第 22~27 行,注意到这里通过宏定义添加了对 HAL1 的兼容操作。实际上是要调用 cameraDeviceOpen 来进行下一步操作。

/*===========================================================================
 * FUNCTION   : camera_device_open
 *
 * DESCRIPTION: static function to open a camera device by its ID
 *
 * PARAMETERS :
 *   @camera_id : camera ID
 *   @hw_device : ptr to struct storing camera hardware device info
 *
 * RETURN     : int32_t type of status
 *              NO_ERROR  -- success
 *              none-zero failure code
 *==========================================================================*/
int QCamera2Factory::camera_device_open(
    const struct hw_module_t *module, const char *id,
    struct hw_device_t **hw_device)
{
    /* Do something in */
    ......
    /* Do something out */

#ifdef QCAMERA_HAL1_SUPPORT
    if
  • 10
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
相机API2的拍照流程与拍摄RAW照片的流程类似,也涉及到应用层(app)、框架层(framework)和硬件抽象层(HAL),下面是在这个层面上使用相机API2拍照的流程: 1. 应用层(app):应用程序使用相机管理器(CameraManager)打开相机设备,并创建一个用于拍照的会话。 2. 框架层(framework):框架层的相机服务(CameraService)接收应用程序的请求,并与相机驱动程序(camera HAL)进行通信,以控制相机硬件。 3. 硬件抽象层(HAL):相机HAL模块接收来自框架层的请求,并通过与相机硬件的驱动程序进行通信,以控制相机硬件。 4. HAL接收请求:当应用程序发起拍照请求时,请求会被传递到相机HAL模块,即app-fw-hal。 5. HAL配置相机:相机HAL模块会根据请求设置相机的参数,例如曝光时间、ISO等参数。 6. HAL拍照:相机HAL模块通过相机驱动程序控制相机硬件进行拍照操作。 7. HAL输出数据:当拍摄完成后,相机HAL模块将拍摄的JPEG数据传递给框架层。 8. 框架层输出数据:框架层的相机服务将拍摄的JPEG数据传递给应用程序,应用程序可以在该数据上进行后续的处理操作。 9. 应用层处理数据:应用程序可以将JPEG数据保存到文件系统中,或者进行其他的处理操作。 以上就是在相机API2的个层面上拍照的流程,其中app-fw-hal作为相机HAL模块提供了应用程序、框架层和相机驱动程序之间的接口。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值