当前位置: 首页 > news >正文

高通 Camera HAL3:项目开发技术点总结

做高通 Camera HAL3开发的一些技术点的总结、整理。

做个记录,方便后续查阅。

1.目录、so、配置文件

productName是项目名

  • out Target路径:\out\target\product\productName\
  • chi-cdk:\vendor\qcom\proprietary\chi-cdk\
  • ldc node:\vendor\qcom\proprietary\chi-cdk\oem\qcom\node\ldc\
  • node编译出来的so:\vendor\lib64\camera\components\
  • usecase编译的so: \vendor\lib64\com.qti.chiusecaseselector.so (修改pipeline的xml后需要编译usecase的so)
  • chi-cdk编译的so: \vendor\lib64\hw\com.qti.chi.override.so
  • usecase xml文件:chi-cdk\oem\qcom\topology\titan\fillmore\fillmore_usecase.xml
  • pipelines xml文件:chi-cdk\oem\qcom\topology\titan\usecase-components\usecases\UsecaseZSL\pipelines\
  • vendortag文件:chi-cdk\oem\qcom\vendortag\chivendortagoemdefines.h
  • RealTimeFeature.xml:chi-cdk\oem\qcom\topology\titan\usecase-components\segments\fillmore\RealTimeFeature.xml
  • camxoverridesettings.txt:高通提供给开发者的临时调试方式,控制log打印、数据dump等、在设备目录的vendor/etc/camera/下,目录camera和camxoverridesettings.txt都需要自己手动创建

2.驱动相关路径:

bin文件:/vendor/lib64/camera (如果将bin文件删除到只剩一个,那么驱动上电就只上一个,打开相机就只打开这个摄像头)

配置文件:

  • \vendor\qcom\proprietary\chi-cdk\oem\qcom\buildbins\build\android\binary_taro
  • /vendor/qcom/proprietary/chi-cdk/oem/qcom/module

驱动文件:

  • \vendor\qcom\proprietary\chi-cdk\oem\qcom\sensor\s5khm6

3.camxsettings.xml

在/vendor/qcom/proprietary下查找camxsettings.xml,找到后通过修改camxoverridesettings.txt来改变camxsettings.xml中定义的变量的值

  • /vendor/etc/camera # echo enableDSM=FALSE >> camxoverridesettings.txt
  • /vendor/etc/camera # cat camxoverridesettings.txt

4.camxoverridesettings.txt日志设置:

chi log:例如:CHX_LOG_ERROR(fmt, args);

adb shell "echo overrideLogLevels=0x1f >> /vendor/etc/camera/camxoverridesettings.txt"

或:adb shell setprop vendor.debug.camera.overrideLogLevels 0x1F (camxsettings.xml中定义,不同的代码可能有区别)

平常开的log(按需要开,全部都开会丢日志且影响性能):

hal/core/chi

  • adb shell "echo logInfoMask=0x50080 >> /vendor/etc/camera/camxoverridesettings.txt"   
  • adb shell setprop persist.vendor.camera.logVerboseMask 0xFFFFFFFF
  • adb shell setprop persist.vendor.camera.logEntryExitMask 0xFFFFFFFF
  • adb shell setprop persist.vendor.camera.logInfoMask 0xFFFFFFFF
  • adb shell setprop persist.vendor.camera.logWarningMask 0xFFFFFFFF
  • adb shell setprop persist.vendor.camera.logConfigMask 0xFFFFFFFF
  • adb shell setprop persist.vendor.camera.systemLogEnable TRUE
  • adb shell setprop persist.vendor.camera.logLogDRQMask 0xFFFFFFFF

camx log:

  • adb shell "echo overrideLogLevels=0xF >> /vendor/etc/camera/camxoverridesettings.txt"
  • adb shell "echo logVerboseMask=0x1000 >> /vendor/etc/camera/camxoverridesettings.txt"
  • adb shell "echo logInfoMask=0xFFFFFFFF >> /vendor/etc/camera/camxoverridesettings.txt"

5.选择featuregraph的日志:

Chifeature2graphselector.cpp:1549 SelectFeatureGraphforRequestFromTable()

Tag:"Selected feature graph for request:"

通常需要先执行如下命令才能打印出Log:

  • adb shell  echo "overrideLogLevels=0x9" >>/vendor/etc/camera/camxoverridesettings.txt
  • adb shell echo overrideLogLevels=8 >>echo/vendor/etc/camera/camxoverridesettings.txt

