41 if (!omx_base_source_Private) {
79 int outBufExchanged = 0;
82 omx_base_source_Private->bellagioThreads->nThreadBufferMngtID = (
long int)syscall(__NR_gettid);
83 DEBUG(
DEB_LEV_SIMPLE_SEQ,
"In %s the thread ID is %i\n", __func__, (
int)omx_base_source_Private->bellagioThreads->nThreadBufferMngtID);
91 pthread_mutex_lock(&omx_base_source_Private->flush_mutex);
93 pthread_mutex_unlock(&omx_base_source_Private->flush_mutex);
104 tsem_up(omx_base_source_Private->flush_all_condition);
105 tsem_down(omx_base_source_Private->flush_condition);
106 pthread_mutex_lock(&omx_base_source_Private->flush_mutex);
108 pthread_mutex_unlock(&omx_base_source_Private->flush_mutex);
111 if((isOutputBufferNeeded==
OMX_TRUE && pOutputSem->semval==0) &&
114 tsem_down(omx_base_source_Private->bMgmtSem);
123 if(pOutputSem->semval > 0 && isOutputBufferNeeded ==
OMX_TRUE ) {
125 if(pOutputQueue->nelem>0){
128 pOutputBuffer =
dequeue(pOutputQueue);
129 if(pOutputBuffer == NULL){
138 pOutputBuffer->nFlags = 0;
141 if(omx_base_source_Private->pMark.hMarkTargetComponent != NULL){
142 pOutputBuffer->hMarkTargetComponent = omx_base_source_Private->pMark.hMarkTargetComponent;
143 pOutputBuffer->pMarkData = omx_base_source_Private->pMark.pMarkData;
144 omx_base_source_Private->pMark.hMarkTargetComponent = NULL;
145 omx_base_source_Private->pMark.pMarkData = NULL;
157 pOutputBuffer->pMarkData);
158 }
else if(pOutputBuffer->hMarkTargetComponent != NULL) {
164 if (omx_base_source_Private->BufferMgmtCallback && pOutputBuffer->nFilledLen == 0) {
165 (*(omx_base_source_Private->BufferMgmtCallback))(openmaxStandComp, pOutputBuffer);
168 pOutputBuffer->nFilledLen = 0;
171 DEBUG(
DEB_LEV_ERR,
"In %s Received Buffer in non-Executing State(%x)\n", __func__, (
int)omx_base_source_Private->state);
175 tsem_wait(omx_base_source_Private->bStateSem);
186 pOutputBuffer->nFlags,
189 omx_base_source_Private->bIsEOSReached =
OMX_TRUE;
195 DEBUG(
DEB_LEV_SIMPLE_SEQ,
"In %s nFlags=%x Name=%s \n", __func__, (
int)pOutputBuffer->nFlags, omx_base_source_Private->name);
198 pOutputBuffer = NULL;
223 int i,outBufExchanged[2];
231 pOutputBuffer[1]= pOutputBuffer[0]=NULL;
232 isOutputBufferNeeded[0]=isOutputBufferNeeded[1]=
OMX_TRUE;
233 outBufExchanged[0]=outBufExchanged[1]=0;
240 pthread_mutex_lock(&omx_base_source_Private->flush_mutex);
243 pthread_mutex_unlock(&omx_base_source_Private->flush_mutex);
245 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",
246 __func__,outBufExchanged[0],isOutputBufferNeeded[0],outBufExchanged[1],isOutputBufferNeeded[1],pOutputSem[0]->semval,pOutputSem[1]->semval);
250 outBufExchanged[1]--;
251 pOutputBuffer[1]=NULL;
258 outBufExchanged[0]--;
259 pOutputBuffer[0]=NULL;
264 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",
265 __func__,outBufExchanged[0],isOutputBufferNeeded[0],outBufExchanged[1],isOutputBufferNeeded[1],pOutputSem[0]->semval,pOutputSem[1]->semval);
267 tsem_up(omx_base_source_Private->flush_all_condition);
268 tsem_down(omx_base_source_Private->flush_condition);
269 pthread_mutex_lock(&omx_base_source_Private->flush_mutex);
271 pthread_mutex_unlock(&omx_base_source_Private->flush_mutex);
274 if((isOutputBufferNeeded[0]==
OMX_TRUE && pOutputSem[0]->semval==0) &&
278 tsem_down(omx_base_source_Private->bMgmtSem);
285 if((isOutputBufferNeeded[1]==
OMX_TRUE && pOutputSem[1]->semval==0) &&
290 tsem_down(omx_base_source_Private->bMgmtSem);
299 if(pOutputSem[0]->semval>0 && isOutputBufferNeeded[0]==
OMX_TRUE ) {
301 if(pOutputQueue[0]->nelem>0){
302 outBufExchanged[0]++;
304 pOutputBuffer[0] =
dequeue(pOutputQueue[0]);
305 if(pOutputBuffer[0] == NULL){
312 if(pOutputSem[1]->semval>0 && isOutputBufferNeeded[1]==
OMX_TRUE) {
314 if(pOutputQueue[1]->nelem>0){
315 outBufExchanged[1]++;
317 pOutputBuffer[1] =
dequeue(pOutputQueue[1]);
318 if(pOutputBuffer[1] == NULL){
319 DEBUG(
DEB_LEV_ERR,
"Had NULL output buffer!! op is=%d,iq=%d\n",pOutputSem[1]->semval,pOutputQueue[1]->nelem);
335 if(omx_base_source_Private->pMark.hMarkTargetComponent != NULL){
337 pOutputBuffer[i]->
pMarkData = omx_base_source_Private->pMark.pMarkData;
343 (*(omx_base_source_Private->callbacks->EventHandler))
345 omx_base_source_Private->callbackData,
350 }
else if(pOutputBuffer[i]->hMarkTargetComponent!=NULL){
356 if (omx_base_source_Private->BufferMgmtCallback && pOutputBuffer[i]->
nFilledLen == 0) {
357 (*(omx_base_source_Private->BufferMgmtCallback))(openmaxStandComp, pOutputBuffer[i]);
363 DEBUG(
DEB_LEV_ERR,
"In %s Received Buffer in non-Executing State(%x)\n", __func__, (
int)omx_base_source_Private->state);
367 DEBUG(
DEB_LEV_FULL_SEQ,
"Detected EOS flags in input buffer filled len=%d\n", (
int)pOutputBuffer[i]->nFilledLen);
368 (*(omx_base_source_Private->callbacks->EventHandler))
370 omx_base_source_Private->callbackData,
384 outBufExchanged[i]--;
385 pOutputBuffer[i]=NULL;
393 if(omx_base_source_Private->pMark.hMarkTargetComponent != NULL){
394 omx_base_source_Private->pMark.hMarkTargetComponent = NULL;
395 omx_base_source_Private->pMark.pMarkData = NULL;
@ OMX_ErrorInsufficientResources
#define OMX_BUFFERFLAG_EOS
OMX_ERRORTYPE omx_base_component_Constructor(OMX_COMPONENTTYPE *openmaxStandComp, OMX_STRING cComponentName)
The base constructor for the OpenMAX ST components.
OMX_ERRORTYPE omx_base_component_Destructor(OMX_COMPONENTTYPE *openmaxStandComp)
The base destructor for ST OpenMAX components.
@ OMX_TransStateLoadedToIdle
#define PORT_IS_BEING_FLUSHED(pPort)
void * omx_base_source_BufferMgmtFunction(void *param)
OMX_ERRORTYPE omx_base_source_Constructor(OMX_COMPONENTTYPE *openmaxStandComp, OMX_STRING cComponentName)
void * omx_base_source_twoport_BufferMgmtFunction(void *param)
OMX_ERRORTYPE omx_base_source_Destructor(OMX_COMPONENTTYPE *openmaxStandComp)
#define OMX_BASE_SOURCE_OUTPUTPORT_INDEX
#define OMX_BASE_SOURCE_OUTPUTPORT_INDEX_1
#define DEB_LEV_FUNCTION_NAME
#define DEB_LEV_SIMPLE_SEQ
#define DEBUG(n, fmt, args...)
void * dequeue(queue_t *queue)
OMX_HANDLETYPE hMarkTargetComponent
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_PTR pComponentPrivate
OMX_ERRORTYPE(* ReturnBufferFunction)(omx_base_PortType *openmaxStandPort, OMX_BUFFERHEADERTYPE *pBuffer)
OMX_CALLBACKTYPE * callbacks
OMX_TRANS_STATETYPE transientState
OMX_PORT_PARAM_TYPE sPortTypesParam[4]
void *(* BufferMgmtFunction)(void *param)
void tsem_up(tsem_t *tsem)
void tsem_down(tsem_t *tsem)
void tsem_wait(tsem_t *tsem)