三、CameraService总流程

CameraService之服务流程图
一、CameraService启动流程
二、CameraProvider启动流程
三、CameraService总流程

1、Camera provider启动

camara provider 服务启动,等待上层调用它
camara provider在启动的时候,就已经调用了自己的initialize()函数

2、camera service 启动

camera service 启动,最后会调用到 CameraProviderManager::initialize–>providerInfo→initialize();
frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp

status_t CameraProviderManager::ProviderInfo::initialize()
{
    //往camera provider设置 回调,当 cameraprovider 收到 camera device status发生改变时,
    //会回调 CameraProviderManager::ProviderInfo::cameraDeviceStatusChange()函数
    //mInterface = ICameraProvider
    hardware::Return<Status> status = mInterface->setCallback(this);
    //接口来进行设备的枚举,其实这里并没有调用到具体的设备相关的HAL3内部,因为在provider初始化的的时候,
    //已经调用过了,这里只是把provider里面保存的camera list返回给上层的framework
    mInterface->getCameraIdList;
     
    当底层发生camera 状态变化时,会回调 到 上层的 CameraProviderManager::ProviderInfo::cameraDeviceStatusChange
    -->addDevice(cameraDeviceName, newStatus, &id);-->initializeDeviceInfo-->mInterface->getCameraDeviceInterface_V3_x//又回到camera provider中去了
}

3、新建CameraDevice

hardware/interfaces/camera/provider/2.4/default/CameraProvider.cpp

Return<void> CameraProvider::getCameraDeviceInterface_V3_x()
{
    sp<android::hardware::camera::device::V3_2::implementation::CameraDevice> deviceImpl =
                    new android::hardware::camera::device::V3_2::implementation::CameraDevice(
                    mModule, cameraId, mCameraDeviceNames);
}

4、打开Camera Device

CameraProviderManager调用CameraProviderManager::openSession函数–>deviceInfo3->mInterface->open–>这样的话就顺利的调到了
hardware/interfaces/camera/device/3.2/default/CameraDevice.cpp中的open函数
hardware/interfaces/camera/device/3.2/default/CameraDevice.cpp

CameraDevice::open
    //1 open CameraModule
    status_t res;
    ATRACE_BEGIN("camera3->open");
    res = mModule->open(mCameraId.c_str(),
               reinterpret_cast<hw_device_t**>(&device));
 
    //2 create createSession
    session = createSession(device, info.static_camera_characteristics, callback);

5、CameraModule::open

4 中的mModule 为 const sp mModule
hardware/interfaces/camera/common/1.0/default/CameraModule.cpp

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层了,比如海思,MTK,Amlogic等,每一个平台实现的方式不一样,但是android的调用流程,调用到这一步都一样的

6、创建会话

camera3_device_t *device;
session = createSession(device, info.static_camera_characteristics, callback);

以下的函数功能 对上:通过binder通信,接口送到了 frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp,拿到ICameraDeviceSession
即可调用到 hardware/interfaces/camera/device/3.3/default/CameraDeviceSession.cpp
对下:session调用到各个平台的 camera实现中去了
上层调用CameraProviderManager::openSession时候 得到了Session的 Bp代理,然后通过Bp调用到 Bn
soong/.intermediates/hardware/interfaces/camera/device/3.3/android.hardware.camera.device@3.3_genc++/gen/android/hardware/camera/device/3.3/CameraDeviceSessionAll.cpp

///hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.cpp
mDevice->ops->process_capture_request
mDevice->ops->flush(mDevice);
mDevice->ops->initialize(mDevice, this);
mDevice->ops->dump(mDevice, fd->data[0]);
mDevice->ops->construct_default_request_settings(mDevice, (int) type);
mDevice->ops->configure_streams(mDevice, &stream_list);

7、业务逻辑处理

使用刚刚创建好的session进行具体的业务逻辑处理

1.framework 通过ICameraDeviceSession::configureStreams() 接口来向设备相关的HAL层传递用户所需的stream配置,同时HAL内部会根据传递下来的stream来选择具体的业务进行配置

2.framework 通ICameraDeviceSession::constructDefaultRequestSettings()接口来获取一个默认的具体业务场景配置,这个操作可以在ICameraDevice::open()之后的任何时刻执行

3.framework使用上面构建的默认setting,再左以自己需要的特殊配置,然后发送第一个request 请求到HAL 里面去,这个request里面必须包含至少一个之前配置好的stream(没错,他们的地址必须相同,不能够使用copy的方式重新建立一个stream,并且这个stream地址与使用 由framework & app去维护),因为要输出buffer给framework那边,上面的request使用ICameraDeviceSession::processCaptrueRequest()进行转换,HAL内部需要阻塞本次request请求,直到准备好接受下一个request的时候返回

4.framework 持续调用ICameraDeviceSession::processCaptureRequest()进行 request的下发,如果需要切换其他场景的话,再次调用 ICameraDeviceSession::constructDefaultRequestSetting()进行具体场景的默认setting构建
5.当本次request 开始被HAL正式执行的时候,也就是HAL低下的硬件sensor开始曝光本帧的时候,HAL需要调用framework实现的ICameraDeviceCallback::notify()函数进行SHUTTER消息回调,这个消息里面包含了时间戳数据 和frame number,这个是HAL层主动发起的回调,但是不需要再第一个request下发下去之前就开始回调,并且一个request的notify完成之前,不要返回任何result给到framework

6.经过几个pipeline延迟之后,HAL开始向framework返回已经完成的结果,返回过程通过ICameraDeviceCallback::processCaptureResult()函数完成,返回的顺序按照提交request的顺序来,request也可以一次性下发多个,数量取决于队列深度,一般6~8个

