1) OMX core初始化
OMX_Init()
OMX_ComponentNameEnum()
OMX_GetRolesOfComponent()
2) OMX Component instantiation, capabilities and port indices
利用OMX_GetHandle()调用来实例化想要的OMX组件
利用OMX_GetParameter(PV_OMX_CAPABILITY_TYPE_INDEX)调用来获取OMX组件的能力和OMX组件上可用端口的数量
OMX_GetParameter(OMX_IndexVideoInit/OMX_IndexAudioInit)
遍历可用的端口以查找输入端口的索引OMX_GetParameter(OMX_IndexParamPortDefinition)
遍历可用的端口以查找输出端口的索引
3)OMX component input and output buffer negotiation
调用OMX_GetParameter来获取input port buffer参数
核实(verify) input buffer参数的有效性
调用OMX_SetParameter来设置input buffer参数
调用OMX_GetParameter来获取output port buffer参数
核实(verify) output buffer参数的有效性
调用OMX_SetParameter来设置output buffer参数
4) OMX Transition Loaded->Idel State
调用OMX_SendCommand向OMX组件发送命令以改变组件状态(Loaded->Idel)
调用OMX_UseBuffer或OMX_AllocateBuffer向OMX组件发送命令。 (Buffer分配)
等待组件的EventHandler回调OMX_EventCmdComplete。这个callback通知框架组件的状态转换已经完成。
5) Transition to “Executing” state and data exchange
OMX_SendCommand (Executing)
等待EventHandler回调OMX_EventCmdComplete
OMX_EmptyThisBuffer、OMX_FillThisBuffer设置输入输出buffer
Callback EmptyBufferDone FillBufferDone
{
组件缓冲处理
当组件完成数据输出(Fill Buffer)后会调用FillBufferDone回调函数以通知应用层准备数据(仅非Tunneled模式)
函数C代码原型:
FillBufferDone(OMX_OUT OMX_HANDLETYPE hComponent, OMX_OUT OMX_PTR pAppData, OMX_OUT OMX_BUFFERHEADERTYPE *pBuffer)
其中hComponent是组件句柄;pAppData为GetHandle时赋入的应用数据;pBuffer为缓冲地址。由于该缓冲已经填写完毕(通常是一帧完成),回调函数将改数据输出到适当位置,完后再次调用OMX_FillThisBuffer,链入下一轮工作。
当组件完成数据消耗(Empty Buffer)后会调用EmptyBufferDone回调函数以通知应用层准备数据(仅非Tunneled模式)
函数C代码原型:
EmptyBufferDone(OMX_OUT OMX_HANDLETYPE hComponent, OMX_OUT OMX_PTR pAppData, OMX_OUT OMX_BUFFERHEADERTYPE *pBuffer)
三个参数含义同上。由于改缓冲已经消耗殆尽,回调函数将读入数据载入缓冲,完后再次调用OMX_EmptyThisBuffer,链入下一轮工作。
上述缓冲操作是组件运行的一个环节,OpenMAX组件运行于一个独立线程。
}
6) Pausing <--> Executing 互相切换
OMX_SendCommand (EXECUTE)
等待EventHandler回调OMX_EventCmdComplete
OMX_SendCommand (PAUSE)
等待EventHandler回调OMX_EventCmdComplete
7) Port flush (if need)
OMX_SendCommand (FlushPort)
OMX_EventCmdComplete 两次,第二次后可以继续I/O
8) Stopping/Transition to “Idle” state
OMX_SendCommand (OMX_StateExecuting/OMX_StatePause to OMX_StateIdle)
EventHandler回调OMX_EventCmdComplete
收尾工作1:命令并等待组件进入Idle状态
收尾工作2:命令并等待组件进入Loaded状态,并销毁Buffer OMX_FreeBuffe()
释放组件句柄OMX_Deinit()
call 顺序
最新推荐文章于 2022-05-10 20:39:02 发布