平台不同,具体也有所区别:

8350:

  • static const UINT32 CHX LOG CONFIG MASK =4:
  • adb shell echo overrideLogLevels=4 >>/vendor/etc/camera/camxoverridesettings.txt

8450:

  • adb shell overrideLogLevels=8 >>"echo/vendor/etc/camera/camxoverridesettings.txt
  • CHX LOG INFO("Selected feature graph for request %u : %spFeature2RequestObject->GetAppFrameNumber (),requestGraph. pGraphDesc->pFeatureGraphName);

sm4350:

  • adb shell "echo overrideLogLevels=4>>/vendor/etc/camera/camxoverridesettings.txt
  • CHX LOG CONFIG(Feature2Mapping: Selected feature graph : %s"pChiFeature2GraphDesc->pFeatureGraphName);

6.如何查找pipeline

代码查找:

找到chifeature2rawhdrdescriptor.cpp

查找ChiFeature2PipelineDescriptor

日志查找:

Tag: "StreamingOn"


7.CreatePipelines()

AdvancedCameraUsecase,UsecaseMultiCamera等usecase 会 调用CreatePipelines()创建 pipeline

chifeature2也会调用 CreatePipelines() 创建 pipeline

举个例子:

在SAT模式下,预览走的是非featue2,拍照走的是feature2:

//创建的三个pipeline:SATOfflinePreview;RealtimePreviewSATO;Merge3YuvCustomTolYuv


8. 如何查找pipeline node配置文件:

1.Log TAG:"StreamingOn for pipeline"查当前pipeline
2.\vendor\qcom\proprietary\chi-cdk\oem\qcom\topology\titan 目录下找pipeline的xml
3.pipeline xml里看<CamxInclude segment="xxxxxxxxxx"/>
4.找到CamxInclude的xml
5.添加node


9.添加堆栈打印:

在\camx\src\core\hal\camxhal3stream.cpp中添加堆栈打印

camx/src/lib/build/android/Android.mk 里添加 LOCAL_SHARED_LIBRARIES += libutilscallstack

代码中要打印堆栈的地方添加:android::CallStack stackprintf("xxxxxx");


10.添加一个VendorTag用于控制Feature:

详细见《Add a VendorTag》篇

高通 Camera HAL3:添加一个VendorTag_shawn·xiao的博客-CSDN博客


11.摄像头Id配置文件

chi-cdk\oem\qcom\multicamera\chimcxcameraconfig\configs\fillmore\fillmore_legacymc.xml


12.排查node中算法影响

可以只用memcopy Node来排除: 


13.底层添加debug系统属性:

头文件:#include <cutils/properties.h>

\chi-cdk\oem\qcom\node\awrawhdr\build\android\Android.mk下添加:

LOCAL_SHARED_LIBRARIES :=

libcutils \

代码:if(property_get_int32("debug.vendor.camera.dumpawraw",0))


13.查看AEC日志:

主要看第二个

(1).05-14 06:40:13.737 7710 7779 V CamX : [ VERB][STATS_AEC] caecxcontrol.h:586: PrintFrameControl CID 1 role 0 fID 227 mode PerFrame skipped:0 flash off lux 276.5 ISO 640 (short safe long) G 13.319 13.319 13.319 ET 60000000 60000000 60000000 SI 799110720 799110720 799110720 settled 1 brightness settled 1 FL 219.9 snapshot normal LED1 0 LED2 0 LEDAF 0 LEDFD 0 predictive 1.0 flashduration 0 compenDB 1.000 compenADRC 1.000 shortBlend 1.000000 FinalFlickerMode 1

(2) Gain:ExpTime

14.去掉驱动配置的QCFA Size

找到注摄的驱动setting文件

qssi12_7450/vendor/qcom/proprietary/chi-cdk/oem/qcom/sensor/s5khm6/s5khm6_sensor.xml

找到Qcfa定义,全部去掉


15.查找最大,中间,最小曝光值

\chi-cdk\core\chiframework\chimcxdevicecaps.cpp 

填曝光值函数:FillExposureTime()

\camx\src\core\camximagesensordata.cpp 

从sensor xml中获取配置并计算 赋值最小、中间和最大曝光值:GetSensorStaticCapability()

/chi-cdk/oem/qcom/sensor/s5khm6/s5khm6_sensor.xml

驱动配置文件里配置:
<exposureControllnfo>
<verticalOffset>10<verticalOffset>
<maxLineCount>65525<maxLineCount> 

16.常见usecase、pipeline

之前的博文中也有列举过,再列举一次

不同机型,产品性能及定位不同,即使基线一样usecase等也有可能不一样,

高通这么做给了手机厂商极大的自定义空间,举个某机型例子,UseCase可以场景复用,对应的pipeline也可以不用或复用

17.文件权限修改

标定结果写入calib_result的patch,文件777权限没有设置成功,导致生成的calib_result文件没有第三方可读权限,

可通过adb shell ls -laZ calib_result查看为-rwx------

如下改动patch,经调试第三方可以读取calib_result,权限变为-rwxrwxrwx:

{mode_t pCurMask = umask(0);......umask(pCurMask);}

18.未完待续、持续补充 

相关文章:

高通 Camera HAL3:项目开发技术点总结

做高通 Camera HAL3开发的一些技术点的总结、整理。 做个记录&#xff0c;方便后续查阅。 1.目录、so、配置文件 productName是项目名 out Target路径&#xff1a;\out\target\product\productName\chi-cdk&#xff1a;\vendor\qcom\proprietary\chi-cdk\ldc node&#xff1…...

chatgpt赋能python:Python怎么删除列表中的最大值和最小值

Python怎么删除列表中的最大值和最小值 在Python中&#xff0c;一个列表&#xff08;List&#xff09;是一种非常常见的数据结构&#xff0c;它允许我们以有序的方式存储和访问数据。但是&#xff0c;有时候我们需要从列表中删除最大或最小的值&#xff0c;以满足我们的特定需…...

简述Vue的生命周期以及每个阶段做的事情

03_简述Vue的生命周期以及每个阶段做的事情 思路 给出概念 列举出生命周期各个阶段 阐述整体流程 结合实际 扩展&#xff1a;vue3变化 回答范例 每个vue组件实例被创建后都会经过一系列步骤。比如它需要数据观测、模板编译、挂载实例到dom、以及数据变化的时候更新dom、…...

LeetCode-C#-0004.寻找两个正序数组的中位数

0.声明 该题目来源于LeetCode 如有侵权&#xff0c;立马删除。 解法不唯一&#xff0c;如有新解法可一同讨论。 1.题目 0004寻找两个正序数组的中位数 给定两个大小分别为m和n的正序&#xff08;从小到大&#xff09;数组nums1和nums2。 请你找出并返回着两个正序数组的中位…...

Vue.js 中的 $emit 和 $on 方法有什么区别?

Vue.js 中的 $emit 和 $on 方法有什么区别&#xff1f; 在 Vue.js 中&#xff0c;$emit 和 $on 方法是两个常用的方法&#xff0c;用于实现组件间的通信。它们可以让我们在一个组件中触发一个自定义事件&#xff0c;并在另一个组件中监听这个事件&#xff0c;从而实现组件间的…...

LAZADA平台的商品评论Python封装API接口接入文档和参数说明

LAZADA是一个位于东南亚的电商平台&#xff0c;成立于2012年。该平台覆盖的国家包括新加坡、马来西亚、印尼、菲律宾、泰国和越南等地。它提供了一个多样化的产品选择&#xff0c;包括时尚、美容、数码、母婴等商品&#xff0c;并且拥有许多知名品牌的官方旗舰店。同时&#xf…...

云原生Docker镜像管理

docker是什么&#xff1f; docker是一个go语言开发的应用容器引擎。 docker的作用&#xff1f; ①运行容器里的应用&#xff1b; ②docker是用来管理容器和镜像的一种工具。 #容器 与 虚拟机 的区别&#xff1f; 容器虚拟机所有容器共享宿主机内核每个虚拟机都有独立的操…...

ChatGPT+小红书的8种高级玩法

掌握了这套万能命令&#xff0c;让你快速做出小红书爆款文案! 一、用ChatGPT做定位 我是一个大龄的普通人&#xff0c;没有什么特殊的技能&#xff0c;接下来&#xff0c;请你作为一位小红书的账号定位专家&#xff0c;通过与我对话的方式&#xff0c;为我找到我的小红书账号定…...

shell脚本学习记录1(运算符)

Shell 传递参数 我们可以在执行 Shell 脚本时&#xff0c;向脚本传递参数&#xff0c;脚本内获取参数的格式为&#xff1a;$n。n 代表一个数字&#xff0c;1 为执行脚本的第一个参数&#xff0c;2 为执行脚本的第二个参数&#xff0c;以此类推…… 以下实例我们向脚本传递三个…...

vector 迭代器失效问题

vector 迭代器失效 迭代器的主要作用就是让算法能够不用关心底层数据结构&#xff0c;其底层实际就是一个指针&#xff0c;或者是对指针进行了封装&#xff0c;比如&#xff1a;vector的迭代器就是原生态指针T* 。因此迭代器失效&#xff0c;实际就是迭代器底层对应指针所指向…...

docker使用与服务器上的可视化(ROS rviz等)

1.安装docker 安装docker&#xff1a;官网教程&#xff0c;按照官网命令一步步来即可。 添加当前用户到docker用户组&#xff1a; 【docker】添加用户到docker组&#xff0c;这样后面运行docker的时候前面不需要加sudo命令&#xff0c;否则运行docker的时候一直需要在前面加su…...

最新版本Portraiture4.1中文版ps磨皮滤镜插件安装包

在Portraiture有非常强大的手动功能&#xff0c;可以为用户进行手动调整照片中的皮肤区域以达到更加完美的效果&#xff0c;软件还支持同时导入上千张照片&#xff0c;用户可以通过自动识别照片中的人脸从而依照自己的风格进行批量处理十分的方便快捷。 最新版本Portraiture 4…...

仓储WMS对接淘宝奇门详细说明【亲测可用】

文章目录 简介名词解释奇门对接方案前期准备系统调用流程代码实现思路关键点(个人观点)奇门对接关键代码可能遇到的问题 简介 淘宝奇门项目支持 ERP、WMS 之间的系统标准化对接&#xff0c;通过构建 ERP、WMS 系统之间标准通信协议来实现不同系统之间的打通&#xff1b;对商家…...

RFID软件:简介、功能和应用范围

在当今快节奏的商业环境中&#xff0c;RFID&#xff08;射频识别&#xff09;技术已经成为物流、供应链和库存管理等领域中不可或缺的工具。本文将向您介绍RFID软件的基本知识&#xff0c;探讨其功能和广泛应用的范围。 第一部分&#xff1a;RFID软件简介 RFID软件是一种应用…...

Android 逆向之安全防护基本策略

对抗反编译 混淆 使用混淆主要可以减小包的大小。混淆对于安全保护来说&#xff0c;只是增加了阅读难度而已。混淆不会把关键代码混淆掉&#xff0c;比如MainActivity&#xff0c;Application等&#xff0c;可以通过分析smali和阅读jar包定位代码。 资源混淆也是换汤不换药&…...

基站机房:保障通信网络稳定,如何解决安全隐患?

基站机房作为无线通信网络的关键组成部分&#xff0c;承载着大量的网络设备和通信设施&#xff0c;对于运营商和通信服务提供商来说具有重要意义。 无论是大型运营商还是通信服务提供商&#xff0c;动环监控系统都将成为他们成功运营和管理通信网络的关键工具。 客户案例 案例…...

sqlmap -os-shell 使用方法

一、burp suite抓包。 如上图所示&#xff0c;红框处很明显是一个传参点&#xff0c;我们就在这个页面抓包。 抓到包之后将内容保存到桌面的1000.txt文件下。 二、sqlmap跑包。 打开sqlmap跑包。 python sqlmap.py -r C:\Users\16434\Desktop\1000.txt -dbmsmysql --os-shell…...

Go语言并发之Select多路选择操作符

1、Go语言并发之Select多路选择操作符 select 是类 UNIX 系统提供的一个多路复用系统 API&#xff0c;Go 语言借用多路复用的概念&#xff0c;提供了 select 关键字&#xff0c;用 于多路监听多个通道。当监听的通道没有状态是可读或可写的&#xff0c;select 是阻塞的&#…...

黄金回收小程序开发功能有哪些?

一、用户端&#xff1a; 1、实时查询&#xff1a;通过对接三方接口实现实时金价动态查看&#xff1b; 2、多种类珠宝实时回收&#xff1a;小程序支持多品类珠宝的实时回收包含黄金饰品、金条、铂金、K金、白银等&#xff0c;同步实现价格实时更新&#xff1b; …...

nginx的详解与应用

前言 说明 要义 nginx 有一个master 进程和多个worker 进程。主进程的主要目的是读取和评估配置&#xff0c;以及维护工作进程。工作进程对请求进行实际处理。nginx 采用基于事件的模型和依赖于操作系统的机制在工作进程之间有效地分发请求。工作进程的数量在配置文件中定义…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...