camera调试:安卓添加xml注册

对接安卓的平台时,需要注册对应的camera设备,供安卓标准api进行操作,rk的平台需要在HAL层配置camera3_profiles.xml文件,适配驱动的信息,进行注册camera设备。该xml对应的内容很多,很多CTS测试问题都是该文件配置导致。对应不同的sensor,建议根据功能更新xml配置。以下对xml部分配置做一下简要的说明:

目录

1.xml文件说明

2.xml属性

[2.1 设备注册名称与ID](#2.1 设备注册名称与ID)

[2.2 Android_metadata](#2.2 Android_metadata)

[2.2.1 control.aeAvailableAntibandingModes](#2.2.1 control.aeAvailableAntibandingModes)

[2.2.2 control.aeAvailableModes](#2.2.2 control.aeAvailableModes)

[2.2.3 control.aeAvailableTargetFpsRanges](#2.2.3 control.aeAvailableTargetFpsRanges)

[2.2.4 control.afAvailableModes](#2.2.4 control.afAvailableModes)

[2.2.5 control.awbAvailableModes](#2.2.5 control.awbAvailableModes)

[2.2.6 jpeg.maxSize](#2.2.6 jpeg.maxSize)

[2.2.7 lens.info.availableApertures](#2.2.7 lens.info.availableApertures)

[2.2.8 lens.info.availableFocalLengths](#2.2.8 lens.info.availableFocalLengths)

[2.2.9 lens.info.minimumFocusDistance](#2.2.9 lens.info.minimumFocusDistance)

[2.2.10 lens.facing](#2.2.10 lens.facing)

[2.2.11 scaler.availableMaxDigitalZoom](#2.2.11 scaler.availableMaxDigitalZoom)

[2.2.12 scaler.availableStreamConfigurations](#2.2.12 scaler.availableStreamConfigurations)

[2.2.13 scaler.availableMinFrameDurations](#2.2.13 scaler.availableMinFrameDurations)

[2.2.14 scaler.availableStallDurations](#2.2.14 scaler.availableStallDurations)

[2.2.15 sensor.info.activeArraySize](#2.2.15 sensor.info.activeArraySize)

[2.2.16 sensor.info.physicalSize](#2.2.16 sensor.info.physicalSize)

[2.2.17 sensor.info.pixelArraySize](#2.2.17 sensor.info.pixelArraySize)

[2.2.18 sensor.orientation](#2.2.18 sensor.orientation)

[2.2.19 flash.info.available](#2.2.19 flash.info.available)

[2.2.20 supportTuningSize](#2.2.20 supportTuningSize)

[2.2.21 sensorType](#2.2.21 sensorType)

[2.2.22 statistics.initialSkip](#2.2.22 statistics.initialSkip)

[2.2.23 aiq.workingMode](#2.2.23 aiq.workingMode)

[2.2.24 aiq.multicamera](#2.2.24 aiq.multicamera)

[3. 注意点](#3. 注意点)


1.xml文件说明

camera3_profiles.xml文件对应SDK目录下具体芯片平台的文件:

bash 复制代码
hardware/rockchip/camera/etc/camera/camera3_profiles_rk3xxx.xml

在设备上的路径为:

bash 复制代码
/vendor/etc/camera/camera3_profiles.xml

若是临时调试,可以采用adb替换文件的形式,但需要注意文件路径与文件名的正确性。

camera3_profiles.xml包含多个Profiles节点,Profiles节点包含一个完整的camera属性列表,机器有几个camera,就需要配置几个Profiles节点。

Profiles 节点下又包含了如下四个子节点。

XML 复制代码
	<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。
参考:

XML 复制代码
            <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 输出分辨率相同。

XML 复制代码
            <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 拍照相关测试项的稳定性。

XML 复制代码
            <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的注意,需注意。