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

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

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

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

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

接下来分析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

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

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

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

在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

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

接下来分析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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值