From: SeungBeom Kim <sbcrux.kim@samsung.com>
Date: Wed, 4 Jul 2012 00:56:12 +0000 (+0900)
Subject: exynos_omx: multi_thread: enhance the exception handling.
X-Git-Tag: cm-10.1-M1~304
X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=54cbf397a1e177ea34b304b6951d4f7eb571c259;p=GitHub%2FLineageOS%2Fandroid_hardware_samsung_slsi_exynos5.git

exynos_omx: multi_thread: enhance the exception handling.

in case of first frame EOS, enhance the exception handling.

Change-Id: I72f74d4c5389119a499f74abb68f08bbe9cadd7a
Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com>
---

diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_VdecControl.c b/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_VdecControl.c
index 2570d77..75331dd 100644
--- a/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_VdecControl.c
+++ b/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_VdecControl.c
@@ -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;
diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c b/exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c
index dcc8cc9..b69cd0e 100644
--- a/exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c
+++ b/exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c
@@ -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;
diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c b/exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c
index 648c554..f168aab 100644
--- a/exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c
+++ b/exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c
@@ -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;
diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c b/exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c
index 922c26f..7843fa8 100644
--- a/exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c
+++ b/exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c
@@ -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;
diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c
index 33fadb8..e584a0c 100644
--- a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c
+++ b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c
@@ -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;
diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c
index d07a9ef..2eec7ea 100644
--- a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c
+++ b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c
@@ -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;
diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c b/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c
index 1404f27..799febd 100644
--- a/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c
+++ b/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c
@@ -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;