转载:openmax bellagio

https://wenku.baidu.com/view/18472c1387c24028915fc3e9.html

https://wenku.baidu.com/view/1e380bc20c22590102029d3f.html

Bellagio 目录结构:

src/:

omxcore.c包含一些IL clinet 调用的core function. 

omxregister.c 注册component.

st_static_component_loader.c 包含load 静态component的function.

src/base/:

base component和base port

src/components/:

包含已经实现的components.自己新加的component也可以放此目录,实现component时需要实现libbrary_entry_pointer.c

test/:

包含已经实现的IL clients.

IL client的调用flow:

IL core functions:

 OMX_Init()/OMX_DeInit()

1.初始化core环境。

2.调用st_static_InitComponentLoader(): load ST_static_loader function to ComponentLoader.

3.调用BOSA_InitComponentLoader(loadsList[i]):Load所有的Component,依照omxregister file中所注册的share libraries name取出omx_component_library_Setup()执行。

4.omx_component_library_Setup():初始化该components的role,name等参数,并将信息存进loader(每个component一定要自己实现此function)

OMX_GetHandle()/OMX_FreeHandle()

1.调用BOSA_ST_CreateComponent() scan 所有存在loader的components找出request的components,运行该component的constructor,最后把所有的信息存入OMX_HANDLETYPE的hComponent结构体中。

2.component的constructor是要自己实现的,constructor调用omx_base_component_constructor(),并可以覆盖base component的一些成员函数(如SetParameter(),GetParameter(), SetConfig(), GetConfig(), BufferMgmtFunction())。在omx_base_component_constructor()内,创建compMessageHandleFunction线程,该线程接受并处理来自IL client所下的Command.

3.调用omx_base_port_Constructor()来construct component的input和output port.

4.调用setCallbacks()即omx_base_component_SetCallbacks注册IL client的三个callback(EventHandler, EmptyBufferDone, FillBufferDone)。component完成任务后(state change, fill buffer, empty buffer)会通过callback通知到IL client.目的是为了达到同步。

EventHandler:当component收到sendCommand的request被执行完后被调用。

EmptyBufferDone:当component消耗完input port 的buffer后被调用,来通知IL client来填充input port的buffer。

FillBufferDone:当component填充完output port的buffer后被调用,来通知IL client来取走output port的buffer。

OMX_SetupTunnel()

1.在两个commponent的两个port之间创建tunnel.

2.一定要在StateLoaded执行。

OMX_SendCommand()

向指定的component 发送命令.将command放入message queue中等待component的message Handler处理。

  对于Client来说,命令的发送是非阻塞的,当Client把命令发送给component 时,component 会把收到的命令放到一个命令队列(或管道)里面,然后函数就会立刻返回了。当component内部的线程compMessageHandleFunction取出某个命令并执行完毕之后会进行一个事件回调来通知Client某个命令已经执行完毕,并返回命令执行的状态(失败/成功)。

OMX_SetParameter()/OMX_GetParameter()

向compnent设置参数/从component获取参数。

GetParameter:OMX_StateInvalid状态不能执行
SetParameter:只有在OMX_StateLoadedOMX_StateWaitForResources状态下可以执行,其余状态均需要返回状态错误的错误码。

OMX_AllocateBuffer()/OMX_FreeBuffer()

在Non-Tunnel mode,由IL client向compnent发请求allocate某个port上的 buffer.

在Tunnel mode,由相邻的component向提供buffer的component发请求allocate某个port上的 buffer.

allocate的buffer包含buffer header和buffer两部分。

OMX_EmptyThisBuffer()

向指定component传递buffer数据,传递buffer数据到component的input port, 该component从buffer中取走数据。component将buffer 发送到一个queue中,component的BufferMgmtFunction从queue中取走数据后,会调用ReturnBufferFunction,在此函数中会调用IL client的callback 函数EmptyBufferDone. 在callback EmptyBufferDone中,可以继续将数据填充到buffer并调用OMX_EmptyThisBuffer来通知component取走数据。

OMX_FillThisBuffer()

向指定component还回空的buffer,传递空buffer到组件的output port, 该component往buffer填入数据。component将空buffer 发送到一个queue中,component的BufferMgmtFunction从queue中拿到空buffer后往buffer中填充数据,会调用ReturnBufferFunction,在此函数中会调用IL client的callback 函数FillBufferDone. 在callback FillBufferDone中,读走component填充的数据并调用继续调用OMX_FillThisBuffer来通知component填充数据。

IL client的调用时序图:

 

 

Tunnel mode buffer flow:

Setup Tunnel:

将组件A的端口A1与组件B的端口B0进行绑定,整个过程的步骤如下所示:
1.ComponentTunnelRequest(A,1,B,0,*pTunnelSetup)调用传入A1与B0端口号以及A、B组件实例句柄,组件A返回pTunnelSetup,该参数表明了绑定标志位与buffer提供者。
2.ComponentTunnelRequest(B,0,A,1,*pTunnelSetup)调用传入B0与A1端口号以及B、A组件实例句柄,在组件B的该函数回调内又会去调用组件A的getParameter获取相关参数,并调用组件A的SetParameter(A, OMX_IndexParamCompBufferSupplier, supplierStructure)设置组件A的buffer supplier。组件B也返回一个pTunnelSetup。
3.判断返回值是否正确,如不正确就对组件A解绑ComponentTunnelRequest(A, 1, NULL, 0, NULL)并返回错误。

当state 从load 切换到Idle时,DoStateSet() 调用base port的Port_AllocateBuffer() allocate tunneled buffer:

原文地址:https://www.cnblogs.com/fellow1988/p/12318838.html