B2HGraphicBufferProducer和H2BGraphicBufferProducer

在 Android 的图形系统中,B2HGraphicBufferProducerBnGraphicBufferProducer 是基于 Binder 机制的两个重要组件,它们负责图形缓冲区的生产接口。二者关系可以理解为 桥接和实现分离,以下是详细说明:

1. B2HGraphicBufferProducer

B2HGraphicBufferProducer 是一个中间桥接类,它的主要功能是将 HAL(硬件抽象层)的 IGraphicBufferProducer 实现桥接为 IGraphicBufferProducer Binder 接口,使其能通过 Binder IPC 机制进行通信。

  • 典型位置: 位于 hardware/interfaces/graphics/allocator 或相关 HAL 接口中,提供跨进程桥接能力。

  • 主要用途

    • 将图形缓冲区生产逻辑从底层(硬件驱动/HAL)桥接到 Android 的图形栈。
    • 通常配合其他硬件接口,比如 HGraphicBufferProducer,用于整合 HAL 层资源。
  • 关键特性B2HGraphicBufferProducer 作用类似于适配器,将传统 HAL 中的缓冲区生产逻辑转换为面向高层的 Binder 调用。


2. BnGraphicBufferProducer

BnGraphicBufferProducerIGraphicBufferProducer 的具体 Binder 服务端实现,用于在服务端处理来自客户端的 Binder 调用。

  • 主要用途

    • 实现 Binder IPC 的服务端逻辑。
    • 处理 IGraphicBufferProducer 接口定义的所有方法,比如缓冲区分配、回收、提交。
  • 实现方式BnGraphicBufferProducer 通常通过继承接口并覆写其方法,直接对请求进行处理。例如:

    class BnGraphicBufferProducer : public BnInterface<IGraphicBufferProducer> {
    public:// Override the methods declared in IGraphicBufferProducerstatus_t allocateBuffer(...);status_t detachBuffer(...);
    };
    


3. 它们之间的关系

  1. 桥接角色:B2HGraphicBufferProducer
    B2HGraphicBufferProducer 不直接实现 IGraphicBufferProducer 的逻辑,而是将这些接口转换为 Binder 层接口调用。这使得 HAL 层可以通过 IPC 与高层组件通信。

  2. 服务端实现:BnGraphicBufferProducer
    BnGraphicBufferProducer 提供了 IGraphicBufferProducer 接口在服务端的具体实现,处理 Binder 层的调用请求。

  3. 实际通信流

    • 客户端:通过 BpGraphicBufferProducer 调用 Binder 接口发送请求。
    • 桥接B2HGraphicBufferProducer 将请求解析后调用 HAL 提供的具体实现。
    • 服务端BnGraphicBufferProducer 对接 HAL 或处理逻辑完成任务。

4. 示例对比

