Camera API2 FWK open流程

01d6289fcedd32a4ad7d4cbcc210a05e.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、前言
二、frameworks openCamera流程
2.1 openCamera详细流程讲解
2.1.1 CameraManager流程
2.1.2 CameraService流程
2.1.3 CameraDeviceClient
2.1.4 Camera2ClientBase
2.1.5 Camera3Device
2.1.6 CameraProviderManager
2.2 厂商CameraDevice实现

一、前言

本文主要介绍基于Android Camera API2的frameworks openCamera流程。

二、frameworks openCamera流程

frameworks openCamera流程图如图2.1。图2.1包含了openCamera的主要流程,通过Binder通讯,实现了Camera API2的openCamera接口到libacameraservice的跨进程调用。

d402ce8ea66b4cfec03cc05f284f6ef3.jpeg

图2.1 openCamera流程图

2.1 openCamera详细流程讲解

0a6f01117cc5433fc306d831508a79ff.jpeg

图2.1 frameworks openCamera流程图

图2.1 是frameworks openCamera流程图,主要流程是Camera API2应用层接口到libcameraservice的流程。Camera API2应用层部分是CameraManager,libcameraservice包含了CameraService、CameraDeviceClient、Camera2ClientBase、Camera3Device、CameraProviderManager。详细流程如下。

2.1.1 CameraManager流程

path:frameworks/base/core/java/android/hardware/camera2/CameraManager.java

相关流程:opencamera -> openCameraForUid -> openCameraDeviceUserAsync

openCameraDeviceUserAsync关键方法:

671      private CameraDevice openCameraDeviceUserAsync(String cameraId,
672              CameraDevice.StateCallback callback, Executor executor, final int uid,
673              final int oomScoreOffset) throws CameraAccessException {
             ......
693              try {
694                  ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
695                  if (cameraService == null) {
696                      throw new ServiceSpecificException(
697                          ICameraService.ERROR_DISCONNECTED,
698                          "Camera service is currently unavailable");
699                  }
                     //cameraUser就是mRemoteDevice
700                  cameraUser = cameraService.connectDevice(callbacks, cameraId,
701                      mContext.getOpPackageName(),  mContext.getAttributionTag(), uid,
702                      oomScoreOffset, mContext.getApplicationInfo().targetSdkVersion);

mRemoteDevice是CameraDeviceClient,获取mRemoteDevice用于后续CameraDeviceClient的配流(createStream),起预览(submitRequestList)。

2.1.2 CameraService流程

path:xref: /frameworks/av/services/camera/libcameraservice/CameraService.cpp

由于openCamera需要获取mCameraProviderManager对象用于通知Camera hal打开camera,因此CameraService首先需要初始化mCameraProviderManager。

mCameraProviderManager初始化流程:CameraService的超级类(所有类的父类)是RefBase,实例化的时候会调用onFirstRef()函数,在onFirstRef()函数中会调用enumerateProviders()实例化mCameraProviderManager ,并执行mCameraProviderManager初始化。

相关流程:onFirstRef ->enumerateProviders -> new CameraProviderManager

202  status_t Camera
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值