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

Android camera的metadata

一、实现

先看一下metadata内部是什么样子:

可以看出,metadata 内部是一块连续的内存空间。
其内存分布大致可概括为:
区域一 :存 camera_metadata_t 结构体定义,占用内存 96 Byte
区域二 :保留区,供未来使用
区域三 :序号为 0 ~ entry_count-1 的 camera_metadata_buffer_entry_t 结构体对象,简
称 metadata_entry 结构体对象,每个对象有自己的 tag。

区域四 :剩余未使用的 Tag 结构体的内存保留,该区域大小为(entry_capacity – entry_count)
TAG,也就是(entry_capacity – entry_count)个 camera_metadata_buffer_entry_t 的空间
区域五 :所有 Tag 对应的具体 metadata 数据
区域六 :剩余未使用的 Tag 占用的内存


可以简单记成:Head 区、Entry 区、Data 区。

在这其中,TAG 又是个什么玩意儿?
其实我们既然了解了 metadata 是用来描述图像特征的参数,比如常见的曝光、ISO 等等,
就不难理解它的数据结构应该是由 N 个 key 和 value 组成的。

二、TAG

camera_metadata_buffer_entry_t 和 camera_metadata_data_t

所谓TAG,就是camera_metadata_buffer_entry

 按行依次注释来看,其中,
tag 就是 TAG 的 key 值
count 就是 TAG 的 value 对应的 data 的数量
offset 标记当前的 key 值对应的 value 在 data_start 中的位置
当 value 占用的字节数小于等于 4 的时候,直接存储到 value[4]中(省空间)

tag

我们既然知道了 key 就是 camera_metadata_buffer_entry 里的 tag,那么这个 tag(key)到底
有哪些呢?
tag 很多,会按功能分组,每组叫做一个 section:
为了更方便快捷,常使用宏定义,一般目录系统默认定义 26 个 TAG:

注意这里最后一个 VENDOR_SECTION,它在枚举中的值为 0x8000,这是因为 vendor 可能还会
自己定义一些别 tag,这些 vendor 在 0x8000 后面 enum 值就不会冲突了。

定义各个 TAG 对应详细的参数,每个 TAG 用 START 开头、END 结尾。所有的 tag,都是以 section 中的名称为前缀,从 START 开始,以 END 结束

data

说完了 key,再来看一下 value,也就是每个 tag 对应的 data。
为了设计出 API,定义了这样的结构体,在这其中,tag 为 key,data 就是 union 中的指针指
向的 data(metadata_data_t),也就是 kv 模型中的 value。

再看 system/media/camera/src/camera_metadata.c 中的这个结构体:

这个结构体定义了每个 tag 的名字以及它的类型

(注意这里的类型不是说 Value 的类型,tag_info_t 的数组会分别定义这个 section 每个 tag 的实际 Value 类型)

每个 tag 不仅可以通过唯一的 key 找到,也可通过唯一的名字找到,进而获取 Value。

相关文章:

Android camera的metadata

一、实现 先看一下metadata内部是什么样子: 可以看出,metadata 内部是一块连续的内存空间。 其内存分布大致可概括为: 区域一 :存 camera_metadata_t 结构体定义,占用内存 96 Byte 区域二 :保留区&#x…...

ElasticSearch面试题

1.介绍下es的架构? es采用的是分布式的架构,es集群中会有多个结点,而结点的角色主要有下面几种。 协调结点: 请求路由能力,将请求内容将请求转发给对应的结点进行处理。 master结点: 结点管理&#xff…...

C++ 数据结构知识点合集-C/C++ 数组允许定义可存储相同类型数据项的变量-供大家学习研究参考

#include <iostream> #include <cstring>using namespace std;// 声明一个结构体类型 Books struct Books {char title[50];char author[50];char subject[100];int book_id; };int main( ) {Books Book1; // 定义结构体类型 Books 的变量 Book1Books …...

【机器学习】5分钟掌握机器学习算法线上部署方法

5分钟掌握机器学习算法线上部署方法 1. 三种情况2. 如何转换PMML,并封装PMML2.1 什么是PMML2.2 PMML的使用方法范例3. 各个算法工具的工程实践4. 只用Linux的Shell来调度模型的实现方法5. 注意事项参考资料本文介绍业务模型的上线流程。首先在训练模型的工具上,一般三个模型训…...

Vue3-21-组件-子组件给父组件发送事件

情景描述 【子组件】中有一个按钮&#xff0c;点击按钮&#xff0c;触发一个事件&#xff0c; 我们希望这个事件的处理逻辑是&#xff0c;给【父组件】发送一条消息过去&#xff0c; 从而实现 【子组件】给【父组件】通信的效果。这个问题的解决就是 “发送事件” 这个操作。 …...

[密码学]AES

advanced encryption standard&#xff0c;又名rijndael密码&#xff0c;为两位比利时数学家的名字组合。 分组为128bit&#xff0c;密钥为128/192/256bit可选&#xff0c;对应加密轮数10/12/14轮。 基本操作为四种&#xff1a; 字节代换&#xff08;subBytes transformatio…...

