分类: LINUX
2010-08-02 21:47:07
Android Opencore OpenMAX学习(1)
1 OMX core methods
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
2 The configuration parser API
除了以上methods,强烈推荐OMX核心插件库包含此API
2.1函数原型
OMX_BOOL OMXConfigParser ( OMX_PTR aInputParameters,OMX_PTR aOutputParameters);
2.2 传递参数
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;
2.3 返回值
OMX_FALSE : 处理codec配置头部错误或不支持该格式
OMX_TURE : 正确处理codec配置头部
2.4 函数作用
填充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;
3 动态加载OMX内核
解释了\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”
eg:(0xa054369c,0x22c5,0x412e,0x19,0x17,0x87,0x4c,0x1a,0x19,0xd4,0x5f),"libomx_core_vendorXYZ.so"
注意:(0xa054369c,0x22c5,0x412e,0x19,0x17,0x87,0x4c,0x1a,0x19,0xd4,0x5f) 提供独立API ID,不可修改
Rockie Cheng
来自/external/opencore/doc/omx_core_integration_guide.pdf
数据格式及OMX输入缓冲细节 1.1 帧起始代码 1.2 OMX缓冲区 1.3多帧合并输入缓冲 1.4部分帧 总结:OMX输出缓冲区可能包含 1.5 错误的数据封装 1.6 Codec配置数据 2 H264/AVC 解码器格式 2.1 AVC NAL模式与AVC Frame模式 数据结构——NAL模式: 数据结构——Frame模式: 缓冲区最后包含AVC frame,追加以下数据: extra.eType = OMX_ExtraDataNALSizeArray; #define OMX_ExtraDataNALSizeArray 0x7F123321 通过获取OMX_OTHER_EXTRADATA结构体信息,可以得知每一帧包含NAL单元的数目并确定NAL边界。 一个例子:AVC Frame模式,包含2个NAL,包含extra数据结构 3 YUV和RGB数据格式 Rockie Cheng 来自/external/opencore/doc/omx_core_integration_guide.pdf |
OpenMax 调用顺序(OpenMax Call Sequences) 2)PV框架列举所有OMX OMX_ComponentNameEnum //列举所有组件的名称 OMX_GetRolesOfComponent // 通过组件名称找到组件,返回其角色(role) 2 OMX组件实例、功能及端口 2)调用OMX_GetParameter及“PV_OMX_CAPABILITY_TYPE_INDEX”这个index去获取组件的功能。 注意:如果OMX组件返回“OMX_ErrorUnsupportedIndex”给index(或其他比如“OMX_ErrorNone”),PV框架将为组件功能赋默认值。 3)调用OMX_GetParameter,针对视频组件再调用“OMX_IndexVideoInit”,针对音频组件则调用“OMX_IndexAudioIni”以获取可用的端口号。 4)循环查找可用的端口号以找到输入端口。 5)循环查找可用的端口号以找到输出端口。 注意: 功能参数的默认值: 2)iOMXComponentSupportsExternalOutputBufferAlloc ——默认值OMX_TRUE。 3)iOMXComponentSupportsExternalInputBufferAlloc ——默认值OMX_TRUE。 4)iOMXComponentSupportsMovableInputBuffers ——默认值OMX_TRUE。 5)iOMXComponentSupportsPartialFrames ——默认值OMX_TRUE。 6)iOMXComponentUsesNALStartCode ——默认值OMX_FALSE。 7)iOMXComponentCanHandleIncompleteFrames ——默认值OMX_TRUE。 8)iOMXComponentUsesFullAVCFrames ——默认值OMX_FALSE。 翻译 from openmax_call_sequences.pdf |
3 OMX组件输入输出缓冲协商 过程如图三(省略) 一些设想: 对于解码器组件,最终分配的输入缓冲区尺寸可能小于profile/level/target比特率所要求的最大帧尺寸。出于内存消耗考虑,PV框架在适当的时候提供采用“OMX_BUFFERFLAG_ENDOFFRAME”标记结尾的输入缓冲区。如果输入缓冲包含完整帧(H264也可能是NAL单元 )或多帧,“OMX_BUFFERFLAG_ENDOFFRAME”将会用来标记一帧的结尾。如果完整的frame/NAL不能放入一个输入缓冲区,则会被拆分放入多个缓冲区。包含部分信息的缓冲区,“OMX_BUFFERFLAG_ENDOFFRAME”标记位将会被置为0。一帧数据的最后一个缓冲区中“OMX_BUFFERFLAG_ENDOFFRAME”才会被置为1。通过这种做法,组件可以方便的重构一帧数据。 如果OMX解码器组件不兼容组长部分帧,PV框架将负责做这件事情。 2)输入/输出缓冲区数量。 4 OMX状态变换 加载->空闲 一些设想与推荐参数: 推荐将INPUT缓冲分配在OMX组件外部,这样可以减少额外的内存拷贝(也就是说输入缓冲使用OMX_UseBuffer)。 5 变换到“执行”状态与数据交换 过程如图5 注意: 2)如果PV框架没有及时将缓冲区发给OMX框架,OMX组件不会多次返回同一个缓冲区(也就是一旦OMX框架返回一个缓冲区,只有PV框架再次调用这个缓冲,OMX组件才可使用)。这是OMX缓冲交换APSs所规定的基本规则。 6 暂停 PV框架向OMX组件发送暂停命令后,立刻停止发送输入输出缓冲。 有暂停就有恢复,PV框架将: PV框架的状态恢复到执行后,将恢复发送OMX输入输出缓冲。 过程如图6 7 端口刷新(如果可用) 刷新命令来了之后,PV框架立刻停止向OMX组件发送输入/输出缓冲。当组件接收到2个回调函数后,PV框架开始恢复发送输入/输出缓冲。 端口刷新的顺序和通告并不相关。 过程如图7。 为了防止动态端口被重复配置,也可以先于OMX IL用户关闭OMX组件端口调用端口刷新指令。 8 停止/变化到“IDLE”状态 过程见图8。 一些设想: 9 OMX组件状态转换 IDLE->Loaded State和 De-initialization 流程图见图9 注意:在向OMX组件发送卸载命令之前,PV框架一直在等待OMX组件返回的输入输出缓冲。由于回调的过程的不同步性,一些EmptyBufferDone/FillBufferDone的回调有可能在OMX组件状态由“executing” 到 “idle”之后才到达。 10 OMX Core 卸载 翻译 from openmax_call_sequences.pdf
Android Opencore OpenMAX学习(4)OpenMax 调用顺序 PART 2
2010-01-29 15:18
|