- 博客(280)
- 收藏
- 关注
原创 gralloc的layer count字段
项目行为gralloc 分配时设置GPU/Display HAL 处理按层访问内存、分别渲染、或者合成Camera HAL 处理多帧捕捉,按 layer 拆开处理本质:layer count > 1 只是一种优化手段,让一次分配的内存能承载更多数据,减少多次分配和管理的开销。属性来源说明layerCountAOSP 原生表示一个 buffer 包含几个图层(非帧数)高通是否定制否(字段原生支持),但可能有定制用法会结合使用场景(如 Camera、VR)做一些定制处理常见用途。
2025-04-29 11:27:58
736
原创 __iomem不能解引用(deref)
为什么不能直接 ?因为 MMIO 区域可能:访问延迟:不像 RAM,可以缓存 + 快速访问副作用强:写入某寄存器会触发中断、DMA 等不支持缓存 / 缓冲操作 会加上 + ,确保顺序和正确性
2025-04-21 16:54:58
134
原创 MMIO、IOMAP 和 IOMMU 总结
MMIO 是将外设的寄存器映射到内存地址空间中的一种机制,使得 CPU 可以像读写内存一样访问硬件寄存器。ioremap()是 Linux 内核提供的一个函数,用于将 MMIO 物理地址映射到内核虚拟地址空间,让驱动能用指针读写设备寄存器。IOMMU 是为设备提供地址转换的 MMU,作用是在设备访问内存(DMA)时,将其使用的虚拟地址(IOVA)翻译为实际的物理地址(PA)。
2025-04-21 16:46:06
428
原创 volatile的进一步深入理解
特性volatile/ 加锁防编译器优化✅ 是✅ 是防 CPU 重排序❌ 否✅ 可选(acquire 等)保证原子性❌ 否✅ 是多线程下安全⚠️ 有条件✅ 是驱动开发适用✅ 非常适合❌ 不适合。
2025-04-18 17:06:33
261
原创 volatile 和 memory barrier 的组合用法
volatile是给编译器的提示,memory barrier 是给CPU的命令。“写完再标记”“先设寄存器 A,再设寄存器 B”“先检查条件,再做动作”
2025-04-18 16:55:18
400
原创 volatile再深入
避免编译器对某个变量的访问进行“优化缓存”,强制每次都从内存读取。上面这段代码中,如果没有volatile,编译器可能会这样优化:你一直没改变flag,那我只读取一次好了,放在寄存器里一直用。结果如果别的线程或硬件中断在后台改变了 flag 的值,主线程永远也看不到,程序就卡死了。加了volatile,就告诉编译器:别优化这个变量,每次循环都从内存重新读一次!问题答案为什么对地址加volatile?告诉编译器“这个地址值不能缓存,每次都得真的访问”如果不加会怎样?
2025-04-18 16:48:11
871
原创 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
787
原创 Dual-Pipe Split 合成模式
大尺寸画面会在必要时被拆分成“左/右两半”,分别交给两个 pipeline 合成和输出,这叫Dual-Pipe Split(左右分屏合成),可以显著提升大分辨率下的效率和性能。
2025-04-16 17:51:25
266
原创 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
631
原创 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
371
原创 Node 处理 request 的过程中,都会更新哪些 metadata 和 property
用于描述帧状态、控制参数、处理结果等是随 request 流动的结构,通常是,每一帧一份属于 HAL3 metadata 树的组成部分是 CamX 内部定义的一种帧级别的轻量信息块不一定会传到上层,但用于 Node 之间的同步和依赖判断通常以定义,和配套使用类型举例发布方式目的MetadataAE 状态,曝光时间,AF 状态提供给上层、下游模块Propertyframe 处理状态,内部依赖标记,frame group info用于 CamX 内部节点依赖调度。
2025-04-10 17:02:32
833
原创 DeferredRequestQueue依赖更新流程
找出所有“准备好处理”的节点(依赖满足),并将其投递给线程池去执行。同时支持 preemption(抢占)机制。功能块说明preemption 检查可跳过非关键节点的依赖(提高灵活性)依赖检查通过把节点转移到 readyNodes分发 ready 节点投递到线程池异步执行memory 管理小心释放链表节点本身,保留 dependency 本体直到执行完成—— 这是CamX 中关键的依赖更新入口函数,但它并不是直接去遍历,而是走了一条更“优化”的路:它用一个依赖映射表来快速找到那些受影响的。
2025-04-10 15:49:09
993
原创 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
536
原创 一行代码引出来的学习
在 Android 相机 HAL 中,metadata(元数据)系统用来传递各种参数,比如:ISO、快门、AWB 状态等 —— 都是标准 tag(系统预定义)厂商也可以自定义 metadata 字段 ——这就是 Vendor Tag这段代码的作用是从 vendor tag 系统中查找这个自定义字段的 ID,后续用来在 CameraMetadata 中读取/写入多摄帧率匹配信息。接下来从同步帧率(FPS Match)入手,学习一下两个sensor需要同步的一些设置:在双摄 / 多摄场景。
2025-04-10 09:00:02
681
原创 QSC和LTC以及PWL
QSC 是 Sony 高端图像传感器中的一种空间校正机制,主要用于修复像素阵列中的空间非均匀性(spatial non-uniformity),尤其在架构下使用。LTC 是一种将图像传感器采集的线性响应信号压缩成更宽动态范围格式的机制,常用于HDR(高动态范围)成像场景。技术名功能修正像素空间响应差异压缩线性图像为非线性(对数)格式应用Quad Bayer、PDAF、像素 binningHDR、ISP、压缩格式输出数据来源EEPROM / OTP 校准数据内建 LUT,部分可编程原因。
2025-04-09 16:29:58
649
原创 Sensor寄存器配置
这段枚举定义是相机 sensor driver 中标准的寄存器表分类方式。每种对应一组操作目的,驱动框架可以根据这些分类,来决定:什么时候加载哪一组寄存器表动态切分辨率、HDR 模式、开启对焦/白平衡的策略如何与 OTP / Chromatix 等模块协调操作。
2025-04-09 16:22:57
287
原创 tunneled playback
Tunneled Playback 是 Android 多媒体框架中的“直通模式”,将视频帧从解码器直送显示设备,不走 UI 合成系统,依赖音频系统进行 AV 同步,适用于低功耗、高性能或 DRM 视频播放。
2025-04-07 15:49:06
546
原创 sideband stream 这种合成类型确实通常只会出现在 tunneled playback 场景
这种合成类型确实通常只会出现在 tunneled playback 场景,它是实现 zero-copy、低功耗、高性能播放路径 的关键组件之一。我们一起来详细捋清楚这个东西:它是 SurfaceFlinger 合成层中的一种特殊类型,叫做:这是与常规 、、 等合成类型不同的形式,代表这个 Layer 不使用传统的 GraphicBuffer 进行内容传递,而是通过一个“旁路通道(sideband stream)”传输视频数据,绕过 CPU 和 SurfaceFlinger 的介入。 是 tunneled p
2025-04-07 15:42:45
283
原创 各种Mode总结
PortMode意义Buffer 来源使用场景Codec 自己分配 ByteBufferCodec 内部分配一般用于软件编解码(SW Codec)或硬件编解码但使用非图形 bufferCodec 自己分配 GraphicBufferCodec 通过 ANativeWindow 分配常见于硬件视频解码,输出到 Surface 的场景Codec 自己分配 Secure BufferSecure Codec 内部分配(无法访问)DRM 视频播放、Widevine L1 安全路径。
2025-04-07 14:47:13
306
原创 store-metadata-in-buffers机制
模式传给 Codec 的是?buffer 数据在?是否 Zero Copy普通模式真实 buffer应用 or Codec 分配❌Metadata 模式Surface 中的 buffer✅Secure 模式Codec 内部✅(但不可访问)
2025-04-07 14:21:55
718
原创 OMX 中的 PortMode(端口模式)概述
在和ACodec这些 PortMode 会决定 buffer 的分配方式、类型,以及是否由 Codec 自己管理。
2025-04-07 13:59:00
595
原创 其他合成方式介绍
硬件视频解码器(比如 MediaTek、Qualcomm 等方案的 Zero-Copy 视频)在 SurfaceFlinger 的 Layer 处理逻辑中,除了常见的。,SurfaceFlinger 不会自己合成,而是交由 HWC 处理。,通常用于 UI 组件,比如背景、蒙版等,不需要绑定 Buffer。,是 SurfaceFlinger 额外创建的系统 UI 组件。Always-On Display(AOD,息屏显示),还存在一些特殊的合成方式,比如。,而是专门用于屏幕的 UI 效果。
2025-04-07 11:02:54
843
原创 service call SurfaceFlinger 命令
查看当前设备的 VSync 和帧率相关信息。🔹 执行后,屏幕左上角可能会出现一个小的。,负责管理所有的屏幕渲染和合成。控制是否显示刷新率指示器。是 Android 的。,不同版本可能会有变化。
2025-04-07 10:57:48
156
原创 RTLD_LAZY RTLD_NOW RTLD_GLOBAL RTLD_LOCAL
如果符号有问题,错误会延迟到运行时才发现,容易导致崩溃。:立即解析所有符号,避免运行时找不到符号,但。可见,适合多个库共享符号,但可能导致冲突。启动更快,不会立即解析未使用的符号。(最后面会解释这一点)可能加载不必要的符号,影响性能。里的符号变成全局可见,后面。适合只使用部分库函数的情况。:符号仅库内部可见(默认)。内部使用,不会影响后面的。调用都能访问该库的符号。的时候,libA.so。:延迟解析符号,提高。
2025-04-07 10:56:40
369
原创 dlsym获取 C++ 符号
如果你能修改库的源码,可以用。,并解析 C++ 名称修饰。这是因为 C++ 支持。只能按字符串匹配符号名。这能帮你找到正确的符号。,编译器会对符号进行。
2025-04-07 10:54:24
350
原创 CCodec的CreateInputSurface和CreateOmxInputSurface
特性接口返回适用框架Codec2OMX是否现代路径是否使用平台新平台(如 Pixel)老平台或有特殊 HAL 的 SoC推荐使用(如果平台支持)(只用于兼容)/***/...是Android stagefright 层的封装类,它代表了一个活跃的 codec 实例。OMXNode是一个轻量的句柄(handle)或者 ID,是对应到 OMX Core 中的一个唯一标识。
2025-04-07 10:32:32
458
原创 Android 的 codec 框架概述
模块作用Codec实例,管理生命周期和bufferOMX管理所有 codec 实例mStore提供 component 实例的工厂ACodec控制器,上层 MediaCodec 的实现和Surface交换bufferCCodec新一代 Codec 管理器OMXNodeOMXNodeInstance 的 binder代理。
2025-04-07 10:01:14
713
原创 外部流输入的 Layer
在 Android 的 SurfaceFlinger 体系中,外部流输入的 Layer。,然后由 HWC(Hardware Composer)或 OpenGL ES 进行合成。,SurfaceFlinger 会收到 buffer 并决定是否使用 HWC 直接合成。,而 SurfaceFlinger 看到这个 Surface。,SurfaceFlinger 可能需要用 GPU 合成它。,就不会让 OpenGL ES 处理,而是交给 HWC。,避免 GPU 复制大量像素数据,提高功耗效率。
2025-04-02 17:56:45
732
原创 6DoF介绍
两者的协同控制是实现复杂运动(如飞行、抓取、导航)的基础,广泛应用于机器人、航空航天、VR/AR等领域。它们共同定义了物体在空间中的位置和姿态,是机器人、航空航天、虚拟现实(VR)、自动驾驶等领域的关键概念。:增加平移(Surge/Sway/Heave),如HTC Vive、Oculus Quest 2,允许用户在虚拟空间中自由移动。地面机器人可能受限于3DoF(如平面移动:Surge/Sway/Yaw),而水下或空中机器人需要完整6DoF。:仅支持旋转(Pitch/Yaw/Roll),如早期VR眼镜。
2025-04-02 11:18:14
620
原创 CamX与CHI分开的原因
包括与Android HAL3接口的对接、底层驱动(如V4L2框架)的通信、以及基础流程管理(如Session、Pipeline、Node的调度):CamX-CHI架构支持旧版HAL3接口,同时允许通过CHI绕过HAL3直接访问底层硬件(如ISP引擎),满足高性能需求。:CHI的定制化代码遵循Apache协议,允许厂商闭源部分算法(如AI ISP处理),而CamX的通用部分则开源。:厂商无需深入CamX核心代码,仅需通过CHI的扩展接口(如XML配置)即可完成功能适配,缩短开发周期。
2025-04-02 11:15:11
627
原创 Doze 模式
当 AOD 需要更新(如时间、通知变化)时,HWC 请求合成。并在屏幕熄灭时仍能显示某些内容(如时钟、通知等)。让 SurfaceFlinger 进行局部更新。例如,某些 OLED 屏幕在 Doze 模式下。SurfaceFlinger 进行合成,但。,通常用于 OLED 屏幕,以。用户点亮屏幕,设备恢复正常刷新率。适用于 OLED 屏幕,因为。可能会在 Doze 模式下。降低屏幕刷新率或仅在需要时刷新。,特别适用于 OLED 屏幕。允许屏幕在低功耗状态下显示。在 Doze 模式下,,但仍然显示基本信息。
2025-04-01 17:48:28
286
原创 onComposerHalRefresh和onComposerHalVsync 的区别
这两个函数都与 VSync 相关,但它们的作用和触发时机不同。,然后开始新的帧合成(Frame Composition)。(例如 60Hz 设备,每 16.67ms 触发一次)。,请求 SurfaceFlinger 开始新的合成。发现需要更新某些图层(不依赖 VSync),调用。触发,用于通知 SurfaceFlinger。,让 SurfaceFlinger 重新提交帧。开始新的合成(composition)周期。触发后,SurfaceFlinger 会调用。,但不一定是在 VSync 时刻。
2025-04-01 17:47:22
618
原创 CVP介绍
传统上,ISP(图像信号处理器)负责 Camera 里的低级处理,VPU 负责视频编解码。成为可能,比如 AI 超分辨率、AI 去噪、AI 视频增强等。:负责 H.264/H.265/VP9/AV1 等硬件编解码。但 AI 视觉计算(CVP/NPU)可以让 ISP/VPU。→ VPU 重新编码为 H.265 1080p 视频。(比如基于 AI 的超分辨率、降噪、视频背景虚化等)。:增强动态范围,使 SDR 视频转换为 HDR。:通过 V4L2 控制 CVP 进行视频处理。:调整色彩、对比度,提高视觉效果。
2025-03-31 15:03:21
830
原创 plane的 animation 属性
(例如高通在 HWC 实现中添加的扩展),用于优化特定场景下的动画渲染行为。:在动画过程中保留硬件资源(如 Plane 或带宽),避免因资源争夺导致卡顿。,旨在通过硬件加速优化动画性能。:若大量图层回退到 GPU 合成(Blending),可能增加负载。:硬件加速合成,决定哪些图层由显示控制器(如 DPU)直接处理。:通知 HWC 该图层需要特殊处理(如硬件加速的动画插值)。锁定 Plane 的配置,避免因图层频繁变化导致的合成抖动。:如游戏渲染,非 animation 路径可能引入更高延迟。
2025-03-31 14:14:54
597
原创 handoff、handoff_set 和 handoff_on_exit 属性
(如退出低功耗模式、恢复 Android 显示)时,是否需要将该 Plane 的控制权交还给原模块(如 HWC)。这些属性共同管理 Plane 在复杂场景(如低功耗模式、多屏协同)下的状态切换,确保显示资源的正确分配和高效利用。多显示设备(如主屏和副屏)之间动态分配 Plane 资源时,标记 Plane 是否需要被另一个显示控制器接管。低功耗模式时,某些 Plane 需要保留内容(如时钟、通知)并交由硬件直接管理,避免软件频繁刷新。硬件接管 Plane,HWC 停止对该 Plane 的更新。
2025-03-31 11:16:05
312
原创 DRM_CLIENT_CAP_UNIVERSAL_PLANES和DRM_CLIENT_CAP_ATOMIC
早期 DRM 接口仅暴露主显示平面(Primary Plane)、光标平面(Cursor Plane)等有限的硬件图层,其他叠加平面(Overlay Planes)可能无法直接管理。Wayland 合成器(如 Weston、KWin)、高级图形应用(如游戏、视频播放器)。获取所有可用平面(包括主平面、叠加平面、光标平面等),从而全面控制硬件的图层合成能力。)通过多个独立调用修改显示属性(分辨率、图层位置等),可能导致中间状态闪烁或配置不一致。表示成功,负数表示失败(如硬件不支持或内核版本过低)。
2025-03-31 11:09:35
753
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人