Android多媒体:OMX

Android MultiMedia框架——OMX服务启动 基于Android9.0 源码分析 hw/android.hardware.media.omx@1.0-service和audioserver进程类似,也是通过init进程加载rc文件的方式,启动service rc配置文件:frameworks/av/services/mediacodec/android.hardware.media.omx@1.0-service.rc service vendor.media.omx /vendor/bin/hw/android.hardware.media.omx@ 阅读详情


OMXCodec是一个codec框架,实现者可以在这个框架中实现各种解码方式,包括硬件解码。OMXMaster 负责OMX中编解码器插件管理,软件解码和硬件解码都是使用OMX标准,挂载plugins的方式来进行管理。软解通过 addPlugin(new SoftOMXPlugin);会把这些编解码器的名字都放在mPluginByComponentName中。硬件编解码是通过 addVendorPlugin();加载libstagefrighthw.so.各个芯片平台可以遵循openmax 标准,生成libstagefrighthw.so的库来提供android应用。

OMXMaster::OMXMaster()

    :mVendorLibHandle(NULL) {

   addVendorPlugin();

    addPlugin(newSoftOMXPlugin);

}

在allocateNode的时候,SoftOMXPlugin调用makeComponentInstance,遍历所有的libstagefright_soft_*.so库,创建软件component,并将component和plugin一起存入mPluginByInstance。

OMX解码的方式很像流水线,由两个线程(工人)负责操作,一个decoder/encoder线程,一个dispatcher线程。对buffer的操作如下:OMXCodec使用draininputbuffer试图解码,调用IOMX的emptyBuffer,然后调到OMX的emptyBuffer,然后OMX找到node,调用OMX_EmptyThisBuffer,然后发消息KwhatEmptyThisBuffer给SoftComponent,此时进入编解码线程。component收到该命令后会读取inputport buffer中的数据,调用onQueueFilled,将其组装成帧进行解码,读取buffer中的数据完成后会调用EmptyBufferDone通知OMXNodeInstance,然后调用OMXNodeInstance中注册好的回调onEmptyBufferDone,然后调到OMX里的OnEmptyBufferDone。OMX发消息EMPTY_BUFFER_DONE给对应的Dispather线程。在Dispather的on_message中,调用drainInputBuffer。compoment使用EmptyBufferDone通知OMXCodec已完成inputportbuffer的读取,OMXCodec收到该命令后会通过mVideoTrack读取新的视频buffer到input port的buffer中,并调用OMX_EmptyThisBuffer通知component。OMXCodec使用OMX_FillThisBuffer传递空的bffer给component用于存储解码后的帧,component收到该命令后将解码好的帧数据复制到该buffer上,然后调用FillBufferDone通知OMXCodec,compoment使用FillBufferDone通知OMXCodec已完成outputportbuffer的填充OMXCodec收到该命令后将解码好的帧传递给mISurface进行图像绘制,绘制完毕后使用OMX_FillThisBuffer通知component有空的buffer可填充。OnEmptyBufferDone由Decoder线程执行,而EMPTY_BUFFER_DONE由Dispather线程执行,二者通过message进行通信。


一个StageFrightPlayer对应一个AwesomePlayer,若媒体源既有视频又有音频,则会创建两个OMXCodec实例,若只有视频会音频一样,则只创建一个OMXCodec实例。

播放音频的是AudioPlayer,在initAudioDecoder里,调用OMXCodec::Create拿到mAudioSource,在需要软件解码情况下是mOmxSource,在offload模式下(无需软件解码)直接用mAudioTrack。Audio和Video都有一个TimedEventQueue,start的时候都create了一个thread,入口函数是threadEntry,这是个典型的事件驱动模型,对于一些耗时的操作,一个线程产生事件,通知另一个线程去处理事件,以保证第一个线程响应的及时性。TimedEventQueue就是一个新线程,

AwesomeEvent实现了Event里的抽象方法fire,即(mPlayer->*mMethod)()。AwesomePlayer在prepareAsync_l时,就是create了一个AwesomeEvent,并放入mQueue。然后在TimedEventQueue里去异步的执行。

在play_l中,若mAudioSource存在,则创建createAudioPlayer_l,并且mAudioPlayer->setSource(mAudioSource);然后startAudioPlayer_l。

