zoukankan      html  css  js  c++  java
  • 转载: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:

  • 相关阅读:
    jQuery Ajax 全解析
    据说:2010年最佳Flash网站
    SWFKit 3.5 + 注册机
    几何算法
    不错的3d切换
    常见程式算法推演
    未知
    3d地形与道路
    在3D世界中创建不同的相机模式——创建一个第一人称射击游戏(FPS)的相机:Quake风格的相机
    在3D世界中创建不同的相机模式——天空盒
  • 原文地址:https://www.cnblogs.com/fellow1988/p/12318838.html
Copyright © 2011-2022 走看看