// B2HGraphicBufferProducer 示例:作为桥接实现 HAL 对高层的 Binder 接口
class B2HGraphicBufferProducer : public HGraphicBufferProducer {
public:B2HGraphicBufferProducer(sp<IGraphicBufferProducer> producer) : mProducer(producer) {}Return<void> requestBuffer(int32_t slot, requestBuffer_cb _hidl_cb) override {// 转发 Binder 调用到具体的 HAL 层 producermProducer->requestBuffer(slot, ...);}private:sp<IGraphicBufferProducer> mProducer; // 持有 HAL 实现
};// BnGraphicBufferProducer 示例:作为服务端处理 Binder 调用
class BnGraphicBufferProducer : public BnInterface<IGraphicBufferProducer> {status_t allocateBuffer(...) override {// 实现缓冲区分配逻辑}status_t detachBuffer(...) override {// 实现缓冲区分离逻辑}
};

5. 关键区别

特性B2HGraphicBufferProducerBnGraphicBufferProducer
角色桥接 HAL 和 Binder服务端实现接口
实现方式适配 IGraphicBufferProducer 的 HAL 实现处理客户端 IGraphicBufferProducer 调用
典型场景用于硬件资源桥接用于服务端管理 BufferProducer 接口
定位中间桥梁服务端逻辑

6. B2HGraphicBufferProducer 的作用

B2HGraphicBufferProducer 是一个适配器(或桥接)类,它将 HAL 层实现与高层 Binder 接口连接起来,通常运行在服务端进程中。

核心职责:
  • 桥接 HAL 的 HGraphicBufferProducer 与 Framework 的 IGraphicBufferProducer
  • 运行在 服务端,用于调用具体的 HAL 实现。
 
Framework (e.g., SurfaceFlinger)↕Binder (IGraphicBufferProducer)↕B2HGraphicBufferProducer (桥接 HAL 和 IGraphicBufferProducer)↕HGraphicBufferProducer (HAL 层具体实现)

示例调用路径:
  • 客户端发起调用,经过 BpGraphicBufferProducer 和 Binder IPC,最终到达 BnGraphicBufferProducer
  • BnGraphicBufferProducer 实现调用 B2HGraphicBufferProducer,桥接到 HAL 层处理。

7. 客户端到服务端的调用流

举例以 IGraphicBufferProducer::queueBuffer() 为例:

  1. 客户端进程调用 BpGraphicBufferProducer::queueBuffer()
  2. Binder 将调用请求发送到服务端的 BnGraphicBufferProducer
  3. 在服务端,BnGraphicBufferProducer 负责处理:
    • 如果是 HAL 请求,转发到 B2HGraphicBufferProducer,再桥接到 HAL 实现。
    • 如果是 Framework 内部逻辑,由 SurfaceFlinger 或其他服务直接处理。

具体调用路径可能类似:

客户端:BpGraphicBufferProducer::queueBuffer()↕
Binder IPC↕
服务端:BnGraphicBufferProducer::queueBuffer()↕如果目标为 HAL 层:调用 B2HGraphicBufferProducer::queueBuffer()↕HGraphicBufferProducer::queueBuffer()

=========================================================================

引入 H2BGraphicBufferProducer 的原因,通常是在 服务端和客户端 的不同层次之间,进一步桥接和适配新的硬件抽象层(HAL)。它与 B2HGraphicBufferProducer 相辅相成,作用和职责可以更好地说明图形栈的调用流程。


1. 角色简介

H2BGraphicBufferProducer
  • H2B:HAL(Hardware Abstraction Layer)到 Binder。
  • 桥接 硬件实现(HAL层)Framework 层的 Binder IPC 接口
  • 作用与 B2HGraphicBufferProducer 相反
    • 它将 HAL 层的实现 转化为可供 Binder 调用的接口,主要用于服务端。
    • HAL 层提供图形生产接口(如 HGraphicBufferProducer),H2BGraphicBufferProducer 将这些实现包装为可由高层使用的 IGraphicBufferProducer
B2HGraphicBufferProducer
  • B2H:Binder 到 HAL。
  • 桥接 Binder IPC(高层接口调用)HAL层的实现
  • 它将 Binder IPC 的调用 转发到具体 HAL 层接口执行,主要服务于服务端或者某些情况下的代理调用。

2. 桥接关系与数据流

可以总结如下流程:

 
客户端调用        H2B                                 服务端处理     B2H                              HAL层
App --> BpGraphicBufferProducer --> H2BGraphicBufferProducer --> BnGraphicBufferProducer --> B2HGraphicBufferProducer --> HGraphicBufferProducer


3. 两者的分工

特性H2BGraphicBufferProducerB2HGraphicBufferProducer
方向HAL 层向 Framework 层提供接口桥接Framework 层向 HAL 层请求执行桥接
接口类型提供 IGraphicBufferProducer 实现,供 Binder 使用使用 HAL 提供的 HGraphicBufferProducer 实现,将调用委托给 HAL 层实现
运行位置服务端,通常在 Binder 服务端处理逻辑 的高层接口服务端,也负责与 HAL 紧密交互
作用让 HAL 层的具体实现作为 Binder 服务暴露给客户端调用 HAL 层的具体实现,并将结果传递回 Framework 层

4. 如何理解调用流

在 Android 图形栈的某些情况下,这种双向桥接实现(H2B 和 B2H)是为了让服务端既能够作为一个 Binder 服务暴露给客户端,又能直接与硬件(HAL)通信,统一管理图形缓冲区的生产、分发和使用。

queueBuffer 为例:
  1. 客户端调用