AT的callback函数MediaPlayerService::AudioOutput::CallbackWrapper会调到AudioPlayer里的AudioSinkCallback,然后在fillBuffer里调用到了mSource->read(&mInputBuffer,&options);最终到了OMXCodec里的read,或者是mAudioTrack里的read。在调用OMXCodec中read的情况下,可以看出mInputBuffer其实是个输出参数,然后把Codec里的输出Buffer赋值给mInputBuffer。而这些Buffer都是在allocateBuffersOnPort里申请的。在InitOMXParams和initPort进行参数设置,一般都会分配4个InputBuffer,4个OutputBuffer。最后memcpyoutputBuffer里的数据到AT和AF的ShareBuffer。在调用mAudioTrack的read的情况下,mInputBuffer同样也是个输出参数,直接获取MediaBufferGroup里的MediaBuffer,最后也是memcpy到AT和AF的ShareBuffer。


需要软解码的Buffer数据交换



无需软解码的Buffer数据交换



OMX标准接口OMX_FillThisBuffer机制详解 OMX标准接口OMX_FillThisBuffer机制详解。 阅读详情

相关推荐

Android多媒体——OMX基础介绍(二十八)

在移动设备的多媒体处理领域,硬件加速一直是提升性能、降低功耗的关键技术。然而,不同芯片厂商提供的硬件编解码接口各异,导致上层应用难以实现跨平台兼容。Khronos Group 制定的 OpenMAX 标准应运而生,为多媒体处理提供了统一的抽象层。本文将深入解析 OpenMAX 标准,特别是其在 Android 系统中的具体实现——OMX架构。

小旭的专栏 869

OMX服务启动及加载

OMX服务的启动

achina2011jy的博客 3319

Android多媒体——OMX服务启动(二十九)

OMX 服务是一个 Hal 层服务,上一篇文章介绍了 OMX 服务连接流程,这一篇我们主要来看一下 OMX 服务的启动流程。

小旭的专栏 1226

OpenMAX介绍(总括)

一、OpenMax简介     OpenMAX是一个多媒体应用程序的标准。由NVIDIA公司和Khronos™在2006年推出。     它是无授权费的、跨平台的C语言程序接口序列,这些接口对音频、视频、静态图片的常用操作进行封装。     它包括三层,分别是应用层(AI)、集成层(IL)和开发层(DL)。其中IL层已经成为了事实上的多媒体框架标准。嵌入式处理器或者多媒体编解码模块的硬件生产

qq69696698的专栏 1万+

Android多媒体——ACodec加载OMX(三十)

ACodec 作为 Android 多媒体框架中的关键组件,采用了精心设计的状态机模式来管理编解码器的生命周期和数据处理流程。主要负责与底层 OMX (OpenMAX) 编解码器交互,实现音视频数据的编解码处理。

小旭的专栏 1059

android omx介绍

详细介绍了omx的创建及使用的过程.流程使用时序图表示,参照这个流程看下来可以对openmax dl core层以上的部分有较详细的了解.

OMX入门介绍

1、OMX简介 2、OMX IL中的关键概念 3、OMX的封装接口 4、OMX的状态 5、OMX的内部架构 OMX简介 OMX是Khronos Group提出的一个标准,不同厂商与开发者可以通过该标准创造的标准接口提供自身对于音视频的加速能力。OMX API提供了音频、视频、静态图片的一些常用处理操作的接口。它的目标是降低将多媒体软件移植到新的处理器和体系结构的成本和复杂性。 OMX分为三层:应用层(AL)、整合层(IL)和开发层(DL)。安卓平台的推广使得整合层(IL)得到了广泛应用。 应用

FairyJoyXie的博客 1565

告别龟速!实测Copernicus Dataspace下载Sentinel-2数据的3个提速技巧(附Workspace批量操作)

本文分享了在Copernicus Dataspace平台高效下载Sentinel-2遥感数据的3个实用技巧,包括网络传输层优化、浏览器与API调优以及Workspace批量操作。通过这些方法,用户可将下载速度提升300%以上,特别适合科研人员和团队处理大规模数据需求。

weixin_30706691的博客 178

Android OMX详解