上面的过程 会一直循环,等到 特定的时刻,会发生下面的事情
1.framework停止下发request请求,然后等待所有的buffer被填充完毕,且所有的result全部返回,这个时候再次调用ICameraDeviceSession::configureStream() 接口重新配置业务流,这个在HAL内部会导致整个硬件被重置一遍,然后用新的stream重新配置,继续上面的循环,----说白了就是场景切换,比如从拍照 切换到了录像(不关闭camera app)

2.framework可能会调用ICameraDeviceSession::close()接口结束整个会话,该函数可以在任何时候调用,但是framework在调用该函数的时候,不可以继续下发request,并且所以的函数调用不能够进行下去,在close函数返回之后,HAL层不得再回调framework的函数,其实在close之前,通常会有flush函数调用,这个函数的调用与close差不多,close可以认为是一个收尾动作,flush会等待所有的request完成并且所有的result全部返回到framework

3.当发生错误或者其他异步事件的时候,HAL必须调用
ICameraDeviceCallback::notify()函数来返回错误消息给framework.如果HAL内部发生了严重的设备错误,HAL内部在回复完错误消息之后需要按照close函数被调用时候的动作来清理案发现场,同时在调用notify之前,也应该停止所有的尚在队列中的request请求响应,严重错误传递给framework的时候,HAL不再返回任何结果给framework,并且在framework尝试调用close的时候需要返回 ENODEV 或者 NULL。
以上的流程 比较关键的几个点:
(1) 设备枚举
(2) session创建
(3) stream配置,request构建与下发
(4) result返回 notify事件回调
(5) 清理现场

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Android 系统中,Camera 的整体流程中,service、client、device 者之间的关系如下: 1. ServiceCamera ServiceAndroid 系统提供的一个基础服务,用于管理所有的 Camera 设备。Service 负责与 Camera HAL 通信,提供对 Camera 设备的访问接口,同时管理 Camera 设备的连接和断开。 2. Device:Camera Device 是 Camera HAL 层的一个抽象概念,代表了一个物理上的 Camera 设备。Device 负责管理 Camera 设备的各种状态和属性,比如打开和关闭 Camera、设置 Camera 的参数、获取 Camera 的预览帧等。 3. Client:Camera Client 是 Android 应用程序中使用 Camera 设备的主要接口。Client 通过 Camera Service 来获取 Camera 设备的访问权限,并与 Camera Device 进行交互,实现各种功能,比如拍照、录像、预览等。 在 Camera 的整体流程中,Service 作为中间人,连接 Client 和 Device,协调二者之间的交互。Client 通过 Service 获取 Camera 设备的访问权限,并向 Service 发送请求,Service 再将请求转发给对应的 Camera Device,Device 处理完请求后将结果返回给 ServiceService 再将结果返回给 Client。 ### 回答2: 在camera的整体流程中,service、client、device者之间的关系如下: 首先,service (服务) 是整个系统的核心部分,负责与底层硬件设备进行交互,处理图像捕获、处理和存储等任务。它接收来自client和device的请求,并将捕获的图像传送给client。 其次,client (客户端) 是用户与系统交互的界面,通过调用service提供的接口来发送指令、请求图像或控制摄像机操作。client可以是一个应用程序,或者一个用户通过命令行或图形界面与系统进行交互。 最后,device (设备) 是连接到系统中的摄像机硬件设备,负责图像的捕获和传输。它与service直接通信,将图像传输给service进行处理。device可能是一个摄像头、照相机等实际的硬件设备。 者之间的关系是相互协作的关系。当client发送请求时,首先与service进行通信,client向service提供指令或请求图像;然后,service与device进行通信,控制device进行图像捕获和传输;最后,service将处理后的图像传递给client进行显示或存储等操作。 的来说,service充当着连接client和device的桥梁,管理整个摄像过程中的图像处理和控制,以提供系统的各种功能。client是用户与系统交互的接口,通过发送指令和请求图像来控制和获取图像。device是实际的硬件设备,负责图像的捕获和传输,以及响应service和client的指令。者之间形成一个完整的闭环,共同实现了camera的整体流程。 ### 回答3: 在摄像机的整体流程中,service、client和device是个核心组成部分,它们之间存在密切的关系。 首先,service(服务)是摄像机系统的主要功能模块,它负责处理各种摄像功能,并提供给client(客户端)使用。服务模块可以理解为摄像机的心脏,通过不断接收client的指令,执行各种图像处理操作。服务模块还负责控制device(设备)的工作,与设备进行通信和交互。 其次,client是摄像机系统的操作界面,提供给用户使用。客户端可以是手机App、电脑软件、摄像机的物理按键等方式,允许用户与摄像机进行互动和控制。客户端通过与服务模块进行通信,将用户的指令传递给服务模块,并接收服务模块返回的结果,如图像预览、设置参数等。 最后,device是实际的摄像设备,包括摄像头、镜头等硬件组件,以及各种传感器和控制器。设备模块负责采集图像、调整焦距、控制曝光等等,根据服务模块的指令进行工作。设备模块通过与服务模块的通信,接收来自服务模块的指令,并返回相应的图像数据。 综上所述,service、client和device的关系是相互协作的。客户端通过与服务模块进行通信,向服务模块发送指令并接收返回结果,实现与摄像机的交互。服务模块负责调用设备模块的功能,并将结果返回给客户端。设备模块则根据服务模块的指令进行工作,采集图像并将结果传递给服务模块。者之间的良好配合,实现了整个摄像机流程的正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值