41 if (!omx_base_source_Private) {
79 int outBufExchanged = 0;
81 omx_base_source_Private->bellagioThreads->nThreadBufferMngtID = (
long int)syscall(__NR_gettid);
82 DEBUG(
DEB_LEV_SIMPLE_SEQ,
"In %s the thread ID is %i\n", __func__, (
int)omx_base_source_Private->bellagioThreads->nThreadBufferMngtID);
89 pthread_mutex_lock(&omx_base_source_Private->flush_mutex);
91 pthread_mutex_unlock(&omx_base_source_Private->flush_mutex);
102 tsem_up(omx_base_source_Private->flush_all_condition);
103 tsem_down(omx_base_source_Private->flush_condition);
104 pthread_mutex_lock(&omx_base_source_Private->flush_mutex);
106 pthread_mutex_unlock(&omx_base_source_Private->flush_mutex);
109 if((isOutputBufferNeeded==
OMX_TRUE && pOutputSem->semval==0) &&
112 tsem_down(omx_base_source_Private->bMgmtSem);
121 if(pOutputSem->semval > 0 && isOutputBufferNeeded ==
OMX_TRUE ) {
123 if(pOutputQueue->nelem>0){
126 pOutputBuffer =
dequeue(pOutputQueue);
127 if(pOutputBuffer == NULL){
136 pOutputBuffer->nFlags = 0;
139 if(omx_base_source_Private->pMark.hMarkTargetComponent != NULL){
140 pOutputBuffer->hMarkTargetComponent = omx_base_source_Private->pMark.hMarkTargetComponent;
141 pOutputBuffer->pMarkData = omx_base_source_Private->pMark.pMarkData;
142 omx_base_source_Private->pMark.hMarkTargetComponent = NULL;
143 omx_base_source_Private->pMark.pMarkData = NULL;
155 pOutputBuffer->pMarkData);
156 }
else if(pOutputBuffer->hMarkTargetComponent != NULL) {
162 if (omx_base_source_Private->BufferMgmtCallback && pOutputBuffer->nFilledLen == 0) {
163 (*(omx_base_source_Private->BufferMgmtCallback))(openmaxStandComp, pOutputBuffer);
166 pOutputBuffer->nFilledLen = 0;
169 DEBUG(
DEB_LEV_ERR,
"In %s Received Buffer in non-Executing State(%x)\n", __func__, (
int)omx_base_source_Private->state);
173 tsem_wait(omx_base_source_Private->bStateSem);
184 pOutputBuffer->nFlags,
187 omx_base_source_Private->bIsEOSReached =
OMX_TRUE;
193 DEBUG(
DEB_LEV_SIMPLE_SEQ,
"In %s nFlags=%x Name=%s \n", __func__, (
int)pOutputBuffer->nFlags, omx_base_source_Private->name);
196 pOutputBuffer = NULL;
221 int i,outBufExchanged[2];
229 pOutputBuffer[1]= pOutputBuffer[0]=NULL;
230 isOutputBufferNeeded[0]=isOutputBufferNeeded[1]=
OMX_TRUE;
231 outBufExchanged[0]=outBufExchanged[1]=0;
238 pthread_mutex_lock(&omx_base_source_Private->flush_mutex);
241 pthread_mutex_unlock(&omx_base_source_Private->flush_mutex);
243 DEBUG(
DEB_LEV_FULL_SEQ,
"In %s 1 signalling flush all cond iE=%d,iF=%d,oE=%d,oF=%d iSemVal=%d,oSemval=%d\n",
244 __func__,outBufExchanged[0],isOutputBufferNeeded[0],outBufExchanged[1],isOutputBufferNeeded[1],pOutputSem[0]->semval,pOutputSem[1]->semval);
248 outBufExchanged[1]--;
249 pOutputBuffer[1]=NULL;
256 outBufExchanged[0]--;
257 pOutputBuffer[0]=NULL;
262 DEBUG(
DEB_LEV_FULL_SEQ,
"In %s 2 signalling flush all cond iE=%d,iF=%d,oE=%d,oF=%d iSemVal=%d,oSemval=%d\n",
263 __func__,outBufExchanged[0],isOutputBufferNeeded[0],outBufExchanged[1],isOutputBufferNeeded[1],pOutputSem[0]->semval,pOutputSem[1]->semval);
265 tsem_up(omx_base_source_Private->flush_all_condition);
266 tsem_down(omx_base_source_Private->flush_condition);
267 pthread_mutex_lock(&omx_base_source_Private->flush_mutex);
269 pthread_mutex_unlock(&omx_base_source_Private->flush_mutex);
272 if((isOutputBufferNeeded[0]==
OMX_TRUE && pOutputSem[0]->semval==0) &&
276 tsem_down(omx_base_source_Private->bMgmtSem);
283 if((isOutputBufferNeeded[1]==
OMX_TRUE && pOutputSem[1]->semval==0) &&
288 tsem_down(omx_base_source_Private->bMgmtSem);
297 if(pOutputSem[0]->semval>0 && isOutputBufferNeeded[0]==
OMX_TRUE ) {
299 if(pOutputQueue[0]->nelem>0){
300 outBufExchanged[0]++;
302 pOutputBuffer[0] =
dequeue(pOutputQueue[0]);
303 if(pOutputBuffer[0] == NULL){
310 if(pOutputSem[1]->semval>0 && isOutputBufferNeeded[1]==
OMX_TRUE) {
312 if(pOutputQueue[1]->nelem>0){
313 outBufExchanged[1]++;
315 pOutputBuffer[1] =
dequeue(pOutputQueue[1]);
316 if(pOutputBuffer[1] == NULL){
317 DEBUG(
DEB_LEV_ERR,
"Had NULL output buffer!! op is=%d,iq=%d\n",pOutputSem[1]->semval,pOutputQueue[1]->nelem);
333 if(omx_base_source_Private->pMark.hMarkTargetComponent != NULL){
335 pOutputBuffer[i]->
pMarkData = omx_base_source_Private->pMark.pMarkData;
341 (*(omx_base_source_Private->callbacks->EventHandler))
343 omx_base_source_Private->callbackData,
348 }
else if(pOutputBuffer[i]->hMarkTargetComponent!=NULL){
354 if (omx_base_source_Private->BufferMgmtCallback && pOutputBuffer[i]->
nFilledLen == 0) {
355 (*(omx_base_source_Private->BufferMgmtCallback))(openmaxStandComp, pOutputBuffer[i]);
361 DEBUG(
DEB_LEV_ERR,
"In %s Received Buffer in non-Executing State(%x)\n", __func__, (
int)omx_base_source_Private->state);
364 if((pOutputBuffer[i]->nFlags &
OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS && pOutputBuffer[i]->nFilledLen==0) {
365 DEBUG(
DEB_LEV_FULL_SEQ,
"Detected EOS flags in input buffer filled len=%d\n", (
int)pOutputBuffer[i]->nFilledLen);
366 (*(omx_base_source_Private->callbacks->EventHandler))
368 omx_base_source_Private->callbackData,
380 if(pOutputBuffer[i]->nFilledLen!=0 || (pOutputBuffer[i]->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS){
382 outBufExchanged[i]--;
383 pOutputBuffer[i]=NULL;
391 if(omx_base_source_Private->pMark.hMarkTargetComponent != NULL){
392 omx_base_source_Private->pMark.hMarkTargetComponent = NULL;
393 omx_base_source_Private->pMark.pMarkData = NULL;
void tsem_wait(tsem_t *tsem)
OMX_ERRORTYPE omx_base_component_Constructor(OMX_COMPONENTTYPE *openmaxStandComp, OMX_STRING cComponentName)
The base constructor for the OpenMAX ST components.
OMX_TRANS_STATETYPE transientState
#define DEB_LEV_SIMPLE_SEQ
#define OMX_BASE_SOURCE_OUTPUTPORT_INDEX
#define DEBUG(n, fmt, args...)
void *(* BufferMgmtFunction)(void *param)
OMX_ERRORTYPE(* EventHandler)(OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_PTR pAppData, OMX_IN OMX_EVENTTYPE eEvent, OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, OMX_IN OMX_PTR pEventData)
OMX_CALLBACKTYPE * callbacks
#define OMX_BASE_SOURCE_OUTPUTPORT_INDEX_1
void tsem_up(tsem_t *tsem)
OMX_ERRORTYPE omx_base_source_Constructor(OMX_COMPONENTTYPE *openmaxStandComp, OMX_STRING cComponentName)
void tsem_down(tsem_t *tsem)
void * omx_base_source_twoport_BufferMgmtFunction(void *param)
OMX_ERRORTYPE omx_base_source_Destructor(OMX_COMPONENTTYPE *openmaxStandComp)
#define OMX_BUFFERFLAG_EOS
OMX_ERRORTYPE omx_base_component_Destructor(OMX_COMPONENTTYPE *openmaxStandComp)
The base destructor for ST OpenMAX components.
OMX_HANDLETYPE hMarkTargetComponent
OMX_PTR pComponentPrivate
#define DEB_LEV_FUNCTION_NAME
void * omx_base_source_BufferMgmtFunction(void *param)
OMX_ERRORTYPE(* ReturnBufferFunction)(omx_base_PortType *openmaxStandPort, OMX_BUFFERHEADERTYPE *pBuffer)
#define PORT_IS_BEING_FLUSHED(pPort)
void * dequeue(queue_t *queue)
OMX_PORT_PARAM_TYPE sPortTypesParam[4]