portbase.h revision f4ab90019707fb84477f62dd3093eaff0ac466eb
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 50 /* Use/Allocate/FreeBuffer */ 51 OMX_ERRORTYPE UseBuffer(OMX_BUFFERHEADERTYPE **ppBufferHdr, 52 OMX_U32 nPortIndex, 53 OMX_PTR pAppPrivate, 54 OMX_U32 nSizeBytes, 55 OMX_U8 *pBuffer); 56 OMX_ERRORTYPE AllocateBuffer(OMX_BUFFERHEADERTYPE **ppBuffer, 57 OMX_U32 nPortIndex, 58 OMX_PTR pAppPrivate, 59 OMX_U32 nSizeBytes); 60 OMX_ERRORTYPE FreeBuffer(OMX_U32 nPortIndex, 61 OMX_BUFFERHEADERTYPE *pBuffer); 62 63 /* 64 * called in ComponentBase::TransStateToLoaded(OMX_StateIdle) or 65 * in ComponentBase::TransStateToIdle(OMX_StateLoaded) 66 * wokeup by Use/Allocate/FreeBuffer 67 */ 68 void WaitPortBufferCompletion(void); 69 70 /* Empty/FillThisBuffer */ 71 OMX_ERRORTYPE PushThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer); 72 /* push buffer at head */ 73 OMX_ERRORTYPE RetainThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer); 74 OMX_BUFFERHEADERTYPE *PopBuffer(void); 75 OMX_U32 BufferQueueLength(void); 76 77 /* Empty/FillBufferDone */ 78 OMX_ERRORTYPE ReturnThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer); 79 80 /* flush all buffers not under processing */ 81 OMX_ERRORTYPE FlushPort(void); 82 83 bool IsEnabled(void); 84 85 OMX_DIRTYPE GetPortDirection(void); 86 87 OMX_ERRORTYPE PushMark(OMX_MARKTYPE *mark); 88 OMX_MARKTYPE *PopMark(void); 89 90 /* SendCommand(OMX_CommandPortDisable/Enable) */ 91 OMX_ERRORTYPE TransState(OMX_U8 state); 92 93 /* end of component methods & helpers */ 94 95 /* TransState, state */ 96 static const OMX_U8 OMX_PortDisabled = 0; 97 static const OMX_U8 OMX_PortEnabled = 1; 98 99private: 100 /* common routines for constructor */ 101 void __PortBase(void); 102 103 /* 104 * component methods & helpers 105 */ 106 OMX_STATETYPE GetOwnerState(void); 107 108 /* end of component methods & helpers */ 109 110 /* buffer headers */ 111 struct list *buffer_hdrs; 112 OMX_U32 nr_buffer_hdrs; 113 bool buffer_hdrs_completion; /* Use/Allocate/FreeBuffer completion flag */ 114 pthread_mutex_t hdrs_lock; 115 pthread_cond_t hdrs_wait; 116 117 struct queue bufferq; 118 pthread_mutex_t bufferq_lock; 119 120 struct queue markq; 121 pthread_mutex_t markq_lock; 122 123 /* state */ 124 OMX_U8 state; 125 pthread_mutex_t state_lock; 126 127 /* parameter */ 128 OMX_PARAM_PORTDEFINITIONTYPE portdefinition; 129 /* room for portdefinition.format.*.cMIMEType */ 130 char definition_format_mimetype[OMX_MAX_STRINGNAME_SIZE]; 131 132 OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam; 133 134 /* owner handle */ 135 OMX_COMPONENTTYPE *owner; 136 137 /* omx standard callbacks */ 138 OMX_PTR appdata; 139 OMX_CALLBACKTYPE *callbacks; 140}; 141 142/* end of PortBase */ 143 144#endif /* __PORTBASE_H */ 145