Android实战经验篇-USB Camera支持
本文主要包括部分:
一、Android支持情况
1.1 USB Camera简述
1.2 Android的支持情况
二、代码实现
2.1 xml的修改
2.2 hal服务
2.3 Selinux
一、Android支持情况
1.1 USB Camera说明
一般的免驱USB Camera都是V4l2架构的,在Linux Kernel上已完全支持,即可以看到Camera对应的/dev/videoX的设备节点。
Android 平台支持同样支持即插即用的 USB 摄像头,常规的摄像头也符合标准的 Android Camera2 API 和摄像头 HAL 接口。所以一般情况下把Camera插入USB口也可以看到/dev/videoX的设备节点。
AOSP的文档中也有明确说明,基本上就是要按照它的这个配置来实现。https://source.android.com/docs/core/camera/external-usb-cameras?hl=zh-cn
1.2 Android 13的支持情况
以下代码按照QCOM Android13上的情况修改,具体的修改点各版本和平台不同,但每个修改点本质是一样的。
Android13 上默认Kernel也是支持USB免驱Camera的,可以看到/dev/videoX设备节点,而且其base代码中也是有对应hal服务的bin文件的。所以只需要修改配置文件和适配selinux即可。
内核配置可以确认下面两个配置情况,
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
adb shell zcat /proc/config.gz | grep USB 确认。
二、代码实现
2.1 xml的修改
修改 external_camera_config.xml 文件来自定义外接摄像头提供程序,这里配置了:
内部摄像头的排除视频节点、支持的图片大小和帧速率上限、Inflight 缓冲区数量(在卡顿与内存之间进行权衡)。
修改文件路径:ap_target/device/qcom/kona/external_camera_config.xml
内容
+<ExternalCamera>
+ <Provider>
+ <ignore> <!-- Internal video devices to be ignored by external camera HAL -->
+ <id>0</id> <!-- No leading/trailing spaces -->
+ <id>1</id>
+ </ignore>
+ </Provider>
+ <!-- See ExternalCameraUtils.cpp for default values of Device configurations below-->
+ <Device>
+ <!-- Max JPEG buffer size in bytes-->
+ <MaxJpegBufferSize bytes="8388608"/> <!-- 8MB (> 2594x1944 YUV420) -->
+ <!-- Size of v4l2 buffer queue when streaming >= 30fps -->
+ <!-- Larger value: more request can be cached pipeline (less janky) -->
+ <!-- Smaller value: use less memory -->
+ <NumVideoBuffers count="4"/>
+ <!-- Size of v4l2 buffer queue when streaming < 30fps -->
+ <NumStillBuffers count="2"/>
+ <!-- List of maximum fps for various output sizes -->
+ <!-- Any image size smaller than the size listed in Limit row will report
+ fps (as minimum frame duration) up to the fpsBound value. -->
+ <FpsList>
+ <!-- width/height must be increasing, fpsBound must be decreasing-->
+ <Limit width="640" height="480" fpsBound="30.0" />
+ <Limit width="1280" height="720" fpsBound="30.0" />
+ <Limit width="1920" height="1080" fpsBound="30.0" />
+ <!-- image size larger than the last entry will not be supported-->
+ </FpsList>
+ </Device>
+</ExternalCamera>
+
<MaxJpegBufferSize bytes="8388608"/>
<Limit width="640" height="480" fpsBound="30.0" />
<Limit width="1280" height="720" fpsBound="30.0" />
<Limit width="1920" height="1080" fpsBound="30.0" />
如上标红的帧率和 帧大小是需要关注的。
2.2 hal服务
Android基线代码编译完成后,一般有Camera的hal 服务bin文件。比如
out/target/product/lahaina/vendor/bin/hw/android.hardware.camera.provider@2.4-external-service
在device/qcom/lahaina/lahaina.mk 文件中,增加此服务配置
+#enable usb camera
+PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-external-service
另外还要在device/qcom/lahaina/manifest_shima.xml 中增加external instance;
--- a/device/qcom/lahaina/manifest_shima.xml
+++ b/device/qcom/lahaina/manifest_shima.xml
@@ -678,6 +678,7 @@
<interface>
<name>ICameraProvider</name>
<instance>legacy/0</instance>
+ <instance>external/0</instance>
</interface>
</hal>
2.3 Selinux
Android13中selinux一般是在QSSI/system/sepolicy中,但hal的selinux权限添加在target目录下;
例如:
--- a/device/qcom/sepolicy_vndr/generic/vendor/common/cameraserver.te
+++ b/device/qcom/sepolicy_vndr/generic/vendor/common/cameraserver.te
@@ -34,6 +34,11 @@
allow cameraserver system_server:unix_stream_socket { read write };
+# for external camera
+allow cameraserver device:dir r_dir_perms;
+allow cameraserver video_device:dir r_dir_perms;
+allow cameraserver video_device:chr_file rw_file_perms;
+
详细代码实现见如下链接:
系列文章转如下链接:
Android Display Graphics系列文章-汇总
Android实战经验篇-系列文章汇总
https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzI5NDk3NzYxNw==&action=getalbum&album_id=3772136109094944770#wechat_redirect
Android实战经验篇-玩转Selinux(详解版)
https://mp.weixin.qq.com/s/Diqiq6SLUZLS5QZAamcj2A?token=1849347256&lang=zh_CN
系列文章关注公众号,持续更新中......
更多推荐

所有评论(0)