当前位置: 首页 > 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。

http://www.lryc.cn/news/261735.html

相关文章:

  • ElasticSearch面试题
  • C++ 数据结构知识点合集-C/C++ 数组允许定义可存储相同类型数据项的变量-供大家学习研究参考
  • 【机器学习】5分钟掌握机器学习算法线上部署方法
  • Vue3-21-组件-子组件给父组件发送事件
  • [密码学]AES
  • CentOS 7 部署pure-ftp
  • Vue2-动态组件案例
  • 【源码】车牌检测+QT界面+附带数据库
  • 实战1-python爬取安全客新闻
  • 光栅化渲染:可见性问题和深度缓冲区算法
  • docker入门小结
  • LLM Agent发展演进历史(观看metagpt视频笔记)
  • Linux(操作系统)面经——part2
  • Flink系列之:WITH clause
  • JMeter直连数据库
  • Linux部署MySQL5.7和8.0版本 | CentOS和Ubuntu系统详细步骤安装
  • STL中set和multiset容器的用法(轻松易懂~)
  • Codeforces Round 915 (Div. 2)
  • C语言经典错误总结(三)
  • Ubuntu系统入门指南:基础操作和使用
  • MyBatis原理解读
  • Linux---文本搜索命令
  • Unity中Shader语义的理解
  • Flink系列之:Top-N
  • CSS的三大特性(层叠性、继承性、优先级---------很重要)
  • 飞天使-docker知识点10-docker总结
  • 旅游管理虚拟情景实训教学系统演示
  • Linux Shell——输入输出命令详解
  • MFC 第一个窗口程序
  • SQL语句的执行顺序怎么理解?