1 /* 2 * portbase.h, port 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 __PORTBASE_H 20 #define __PORTBASE_H 21 22 #include <pthread.h> 23 24 #include <OMX_Core.h> 25 #include <OMX_Component.h> 26 27 #include <list.h> 28 #include <queue.h> 29 30 typedef OMX_U8* CustomMemAlloc(OMX_U32 nSizeBytes, OMX_PTR pUserData); 31 typedef void CustomMemFree(OMX_U8 *pBuffer, OMX_PTR pUserData); 32 33 class PortBase 34 { 35 public: 36 /* 37 * constructor & destructor 38 */ 39 PortBase(); 40 PortBase(const OMX_PARAM_PORTDEFINITIONTYPE *portdefinition); 41 virtual ~PortBase(); 42 43 /* end of constructor & destructor */ 44 45 /* 46 * accessor 47 */ 48 /* owner */ 49 void SetOwner(OMX_COMPONENTTYPE *handle); 50 OMX_COMPONENTTYPE *GetOwner(void); 51 52 /* for ReturnThisBuffer() */ 53 OMX_ERRORTYPE SetCallbacks(OMX_HANDLETYPE hComponent, 54 OMX_CALLBACKTYPE *pCallbacks, 55 OMX_PTR pAppData); 56 /* end of accessor */ 57 58 OMX_ERRORTYPE SetMemAllocator(CustomMemAlloc *pMemAlloc, CustomMemFree *pMemFree, OMX_PTR pUserData); 59 60 /* set port buffer alignment, nAlignment=0 means alignment disabled */ 61 OMX_ERRORTYPE SetMemAlignment(OMX_U32 nAlignment); 62 63 /* 64 * component methods & helpers 65 */ 66 /* Get/SetParameter */ 67 OMX_ERRORTYPE SetPortDefinition(const OMX_PARAM_PORTDEFINITIONTYPE *p, 68 bool overwrite_readonly); 69 const OMX_PARAM_PORTDEFINITIONTYPE *GetPortDefinition(void); 70 71 /* Use/Allocate/FreeBuffer */ 72 OMX_ERRORTYPE UseBuffer(OMX_BUFFERHEADERTYPE **ppBufferHdr, 73 OMX_U32 nPortIndex, 74 OMX_PTR pAppPrivate, 75 OMX_U32 nSizeBytes, 76 OMX_U8 *pBuffer); 77 OMX_ERRORTYPE AllocateBuffer(OMX_BUFFERHEADERTYPE **ppBuffer, 78 OMX_U32 nPortIndex, 79 OMX_PTR pAppPrivate, 80 OMX_U32 nSizeBytes); 81 OMX_ERRORTYPE FreeBuffer(OMX_U32 nPortIndex, 82 OMX_BUFFERHEADERTYPE *pBuffer); 83 84 /* 85 * called in ComponentBase::TransStateToLoaded(OMX_StateIdle) or 86 * in ComponentBase::TransStateToIdle(OMX_StateLoaded) 87 * wokeup by Use/Allocate/FreeBuffer 88 */ 89 void WaitPortBufferCompletion(void); 90 91 OMX_ERRORTYPE WaitPortBufferCompletionTimeout(int64_t mSec); 92 /* Empty/FillThisBuffer */ 93 OMX_ERRORTYPE PushThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer); 94 OMX_BUFFERHEADERTYPE *PopBuffer(void); 95 OMX_U32 BufferQueueLength(void); 96 OMX_U32 RetainedBufferQueueLength(void); 97 98 /* Empty/FillBufferDone */ 99 OMX_ERRORTYPE ReturnThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer); 100 101 OMX_ERRORTYPE RetainAndReturnBuffer(OMX_BUFFERHEADERTYPE *pRetain, OMX_BUFFERHEADERTYPE *pReturn); 102 103 /* retain buffer */ 104 OMX_ERRORTYPE RetainThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer, 105 bool accumulate); 106 /* 107 * components have responsibilty of calling this function to return all 108 * accumulated buffers to omx-il clients. 109 */ 110 void ReturnAllRetainedBuffers(void); 111 void ReturnOneRetainedBuffer(void); 112 113 /* flush all buffers not under processing */ 114 OMX_ERRORTYPE FlushPort(void); 115 116 bool IsEnabled(void); 117 118 OMX_DIRTYPE GetPortDirection(void); 119 OMX_U32 GetPortBufferCount(void); 120 121 OMX_ERRORTYPE PushMark(OMX_MARKTYPE *mark); 122 OMX_MARKTYPE *PopMark(void); 123 124 /* SendCommand(OMX_CommandPortDisable/Enable) */ 125 OMX_ERRORTYPE TransState(OMX_U8 state); 126 127 /* EventHandler(OMX_EventPortSettingChanged) */ 128 OMX_ERRORTYPE ReportPortSettingsChanged(void); 129 OMX_ERRORTYPE ReportOutputCrop(void); 130 /* get frame size */ 131 OMX_U32 getFrameBufSize(OMX_COLOR_FORMATTYPE colorFormat, OMX_U32 width, OMX_U32 height); 132 133 /* end of component methods & helpers */ 134 135 /* TransState, state */ 136 static const OMX_U8 OMX_PortDisabled = 0; 137 static const OMX_U8 OMX_PortEnabled = 1; 138 139 private: 140 /* common routines for constructor */ 141 void __PortBase(void); 142 143 /* 144 * component methods & helpers 145 */ 146 OMX_STATETYPE GetOwnerState(void); 147 148 /* end of component methods & helpers */ 149 150 /* buffer headers */ 151 struct list *buffer_hdrs; 152 OMX_U32 nr_buffer_hdrs; 153 bool buffer_hdrs_completion; /* Use/Allocate/FreeBuffer completion flag */ 154 pthread_mutex_t hdrs_lock; 155 pthread_cond_t hdrs_wait; 156 157 struct queue bufferq; 158 pthread_mutex_t bufferq_lock; 159 160 /* retained buffers (only accumulated buffer) */ 161 struct queue retainedbufferq; 162 pthread_mutex_t retainedbufferq_lock; 163 164 struct queue markq; 165 pthread_mutex_t markq_lock; 166 167 /* state */ 168 OMX_U8 state; 169 pthread_mutex_t state_lock; 170 171 CustomMemAlloc *custom_mem_alloc; 172 CustomMemFree *custom_mem_free; 173 OMX_PTR custom_mem_userdata; 174 175 OMX_U32 mem_alignment; 176 177 /* parameter */ 178 OMX_PARAM_PORTDEFINITIONTYPE portdefinition; 179 /* room for portdefinition.format.*.cMIMEType */ 180 char definition_format_mimetype[OMX_MAX_STRINGNAME_SIZE]; 181 182 OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam; 183 184 /* owner handle */ 185 OMX_COMPONENTTYPE *owner; 186 187 /* omx standard callbacks */ 188 OMX_PTR appdata; 189 OMX_CALLBACKTYPE *callbacks; 190 191 /* wrs component handle */ 192 class ComponentBase *cbase; 193 194 /* Input port size limit. The limit is set to be the size of a 1080P 4:4:4 raw image size, 195 which is 1920x1080x3. */ 196 enum { 197 MAX_INPUT_PORT_SIZE = 6220800 198 }; 199 }; 200 201 /* end of PortBase */ 202 203 #endif /* __PORTBASE_H */ 204