camera调试:安卓添加xml注册
对接安卓的平台时,需要注册对应的camera设备,供安卓标准api进行操作,rk的平台需要在HAL层配置camera3_profiles.xml文件,适配驱动的信息,进行注册camera设备。该xml对应的内容很多,很多CTS测试问题都是该文件配置导致。对应不同的sensor,建议根据功能更新xml配置。以下对xml部分配置做一下简要的说明:
目录
1.xml文件说明
2.xml属性
2.1 设备注册名称与ID
2.2 Android_metadata
2.2.1 control.aeAvailableAntibandingModes
2.2.2 control.aeAvailableModes
2.2.3 control.aeAvailableTargetFpsRanges
2.2.4 control.afAvailableModes
2.2.5 control.awbAvailableModes
2.2.6 jpeg.maxSize
2.2.7 lens.info.availableApertures
2.2.8 lens.info.availableFocalLengths
2.2.9 lens.info.minimumFocusDistance
2.2.10 lens.facing
2.2.11 scaler.availableMaxDigitalZoom
2.2.12 scaler.availableStreamConfigurations
2.2.13 scaler.availableMinFrameDurations
2.2.14 scaler.availableStallDurations
2.2.15 sensor.info.activeArraySize
2.2.16 sensor.info.physicalSize
2.2.17 sensor.info.pixelArraySize
2.2.18 sensor.orientation
2.2.19 flash.info.available
2.2.20 supportTuningSize
2.2.21 sensorType
2.2.22 statistics.initialSkip
2.2.23 aiq.workingMode
2.2.24 aiq.multicamera
3. 注意点
1.xml文件说明
camera3_profiles.xml文件对应SDK目录下具体芯片平台的文件:
hardware/rockchip/camera/etc/camera/camera3_profiles_rk3xxx.xml
在设备上的路径为:
/vendor/etc/camera/camera3_profiles.xml
若是临时调试,可以采用adb替换文件的形式,但需要注意文件路径与文件名的正确性。
camera3_profiles.xml包含多个Profiles节点,Profiles节点包含一个完整的camera属性列表,机器有几个camera,就需要配置几个Profiles节点。
Profiles 节点下又包含了如下四个子节点。
<Profiles cameraId="0" name="ov50c40" moduleId="m00"><Supported_hardware></Supported_hardware><Android_metadata> <!-- Android static metadata only --></Android_metadata>
<!-- ******************PSL specific section start **************************************************************--><Hal_tuning_RKISP1> </Hal_tuning_RKISP1><Sensor_info_RKISP1> </Sensor_info_RKISP1><!-- ******************PSL specific section end **************************************************************-->
<Android_metadata> 节点包含的信息主要是 camera 的能力支持,该字段的信息上层将通过 camera_module 的 API:get_camera_info() 获取到。Camera 运行时也可以通过如下命令获取到相关的信息。
2.xml属性
简要介绍一下xml中需要配置的一些相关属性。
2.1 设备注册名称与ID
xml中name参数与moduleid参数取决定着能否成功注册安卓camera设备,若该两项属性配置异常,则会导致
-
name:需要与驱动名称一致,有大小写区别;
-
moduleId:需要与驱动dts中配置的index一致,关键配置项,值格式为 “mxx”,其中 “m”为“module”缩写,“xx”为十进制数字,标示camera 唯一编号,moduleId 需要与驱动 DTS 中配置相一致,否则将探测错误。另外,配置多个camera 时,多个 camera 的<profiles>项需要按照 moduleId 升序排列。
通过如下命令: adb shell cat /sys/class/video4linux/*/name 可以获取所有 v4l2 设备点节的名字,其中形如 m00_b_ov5695 2-0036 为 sensor 节点名称。 该命令规则中, m00 代表 moduleId ,主要为匹配 len,flash之用, ‘b’ 代表 camera 方向为后置,如果是前置则为‘f’,‘ov5695’代表 sensor name , ‘2-0036’代表 I2c 地址。
2.2 Android_metadata
以 下 Android_metadata 设 置 项 主 要 为 Android 相 关 配 置 项 , 各 字 段 具 体 可 参 考
<SDK>/system/media/camera/docs/docs.html 说明。
2.2.1 control.aeAvailableAntibandingModes
SOC: AUTO
RAW: 50HZ,60Hz // 以排在首位的作为初始化配置
2.2.2 control.aeAvailableModes
ON // 不支持 flash 时
ON,ON_AUTO_FLASH,ON_ALWAYS_FLASH // 支持 flash 时
2.2.3 control.aeAvailableTargetFpsRanges
该设置项有多个限制需要注意:
1) 录像必需要有一组恒定帧率, 假如帧率为 x, 那就要包含(x,x)
2) 录像帧率必需至少要一组大于 24 帧
3) 第一组必需 Min <= 15. 所以第一组一般为 (15,x)
4) 各组帧率需要按升序排列
升序具体意义为,假设有定义有两组帧率:(min1,max1),(min2,max2),则 max2 >=max1,max2 == max1 时,还需要满足 min1 <= min2。
一般情况下 sensor 驱动只会输出两组分辨率,全分辨率及 binning 分辨率,其他分辨率即使有调试也一般不使用(可由 ISP 裁剪及缩放得到)。
假设:
max2 = max_fps_bining
max1 = max_fps_full
且 max2 >= max1
那么
1)如果 max1 > 15,可按如下配置
(min1,max1),(max1,max1),(min2,max2),(max2,max2)
其中 min1 <=15, min2 > 0,max2 >= 24。如果需要增加录像的固定帧率,则按上述升序列规则添加即可。
示例如下:
假如: max1 = 20, max2 = 30, 且需要有 15 fps 的固定录像帧率,那么可按如下配置:
(15,15),(10,20),(20,20),(10,30),(30,30)
2)如果 max1 <= 15,可按如下配置
(max1,max1),(min2,max2),(max2,max2)
其中 min2 > 0,max2 >= 24。如果需要增加录像的固定帧率,则按上述升序列规则添加即可。示例如下:
假如: max1 = 7, max2 = 30, 且需要有 15 fps 的固定录像帧率,那么可按如下配置:
(7,7),(15,15),(10,30),(30,30)
注:min fps 可用于控制拍照预览时的最小帧率,也即控制了最大曝光时间,可以根据需要进行调整,但设置过小会影响拍照速度,但在较暗情况下能获得更好的预览效果。
2.2.4 control.afAvailableModes
SOC:OFF //soc camera 不支持 af
RAW:OFF // 如果 camera 没有 af 功能
RAW: AUTO,CONTINUOUS_VIDEO,CONTINUOUS_PICTURE,OFF // camera 具有 af 功能
2.2.5 control.awbAvailableModes
SOC:AUTO
RAW:AUTO,INCANDESCENT,FLUORESCENT,DAYLIGHT,CLOUDY_DAYLIGHT
2.2.6 jpeg.maxSize
计算公式如下:
最大分辨率为:scaler.availableStreamConfigurations 中 BLOB 项最大分辨率项
jpeg.maxSize >= max_blob_w * max_blob_h * 3 / 2
2.2.7 lens.info.availableApertures
可选光圈,目前只支持一个,可从模组规格书中获取。
2.2.8 lens.info.availableFocalLengths
可选焦长,目前只支持一个,可从模组规格书中获取,与 FOV 计算相关。
2.2.9 lens.info.minimumFocusDistance
0.0 // 不支持 af 时
非 0 // 支持 af 时,务必配置配置成非 0,具体需要根据模组规格书来设置
2.2.10 lens.facing
BACK:后摄
FRONT:前摄
2.2.11 scaler.availableMaxDigitalZoom
默认值为 4.0,根据芯片平台及需要可增大或减小放大倍数;注意增大放大倍数时,在放大预览情况下,在不同平台上可能会影响预览帧率,主要是由平台的 2D 加速器引起的,如果发现存在该种情况,请减小放大倍数。
2.2.12 scaler.availableStreamConfigurations
HAL 层支持的分辨率列表, 有如下限制:
1)需要按照分辨率依次降序排列
2)为了满足 CTS 要求,需要包含 352x288,320x240,176x144 配置项
3)如果在 media_profiles_V1_0.xml 中有指定录像分辨率,那么该列表中需要包含该分辨率
4)列表中需要支持 BLOB,YCbCr_420_888,IMPLEMENTATION_DEFINED 三种格式输出配置,三种格式中支持 的分辨率都要相同
5)为了不影响拍照速度,如果 sensor 最大输出尺寸宽度大于 4096 时,需将最大分辨率宽度限制在 4096。
<scaler.availableStreamConfigurations value="BLOB,2688x1520,OUTPUT,BLOB,1920x1080,OUTPUT,BLOB,1280x960,OUTPUT,BLOB,1280x720,OUTPUT,BLOB,640x480,OUTPUT,BLOB,320x240,OUTPUT,BLOB,176x144,OUTPUT,YCbCr_420_888,2688x1520,OUTPUT,YCbCr_420_888,1920x1080,OUTPUT,YCbCr_420_888,1280x960,OUTPUT,YCbCr_420_888,1280x720,OUTPUT,YCbCr_420_888,640x480,OUTPUT,YCbCr_420_888,320x240,OUTPUT,YCbCr_420_888,176x144,OUTPUT,IMPLEMENTATION_DEFINED,2688x1520,OUTPUT,IMPLEMENTATION_DEFINED,1920x1080,OUTPUT,IMPLEMENTATION_DEFINED,1280x960,OUTPUT,IMPLEMENTATION_DEFINED,1280x720,OUTPUT,IMPLEMENTATION_DEFINED,640x480,OUTPUT,IMPLEMENTATION_DEFINED,320x240,OUTPUT,IMPLEMENTATION_DEFINED,176x144,OUTPUT"/>
2.2.13 scaler.availableMinFrameDurations
配置 scaler.availableStreamConfigurations 中各分辨率下最小帧间隔(即最大帧率),需要满
足以下条件:
1)需要包含 scaler.availableStreamConfigurations 中定义的所有格式,分辨率
2)各分辨率最大帧率可从 sensor 驱动获取,一般 sensor 只输出 full 及 binning 两种分辨率,列表中上报的支持分辨率如果 sensor 驱动不能直接支持,那么会由 ISP 裁剪及缩放得到,因此非 sensor 直接输出的分辨率帧率与比之更大的最接近的 sensor 输出分辨率相同。
<scaler.availableMinFrameDurations value="BLOB,2688x1520,33333333,BLOB,1920x1080,33333333,BLOB,1280x960,33333333,BLOB,1280x720,33333333,BLOB,640x480,33333333,BLOB,320x240,33333333,BLOB,176x144,33333333,YCbCr_420_888,2688x1520,33333333,YCbCr_420_888,1920x1080,33333333,YCbCr_420_888,1280x960,33333333,YCbCr_420_888,1280x720,33333333,YCbCr_420_888,640x480,33333333,YCbCr_420_888,320x240,33333333,YCbCr_420_888,176x144,33333333,IMPLEMENTATION_DEFINED,2688x1520,33333333,IMPLEMENTATION_DEFINED,1920x1080,33333333,IMPLEMENTATION_DEFINED,1280x960,33333333,IMPLEMENTATION_DEFINED,1280x720,33333333,IMPLEMENTATION_DEFINED,640x480,33333333,IMPLEMENTATION_DEFINED,320x240,33333333,IMPLEMENTATION_DEFINED,176x144,33333333" />
2.2.14 scaler.availableStallDurations
配置 scaler.availableStreamConfigurations 中 BLOB 格式各分辨率的允许的最大间隔时长,可直接复制scaler.availableMinFrameDurations 中 BLOB 的配置项,也可设置大于 scaler.availableMinFrameDurations 中的值,只需满足小于 sensor.info.maxFrameDuration 中配置的最大间隔即可。设置大点有利于 CTS 拍照相关测试项的稳定性。
<scaler.availableStallDurations value="BLOB,2688x1520,33333333,BLOB,1920x1080,33333333,BLOB,1280x960,33333333,BLOB,1280x720,33333333,BLOB,640x480,33333333,BLOB,320x240,33333333,BLOB,176x144,33333333" />
2.2.15 sensor.info.activeArraySize
设置成 sensor 驱动输出的最大分辨率,可从 sensor 驱动得到。
2.2.16 sensor.info.physicalSize
sensor 物理尺寸,可从模组规格书中得到。与 FOV 计算相关.
2.2.17 sensor.info.pixelArraySize
设置成 sensor 驱动输出的最大分辨率,可从 sensor 驱动得到。
2.2.18 sensor.orientation
模组的安装方向,可设置 0,90,180,270。客户需根据模组在机器上的安装方向进行调整,需要能通过 CTS verifier 相关项的测试;如果方向有水平或者垂直等镜像问题,则可能需要调整 sensor 驱动的输出方向。
2.2.19 flash.info.available
FALSE // 不支持闪光灯
TRUE // 支持闪光灯
2.2.20 supportTuningSize
SOC:不需设置此项
RAW:需要从对应的 IQ 效果文件中获支持的分辨率,一般来说包括 sensor 的全分辨率和 binning 分辨率。如不设置此项,那么预览时也会使用 sensor 驱动输出的最大分辨率。
2.2.21 sensorType
SOC:SENSOR_TYPE_SOC //YUVsensor配置此项,不需要跑3A
RAW:SENSOR_TYPE_RAW // 测试数据流时,可将 RAW 的设置成 SENSOR_TYPE_SOC,只是输出图 像无 3A 效果,注意 RAW 摄像头设置成 SOC 仅仅只用于调试。
2.2.22 statistics.initialSkip
打开 Camera 应用时,预览前几帧 3A 未收敛,可能在不同场景下存在前几帧偏色等情况,通过该选项可设置合适的过滤帧数来避免该现象。
2.2.23 aiq.workingMode
NORMAL:线性模式
HDR2:HDR x2模式
HDR3:HDR x3模式
2.2.24 aiq.multicamera
配置多摄模式
true: 多摄模式
false: 单摄模式
3. 注意点
只是注册cameraID,主要跟设备名称与ID相关,此两项会影响camera的注意,需注意。