OMX是Android解码器组件,懂得OMX就明白MediaPlayer的生命周期,对理解整个MultiMedia的工作机制有关键性作用。 下面会结合MediaPlayer的生命周期来介绍OMX。 OMX库调用过程 OMX库加载过程 OMX参数设置过程 setParameter在Component初始化的时候,需要执行6次,每次设置的阶段和目的如下: 整体如下:...

8625

保姆级教程:在SIwave 2024 R2中搞定TDR仿真,手把手教你分析USB 3.0差分线阻抗

本文提供了一份详细的SIwave 2024 R2 TDR仿真教程,重点讲解如何分析USB 3.0差分线阻抗。从项目准备、参数配置到结果分析,逐步指导工程师完成完整的仿真流程,并分享实战经验和高级技巧,帮助提升信号完整性分析能力。

weixin_33670786的博客 497

ESD镜像解密与转换全攻略:从esd-decrypter到WinNTSetup的完整流程

本文详细解析了ESD镜像的加密特性与压缩优势,并提供了从解密到转换的完整实战指南。核心步骤包括使用esd-decrypter工具解密ESD文件为WIM格式,以及如何结合WinNTSetup进行灵活的系统安装或进一步封装为可引导的ISO镜像,帮助用户高效处理官方Windows安装镜像。

weixin_29207439的博客 451

android 2.2 多媒体库OpenCore之PVPlayer构造过程

<br />         PVPlayer(即Packet Video Player)是OpenCore经过android包装后,提供给android多媒体播放的类。PVPlayer类文实现在OpenCore目录下的android/playerdriver.cpp文件中。在PVPlayer构造函数中实例化一个PlayerDriver类,生成一个播放器主线程,线程入口是PlayerDriver::startPlayerThread()函数,该函数通过调用PlayerDriver::playerThread

程华春的专栏 1527

泰山派RK3576开发板部署Qwen3-VL-4B多模态模型实战指南:从模型转换到板端推理全流程

本文提供了在泰山派RK3576开发板上部署阿里Qwen3-VL-4B多模态模型的完整实战指南。详细介绍了从环境准备、模型转换(包括视觉模型转换为.rknn格式和语言模型转换为.rkllm格式)、交叉编译到板端推理的全流程,重点讲解了如何利用RK3576的NPU进行硬件加速,实现高效的边缘AI应用。

weixin_30356433的博客 257

【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 5】【02】

承接上一章节分析:【六】Android MediaPlayer整体架构源码分析 -【start请求播放处理流程】【Part 5】【01】 本系列文章分析的安卓源码版本:【Android 10.0 版本】 【此章节小节编号就接着上一章节排列】 1、setComponentRole(encoder /* isEncoder */, mime)实现分析: 设置组件角色信息 // [frameworks/av/media/libstagefright/ACodec.cpp] status_t ACodec::set

CloverLHao的博客 1614

uniapp [微信小程序] - 详解微信小程序端接入mqtt全流程及示例源码教程,uniApp微信小程序端如何接入MQTT插件并实现连接/断开+发布订阅+消息队列+离线重连等各种示例代码(开箱即用)

uniapp微信小程序接入MQTT,uniapp中使用mqtt,uniapp 微信小程序端接入mqtt示例代码教程,适用于微信小程序的MQTT插件,uniapp开发微信小程序连接mqtt,uniApp微信小程序接入MQTT协议,uniapp vue3微信小程序使用MQTT的小例子接入流程,使用uniapp开发小程序接入mqtt,如何在uniapp项目中使用mqtt,uniapp mqtt的使用示例,mqtt连接报错,如何在项目里集成mqtt,Mqtt协议,主动连接mqtt,订阅消息,实现发布,订阅和接收消息

🏆 前端领域优质创作者 2882

把 SAP Workflow 的 Task 搞懂:从 TS 到 WS 的建模、触发与排错全景

摘要:SAP Business Workflow中的Task是工作流设计的核心单元,分为single-step(独立执行)和multistep(流程编排)两种类型。Task设计直接影响流程的可复用性、扩展性和可排错性。系统将Task分为5类(TS/T/WS/WF/TG),运行时通过事件触发、Linkage匹配、Work Item执行的链路完成流程驱动。关键事务码包括PFTC_INS(创建Task)、SWE2(事件配置)等。正确设计Task边界并遵循"先业务提交后事件触发"原则,是构建稳定

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 273

Android Codec 集成和 video Overlay

Android Codec 集成和 video Overlay       Codec集成和video overlay是现在FSL对android多媒体修改的所有东西,codec library以.so的形式放在prebuilt目录下,没有源文件。而video overlay的实现主要是使用了FSL的ipu底层库,将视频数据直接发送到硬件,由硬件进行merge。 A、Codec

zongguo的专栏 663

芯片设计|SoC芯片设计流程 与 软硬件协同设计

SoC通常被称作系统级芯片或者片上系统,作为一个完整的系统,**其包含了硬件和软件两部分内容**。这里所说的硬件指SoC芯片部分,**软件是指运行在SoC芯片上的系统及应用程序**。既然它是由软件和硬件组合而成,则在进行系统设计时,**就必须同时从软件和硬件的角度去考虑。**

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1824

MediaCodec_Analyze-1-create

MediaCodec_Analyze-1-create

Bingin的博客 617

微信小程序 - 实现大文件上传分片/切片+本地选择文件上传超大文件,小程序大文件切片上传+断点续传+上传进度条+失败自动重传完整运行示例源码,支持图片、视频、文档各种文件(支持上传单个文件或批量上传)

微信小程序实现大文件上传,实现分片大文件上传,微信小程序 分片 断点续传 大文件上传,微信小程序实现大文件上传 分片上传 进度条,小程序文件分片上传,微信小程序如何上传很大的文件,在选择文件后,按指定大小将文件切割成独立的文件片,并逐片上传,uniapp 微信小程序上传大文件如何切片,微信小程序实现大文件分片上传、断点续传、秒传,解决大文件上传问题,大文件上传如何做断点续传,微信小程序wx.uploadFile,小程序上传视频,小程序上传文档,实现大文件上传(切片上传)实现大文件上传到服务器教程,支持批量多

🏆 前端领域优质创作者 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【学习】从零开始的Android音视频开发(10)——OMX:Codec部分中AwesomePlayer到OMX服务

学习于《Android音视频开发》,本文讲解了OMX的初始化流程,OMX中NodeInstance列表的管理以及其节点的操作,最后概括了AwesomePlayer到OMX的服务过程

PanicLin的博客 2934

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Nuplayer源代码分析2

先说一下我了解的openmax,omx的数据流动是port方式,内存分配和释放都在port上面进行。在android上面omx作为一个binder,是和mediaserver在同一个process。就是了解这么一点点,有深入了再写        接着说nuplayer,nuplayer的render方式为什么会换成现在这种方式,说一下我的理解,因为代码还没看完,只是感觉是这样的,有错误后面再修复

ph game studio 4283

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

mediaplayer创建(二)

android mediaplayer 解封装与解码之间数据扭转

木希博客 695

Android OMX介绍(总括)

一、OpenMax简介(缩写为:OMX) OpenMAX是一个多媒体应用程序的标准。由NVIDIA公司和Khronos™在2006年推出。 它是无授权费的、跨平台的C语言程序接口序列,这些接口对音频、视频、静态图片的常用操作进行封装。 它包括三层,分别是应用层(AI)、集成层(IL)和开发层(DL)。其中IL层已经成为了事实上的多媒体框架标准。嵌入式处理器或者多媒体编...

haigand的专栏 1万+

Android多媒体框架(二)Codec初始化及Omx组件创建

Android提供给应用编解码的接口为MediaCodec。我们这里从NuPlayerDecoder开始分析,一是为了衔接之前将的MediaPlayer-NuPlayer流程,二是可以从中参考到MediaCodec是怎么用的,然后去分析内部流程会更好。

junluoyu000的博客 6069

[Android Video Framework]ACodec加载OMX

OpenMAX确立了一套标准的接口,上层App直接调用这些接口,底层硬件厂商直接实现这些接口, 从而实现了上层软件开发与底层芯片开发地彻底分离,加速了跨平台的多媒体组件的开发、整合和编程。 Android上的MediaCodec是通过ACodec来加载openmax层,了解OMX加载过程,有助于我们更好的分析问题和解决问题 加载过程还需从ACodec::UninitializedState::on...

少侠的专栏 3248
上一篇: Android HAL层hardware module的设计
下一篇: Linux驱动基础总结
我把葡萄酿成酒
博客等级 码龄12年 275粉丝 198原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值