CentOS 7 部署pure-ftp

文章目录 &#xff08;1&#xff09;简介&#xff08;2&#xff09;准备工作&#xff08;3&#xff09;更新系统&#xff08;4&#xff09;安装依赖环境&#xff08;5&#xff09;下载和解压pure-ftp源码包&#xff08;6&#xff09;编译和安装pure-ftp&#xff08;7&#xff0…...

Vue2-动态组件案例

1.component介绍 说明&#xff1a; Type: string | ComponentDefinition | ComponentConstructor Explanation: String: 如果你传递一个字符串给 is&#xff0c;它会被视为组件的名称&#xff0c;用于动态地渲染不同类型的组件。这是一个在运行时动态切换组件类型的常见用例。…...

【源码】车牌检测+QT界面+附带数据库

目录 1、基本介绍2、基本环境3、核心代码3.1、车牌识别3.2、车牌定位3.3、车牌坐标矫正 4、界面展示4.1、主界面4.2、车牌检测4.3、查询功能 5、演示6、链接 1、基本介绍 本项目采用tensorflow&#xff0c;opencv&#xff0c;pyside6和pymql编写&#xff0c;pyside6用来编写UI界…...

实战1-python爬取安全客新闻

一般步骤&#xff1a;确定网站--搭建关系--发送请求--接受响应--筛选数据--保存本地 1.拿到网站首先要查看我们要爬取的目录是否被允许 一般网站都会议/robots.txt目录&#xff0c;告诉你哪些地址可爬&#xff0c;哪些不可爬&#xff0c;以安全客为例子 2. 首先测试在不登录的…...

光栅化渲染:可见性问题和深度缓冲区算法

在前面第二章中&#xff0c;我们了解到&#xff0c;在投影点&#xff08;屏幕空间中的点&#xff09;的第三个坐标中&#xff0c;我们存储原始顶点 z 坐标&#xff08;相机空间中点的 z 坐标&#xff09;&#xff1a; 当一个像素与多个三角形重叠时&#xff0c;查找三角形表面上…...

docker入门小结

docker是什么&#xff1f;它有什么优势&#xff1f; 快速获取开箱即用的程序 docker使得所有的应用传输就像我们日常通过聊天工具文件传输一样&#xff0c;发送方将程序传输到超级码头而接收方也只需通过超级码头进行获取即可&#xff0c;就像一只鲸鱼拖着货物来回运输一样。…...

LLM Agent发展演进历史(观看metagpt视频笔记)

LLM相关的6篇重要的论文&#xff0c;其中4篇来自谷歌&#xff0c;2篇来自openai。技术路径演进大致是&#xff1a;SSL (Self-Supervised Learning) -> SFT (Supervised FineTune) IT (Instruction Tuning) -> RLHF。 word embedding的问题&#xff1a;新词如何处理&…...

Linux(操作系统)面经——part2

1、请你说说进程和线程的区别 1.进程是操作系统资源分配和调度的最小单位&#xff0c;实现操作系统内部的并发&#xff1b;线程是进程的子任务&#xff0c;cpu可以识别、执行的最小单位&#xff0c;实现程序内部的并发。 2.一个进程最少有一个线程或有多个&#xff0c;一个线程…...

Flink系列之:WITH clause

Flink系列之&#xff1a;WITH clause 适用流、批提供了一种编写辅助语句以在较大查询中使用的方法。这些语句通常称为公共表表达式 (CTE)&#xff0c;可以被视为定义仅针对一个查询而存在的临时视图。 WITH 语句的语法为&#xff1a; WITH <with_item_definition> [ , …...

JMeter直连数据库

JMeter直连数据库 使用场景操作步骤 使用场景 用作请求的参数化 登录时需要的用户名&#xff0c;密码可以从数据库中查询获取 用作结果的断言 添加购物车下订单&#xff0c;检查接口返回的订单号&#xff0c;是否与数据库中生成的订单号一致 清理垃圾数据 添加商品后&#xff…...

Linux部署MySQL5.7和8.0版本 | CentOS和Ubuntu系统详细步骤安装

一、MySQL数据库管理系统安装部署【简单】 简介 MySQL数据库管理系统&#xff08;后续简称MySQL&#xff09;&#xff0c;是一款知名的数据库系统&#xff0c;其特点是&#xff1a;轻量、简单、功能丰富。 MySQL数据库可谓是软件行业的明星产品&#xff0c;无论是后端开发、…...

STL中set和multiset容器的用法(轻松易懂~)

目录 1. 基本概念 2. 构造和赋值 3. 大小和交换 4. 插入 和 删除 5. 统计 和 查找 6. set容器的排序 1. 基本概念 set和multiset属于关联式容器&#xff0c;底层结构式二叉树&#xff0c;所有元素都会在插入时自动排序。 如果你对容器的概念&#xff0c;或是二叉树不太了…...

Codeforces Round 915 (Div. 2)

