Camera2 request处理结果上报源码分析

hal层接收到native传递的camera stream request后,会读取camera数据,然后通过CameraDeviceSession#initialize流程中注册的处理回调上报camera数据结果,具体处理方法为CameraDeviceClient#sProcessCaptureResult。在sProcessCaptureResult方法中,会创建capture result,并调用ResultBatch#processCaptureResult批量处理camera stream结果。

/hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.cpp

Camera2 request处理结果上报源码分析_第1张图片

Camera2 request处理结果上报源码分析_第2张图片

Camera2 request处理结果上报源码分析_第3张图片

在ResultBatch#processCaptureResult流程中,会区分camera stream处理结果是否被分割。如果出现分割情况,则数据缓冲到最后一次结构后重组完成再上报,否则直接调用processOneCaptureResult方法上报camera stream数据。

/hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.cpp

Camera2 request处理结果上报源码分析_第4张图片

在processOneCaptureResult流程中,会先经过invokeProcessCaptureResultCallback方法中转,最终通过mCallback回调函数processCaptureResult来处理回调。

/hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.cpp

Camera2 request处理结果上报源码分析_第5张图片

Camera2 request处理结果上报源码分析_第6张图片

接下来分析mCallback回调的初始化流程。在openCamera流程Camera3Device#initialize过程中,会将this对象作为参数传递给CameraProviderManager#openSession方法,而CameraProviderManager在查找到对应的CameraDevice后执行open操作创建session并传递callback参数,然后在创建camera session的过程中作为参数传递给CameraDeviceSession,最后赋值给ResultBatcher中的mCallback变量。也就是说CameraDeviceSession中的回调处理函数最终会调用到Camera3Device#processCaptureResult方法。

/frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp

Camera2 request处理结果上报源码分析_第7张图片

/frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp

Camera2 request处理结果上报源码分析_第8张图片

/hardware/interfaces/camera/device/3.2/default/CameraDevice.cpp

Camera2 request处理结果上报源码分析_第9张图片

/hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.cpp

Camera2 request处理结果上报源码分析_第10张图片

在Camera3Device#processCaptureResult处理流程中,会将camera stream信息封装成states,然后针对于每一个surface调用Camera3OutputUtils#processOneCaptureResultLocked方法处理camera stream结果。在processOneCaptureResultLocked方法中,会读取并校验camera stream结果的有效性,并将结果封装成camera_capture_result结构体交给Camera3OutputUtils#processCaptureResult处理。在processCaptureResult方法中,检查当前获取的数据是否是最终结果的数据,并调用returnAndRemovePendingOutputBuffers方法进行下一步处理。最终经过returnOutputBuffers和returnBuffer方法中转将camera stream处理结果传递给Camera3OutputStream# returnBufferLocked方法进行处理。

/frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp

Camera2 request处理结果上报源码分析_第11张图片

/frameworks/av/services/camera/libcameraservice/device3/Camera3OutputUtils.cpp

Camera2 request处理结果上报源码分析_第12张图片

接下来分析Camera3OutputStream#returnBufferLocked流程。在returnBufferLocked流程中,会经过Camera3IOStreamBase#returnAnyBufferLocked方法移除camera stream引用和检查camera stream状态,然后通过Camera3OutputStream#returnBufferCheckedLocked方法处理camera stream数据。在returnBufferCheckedLocked方法中,获取到result中的camera stream数据,然后通过queueBufferToConsumer方法将数据送到surface申请的buffer中来显示和算法处理。至此,一次完整的camera stream request和result处理流程分析完成,后续request和result在Camera3Device的RequestThread中循环发送和处理,这样应用的surface就可以获取到camera预览数据和算法数据。

/frameworks/av/services/camera/libcameraservice/device3/Camera3OutputStream.cpp

Camera2 request处理结果上报源码分析_第13张图片

/frameworks/av/services/camera/libcameraservice/device3/Camera3IOStreamBase.cpp

Camera2 request处理结果上报源码分析_第14张图片

/frameworks/av/services/camera/libcameraservice/device3/Camera3OutputStream.cpp

Camera2 request处理结果上报源码分析_第15张图片

你可能感兴趣的:(Camera,android)