一、双摄虚化导通流程
1.1 创建 LogicalCameraName 相关的metadata
LogicalCameraName 文件夹命名规则: 主摄_FeatureName
例如:(主摄_bayerwide, 主摄_bayertele, 主摄_bayerbayer, 主摄_bayermono)
预设单摄对应的metadata 已经存在并导通,将主摄(比如:SENSOR_DRVNAME_S5K3L6_MIPI_RAW_LIJING)的 metadata文件夹 copy 一份;
修改主摄文件夹名为LogicalCameraName;
比如:vendor\mediatek\proprietary\custom\mt***\hal\imgsensor_metadata\s5k3l6_mipi_raw_lijing_bayermono
修改创建 LogicalCameraName 文件夹中的metadata文件中 STATIC_METADATA2_BEGIN 后面的主摄的name 修改为LogicalCameraName;
比如:
$grep "S5K3L6" -ri .
./config_static_metadata.lens.s5k3l6mipiraw.h:STATIC_METADATA2_BEGIN(PLATFORM, LENS, SENSOR_DRVNAME_S5K3L6_MIPI_RAW_LIJING_bayermono)
./config_static_metadata.module.s5k3l6mipiraw.h:STATIC_METADATA2_BEGIN(PLATFORM, MODULE, SENSOR_DRVNAME_S5K3L6_MIPI_RAW_LIJING_bayermono)
./config_static_metadata.module.s5k3l6mipiraw.h:STATIC_METADATA2_BEGIN(PLATFORM, MOD_OVERWRITE, SENSOR_DRVNAME_S5K3L6_MIPI_RAW_LIJING_bayermono)
./config_static_metadata_availableKeys.h:STATIC_METADATA2_BEGIN(PLATFORM, AVAILABLE_KEYS, SENSOR_DRVNAME_S5K3L6_MIPI_RAW_LIJING_bayermono)
./config_static_metadata_custom.h:STATIC_METADATA2_BEGIN(PLATFORM, CUSTOM, SENSOR_DRVNAME_S5K3L6_MIPI_RAW_LIJING_bayermono)
./config_static_metadata_project.h:STATIC_METADATA2_BEGIN(PLATFORM, PROJECT, SENSOR_DRVNAME_S5K3L6_MIPI_RAW_LIJING_bayermono)
./config_static_metadata_project.h:STATIC_METADATA2_BEGIN(PLATFORM, PRO_OVERWRITE, SENSOR_DRVNAME_S5K3L6_MIPI_RAW_LIJING_bayermono)
./config_static_metadata_vendor.h:STATIC_METADATA2_BEGIN(PLATFORM, VENDOR, SENSOR_DRVNAME_S5K3L6_MIPI_RAW_LIJING_bayermono)
LogicalCamera Size相关:config_static_metadata_custom.h
后置人像尺寸:
CONFIG_METADATA_BEGIN(OPLUS_TUNNING_BACK_PORTRAIT_NORMAL_PICTURE_SIZE)
CONFIG_ENTRY_VALUE(4160, MINT32)
CONFIG_ENTRY_VALUE(3120, MINT32)
CONFIG_METADATA_END()
/主副摄照片尺寸
CONFIG_METADATA_BEGIN(OPLUS_CONTROL_BOKEH_PICTURE_SIZE)
CONFIG_ENTRY_VALUE(4160 , MINT32)
CONFIG_ENTRY_VALUE(3120 , MINT32)
CONFIG_ENTRY_VALUE(1600 , MINT32)
CONFIG_ENTRY_VALUE(1200 , MINT32)
CONFIG_METADATA_END()
1.2 导通LogicalCameraName Middleware 相关配置
Multicamra custom stereo Setting middleware 配置路径:
alps/vendor/mediatek/proprietary/custom/mt**/hal/camera/camera_custom_stereo_setting.h
主摄Name ,副摄Name ,LogicalCameraName(主摄_FeatureName)添加到camera_custom_stereo_setting.h中。
注意:主摄Name ,副摄Name ,LogicalCameraName 需要跟meatdata文件夹中的保持一致。
比如:
//主摄Name
"{"
"\"Name\": \"S5K3L6_MIPI_RAW_LIJING\","
"\"Capture Size\": {" //实际双摄图片的最终输出大小。
"\"4:3\": ["
"\"4160x3120\""
"],"
"\"16:9\": ["
"\"4160x2340\""
"]"
"},"
"\"IMGOYUV Size\": {" //在有Fov Crop 的情况下,不能配置为Sensor full size,建议比full size 小,或者配置FOV crop的值
"\"4:3\": \"4160x3120\","
"\"16:9\": \"4160x2340\""
"},"
"\"RRZOYUV Size\": {" //一般配置跟预览size 相等或者稍大,如果IMGOYUV Size的二分之一比预览size 大的话,也可以配置为IMGOYUV Size的二分之一。
"\"4:3\": \"2080x1560\","
"\"16:9\": \"2080x1170\""
"},"
"\"SensorScenarioZSD\": {" //人像对应的是VSDoF, 对应的Sensor Settings的Sensormode 是Custom1
"\"VSDoF\": \"custom1\","
"\"3rdParty\": \"custom1\","
"\"Zoom\": \"custom1\","
"\"MtkDepthmap\": \"custom1\","
"\"Multicam\": \"custom1\""
"},"
"\"SensorScenarioRecording\": {"
"\"VSDoF\": \"Video\","
"\"3rdParty\": \"custom1\","
"\"MtkDepthmap\": \"custom1\""
"},"
"\"FOV\": {"
"\"H\": 69.0,"
"\"V\": 54.4"
"},"
"\"Calibration\": {"
"\"Macro Distance\": 80,"
"\"Infinite Distance\": 5000" // 标定距离远处 50cm
"
}
//,副摄Name
"{"
"\"Name\": \"SC201CS_MIPI_RAW_LIJING\","
"\"Capture Size\": {"
"\"4:3\": ["
... ...
}
//,LogicalCameraName
"{"
"\"Logical Device\":{"
"\"Name\": \"bayermono\","
"\"Features\": [\"VSDoF\"]"
"},"
"\"Sensors\": [ \"S5K3L6_MIPI_RAW_LIJING\", \"SC201CS_MIPI_RAW_LIJING\"],"
"\"Depth Flow\": \"MtkDepthmap\","
"\"Module Type\": 2,"
"\"Baseline\": 1.82," //主副摄Sensor 中心距离
"\"FOV Crop\": {"
"\"Disable Crop\": 1" //如果副摄FOV可以 cover 到主摄FOV 就不需要做Crop,配置为Disable Crop,否则配置为 Center Crop
"},"
"\"Depthmap Size\": {"
"\"4:3\": \"480x360\","
"\"16:9\": \"480x272\""
"},"
"\"LDC\": [\"0\"]"
}
Caputre Size:实际双摄图片的最终输出大小。
IMGOYUV Size:在有Fov Crop 的情况下,不能配置为Sensor full size,建议比full size 小,或者配置FOV crop的值。
RRZOYUV Size:一般配置跟预览size 相等或者稍大,如果IMGOYUV Size的二分之一比预览size 大的话,也可以配置为IMGOYUV Size的二分之一。
SensorScenaricZSD:人像对应的是VSDoF, 对应的Sensor Settings的Sensormode 是Custom1
FOV : 市场角,规格说明书中有H/V 或者D两种表达
Calibration: 标定距离远处 50cm
Baseline: 主副摄Sensor 中心距离,涉及到标定。
FOV Crop: 如果副摄FOV可以 cover 到主摄FOV 就不需要做Crop,配置为Disable Crop,否则配置为 Center Crop
比如:
\kernel-4.14\drivers\misc\mediatek\imgsensor\src\mt***\camera_project\k6833v1_64\s5k3l6_mipi_raw_lijing
.custom1 = {
.pclk = 480000000, //record different mode's pclk
.linelength = 4896, //record different mode's linelength
.framelength = 4084, //record different mode's framelength
.startx = 0, //record different mode's startx of grabwindow
.starty = 0, //record different mode's starty of grabwindow
.grabwindow_width = 4160, //record different mode's width of grabwindow
.grabwindow_height = 3120, //record different mode's height of grabwindow
/* following for MIPIDataLowPwr2HighSpeedSettleDelayCount by different scenario */
.mipi_data_lp2hs_settle_dc = 85,
/* following for GetDefaultFramerateByScenario() */
.max_framerate = 240,
.mipi_pixel_rate = 454400000,
},
1.3 抓开机Log(boot_normal的main log) 确认 LogicalCameraName 是否创建成功
打开logD命令抓取开启log方式:
adb root
adb shell setenforce 0
adb shell setprop persist.vendor.mtk.camera.log_level 3
adb shell setprop persist.vendor.debug.camera.log 3
adb shell pkill camerahalserver
adb shell pkill cameraserver
Log 关键字:
LogicalDevice|Logical Device Name|addLogicalDevice|queryDriverName
or
LogicalDevice: Sensor #|addLogicalDevice|queryDriverName] queryDriverName
// LogicalCameraName 名称 bayermono,包含的物理主副摄 Sensor 名,Feature:vsdof
01-01 04:35:58.196228 26609 26609 D MtkCam/Util/LogicalDevice: Logical Device Name: bayermono
01-01 04:35:58.196262 26609 26609 D MtkCam/Util/LogicalDevice: Sensor #0: S5K3L6_MIPI_RAW_LIJING(ID: 0)
01-01 04:35:58.196278 26609 26609 D MtkCam/Util/LogicalDevice: Sensor #1: SC201CS_MIPI_RAW_LIJING(ID: 2)
01-01 04:35:58.196296 26609 26609 D MtkCam/Util/LogicalDevice: vsdof //对应的Feature 是vsdof 虚化
01-01 04:35:58.196312 26609 26609 D MtkCam/Util/LogicalDevice: ---------------
... ...
//成功添加 Logical camera SENSOR_DRVNAME_S5K3L6_MIPI_RAW_LIJING_bayermono 并查询index 为3
01-01 04:35:58.198808 26609 26609 D MtkCam/Util/LogicalDevice: (26609)[addLogicalDevice] query static metadata for multi-cam (SENSOR_DRVNAME_S5K3L6_MIPI_RAW_LIJING_bayermono)
01-01 04:35:58.226454 26609 26609 I MtkCam/Util/LogicalDevice: (26609)[addLogicalDevice] add new logic device: SENSOR_DRVNAME_S5K3L6_MIPI_RAW_LIJING_bayermono
01-01 04:35:59.019505 26609 26609 D MtkCam/Util/LogicalDevice: (26609)[queryDriverName] queryDriverName index : 3
01-01 04:35:59.019530 26609 26609 D MtkCam/Util/LogicalDevice: (26609)[queryDriverName] queryDriverName : SENSOR_DRVNAME_S5K3L6_MIPI_RAW_LIJING_bayermono
01-01 04:45:12.691179 11172 11855 I CameraService: CameraService::connect call (PID -1 "com.oplus.camera", camera ID 3) and Camera API version 2
1.4 双摄bringup LogicalCameraDevice 导通参考修改:
-
lijing 项目提交bringup 修改提交:
http://gerrit.scm.adc.com:8080/#/c/15614766/ -
004_ISP7_Multi-Camera(SAT,VSDOF).pdf
-
ISP7_How_to_use_custom_setting_file.pdf
-
VSdof :Video Shallow Depth of Field 视频浅景深
-
SAT: Spatial Alignment Transform 光变切换(空间对齐变换)
-
PIP: Picture in Picture 画中画(双景录像)
二、APS Bokeh 实现
2.1 Bokeh 代码路径
lijing项目代码路径:
vendor\***\camera\aps_algorithms\mtk\22083\
Bokeh lib 路径:
vendor\***\camera\aps_algorithms\mtk\22083\algos\bokeh\libs\arm64-v8a
├── libarcsoft_aicolor_image.so //人像留色
// 后置双目人像
├── libarcsoft_dualcam_bokeh_api.so
├── libarcsoft_dualcam_refocus_left.so
├── libarcsoft_dualcam_refocus_preview.so
├── libarcsoft_dualcam_refocus_right.so
├── libarcsoft_dualcam_refocus_uw.so
├── libarcsoft_hdr_couple_api.so //CHDR
├── libarcsoft_high_dynamic_range_couple.so //CHDR
└── libarcsoft_low_light_hdr_for_neon.so //光斑人像
代码路径
vendor\***\camera\aps_interface\source_code\algos\bokeh
2.2 Bokeh 流程
部分log关键字:
connect call|CameraDevice3Impl::open|session::open|HalDeviceAdapter::powerOn|MtkCam/HalSensor: [powerOn]|beginConfigure|AppMgr-configureStreams|convertStreamConfigurationFromHidl|processCaptureRequest] -> 1st request - OK|apsAlgoflagDecision|MultiFrameCnt:|cameratest|frame number:|bokehDoProcess|capture_algo_list
aps log关键字:
bokehDoProcess|ALGO_BOKEH|capture_algo_list|connect call|APS_INTERFACE|APS_CORE|ApsAdapter|cameratest|apsAlgoflagDecision|ALGO_RTB|doRTBProcess|doProcess|ALGO_RTB
Bokeh 多帧是通过Preview Decision 结果中的Frame count( MultiFrameCnt)决定。
1帧走Bokeh
2帧走HDR
4帧走Bokeh MD
5帧走 MDHDR/LLHDR
\vendor\***\camera\aps_interface\source_code\algos\bokeh\v1\bokeh\OCamBokehParam.cpp
#define BOKEH_MD_FRAME_NUMBER 4
#define BOKEH_HDR_FRAME_NUMBER 2
#define BOKEH_LLHDR_FRAME_NUMBER 5
Bokeh 流程log
07-05 13:49:34.067351 13610 14206 I APS_INTERFACE: [INFO][ ALGO_BOKEH ] OCamBokeh.cpp: 773 doBokehRegister() E
07-05 13:49:34.067514 13610 14206 I APS_INTERFACE: [INFO][ ALGO_BOKEH ] OCamBokehParam.cpp: 184 bokehSetupInitParameters() getJsonMetadata, pData: 0xb400007e9069d420, count: 54, rotation: 0, portraitMode: 2, dualCaliType: 1, isTeleMaster: 0, isAppSetBlurintensity: 0, foregroundBlurScale: 0, runTimeMemSize: 800, master: {4000 3000 4000 3000 4000 3000 4000 3000 1 0}, slave: {1600 1200 1600 1200 1600 1200 1600 1200 1 0}
07-05 13:49:34.067533 13610 14206 E APS_INTERFACE: [ERROR][ ALGO_BOKEH ] OCamBokehParam.cpp: 213 bokehSetupInitParameters() createDumpDirectory: /sdcard/Android/data/com.oplus.camera/files/spdebug/bokehdump/ failed !!
07-05 13:49:34.068457 13610 14206 E APS_INTERFACE: [ERROR][ ALGO_BOKEH ] OCamBokeh.cpp: 269 bokehLoadLibrary() AIColor not support
07-05 13:49:34.068471 13610 14206 I APS_INTERFACE: [INFO][ ALGO_BOKEH ] OCamBokeh.cpp: 280 bokehLoadLibrary() parse lib:/odm/lib64/libarcsoft_dualcam_bokeh_api.so OK!
07-05 13:49:34.077679 13610 14206 I APS_INTERFACE: [INFO][ ALGO_BOKEH ] OCamBokeh.cpp: 537 bokehInit() sSelectMasterType: 1
07-05 13:49:34.077704 13610 14206 I APS_INTERFACE: [INFO][ ALGO_BOKEH ] OCamBokeh.cpp: 550 bokehInit() version: ArcSoft_DualCamRefocus_Wrapper_1.4.125235221.141_#21438-19-B16344
07-05 13:49:34.078655 13610 14206 I APS_INTERFACE: [INFO][ ALGO_BOKEH ] OCamBokehMultiframeDenoise.cpp: 79 bokehMdLoadLibrary() parse lib:/odm/lib64/libVDDualCameraBlurlessAPI.so OK
07-05 13:49:41.577874 13610 14206 I APS_INTERFACE: [INFO][ ALGO_BOKEH ] OCamBokeh.cpp: 2346 doBokehProcess() E. operation mode: 0x8011, register operation mode: 0x8011
2.3 Preview Bokeh 流程
Preview Bokeh 代码位置:
vendor\***\camera\aps_interface\source_code\previewalgos\rtb
doRTBInit -->doLoadLibrary-->getCameraStreamInfo-->doProcess
Preview Bokeh 流程log
07-05 13:49:33.634713 13610 14625 I APS_INTERFACE: [INFO][ ALGO_RTB ] APSRTBNode.cpp: 1183 doRTBInit() E
07-05 13:49:33.634735 13610 14625 I APS_INTERFACE: [INFO][ ALGO_RTB ] APSRTBNode.cpp: 1372 doLoadLibrary() E
07-05 13:49:33.634750 13610 14625 I APS_INTERFACE: [INFO][ ALGO_RTB ] APSRTBNode.cpp: 1386 doLoadLibrary() APS RTB select: /odm/lib64/libarcsoft_dualcam_bokeh_api.so, m_bokehSelect:0
07-05 13:49:33.646384 13610 14625 I APS_INTERFACE: [INFO][ ALGO_RTB ] APSRTBNode.cpp: 1816 getCameraStreamInfo() APS RTB streamInfo width: 1280, height: 960, stride: 1280, scanline: 960
07-05 13:49:33.792565 13610 14625 I APS_INTERFACE: [INFO][ ALGO_RTB ] APSRTBNode.cpp: 172 doProcess() E frame number:0
07-05 13:49:33.792857 13610 14625 I APS_INTERFACE: [INFO][ ALGO_RTB ] APSRTBNode.cpp: 472 getInputMetaData() SensorName sensorName s5k3l6
dump&&debug
dump 路径:
/sdcard/Android/data/com.oplus.camera/files/spdebug
adb 命令:
adb shell setprop cam.aps.bokeh.dumpcount 10 //张数
adb shell setprop persist.camera.aps.rtb.dumptextenable 1
校定bin文件路径:
/mnt/vendor/persist/camera/dual_calibration








网友评论