Android系统获取摄像头预览数据的流程

不懂的地方:

继续研究:

CameraDeviceImpl#submitCaptureRequest

requestInfo = mRemoteDevice.submitRequestList(requestArray, repeating);

cameraService.connectDevice 返回一个 hardware::camera2::ICameraDeviceUser 。

源码位置在:
https://cs.android.com/android/platform/superproject/+/master:frameworks/av/camera/aidl/android/hardware/camera2/ICameraDeviceUser.aidl

在服务端的实现是:CameraDeviceClient .

在CameraDeviceClient::submitRequestList方法中的拿到这个request的surface ,

Camera3Device.cpp调用RequestThread->setRepeatingRequests(requestList, lastFrameNumber) 来提交请求 。

CameraService:: mNumberOfCameras
CameraService::updateCameraNumAndIds
CameraProviderManager::getCameraCount()

libcameraservice/common/FrameProcessorBase.h 的作用:

在Camera3OutputUtils.cpp的 insertResultLocked方法中将获取的frame ( CaptureResult ) 放入 resultQueue 中 ,并通知客户端 。

HAL中V4L2是如何拿到预览数据的?以及发送的流程?

V4L2Camera::enqueueRequestBuffers() 将请求buffer提交给驱动 ,等待驱动写入数据。

V4L2Camera::dequeueRequestBuffers() 从驱动中取到已经准备好的frame,也就是buffer 。 实际调用 V4L2Wrapper::DequeueRequest 。将数据存放在:request->output_buffers[0]

V4L2Camera::dequeueRequestBuffers() 被 V4L2Camera 中的一个线程调用, 创建之后一直在运行 。

V4L2Camera::dequeueRequestBuffers() 中取到一个buffer之后 调用Camera::completeRequest方法 ,而
V4L2Camera::dequeueRequestBuffers() 调用Camera::sendResult,将数据转换为:camera3_capture_result_t 。然后调用 camera3_callback_ops->process_capture_result(mCallbackOps, &result);

HAL 调用 camera3_callback_ops->process_capture_result 来通知 framework capture result 。

那这个camera3_callback_ops 是在哪里给赋值的?

在HAL中是哪里调用ICameraDeviceCallback .processCaptureResult的,明天继续

framework中继续处理:

Camera3Device::waitForNextFrame 等待下一个帧。
FrameProcessorBase::threadLoop() 无限循环处理可用的Frame 。如果有新的数据,则调用 FrameProcessorBase::processNewFrames,最终调用接口 FilteredListener的onResultAvailable方法。

而CameraDeviceClient就是FilteredListener的实现类 。

???process_capture_result 在framework中的实现:

V4L2Wrapper::RequestBuffers 指示驱动需要使用的buffer的数量 。

v4l2_buffer :

struct camera3_callback_ops

定义在:hardware/libhardware/include/hardware/camera3.h

Callback methods for the HAL to call into the framework.
These methods are used to return metadata and image buffers for a completed
or failed captures, and to notify the framework of asynchronous events such
as errors.

void (*process_capture_result) : HAL 用来通知 framework capture result。

那这个frame是从哪里创建的?

HidlCamera3Device::processCaptureResult --------->>> HidlCamera3OutputUtils.cpp的processOneCaptureResultLocked
--------->>> Camera3OutputUtils.cpp的processCaptureResult --------->>> sendCaptureResult --------->>> insertResultLocked 。

Camera3OutputUtils.cpp的returnOutputBuffers 调用Camera3StreamInterface::::returnBuffer,实际是 Camera3Stream::returnBuffer,

Camera3OutputStream的概念:

A class for managing a single stream of output data from the camera device

notifyBufferReleased()何时调用?
继续看 mConsumer 是怎么使用的 。

HAL是如何通知Framework预览数据已经准备好?

以下是客户端开始预览的流程:

客户端:

CameraCaptureSession.setRepeatingRequest 会调用到 CameraDeviceImpl.java的 submitCaptureRequest 方法,
后者调用到mRemoteDevice.submitRequestList(requestArray, repeating),这个会调用到服务端的方法:

服务端:

frameworks/av/camera/aidl/android/hardware/camera2/ICameraDeviceUser.aidl
ICameraDeviceUser.aidl在服务端的实现类是CameraDeviceClient

什么是Surface:
Surface实现了ANativeWindow,它是一个GraphicBufferProducer,将graphics buffers写入
BufferQueue中。

需要理解Camera3Device::setStreamingRequestList 中是如何处理surfaceMaps的:

在方法
Camera3Device::convertMetadataListToRequestListLocked中 将 surfaceMaps 转换为:
在 Camera3Device::createCaptureRequest 中将 参数 surfaceMap 赋值给了 request的mOutputSurfaces:

  newRequest->mOutputSurfaces[streams.data.i32[i]] = surfaces;

class CaptureRequest 的变量 SurfaceMap mOutputSurfaces的作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值