    • 客户端(如应用或 Framework)通过 BpGraphicBufferProducer 发起 queueBuffer 调用。
    • Binder 将调用请求转发到服务端。
  2. H2BGraphicBufferProducer

    • 服务端的 H2BGraphicBufferProducer(如果存在)会接收客户端调用,并包装 HAL 提供的实现接口。
  3. BnGraphicBufferProducer

    • BnGraphicBufferProducer 作为 Binder 服务端核心入口,接收并解析客户端调用。
  4. B2HGraphicBufferProducer

    • 在 Binder 处理完服务端业务后,调用 HAL 层逻辑,通过 B2HGraphicBufferProducerqueueBuffer 调用转发到 HGraphicBufferProducer
  5. HAL 层实现

    • HGraphicBufferProducer 在 HAL 层实现实际的 queueBuffer 逻辑,并返回结果。

5. 两者协作的代码层面分析

(1) H2BGraphicBufferProducer 的伪代码示例:
 
class H2BGraphicBufferProducer : public IGraphicBufferProducer {
private:sp<HGraphicBufferProducer> mHalImpl; // 保存 HAL 实现类实例public:H2BGraphicBufferProducer(const sp<HGraphicBufferProducer>& halImpl) : mHalImpl(halImpl) {}virtual status_t queueBuffer(int slot, const QueueBufferInput& input,QueueBufferOutput* output) override {// 转发 HAL 的实现供 Framework 调用return mHalImpl->queueBuffer(slot, input, output);}
};

(2) B2HGraphicBufferProducer 的伪代码示例:
 
class B2HGraphicBufferProducer : public HGraphicBufferProducer {
private:sp<IGraphicBufferProducer> mBinderImpl; // 保存高层 Binder 接口实现public:B2HGraphicBufferProducer(const sp<IGraphicBufferProducer>& binderImpl) : mBinderImpl(binderImpl) {}virtual status_t queueBuffer(int slot, const QueueBufferInput& input,QueueBufferOutput* output) override {// 转发 Binder 的调用至高层逻辑return mBinderImpl->queueBuffer(slot, input, output);}
};


6. 示例调用链

以下是完整的调用链可能情况:

(a) 客户端到服务端:
  1. 客户端调用 BpGraphicBufferProducer::queueBuffer
  2. 服务端 BnGraphicBufferProducer::onTransact 接收调用并分发到:
    • 桥接类 H2BGraphicBufferProducer 中。
    • 或服务端直接处理。
(b) 服务端调用 HAL:
  1. 服务端逻辑中,调用 B2HGraphicBufferProducer::queueBuffer
  2. 最终,调用 HAL 的 HGraphicBufferProducer

7. 总结

  1. H2BGraphicBufferProducer 是一个 HAL 转 Binder 的桥接器,用于服务端。
  2. B2HGraphicBufferProducer 是一个 Binder 转 HAL 的桥接器,用于连接 Binder 层与 HAL 层。
  3. 调用路径依赖场景设计,主要方向是:
    • 客户端调用到 Framework 或 HALBpGraphicBufferProducer -> H2BGraphicBufferProducer
    • Framework 调用 HAL 实现B2HGraphicBufferProducer -> HGraphicBufferProducer

