Android OpenMAX

一、OpenMAX介绍

OpenMAX™是一个免版税的跨平台API标准,通过支持跨多个操作系统和芯片平台开发、集成和编程加速多媒体组件,提供了全面的流媒体编解码器和应用程序可移植性。OpenMAX API将与处理器一起发布,使库和编解码器的用户能够快速有效地充分利用新处理器的加速潜力——而不管底层硬件架构如何。

随着多媒体硬件平台的发展步伐逐渐加快,消费者对应用程序,如智能手机、音频和视频媒体播放器和游戏控制台等平台上的视频、音频、语音和3D的需求不断增长。一般来说,这类产品需要高性能处理和高数据吞吐量能力。因此,出现了各种解决方案,每一种都旨在加速多媒体应用程序。例子包括:

具有特定多媒体扩展的通用处理器

底层硬件加速器

包括dsp在内的多处理器架构

专用硬件视频解码器

所有这些架构变体的关键挑战之一是开发有效的代码。尽管通常提供了编译器,但是很少能够从高级编程语言中充分利用整个体系结构的潜力。结果是,应用程序的大部分通常是用专门针对硬件平台的汇编语言编写的。不同多媒体硬件解决方案的普及意味着软件必须针对移植到的每个新平台重新编写和优化。

这种执行效率低下的影响是延迟新产品的推出,增加开发成本和降低产品质量,这最终会减缓在市场需求增长的时候在多媒体领域的创新。

为了解决这个问题,Khronos小组成立了OpenMAX工作组,为多媒体应用程序定义一套标准的开放应用程序编程接口(api)。这个开放标准的目标是降低将多媒体软件移植到新处理器和架构的成本和复杂性。

通过为中间件应用程序(如多媒体编解码器、图形库和视频、图像、音频、语音和语音的其他功能)商定一个通用的规范,开发人员社区将有可能专注于区分他们的产品,而不是重复实现通用功能。这将确保新产品能够更快地推向市场,并支持更广泛的硬件平台。

OpenMAX层级

OpenMAX AL(应用层)

OpenMAX AL提供了应用程序和多媒体中间件之间的标准化接口,其中多媒体中间件提供了执行预期API功能所需的服务。OpenMAX AL提供了与多媒体接口相关的应用程序可移植性。

OpenMAX IL(集成层)

OpenMAX IL作为嵌入式和/或移动设备中使用的音频、视频和图像编解码器的低级接口。它使应用程序和媒体框架能够以统一的方式与多媒体编解码器和支持组件(即源和汇)接口。编解码器本身可以是任何硬件或软件的组合,并且对用户完全透明。如果没有这种性质的标准化接口,编解码器供应商必须编写专有或封闭的接口来集成到移动设备中。IL的主要目标是使用专门的功能库,为编解码器提供一定程度的系统抽象,以解决许多截然不同的媒体系统之间的可移植性问题。

OMX集成层由Client、Core、Component和Port组成,Client通过Core得到对应Component的Handle,而后通过命令直接和Component进行交互。每个Component至少有一个Port进行数据交互,如Decoder有一个输入Port接收码流,一个输出Port输出YUV序列。Component内部可能通过消息处理机制完成Client要求的任务。

OpenMAX DL(开发层)

OpenMAX DL定义了一个API,该API包含了一组全面的音频、视频和图像功能,处理器厂商可以在新的处理器上实现和优化这些功能,然后编解码器厂商可以使用这些功能来编写各种编解码器功能。它包括音频信号处理功能(如fft和滤波器)、图像处理原语(如颜色空间转换)和视频处理原语(如MPEG-4、H.264、MP3、AAC和JPEG)等编解码器的优化实现。OpenMAX通过iDL(使用OpenMAX IL结构)和aDL(向OpenMAX DL API添加异步接口)支持加速并发。

二、OpenMAX相关类

IOMX

IOMX是Android中的一个接口,用于管理OpenMAX IL组件。它提供了一种标准的方法来控制和配置OpenMAX IL组件,以及在组件之间传输数据。IOMX接口的实现可以在硬件抽象层(HAL)中找到,它允许应用程序通过使用OpenMAX IL组件来访问硬件加速的音频和视频编解码器。

IOMXNode是一个接口类,用于在OMX组件之间传递命令和数据。OMXNodeInstance是一个实现了BnOMXNode接口的类,它提供了OMXNodeInstance的构造函数,该函数用于创建OMX节点实例。BnOMXNode是IOMXNode接口的默认实现,它提供了IOMXNode接口的所有方法的默认实现。因此,OMXNodeInstance类继承了BnOMXNode类,从而实现了IOMXNode接口。

