Home | History | Annotate | Download | only in inc
      1 /*
      2  * componentbase.h, component base class
      3  *
      4  * Copyright (c) 2009-2010 Wind River Systems, Inc.
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  * http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  */
     18 
     19 #ifndef __COMPONENTBASE_H
     20 #define __COMPONENTBASE_H
     21 
     22 #include <OMX_Core.h>
     23 #include <OMX_Component.h>
     24 #include <OMX_IntelIndexExt.h>
     25 #include <cmodule.h>
     26 #include <portbase.h>
     27 
     28 #include <queue.h>
     29 #include <workqueue.h>
     30 
     31 /* retain buffers */
     32 typedef enum buffer_retain_e {
     33     BUFFER_RETAIN_NOT_RETAIN = 0,
     34     BUFFER_RETAIN_GETAGAIN,
     35     BUFFER_RETAIN_ACCUMULATE,
     36     BUFFER_RETAIN_OVERRIDDEN,
     37     BUFFER_RETAIN_CACHE,
     38 } buffer_retain_t;
     39 
     40 /* ProcessCmdWork */
     41 struct cmd_s {
     42     OMX_COMMANDTYPE cmd;
     43     OMX_U32 param1;
     44     OMX_PTR cmddata;
     45 };
     46 
     47 class CmdHandlerInterface
     48 {
     49 public:
     50     virtual ~CmdHandlerInterface() {};
     51     virtual void CmdHandler(struct cmd_s *cmd) = 0;
     52 };
     53 
     54 class CmdProcessWork : public WorkableInterface
     55 {
     56 public:
     57     CmdProcessWork(CmdHandlerInterface *ci);
     58     ~CmdProcessWork();
     59 
     60     OMX_ERRORTYPE PushCmdQueue(struct cmd_s *cmd);
     61 
     62 private:
     63     struct cmd_s *PopCmdQueue(void);
     64 
     65     virtual void Work(void); /* call ci->CmdHandler() */
     66 
     67     WorkQueue *workq;
     68 
     69     struct queue q;
     70     pthread_mutex_t lock;
     71 
     72     CmdHandlerInterface *ci; /* to run ComponentBase::CmdHandler() */
     73 };
     74 
     75 class ComponentBase : public CmdHandlerInterface, public WorkableInterface
     76 {
     77 public:
     78     /*
     79      * constructor & destructor
     80      */
     81     ComponentBase();
     82     ComponentBase(const OMX_STRING name);
     83     virtual ~ComponentBase();
     84 
     85     /*
     86      * accessor
     87      */
     88     /* name */
     89     void SetName(const OMX_STRING name);
     90     OMX_STRING GetName(void);
     91 
     92     /* working role */
     93     OMX_STRING GetWorkingRole(void);
     94 
     95     /* cmodule */
     96     void SetCModule(CModule *cmodule);
     97     CModule *GetCModule(void);
     98 
     99     /* end of accessor */
    100 
    101     /*
    102      * core methods & helpers
    103      */
    104     /* roles */
    105     OMX_ERRORTYPE SetRolesOfComponent(OMX_U32 nr_roles, const OMX_U8 **roles);
    106 
    107     /* GetHandle & FreeHandle */
    108     OMX_ERRORTYPE GetHandle(OMX_HANDLETYPE* pHandle,
    109                             OMX_PTR pAppData,
    110                             OMX_CALLBACKTYPE *pCallBacks);
    111     OMX_ERRORTYPE FreeHandle(OMX_HANDLETYPE hComponent);
    112 
    113     /* end of core methods & helpers */
    114 
    115     /*
    116      * component methods & helpers
    117      */
    118 
    119     static OMX_ERRORTYPE SendCommand(
    120         OMX_IN  OMX_HANDLETYPE hComponent,
    121         OMX_IN  OMX_COMMANDTYPE Cmd,
    122         OMX_IN  OMX_U32 nParam1,
    123         OMX_IN  OMX_PTR pCmdData);
    124     OMX_ERRORTYPE CBaseSendCommand(
    125         OMX_IN  OMX_HANDLETYPE hComponent,
    126         OMX_IN  OMX_COMMANDTYPE Cmd,
    127         OMX_IN  OMX_U32 nParam1,
    128         OMX_IN  OMX_PTR pCmdData);
    129 
    130     static OMX_ERRORTYPE GetParameter(
    131         OMX_IN  OMX_HANDLETYPE hComponent,
    132         OMX_IN  OMX_INDEXTYPE nParamIndex,
    133         OMX_INOUT OMX_PTR pComponentParameterStructure);
    134     OMX_ERRORTYPE CBaseGetParameter(
    135         OMX_IN  OMX_HANDLETYPE hComponent,
    136         OMX_IN  OMX_INDEXTYPE nParamIndex,
    137         OMX_INOUT OMX_PTR pComponentParameterStructure);
    138 
    139     static OMX_ERRORTYPE SetParameter(
    140         OMX_IN  OMX_HANDLETYPE hComponent,
    141         OMX_IN  OMX_INDEXTYPE nIndex,
    142         OMX_IN  OMX_PTR pComponentParameterStructure);
    143     OMX_ERRORTYPE CBaseSetParameter(
    144         OMX_IN  OMX_HANDLETYPE hComponent,
    145         OMX_IN  OMX_INDEXTYPE nIndex,
    146         OMX_IN  OMX_PTR pComponentParameterStructure);
    147 
    148     static OMX_ERRORTYPE GetConfig(
    149         OMX_IN  OMX_HANDLETYPE hComponent,
    150         OMX_IN  OMX_INDEXTYPE nIndex,
    151         OMX_INOUT OMX_PTR pComponentConfigStructure);
    152     OMX_ERRORTYPE CBaseGetConfig(
    153         OMX_IN  OMX_HANDLETYPE hComponent,
    154         OMX_IN  OMX_INDEXTYPE nIndex,
    155         OMX_INOUT OMX_PTR pComponentConfigStructure);
    156 
    157     static OMX_ERRORTYPE SetConfig(
    158         OMX_IN  OMX_HANDLETYPE hComponent,
    159         OMX_IN  OMX_INDEXTYPE nIndex,
    160         OMX_IN  OMX_PTR pComponentConfigStructure);
    161     OMX_ERRORTYPE CBaseSetConfig(
    162         OMX_IN  OMX_HANDLETYPE hComponent,
    163         OMX_IN  OMX_INDEXTYPE nIndex,
    164         OMX_IN  OMX_PTR pComponentConfigStructure);
    165 
    166     static OMX_ERRORTYPE GetExtensionIndex(
    167         OMX_IN  OMX_HANDLETYPE hComponent,
    168         OMX_IN  OMX_STRING cParameterName,
    169         OMX_OUT OMX_INDEXTYPE* pIndexType);
    170     OMX_ERRORTYPE CBaseGetExtensionIndex(
    171         OMX_IN  OMX_HANDLETYPE hComponent,
    172         OMX_IN  OMX_STRING cParameterName,
    173         OMX_OUT OMX_INDEXTYPE* pIndexType);
    174 
    175     static OMX_ERRORTYPE GetState(
    176         OMX_IN  OMX_HANDLETYPE hComponent,
    177         OMX_OUT OMX_STATETYPE* pState);
    178     OMX_ERRORTYPE CBaseGetState(
    179         OMX_IN  OMX_HANDLETYPE hComponent,
    180         OMX_OUT OMX_STATETYPE* pState);
    181 
    182     static OMX_ERRORTYPE UseBuffer(
    183         OMX_IN OMX_HANDLETYPE hComponent,
    184         OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
    185         OMX_IN OMX_U32 nPortIndex,
    186         OMX_IN OMX_PTR pAppPrivate,
    187         OMX_IN OMX_U32 nSizeBytes,
    188         OMX_IN OMX_U8* pBuffer);
    189     OMX_ERRORTYPE CBaseUseBuffer(
    190         OMX_IN OMX_HANDLETYPE hComponent,
    191         OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
    192         OMX_IN OMX_U32 nPortIndex,
    193         OMX_IN OMX_PTR pAppPrivate,
    194         OMX_IN OMX_U32 nSizeBytes,
    195         OMX_IN OMX_U8* pBuffer);
    196 
    197     static OMX_ERRORTYPE AllocateBuffer(
    198         OMX_IN OMX_HANDLETYPE hComponent,
    199         OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer,
    200         OMX_IN OMX_U32 nPortIndex,
    201         OMX_IN OMX_PTR pAppPrivate,
    202         OMX_IN OMX_U32 nSizeBytes);
    203     OMX_ERRORTYPE CBaseAllocateBuffer(
    204         OMX_IN OMX_HANDLETYPE hComponent,
    205         OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer,
    206         OMX_IN OMX_U32 nPortIndex,
    207         OMX_IN OMX_PTR pAppPrivate,
    208         OMX_IN OMX_U32 nSizeBytes);
    209 
    210     static OMX_ERRORTYPE FreeBuffer(
    211         OMX_IN  OMX_HANDLETYPE hComponent,
    212         OMX_IN  OMX_U32 nPortIndex,
    213         OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
    214     OMX_ERRORTYPE CBaseFreeBuffer(
    215         OMX_IN  OMX_HANDLETYPE hComponent,
    216         OMX_IN  OMX_U32 nPortIndex,
    217         OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
    218 
    219     static OMX_ERRORTYPE EmptyThisBuffer(
    220         OMX_IN  OMX_HANDLETYPE hComponent,
    221         OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
    222     OMX_ERRORTYPE CBaseEmptyThisBuffer(
    223         OMX_IN  OMX_HANDLETYPE hComponent,
    224         OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
    225 
    226     static OMX_ERRORTYPE FillThisBuffer(
    227         OMX_IN  OMX_HANDLETYPE hComponent,
    228         OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
    229     OMX_ERRORTYPE CBaseFillThisBuffer(
    230         OMX_IN  OMX_HANDLETYPE hComponent,
    231         OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
    232 
    233     static OMX_ERRORTYPE SetCallbacks(
    234         OMX_IN  OMX_HANDLETYPE hComponent,
    235         OMX_IN  OMX_CALLBACKTYPE* pCallbacks,
    236         OMX_IN  OMX_PTR pAppData);
    237     OMX_ERRORTYPE CBaseSetCallbacks(
    238         OMX_IN  OMX_HANDLETYPE hComponent,
    239         OMX_IN  OMX_CALLBACKTYPE* pCallbacks,
    240         OMX_IN  OMX_PTR pAppData);
    241 
    242     static OMX_ERRORTYPE ComponentRoleEnum(
    243         OMX_IN OMX_HANDLETYPE hComponent,
    244         OMX_OUT OMX_U8 *cRole,
    245         OMX_IN OMX_U32 nIndex);
    246     OMX_ERRORTYPE CBaseComponentRoleEnum(
    247         OMX_IN OMX_HANDLETYPE hComponent,
    248         OMX_OUT OMX_U8 *cRole,
    249         OMX_IN OMX_U32 nIndex);
    250 
    251     /* end of component methods & helpers */
    252 
    253     /*
    254      * omx header manipuation
    255      */
    256     static void SetTypeHeader(OMX_PTR type, OMX_U32 size);
    257     static OMX_ERRORTYPE CheckTypeHeader(const OMX_PTR type, OMX_U32 size);
    258 
    259     /* end of omx header manipuation */
    260 
    261     /*
    262      * helper method for queury_roles()
    263      */
    264     static OMX_ERRORTYPE QueryRolesHelper(OMX_U32 nr_comp_roles,
    265                                           const OMX_U8 **comp_roles,
    266                                           OMX_U32 *nr_roles, OMX_U8 **roles);
    267 
    268     /* end of helper method for queury_roles() */
    269 
    270 protected:
    271     /* helpers for derived class */
    272     const OMX_COMPONENTTYPE *GetComponentHandle(void);
    273 #if 0
    274     void DumpBuffer(const OMX_BUFFERHEADERTYPE *bufferheader, bool dumpdata);
    275 #endif
    276     /* check if all port has own pending buffer */
    277     virtual bool IsAllBufferAvailable(void);
    278 
    279     /* end of helpers for derived class */
    280 
    281     /* ports */
    282     /*
    283      * allocated with derived port classes by derived component classes
    284      */
    285     PortBase **ports;
    286     OMX_U32 nr_ports;
    287     OMX_PORT_PARAM_TYPE portparam;
    288 
    289     /* ports big lock, must be held when accessing all ports at one time */
    290     pthread_mutex_t ports_block;
    291 
    292     /* adaptive playback param */
    293     OMX_BOOL mEnableAdaptivePlayback;
    294 private:
    295     /* common routines for constructor */
    296     void __ComponentBase(void);
    297 
    298     /*
    299      * core methods & helpers
    300      */
    301     /* called in GetHandle (nr_roles == 1) or SetParameter(ComponentRole) */
    302     OMX_ERRORTYPE SetWorkingRole(const OMX_STRING role);
    303     /* called int FreeHandle() */
    304     OMX_ERRORTYPE FreePorts(void);
    305 
    306     /* end of core methods & helpers */
    307 
    308     /*
    309      * component methods & helpers
    310      */
    311     /* SendCommand */
    312     /* implement CmdHandlerInterface */
    313     virtual void CmdHandler(struct cmd_s *cmd);
    314 
    315     /* SendCommand:OMX_CommandStateSet */
    316     /* called in CmdHandler() thread context or by component itself */
    317     void TransState(OMX_STATETYPE transition);
    318     inline OMX_ERRORTYPE TransStateToLoaded(OMX_STATETYPE current);
    319     inline OMX_ERRORTYPE TransStateToIdle(OMX_STATETYPE current);
    320     inline OMX_ERRORTYPE TransStateToExecuting(OMX_STATETYPE current);
    321     inline OMX_ERRORTYPE TransStateToPause(OMX_STATETYPE current);
    322     inline OMX_ERRORTYPE TransStateToWaitForResources(OMX_STATETYPE current);
    323     inline OMX_ERRORTYPE TransStateToInvalid(OMX_STATETYPE current);
    324 
    325     /* called in TransStateToIdle(Loaded) */
    326     OMX_ERRORTYPE ApplyWorkingRole(void);
    327     /* called in ApplyWorkingRole() */
    328     OMX_ERRORTYPE AllocatePorts(void);
    329     /* allocate specific port type derived from portbase */
    330     virtual OMX_ERRORTYPE ComponentAllocatePorts(void) = 0;
    331 
    332     /* SendCommand:OMX_CommandMarkBuffer */
    333     /* called in CmdHandler() thread context */
    334     void PushThisMark(OMX_U32 portindex, OMX_MARKTYPE *mark);
    335     /* SendCommand:OMX_CommandFlush (notify:1) or other parts (notify:0) */
    336     void FlushPort(OMX_U32 port_index, bool notify);
    337     /* SendCommand:OMX_CommandPortDisable/Enable */
    338     /* state: PortBase::OMX_PortEnabled/Disabled */
    339     void TransStatePort(OMX_U32 port_index, OMX_U8 state);
    340 
    341     /* Get/SetParameter */
    342     virtual OMX_ERRORTYPE
    343         ComponentGetParameter(OMX_INDEXTYPE nParamIndex,
    344                               OMX_PTR pComponentParameterStructure) = 0;
    345     virtual OMX_ERRORTYPE
    346         ComponentSetParameter(OMX_INDEXTYPE nIndex,
    347                               OMX_PTR pComponentParameterStructure) = 0;
    348 
    349     /* Get/SetConfig */
    350     virtual OMX_ERRORTYPE
    351         ComponentGetConfig(OMX_INDEXTYPE nIndex,
    352                            OMX_PTR pComponentConfigStructure) = 0;
    353     virtual OMX_ERRORTYPE
    354         ComponentSetConfig(OMX_INDEXTYPE nIndex,
    355                            OMX_PTR pComponentConfigStructure) = 0;
    356 
    357     /* buffer processing */
    358     /* implement WorkableInterface */
    359     virtual void Work(void); /* handle this->ports, hold ports_block */
    360 
    361     /* called in Work() after ProcessorProcess() */
    362     void PostProcessBuffers(OMX_BUFFERHEADERTYPE ***buffers,
    363                             const buffer_retain_t *retain);
    364     void SourcePostProcessBuffers(OMX_BUFFERHEADERTYPE ***buffers);
    365     void FilterPostProcessBuffers(OMX_BUFFERHEADERTYPE ***buffers,
    366                                   const buffer_retain_t *retain);
    367     void SinkPostProcessBuffers();
    368 
    369     /* processor callbacks */
    370     /* TransState */
    371     virtual OMX_ERRORTYPE ProcessorInit(void);  /* Loaded to Idle */
    372     virtual OMX_ERRORTYPE ProcessorDeinit(void);/* Idle to Loaded */
    373     virtual OMX_ERRORTYPE ProcessorStart(void); /* Idle to Executing/Pause */
    374     virtual OMX_ERRORTYPE ProcessorReset(void); /* Reset */
    375     virtual OMX_ERRORTYPE ProcessorStop(void);  /* Executing/Pause to Idle */
    376     virtual OMX_ERRORTYPE ProcessorPause(void); /* Executing to Pause */
    377     virtual OMX_ERRORTYPE ProcessorResume(void);/* Pause to Executing */
    378     virtual OMX_ERRORTYPE ProcessorFlush(OMX_U32 port_index); /* Flush */
    379     virtual OMX_ERRORTYPE ProcessorPreFillBuffer(OMX_BUFFERHEADERTYPE* buffer);
    380     virtual OMX_ERRORTYPE ProcessorPreEmptyBuffer(OMX_BUFFERHEADERTYPE* buffer);
    381 
    382     /* invoked when buffer is to be freed */
    383     virtual OMX_ERRORTYPE ProcessorPreFreeBuffer(OMX_U32 nPortIndex, OMX_BUFFERHEADERTYPE* pBuffer);
    384     /* Work */
    385     virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE ***pBuffers,
    386                                            buffer_retain_t *retain,
    387                                            OMX_U32 nr_buffers);
    388     virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE **pBuffers,
    389                                            buffer_retain_t *retain,
    390                                            OMX_U32 nr_buffers);
    391 
    392     /* end of component methods & helpers */
    393 
    394     /* process component's commands work */
    395     CmdProcessWork *cmdwork;
    396 
    397     /* buffer processing work */
    398     WorkQueue *bufferwork;
    399 
    400     /* component variant */
    401     typedef enum component_variant_e {
    402         CVARIANT_NULL = 0,
    403         CVARIANT_SOURCE,
    404         CVARIANT_FILTER,
    405         CVARIANT_SINK,
    406     } component_variant_t;
    407 
    408     component_variant_t cvariant;
    409 
    410     /* roles */
    411     OMX_U8 **roles;
    412     OMX_U32 nr_roles;
    413 
    414     OMX_STRING working_role;
    415 
    416     /* omx standard handle */
    417     /* allocated at GetHandle, freed at FreeHandle */
    418     OMX_COMPONENTTYPE *handle;
    419 
    420     /* component module */
    421     CModule *cmodule;
    422 
    423     OMX_STATETYPE state;
    424 
    425     const static OMX_STATETYPE OMX_StateUnloaded = OMX_StateVendorStartUnused;
    426 
    427     /* omx standard callbacks */
    428     OMX_PTR appdata;
    429     OMX_CALLBACKTYPE *callbacks;
    430 
    431     /* component name */
    432     char name[OMX_MAX_STRINGNAME_SIZE];
    433 
    434     /* state lock */
    435     pthread_mutex_t state_block;
    436 
    437     OMX_U32 mMaxFrameWidth;
    438     OMX_U32 mMaxFrameHeight;
    439 
    440     /* omx specification version */
    441 #ifndef ANDROID
    442     const static OMX_U8 OMX_SPEC_VERSION_MAJOR = 1;
    443     const static OMX_U8 OMX_SPEC_VERSION_MINOR = 1;
    444     const static OMX_U8 OMX_SPEC_VERSION_REVISION = 2;
    445     const static OMX_U8 OMX_SPEC_VERSION_STEP = 0;
    446 #else
    447     const static OMX_U8 OMX_SPEC_VERSION_MAJOR = 1;
    448     const static OMX_U8 OMX_SPEC_VERSION_MINOR = 0;
    449     const static OMX_U8 OMX_SPEC_VERSION_REVISION = 0;
    450     const static OMX_U8 OMX_SPEC_VERSION_STEP = 0;
    451 #endif
    452 
    453     const static OMX_U32 OMX_SPEC_VERSION = 0
    454         | (OMX_SPEC_VERSION_MAJOR << 0)
    455         | (OMX_SPEC_VERSION_MINOR << 8)
    456         | (OMX_SPEC_VERSION_REVISION << 16)
    457         | (OMX_SPEC_VERSION_STEP << 24);
    458 };
    459 
    460 #endif /* __COMPONENTBASE_H */
    461