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

news2024/11/25 22:58:43
本专栏内容针对 “知识星球”成员免费,欢迎关注公众号:小驰行动派,加入知识星球。
#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。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot+Vue教师工作量管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 教师管理员 功能截图

免费数据库同步软件

在信息化日益发展的今天&#xff0c;数据同步成为了企业和个人用户不可或缺的一部分。数据库同步软件作为数据同步的重要工具&#xff0c;能够帮助我们实现不同数据库系统之间的数据复制和同步&#xff0c;确保数据的一致性和完整性。本文将介绍几款免费数据库同步软件&#xf…

Go微服务: 分布式之通过可靠消息实现最终一致性

通过可靠消息实现最终一致性 可靠消息&#xff0c;就是靠普消息&#xff0c;还是基于之前的这个案例 比如这个订单服务&#xff0c;无论你是先发送消息&#xff0c;还是先新建订单&#xff0c;它其实都是发送的不可靠消息就是说如果这个消息&#xff0c;像mysql事务那样&#…

Nvidia Jetson/Orin/算能 +FPGA+AI大算力边缘计算盒子:潍柴雷沃智慧农业无人驾驶

潍柴雷沃智慧农业科技股份有限公司&#xff0c;是潍柴集团重要的战略业务单元&#xff0c;旗下收获机械、拖拉机等业务连续多年保持行业领先&#xff0c;是国内少数可以为现代农业提供全程机械化整体解决方案的品牌之一。潍柴集团完成对潍柴雷沃智慧农业战略重组后&#xff0c;…

牛客NC32 求平方根【简单 二分 Java/Go/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/09fbfb16140b40499951f55113f2166c 思路 Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可*** para…

rv1126-rv1109-openssh-密码秘钥等功能修改

1.openssh是允许外部登录的工具 2.真的是很复杂的设备 3.移植分布,怎么得到我们想要的openssh 去网上自己寻找安装包下载; 4.怎么预制进arm主板,把编译出来的openssh放进去 其中除了ssh_config和sshd_config;其他都是秘钥,公钥和私钥; root账户走的秘钥的修改,不改是默认的r…

【学习笔记】解决 VMware Workstation 17 Player 和主机之间无法复制粘贴的问题

【学习笔记】解决 VMware Workstation 17 Player 和主机之间无法复制粘贴的问题 使用VMware Workstation 17 Player&#xff0c;再上面安装 Ubuntu &#xff0c;安装完之后&#xff0c;需要和主机之间进行复制粘贴。 首先安装了VMware Tools。 在打开的页面下把 VMwareTools…

今年618,京东和爱奇艺为大屏品质“把关”

今年618电视大战&#xff0c;还是打响了。 根据京东618数据显示&#xff0c;618开门红阶段热卖TOP10电视均为75英寸以上的大屏&#xff0c;拥有超高画质的MiniLED电视成交量同比增长5倍。可以看到&#xff0c;大屏电视逐步成为消费主流&#xff0c;尤其是拥有出色视听体验的高…

【Emgu CV教程】10.14、ConnectedComponents()函数计算连通区域

文章目录 一、概念1.什么叫图像的连通区域2.提取连通区域的函数 二、简单应用1.原始素材2.代码3.运行结果4.连通区域上色 一、概念 1.什么叫图像的连通区域 图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域&#xff0c;连通域分析是指在图像中寻找出彼此互…

韩顺平0基础学java——第19天

p396-406 final关键字 1.final修饰的为“常量”&#xff0c;需要给初始值。1可以直接定义时赋值&#xff0c;2在构造器中&#xff0c;3在代码块中。 注意静态代码块只能访问静态变量。 2.如果final修饰的关键字是静态的&#xff0c;那就不能在构造器中赋值&#xff0c;只能…

2024年最新Microsoft Edge关闭自动更新的方法分享

这里写自定义目录标题 打开【服务】 打开【服务】 windows中搜索服务&#xff0c;如下图&#xff1a; 打开服务界面&#xff0c;找到“Microsoft Edge Update Service (edgeupdate)” 及 “Microsoft Edge Update Service (edgeupdatem)” 两个服务&#xff0c;设置为禁用

C++ | Leetcode C++题解之第132题分割回文串II

题目&#xff1a; 题解&#xff1a; class Solution { public:int minCut(string s) {int n s.size();vector<vector<int>> g(n, vector<int>(n, true));for (int i n - 1; i > 0; --i) {for (int j i 1; j < n; j) {g[i][j] (s[i] s[j]) &…

人工智能--教育领域的运用

文章目录 &#x1f40b;引言 &#x1f40b;个性化学习 &#x1f988;体现&#xff1a; &#x1f988;技术解析&#xff1a; &#x1f40b;智能辅导与虚拟助手 &#x1f988;体现&#xff1a; &#x1f988;技术解析&#xff1a; &#x1f40b;自动评分与评估 &#x1f…

【嵌入式】波特率9600,发送8个字节需要多少时间,如何计算?

问题&#xff1a; 波特率9600&#xff0c;发送 01 03 00 00 00 04 44 09 (8字节) 需要多少时间&#xff0c;如何计算&#xff1f; 在计算发送数据的时间时&#xff0c;首先要考虑波特率以及每个字符的数据格式。对于波特率9600和标准的UART数据格式&#xff08;1个起始位&…

Jenkins+Rancher2.7部署构建

在Jenkins中使用rancher插件时需要去查找工作负载地址 在Rancher2.7没有查看Api按钮了需要自己去查找 1.进入https://192.168.x.xx:6443/v3/projects/ 2.输入在rancher中要查找的的项目名称并点击deployment连接进入下一个页面 3.找到自己的deployment随便点一个进去 4.浏览…

【安装笔记-20240608-Linux-免费空间之三维主机免费空间】

安装笔记-系列文章目录 安装笔记-20240608-Linux-免费空间之三维主机免费空间 文章目录 安装笔记-系列文章目录安装笔记-20240608-Linux-免费空间之三维主机免费空间 前言一、软件介绍名称&#xff1a;三维主机免费空间主页官方介绍 二、安装步骤测试版本&#xff1a;openwrt-…

Day53 动态规划part12

LC309买卖股票的最佳时机含冷冻期 与LC122类似&#xff0c;都是可无限次购买股票&#xff0c;只不过引入了冷冻期的概念dp[i][0] 第i天持有股票收益&#xff1b;dp[i][1] 第i天不持有股票收益;情况一&#xff1a;第i天是冷静期&#xff0c;不能以dp[i-1][1]购买股票,所以以dp[…

10-指针进阶——char型,多级指针,void指针,const指针

10-指针进阶——char型&#xff0c;多级指针&#xff0c;void指针&#xff0c;const指针 文章目录 10-指针进阶——char型&#xff0c;多级指针&#xff0c;void指针&#xff0c;const指针一、char 型指针1.1 示例 二、多级指针2.1 示例 三、 指针的万能拆解方法3.1 示例 四、v…

并查集进阶版

过关代码如下 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> #include<unordered_set> using namespace std;int n, m; vector<int> edg[400005]; int a[400005], be[400005]; // a的作用就是存放要摧毁 int k; int fa[400005]; int daan[400005]…

Qt OPC UA初体验

介绍 OPC UA全称Open Platform Unified Architecture&#xff0c;开放平台统一架构&#xff0c;是工业自动化领域通用的数据交换协议&#xff0c;它有两套主要的通信机制&#xff1a;1.客户端-服务器通信&#xff1b;2.发布订阅。Qt对OPC UA通信标准也提供了支持&#xff0c;目…