waitUntilDrained耗时引起的camera关闭慢问题

在关闭camera时耗时近6s。

  1. 日志分析

日志中存在如下异常:

03-04 16:58:14.180  9976 25944 E Camera3-Device: Camera 101: waitUntilDrainedLocked: Error waiting for HAL to drain: Connection timed out (-110)
03-04 16:58:14.231  9976 25944 D CameraTraces: Process trace saved. Use dumpsys media.camera to view.
03-04 16:58:14.232  9976 25944 E CameraDeviceClient: detachDevice: waitUntilDrained failed with code 0xffffff92
03-04 16:58:14.232  9976 25944 I Camera3-Device: disconnectImpl: E deviceId:101
03-04 16:58:14.232  9976 25944 E Camera3-Device: Camera 101: disconnectImpl: Shutting down in an error state

查看systrace发现flush和close调用都很快。waitUntilDrained耗时5s。上级调用为disconnect。

2. waitUntilDrained耗时分析

通过错误日志查询耗时函数

2.1 代码逻辑梳理

从总的调用disconnect开始梳理,整体调用存在2个条件等待。

  • App调用关闭等待条件1:App binder -> Camera2ClientBase<TClientBase>::disconnect -> CameraDeviceClient::detachDevice -> Camera3Device::waitUntilStateThenRelock -> mStatusChanged.waitRelative

  • 满足条件1的调用逻辑: StatusTracker::threadLoop -> Camera3Device::notifyStatus-> Camera3Device::internalUpdateStatusLocked -> mStatusChanged.broadcast()

  • 第二条逻辑等待条件满足的调用:StatusTracker::markComponentIdle(mPendingChangeSignal.signal())-> StatusTracker::threadLoop

通过上面逻辑发现要满足条件需要在执行processCaptureResult时mInFlightMap为0才会触发通知。

2.2 梳理的代码相关日志分析

  • 正常日志:

  • 异常日志:

通过对比日志发现异常时mInFlightMap不为0。说明异常出现在camera hal的pipeline中。

3. camera provider pipeline分析

分析camera hal的pipeline最直接方式就是在processOneCaptureRequest和processCaptureResult中将帧编号打印出来。

通过分析日志发现在返回第0帧时cameraserver未调用onInflightEntryRemovedLocked函数,说明返回数据存在问题。在第一次打印mInFlightMap时请求了3帧返回了2帧,此时mInFlightMap的大小应为1。在camera hal日志中发现请求第0帧数据时出现了错误,但是pipeline未处理该错误,最后给cameraserver返回了一帧错误数据。导致关闭相机时cameraserver一直等待超时。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值