Fixed an issue where crash occurred on 64bit 75/135875/4 accepted/tizen/4.0/unified/20170816.013156 accepted/tizen/4.0/unified/20170828.224433 accepted/tizen/unified/20170703.063938 submit/tizen/20170628.043811 submit/tizen_4.0/20170811.094300 submit/tizen_4.0/20170828.100001 submit/tizen_4.0/20170828.110001
authorSejun Park <sejun79.park@samsung.com>
Tue, 27 Jun 2017 07:11:38 +0000 (16:11 +0900)
committerSejun Park <sejun79.park@samsung.com>
Tue, 27 Jun 2017 09:58:33 +0000 (18:58 +0900)
Change-Id: I41b1b2984bc3c5b51bb3be6d13599270ef246b26

openmax/component/video/dec/Exynos_OMX_VdecControl.c
packaging/libomxil-e54xx.spec

index 920d77b2668a2c1a84c5cabc597be8936809870c..82f480242852d611860f03135087b218776d805b 100755 (executable)
@@ -544,7 +544,8 @@ OMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 n
     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();
@@ -568,9 +569,10 @@ OMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 n
     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);
@@ -578,24 +580,35 @@ OMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 n
         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);
     }
 
@@ -613,16 +626,17 @@ OMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 n
             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)) {
@@ -1002,12 +1016,6 @@ OMX_ERRORTYPE Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT *pExynosCompone
         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;
index 350ff5f48e18f8e562719bd1ae2e194ad51f624f..c446362b2c4ae3e4ff034ab6c9aad8e344252efb 100755 (executable)
@@ -1,6 +1,6 @@
 Name: libomxil-e54xx
 Summary: OpenMAX IL for e54xx
-Version: 1.0.3
+Version: 1.0.4
 License: Apache-2.0
 Group: Development/Libraries
 Release: 0