【关注我,后续持续新增专题博文,谢谢!!!】
上一篇我们讲了:
这一篇我们开始讲: 相机定屏问题分析五:【跳帧异常】照片模式1x以上的焦段拍照之后定屏9573412
目录
一、问题背景
二、问题分析过程
2.1:基于原理分析
2.2 :分析返帧情况
2.3 :分析返帧异常
2.4 :无Error异常日志分析思路
2.5 :差异提交
2.6 :回退复测
2.7 :解决方案
一、问题背景
【操作步骤】【Operation steps】进入照片模式(后置),1x以上进行拍照
【实际结果】【Actual results】拍照定屏
【期望结果】【Expected results】无闪退、定屏等
二、问题分析过程
2.1:基于原理分析
对于Camera HAL底层而已,我们需要排查返帧是否正常,若底层都没返帧,那么上层显示自然存在问题。
2.2 :分析返帧情况
1:参考HAL3一级日志关键字:相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
2:我们可以确认配流和打开相机均正常,但返帧确实异常,很多帧没有返回。如下:
行 12150: 07-17 17:35:49.454882 3365 3386 E CamX : [ALWAYS_ON ] camxhal3.cpp:608 open() HAL3Open end行 12633: 07-17 17:35:49.583325 3365 3386 I CamX : [ INFO][HAL ] camxhal3.cpp:1577 configure_streams() operation_mode: 32769行 15881: 07-17 17:35:50.331532 3365 3576 I CamX : [CONFIG][HAL ] camxhal3.cpp:2140 process_capture_result() frame_number 10, partial_result 1, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 15966: 07-17 17:35:50.337573 3365 3579 I CamX : [CONFIG][HAL ] camxhal3.cpp:2140 process_capture_result() frame_number 10, partial_result 2, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 16021: 07-17 17:35:50.348748 3365 3577 I CamX : [CONFIG][HAL ] camxhal3.cpp:2140 process_capture_result() frame_number 10, partial_result 0, result 0x0, num_physcam_metadata 0, num_output_buffers 1行 16022: 07-17 17:35:50.348754 3365 3577 I CamX : [CONFIG][HAL ] camxhal3.cpp:2171 process_capture_result() output_buffers[0] : 0xb4000070b863e380, buffer: 0xb400007089f89a98, status: 00000000, stream: 0xb400007096d341e8行 16027: 07-17 17:35:50.349325 3365 3386 I CamX : [CORE_CFG][HAL ] camxhal3.cpp:1838 process_capture_request() frame_number 17, settings 0xb4000070aedfd800, logicalCameraId: 0, cameraId: 0 num_output_buffers 1, num_input_buffers 0行 16028: 07-17 17:35:50.349344 3365 3386 I CamX : [CONFIG][HAL ] camxhal3.cpp:1864 process_capture_request() output_buffers[0] : 0xb4000070b48c8a60, buffer: 0x71c89660d0, status: 00000000, stream: 0xb400007096d341e8行 17712: 07-17 17:35:51.320126 3365 3575 I CamX : [CONFIG][HAL ] camxhal3.cpp:2140 process_capture_result() frame_number 39, partial_result 0, result 0x0, num_physcam_metadata 0, num_output_buffers 1行 17713: 07-17 17:35:51.320131 3365 3575 I CamX : [CONFIG][HAL ] camxhal3.cpp:2171 process_capture_result() output_buffers[0] : 0xb4000070b863e380, buffer: 0xb400007089f89b18, status: 00000000, stream: 0xb400007096d341e8行 17719: 07-17 17:35:51.320734 3365 3365 I CamX : [CORE_CFG][HAL ] camxhal3.cpp:1838 process_capture_request() frame_number 46, settings 0xb40000709c3f2000, logicalCameraId: 0, cameraId: 0 num_output_buffers 1, num_input_buffers 0行 17720: 07-17 17:35:51.320754 3365 3365 I CamX : [CONFIG][HAL ] camxhal3.cpp:1864 process_capture_request() output_buffers[0] : 0xb4000070ca1ff7a0, buffer: 0x71c89660d0, status: 00000000, stream: 0xb400007096d341e8行 17899: 07-17 17:35:51.332635 3365 3578 I CamX : [CONFIG][HAL ] camxhal3.cpp:2140 process_capture_result() frame_number 40, partial_result 1, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 19102: 07-17 17:35:52.329564 3365 3582 I CamX : [CONFIG][HAL ] camxhal3.cpp:2140 process_capture_result() frame_number 70, partial_result 1, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 19188: 07-17 17:35:52.337358 3365 3579 I CamX : [CONFIG][HAL ] camxhal3.cpp:2140 process_capture_result() frame_number 70, partial_result 2, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 19219: 07-17 17:35:52.345025 3365 3581 I CamX : [CONFIG][HAL ] camxhal3.cpp:2140 process_capture_result() frame_number 70, partial_result 0, result 0x0, num_physcam_metadata 0, num_output_buffers 1行 19220: 07-17 17:35:52.345034 3365 3581 I CamX : [CONFIG][HAL ] camxhal3.cpp:2171 process_capture_result() output_buffers[0] : 0xb4000070b863e380, buffer: 0xb4000070b81f92f8, status: 00000000, stream: 0xb400007096d341e8行 19225: 07-17 17:35:52.345711 3365 3386 I CamX : [CORE_CFG][HAL ] camxhal3.cpp:1838 process_capture_request() frame_number 77, settings 0xb4000070aedfd800, logicalCameraId: 0, cameraId: 0 num_output_buffers 1, num_input_buffers 0行 19226: 07-17 17:35:52.345731 3365 3386 I CamX : [CONFIG][HAL ] camxhal3.cpp:1864 process_capture_request() output_buffers[0] : 0xb4000070b48c8a60, buffer: 0x71c89660d0, status: 00000000, stream: 0xb400007096d341e8行 20090: 07-17 17:35:53.332129 3365 3578 I CamX : [CONFIG][HAL ] camxhal3.cpp:2140 process_capture_result() frame_number 100, partial_result 1, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 20147: 07-17 17:35:53.337141 3365 3580 I CamX : [CONFIG][HAL ] camxhal3.cpp:2140 process_capture_result() frame_number 100, partial_result 2, result 0xb4000070aed1aac0, num_physcam_metadata 0, num_output_buffers 0行 20196: 07-17 17:35:53.346338 3365 3582 I CamX : [CONFIG][HAL ] camxhal3.cpp:2140 process_capture_result() frame_number 100, partial_result 0, result 0x0, num_physcam_metadata 0, num_output_buffers 1
可以看到返帧就10,39,40,70,100,并非每帧都返回。我们需要分析为什么没有返帧,是sensor没出返帧,还是camx hal流程异常导致。
2.3 :分析返帧异常
搜索进程Error日志,发现并没有异常日志。一般返帧失败,Camx hal进程就会有报错。没有异常日志这时怎么处理?
2.4 :无Error异常日志分析思路
分析思路:
- 功能性问题,返帧失败,Camx hal进程就会有报错来体现返帧失败的过程或原因。
- 没有异常日志,说明大概率是正常的功能需求,才不会打印error日志,而正常功能需求一般没有足够测试影响范围,导致的性能稳定性问题。
- 常规做法:根据返帧流程添加日志分析哪里出现问题,但这样分析周期一般偏长。
- 二分法排查:项目紧张情况下,快速解决问题的方式是,根据必须或概率高复现路径,利用二分法排查哪个版本出现的问题,确定了某一天的版本有问题,然后差异提交去定位具体哪一个提交引入的问题,这样解决问题就非常有针对性,且快速解决问题。参考:相机camera开发之差异对比核查一:测试机和对比机的硬件配置差异对比 相机camera开发之差异对比核查二:测试机和对比机的差异提交对比相机camera开发之差异对比核查三:测试机和对比机的Camera算法库、解耦配置和快稳省差异对比 相机camera开发之差异对比核查四:测试机和对比机的Camera动态参数差异对比及关键字
2.5 :差异提交
结果差异提交二分法排查,很快找到Camera相关仓库的几笔差异提交,结果技术分析,排查完全无影响的提交,最终锁定一笔功能导通的提交非常可疑,如下:这笔提交明显存在SetFrameSkipForPreview和SetFrameSkipFlag相关跳帧的改动。
导通yuvsr izoom---diff --git a///qcom/extensionlayer/BackseatDriver.cpp b///qcom/extensionlayer/BackseatDriver.cpp index 0fca7a5..483a430 100755 --- a///qcom/extensionlayer/BackseatDriver.cpp +++ b///qcom/extensionlayer/BackseatDriver.cpp @@ -99,6 +99,7 @@m_isEnableIzoomNZSL = FALSE;m_previewEv = 0;m_previewIzoomFrame = 0; + m_previewYuvsrIzoomFrame = 0;m_skipPreIzoomCount = 0;m_trrigerIzoomRatio = 0.0f;m_trigger4skipProLongExp = 100000000.0f; @@ -1223,7 +1224,11 @@{SetFrameSkipForPreviewIZOOM(pRequest);} - + if ((m_trrigerIzoomRatio > 0 ||(m_Config.FeatureType == OP_YUVSR && + m_Config.Bracket == _BRACKET_NONE))&& (m_pPlugin->IsSystemCamera() == TRUE)) + { + SetFrameSkipForPreviewYuvsrIZOOM(pRequest); + }// need to drop more frames:m_continueDropframeCountm_continueDropframeCount = GetContinueDropframeCount(pRequest, pAppMeta);m_lastzoomtype = m_Config.FeatureType; @@ -1272,7 +1277,7 @@((m_Config.Bracket == _BRACKET_04) && m_needSkipPreviewInBracket4) ||((m_Config.Bracket == _BRACKET_15) && m_needSkipPreviewForFaceBeauty) ||((m_Config.Bracket == _BRACKET_12) && m_needSkipPreviewForIZoom) || - ((m_Config.Bracket == _BRACKET_17) && (FRONT_CAM_ID == m_pPlugin->GetLogicalCameraId()))) + ((m_Config.Bracket == _BRACKET_17) && (FRONT_CAM_ID == m_pPlugin->GetLogicalCameraId())) || (m_Config.FeatureType == OP_YUVSR && m_Config.Bracket == _BRACKET_NONE)){CHX_LOG_DEBUG("Import skip preview sceneMode %d, frameIndex %d, applicationFrameNum %d, AeExposureCom %d, Bracket %d",m_Config.Scene, @@ -1487,6 +1492,38 @@/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// BackseatDriver::SetFrameSkipFlagForIZOOM//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +VOID BackseatDriver::SetFrameSkipForPreviewYuvsrIZOOM(camera3_capture_request_t* pRequest) +{ + UINT32 applicationFrameNum = pRequest->frame_number; + UINT32 frameIndex = pRequest->frame_number % MaxOutstandingRequests; + UINT32 temp_Index = frameIndex; + + if(m_Config.ZoomRatio >= m_trrigerIzoomRatio) + { + m_previewYuvsrIzoomFrame++; + if(m_previewYuvsrIzoomFrame<= m_skipPreIzoomCount && applicationFrameNum >0) + { + temp_Index = (frameIndex > 0) ? (frameIndex -1) : MaxOutstandingRequests - 1; + m_skipFrameInfo[temp_Index].isSkipPreview = TRUE; + m_skipFrameInfo[temp_Index].isSkipViewFinder = TRUE; + CHX_LOG_INFO("preview izoom skip in frame:%d",temp_Index); + } + } + else + { + if(m_previewYuvsrIzoomFrame !=0 && applicationFrameNum >0) + { + temp_Index = (frameIndex > 0) ? (frameIndex -1) : MaxOutstandingRequests - 1; + m_skipFrameInfo[temp_Index].isSkipPreview = TRUE; + CHX_LOG_INFO("preview izoom skip out frame:%d",temp_Index); + } + m_previewYuvsrIzoomFrame = 0; + } + +} +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/// BackseatDriver::SetFrameSkipFlagForIZOOM +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VOID BackseatDriver::SetFrameSkipForPreviewIZOOM(camera3_capture_request_t* pRequest){UINT32 applicationFrameNum = pRequest->frame_number; diff --git a///qcom/extensionlayer/BackseatDriver.h b///qcom/extensionlayer/BackseatDriver.h index 0e643c8..5f1e8db 100755 --- a///qcom/extensionlayer/BackseatDriver.h +++ b///qcom/extensionlayer/BackseatDriver.h @@ -67,6 +67,9 @@VOID SetFrameSkipForPreviewIZOOM(camera3_capture_request_t* pRequest);+ VOID SetFrameSkipForPreviewYuvsrIZOOM( + camera3_capture_request_t* pRequest); +VOID SetFrameSkipForPreviewIZOOMSensor(camera3_capture_request_t* pRequest);@@ -164,6 +167,7 @@char* m_pBaseBuffer;BOOL m_isBrokenImage;UINT32 m_previewIzoomFrame; + UINT32 m_previewYuvsrIzoomFrame;INT32 m_skipPreIzoomCount;FLOAT m_trrigerIzoomRatio;diff --git a///qcom/extensionlayer/pluginbase.cpp b///qcom/extensionlayer/pluginbase.cpp index a21e66a..b90369f 100755 --- a///qcom/extensionlayer/pluginbase.cpp +++ b///qcom/extensionlayer/pluginbase.cpp @@ -4424,10 +4424,18 @@INT32* pBracketMode = NULL;INT32* pFeatureType = NULL; + INT32* psensorMode = NULL; + INT32 sensorMode = 0; +if (pMetadata != NULL){pBracketMode = static_cast<INT32*>(pMetadata->GetTag(regularMetaStr, "BracketMode"));pFeatureType = static_cast<INT32*>(pMetadata->GetTag(regularMetaStr,".feature.type")); + psensorMode = static_cast<INT32*>(pMetadata->GetTag(regularMetaStr,"sensor.mode.list")); + if(psensorMode != NULL) + { + sensorMode = psensorMode[0]; + }}Config Config = m_pMetaManager->GetConfig();@@ -4472,7 +4480,8 @@}if(m_isEnPreviewIzoom &&((pBracketMode != NULL && *pBracketMode == _BRACKET_12) - || (pFeatureType != NULL && *pFeatureType == OP_TURBO_RAW_IZOOM) + || (pFeatureType != NULL && (*pFeatureType == OP_TURBO_RAW_IZOOM|| (pBracketMode != NULL && + *pBracketMode == _BRACKET_NONE && *pFeatureType == OP_YUVSR && sensorMode == 1)))|| ((Config.ZoomRatio >= m_trrigerIzoomRatio) && !isCTSorGSI()))){if ((m_pZoomController->isInZoomState() || (0 != GetTurboTotalNum())) && @@ -4516,8 +4525,8 @@}if (pFeatureType != NULL && - (*pFeatureType == OP_HYBRIDRAW_IZOOM_TELE || *pFeatureType == OP_TURBO_RAW_IZOOM) && - !m_pZoomController->isInZoomState()) + (*pFeatureType == OP_HYBRIDRAW_IZOOM_TELE || *pFeatureType == OP_TURBO_RAW_IZOOM|| (pBracketMode != NULL && + *pBracketMode == _BRACKET_NONE && *pFeatureType == OP_YUVSR && sensorMode == 1)) &&!m_pZoomController->isInZoomState()){izoomEnabled = 1;}
2.6 :回退复测
回退复测,发现果然无此问题。且搜索问题版本日志,果然存在跳帧的正常debug日志:
行 24841: 07-17 17:35:57.336583 3365 3365 D CHIUSECASE: [DEBUG ] BackseatDriver.cpp:1287 SetFrameSkipFlag() Import skip preview sceneMode 0, frameIndex 227, applicationFrameNum 227, AeExposureCom 0, Bracket 0行 27424: 07-17 17:35:59.335478 3365 3579 D CHIUSECASE: [DEBUG ] BackseatDriver.cpp:1726 ProcessResult() [OP_EXT] skip preview, stream 0xb400007096d341e8, 1440x1080 ! internalFrameNum:279, FrameNumIndex 23行 31278: 07-17 17:36:02.353677 3365 3577 D CHIUSECASE: [DEBUG ] BackseatDriver.cpp:1726 ProcessResult() [OP_EXT] skip preview, stream 0xb400007096d341e8, 1440x1080 ! internalFrameNum:369, FrameNumIndex 113行 35608: 07-17 17:36:06.352156 3365 3577 D CHIUSECASE: [DEBUG ] BackseatDriver.cpp:1726 ProcessResult() [OP_EXT] skip preview, stream 0xb400007096d341e8, 1440x1080 ! internalFrameNum:489, FrameNumIndex 233行 39302: 07-17 17:36:09.350055 3365 3577 D CHIUSECASE: [DEBUG ] BackseatDriver.cpp:1726 ProcessResult() [OP_EXT] skip preview, stream 0xb400007096d341e8, 1440x1080 ! internalFrameNum:579, FrameNumIndex 67行 48172: 07-17 17:36:16.358805 3365 3386 D CHIUSECASE: [DEBUG ] BackseatDriver.cpp:1287 SetFrameSkipFlag() Import skip preview sceneMode 0, frameIndex 28, applicationFrameNum 796, AeExposureCom 0, Bracket 0
2.7 :解决方案
由于是共基线分支的其他项目的功能导通,影响到我们项目,因此我们通过添加解耦flag配置的方式,不执行这些代码即可。即可满足他们项目需求,又不影响自己项目。
【关注我,后续持续新增专题博文,谢谢!!!】
下一篇讲解: