广安公司网站建设重庆建设教育协会网站首页

web/2025/9/29 13:35:09/文章来源:
广安公司网站建设,重庆建设教育协会网站首页,wordpress安装视频,做网站设计所遇到的问题这一节我们将了解Android OpenMax框架#xff0c;该框架了解完成之后#xff0c;我们会再回过头去了解 ACodec#xff0c;将 MediaCodec - ACodec - OpenMax 连接起来#xff0c;了解组件的创建控制以及 buffer 的流转。 本篇属于个人学习笔记#xff0c;如有错误欢迎指出… 这一节我们将了解Android OpenMax框架该框架了解完成之后我们会再回过头去了解 ACodec将 MediaCodec - ACodec - OpenMax 连接起来了解组件的创建控制以及 buffer 的流转。 本篇属于个人学习笔记如有错误欢迎指出。 我将Android OpenMax框架分为3个部分来学习 media.codec servicevendor下的HIDL服务用于查询平台编解码能力创建/管理编解码组件OpenMax ILOpenMax 框架标准接口底层编解码组件须实现这些接口OMXNodeInstanceOpenMax AL 完成 OpenMax IL层的封装与调用提供给上层 ACodec 调用 这一节我们先来了解下相关的代码路径 hardware/interfaces/media/omx/1.0 目录下定义有 media.codec 提供的 HIDL service 接口我们接触比较多的是IOmx.halIOmxStore.halIOmxStore.hal以及IOmxNode.halframeworks/av/services/mediacodec目录下是 media.codec service 实现文件编译后会生成 android.hardware.media.omx1.0-service位于板子 /vendor/bin/hw 目录下frameworks/av/media/libstagefright/omx目录下放有 media.codec service 的 Bn 端实现以及一些工具OMXUtils.cppframeworks/native/headers/media_plugin/media/openmax目录下放有 OpenMax 的标准接口底层 Omx Component 需要实现这些标准接口上层 ACodec 也需要按照标准接口来调用frameworks/av/media/libmedia/omx frameworks/av/media/libmedia/omx/1.0 以上两个目录下放有对 HIDL 调用的封装封装有两种类型一种是 LW Legacy Wrapper开头的类另一种是 TWTreble Wrapper开头的。 接下来我们来看这些文件是如何使用的 media.codec 作为一个 HIDL service 首先要有接口定义我们查看 hardware/interfaces/media/omx/1.0 目录可以发现 OpenMax 相关的类定义都是以大写的 I 开头后面接上 Omx这里的 O 是大写 mx 是小写。 接着看 frameworks/av/media/libstagefright/omx/1 目录路径下看到有 Omx.cpp 和 OmxStore.cpp这两个就是 media.codec 的 native 实现但是我们似乎没看到 IOmxNode 不要着急我们先接着往下看。 实现了服务相关的文件那么就要开启进程启动服务了相关的代码在 frameworks/av/services/mediacodec 下阅读 main_codecservice.cpp 的代码我们很容易就看出这个进程提供两个服务 IOmx 和 IOmxStore具体的代码这里不再展开所以上面提到的 IOmxNode 并不是一个服务而是服务提供的内容接下来的问题就是内容实现在哪里呢 服务启动后我们要获取并调用服务这里就要看 ACodec 的代码了 spCodecObserver observer new CodecObserver(notify);spIOMX omx;spIOMXNode omxNode;status_t err NAME_NOT_FOUND;OMXClient client;if (client.connect(owner.c_str()) ! OK) {return false;}omx client.interface();int prevPriority androidGetThreadPriority(tid);err omx-allocateNode(componentName.c_str(), observer, omxNode);这里看到 ACodec 并没有获取 IOmx 服务而是使用 OMXClient 封装了服务获取过程接着再调用其 interface 接口返回获取的服务代理不过这里有点要注意返回代理的类型是 IOMX三个字母都是大写并不是之前提到的 IOmx里面发生了什么 status_t OMXClient::connect(const char* name) {using namespace ::android::hardware::media::omx::V1_0;if (name nullptr) {name default;}spIOmx tOmx IOmx::getService(name);if (tOmx.get() nullptr) {ALOGE(Cannot obtain IOmx service.);return NO_INIT;}if (!tOmx-isRemote()) {ALOGE(IOmx service running in passthrough mode.);return NO_INIT;}mOMX new utils::LWOmx(tOmx);ALOGI(IOmx service obtained);return OK; }从 OMXClient::connect 我们可以看到内部获取的服务代理类型仍为 IOmx但是又对该代理做了一层封装。IOmx 是一个 Treble 类型的对象LWOmx 是一个 Legacy 类型的对象。 我们都知道调用 Treble 对象方法时会比较麻烦要回传函数调用返回值时需要构造一个Lambda函数Legacy 对象的使用是符合我们常规使用习惯的对象。所以将 IOmx 封装成为 LWOmx 是为了封装 HIDL 调用简化使用。 WOmx.h 位于 frameworks/av/media/libmedia/include/media/omx/1.0可以看到它是继承于 IOMX的再看 IOMX.h 可以发现其方法名和 IOmx 提供的服务是一致的那这里就验证了我们的猜想:IOMX 是对 IOmx 代理调用的封装。 与之类似的调用 IOmx 服务获取 IOmxNode 对象后也要将其封装成为 LW 类型以便后续的使用 status_t LWOmx::allocateNode(char const* name,spIOMXObserver const observer,spIOMXNode* omxNode) {status_t fnStatus;status_t transStatus toStatusT(mBase-allocateNode(name, new TWOmxObserver(observer),[fnStatus, omxNode](Status status, spIOmxNode const node) {fnStatus toStatusT(status);*omxNode new LWOmxNode(node);}));return transStatus NO_ERROR ? fnStatus : transStatus; }上面都是讲 mediaserver 进程使用 media.codec 进程的服务代理那有没有反过来调用的情况当然是有的。 还是看 LWOmx::allocateNode我们会传入一个 CodecObserver 对象用于接收Omx Callback但是CodecObserver 是继承于 BnOMXObserver 的这里会有个问题CodecObserver 将无法通过 HIDL 调用传递给 media.codec 进程所以调用之前 LWOmx::allocateNode 将 CodecObserver 封装到了 TWOmxObserver 以便该对象可以通过 HIDL 传输。 struct TWOmxObserver : public IOmxObserver {spIOMXObserver mBase;TWOmxObserver(spIOMXObserver const base);Returnvoid onMessages(const hidl_vecMessage tMessages) override; };TWOmxObserver 继承于IOmxObserver 接口因此可以在 HIDL 中进行传输这也是 TW Treble Wrapper的作用。 再看 frameworks/av/media/libmedia/include/media/omx/1.0/WOmxObserver.h 里面还有个 LWOmxObserver 它的作用上面我们已经讲过了是将 mediaserver 进程传过来的 TWOmxObserver 对象进行封装达到简化 HIDL 调用的目的。 这一节我们对 Android OpenMax 相关的文件以及类做了简单介绍了解这些之后我们再追代码就可以忽略掉一些中间层后期如果相关的写作疑问也可以参考这里。

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

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

相关文章

上传视频网站开发企业网站管理系统用哪个好

背景:近年来,随着自动化技术的不断进步,Modbus与Profinet之间的转换成为了许多工厂和企业普遍关注的问题。 Modbus转Profinet网关作为两个不同协议设备连接的桥梁,安华变频器作为一种电气设备,能够改变电源的频率和电…

深圳商城手机网站建设wordpress for sae 插件

本篇讲的内容主要是基于Spring v2.5的注解来完成bean的定义 之前都是使用纯配置的方式来定义的bean 文章目录 前言1. Spring v2.5 注解开发定义bean第一步:在需要定义的类上写上注解Component第二步:在Spring Config中定义扫描包第三步:主方法…

交互效果很好的网站目前推广软件

Python PEP 8 代码风格指南 0. 引言1. 空白字符2. 命名3. 表达式和语句4. 导入5. Pylint工具6. 要点总结 0. 引言 Python增强提案#8,也称作 PEP 8,是关于如何格式化Python代码的风格指南。 你可以按自己的方式编写Python代码,只要符合有效的语法规则。 然而,使用一致的风格可…

wordpress网站添加备案号微商店铺怎么开通

几个主流的数据库有: 1. MySQL:MySQL是一种关系型数据库管理系统,常用于Web应用程序开发和数据存储。 2. Oracle:Oracle是一种关系型数据库管理系统,由Oracle Corporation开发和销售。它广泛用于企业级应用程序中。 …

如何给网站添加cnzz站长统计功能代码的常用办法长沙做网站企业

开源软件技术社区是一个由开发者、贡献者、用户和维护者组成的共享平台,主要目的是打造技术、软件产品良性互动、开源技术安全可控的软件生态环境,实现可复用应用或服务的快速部署与使用、完成资源与能力的高度共享、促进社区成员的共建共赢,…

策划案网站构成怎么写广州市官网网站建设公司

1、问题 //如果参数字符串是个回文,函数就返回真,否则返回假。回文就是指一个字符串从左向右和从右向左读是一样的。函数应该忽略所有的非字母字符,而且在进行字符比较时不用区分大小写。 2、代码实现 #include <stdio.h> #include <ctype.h>//如果参数字符串是…

湖南网站建设 地址磐石网络哈尔滨网站设计公司哪家更好

【本节目标】 树概念及结构。二叉树概念及结构。二叉树常见OJ题练习。 1、树概念及结构 1.1、树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树&#xf…

