本文主要包括部分:

一、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系列文章-汇总

https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzI5NDk3NzYxNw==&action=getalbum&album_id=3570612385595473922#wechat_redirect

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

系列文章关注公众号,持续更新中......

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