Constructive Problems&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;现在有一片城市被摧毁了&#xff0c;需要进行重建&#xff0c;当一个城市水平相邻和竖直相邻的位置都至少有一个城市的时候&#xff0c;该城市可以被重建。所有城市排成n行m列的矩…...

C语言经典错误总结(三)

一.指针与数组理解 我们都知道定义一个数组然后对其进行各种想要的操作&#xff0c;但是你真的能够区分那些是对数组的操作&#xff0c;那些是通过指针实现的吗&#xff1f; 例如;arr[1]10;这个是纯粹对数组操作实现的吗&#xff1f; 答案肯定不是&#xff0c;实际上我们定义…...

如何用淘金币自动化脚本每天节省20分钟?完整指南揭秘

如何用淘金币自动化脚本每天节省20分钟&#xff1f;完整指南揭秘 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本&#xff0c;包含蚂蚁森林收取能量&#xff0c;芭芭农场全任务&#xff0c;解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi 淘金币…...

深入RISC-V链接脚本:从.lds文件看C程序的内存‘出生’与‘搬家’全过程

深入RISC-V链接脚本&#xff1a;从.lds文件看C程序的内存‘出生’与‘搬家’全过程 在嵌入式开发的世界里&#xff0c;一个C程序从源代码到最终在硬件上运行&#xff0c;经历了编译、链接和加载三个关键阶段。这个过程就像一个人的生命历程&#xff1a;编译是"出生"&…...

Python应用性能监控实战:New Relic APM代理原理与部署指南

1. 项目概述&#xff1a;一个现代应用性能的“听诊器”如果你正在用Python构建Web服务、后台任务或者任何需要7x24小时稳定运行的应用&#xff0c;那么“性能”和“可观测性”这两个词&#xff0c;一定是你日常工作中绕不开的焦点。当线上服务突然变慢&#xff0c;用户投诉接踵…...

React组件库spac-kit:原子化间距与声明式布局的工程实践

1. 项目概述&#xff1a;一个为现代Web应用而生的React组件库最近在做一个新的后台管理系统&#xff0c;UI框架选型时&#xff0c;我又一次陷入了纠结。市面上成熟的组件库很多&#xff0c;但要么过于庞大&#xff0c;引入后项目体积膨胀得厉害&#xff1b;要么设计风格固化&am…...

蓝牙学习1(基础知识)(TODO)

https://mp.weixin.qq.com/s/qjKsxuF4TRrH5CWh8TOvzw 蓝牙点灯 1 蓝牙 蓝牙&#xff08;Bluetooth&#xff09;是一种短距离无线通信技术&#xff0c;用于在电子设备之间传输数据或建立语音连接。它采用2.4GHz ISM频段&#xff08;2.402GHz–2.480GHz&#xff09;&#xff0c…...

ChatMark:将LLM对话导出为Markdown,实现AI协作知识管理

1. 项目概述&#xff1a;ChatMark&#xff0c;一个让AI对话“看得见”的利器 如果你和我一样&#xff0c;经常和各类大语言模型&#xff08;LLM&#xff09;打交道&#xff0c;无论是用ChatGPT、Claude还是本地部署的开源模型&#xff0c;一个共同的痛点就是&#xff1a;对话记…...

Ubuntu 26.04 完美安装和设置

设置 root 用户密码 sudo passwd root Linux安装微软命令行文本编辑器-Microsoft Edit # 安装 Zstandard apt install zstd # 下载软件包 wget https://github.com/microsoft/edit/releases/download/v1.2.0/edit-1.2.0-x86_64-linux-gnu.tar.zst # 解压缩到用户的当前目录…...

Docker 部署 SpringBoot 项目超详细教程

Docker 部署 SpringBoot 项目超详细教程一篇适合新手的 Docker 部署 SpringBoot 实战教程&#xff0c;包含&#xff1a; Docker 安装镜像加速SpringBoot 打包Dockerfile 编写构建镜像容器部署日志查看防火墙开放常见问题解决 图文并茂&#xff0c;保姆级教学。本文假设你已拥有…...

Swift集成飞书API:使用feishu-swift SDK构建高效机器人

1. 项目概述&#xff1a;一个连接飞书与Swift生态的桥梁 最近在折腾一个内部工具&#xff0c;需要把服务端的一些数据变动实时同步到飞书群里&#xff0c;方便团队同学及时跟进。服务端是用Swift写的&#xff0c;而飞书官方虽然有开放的API&#xff0c;但直接上手去调&#xf…...

不只是安装:在龙芯2k1000LA上为Loongnix配置WiFi、蓝牙与触摸屏驱动的完整流程

龙芯2k1000LA开发板外设驱动深度配置指南&#xff1a;从WiFi到触摸屏的全栈解决方案 在国产化硬件开发领域&#xff0c;龙芯2k1000LA开发板凭借其完全自主的LoongArch架构&#xff0c;正成为物联网和嵌入式设备开发者的重要选择平台。不同于x86架构的"开箱即用"体验&…...