CameraMetadata 知识学习整理

news/2024/4/29 22:20:52/文章来源:https://blog.csdn.net/cfc1243570631/article/details/128033812

一、涉及的相关代码路径

system/media/camera/src/camera_metadata.c  // metadata的核心内容,包含metadata内存分配,扩容规则,update, find等

system/media/camera/src/camera_metadata_tag_info.c // 所有android原生tag的在内存里面section的定义

frameworks/av/camera/CameraMetadata.cpp  // camera_metadata.c 的封装

hardware/interface/camera/...... 目录下也有一个CameraMetadata.cpp,看不出来干什么用的

二、重要数据结构

整个camera_metadata的结构体

size: 整个metadata内存大小,计算方式如下

结构体头的大小 + camera_metadata_buffer_entry_t总大小(每个metadata的内存结构)+  大于4字节的metadata数据部分(后面介绍) ;ALGIN_TO字节对齐,不用深究。

version:版本号,不重要

flags:不重要

entry_count:已经添加的metadata个数

entry_capacity:整个metadata空间可容纳最多metadata个数

entries_start:metadata结构体存储开始的地方

可以看到entries_start就是紧接着camera_metada_t结构体之后

data_count:数据部分大于4字节的metadata的数据部分总大小

data_capacity:数据部分大于4字节的metadata的数据部分最大容量

data_start:数据部分大于4字节的metadata的数据部分开始地址

可以看到data_start紧接着一堆 camera_metadata_buffer_entry_t 类型数据之后

padding:不重要

vendor_id:不重要

单个具体metadata结构体

从注释可以看到,如果该metadata的数据部分大于4个字节,就存储到父数组里面,就是所有camera_metadata_buffer_entry_t 之后;如果小于等于4字节,直接存储到value[4]里面。

tag:就是下面的枚举值,基于各个section的偏移,标识唯一的tag

count:个人理解count=1是基本数据,count > 1就是数组了;未深入最终过

data.offset:如果数据部分超过4字节,offset就表示该tag的数据存放在 data_start + offset开始处

data.value:如果数据部分不超过4字节, 表示该tag的数据存放在value数组里面。

type:metadata的数据类型,如下是数据类型和数据类型大小

reserved:不重要

 以上就是metadata两个最重要数据结构的介绍,理解数据怎么存储的,才能继续去理解代码逻辑

camera_metadata.c开头的一幅图再回来看一下

三、 添加、更新、查找 metadata方法学习

CameraMetadata.cpp里面定义了各个类型的metadata的update方法,通过注释看到,如果这个tag有了就做更新操作,没有就创建。

主要方法是updateImpl,先获取tag的类型,然后根据类型和data_count计算data_size,计算data_size的目的就是为了扩容做准备,resizeIfNeeded 就是扩容的具体做法。接着会根据tag到metadata里面找对应的camera_metadata_entry_t项,找到了就更新,找不到就创建

【扩容】:

resizeIfNeeded  是非常重要的扩容方法,如果之前没有创建过metadata,是第一个metadata,那么mBuffer一定是空的,就先创建;如果metadata创建过了,会分别计算新的entryCount和dataCount,如果有一个超过了capacity就需要重新分配camera_metadata的空间了,append_camera_metadata会将旧的数据拷到新的空间中, free_camera_metadata将旧的控件释放掉。

另外扩容的大小都是在现有的基础上乘以2,指数级的增加,所以扩容操作其实不频繁。

【添加】:

接下来在看一下add_camera_metadata_entry_raw方法,内存在上面分配好了之后就可以往里面填写数据了,data_bytes就是计算该tag数据部分占用多少个字节,如果不超过4字节,就返回0,走第一个memcpy;如果超过4字节就做了8字节对齐,走下面一个memcpy。data_payload_bytes是真正要拷贝的数据大小,就是简单的  个数 x 类型大小, 而dst buffer的大小肯定大于等于这个数值。

【更新】:

个人人为最精彩的就是 update_camera_metadata_entry的逻辑了,该方法里面的每一行都很精彩,所以在几乎每一行后面加了个人理解。

 

最后用一幅图简单说明update的时候内存怎么挪动的

【查询】:

最后的最后看看 find_camera_metadata_entry方法就很简单了,根据metadata是否被排过序进行查找,排过序就用二分查找(根据tag), 没有排过序就遍历entries找到目标tag

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub 下载量过百万,阿里 P8 秘密分享的「亿级并发系统设计」

随着互联网的不断发展,CPU 硬件的核心数也在不断进步,并发编程越来越普及,但是并发编程并不像其他业务那样直接了当。在编写并发程序时,我们常常都会出现各种漏洞,这些问题往往都突然出现,然后又迅速消失&a…

龙格-库塔法(Runge-Kutta methods)

非线性的常微分方程通常是难以求出解析解的,只能通过多次迭代求近似的数值解。 龙格-库塔法(Runge-Kutta methods)是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。简写做RK法。 对于任意的Yf(X),假设某点(Xi,Yi)的斜…

阿里云安装软件:jdk11

命令下载 1. 安装准备 检查系统jdk版本 java -version检查jdk自带安装包 rpm -qa | grep java卸载jdk yum -y remove tzdata-java.noarch如果有就卸载,卸载的包名通过(rpm -qa | grep java)获取,包名要全部输入 rpm -e --nodeps …

