portbase.h revision e4197969e018f1f455d8a99ebabd51994b150506
1/* 2 * Copyright (C) 2009 Wind River Systems 3 * Author: Ho-Eun Ryu <ho-eun.ryu@windriver.com> 4 */ 5 6#ifndef __PORTBASE_H 7#define __PORTBASE_H 8 9#include <pthread.h> 10 11#include <OMX_Core.h> 12#include <OMX_Component.h> 13 14#include <list.h> 15#include <queue.h> 16 17class PortBase 18{ 19public: 20 /* 21 * constructor & destructor 22 */ 23 PortBase(); 24 PortBase(const OMX_PARAM_PORTDEFINITIONTYPE *portdefinition); 25 virtual ~PortBase(); 26 27 /* end of constructor & destructor */ 28 29 /* 30 * accessor 31 */ 32 /* owner */ 33 void SetOwner(OMX_COMPONENTTYPE *handle); 34 OMX_COMPONENTTYPE *GetOwner(void); 35 36 /* for ReturnThisBuffer() */ 37 OMX_ERRORTYPE SetCallbacks(OMX_HANDLETYPE hComponent, 38 OMX_CALLBACKTYPE *pCallbacks, 39 OMX_PTR pAppData); 40 /* end of accessor */ 41 42 /* 43 * component methods & helpers 44 */ 45 /* Get/SetParameter */ 46 OMX_ERRORTYPE SetPortDefinition(const OMX_PARAM_PORTDEFINITIONTYPE *p, 47 bool overwrite_readonly); 48 const OMX_PARAM_PORTDEFINITIONTYPE *GetPortDefinition(void); 49 /* audio parameter */ 50 void SetAudioPortParam( 51 const OMX_AUDIO_PARAM_PORTFORMATTYPE *pComponentParameterStructure); 52 const OMX_AUDIO_PARAM_PORTFORMATTYPE *GetAudioPortParam(void); 53 54 /* Use/Allocate/FreeBuffer */ 55 OMX_ERRORTYPE UseBuffer(OMX_BUFFERHEADERTYPE **ppBufferHdr, 56 OMX_U32 nPortIndex, 57 OMX_PTR pAppPrivate, 58 OMX_U32 nSizeBytes, 59 OMX_U8 *pBuffer); 60 OMX_ERRORTYPE AllocateBuffer(OMX_BUFFERHEADERTYPE **ppBuffer, 61 OMX_U32 nPortIndex, 62 OMX_PTR pAppPrivate, 63 OMX_U32 nSizeBytes); 64 OMX_ERRORTYPE FreeBuffer(OMX_U32 nPortIndex, 65 OMX_BUFFERHEADERTYPE *pBuffer); 66 67 /* 68 * called in ComponentBase::TransStateToLoaded(OMX_StateIdle) or 69 * in ComponentBase::TransStateToIdle(OMX_StateLoaded) 70 * wokeup by Use/Allocate/FreeBuffer 71 */ 72 void WaitPortBufferCompletion(void); 73 74 /* Empty/FillThisBuffer */ 75 OMX_ERRORTYPE PushThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer); 76 /* push buffer at head */ 77 OMX_ERRORTYPE RetainThisBuffer(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 /* SendCommand(OMX_CommandPortDisable/Enable) */ 95 OMX_ERRORTYPE TransState(OMX_U8 state); 96 97 /* end of component methods & helpers */ 98 99 /* TransState, state */ 100 static const OMX_U8 OMX_PortDisabled = 0; 101 static const OMX_U8 OMX_PortEnabled = 1; 102 103private: 104 /* common routines for constructor */ 105 void __PortBase(void); 106 107 /* 108 * component methods & helpers 109 */ 110 OMX_STATETYPE GetOwnerState(void); 111 112 /* end of component methods & helpers */ 113 114 /* buffer headers */ 115 struct list *buffer_hdrs; 116 OMX_U32 nr_buffer_hdrs; 117 bool buffer_hdrs_completion; /* Use/Allocate/FreeBuffer completion flag */ 118 pthread_mutex_t hdrs_lock; 119 pthread_cond_t hdrs_wait; 120 121 struct queue bufferq; 122 pthread_mutex_t bufferq_lock; 123 124 struct queue markq; 125 pthread_mutex_t markq_lock; 126 127 /* state */ 128 OMX_U8 state; 129 pthread_mutex_t state_lock; 130 131 /* parameter */ 132 OMX_PARAM_PORTDEFINITIONTYPE portdefinition; 133 /* room for portdefinition.format.*.cMIMEType */ 134 char definition_format_mimetype[OMX_MAX_STRINGNAME_SIZE]; 135 136 OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam; 137 138 /* owner handle */ 139 OMX_COMPONENTTYPE *owner; 140 141 /* omx standard callbacks */ 142 OMX_PTR appdata; 143 OMX_CALLBACKTYPE *callbacks; 144}; 145 146/* end of PortBase */ 147 148#endif /* __PORTBASE_H */ 149