 实际情况:

在Android 14的代码里,这两个类似乎没怎么在surfaceflinger或者说graphics模块上有太多用处,反而是在Camera和Video模块里有new过这两个类。

另外,H2BGraphicBufferProducer 类的父类定义在:system/libhidl目录下,可自行查找。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/64890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sentinel学习笔记7-熔断降级

本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏&#xff0c;写的好值得推荐&#xff0c;我整理的有所删减&#xff0c;推荐看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html 限流需要我们根据不同的硬件条件做好压测&#xff0c;不好准确评估…

记录--uniapp 安卓端实现录音功能,保存为amr/mp3文件

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 功能实现需要用到MediaRecorder、navigator.mediaDevices.getUserMedia、Blob等API&#xff0c;uniapp App端不支持&#xff0c;需要借助renderjs来实现 实现逻辑 通过naviga…

步进电机位置速度双环控制实现

步进电机位置速度双环控制实现 野火stm32电机教学 提高部分-第11讲 步进电机位置速度双环控制实现(1)_哔哩哔哩_bilibili PID模型 位置环作为外环,速度环作为内环。设定目标位置和实际转轴位置的位置偏差,经过位置PID获得位置期望,然后讲位置期望(位置变化反映了转轴的速…

MySQL 8.0:explain analyze 分析 SQL 执行过程

介绍 MySQL 8.0.16 引入一个实验特性&#xff1a;explain formattree &#xff0c;树状的输出执行过程&#xff0c;以及预估成本和预估返 回行数。在 MySQL 8.0.18 又引入了 EXPLAIN ANALYZE&#xff0c;在 formattree 基础上&#xff0c;使用时&#xff0c;会执行 SQL &#…

事务、管道

目录 事务 相关命令 悲观锁 乐观锁 管道 实例 Pipeline与原生批量命令对比 Pipeline与事物对比 使用Pipeline注意事项 事务 相关命令 命令描述discard取消事务&#xff0c;放弃执行事务块内的所有命令exec执行所有事务块内的事务&#xff08;所有命令依次执行&#x…

list的常用操作

list的介绍 list是序列容器&#xff0c;它允许在常数范围O&#xff08;1&#xff09;进行插入和删除在这段序列的任意位置&#xff0c;并且可以双向遍历 它是弥补vector容器的缺点&#xff0c;与vector有互补的韵味&#xff0c; 这里我们可以将其进行与vector进行对比 vect…

3.4 stm32系列:定时器(PWM、定时中断)

一、定时器概述 1.1 软件定时原理 使用纯软件&#xff08;CPU死等&#xff09;的方式实现定时&#xff08;延时&#xff09;功能&#xff1b; 不精准的延迟&#xff1a; /* 微秒级延迟函数* 不精准* stm32存在压出栈过程需要消耗时间* 存在流水线&#xff0c;执行时间不确定…

28、论文阅读:基于像素分布重映射和多先验Retinex变分模型的水下图像增强

A Pixel Distribution Remapping and Multi-Prior Retinex Variational Model for Underwater Image Enhancement 摘要介绍相关工作基于模型的水下图像增强方法&#xff1a;无模型水下图像增强方法&#xff1a;基于深度学习的水下图像增强方法&#xff1a; 论文方法概述像素分布…

【路径规划】原理及实现

路径规划&#xff08;Path Planning&#xff09;是指在给定地图、起始点和目标点的情况下&#xff0c;确定应该采取的最佳路径。常见的路径规划算法包括A* 算法、Dijkstra 算法、RRT&#xff08;Rapidly-exploring Random Tree&#xff09;等。 目录 一.A* 1.算法原理 2.实…

java web springboot

0. 引言 SpringBoot对Spring的改善和优化&#xff0c;它基于约定优于配置的思想&#xff0c;提供了大量的默认配置和实现 使用SpringBoot之后&#xff0c;程序员只需按照它规定的方式去进行程序代码的开发即可&#xff0c;而无需再去编写一堆复杂的配置 SpringBoot的主要功能…

实验四 综合数据流处理-Storm (单机和集群配置部分)

1.前期准备 &#xff08;1&#xff09;把docker和docker-compose给下载好 参考&#xff1a;基于docker-compose来搭建zookeeper集群-CSDN博客&#xff08;注意对于这篇文章下面配置zookeeper的内容&#xff0c;可以直接跳过&#xff0c;因为我们只需要看最上面下载docker-com…

前端开发 之 12个鼠标交互特效下【附完整源码】

前端开发 之 12个鼠标交互特效下【附完整源码】 文章目录 前端开发 之 12个鼠标交互特效下【附完整源码】七&#xff1a;粒子烟花绽放特效1.效果展示2.HTML完整代码 八&#xff1a;彩球释放特效1.效果展示2.HTML完整代码 九&#xff1a;雨滴掉落特效1.效果展示2.HTML完整代码 十…

Java设计模式 —— 【结构型模式】外观模式详解

文章目录 概述结构案例实现优缺点 概述 外观模式又名门面模式&#xff0c;是一种通过为多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部子系统的具体的细节&#xff0c;这…

基于Springboot + vue实现的汽车资讯网站

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

Html:点击图标链接发起QQ临时会话

我们在做前端开发的时候&#xff0c;会遇到用户需要点击一个图标可以发起QQ临时会话&#xff0c;这样不用添加好友也能沟通的&#xff0c;那我们就来看看如何实现这个功能&#xff1a; <a href"http://wpa.qq.com/msgrd?v3&uin你的QQ号码&siteqq&menuyes…

echarts画风向杆

1.安装echarts 2.引入echarts 4.获取数据&#xff0c;转换数据格式 windProfile.title.text ${moment(time.searchTime[0], ‘YYYY-MM-DD HH:mm:ss’).format( ‘YYYY-MM-DD HH:mm’ )}-${moment(time.searchTime[1], ‘YYYY-MM-DD HH:mm:ss’).format(‘YYYY-MM-DD HH:mm’)…

Linux系统编程——理解系统内核中的信号捕获

目录 一、sigaction() 使用 信号捕捉技巧 二、可重入函数 三、volatile关键字 四、SIGCHLD信号 在信号这一篇中我们已经学习到了一种信号捕捉的调用接口&#xff1a;signal(),为了深入理解操作系统内核中的信号捕获机制&#xff0c;我们今天再来看一个接口&#xff1a;si…

IEC104 协议 | 规约帧格式 / 规约调试

注&#xff1a;本文为 “ IEC104 协议” 相关文章合辑。 未整理去重&#xff0c;如有内容异常请看原文。 图片清晰度限于引文原状。 从零开始理解 IEC104 协议之一 ——104 规约帧格式 洪城小电工 IP 属地&#xff1a;江西 2020.06.10 00:30:54 前言 本文根据相关标准、本…

WPS如何快速将数字金额批量转换成中文大写金额,其实非常简单

大家好&#xff0c;我是小鱼。 在日常的工作中经常会遇到需要使用金额大写的情况&#xff0c;比如说签订业务合同时一般都会标注大写金额&#xff0c;这样是为了安全和防止串改。但是很多人也许不太熟悉金额大写的方法和习惯&#xff0c;其它没有关系&#xff0c;我们在用WPS制…

针对超大规模病理图像分析!华中科技大学提出医学图像分割模型,提高干燥综合征诊断准确性

口干、眼干、皮肤干&#xff0c;每天伴有不明原因的肌肉酸痛和全身乏力&#xff0c;如果以上症状你「中招」了&#xff0c;除了考虑冬季天气干燥外&#xff0c;还应该警惕一种常见却总是被我们忽视的疾病——干燥综合征 (Sjgren’s Syndrome, SS)。 干燥综合征是以外分泌腺高度…