计算机网络——TCP连接管理

本文将会介绍如何建立和拆除一条TCP连接,TCP的连接会显著的增加人们感受到的时延(尤其是在Web冲浪时)。同时一些常见的网络攻击SYN洪范攻击利用了TCP连接管理的弱点。 假定运行一台主机(客户)上的一个进程想和另一台主…

流程编排、如此简单-通用流程编排组件JDEasyFlow介绍

作者:李玉亮 JDEasyFlow是企业金融研发部自研的通用流程编排技术组件,适用于服务编排、工作流、审批流等场景,该组件已开源(https://github.com/JDEasyFlow/jd-easyflow),目前在部门的内部业务系统和科技输出系统中广泛应用&…

通过PreparedStatement预防SQL注入

通过PreparedStatement预防SQL注入 简介:本文只讲PreparedStatement预防SQL注入的写法,大家学会就好。 推荐学习路线:JDBC数据库的连接->Connection(数据库连接对象)->Statement->ResultSet->通过Prepare…

Spring Boot 简介及快速搭建

Spring Boot 简介及快速搭建 springboot的优点: –快速构建一个独立的 Spring 应用程序 ; –嵌入的 Tomcat 、 Jetty 或者 Undertow,无须部署 WAR 文件; –提供starter POMs来简化Maven配置和减少版本冲突所带来的问题&#xff1…

【云原生 | Kubernetes 系列】--Gitops持续交付 Argo Rollouts Analysis

1. Argo Rollouts 由一个控制器和一组CRD组成,可为K8s提供高级部署功能 - blue-green - canary - canary analysis 结合外部指标系统金丝雀 - experimentation 实验性的结果 - progressive delivery 渐进式交付,精准管控外部流量策略,不用关心后端部署机制支持Ingress Contro…

深度学习 Day 20——优化器对比实验

深度学习 Day 20——优化器对比实验 文章目录深度学习 Day 20——优化器对比实验一、前言二、我的环境三、前期工作1、设置GPU2、导入数据3、配置数据集4、数据可视化三、构建模型四、训练模型五、模型评估1、Accuracy与Loss图2、评估模型六、最后我想说一、前言 🍨…

2022 谷歌出海创业加速器展示日: 见证入营企业成长收获

经历三个月的沉淀,迎来了展示日的大放异彩。10 家入营企业的路演分享,带来诸多启发 ——企业出海有什么挑战和难点?加入谷歌出海创业加速器,团队有哪些收获?三个月的培训和交流,带来了怎样的感受&#xff1…

【车间调度】遗传算法求解车间调度问题(含甘特图)【含Matlab源码 2216期】

⛄一、车间调度简介 1 车间调度定义 车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加工。问题需要满足的条件包括每个零件的各道工序…

arduino 复习题

名词解释 中断 计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行 中断服务程序 用于 CPU 处理中断的程序 中断源 引起中断的原因,或…

柯桥成人英语培训机构哪家好,新陈代谢到底是什么?

新陈代谢到底是什么? Metabolism is a combination of biochemical processes that your body uses to convert food into energy. These metabolic processes include breathing, eating and digesting food, the delivery of nutrients to your cells through the blood, th…

软件被人后台篡改了收款码属于入侵吗?

最近很多做平台的小伙伴,碰到了同样的问题,就是软件程序后台被恶意篡改收款二维码 这个问题出现在平台主身上无疑是雪上加霜,第一时间找到了小蚁君,分析了一下当时的情况,先安装了小蚁的入侵检测系统,显示…

华为机试 - TLV解析Ⅰ

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 TLV编码是按[Tag Length Value]格式进行编码的,一段码流中的信元用Tag标识,Tag在码流中唯一不重复,Length表示信元Value的长度,Value表示信元的值。 码…

3d-face-reconstruction比较

摘要:比较近3年,6篇顶会3d-face-reconstruction重建效果。 1:Deep3D **发表时间:**2020 成就: 1)在REALY和REALY (side-view)两个Benchmark上取得 State-of-the-art。 2)官方github上成绩: 3DMM&#xf…

计算机硬件和软件

文章目录一 计算机硬件1)主板2)显示器3)键盘4)鼠标二 计算机软件(一)系统软件(1)操作系统(2)BIOS(3)设备驱动程序(二&…

产品公开后就不能再申请专利了吗?

问题一:申请专利会导致产品技术泄密吗? 很多人担心申请专利后会导致自己的专利技术公之于众,会让同行模仿生产。其实,我们不妨反向思考一下,假如我们没有申请专利,我们销售生产出去的产品就不容易被模仿吗…

Linux之权限【读、写、执行】【详细总结】

目录权限相关介绍rwx权限详解rwx作用到文件rwx作用到目录文件及目录权限实际案例权限修改第一种方式,,-,变更权限案例演示:第二种方式:通过数字变更权限chmod urwx,grx,ox 文件目录名 chmod 751 文件目录名修改文件所…

基于DPDK(x86平台)应用性能优化实践

产生性能瓶颈有多方面的原因,包括硬件(自身能力限制或BIOS设置不当)、操作系统(某些feature没打开)和软件。软件方面的性能瓶颈主要是由于编码不当导致,常见原因有以下几种: 数据结构cache lin…