相机Camera日志分析之二十七:高通相机Camx 基于预览1帧的process_capture_result二级日志分析详解
【关注我,后续持续新增专题博文,谢谢!!!】
上一篇我们讲了:
这一篇我们开始讲: 相机Camera日志分析之二十七:高通相机Camx 基于预览1帧的process_capture_result二级日志分析详解
目录
一、背景
二、:process_capture_result二级日志如下
三、:process_capture_result二级日志分析详解
四、:process_capture_result二级日志关键字
五、:总结
一、背景
1:【效率决定成长空间】无论什么开发,分析日志是解决问题的法宝。且是最有效最常用的调试工具,特别是在Android或Linux领域下,log分析是开发必备技能,然而log分析效率参差不齐,你分析一份日志要一天,别人分析只需要一个小时,作何感想?别人一年的学习成果可能是你几年才能学会。
2:【巨量日志降低了开发效率】接触过Android日志,就清楚日志量非常大。几十个进程几百个线程同时并行打印日志。而Camera领域日志量极大,因为预览一般是每秒30帧的日志量,录屏一般是每秒60帧的日志量,少则几万行日志,多则几十万行日志,更多则多个日志总量几百万行日志。
3:【日志梯度分级来提效】开发追求效率,如何快速有效挖掘出问题,并如何解决问题变得尤为重要。此专题将以梯度分级日志来分析日志,让日志流程变得简单化,提高解决问题的效率。
4:【举一反三】当前以高通CamX架构为例讲解Camera日志,方式通用,其他领域模块均可效仿借鉴。
5:【开发思维决定成长高度】当前讲述的是Camera领域log分析梯度分级讲解,讲究的是一种分析技巧,分析思维,一种感悟。技术路线的提升空间,需要更多开发技巧和开发学习能力去提升。技术大拿分析问题,可以从日志快速定位问题并解决问题,有充分的时间去学习更多知识,成长速度极快。同一起跑线,学习能力,开发效率等等都决定了程序员的成长提升空间。记得我毕业三年,同学之间的差距无限拉大,一些人还在几千块薪水,你已经是他的四五倍了,人与人的差距就是短短几年就拉开了。
二、:process_capture_result二级日志如下
PS:搜索类似【Start proc】中括号【 就有颜色体现了。
这里添加了【 关键字,过滤的是核心简化的核心流程日志过程,更加直观调用整个流程。
08-29 22:59:42.126 696 837 E CamX : [ERROR][CORE ] camxnode.cpp:3675 【CSLFenceCallback()】【开始回调result】 NodeName:【【IFE】】 : Type 65536 Fence 18 signaled with success in node fence handler FOR 34 08-29 22:59:42.128 696 837 E CamX : [ERROR][CORE ] camxnode.cpp:3675 CSLFenceCallback() NodeName:【【IFE】】 : Type 65536 Fence 91 signaled with success in node fence handler FOR 34 08-29 22:59:42.129 696 837 E CamX : [ERROR][CORE ] camxnode.cpp:3675 CSLFenceCallback() NodeName:【【IFE】】 : Type 65536 Fence 35 signaled with success in node fence handler FOR 34 08-29 22:59:42.169 696 1356 E CamX : [ERROR][HAL ] camxsession.cpp:2372 ProcessResults() bruceCamxLog: 08-29 22:59:42.171 696 1356 E CHIUSECASE: [ERROR ] chxadvancedcamerausecase.cpp:5161 ProcessResult() bruceChiLog: 08-29 22:59:42.178 696 1357 E CamX : [ERROR][CORE ] camxnode.cpp:3789 ProcessFenceCallback() NodeName:【【IFE】】, numUnsignaledFences 5, requestId 34 08-29 22:59:42.197 696 1357 E CamX : [ERROR][CORE ] camxnode.cpp:3789 ProcessFenceCallback() NodeName:【【IPE】】, numUnsignaledFences 0, requestId 33 08-29 22:59:42.210 696 1357 E CamX : [ERROR][CORE ] camxnode.cpp:3789 ProcessFenceCallback() NodeName:【【IFE】】, numUnsignaledFences 4, requestId 34 08-29 22:59:42.217 696 1356 D CHIUSECASE: [FULL ] chxadvancedcamerausecase.cpp:6381 FindFeatureToProcessResult() ProcessResult SessionId 1 frameNum 32 feature type: 1 08-29 22:59:42.217 696 1356 D CHIUSECASE: [FULL ] chxadvancedcamerausecase.cpp:6381 FindFeatureToProcessResult() ProcessResult SessionId 1 frameNum 32 feature type: 1 08-29 22:59:42.218 696 1356 E CHIUSECASE: [ERROR ] chxfeaturezsl.cpp:454 ProcessResult() bruceChiLog: 08-29 22:59:42.221 696 1356 I CHIUSECASE: [INFO ] chxfeaturezsl.cpp:490 ProcessResult() Realtime frame 32. Metadata: 0x74a80ae9c0 NumBuffers: 2 Timestamp: 55277127634 Sent: 0 08-29 22:59:42.231 696 1357 E CamX : [ERROR][CORE ] camxnode.cpp:3789 ProcessFenceCallback() NodeName:【【IFE】】, numUnsignaledFences 3, requestId 34 08-29 22:59:42.233 696 1356 E CHIUSECASE: [ERROR ] chxadvancedcamerausecase.cpp:3688 ProcessAndReturnFinishedResults() bruceChiLog: 【处理并返回完成所有结果】 08-29 22:59:42.235 696 1356 E CHIUSECASE: [ERROR ] chxusecase.cpp:765 ReturnFrameworkResult() bruceChiLog: 【返回Framework Result】 08-29 22:59:42.236 696 1356 I CHIUSECASE: [INFO ] chxusecase.cpp:773 ReturnFrameworkResult() chiOriginalOverrideFrameNum: 32 frame_number: 32 resultFrameIndexF: 32 FW: 32, Buffer Count: 1 RESULT: 0x74aa1116c0 08-29 22:59:42.237 696 1356 D CHIUSECASE: [FULL ] chxusecase.cpp:791 ReturnFrameworkResult() m_numberOfPendingOutputBuffers = 1 08-29 22:59:42.238 696 1356 D CHIUSECASE: [FULL ] chxusecase.cpp:798 ReturnFrameworkResult() pResult->num_output_buffers 0 pending buffers 1 08-29 22:59:42.242 696 1356 E CHIUSECASE: [ERROR ] chxextensionmodule.cpp:2782 ReturnFrameworkResult() bruceChiLog: 08-29 22:59:42.244 696 1356 E CamX : [ERROR][HAL ] camxhaldevice.cpp:231 ProcessCaptureResult() bruceCamxLog: 22222222222222222222222222222222222222222222 08-29 22:59:42.247 696 1356 E CamX : [ERROR][HAL ] camxhal3entry.cpp:202 process_capture_result() bruceCamxLog: 1111111111111111111111111111111111111111111111111
三、:process_capture_result二级日志分析详解
E CamX : [ERROR][CORE ] camxnode.cpp:3675 【CSLFenceCallback()】【开始回调result,通知到Pipeline,此时Pipeline会判断当前Node的Output port 是否是Sink Port(输出到CHI),如果不是,则会更新依赖项到DRQ中,并且将不存在依赖项的Node移到m_readyNodes队列中3.,然后调用DispatchReadyNdoes继续进入到DRQ中流转,如果是Sink Port,则表示此Node是整个Pipeline的最末端。调用sinkPortFenceSignaled将数据给到Session中,最后通过调用Session中的NotifyResult将结果发送到CHI中。
】 NodeName:【【IFE】】 : Type 65536 Fence 18 signaled with success in node fence handler FOR 34
E CamX : [ERROR][CORE ] camxnode.cpp:3675 CSLFenceCallback() NodeName:【【IFE】】 : Type 65536 Fence 91 signaled with success in node fence handler FOR 34
E CamX : [ERROR][CORE ] camxnode.cpp:3675 CSLFenceCallback() NodeName:【【IFE】】 : Type 65536 Fence 35 signaled with success in node fence handler FOR 34
E CamX : [ERROR][HAL ] camxsession.cpp:2372 【ProcessResults()】 :
E CHIUSECASE: [ERROR ] chxadvancedcamerausecase.cpp:5161 【ProcessResult()】【将结果发送到具体的Feature中】 :
E CamX : [ERROR][CORE ] camxnode.cpp:3789 【ProcessFenceCallback()】【3.通知pipeline,并且调用pipeline的NonSinkPortFenceSignaled方法,在该方法内部又会去调用DRQ的FenceSignaledCallback方法,而该方法又会调用UpdateDependency更新依赖,并将依赖项都满足的Node从m_deferredNodes取出加入到m_readyNodes,然后调用dispatchReadyNodes继续进行处理。】 NodeName:【【IFE】】, numUnsignaledFences 5, requestId 34
E CamX : [ERROR][CORE ] camxnode.cpp:3789 ProcessFenceCallback() NodeName:【【IPE】】, numUnsignaledFences 0, requestId 33
E CamX : [ERROR][CORE ] camxnode.cpp:3789 ProcessFenceCallback() NodeName:【【IFE】】, numUnsignaledFences 4, requestId 34
D CHIUSECASE: [FULL ] chxadvancedcamerausecase.cpp:6381 【FindFeatureToProcessResult()】【查找feature去执行结果】 ProcessResult SessionId 1 frameNum 32 feature type: 1
D CHIUSECASE: [FULL ] chxadvancedcamerausecase.cpp:6381 FindFeatureToProcessResult() ProcessResult SessionId 1 frameNum 32 feature type: 1
E CHIUSECASE: [ERROR ] chxfeaturezsl.cpp:454 ProcessResult() :
I CHIUSECASE: [INFO ] chxfeaturezsl.cpp:490 ProcessResult() Realtime frame 32. Metadata: 0x74a80ae9c0 NumBuffers: 2 Timestamp: 55277127634 Sent: 0
E CamX : [ERROR][CORE ] camxnode.cpp:3789 ProcessFenceCallback() NodeName:【【IFE】】, numUnsignaledFences 3, requestId 34
E CHIUSECASE: [ERROR ] chxadvancedcamerausecase.cpp:3688 【ProcessAndReturnFinishedResults()】 : 【处理并返回完成所有结果】
E CHIUSECASE: [ERROR ] chxusecase.cpp:765 【ReturnFrameworkResult()】 : 【返回Framework Result】
I CHIUSECASE: [INFO ] chxusecase.cpp:773 ReturnFrameworkResult() chiOriginalOverrideFrameNum: 32 frame_number: 32 resultFrameIndexF: 32 FW: 32, Buffer Count: 1 RESULT: 0x74aa1116c0
D CHIUSECASE: [FULL ] chxusecase.cpp:791 ReturnFrameworkResult() m_numberOfPendingOutputBuffers = 1
D CHIUSECASE: [FULL ] chxusecase.cpp:798 ReturnFrameworkResult() pResult->num_output_buffers 0 pending buffers 1
E CHIUSECASE: [ERROR ] chxextensionmodule.cpp:2782 ReturnFrameworkResult() :
E CamX : [ERROR][HAL ] camxhaldevice.cpp:231 【ProcessCaptureResult()】 : 22222222222222222222222222222222222222222222
E CamX : [ERROR][HAL ] camxhal3entry.cpp:202 【process_capture_result()】【返回到Google Camera HAL3接口了】
四、:process_capture_result二级日志关键字
process_capture_result|CSLFenceCallback|NodeThreadJobFamilyCb|ProcessFenceCallback|SinkPortFenceSignaled|InjectResult|DispatchResults|ProcessResult|ProcessAndReturnFinishedResults|ReturnFrameworkResult|ReturnFrameworkResult|processCaptureResult
五、:总结
当前日志为process_capture_result的核心过程,涉及过程:
- KMD处理完request后,会回调,最终调用到Camx的CSLFenceCallback回调函数。开始回调result,通知到Pipeline,此时Pipeline会判断当前Node的Output port 是否是Sink Port(输出到CHI),如果不是,则会更新依赖项到DRQ中,并且将不存在依赖项的Node移到m_readyNodes队列中3.,然后调用DispatchReadyNdoes继续进入到DRQ中流转,如果是Sink Port,则表示此Node是整个Pipeline的最末端。调用sinkPortFenceSignaled将数据给到Session中,最后通过调用Session中的NotifyResult将结果发送到CHI中。
- 回调执行到ProcessFenceCallback
- FindFeatureToProcessResult查找feature去执行结果
- ProcessAndReturnFinishedResults处理并返回完成所有结果
- ReturnFrameworkResult返回Framework Result
- process_capture_result返回到Google Camera HAL3接口了
【关注我,后续持续新增专题博文,谢谢!!!】
下一篇讲解: