相机Camera日志分析之二十四:高通相机Camx 基于预览1帧的process_capture_request三级日志分析详解
【关注我,后续持续新增专题博文,谢谢!!!】
上一篇我们讲了:相机Camera日志分析之二十三:高通相机Camx 基于预览1帧的process_capture_request二级日志分析详解
这一篇我们开始讲: 相机Camera日志分析之二十四:高通相机Camx 基于预览1帧的process_capture_request三级日志分析详解
目录
一、背景
二、:process_capture_request三级日志如下
三、:process_capture_request三级日志分析详解
四、:process_capture_request三级日志关键字
五、:总结
一、背景
1:【效率决定成长空间】无论什么开发,分析日志是解决问题的法宝。且是最有效最常用的调试工具,特别是在Android或Linux领域下,log分析是开发必备技能,然而log分析效率参差不齐,你分析一份日志要一天,别人分析只需要一个小时,作何感想?别人一年的学习成果可能是你几年才能学会。
2:【巨量日志降低了开发效率】接触过Android日志,就清楚日志量非常大。几十个进程几百个线程同时并行打印日志。而Camera领域日志量极大,因为预览一般是每秒30帧的日志量,录屏一般是每秒60帧的日志量,少则几万行日志,多则几十万行日志,更多则多个日志总量几百万行日志。
3:【日志梯度分级来提效】开发追求效率,如何快速有效挖掘出问题,并如何解决问题变得尤为重要。此专题将以梯度分级日志来分析日志,让日志流程变得简单化,提高解决问题的效率。
4:【举一反三】当前以高通CamX架构为例讲解Camera日志,方式通用,其他领域模块均可效仿借鉴。
5:【开发思维决定成长高度】当前讲述的是Camera领域log分析梯度分级讲解,讲究的是一种分析技巧,分析思维,一种感悟。技术路线的提升空间,需要更多开发技巧和开发学习能力去提升。技术大拿分析问题,可以从日志快速定位问题并解决问题,有充分的时间去学习更多知识,成长速度极快。同一起跑线,学习能力,开发效率等等都决定了程序员的成长提升空间。记得我毕业三年,同学之间的差距无限拉大,一些人还在几千块薪水,你已经是他的四五倍了,人与人的差距就是短短几年就拉开了。
二、:process_capture_request三级日志如下
PS:搜索类似【Start proc】中括号【 就有颜色体现了。
这里添加了【 关键字,过滤的是核心简化的核心流程日志过程,更加直观调用整个流程。
(由于request日志量太大,就不贴二级日志,单独贴三级日志了)
CamX : [ERROR][SENSOR ] camxsensornode.cpp:3280 LoadSensorConfigCmds() 【Streamon configuration successful!】【sersor xml Streamon配置成功】 CamX : [ERROR][SENSOR ] camxsensornode.cpp:3280 LoadSensorConfigCmds() 【Streamon configuration successful!】【sersor xml Streamon配置成功】 CamX : [ERROR][CHI ] camxchinodewrapper.cpp:2533 PrepareStreamOn() Node::ZSLPreviewRaw_ChiNodeWrapper0 Comp::com.qti.node.memcpy Prepare stream on CHIUSECASE: [FULL ] chxextensionmodule.cpp:2926 GetNumPCRsBeforeStreamOn() EarlyPCR: chiextensionModule 0 CamX : [ERROR][HAL ] camxchi.cpp:2342 ChiActivatePipeline() : CamX : [ERROR][HAL ] camxsession.cpp:1314 【StreamOn()】【传递到session去上电】 : CamX : [ERROR][HAL ] camxpipeline.cpp:500 StreamOn() : CamX : [ERROR][CORE ] camxpipeline.cpp:527 【StreamOn()】 【ZSLPreviewRaw_0】【传递到pipeline去上电】 【StreamingOn】 for pipeline: 0x74a97fe000 CamX : [ERROR][CHI ] camxchinodewrapper.cpp:2554 OnStreamOn() Node::ZSLPreviewRaw_ChiNodeWrapper0 Comp::com.qti.node.memcpy On stream on CamX : [ERROR][HAL ] camxchi.cpp:2418 ChiSubmitPipelineRequest() : CamX : [ERROR][HAL ] camxnode.cpp:1442 SetupRequest() : CamX : [ERROR][HAL ] camxnode.cpp:1442 【SetupRequest()】【Request传递到node】 : CamX : [ERROR][HAL ] camxnode.cpp:1442 SetupRequest() : CamX : [ERROR][HAL ] camxnode.cpp:1442 SetupRequest() : CamX : [ERROR][HAL ] camxchi.cpp:2418 ChiSubmitPipelineRequest() : CamX : [ERROR][HAL ] camxnode.cpp:1442 SetupRequest() : CamX : [ERROR][HAL ] camxnode.cpp:1442 SetupRequest() : CamX : [ERROR][HAL ] camxnode.cpp:1442 SetupRequest() : CamX : [ERROR][HAL ] camxnode.cpp:1442 SetupRequest() : CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 【DispatchReadyNodes()】 :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:356 【DeferredWorkerWrapper()】【该方法是m_hDeferredWorker线程的处理函数,主要用于处理需要下发request的Node,同时再次更新依赖项,最后会再次调用DispatchReadyNodes开始处理。】 : CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:356 【DeferredWorkerWrapper()】【该方法是m_hDeferredWorker线程的处理函数,主要用于处理需要下发request的Node,同时再次更新依赖项,最后会再次调用DispatchReadyNodes开始处理。】 : CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:356 DeferredWorkerWrapper() : CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:356 DeferredWorkerWrapper() : CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】 CamX : [ERROR][CORE ] camxdeferredrequestqueue.cpp:1083 DispatchReadyNodes() Post job for NodeName:【【AutoFocus:0】】, request 36 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:356 DeferredWorkerWrapper() : CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】 CamX : [ERROR][HAL ] camxchi.cpp:2418 ChiSubmitPipelineRequest() : CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:356 DeferredWorkerWrapper() : CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】 CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:356 DeferredWorkerWrapper() : CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:356 DeferredWorkerWrapper() : CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:356 DeferredWorkerWrapper() :
三、:process_capture_request三级日志分析详解
CamX : [ERROR][SENSOR ] camxsensornode.cpp:3280 LoadSensorConfigCmds() 【Streamon configuration successful!】【sersor xml Streamon配置成功】
CamX : [ERROR][HAL ] camxsession.cpp:1314 【StreamOn()】【传递到session去上电】 :
CamX : [ERROR][CORE ] camxpipeline.cpp:527 【StreamOn()】 【ZSLPreviewRaw_0】【传递到pipeline去上电】 【StreamingOn】 for pipeline: 0x74a97fe000
CamX : [ERROR][HAL ] camxnode.cpp:1442 【SetupRequest()】【Request传递到node】 :
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 【DispatchReadyNodes()】 :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:356 【DeferredWorkerWrapper()】【该方法是m_hDeferredWorker线程的处理函数,主要用于处理需要下发request的Node,同时再次更新依赖项,最后会再次调用DispatchReadyNodes开始处理。】 :
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:356 【DeferredWorkerWrapper()】【该方法是m_hDeferredWorker线程的处理函数,主要用于处理需要下发request的Node,同时再次更新依赖项,最后会再次调用DispatchReadyNodes开始处理。】 :
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】
CamX : [ERROR][CORE ] camxdeferredrequestqueue.cpp:1083 DispatchReadyNodes() Post job for NodeName:【【AutoFocus:0】】, request 36
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:662 AddDeferredNode() : 【增加延期的node,mark当前camxnode和requestId绑定在一起】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】
CamX : [ERROR][HAL ] camxdeferredrequestqueue.cpp:1010 DispatchReadyNodes() :【派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】
四、:process_capture_request三级日志关键字
IsPipelineActive|ChiActivatePipeline|StreamOn|SubmitPipeline|SetupRequest\(\)|AddDeferredNode|DispatchReadyNodes|PostJob|DeferredWorkerWrapper
五、:总结
当前日志为process_capture_request的node核心过程,涉及:
- 激活pipeline后需要StreamOn
- 然后SetupRequest到node
- 在node里的处理主要由DRQ来管理,核心两个函数是:
- DispatchReadyNodes:派发准备node处理,每个请求都会访问所有节点,也可以忽略某些请求不需要的节点】
- 【DeferredWorkerWrapper:该方法是m_hDeferredWorker线程的处理函数,主要用于处理需要下发request的Node,同时再次更新依赖项,最后会再次调用DispatchReadyNodes开始处理。
【关注我,后续持续新增专题博文,谢谢!!!】
下一篇讲解: