【Mtk Camera开发学习】06 MTK 和 Qcom 平台支持通过 Camera 标准API 打开 USBCamera

2024-06-09 01:20

本文主要是介绍【Mtk Camera开发学习】06 MTK 和 Qcom 平台支持通过 Camera 标准API 打开 USBCamera,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本专栏内容针对 “知识星球”成员免费,欢迎关注公众号:小驰行动派,加入知识星球。
#MTK Camera开发学习系列 #小驰私房菜
Google 官方介绍文档:
https://source.android.google.cn/docs/core/camera/external-usb-cameras?hl=zh-cn

一、MTK平台支持通过标准接口打开USB Camera

1 修改目录 /device/
---
mediatek/mt***/device.mk | 4 ++++
.../hal/camera/external_camera_config.xml | 20 +++++++++++++++++++
mediatek/mt***/init.mt***.rc | 5 +++++
mediatek/mt***/manifest.xml | 1 +
mediatek/mt***/ueventd.mt**.rc | 2 ++
5 files changed, 32 insertions(+)
create mode 100644 mediatek/mt***/hal/camera/external_camera_config.xml
diff --git a/mediatek/mt***/device.mk b/mediatek/mt***/device.mk
index 00e67370..f1db63b6 100644
--- a/mediatek/mt**/device.mk
+++ b/mediatek/mt**/device.mk
@@ -226,6 +226,10 @@ PRODUCT_PACKAGES +=
vendor.mediatek.hardware.camera.isphal@1.0-impl
PRODUCT_PACKAGES += camerahalserver
PRODUCT_PACKAGES += android.hardware.camera.provider@2.6-service-mediatek
PRODUCT_PACKAGES += android.hardware.camera.provider@2.6-impl-mediatek
+PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-impl
+PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-external-service
+PRODUCT_COPY_FILES += \
+
device/mediatek/mt***/hal/camera/external_camera_config.xml:$(TARGET_COPY_OUT_VE
NDOR)/etc/external_camera_config.xml
PRODUCT_PACKAGES += libmtkcam_device1
PRODUCT_PACKAGES += libmtkcam_device3
PRODUCT_PACKAGES += camera.mt**
diff --git a/mediatek/mt6877/hal/camera/external_camera_config.xml
b/mediatek/mt6877/hal/camera/external_camera_config.xml
new file mode 100644
index 00000000..2884e131--- /dev/null
+++ b/mediatek/mt***/hal/camera/external_camera_config.xml
@@ -0,0 +1,20 @@
+<ExternalCamera>
+ <Provider>
+ <ignore> <!-- Internal video devices to be ignored by external camera
HAL -->
+ <id>0</id>
+ <id>1</id>
+ <id>2</id>
+ <id>3</id>
+ </ignore>
+ </Provider>
+ <Device>
+ <MaxJpegBufferSize bytes="3145728"/>
+ <NumVideoBuffers count="4"/>
+ <NumStillBuffers count="2"/>
+ <FpsList>
+ <Limit width="640" height="480" fpsBound="30.0"/>
+ <Limit width="1280" height="720" fpsBound="30.0"/>
+ <Limit width="1920" height="1080" fpsBound="30.0"/>
+ </FpsList>
+ </Device>
+</ExternalCamera>diff --git a/mediatek/mt***/init.mt***.rc b/mediatek/mt***/init.mt***.rc
index 415bc50e..9b401e5f 100644
--- a/mediatek/mt***/init.mt***.rc
+++ b/mediatek/mt***/init.mt***.rc
@@ -415,6 +415,11 @@ on post-fs-data
chown media system /dev/video0
chmod 0660 /dev/video1
chown media system /dev/video1
+ chmod 0660 /dev/video5
+ chown media system /dev/video5
+ chmod 0660 /dev/video4
+ chown media system /dev/video4
+
mkdir /data/vendor/vcodec 0777 media system
mkdir /data/vendor/vcodec/log 0770 media system
mkdir /data/vendor/vcodec/in 0770 media system
diff --git a/mediatek/mt***/manifest.xml b/mediatek/mt***/manifest.xml
index 455924cb..badea3ec 100644
--- a/mediatek/mt***/manifest.xml
+++ b/mediatek/mt***/manifest.xml
@@ -27,6 +27,7 @@
<name>ICameraProvider</name>
<instance>internal/0</instance>
</interface>
+ <fqname>@2.4::ICameraProvider/external/0</fqname>
</hal>
<hal format="hidl">
<name>android.hardware.gatekeeper</name>diff --git a/mediatek/mt***/ueventd.mt***.rc b/mediatek/mt***/ueventd.mt***.rc
index 9b71ee5d..efcf2599 100644
--- a/mediatek/mt***/ueventd.mt***.rc
+++ b/mediatek/mt***/ueventd.mt***.rc
@@ -89,6 +89,8 @@
#v4l2 device
/dev/video* 0660 camera system
+/dev/video4 0666 media system
+/dev/video5 0666 media system
/dev/media* 0660 camera system
/dev/v4l-subdev* 0660 camera system
--
2 修改目录 /system/
---
sepolicy/prebuilts/api/31.0/public/cameraserver.te | 5 +++++
sepolicy/public/cameraserver.te | 5 +++++
2 files changed, 10 insertions(+)
diff --git a/sepolicy/prebuilts/api/31.0/public/cameraserver.te
b/sepolicy/prebuilts/api/31.0/public/cameraserver.te
index 7a29240c..f08dbc7b 100644
--- a/sepolicy/prebuilts/api/31.0/public/cameraserver.te
+++ b/sepolicy/prebuilts/api/31.0/public/cameraserver.te
@@ -74,3 +74,8 @@ userdebug_or_eng(`
allow cameraserver su:fifo_file { read write };
allow cameraserver su:unix_stream_socket { read write };
')
+
+
+allow cameraserver device:dir r_dir_perms;
+allow cameraserver video_device:dir r_dir_perms;
+allow cameraserver video_device:chr_file rw_file_perms;
diff --git a/sepolicy/public/cameraserver.te b/sepolicy/public/cameraserver.te
index 7a29240c..f08dbc7b 100644
--- a/sepolicy/public/cameraserver.te
+++ b/sepolicy/public/cameraserver.te@@ -74,3 +74,8 @@ userdebug_or_eng(`
allow cameraserver su:fifo_file { read write };
allow cameraserver su:unix_stream_socket { read write };
')
+
+
+allow cameraserver device:dir r_dir_perms;
+allow cameraserver video_device:dir r_dir_perms;
+allow cameraserver video_device:chr_file rw_file_perms;
--
3 ) kernel config 添加如下内容
   kernel-***/arch/arm64/configs/tb***_defconfig 
   具体添加位置试实际项目情况来定
