exynos_omx: multi_thread: Add error handling.
authorSeungBeom Kim <sbcrux.kim@samsung.com>
Wed, 4 Jul 2012 00:33:20 +0000 (09:33 +0900)
committerDima Zavin <dima@android.com>
Tue, 24 Jul 2012 22:12:41 +0000 (15:12 -0700)
Change-Id: I279d1e893589179a573224c383d414fbb165fc40
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_Venc.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 c95f2a4babe0b36b119d27b52de23584cc679ebe..2570d77892a8b3e4d4bc84e63fa17b47357760a9 100644 (file)
@@ -686,7 +686,7 @@ EXIT:
 
 OMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
 {
-    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_ERRORTYPE          ret = OMX_ErrorUndefined;
     EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
     EXYNOS_OMX_MESSAGE    *message = NULL;
     EXYNOS_OMX_DATABUFFER *inputUseBuffer = NULL;
@@ -708,6 +708,7 @@ OMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosCompon
                 goto EXIT;
             }
             if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
+                Exynos_OSAL_Free(message);
                 ret = OMX_ErrorCodecFlush;
                 goto EXIT;
             }
@@ -829,7 +830,7 @@ EXIT:
 
 OMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
 {
-    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+    OMX_ERRORTYPE       ret = OMX_ErrorUndefined;
     EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
     EXYNOS_OMX_MESSAGE    *message = NULL;
     EXYNOS_OMX_DATABUFFER *outputUseBuffer = NULL;
@@ -855,6 +856,7 @@ OMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosCompo
                 goto EXIT;
             }
             if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
+                Exynos_OSAL_Free(message);
                 ret = OMX_ErrorCodecFlush;
                 goto EXIT;
             }
index b5b9358ecdcfcc1c51393d9b1f2c0d5bd3e231ac..dcc8cc9fc48f57ec27b77309561c8dbacbd431e8 100644 (file)
@@ -316,6 +316,21 @@ OMX_ERRORTYPE H264CodecOpen(EXYNOS_H264DEC_HANDLE *pH264Dec)
     ret = OMX_ErrorNone;
 
 EXIT:
+    if (ret != OMX_ErrorNone) {
+        if (pDecOps != NULL) {
+            Exynos_OSAL_Free(pDecOps);
+            pH264Dec->hMFCH264Handle.pDecOps = NULL;
+        }
+        if (pInbufOps != NULL) {
+            Exynos_OSAL_Free(pInbufOps);
+            pH264Dec->hMFCH264Handle.pInbufOps = NULL;
+        }
+        if (pOutbufOps != NULL) {
+            Exynos_OSAL_Free(pOutbufOps);
+            pH264Dec->hMFCH264Handle.pOutbufOps = NULL;
+        }
+    }
+
     FunctionOut();
 
     return ret;
index 47b0a2e83dfe0af0209d7ea0ef93dac5d8f7d44d..648c554d27313262f80ca4abdf5ad4009f19c34d 100644 (file)
@@ -420,6 +420,21 @@ OMX_ERRORTYPE Mpeg4CodecOpen(EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec)
     ret = OMX_ErrorNone;
 
 EXIT:
+    if (ret != OMX_ErrorNone) {
+        if (pDecOps != NULL) {
+            Exynos_OSAL_Free(pDecOps);
+            pMpeg4Dec->hMFCMpeg4Handle.pDecOps = NULL;
+        }
+        if (pInbufOps != NULL) {
+            Exynos_OSAL_Free(pInbufOps);
+            pMpeg4Dec->hMFCMpeg4Handle.pInbufOps = NULL;
+        }
+        if (pOutbufOps != NULL) {
+            Exynos_OSAL_Free(pOutbufOps);
+            pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps = NULL;
+        }
+    }
+
     FunctionOut();
 
     return ret;
@@ -550,9 +565,9 @@ OMX_ERRORTYPE Mpeg4CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortInde
     pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
     pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
 
