OpenMAX是一个多媒体应用程序的标准。由NVIDIA公司和Khronos™在2006年推出。
它是无授权费的、跨平台的C语言程序接口序列,这些接口对音频、视频、静态图片的常用操作进行封装。
它包括三层,分别是应用层(AI)、集成层(IL)和开发层(DL)。其中IL层已经成为了事实上的多媒体框架标准。嵌入式处理器或者多媒体编解码模块的硬件生产者,通常提供标准的OpenMax IL层的软件接口,这样软件的开发者就可以基于这个层次的标准化接口进行多媒体程序的开发。
在Android中,OpenMax IL层,通常可以用于多媒体引擎的插件,Android的多媒体引擎OpenCore和StageFright都可以使用OpenMax作为插件,主要用于编解码(Codec)处理。在Android的框架层,也定义了由Android封装的OpenMax接口,和标准的接口概念基本相同,但是使用C++类型的接口,并且使用了Android的Binder IPC机制。Android封装OpenMax的接口被StageFright使用,OpenCore没有使用这个接口,而是使用其他形式对OpenMax IL层接口进行封装。
首先,搭建好OpenMax的工作环境:设置组件端口、加载组件,建立连接方式等等。
然后通过输入端口消耗Buffer,通过输出端口填充Buffer,由此多组件相联接可以构成流式的处理。
参考《Build OpenCORE 2.05 on x86 Linux.PDF》和《omx_decoder_test_app_guide.pdf》
根据pv_omxregistry.cpp,得到如下表格(其中黄绿色部分表示没有相应编码器)
组件 | 角色 | 动态库名 |
---|---|---|
OMX.PV.mpeg4dec | video_decoder.mpeg4 | libomx_m4vdec_sharedlibrary |
OMX.PV.h263dec | video_decoder.h263 | libomx_m4vdec_sharedlibrary |
OMX.PV.avcdec | video_decoder.avc | libomx_avcdec_sharedlibrary |
OMX.PV.wmvdec | video_decoder.wmv | libomx_wmvdec_sharedlibrary |
OMX.PV.rvdec | video_decoder.rv | libomx_rvdec_sharedlibrary |
OMX.PV.aacdec | audio_decoder.aac | libomx_aacdec_sharedlibrary |
OMX.PV.amrdec | audio_decoder.amraudio_decoder.amrnbaudio_decoder.amrwb | libomx_amrdec_sharedlibrary |
OMX.PV.mp3dec | audio_decoder.mp3 | libomx_mp3dec_sharedlibrary |
OMX.PV.wmadec | audio_decoder.wma | libomx_wmadec_sharedlibrary |
OMX.PV.radec | audio_decoder.ra | libomx_radec_sharedlibrary |
OMX.PV.amrencnb | audio_encoder.amrnb | libomx_amrenc_sharedlibrary |
OMX.PV.mpeg4enc | video_encoder.mpeg4 | libomx_m4venc_sharedlibrary |
OMX.PV.h263enc | video_encoder.h263 | libomx_m4venc_sharedlibrary |
OMX.PV.avcenc | video_encoder.avc | libomx_avcenc_sharedlibrary |
OMX.PV.aacenc | audio_encoder.aac | libomx_aacenc_sharedlibrary |
1)OMX_Init 2)OMX_Deinit 3)OMX_GetHandle 4)OMX_FreeHandle 5)OMX_ComponentNameEnum 6)OMX_GetComponentsOfRole 7)OMX_GetRolesOfComponent 8)OMX_SetupTunnel 9)OMX_GetContentPipe
除了以上methods,强烈推荐OMX核心插件库包含此API
OMX_BOOL OMXConfigParser ( OMX_PTR aInputParameters,OMX_PTR aOutputParameters);
aInputParameters 指向如下结构
typedef struct
{
OMX_U8* inPtr; //codec 配置头部指针
OMX_U32 inBytes; //codec 配置头部长度
OMX_STRING cComponentRole; //OMX codec类型 eg "video_decoder.mpeg4"
OMX_STRING cComponentName; //OMX 组件名称
} OMXConfigParserInputs;
OMX_FALSE : 处理codec配置头部错误或不支持该格式
OMX_TURE : 正确处理codec配置头部
填充aOutputParameters,有两种选择:audio coded or vedio codec
for audio
typedef struct
{
OMX_U16 Channels; //通道:单声道、立体声、5.1
OMX_U16 BitsPerSample; //位宽(eg16)
OMX_U32 SamplesPerSec; //采样率
} AudioOMXConfigParserOutputs;
typedef struct
{
OMX_U32 width; //检测到的视频剪辑宽度
OMX_U32 height; //检测到的视频剪辑高度
OMX_U32 profile; //参数
OMX_U32 level; //级别?
} VideoOMXConfigParserOutputs;
解释了\system\system\etc\pvplayer.cfg文件中最后一行的含义 (0xa054369c,0x22c5,0x412e,0x19,0x17,0x87,0x4c,0x1a,0x19,0xd4,0x5f),“libomx_sharedlibrary.so”
作用:将OMX内核动态加载进OpenCORE框架 位置:\system\system\etc\pvplayer.cfg 形式:(OMX Core API OsclUuid), “shared library name.so”
(0xa054369c,0x22c5,0x412e,0x19,0x17,0x87,0x4c,0x1a,0x19,0xd4,0x5f),“libomx_core_vendorXYZ.so”
以上就是OpenMax的简单解析,音视频属于大范围学习的岗位开发;更多有关音视频开发进阶可以浏览这篇《音视频简单到精通手册》里面内容包含几十个大大小小技术。对于新手非常友好从基础语言C++开始解析学习。