西安模板网站服务商更换模板对网站seo的影响

先说一下自己的情况&#xff0c;本科生&#xff0c;22年通过校招进入南京某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

建立网站需要备案吗上海网站建设公司招聘

背景 分析Fabric网络的启动日志可以帮我们理解搭建区块链网络的过程。本文对输出日志进行详细的分析。 启动网络与创建通道 # verbose 可以输出更详细的日志。 ./network.sh up createChannel -verbose# 使用本机安装的docker and docker-compose Using docker and docker-c…

asp连接数据库做登录网站完整下载免费发布信息的网站平台

在使用Linq的时候经常出现在了这样的一个错误 Row not found or changed. 找不到行或行已更改 解决方案。 首要的解决方案是&#xff0c;检查数据库字段定义&#xff0c;是否有不一致的地方&#xff0c;尤其是 该字段是否可空 Nullable 第一个简单的方案就是 打开dbml (linq)文…

大学生网站建设例题答案寻找锦州网站建设

一、SpringBoot启动配置原理简述 本内容直接查看分析SpringBoot启动配置原理&#xff0c;传送门&#xff1a; 二、SpringBoot启动过程干预 Spring Boot启动过程中我们可以实现以下干预工作&#xff1a; 修改Spring Boot默认的配置属性。使用ConfigurationProperties和Enable…

重庆手机版建站系统哪家好1688会提供网站建设

Logo设计在设计的过程中要考虑很多问题&#xff0c;但是如果时间周期比较短&#xff0c;又要求快速出方案的时候&#xff0c;可以走一些捷径。 在设计logo之前要去了解公司的主营业务、公司规模、公司的名字、公司的主要产品针对的用户群体、甲方的个人偏好、公司原有VIS...这些…

怎么在网站标题做logo360网址导航主页

js 使用多态替换条件语句用多态替换条件语句是一种众所周知的重构模式。 如果您不熟悉该模式&#xff0c;可以在此处查看 。 但是&#xff0c;一旦类中有多个条件检查所基于的字段&#xff0c;该基本解决方案便会开始崩溃。 我们将研究一些有关如何使用这些可能性的想法。 有很…

厦门优秀的网站设计做业务查牙医诊所一般用什么网站

企业信息化规划如何落地&#xff1f; 规划做好了&#xff0c;蓝图也画好了&#xff0c;人手一块大饼也已经揣好了&#xff0c;那么该怎么落地呢&#xff0c;这才是最关键的。 我将企业信息化规划落地分为4个周期&#xff0c;以最典型的制造行业为例&#xff0c;以简道云这个企…

广元园区建设投资有限公司网站邵阳网站制作建设

下载 https://github.com/AntSwordProject/antSword 一句话木马 hack.php脚本 <?php eval($_POST[attack]);?> 安装 1、安装完成后启动 2、初始化&#xff0c;选择有源码的目录 3、连接

域名查询站长工具淘宝主图制作

词法分析程序的功能其实就是对所输入的字段进行词法分析任务&#xff0c;对用户的源程序从左到右进行扫描&#xff0c;按照语言的词法规则识别各类单词&#xff0c;并产生相应单词的属性字&#xff0c;并随之显现出来&#xff0c;成为词法分析程序的功能 转载于:https://www.cn…

dede分类信息网站东莞网站优化是什么

Java中如何解决ClassNotFoundException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;ClassNotFoundException异常…

电子商务与网站建设结业论文百度在线咨询

俗话说&#xff0c;“酒香不怕巷子深”;俗话又说&#xff0c;“酒香也怕巷子深” 。再后来&#xff0c;俗话还说&#xff0c;管他酒香不香巷子深不深&#xff0c;只要找个算盘技巧神乎其神的账房先生&#xff0c;即数据科学家&#xff0c;酒就可以大卖了。这叫做用数据驱动用户…

石家庄那有建网站wordpress文章更新插件

目录 实验拓扑&#xff1a; 实验要求&#xff1a; 实验思路&#xff1a; 实验步骤&#xff1a; 1.配置设备接口IP 2.通过配置缺省路由让公网互通 3.配置ppp 1.R1和R5间的ppp的PAP认证&#xff1b; 2.R2与R5之间的ppp的CHAP认证; 3. R3与R5之间的HDLC封装; 4.构建R1、…

仁怀网站建设滁州做网站

概述&#xff1a; 这个仓库旨在通过一个单一的命令&#xff0c;有效地将新鲜且定制化的知识注入到大型语言模型中&#xff0c;以辅助开发人员的工作。 支持的模型&#xff1a;○ GPT-J (6B)○ LLaMA (7B/13B)○ BLOOM (7.1B)○ Falcon (7B)○ Baichuan (7B/13B)○ InternLM (7…