-    if (nPortIndex == INPUT_PORT_INDEX)
+    if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
         pInbufOps->Stop(hMFCHandle);
-    else if (nPortIndex == OUTPUT_PORT_INDEX)
+    else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
         pOutbufOps->Stop(hMFCHandle);
 
     ret = OMX_ErrorNone;
index fae31db3f01593bb3a60f4df987eb0c85ea9b27f..922c26f63d968cf229beae18822ebcf4cfd00547 100644 (file)
@@ -235,6 +235,21 @@ OMX_ERRORTYPE VP8CodecOpen(EXYNOS_VP8DEC_HANDLE *pVp8Dec)
     ret = OMX_ErrorNone;
 
 EXIT:
+    if (ret != OMX_ErrorNone) {
+        if (pDecOps != NULL) {
+            Exynos_OSAL_Free(pDecOps);
+            pVp8Dec->hMFCVp8Handle.pDecOps = NULL;
+        }
+        if (pInbufOps != NULL) {
+            Exynos_OSAL_Free(pInbufOps);
+            pVp8Dec->hMFCVp8Handle.pInbufOps = NULL;
+        }
+        if (pOutbufOps != NULL) {
+            Exynos_OSAL_Free(pOutbufOps);
+            pVp8Dec->hMFCVp8Handle.pOutbufOps = NULL;
+        }
+    }
+
     FunctionOut();
 
     return ret;
@@ -365,9 +380,9 @@ OMX_ERRORTYPE VP8CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
     pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
     pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
 
-    if (nPortIndex == INPUT_PORT_INDEX)
+    if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
         pInbufOps->Stop(hMFCHandle);
-    else if (nPortIndex == OUTPUT_PORT_INDEX)
+    else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
         pOutbufOps->Stop(hMFCHandle);
 
     ret = OMX_ErrorNone;
@@ -1010,7 +1025,7 @@ OMX_ERRORTYPE Exynos_VP8Dec_GetConfig(
 
     FunctionIn();
 
-    if (hComponent == NULL) {
+    if (hComponent == NULL || pComponentConfigStructure == NULL) {
         ret = OMX_ErrorBadParameter;
         goto EXIT;
     }
@@ -1024,11 +1039,6 @@ OMX_ERRORTYPE Exynos_VP8Dec_GetConfig(
         goto EXIT;
     }
     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
-
-    if (pComponentConfigStructure == NULL) {
-        ret = OMX_ErrorBadParameter;
-        goto EXIT;
-    }
     if (pExynosComponent->currentState == OMX_StateInvalid) {
         ret = OMX_ErrorInvalidState;
         goto EXIT;
@@ -1057,7 +1067,7 @@ OMX_ERRORTYPE Exynos_VP8Dec_SetConfig(
 
     FunctionIn();
 
-    if (hComponent == NULL) {
+    if (hComponent == NULL || pComponentConfigStructure == NULL) {
         ret = OMX_ErrorBadParameter;
         goto EXIT;
     }
@@ -1071,11 +1081,6 @@ OMX_ERRORTYPE Exynos_VP8Dec_SetConfig(
         goto EXIT;
     }
     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
-
-    if (pComponentConfigStructure == NULL) {
-        ret = OMX_ErrorBadParameter;
-        goto EXIT;
-    }
     if (pExynosComponent->currentState == OMX_StateInvalid) {
         ret = OMX_ErrorInvalidState;
         goto EXIT;
index fea08f178aaf344f70294b3828103accb0ad1237..ecfb788e36a49346915dda0f3c929bb68bfd9e77 100644 (file)
@@ -204,7 +204,6 @@ OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
                 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s:%d YAddr: 0x%x CbCrAddr: 0x%x", __FUNCTION__, __LINE__, (unsigned int)ppBuf[0], (unsigned int)ppBuf[0]);
             }
 #endif
-
             /* reset dataBuffer */
             Exynos_ResetDataBuffer(inputUseBuffer);
             flagEOF = OMX_TRUE;
@@ -486,7 +485,7 @@ OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
             }
         } else if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
             if ((outputUseBuffer->remainDataLen > 0) ||
-                (outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) ||
+                ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
                 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)))
                 Exynos_OutputBufferReturn(pOMXComponent);
         }
index ad2bfc3499b156cf7bbd66110857ef65e8e212db..33fadb829d99816de9b3677bfce5d29e7f784291 100644 (file)
@@ -688,7 +688,7 @@ EXIT:
 
 OMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
 {
-    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_ERRORTYPE          ret = OMX_ErrorUndefined;
     EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
     EXYNOS_OMX_MESSAGE    *message = NULL;
     EXYNOS_OMX_DATABUFFER *inputUseBuffer = NULL;
@@ -710,6 +710,7 @@ OMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosCompon
                 goto EXIT;
             }
             if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
+                Exynos_OSAL_Free(message);
                 ret = OMX_ErrorCodecFlush;
                 goto EXIT;
             }
@@ -831,7 +832,7 @@ EXIT:
 
 OMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
 {
-    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+    OMX_ERRORTYPE       ret = OMX_ErrorUndefined;
     EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
     EXYNOS_OMX_MESSAGE    *message = NULL;
     EXYNOS_OMX_DATABUFFER *outputUseBuffer = NULL;
@@ -857,6 +858,7 @@ OMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosCompo
                 goto EXIT;
             }
             if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
+                Exynos_OSAL_Free(message);
                 ret = OMX_ErrorCodecFlush;
                 goto EXIT;
             }
index beae30dd6f7a56671d717487f160cc72f067380b..d07a9ef29f029abf62b6f6c212d4e27f48554813 100644 (file)
@@ -465,6 +465,21 @@ OMX_ERRORTYPE H264CodecOpen(EXYNOS_H264ENC_HANDLE *pH264Enc)
     ret = OMX_ErrorNone;
 
 EXIT:
+    if (ret != OMX_ErrorNone) {
+        if (pEncOps != NULL) {
+            Exynos_OSAL_Free(pEncOps);
+            pH264Enc->hMFCH264Handle.pEncOps = NULL;
+        }
+        if (pInbufOps != NULL) {
+            Exynos_OSAL_Free(pInbufOps);
+            pH264Enc->hMFCH264Handle.pInbufOps = NULL;
+        }
+        if (pOutbufOps != NULL) {
+            Exynos_OSAL_Free(pOutbufOps);
+            pH264Enc->hMFCH264Handle.pOutbufOps = NULL;
+        }
+    }
+
     FunctionOut();
 
     return ret;
index e77335ef0acce84124bde8b8d180d0011f3a165b..1404f27842b975d6a7b47c9f4fcc4055b9994ee8 100644 (file)
@@ -582,6 +582,21 @@ OMX_ERRORTYPE Mpeg4CodecOpen(EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc)
     ret = OMX_ErrorNone;
 
 EXIT:
+    if (ret != OMX_ErrorNone) {
+        if (pEncOps != NULL) {
+            Exynos_OSAL_Free(pEncOps);
+            pMpeg4Enc->hMFCMpeg4Handle.pEncOps = NULL;
+        }
+        if (pInbufOps != NULL) {
+            Exynos_OSAL_Free(pInbufOps);
+            pMpeg4Enc->hMFCMpeg4Handle.pInbufOps = NULL;
+        }
+        if (pOutbufOps != NULL) {
+            Exynos_OSAL_Free(pOutbufOps);
+            pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps = NULL;
+        }
+    }
+
     FunctionOut();
 
     return ret;
@@ -1889,7 +1904,6 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
         Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
         Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
     } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
-
         /*************/
         /*    TBD    */
         /*************/
@@ -1909,7 +1923,6 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
         Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
         Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
     } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
-
         /*************/
         /*    TBD    */
         /*************/