libcamera Control 体系解析

整体介绍

libcamera 的 control 体系是“定义(ControlId)+ 约束(ControlInfo)+ 值(ControlValue)+ 集合(ControlList)”
以key-value的形式呈现,和meta有一些区别:control更倾向于输入控制,meta更倾向于获取输出参数。

 

ControlValue

作用

存放control value

成员变量

  • 值类型(value type)
  • 值还是数组(is array)
  • 元素数量(number element,如果是值则为1)
  • 值,或者数组的地址(union of value and storage)

成员函数

  • set():如果之前是数组,则先release();如果当前是数组,则新new
  • release():如果是数组则释放
  • data():以Span类型获取value信息

 

ControlId

作用

  • 存放control id相关信息
  • 有一个衍生类:class Control : public ControlId

成员变量

  • id:一个整型的值,真正意义上的control id
  • name
  • ControlType type: bool, u32, float, string...
  • DirectionFlags direction: in/out

 

ControlInfo

作用

描述ControlValue的约束,用于:

  • 验证控制值是否合法
  • 向上层告知控制项的取值范围
  • 表示枚举型控制的可选值

成员变量

  • ControlValue min
  • ControlValue max
  • ControlValue def:min/max/def用于控制数值范围
  • vector values:用于枚举控制的可选值列表

 

ControlIdMap

  • 定义:unordered_map<unsigned int, const ControlId *>
  • 描述某个整型(key)与ControlId的映射。
  • id === controlId.id()

 

ControlInfoMap

作用

class ControlInfoMap : private std::unordered_map<const ControlId *, ControlInfo>

  • 首先,它是一个unordered_map,是ControlId对ControlInfo的映射,这是它的本质作用
  • 重载unordered_map的find,at等,让用户可以通过int id查询某组映射

成员变量

  • ControlIdMap *idmap_

成员函数

  • validate():验证 map 中的每个 ControlId 是否在 idmap 中,且类型匹配

 

ControlList

作用

  • 用于存放所有的control value
  • 它的核心成员是ControlListMap,也就是用map存储这些control
  • 它提供了针对control的基本操作,比如增(set)清(clear,清空所有control list)查(get)改(set)

成员变量

  • ControlIdMap *idmap
  • ControlInfoMap *infoMap
  • ControlListMap controls:using ControlListMap = std::unordered_map<unsigned int, ControlValue>

成员函数

  • set
  • get
  • clear
  • merge
  • 其他
posted @ 2026-04-20 10:35  moonのsun  阅读(12)  评论(0)    收藏  举报