QUEUE_ERRORTYPE Queue::Get(fsl_osal_ptr pMsg) { QNODE *pQNode = NULL; if(bBlocking == E_FSL_OSAL_TRUE) fsl_osal_sem_wait(usedNodesSem); else { if(fsl_osal_sem_trywait(usedNodesSem) != E_FSL_OSAL_SUCCESS) return QUEUE_NOT_READY; } fsl_osal_mutex_lock(lock); if(pHead == NULL) { fsl_osal_mutex_unlock(lock); return QUEUE_OVERFLOW; } pQNode = pHead; pHead = pHead->NextNode; fsl_osal_memcpy(pMsg, pQNode->pMsg, nMsgSize); pQNode->NextNode = pFreeNodes; pFreeNodes = pQNode; nQSize --; if(pHead == NULL) pTail = NULL; fsl_osal_sem_post(freeNodesSem); fsl_osal_mutex_unlock(lock); return QUEUE_SUCCESS; }
OMX_ERRORTYPE start_data_process(HTEST *hTest) { OMX_ERRORTYPE ret = OMX_ErrorNone; OMX_U32 i, wait_cnt = 0; hTest->bHoldBuffers = OMX_FALSE; while (fsl_osal_sem_trywait(hTest->sParserFormatSem) !=E_FSL_OSAL_SUCCESS) { usleep(10*1000); if(hTest->bError) return OMX_ErrorUndefined; if((wait_cnt++) > 60*100) { //if load time is larger than 1 minutes, then timeout printf("timeout when wait output\n"); return OMX_ErrorUndefined; } } ret = parser_process_port_setting_changed(hTest,hTest->nAudioTrackNum); if (ret != OMX_ErrorNone) return ret; ret = parser_process_port_setting_changed(hTest,hTest->nVideoTrackNum); if (ret != OMX_ErrorNone) return ret; OMX_CONFIG_SENDAUDIOFIRST sSendAudioFirst; OMX_INIT_STRUCT(&sSendAudioFirst, OMX_CONFIG_SENDAUDIOFIRST); sSendAudioFirst.bSendAudioFrameFirst = OMX_FALSE; ret = OMX_SetConfig(hTest->hComponent,(OMX_INDEXTYPE)OMX_IndexConfigParserSendAudioFirst, &sSendAudioFirst); if (ret != OMX_ErrorNone) return ret; // do_seek(hTest, 30, OMX_TIME_SeekModeFast); /* Send output buffers */ for(i=0; i<hTest->nBufferHdr[0]; i++) { hTest->pBufferHdr[0][i]->nFilledLen = 0; hTest->pBufferHdr[0][i]->nOffset = 0; OMX_FillThisBuffer(hTest->hComponent, hTest->pBufferHdr[0][i]); } for(i=0; i<hTest->nBufferHdr[1]; i++) { hTest->pBufferHdr[1][i]->nFilledLen = 0; hTest->pBufferHdr[1][i]->nOffset = 0; OMX_FillThisBuffer(hTest->hComponent, hTest->pBufferHdr[1][i]); } return ret; }
QUEUE_ERRORTYPE Queue::Get(fsl_osal_ptr pMsg, fsl_osal_u32 nIndex) { QNODE *pQNode, *pQNodePrev = NULL; fsl_osal_u32 i; if(nIndex > nQSize) { fsl_osal_memset(pMsg, 0, nMsgSize); return QUEUE_FAILURE; } if(nIndex == 1) return Get(pMsg); if(bBlocking == E_FSL_OSAL_TRUE) fsl_osal_sem_wait(usedNodesSem); else { if(fsl_osal_sem_trywait(usedNodesSem) != E_FSL_OSAL_SUCCESS) return QUEUE_NOT_READY; } fsl_osal_mutex_lock(lock); if(pHead == NULL) { fsl_osal_mutex_unlock(lock); return QUEUE_OVERFLOW; } pQNodePrev = pHead; pQNode = pQNodePrev->NextNode; for(i=2; i<nIndex; i++){ pQNodePrev = pQNodePrev->NextNode; pQNode = pQNode->NextNode; } fsl_osal_memcpy(pMsg, pQNode->pMsg, nMsgSize); pQNodePrev->NextNode = pQNode->NextNode; pQNode->NextNode = pFreeNodes; pFreeNodes = pQNode; nQSize --; if(pTail == pQNode) pTail = pQNodePrev; fsl_osal_sem_post(freeNodesSem); fsl_osal_mutex_unlock(lock); return QUEUE_SUCCESS; }
OMX_ERRORTYPE GMSubtitlePlayer::Reset() { LOG_DEBUG("GMSubtitlePlayer::Reset\n"); bReset = OMX_TRUE; while(fsl_osal_sem_trywait(pSem) == E_FSL_OSAL_SUCCESS); fsl_osal_cond_broadcast(Cond); mSample.pBuffer = NULL; RenderOneSample(); fsl_osal_memset(&delayedSample, 0, sizeof(delayedSample)); delayedSample.nFilledLen = -1; return OMX_ErrorNone; }