exynos_omx: multi_thread: enhance the exception handling.
authorSeungBeom Kim <sbcrux.kim@samsung.com>
Wed, 4 Jul 2012 00:56:12 +0000 (09:56 +0900)
committerDima Zavin <dima@android.com>
Tue, 24 Jul 2012 22:12:41 +0000 (15:12 -0700)
in case of first frame EOS, enhance the exception handling.

Change-Id: I72f74d4c5389119a499f74abb68f08bbe9cadd7a
Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com>
exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_VdecControl.c
exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c
exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c
exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c
exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c
exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c
exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c

index 2570d77892a8b3e4d4bc84e63fa17b47357760a9..75331dd7212fa998c3e322caacc2fdef36dde8ec 100644 (file)
@@ -889,6 +889,42 @@ EXIT:
 
 }
 
+OMX_BUFFERHEADERTYPE *Exynos_OutputBufferGetQueue_Direct(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    OMX_BUFFERHEADERTYPE  *retBuffer = NULL;
+    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_MESSAGE    *message = NULL;
+
+    FunctionIn();
+
+    if (pExynosComponent->currentState != OMX_StateExecuting) {
+        retBuffer = NULL;
+        goto EXIT;
+    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
+               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){
+        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
+
+        message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+        if (message == NULL) {
+            retBuffer = NULL;
+            goto EXIT;
+        }
+        if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
+            Exynos_OSAL_Free(message);
+            retBuffer = NULL;
+            goto EXIT;
+        }
+
+        retBuffer  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
+        Exynos_OSAL_Free(message);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return retBuffer;
+}
+
 OMX_ERRORTYPE Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR data)
 {
     OMX_ERRORTYPE       ret = OMX_ErrorNone;
index dcc8cc9fc48f57ec27b77309561c8dbacbd431e8..b69cd0ebdae834ca9d69413bbcc8664c52f82536 100644 (file)
@@ -604,17 +604,16 @@ OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DAT
     FunctionIn();
 
     if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
-        EXYNOS_OMX_DATA *pDstOutputData = &pExynosOutputPort->processData;
-
-        ret = Exynos_OutputBufferGetQueue(pExynosComponent);
-        if (ret != OMX_ErrorNone) {
+        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
+        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
+        if (OMXBuffer == NULL) {
             ret = OMX_ErrorUndefined;
             goto EXIT;
         }
-        pDstOutputData->timeStamp = pSrcInputData->timeStamp;
-        pDstOutputData->nFlags = pSrcInputData->nFlags;
 
-        Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData);
+        OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
+        OMXBuffer->nFlags = pSrcInputData->nFlags;
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
 
         ret = OMX_ErrorNone;
         goto EXIT;
index 648c554d27313262f80ca4abdf5ad4009f19c34d..f168aab4eec79f0c3f3e76647a6c6b87341e2f7d 100644 (file)
@@ -708,16 +708,16 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA
     FunctionIn();
 
     if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
-        EXYNOS_OMX_DATA *pDstOutputData = &pExynosOutputPort->processData;
-        ret = Exynos_OutputBufferGetQueue(pExynosComponent);
-        if (ret != OMX_ErrorNone) {
+        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
+        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
+        if (OMXBuffer == NULL) {
             ret = OMX_ErrorUndefined;
             goto EXIT;
         }
-        pDstOutputData->timeStamp = pSrcInputData->timeStamp;
-        pDstOutputData->nFlags = pSrcInputData->nFlags;
 
-        Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData);
+        OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
+        OMXBuffer->nFlags = pSrcInputData->nFlags;
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
 
         ret = OMX_ErrorNone;
         goto EXIT;
index 922c26f63d968cf229beae18822ebcf4cfd00547..7843fa8e2ff06ba14ae35eca3c24f959b5276471 100644 (file)
@@ -523,16 +523,16 @@ OMX_ERRORTYPE VP8CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA
     FunctionIn();
 
     if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
-        EXYNOS_OMX_DATA *pDstOutputData = &pExynosOutputPort->processData;
-        ret = Exynos_OutputBufferGetQueue(pExynosComponent);
-        if (ret != OMX_ErrorNone) {
+        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
+        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
+        if (OMXBuffer == NULL) {
             ret = OMX_ErrorUndefined;
             goto EXIT;
         }
-        pDstOutputData->timeStamp = pSrcInputData->timeStamp;
-        pDstOutputData->nFlags = pSrcInputData->nFlags;
 
-        Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData);
+        OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
+        OMXBuffer->nFlags = pSrcInputData->nFlags;
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
 
         ret = OMX_ErrorNone;
         goto EXIT;
index 33fadb829d99816de9b3677bfce5d29e7f784291..e584a0c10608c74f27196deed99395fc1d569f49 100644 (file)
@@ -891,6 +891,42 @@ EXIT:
 
 }
 
+OMX_BUFFERHEADERTYPE *Exynos_OutputBufferGetQueue_Direct(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    OMX_BUFFERHEADERTYPE  *retBuffer = NULL;
+    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_MESSAGE    *message = NULL;
+
+    FunctionIn();
+
+    if (pExynosComponent->currentState != OMX_StateExecuting) {
+        retBuffer = NULL;
+        goto EXIT;
+    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
+               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){
+        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
+
+        message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+        if (message == NULL) {
+            retBuffer = NULL;
+            goto EXIT;
+        }
+        if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
+            Exynos_OSAL_Free(message);
+            retBuffer = NULL;
+            goto EXIT;
+        }
+
+        retBuffer  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
+        Exynos_OSAL_Free(message);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return retBuffer;
+}
+
 OMX_ERRORTYPE Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR data)
 {
     OMX_ERRORTYPE       ret = OMX_ErrorNone;
index d07a9ef29f029abf62b6f6c212d4e27f48554813..2eec7eaf6cd851693077dca6dfe502bc19476130 100644 (file)
@@ -752,17 +752,16 @@ OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DAT
     FunctionIn();
 
     if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
-        EXYNOS_OMX_DATA *pDstOutputData = &pExynosOutputPort->processData;
-
-        ret = Exynos_OutputBufferGetQueue(pExynosComponent);
-        if (ret != OMX_ErrorNone) {
+        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
+        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
+        if (OMXBuffer == NULL) {
             ret = OMX_ErrorUndefined;
             goto EXIT;
         }
-        pDstOutputData->timeStamp = pSrcInputData->timeStamp;
-        pDstOutputData->nFlags = pSrcInputData->nFlags;
 
-        Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData);
+        OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
+        OMXBuffer->nFlags = pSrcInputData->nFlags;
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
 
         ret = OMX_ErrorNone;
         goto EXIT;
index 1404f27842b975d6a7b47c9f4fcc4055b9994ee8..799febdcb66cfb59bb9256fec14d2f05bf82fe11 100644 (file)
@@ -869,17 +869,16 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA
     FunctionIn();
 
     if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
-        EXYNOS_OMX_DATA *pDstOutputData = &pExynosOutputPort->processData;
-
-        ret = Exynos_OutputBufferGetQueue(pExynosComponent);
-        if (ret != OMX_ErrorNone) {
+        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
+        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
+        if (OMXBuffer == NULL) {
             ret = OMX_ErrorUndefined;
             goto EXIT;
         }
-        pDstOutputData->timeStamp = pSrcInputData->timeStamp;
-        pDstOutputData->nFlags = pSrcInputData->nFlags;
 
-        Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData);
+        OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
+        OMXBuffer->nFlags = pSrcInputData->nFlags;
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
 
         ret = OMX_ErrorNone;
         goto EXIT;