CameraMetadata 知识学习整理

news2025/7/24 5:07:45

一、涉及的相关代码路径

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.coloradmin.cn/o/35456.html

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

相关文章

22/11/24

1,单调队列; (76条消息) 单调队列专题_Dull丶的博客-CSDN博客 2,kmp算法; 先是自己和自己匹配,求出ne数组,然后和另一串匹配,进行求解; 循环里三步:while&#xff0c…

【Lilishop商城】No2-3.确定软件架构搭建二(本篇包括接口规范、日志处理)

仅涉及后端,全部目录看顶部专栏,代码、文档、接口路径在: 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇只介绍重点架构逻辑,具体编写看源代码就行,读起来也不复杂~ 谨慎&#xf…

【数据聚类】基于粒子群、遗传和差分算法实现数据聚类附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

【App自动化测试】(十)特殊控件Toast识别

目录1. toast介绍2. toast定位3. 实例演示前言: 本文为在霍格沃兹测试开发学社中学习到的一些技术写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 😘 1. toast介绍 Toast,简易的消息提示框。为了…

CANdelaStudio-从入门到深入目录

前文介绍诊断协议那些事儿专栏,为大家深入介绍了ISO 14229各个服务的基础知识、请求与响应的报文格式,详情可查看:诊断协议那些事儿,从本专题开始,将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希…

HTML5学习笔记(四)

CSS3 颜色样式 在CSS3中,增加了大量定义颜色方面样式的属性,主要包括以下3种。 ▶ opacity透明度 ▶ RGBA颜色 ▶ CSS3渐变 opacity透明度 opacity属性取值是一个数值,取值范围为0.0~1.0。其中0.0表示完全透明,1.0表示完全不透…

I/O模型

网络IO的本质 网络IO的本质就是socket流的读取,通常一次IO读取会涉及两个阶段与两个对象,其中两个对象为:用户进程(线程)Process(Thread)、内核对象(kernel),两个阶段为…

北方地区长乐市污水厂(150000m3d)工艺设计

目 录 1设计说明书 3 1.1概述 3 1.1.1设计题目 3 1.1.2设计任务 3 1.1.3设计阶段(设计程度) 3 1.1.4设计依据 3 1.1.5设计原始资料 3 1.1.6设计工作量 5 1.1.7设计要求 5 1.1.8 毕业设计日期 5 1.2 设计要求 6 1.2.1 设计原则 6 1.2.3 设计内容 6 1.3 水…

PLC中ST编程的比较运算

比较运算符&#xff1a; >大于、 <小于、 >大于等于、 <小于等于、等于、 <>不等于。 BOOL类型的比较是通过1&#xff08;TRUE&#xff09;和0&#xff08;FALSE&#xff09;来比较的&#xff1b; 只有xIn_1为真&#xff0c;xIn_2为假的时候&#xff0c;xRe…

《小猫猫大课堂》1——小喵是如何开启敲代码之路的?

更新不易&#xff0c;麻烦多多点赞&#xff0c;欢迎你的提问&#xff0c;感谢你的转发&#xff0c; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真…

【Vue基础系列】vue-router 万字详解,一篇彻底搞懂

目录 一、路由的简介 二、路由基本使用 三、嵌套路由 四、路由的query参数 五、路由的params参数 六、路由的props配置 七、编程式路由导航 八、缓存路由组件 九、两个新的生命周期钩子 十、路由守卫 一、路由的简介 我们在生活中经常听到路由器&#xff0c;但关于路由…

将项目部署至云服务器的详细过程 以community项目为例

文章目录1.申请一个2核4G的云服务器&#xff0c;系统选择CentOS 7.62.使用终端连接云服务器3.使用 wget 命令下载以下安装文件4.安装jdk125.安装maven6.安装MySQL7.初始化mysql数据库8.安装Redis9.安装kafka10.安装elasticsearch及其分词工具11.安装Wkhtmltopdf12.安装tomcat13…

【Spring框架】一文带你吃透基于注解的DI技术详细教程

本文目录 文章目录本文目录&#x1f496;基于注解的DI✨概念✨[Component](https://so.csdn.net/so/search?qComponent&spm1001.2101.3001.7020)注解创建对象✨声明组件扫描器✨创建对象的四个注解✨扫描多个包的三种方式✨Value简单类型属性赋值✨Value使用外部属性配置文…

外卖项目07---git

git&#xff1a;企业、公司等 目录 一、Git概述 105 1.1Git简介 105 1.2Git下载与安装 105 二、Git代码托管服务 106 2.1常用的Git代码托管服务 106 三、Git常用命令 107 3.1Git全局配置 3.2获取Git仓库 ​编辑 ​编辑 3.3工作区、暂存区、版本库概念 3.4Git工作…

ASPICE系列:顺利通过ASPICE流程软件单元验证(SWE.4)

上次的ASPICE评估是否出了问题而您不知道原因? 或者您马上要进行第一次评估&#xff1f; 本系列文章是关于如何准备ASPICE流程软件单元验证(SWE.4)评估的。我们探究这个过程&#xff0c;预期交付以及评估人员的观点。永远记住一个想法:怎样做才能成功地通过评估? 想要成功通…

【PdgCntEditor】利用PDF目录书签编辑软件PdgCntEditor为PDF型图书快速添加书签的方法

一、给PDF加书签的两种情况 1.1 文字版PDF添加书签的理想情形 假设我们弄到了一本PDF&#xff0c;这个PDF如果是由Word或WPS转化而来&#xff0c;其中的标题也就代表了目录&#xff0c;我们可以用acrobat PDF中的AutuBookmark插件实现自动识别标题为目录的方法来添加书签。 …

『Java安全』利用反射调用MimeLauncher.run()触发RCE

文章目录前言MimeLauncherrun()MimeLauncher()反射调用MimeLauncher.run()触发RCE条件PoC完前言 rt.jar内的sun.net.www.MimeLauncher类的run方法调用了exec 据说可以有效绕过某些免杀&#xff0c;下面分析一下调用过程 MimeLauncher run() 首先&#xff1a;调用了this.m.ge…

古人的名与字、号、讳、谥有什么区别

古人复杂的名字 这个世界上想来是不存在没有名字的人&#xff0c;即便真的有人没名字&#xff0c;也会被外人赠予姓名&#xff0c;比如说一些古人典籍里的“无名氏”&#xff0c;就是专门用来形容那些没有名字也不清楚根脚的人&#xff0c;即便是现如今一些作品不知道作者是谁…

信号与线性时不变系统的傅里叶描述

1、复正弦信号和线性时不变系统的频率相应 卷积积分和卷积和傅里叶变换冲激表示信号正弦表示信号输入信号表示为延迟冲激的加权叠加输入信号为复正弦信号的加权叠加输出可以用卷积的形式来表示输出可以用傅里叶的形式来表示 (1)频率响应Frequency response 线性时不变系统对正…

Java中mybatis的Mpper代理开发的详细使用步骤

目录 前言&#xff1a; 一、全图预览 二、使用步骤 1.pom.xml里面添加依赖包 2.新建统一配置文件&#xff08;俗称数据库连接文件&#xff09; 3.新建项目 4.新建映射文件&#xff08;俗称数据库对应表xml&#xff09; 5.测试 三、文中的全部代码&#xff08;去复制可…