00001
00030 #ifndef _OMX_BASE_COMPONENT_H_
00031 #define _OMX_BASE_COMPONENT_H_
00032
00033 #include <pthread.h>
00034
00035 #include "tsemaphore.h"
00036 #include "queue.h"
00037 #include "omx_classmagic.h"
00038 #include <omx_base_port.h>
00039
00041 #define DEFAULT_IN_BUFFER_SIZE 4 * 1024
00042
00043 #define DEFAULT_OUT_BUFFER_SIZE 32 * 1024 // TODO - check this size is ok
00044
00045 #define DEFAULT_MIME_STRING_LENGTH 128
00046
00047 #define NUM_DOMAINS 4
00048
00049
00050 #define IS_COMPONENT_DEINIT(component_Private, exit_condition) \
00051 pthread_mutex_lock(&component_Private->exit_mutex) ,\
00052 exit_condition = component_Private->bIsComponentDeinit ,\
00053 pthread_mutex_unlock(&component_Private->exit_mutex) ,\
00054 (exit_condition == OMX_TRUE) ? OMX_TRUE:OMX_FALSE \
00055
00056 typedef struct OMX_VENDOR_EXTRADATATYPE {
00057 OMX_U32 nPortIndex;
00058 OMX_U32 nDataSize;
00059 OMX_U8 *pData;
00060 } OMX_VENDOR_EXTRADATATYPE;
00061
00063 typedef enum OMX_INDEXVENDORTYPE {
00065 OMX_IndexVendorFileReadInputFilename = 0xFF000001,
00066 OMX_IndexVendorParser3gpInputFilename = 0xFF000002,
00067 OMX_IndexVendorVideoExtraData = 0xFF000003,
00068 OMX_IndexVendorAudioExtraData = 0xFF000004,
00069 } OMX_INDEXVENDORTYPE;
00070
00072 typedef enum OMX_TRANS_STATETYPE {
00073 OMX_TransStateInvalid,
00074 OMX_TransStateLoadedToIdle,
00075 OMX_TransStateIdleToPause,
00076 OMX_TransStatePauseToExecuting,
00077 OMX_TransStateIdleToExecuting,
00078 OMX_TransStateExecutingToIdle,
00079 OMX_TransStateExecutingToPause,
00080 OMX_TransStatePauseToIdle,
00081 OMX_TransStateIdleToLoaded,
00082 OMX_TransStateMax = 0X7FFFFFFF
00083 } OMX_TRANS_STATETYPE;
00084
00088 typedef enum INTERNAL_MESSAGE_TYPE {
00089 SENDCOMMAND_MSG_TYPE = 1,
00090 ERROR_MSG_TYPE,
00091 WARNING_MSG_TYPE
00092 } INTERNAL_MESSAGE_TYPE;
00093
00099 typedef struct internalRequestMessageType {
00100 int messageType;
00101 int messageParam;
00102 OMX_PTR pCmdData;
00103 } internalRequestMessageType;
00104
00108 CLASS(omx_base_component_PrivateType)
00109 #define omx_base_component_PrivateType_FIELDS \
00110 OMX_COMPONENTTYPE *openmaxStandComp; \
00111 omx_base_PortType **ports; \
00112 OMX_PORT_PARAM_TYPE sPortTypesParam[NUM_DOMAINS]; \
00113 char uniqueID; \
00114 char* name; \
00115 OMX_STATETYPE state; \
00116 OMX_TRANS_STATETYPE transientState; \
00121 OMX_CALLBACKTYPE* callbacks; \
00123 OMX_PTR callbackData; \
00125 queue_t* messageQueue;\
00126 tsem_t* messageSem;\
00127 OMX_U32 nGroupPriority; \
00128 OMX_U32 nGroupID; \
00129 OMX_MARKTYPE *pMark; \
00130 pthread_mutex_t flush_mutex; \
00131 pthread_cond_t flush_all_condition; \
00132 pthread_cond_t flush_condition; \
00133 tsem_t* bMgmtSem;\
00134 tsem_t* bStateSem;\
00135 int messageHandlerThreadID; \
00136 pthread_t messageHandlerThread; \
00137 int bufferMgmtThreadID; \
00138 pthread_t bufferMgmtThread; \
00139 void *loader; \
00140 void* (*BufferMgmtFunction)(void* param); \
00141 OMX_ERRORTYPE (*messageHandler)(OMX_COMPONENTTYPE*,internalRequestMessageType*); \
00142 OMX_ERRORTYPE (*DoStateSet)(OMX_COMPONENTTYPE *openmaxStandComp, OMX_U32); \
00143 OMX_ERRORTYPE (*destructor)(OMX_COMPONENTTYPE *openmaxStandComp);
00144 ENDCLASS(omx_base_component_PrivateType)
00145
00162 OMX_ERRORTYPE omx_base_component_Constructor(OMX_COMPONENTTYPE *openmaxStandComp,OMX_STRING cComponentName);
00163
00171 OMX_ERRORTYPE omx_base_component_Destructor(OMX_COMPONENTTYPE *openmaxStandComp);
00172
00183 OMX_ERRORTYPE omx_base_component_DoStateSet(
00184 OMX_COMPONENTTYPE *openmaxStandComp,
00185 OMX_U32 destinationState);
00186
00198 OMX_ERRORTYPE checkHeader(OMX_PTR header, OMX_U32 size);
00199
00207 void setHeader(OMX_PTR header, OMX_U32 size);
00208
00213 OMX_ERRORTYPE omx_base_component_GetComponentVersion(OMX_IN OMX_HANDLETYPE hComponent,
00214 OMX_OUT OMX_STRING pComponentName,
00215 OMX_OUT OMX_VERSIONTYPE* pComponentVersion,
00216 OMX_OUT OMX_VERSIONTYPE* pSpecVersion,
00217 OMX_OUT OMX_UUIDTYPE* pComponentUUID);
00218
00231 OMX_ERRORTYPE omx_base_component_ComponentRoleEnum(
00232 OMX_IN OMX_HANDLETYPE hComponent,
00233 OMX_OUT OMX_U8 *cRole,
00234 OMX_IN OMX_U32 nIndex);
00235
00241 OMX_ERRORTYPE omx_base_component_SetCallbacks(
00242 OMX_IN OMX_HANDLETYPE hComponent,
00243 OMX_IN OMX_CALLBACKTYPE* pCallbacks,
00244 OMX_IN OMX_PTR pAppData);
00245
00252 OMX_ERRORTYPE omx_base_component_GetParameter(
00253 OMX_IN OMX_HANDLETYPE hComponent,
00254 OMX_IN OMX_INDEXTYPE nParamIndex,
00255 OMX_INOUT OMX_PTR ComponentParameterStructure);
00256
00265 OMX_ERRORTYPE omx_base_component_SetParameter(
00266 OMX_IN OMX_HANDLETYPE hComponent,
00267 OMX_IN OMX_INDEXTYPE nParamIndex,
00268 OMX_IN OMX_PTR ComponentParameterStructure);
00269
00277 OMX_ERRORTYPE omx_base_component_GetConfig(
00278 OMX_IN OMX_HANDLETYPE hComponent,
00279 OMX_IN OMX_INDEXTYPE nIndex,
00280 OMX_INOUT OMX_PTR pComponentConfigStructure);
00281
00289 OMX_ERRORTYPE omx_base_component_SetConfig(
00290 OMX_IN OMX_HANDLETYPE hComponent,
00291 OMX_IN OMX_INDEXTYPE nIndex,
00292 OMX_IN OMX_PTR pComponentConfigStructure);
00293
00299 OMX_ERRORTYPE omx_base_component_GetExtensionIndex(
00300 OMX_IN OMX_HANDLETYPE hComponent,
00301 OMX_IN OMX_STRING cParameterName,
00302 OMX_OUT OMX_INDEXTYPE* pIndexType);
00303
00308 OMX_ERRORTYPE omx_base_component_GetState(
00309 OMX_IN OMX_HANDLETYPE hComponent,
00310 OMX_OUT OMX_STATETYPE* pState);
00311
00317 OMX_ERRORTYPE omx_base_component_SendCommand(
00318 OMX_IN OMX_HANDLETYPE hComponent,
00319 OMX_IN OMX_COMMANDTYPE Cmd,
00320 OMX_IN OMX_U32 nParam,
00321 OMX_IN OMX_PTR pCmdData);
00322
00331 OMX_ERRORTYPE omx_base_component_ComponentDeInit(
00332 OMX_IN OMX_HANDLETYPE hComponent);
00333
00340 void* compMessageHandlerFunction(void*);
00341
00353 OMX_ERRORTYPE omx_base_component_MessageHandler(OMX_COMPONENTTYPE *openmaxStandComp,internalRequestMessageType* message);
00354
00358 OMX_ERRORTYPE omx_base_component_ParameterSanityCheck(
00359 OMX_IN OMX_HANDLETYPE hComponent,
00360 OMX_IN OMX_U32 nPortIndex,
00361 OMX_IN OMX_PTR pStructure,
00362 OMX_IN size_t size);
00363
00364 OMX_ERRORTYPE omx_base_component_AllocateBuffer(
00365 OMX_IN OMX_HANDLETYPE hComponent,
00366 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer,
00367 OMX_IN OMX_U32 nPortIndex,
00368 OMX_IN OMX_PTR pAppPrivate,
00369 OMX_IN OMX_U32 nSizeBytes);
00370
00371 OMX_ERRORTYPE omx_base_component_UseBuffer(
00372 OMX_IN OMX_HANDLETYPE hComponent,
00373 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
00374 OMX_IN OMX_U32 nPortIndex,
00375 OMX_IN OMX_PTR pAppPrivate,
00376 OMX_IN OMX_U32 nSizeBytes,
00377 OMX_IN OMX_U8* pBuffer);
00378
00379 OMX_ERRORTYPE omx_base_component_UseEGLImage (
00380 OMX_IN OMX_HANDLETYPE hComponent,
00381 OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
00382 OMX_IN OMX_U32 nPortIndex,
00383 OMX_IN OMX_PTR pAppPrivate,
00384 OMX_IN void* eglImage);
00385
00386 OMX_ERRORTYPE omx_base_component_FreeBuffer(
00387 OMX_IN OMX_HANDLETYPE hComponent,
00388 OMX_IN OMX_U32 nPortIndex,
00389 OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
00390
00391 OMX_ERRORTYPE omx_base_component_EmptyThisBuffer(
00392 OMX_IN OMX_HANDLETYPE hComponent,
00393 OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
00394
00395 OMX_ERRORTYPE omx_base_component_FillThisBuffer(
00396 OMX_IN OMX_HANDLETYPE hComponent,
00397 OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
00398
00399 OMX_ERRORTYPE omx_base_component_ComponentTunnelRequest(
00400 OMX_IN OMX_HANDLETYPE hComp,
00401 OMX_IN OMX_U32 nPort,
00402 OMX_IN OMX_HANDLETYPE hTunneledComp,
00403 OMX_IN OMX_U32 nTunneledPort,
00404 OMX_INOUT OMX_TUNNELSETUPTYPE* pTunnelSetup);
00405
00406 #endif