和你一起终身学习,这里是程序员 Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、问题描述
测试同事报了一个拍照后预览闪绿条纹问题
现象大概如下图:
二、问题分析
1. 复现问题 dump 图分析查看是哪个阶段导致的预览花屏问题
1.1 整个P2S I/O buffer 的 dump 方法
adb root
adb remount
adb shell setenforce 0
adb shell setprop persist.vendor.mtk.camera.log_level 3
::P1 dump
::adb shell setprop vendor.debug.camera.dump.en 1
::adb shell setprop vendor.debug.feature.forceEnableIMGO 1
::adb shell setprop vendor.debug.camera.dump.p1.imgo 1
:: 预览魔法数字开启
adb shell setprop debug.cam.drawid 1
::enable img3o
adb shell setprop vendor.debug.fpipe.force.img3o 1
adb shell rm -rf /data/vendor/camera_dump/*
adb shell setprop vendor.debug.p2f.dump.enable 1
adb shell setprop vendor.debug.p2f.dump.mode 1
adb shell setprop vendor.debug.camera.preview.dump 1
::adb shell setprop vendor.debug.camera.preview.dump 0 复现问题后请关闭dump
adb shell stop camerahalserver
adb shell start camerahalserver
pause
1.2 camera_dump文件夹下的文件名称命令格式
UniqueKey-RequestNo-FrameNo-SensorDev-Port-BufferWidth-BufferHeight-BufferStride_ImageWidthxImageHeight_xxx.Format
在/data/vendor/camera_dump 下会dump 不同阶段的内容
sub P1 rrzo buffer
142407049-109-137-sub-rrzo-PW1280-PH960-BW2400__1280x960_10_3.packed_wordimg3o buffer (P2Anode 下过了ISP 但是还没过MDP 的buffer,供3DNR用)
142407049-109-137-sub-img3o-PW1280-PH960-BW1280__1280x960_8_s0.yv12sub 的P1 lcso buffer
142407049-109-137-sub-PW384-PH384-BW768__326x244_12_s0.lcso ---> sub sensor 的P1 lcso bufferpreviewCallback ,也就是P2S 最终输出的sub sensor 的previewCallback buffer
142407049-109-137-sub-undef-PW960-PH720-BW960__960x720_8_s0.nv21wdmao 代表判断为 display output buffer,也就是P2S 最终输出的sub sensor的display buffer
142407049-109-137-sub-wdmao-PW960-PH720-BW960__960x720_8_s0.nv21
通过 dump 查看 经过P2Anode 输出的yv12 图就有条纹问题,然后需要查看有条纹问题那一帧附近的log。
1.3 dump 异常图Android log 分析
出现问题帧时间点: 14:25:21.430129 附近
1.4 查看14:25:21.430129 附件对应的 kernel log
kernel log时间 +8 H +10ms 即kernel 时间 295 附近 = android 异常帧时间: 14:25:21.430129
异常条纹帧是,sensor driver 有调用set_max_framerate 更新 framelength =3008 导致预览坏帧发生。
[ 285.672406][T603753] 3AEventThd: xxx_SensroDriver[set_shutter] CST_004:xxx_SensroDriver set_shutter(): ratio = 64, real_shutter =6016, framelength =3133,mini_framelegth=3133
[ 285.726555][T603753] 3AEventThd: xxx_SensroDriver[set_shutter] CST_004:xxx_SensroDriver set_shutter(): ratio = 64, real_shutter =6016, framelength =3133,mini_framelegth=3133
// +8 H +10ms 即kernel 时间 295 附近 = android 异常帧时间: 14:25:21.430129
[ 285.823289][T500109] wdtk-5: [thread:109] 2025-03-10 06:25:11.875381 UTC;android time 2025-03-10 06:25:11.875381
[ 285.832074][ T3753] 3AEventThd: xxx_SensroDriver[set_shutter] CST_004:xxx_SensroDriver set_shutter(): ratio = 64, real_shutter =6016, framelength =3133,mini_framelegth=3133
[ 285.876262][ T3753] 3AEventThd: xxx_SensroDriver[set_shutter] CST_004:xxx_SensroDriver set_shutter(): ratio = 64, real_shutter =6016, framelength =3133,mini_framelegth=3133
... ...
[ 294.567745][T703753] 3AEventThd: xxx_SensroDriver[set_shutter] CST_004:xxx_SensroDriver set_shutter(): ratio = 64, real_shutter =6016, framelength =3133,mini_framelegth=3133
[ 294.594359][T703753] 3AEventThd: xxx_SensroDriver[set_shutter] CST_004:xxx_SensroDriver set_shutter(): ratio = 64, real_shutter =6016, framelength =3133,mini_framelegth=3133
[ 295.217019][T203753] 3AEventThd: xxx_SensroDriver[set_shutter] CST_004:xxx_SensroDriver set_shutter(): ratio = 64, real_shutter =6016, framelength =3133,mini_framelegth=3133
//+8 H +10ms 即kernel 时间 295 附近 = android 异常帧时间: 14:25:21.430129
// 异常条纹帧是,sensor driver 有调用set_max_framerate 更新 framelength =3008 导致预览坏帧发生
[ 295.268061][ T3753] 3AEventThd: xxx_SensroDriver[set_max_framerate] xxx_SensroDriver set_max_framerate():framerate = 300, min framelength should enable = 1
[ 295.269492][ T3753] 3AEventThd: xxx_SensroDriver[set_shutter] CST_004:xxx_SensroDriver set_shutter(): ratio = 64, real_shutter =6016, framelength =3008,mini_framelegth=2506
[ 295.308503][T403753] 3AEventThd: xxx_SensroDriver[set_max_framerate] xxx_SensroDriver set_max_framerate():framerate = 240, min framelength should enable = 1
[ 295.309832][T403753] 3AEventThd: xxx_SensroDriver[set_shutter] CST_004:xxx_SensroDriver set_shutter(): ratio = 64, real_shutter =6016, framelength =3133,mini_framelegth=3133
[ 295.341744][T403753] 3AEventThd: xxx_SensroDriver[set_shutter] CST_004:xxx_SensroDriver set_shutter(): ratio = 64, real_shutter =6016, framelength =3133,mini_framelegth=3133
[ 295.396582][ T3753] 3AEventThd: xxx_SensroDriver[set_shutter] CST_004:xxx_SensroDriver set_shutter(): ratio = 64, real_shutter =6016, framelength =3133,mini_framelegth=3133
三、RAW 查看工具
MTK_packed_word_convert_RAW 转换工具
readme.txt
1.请将需要转换的文件 *.packed_word 文件放置到camera_dump 文件中
比如: 111541285-0158-0151-main-imgo-PW4096-PH3072-BW5120__4096x3072_10_2.packed_word
2.修改 convert_packed_word_to_Raw.bat 脚本for 循环的宽高size尺寸为 packed_word的尺寸
比如: 举例的尺寸为4096x3072
3.修改后执行 convert_packed_word_to_Raw.bat 脚本,然后再 convert2raw 文件夹中查看
4.使用 RawImageViewer.exe 查看转换的RAW 图即可
工具下载链接:https://pan.baidu.com/s/1meZE44-CUfbrMLgb8J_CJg?pwd=6666
提取码:6666
四、问题解决
发现Camera sensor驱动文件的流程存在少许问题,错误调节了framelength,导致预览出现概率性坏帧发生, 找到问题点后,修改framelength update 流程,此问题后续压测不复现。
五、拍照花图dump 命令
5.1 dump 拍照过程中不同阶段图的方法
adb root
adb remount
adb shell setenforce 0
adb shell setprop vendor.debug.camera.capture.log 3
::P2A Node
adb shell setprop vendor.debug.camera.p2.dump 1
adb shell setprop vendor.debug.camera.upkraw.dump 1
adb shell setprop vendor.debug.camera.dump.campipe 1
adb shell setprop vendor.debug.camera.img3o.dump 1
:: YuvNode
adb shell setprop vendor.debug.camera.capture.yuv.img.dump 1
::JpegNode
adb shell setprop vendor.debug.camera.log.JpegNode 1
::/data/vendor/camera_dump 目录
adb shell rm -rf /data/vendor/camera_dump/*
adb shell chmod 777 -R /data/vendor/camera_dump/
:: 预览魔法数字开启
adb shell setprop debug.cam.drawid 1
adb shell stop camerahalserver
adb shell start camerahalserver
pause
dump 后Raw yuv 等图保存在 data/vendor/camera_dump 目录下:
至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!