EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
- EXYNOS_OMX_DATABUFFER *flushPortBuffer[2] = {NULL, NULL};
+ EXYNOS_OMX_DATABUFFER *flushPortBuffer1 = NULL;
+ EXYNOS_OMX_DATABUFFER *flushPortBuffer2 = NULL;
OMX_U32 i = 0, cnt = 0;
FunctionIn();
pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush start, port:%d", nPortIndex);
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush start, port:%lld", nPortIndex);
- pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_TRUE;
+ pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
+ pExynosPort->bIsPortFlushed = OMX_TRUE;
if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[nPortIndex].pauseEvent);
}
- pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
- Exynos_OMX_GetFlushBuffer(pExynosPort, flushPortBuffer);
+ flushPortBuffer1 = &(pExynosComponent->pExynosPort[nPortIndex].way.port2WayDataBuffer.inputDataBuffer);
+ flushPortBuffer2 = &(pExynosComponent->pExynosPort[nPortIndex].way.port2WayDataBuffer.outputDataBuffer);
- if (pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY)
+ if (pExynosPort->bufferProcessType & BUFFER_COPY)
Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);
- Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
+
+ if (pExynosPort->bufferSemID != NULL) {
+ while (1) {
+ OMX_S32 cnt = 0;
+ Exynos_OSAL_Get_SemaphoreCount(pExynosPort->bufferSemID, &cnt);
+ if (cnt > 0)
+ break;
+ else
+ Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
+ Exynos_OSAL_SleepMillisec(0);
+ }
+ }
pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, nPortIndex);
- /*Exynos_OSAL_MutexLock(flushPortBuffer[0]->bufferMutex);*/
+ Exynos_OSAL_MutexLock(flushPortBuffer1->bufferMutex);
pVideoDec->exynos_codec_stop(pOMXComponent, nPortIndex);
- /*Exynos_OSAL_MutexLock(flushPortBuffer[1]->bufferMutex);*/
+ Exynos_OSAL_MutexLock(flushPortBuffer2->bufferMutex);
ret = Exynos_OMX_FlushPort(pOMXComponent, nPortIndex);
if (pVideoDec->bDRCProcessing == OMX_TRUE) {
/* pVideoDec->bDRCProcess == OMX_TRUE
the case of dynamic resolution change */
pVideoDec->exynos_codec_resetupAllElement(pOMXComponent, nPortIndex);
- } else if (pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) {
+ } else if (pExynosPort->bufferProcessType & BUFFER_COPY) {
pVideoDec->exynos_codec_enqueueAllBuffer(pOMXComponent, nPortIndex);
}
pExynosComponent->reInputData = OMX_FALSE;
}
- pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_FALSE;
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush EventCmdComplete, port:%d", nPortIndex);
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"pExynosPort :%p", pExynosPort);
+ pExynosPort->bIsPortFlushed = OMX_FALSE;
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush EventCmdComplete, port:%lld", nPortIndex);
if (bEvent == OMX_TRUE)
pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
pExynosComponent->callbackData,
OMX_EventCmdComplete,
OMX_CommandFlush, nPortIndex, NULL);
}
- /*Exynos_OSAL_MutexUnlock(flushPortBuffer[1]->bufferMutex);*/
- /*Exynos_OSAL_MutexUnlock(flushPortBuffer[0]->bufferMutex);*/
+ Exynos_OSAL_MutexUnlock(flushPortBuffer2->bufferMutex);
+ Exynos_OSAL_MutexUnlock(flushPortBuffer1->bufferMutex);
EXIT:
if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
goto EXIT;
}
-#ifdef TIZEN_FEATURE_E54XX
- if (pExynosPort == NULL) {
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d: pExynosPort is NULL", __FUNCTION__, __LINE__);
- }
-#endif
-
ret = Exynos_OSAL_Queue(&pExynosPort->codecBufferQ, (void *)data);
if (ret != 0) {
ret = OMX_ErrorUndefined;