OpenMAXBellagio 0.9.3
omx_base_component.h
Go to the documentation of this file.
00001 
00026 #ifndef _OMX_BASE_COMPONENT_H_
00027 #define _OMX_BASE_COMPONENT_H_
00028 
00029 #include <stdlib.h>
00030 #include <pthread.h>
00031 #include <stdio.h>
00032 #include <string.h>
00033 #include <unistd.h>
00034 #include <errno.h>
00035 #include <asm/unistd.h>
00036 
00037 #ifdef ANDROID_COMPILATION
00038 #include <oscl_base_macros.h>
00039 #else
00040 #define OSCL_IMPORT_REF
00041 #define OSCL_EXPORT_REF
00042 #endif
00043 #include "omxcore.h"
00044 #include "OMXComponentRMExt.h"
00045 #include "tsemaphore.h"
00046 #include "queue.h"
00047 #include "omx_classmagic.h"
00048 #include "omx_base_port.h"
00049 #include "extension_struct.h"
00050 #include "omx_reference_resource_manager.h"
00051 
00052 
00054 #define DEFAULT_IN_BUFFER_SIZE  4 * 1024
00055 
00056 #define DEFAULT_OUT_BUFFER_SIZE 32 * 1024 /*16 * 1024 */ // TODO - check this size is ok
00057 
00058 #define DEFAULT_MIME_STRING_LENGTH 128
00059 
00060 #define NUM_DOMAINS 4
00061 
00062 #define OMX_BUFFERFLAG_KEY_FRAME 0x11000000
00063 
00064 typedef struct OMX_VENDOR_EXTRADATATYPE  {
00065   OMX_U32 nPortIndex;
00066   OMX_U32 nDataSize;   // Size of the supporting data to follow
00067   OMX_U8  *pData;     // Supporting data hint
00068 } OMX_VENDOR_EXTRADATATYPE;
00069 
00070 typedef struct OMX_VENDOR_PROP_TUNNELSETUPTYPE  {
00071   OMX_U32 nPortIndex;
00072   OMX_TUNNELSETUPTYPE nTunnelSetup;   // Tunnel setup flags
00073 } OMX_VENDOR_PROP_TUNNELSETUPTYPE;
00074 
00076 typedef enum OMX_INDEXVENDORTYPE {
00078     OMX_IndexVendorInputFilename = OMX_IndexVendorStartUnused+1,
00079     OMX_IndexVendorOutputFilename,
00080     OMX_IndexVendorCompPropTunnelFlags, /* Will use OMX_TUNNELSETUPTYPE structure*/
00081     OMX_IndexParameterThreadsID,
00082     OMX_VIDEO_CodingTheora
00083 } OMX_INDEXVENDORTYPE;
00084 
00086 typedef enum OMX_TRANS_STATETYPE {
00087     OMX_TransStateInvalid,
00088     OMX_TransStateLoadedToIdle,
00089     OMX_TransStateIdleToPause,
00090     OMX_TransStatePauseToExecuting,
00091     OMX_TransStateIdleToExecuting,
00092     OMX_TransStateExecutingToIdle,
00093     OMX_TransStateExecutingToPause,
00094     OMX_TransStatePauseToIdle,
00095     OMX_TransStateIdleToLoaded,
00096     OMX_TransStateMax = 0X7FFFFFFF
00097 } OMX_TRANS_STATETYPE;
00098 
00102 typedef enum INTERNAL_MESSAGE_TYPE {
00103   SENDCOMMAND_MSG_TYPE = 1,
00104   ERROR_MSG_TYPE,
00105   WARNING_MSG_TYPE 
00106 } INTERNAL_MESSAGE_TYPE;
00107 
00113 typedef struct internalRequestMessageType {
00114   int messageType; 
00115   int messageParam; 
00116   OMX_PTR pCmdData; 
00117 } internalRequestMessageType;
00118 
00122 CLASS(omx_base_component_PrivateType)
00123 #define omx_base_component_PrivateType_FIELDS \
00124     OMX_COMPONENTTYPE *openmaxStandComp;  \
00125     omx_base_PortType **ports;  \
00126     OMX_PORT_PARAM_TYPE sPortTypesParam[NUM_DOMAINS];  \
00127     char uniqueID;  \
00128     char* name; \
00129     OMX_STATETYPE state;  \
00130     OMX_TRANS_STATETYPE transientState;  \
00135     OMX_CALLBACKTYPE* callbacks;  \
00137     OMX_PTR callbackData; \
00139     queue_t* messageQueue;\
00140     tsem_t* messageSem;\
00141     OMX_U32 nGroupPriority; \
00142     OMX_U32 nGroupID; \
00143     OMX_PARAM_BELLAGIOTHREADS_ID* bellagioThreads;\
00144     OMX_BOOL bIsEOSReached;  \
00145     OMX_MARKTYPE pMark; \
00146     pthread_mutex_t flush_mutex;   \
00147     tsem_t* flush_all_condition;   \
00148     tsem_t* flush_condition;   \
00149     tsem_t* bMgmtSem;\
00150     tsem_t* bStateSem;\
00151     pthread_t messageHandlerThread;  \
00152     int bufferMgmtThreadID;  \
00153     pthread_t bufferMgmtThread;  \
00154     void *loader;  \
00155     void* (*BufferMgmtFunction)(void* param);  \
00156     OMX_ERRORTYPE (*messageHandler)(OMX_COMPONENTTYPE*,internalRequestMessageType*); \
00157     OMX_ERRORTYPE (*DoStateSet)(OMX_COMPONENTTYPE *openmaxStandComp, OMX_U32);  \
00158     OMX_ERRORTYPE (*destructor)(OMX_COMPONENTTYPE *openmaxStandComp);  \
00159     OMX_ERRORTYPE (*getQualityLevel)(OMX_COMPONENTTYPE *openmaxStandComp, OMX_U32* pQualityLevel);  \
00160     OMX_ERRORTYPE (*setQualityLevel)(OMX_COMPONENTTYPE *openmaxStandComp, OMX_U32 nQualityLevel);  \
00161     OMX_U32 nqualitylevels; \
00162     multiResourceDescriptor** multiResourceLevel; \
00163     int currentQualityLevel; 
00164 ENDCLASS(omx_base_component_PrivateType)
00165 
00166 void base_constructor_remove_garbage_collected(omx_base_component_PrivateType* omx_base_component_Private);
00167 
00184 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_Constructor(OMX_COMPONENTTYPE *openmaxStandComp,OMX_STRING cComponentName);
00185 
00193 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_Destructor(OMX_COMPONENTTYPE *openmaxStandComp);
00194 
00195 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_getQualityLevel(OMX_COMPONENTTYPE *openmaxStandComp, OMX_U32* pQualityLevel);
00196 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_setQualityLevel(OMX_COMPONENTTYPE *openmaxStandComp, OMX_U32 nQualityLevel);
00197 
00208 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_DoStateSet(
00209   OMX_COMPONENTTYPE *openmaxStandComp,
00210   OMX_U32 destinationState);
00211 
00223 OSCL_IMPORT_REF OMX_ERRORTYPE checkHeader(OMX_PTR header, OMX_U32 size);
00224 
00232 void setHeader(OMX_PTR header, OMX_U32 size);
00233 
00238 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_GetComponentVersion(
00239   OMX_HANDLETYPE hComponent,
00240   OMX_STRING pComponentName,
00241   OMX_VERSIONTYPE* pComponentVersion,
00242   OMX_VERSIONTYPE* pSpecVersion,
00243   OMX_UUIDTYPE* pComponentUUID);
00244 
00257 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_ComponentRoleEnum(
00258   OMX_HANDLETYPE hComponent,
00259   OMX_U8 *cRole,
00260   OMX_U32 nIndex);
00261 
00267 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_SetCallbacks(
00268   OMX_HANDLETYPE hComponent,
00269   OMX_CALLBACKTYPE* pCallbacks,
00270   OMX_PTR pAppData);
00271 
00278 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_GetParameter(
00279   OMX_HANDLETYPE hComponent,
00280   OMX_INDEXTYPE nParamIndex,
00281   OMX_PTR ComponentParameterStructure);
00282 
00291 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_SetParameter(
00292   OMX_HANDLETYPE hComponent,
00293   OMX_INDEXTYPE nParamIndex,
00294   OMX_PTR ComponentParameterStructure);
00295 
00303 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_GetConfig(
00304   OMX_HANDLETYPE hComponent,
00305   OMX_INDEXTYPE nIndex,
00306   OMX_PTR pComponentConfigStructure);
00307 
00315 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_SetConfig(
00316   OMX_HANDLETYPE hComponent,
00317   OMX_INDEXTYPE nIndex,
00318   OMX_PTR pComponentConfigStructure);
00319 
00325 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_GetExtensionIndex(
00326   OMX_HANDLETYPE hComponent,
00327   OMX_STRING cParameterName,
00328   OMX_INDEXTYPE* pIndexType);
00329 
00334 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_GetState(
00335   OMX_HANDLETYPE hComponent,
00336   OMX_STATETYPE* pState);
00337 
00343 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_SendCommand(
00344   OMX_HANDLETYPE hComponent,
00345   OMX_COMMANDTYPE Cmd,
00346   OMX_U32 nParam,
00347   OMX_PTR pCmdData);
00348 
00357 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_ComponentDeInit(
00358   OMX_HANDLETYPE hComponent);
00359 
00366 void* compMessageHandlerFunction(void*);
00367 
00379 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_MessageHandler(OMX_COMPONENTTYPE *openmaxStandComp,internalRequestMessageType* message);
00380 
00384 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_ParameterSanityCheck(
00385   OMX_HANDLETYPE hComponent,
00386   OMX_U32 nPortIndex,
00387   OMX_PTR pStructure,
00388   size_t size);
00389 
00390 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_AllocateBuffer(
00391   OMX_HANDLETYPE hComponent,
00392   OMX_BUFFERHEADERTYPE** ppBuffer,
00393   OMX_U32 nPortIndex,
00394   OMX_PTR pAppPrivate,
00395   OMX_U32 nSizeBytes);
00396 
00397 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_UseBuffer(
00398   OMX_HANDLETYPE hComponent,
00399   OMX_BUFFERHEADERTYPE** ppBufferHdr,
00400   OMX_U32 nPortIndex,
00401   OMX_PTR pAppPrivate,
00402   OMX_U32 nSizeBytes,
00403   OMX_U8* pBuffer);
00404 
00405 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_UseEGLImage (
00406   OMX_HANDLETYPE hComponent,
00407   OMX_BUFFERHEADERTYPE** ppBufferHdr,
00408   OMX_U32 nPortIndex,
00409   OMX_PTR pAppPrivate,
00410   void* eglImage);
00411 
00412 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_FreeBuffer(
00413   OMX_HANDLETYPE hComponent,
00414   OMX_U32 nPortIndex,
00415   OMX_BUFFERHEADERTYPE* pBuffer);
00416 
00417 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_EmptyThisBuffer(
00418   OMX_HANDLETYPE hComponent,
00419   OMX_BUFFERHEADERTYPE* pBuffer);
00420 
00421 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_FillThisBuffer(
00422   OMX_HANDLETYPE hComponent,
00423   OMX_BUFFERHEADERTYPE* pBuffer);
00424 
00425 OSCL_IMPORT_REF OMX_ERRORTYPE omx_base_component_ComponentTunnelRequest(
00426   OMX_HANDLETYPE hComp,
00427   OMX_U32 nPort,
00428   OMX_HANDLETYPE hTunneledComp,
00429   OMX_U32 nTunneledPort,
00430   OMX_TUNNELSETUPTYPE* pTunnelSetup);
00431 
00432 #endif