相机定屏问题分析五:【跳帧异常】照片模式1x以上的焦段拍照之后定屏

【关注我,后续持续新增专题博文,谢谢!!!】

上一篇我们讲了:

这一篇我们开始讲: 相机定屏问题分析五:【跳帧异常】照片模式1x以上的焦段拍照之后定屏9573412

目录

一、问题背景

二、问题分析过程

2.1:基于原理分析

[2.2 :分析返帧情况](#2.2 :分析返帧情况)

[2.3 :分析返帧异常](#2.3 :分析返帧异常)

[2.4 :无Error异常日志分析思路](#2.4 :无Error异常日志分析思路)

[2.5 :差异提交](#2.5 :差异提交)

[2.6 :回退复测](#2.6 :回退复测)

[2.7 :解决方案](#2.7 :解决方案)


一、问题背景

【操作步骤】【Operation steps】进入照片模式(后置),1x以上进行拍照

【实际结果】【Actual results】拍照定屏

【期望结果】【Expected results】无闪退、定屏等

二、问题分析过程

2.1:基于原理分析

对于Camera HAL底层而已,我们需要排查返帧是否正常,若底层都没返帧,那么上层显示自然存在问题。

2.2 :分析返帧情况

1:参考HAL3一级日志关键字:相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

2:我们可以确认配流和打开相机均正常,但返帧确实异常,很多帧没有返回。如下:

cpp 复制代码
	行 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异常日志分析思路

分析思路:

  1. 功能性问题,返帧失败,Camx hal进程就会有报错来体现返帧失败的过程或原因。
  2. 没有异常日志,说明大概率是正常的功能需求,才不会打印error日志,而正常功能需求一般没有足够测试影响范围,导致的性能稳定性问题。
  3. 常规做法:根据返帧流程添加日志分析哪里出现问题,但这样分析周期一般偏长。
  4. 二分法排查:项目紧张情况下,快速解决问题的方式是,根据必须或概率高复现路径,利用二分法排查哪个版本出现的问题,确定了某一天的版本有问题,然后差异提交去定位具体哪一个提交引入的问题,这样解决问题就非常有针对性,且快速解决问题。参考:相机camera开发之差异对比核查一:测试机和对比机的硬件配置差异对比 相机camera开发之差异对比核查二:测试机和对比机的差异提交对比相机camera开发之差异对比核查三:测试机和对比机的Camera算法库、解耦配置和快稳省差异对比相机camera开发之差异对比核查四:测试机和对比机的Camera动态参数差异对比及关键字

2.5 :差异提交

结果差异提交二分法排查,很快找到Camera相关仓库的几笔差异提交,结果技术分析,排查完全无影响的提交,最终锁定一笔功能导通的提交非常可疑,如下:这笔提交明显存在SetFrameSkipForPreview和SetFrameSkipFlag相关跳帧的改动。

diff 复制代码
导通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_continueDropframeCount
     m_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日志:

cpp 复制代码
	行 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配置的方式,不执行这些代码即可。即可满足他们项目需求,又不影响自己项目。

【关注我,后续持续新增专题博文,谢谢!!!】

下一篇讲解: