portbase.h revision 5170f7519e52abd32252552df72fa16b12651a39
1/* 2 * Copyright (C) 2009 Wind River Systems. 3 */ 4 5#ifndef __PORTBASE_H 6#define __PORTBASE_H 7 8#include <pthread.h> 9 10#include <OMX_Core.h> 11#include <OMX_Component.h> 12 13#include <list.h> 14#include <queue.h> 15 16class PortBase 17{ 18public: 19 /* 20 * constructor & destructor 21 */ 22 PortBase(); 23 PortBase(const OMX_PARAM_PORTDEFINITIONTYPE *param); 24 virtual ~PortBase(); 25 26 /* end of constructor & destructor */ 27 28 /* 29 * accessor 30 */ 31 /* owner */ 32 void SetOwner(OMX_COMPONENTTYPE *handle); 33 OMX_COMPONENTTYPE *GetOwner(void); 34 35 /* for ReturnThisBuffer() */ 36 OMX_ERRORTYPE SetCallbacks(OMX_HANDLETYPE hComponent, 37 OMX_CALLBACKTYPE *pCallbacks, 38 OMX_PTR pAppData); 39 /* end of accessor */ 40 41 /* 42 * component methods & helpers 43 */ 44 /* Get/SetParameter */ 45 OMX_ERRORTYPE SetPortDefinition(const OMX_PARAM_PORTDEFINITIONTYPE *p, 46 bool isclient); 47 const OMX_PARAM_PORTDEFINITIONTYPE *GetPortDefinition(void); 48 void SetPortParam( 49 const OMX_PARAM_PORTDEFINITIONTYPE *pComponentParameterStructure); 50 const OMX_PARAM_PORTDEFINITIONTYPE *GetPortParam(void); 51 /* audio parameter */ 52 void SetAudioPortParam( 53 const OMX_AUDIO_PARAM_PORTFORMATTYPE *pComponentParameterStructure); 54 const OMX_AUDIO_PARAM_PORTFORMATTYPE *GetAudioPortParam(void); 55 56 /* Use/Allocate/FreeBuffer */ 57 OMX_ERRORTYPE UseBuffer(OMX_BUFFERHEADERTYPE **ppBufferHdr, 58 OMX_U32 nPortIndex, 59 OMX_PTR pAppPrivate, 60 OMX_U32 nSizeBytes, 61 OMX_U8 *pBuffer); 62 OMX_ERRORTYPE AllocateBuffer(OMX_BUFFERHEADERTYPE **ppBuffer, 63 OMX_U32 nPortIndex, 64 OMX_PTR pAppPrivate, 65 OMX_U32 nSizeBytes); 66 OMX_ERRORTYPE FreeBuffer(OMX_U32 nPortIndex, 67 OMX_BUFFERHEADERTYPE *pBuffer); 68 69 /* 70 * called in ComponentBase::TransStateToLoaded(OMX_StateIdle) or 71 * in ComponentBase::TransStateToIdle(OMX_StateLoaded) 72 * wokeup by Use/Allocate/FreeBuffer 73 */ 74 void WaitPortBufferCompletion(void); 75 76 /* Empty/FillThisBuffer */ 77 OMX_ERRORTYPE PushThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer); 78 OMX_BUFFERHEADERTYPE *PopBuffer(void); 79 OMX_U32 BufferQueueLength(void); 80 81 /* Empty/FillBufferDone */ 82 OMX_ERRORTYPE ReturnThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer); 83 84 /* flush all buffers not under processing */ 85 OMX_ERRORTYPE FlushPort(void); 86 87 bool IsEnabled(void); 88 89 OMX_DIRTYPE GetPortDirection(void); 90 91 OMX_ERRORTYPE PushMark(OMX_MARKTYPE *mark); 92 OMX_MARKTYPE *PopMark(void); 93 94 /* end of component methods & helpers */ 95 96private: 97 /* common routines for constructor */ 98 void __PortBase(void); 99 100 /* 101 * component methods & helpers 102 */ 103 OMX_STATETYPE GetOwnerState(void); 104 105 /* end of component methods & helpers */ 106 107 /* buffer headers */ 108 struct list *buffer_hdrs; 109 OMX_U32 nr_buffer_hdrs; 110 bool buffer_hdrs_completion; /* Use/Allocate/FreeBuffer completion flag */ 111 pthread_mutex_t hdrs_lock; 112 pthread_cond_t hdrs_wait; 113 114 struct queue bufferq; 115 pthread_mutex_t bufferq_lock; 116 117 struct queue markq; 118 pthread_mutex_t markq_lock; 119 120 /* parameter */ 121 OMX_PARAM_PORTDEFINITIONTYPE *portdefinition; 122 OMX_PARAM_PORTDEFINITIONTYPE portparam; 123 OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam; 124 125 /* owner handle */ 126 OMX_COMPONENTTYPE *owner; 127 128 /* omx standard callbacks */ 129 OMX_PTR appdata; 130 OMX_CALLBACKTYPE *callbacks; 131}; 132 133#endif /* __PORTBASE_H */ 134