不懂的地方:
继续研究:
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;