- 博客(294)
- 收藏
- 关注
原创 compare_exchange_weak详解
对于类型的变量atomic_var特点内容功能CAS(Compare And Swap):相等就替换类型weak允许虚假失败,适合 retry 循环关键参数expected是传引用,会在失败时被更新用途lock-free 数据结构(栈、队列、哈希表)和锁对比更高性能、更复杂、更容易出错常见错误忘了处理 expected 被修改、忽视内存序影响会自动更新expected// 读当前 head!// CAS 尝试替换 head为什么不重新load()也可以继续工作?
2025-06-26 10:54:16
644
原创 C++内存序memory_order
C++ 原子操作提供,分别控制编译器和 CPU 如何对内存操作进行重排序优化,确保并发程序在多线程之间的行为可控、正确。
2025-06-25 14:21:26
313
原创 std::atomic_flag实现自旋锁
代码解释:这段代码实现了一个简单的自旋锁(spinlock),其中用到了,它是 C++ 提供的最轻量级的原子类型之一,专门用于实现自旋锁等低级同步原语。
2025-06-25 14:06:30
131
原创 对future,promise,async,packaged_task的彻底理解
future的引入是为了解决thread并不提供直接接收返回值的机制的问题。的设计理念是:只负责调度和执行线程函数,不负责管理其结果。所以,如果你想要线程函数返回值,你需要使用 std::future配合 std::async或 std::promise来实现。
2025-06-18 10:48:13
299
原创 为什么 C++ 的 const 成员函数也要加锁?mutable 的使用详解
如果另一个线程正在调用 push(),你这边的 empty() 就可能访问到未同步的状态,从而导致数据竞争、未定义行为。// ✅ mutable 允许在 const 函数中加锁。std::mutex 是可变状态,需要 mutable 才能在 const 函数里使用;C++ 官方文档:mutable、std::mutex、std::lock_guard。你在 const 成员函数里调用它会报错,因为你不能修改非 mutable 成员。std::mutex::lock() 是非 const 的成员函数;
2025-06-18 10:00:49
411
原创 深入理解 std::thread 参数传递中的引用问题:左值、右值、万能引用与 std::forward 的背后
深入理解 std::thread 参数传递中的引用问题:左值、右值、万能引用与 std::forward 的背后。std::move 是强制右值,std::forward 是条件转发。std::thread 默认复制参数,传引用要用 std::ref。std::ref 和 std::forward 的实际意义。
2025-06-17 14:54:59
269
原创 td::thread my_thread(background_task()); std::thread my_thread((background_task()));的区别
写法实际含义是否正确声明了一个函数❌ 错误调用函数并传给✅ 正确花括号方式,避免解析歧义✅ 正确。
2025-06-17 11:20:23
123
原创 FrameLength和Shutter
项目说明Shutter 单位✅ 行(lines)LineTime 单位✅ 时间,= LineLength / PCLK✅ 就是总曝光时间FrameLength = Shutter 是否可行?❌ 不推荐:没有 margin 会导致读取问题实际做法。
2025-06-06 09:27:19
124
原创 unordered_map增加元素的接口学习
方法会自动创建 key 吗?是否覆盖已有 key?是否构造 value?推荐用途✅ 是✅ 是✅ 默认构造后赋值简洁更新或插入❌ 否❌ 否✅ 构造后判断仅插入❌ 否❌ 否✅ 直接构造原地插入性能更优❌ 否❌ 否✅ 仅必要时构造高效插入。
2025-06-01 08:42:41
360
原创 gralloc的layer count字段
项目行为gralloc 分配时设置GPU/Display HAL 处理按层访问内存、分别渲染、或者合成Camera HAL 处理多帧捕捉,按 layer 拆开处理本质:layer count > 1 只是一种优化手段,让一次分配的内存能承载更多数据,减少多次分配和管理的开销。属性来源说明layerCountAOSP 原生表示一个 buffer 包含几个图层(非帧数)高通是否定制否(字段原生支持),但可能有定制用法会结合使用场景(如 Camera、VR)做一些定制处理常见用途。
2025-04-29 11:27:58
753
原创 __iomem不能解引用(deref)
为什么不能直接 ?因为 MMIO 区域可能:访问延迟:不像 RAM,可以缓存 + 快速访问副作用强:写入某寄存器会触发中断、DMA 等不支持缓存 / 缓冲操作 会加上 + ,确保顺序和正确性
2025-04-21 16:54:58
159
原创 MMIO、IOMAP 和 IOMMU 总结
MMIO 是将外设的寄存器映射到内存地址空间中的一种机制,使得 CPU 可以像读写内存一样访问硬件寄存器。ioremap()是 Linux 内核提供的一个函数,用于将 MMIO 物理地址映射到内核虚拟地址空间,让驱动能用指针读写设备寄存器。IOMMU 是为设备提供地址转换的 MMU,作用是在设备访问内存(DMA)时,将其使用的虚拟地址(IOVA)翻译为实际的物理地址(PA)。
2025-04-21 16:46:06
577
原创 volatile的进一步深入理解
特性volatile/ 加锁防编译器优化✅ 是✅ 是防 CPU 重排序❌ 否✅ 可选(acquire 等)保证原子性❌ 否✅ 是多线程下安全⚠️ 有条件✅ 是驱动开发适用✅ 非常适合❌ 不适合。
2025-04-18 17:06:33
277
原创 volatile 和 memory barrier 的组合用法
volatile是给编译器的提示,memory barrier 是给CPU的命令。“写完再标记”“先设寄存器 A,再设寄存器 B”“先检查条件,再做动作”
2025-04-18 16:55:18
418
原创 volatile再深入
避免编译器对某个变量的访问进行“优化缓存”,强制每次都从内存读取。上面这段代码中,如果没有volatile,编译器可能会这样优化:你一直没改变flag,那我只读取一次好了,放在寄存器里一直用。结果如果别的线程或硬件中断在后台改变了 flag 的值,主线程永远也看不到,程序就卡死了。加了volatile,就告诉编译器:别优化这个变量,每次循环都从内存重新读一次!问题答案为什么对地址加volatile?告诉编译器“这个地址值不能缓存,每次都得真的访问”如果不加会怎样?
2025-04-18 16:48:11
900
原创 Pipeline更多理解
Pipe 类型用途VIGVideo Image Generator:用于图层显示,支持 scaling、rotationRGB简单图层显示,较低优先级DMA主要用于 writeback / WFD / composition output,即从 framebuffer 输出到外部设备(或 memory)Cursor小图层,用于显示指针等很可能是:分别用于主屏、仪表、虚拟显示的输出路径或者用于不同的 display 去做 GPU_TARGET / writeback 的拷贝你看到的意思。
2025-04-16 18:04:42
834
原创 Dual-Pipe Split 合成模式
大尺寸画面会在必要时被拆分成“左/右两半”,分别交给两个 pipeline 合成和输出,这叫Dual-Pipe Split(左右分屏合成),可以显著提升大分辨率下的效率和性能。
2025-04-16 17:51:25
288
原创 HWDeviceDRM的三个子类,HWPeripheralDRM HWTVDRM HWVirtualDRM
/ 抽象的 DRM 显示设备接口protected:...// 主屏实现// 额外支持 panel boot、partial update、brightness、Qsync 等// HDMI/DP 实现// 支持 EDID、HDCP、可拔插、色彩空间切换// 虚拟屏实现// 不接 connector,主要为视频输出或投屏用途子类用途典型连接方式特征主屏幕MIPI DSIpanel 固定、默认开机、支持 brightnessHWTVDRM外接屏HDMI / DP。
2025-04-16 17:33:46
659
原创 display的一些学习记录
今天突然一下子反应过来,Virtual Display是依赖于CWB的。所以DISABLE_VIRTUAL_DISPLAY这个是我自己反应过来以后才去寻找证据,得到印证的。3. 说明之前ScreenRecord只能走GPU合成路径。2.目前的配置,我们永远不可能从HWC得到output layer。后续初始化 cluster 屏(SDM id = 57)负责初始化主屏(SDM id = 54)从Log里总结的话,
2025-04-16 17:09:56
401
原创 Node 处理 request 的过程中,都会更新哪些 metadata 和 property
用于描述帧状态、控制参数、处理结果等是随 request 流动的结构,通常是,每一帧一份属于 HAL3 metadata 树的组成部分是 CamX 内部定义的一种帧级别的轻量信息块不一定会传到上层,但用于 Node 之间的同步和依赖判断通常以定义,和配套使用类型举例发布方式目的MetadataAE 状态,曝光时间,AF 状态提供给上层、下游模块Propertyframe 处理状态,内部依赖标记,frame group info用于 CamX 内部节点依赖调度。
2025-04-10 17:02:32
873
原创 DeferredRequestQueue依赖更新流程
找出所有“准备好处理”的节点(依赖满足),并将其投递给线程池去执行。同时支持 preemption(抢占)机制。功能块说明preemption 检查可跳过非关键节点的依赖(提高灵活性)依赖检查通过把节点转移到 readyNodes分发 ready 节点投递到线程池异步执行memory 管理小心释放链表节点本身,保留 dependency 本体直到执行完成—— 这是CamX 中关键的依赖更新入口函数,但它并不是直接去遍历,而是走了一条更“优化”的路:它用一个依赖映射表来快速找到那些受影响的。
2025-04-10 15:49:09
1040
原创 fusion场景分析
概念说明普通拍照是否做 Fusion视场景而定,夜景 / HDR 会做ZSL 和 MFNR 的关系ZSL 提供多帧,MFNR 处理多帧picking 的参数控制从 ZSL buffer 里挑多少帧参与 fusionFusion 动作在哪发生Chi Node 里的 MFNR/HDR/Fusion node,或 ISP pipeline。
2025-04-10 09:12:58
562
原创 一行代码引出来的学习
在 Android 相机 HAL 中,metadata(元数据)系统用来传递各种参数,比如:ISO、快门、AWB 状态等 —— 都是标准 tag(系统预定义)厂商也可以自定义 metadata 字段 ——这就是 Vendor Tag这段代码的作用是从 vendor tag 系统中查找这个自定义字段的 ID,后续用来在 CameraMetadata 中读取/写入多摄帧率匹配信息。接下来从同步帧率(FPS Match)入手,学习一下两个sensor需要同步的一些设置:在双摄 / 多摄场景。
2025-04-10 09:00:02
696
原创 QSC和LTC以及PWL
QSC 是 Sony 高端图像传感器中的一种空间校正机制,主要用于修复像素阵列中的空间非均匀性(spatial non-uniformity),尤其在架构下使用。LTC 是一种将图像传感器采集的线性响应信号压缩成更宽动态范围格式的机制,常用于HDR(高动态范围)成像场景。技术名功能修正像素空间响应差异压缩线性图像为非线性(对数)格式应用Quad Bayer、PDAF、像素 binningHDR、ISP、压缩格式输出数据来源EEPROM / OTP 校准数据内建 LUT,部分可编程原因。
2025-04-09 16:29:58
780
原创 Sensor寄存器配置
这段枚举定义是相机 sensor driver 中标准的寄存器表分类方式。每种对应一组操作目的,驱动框架可以根据这些分类,来决定:什么时候加载哪一组寄存器表动态切分辨率、HDR 模式、开启对焦/白平衡的策略如何与 OTP / Chromatix 等模块协调操作。
2025-04-09 16:22:57
327
原创 tunneled playback
Tunneled Playback 是 Android 多媒体框架中的“直通模式”,将视频帧从解码器直送显示设备,不走 UI 合成系统,依赖音频系统进行 AV 同步,适用于低功耗、高性能或 DRM 视频播放。
2025-04-07 15:49:06
593
原创 sideband stream 这种合成类型确实通常只会出现在 tunneled playback 场景
这种合成类型确实通常只会出现在 tunneled playback 场景,它是实现 zero-copy、低功耗、高性能播放路径 的关键组件之一。我们一起来详细捋清楚这个东西:它是 SurfaceFlinger 合成层中的一种特殊类型,叫做:这是与常规 、、 等合成类型不同的形式,代表这个 Layer 不使用传统的 GraphicBuffer 进行内容传递,而是通过一个“旁路通道(sideband stream)”传输视频数据,绕过 CPU 和 SurfaceFlinger 的介入。 是 tunneled p
2025-04-07 15:42:45
317
原创 各种Mode总结
PortMode意义Buffer 来源使用场景Codec 自己分配 ByteBufferCodec 内部分配一般用于软件编解码(SW Codec)或硬件编解码但使用非图形 bufferCodec 自己分配 GraphicBufferCodec 通过 ANativeWindow 分配常见于硬件视频解码,输出到 Surface 的场景Codec 自己分配 Secure BufferSecure Codec 内部分配(无法访问)DRM 视频播放、Widevine L1 安全路径。
2025-04-07 14:47:13
322
原创 store-metadata-in-buffers机制
模式传给 Codec 的是?buffer 数据在?是否 Zero Copy普通模式真实 buffer应用 or Codec 分配❌Metadata 模式Surface 中的 buffer✅Secure 模式Codec 内部✅(但不可访问)
2025-04-07 14:21:55
728
原创 OMX 中的 PortMode(端口模式)概述
在和ACodec这些 PortMode 会决定 buffer 的分配方式、类型,以及是否由 Codec 自己管理。
2025-04-07 13:59:00
624
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人