IOMXObserver是一个接口类,用于向客户端报告有关OMX组件的事件和状态。它允许客户端注册以接收有关OMX组件的事件和状态的通知。例如,当OMX组件完成配置或缓冲区处理时,客户端可以通过IOMXObserver接收通知。

IOMX代码位于:

frameworks/av/media/libmedia/IOMX.cpp

frameworks/av/media/libmedia/include/media/IOMX.h

IOMX的定义:

class IOMX : public RefBase {}
class IOMXNode : public IInterface {}
class IOMXObserver : public IInterface {}
class BnOMXNode : public BnInterface<IOMXNode> {}
class BnOMXObserver : public BnInterface<IOMXObserver> {}
struct omx_message {}

接口函数:

virtual status_t freeNode() 
virtual status_t sendCommand(OMX_COMMANDTYPE cmd, OMX_S32 param) 
virtual status_t getParameter(OMX_INDEXTYPE index, void *params, size_t size) 
virtual status_t setParameter(OMX_INDEXTYPE index, const void *params, size_t size) 
virtual status_t getConfig(OMX_INDEXTYPE index, void *params, size_t size) 
virtual status_t setConfig(OMX_INDEXTYPE index, const void *params, size_t size)
virtual status_t setPortMode(OMX_U32 port_index, IOMX::PortMode mode)
virtual status_t getGraphicBufferUsage(OMX_U32 port_index, OMX_U32* usage)
virtual status_t useBuffer(OMX_U32 port_index, const OMXBuffer &omxBuf, buffer_id *buffer)
virtual status_t setInputSurface(const sp<IOMXBufferSource> &bufferSource)
virtual status_t prepareForAdaptivePlayback(OMX_U32 port_index, OMX_BOOL enable, OMX_U32 max_width, OMX_U32 max_height) 
virtual status_t configureVideoTunnelMode(OMX_U32 portIndex, OMX_BOOL tunneled, OMX_U32 audioHwSync, native_handle_t **sidebandHandle )
virtual status_t allocateSecureBuffer(OMX_U32 port_index, size_t size, buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle) 
virtual status_t freeBuffer(OMX_U32 port_index, buffer_id buffer)
virtual status_t fillBuffer(buffer_id buffer, const OMXBuffer &omxBuf, int fenceFd) 
virtual status_t emptyBuffer(buffer_id buffer, const OMXBuffer &omxBuf, OMX_U32 flags, OMX_TICKS timestamp, int fenceFd)
virtual status_t getExtensionIndex(const char *parameter_name, OMX_INDEXTYPE *index)
virtual status_t dispatchMessage(const omx_message &msg)

OMXClient

OMXClient是一个用于与OMX服务进行通信的客户端类。它通过Binder机制与OMX服务进行通信,以便在Android系统中使用OpenMAX IL API进行音视频编解码操作。在AwesomePlayer的构造函数中,会创建一个OMXClient对象,并通过该对象与OMX服务进行通信,以便在播放媒体时使用OpenMAX IL API进行解码操作。

OMXClient代码位于:

frameworks/av/media/libstagefright/OMXClient.cpp

frameworks/av/media/libstagefright/include/media/stagefright/OMXClient.h

OMXClient的定义:

class OMXClient {}

接口函数:

status_t connect()
status_t connect(const char* name)
void disconnect()

Omx

Omx代码位于:

frameworks/av/media/libstagefright/omx/1.0/Omx.cpp

frameworks/av/media/libstagefright/omx/include/media/stagefright/Omx.h

Omx的定义:

struct Omx : public IOmx, public hidl_death_recipient {}

OMXStore

OMXStore代码位于:

frameworks/av/media/libstagefright/omx/OMXStore.cpp

frameworks/av/media/libstagefright/include/media/stagefright/omx/OMXStore.h

OMXStore的定义:

struct OMXStore : public OMXPluginBase {}

OMXNodeInstance

OMXNodeInstance代码位于:

frameworks/av/media/libstagefright/omx/OMXNodeInstance.cpp

frameworks/av/media/libstagefright/omx/include/media/stagefright/OMXNodeInstance.h

OMXNodeInstance的定义:

struct OMXNodeInstance : public BnOMXNode {}

OMXBuffer

OMXBuffer代码位于:

frameworks/av/media/libstagefright/OMXBuffer.cpp

frameworks/av/media/libstagefright/include/media/stagefright/OMXBuffer.h

OMXBuffer的定义:

class OMXBuffer {}
  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值