CONFIG_USB_VIDEO_CLASS=y
CONFIG_MEDIA_USB_SUPPORT=y
4 ) 上面内容修改完后,发现能检测到设备,不过打开黑图
从下面的日志里面可以看到,由于还有其它的 selinux 权限问题,导致 camera error 。本地可以先通过
setenforce 0 来确认,解决 selinux 问题是否就正常。
后面再根据实际的 avc 异常信息,添加 selinux 权限
------- 这里遇到的问题,是在 hal_camera_default.te 中添加如下内容,问题解决。
allow hal_camera_default hal_graphics_mapper_hwservice:hwservice_manager find;
11-07 15:01:26.314 D/hwcomposer( 632): (0:3) Layer+
(mva=0x0/sec=0/prot=0/fmt=1/alpha=1:0xff/blend=0002/dim=0/range=20000000/x=0 y=0
w=480 h=52 s=480 -> x=0 y=0 w=480 h=52/ext_layer=2 ds=0 fbdc=1 is_mml=0) =
11-07 15:01:26.322 E/SELinux ( 482): avc: denied { find } for
interface=android.hardware.graphics.mapper::IMapper sid=u:r:hal_camera_default:s0
pid=5451 scontext=u:r:hal_camera_default:s0
tcontext=u:object_r:hal_graphics_mapper_hwservice:s0 tclass=hwservice_manager
permissive=0
11-07 15:01:26.323 E/SELinux ( 482): avc: denied { find } for
interface=android.hardware.graphics.mapper::IMapper sid=u:r:hal_camera_default:s0
pid=5451 scontext=u:r:hal_camera_default:s0
tcontext=u:object_r:hal_graphics_mapper_hwservice:s0 tclass=hwservice_manager
permissive=0
11-07 15:01:26.323 E/SELinux ( 482): avc: denied { find } for
interface=android.hardware.graphics.mapper::IMapper sid=u:r:hal_camera_default:s0
pid=5451 scontext=u:r:hal_camera_default:s0
tcontext=u:object_r:hal_graphics_mapper_hwservice:s0 tclass=hwservice_manager
permissive=0
11-07 15:01:26.323 E/HandleImporter( 5451): initializeLocked: cannnot acccess
graphics mapper HAL!

 二、Qcom 平台 

------ platform/vendor/qcom/***/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="3145728"/> <!-- 3MB (~= 1080p 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"/>
<!-- image size larger than the last entry will not be supported-->
</FpsList>
</Device>
</ExternalCamera>
----- platform/vendor/qcom/***/***.mk
PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-external-service
PRODUCT_COPY_FILES += \
device/qcom/holi/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/extern
al_camera_config.xml
----- platform/vendor/qcom/***/manifest.xml
<hal format="hidl">
<name>android.hardware.camera.provider</name>
<transport>hwbinder</transport>
<version>2.4</version>
<interface>
<name>ICameraProvider</name>
<instance>legacy/0</instance>
<instance>external/0</instance> <!-- new add for usb camera-->
</interface>
</hal>
---- kernel/msm-***/ arch/arm64/configs/vendor/***.config
CONFIG_USB_VIDEO_CLASS=y
另外需要把自己的 app 包名,写到 vendor.camera.aux.packagelist property 属性里面,通过
getCameraIdList 才能获取到多于 2 颗摄像头的 id。

-----------------------------------------------------------------------------------------

文章内容所有权归@公众号:小驰行动派,禁止宣传转载,谢谢~

这篇关于【Mtk Camera开发学习】06 MTK 和 Qcom 平台支持通过 Camera 标准API 打开 USBCamera的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1043855

相关文章

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

MySQL 打开binlog日志的方法及注意事项

《MySQL打开binlog日志的方法及注意事项》本文给大家介绍MySQL打开binlog日志的方法及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3