qcom sm6225 ard14升级ard16后闪光的预闪异常过曝问题
一、解决问题
调整tuning参数中flash.xml的 flashstatsPreprocessing 参数,
1. 先将frameSkipMethod的SkipSystemLatency的改成SkipOne ,解决首帧aec stats异常直接进settle状态,影响后续闪光预览流程ae收敛等。
2.修改statsPreprocessing中的thresBrightSatDiff和thresBrightSat的值,从0.1/0 ---> 0.03/0.15 ,解决初始过曝直接settle的异常的问题。
二、问题分析过程涉及的闪光流程加log原码位置和各状态值等。
1.原码位置:
vendor/qcom/proprietary/camx/src/swl/stats/camxaecengine.cpp
vendor/qcom/proprietary/camx/src/swl/sensor/camxflash.cpp
vendor/codeaurora/packages/apps/SnapdragonCamera/src/com/android/camera/CaptureModule.java
vendor/qcom/proprietary/camx/src/hwl/ope/camxopenode.cpp
vendor/qcom/proprietary/camx/src/hwl/tfe/camxtfenode.cpp
grep -rn "preFlashState\s*=" . 搜素赋值位置
frameworks/base/core/java/android/hardware/camera2/CaptureRequest.java
frameworks/base/core/java/android/hardware/camera2/CameraMetadata.java
2.各状态值
CaptureIntent:
* @see #CONTROL_CAPTURE_INTENT_CUSTOM
* @see #CONTROL_CAPTURE_INTENT_PREVIEW
* @see #CONTROL_CAPTURE_INTENT_STILL_CAPTURE
* @see #CONTROL_CAPTURE_INTENT_VIDEO_RECORD
* @see #CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT
* @see #CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG
* @see #CONTROL_CAPTURE_INTENT_MANUAL
* @see #CONTROL_CAPTURE_INTENT_MOTION_TRACKING
FlashMode
* @see #FLASH_MODE_OFF
* @see #FLASH_MODE_SINGLE
* @see #FLASH_MODE_TORCH
AEMode 与对应值/含义关系
* @see #CONTROL_AE_MODE_OFF
* @see #CONTROL_AE_MODE_ON
* @see #CONTROL_AE_MODE_ON_AUTO_FLASH
* @see #CONTROL_AE_MODE_ON_ALWAYS_FLASH
* @see #CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE
* @see #CONTROL_AE_MODE_ON_EXTERNAL_FLASH
FlashState
0. UNAVAILABLE,闪光灯硬件不可用,无法执行闪光操作
1. CHARGING,闪光灯处于电容充电状态,暂无法响应闪光请求
2. READY,闪光灯已完成充电,随时可触发闪光
3. FIRED,闪光灯刚完成一次闪光触发
4. PARTIAL,部分闪光,仅在特殊场景下出现
flashType 当前闪光灯的类型:
0. 无闪光操作/待机
1. 预闪相关流程
2. 主闪正式拍照流程
aestate
0. CONTROL_AE_STATE_INACTIVE | AE 算法处于非活动状态。通常在切换 AE 模式、控制模式或场景模式后,AE 状态会重置为此状态。
1. CONTROL_AE_STATE_SEARCHING | AE 算法正在调整曝光参数,尚未达到目标亮度,处于收敛过程中。
2. CONTROL_AE_STATE_CONVERGED | AE 算法已成功收敛,找到了当前场景的正确曝光值,曝光参数不再改变。
3. CONTROL_AE_STATE_LOCKED | 当前的 AE 参数已被锁定,曝光值固定不变。
4. CONTROL_AE_STATE_FLASH_REQUIRED | AE 算法已收敛,但判定当前场景光线不足,拍照时最好打开闪光灯以获得更好的图像亮度。
5. CONTROL_AE_STATE_PRECAPTURE | AE 算法进入了预捕获测光状态,通常由应用触发,为拍摄高质量照片做准备。
afstate
0. CONTROL_AF_STATE_INACTIVE | AF 算法处于非活动状态,镜头不移动。通常在 AF 模式为 OFF 或 EDOF 时保持此状态。
1. CONTROL_AF_STATE_PASSIVE_SCAN | 持续对焦模式下,HAL 层发起的主动扫描,镜头正在移动以搜索焦点。
2. CONTROL_AF_STATE_PASSIVE_FOCUSED | 持续对焦模式下,算法判定对焦成功,镜头停止移动。HAL 层会自动离开此状态。
3. CONTROL_AF_STATE_ACTIVE_SCAN | 由应用触发(AF_TRIGGER_START)的主动扫描,镜头正在移动以搜索焦点。
4. CONTROL_AF_STATE_FOCUSED_LOCKED | 对焦成功且镜头位置已锁定。通常由主动扫描成功后进入,或持续对焦模式下收到 AF 触发后进入。
5. CONTROL_AF_STATE_NOT_FOCUSED_LOCKED | 对焦失败且镜头位置已锁定。通常由主动扫描失败后进入,或持续对焦模式下收到 AF 触发后进入。
6. CONTROL_AF_STATE_PASSIVE_UNFOCUSED | 持续对焦模式下,算法判定对焦失败,镜头停止移动。HAL 层会自动离开此状态。
ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER
0. CANCEL 取消 中止正在进行的预捕获流程,AE 状态回归正常搜索或收敛。
1. START 开始 触发预捕获序列(预闪+测光),AE 状态进入 PRECAPTURE。
// 典型定义示例(位于 vendor/qcom/camera/camx/node/aec/ 或 include 目录)
enum class PreFlashState {
PreFlashStateIdle = 0, // 空闲状态
PreFlashStateStart = 1, // 预闪启动状态(触发瞬间)
PreFlashStateRER = 2, // 预闪执行/测光中 (Request Exposure Readout)
PreFlashStateCompleteLED = 3, // 预闪完成,需要闪光
PreFlashStateCompleteNoLED = 4, // 预闪完成,不需要闪光
PreFlashStateUnknown = 5 // 未知/异常状态
};
三、分析过程的闪光灯拍照流程
updateCaptureStateMachine ---> STATE_WAITING_PRECAPTURE ---> lockExposure ---> applySettingsForLockExposure ---> STATE_WAITING_AE_LOCK ---> checkAfAeStatesAndCapture ---> captureStillPicture ---> captureStillPictureForCommon ---> onCaptureCompleted --->onCaptureSequenceCompleted ---> unlockFocus ---> applySettingsForUnlockExposure
四、statsPreprocessing 参数说明
thresBrightLevelDiff (默认值 30) 当前帧亮度(luma)与上一帧亮度的差值阈值, 若帧间亮度差 < 该值,AEC 倾向于认为已收敛,降低此值 → 预闪收敛需达到更暗的曝光才宣告 settled
thresBrightLevel (默认值 190 (180-210)) 帧亮度绝对值上限阈值(0-255范围),若当前 luma > 该值,AEC 判定场景过亮,可能提前停止收敛。增大此值 → 让收敛达到更暗的曝光才宣告 settled
thresBrightSatDiff (默认值 0.1 (0.03-0.15)) 帧间饱和像素比例的变化差值阈值, 若帧间饱和像素比例变化 < 该值,AEC 倾向于认为已收敛, 降低此值 → 要求饱和像素比例更稳定才宣告 settled
thresBrightSat (默认值 0 (0.15-0.3)) 饱和像素占全帧比例的绝对值上限阈值, 若饱和像素占比 > 该值,AEC 判定场景过饱和,可能提前停止收敛, 增大此值 → 容忍更多饱和像素,不轻易停止收敛
minLuma (默认值 15 (8-25)) 预闪收敛期间 luma 的最低保护阈值, 若 luma 下降至该值以下,AEC 停止继续降低曝光
minLumaAdj (默认值 0.55 (0.5-1.0)) luma 最低值调整系数,影响 AEC 收敛速度, 增大此值 → 收敛更快;减小此值 → 收敛更稳定(重复达到同一曝光值)
enableDynamicMinAdj 若开启,AEC 会根据预闪场景中亮度百分比动态插值 minLumaAdj,从 0.55 逐渐过渡到 minLumaAdjEnd(0.1),使低亮度区域收敛更保守。
percThresh.start 动态调节起始百分比阈值
percThresh.end 动态调节结束百分比阈值
minLumaAdjEnd 动态调节结束时的 minLumaAdj 目标值
浙公网安备 33010602011771号