common/video: added INVAILD_STATE in exceptionFlag
[GitHub/LineageOS/android_hardware_samsung_slsi_openmax.git] / component / video / enc / Exynos_OMX_VencControl.c
index 73e94cd30c9e1f033d6b37d0607cd0b3073612a8..869531fb6b1db579efaf9b907ac626135958bce8 100644 (file)
@@ -200,10 +200,13 @@ OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
         goto EXIT;
     }
 
-    if (pExynosPort->bNeedContigMem == OMX_TRUE) {
+    if ((pVideoEnc->bDRMPlayerMode == OMX_TRUE) &&
+        (nPortIndex == OUTPUT_PORT_INDEX)) {
+        eMemType = SECURE_MEMORY;
+    } else if (pExynosPort->bNeedContigMem == OMX_TRUE) {
         eMemType = CONTIG_MEMORY;
     } else if ((nPortIndex == INPUT_PORT_INDEX) &&
-        (pExynosPort->bufferProcessType & BUFFER_SHARE)) {
+               (pExynosPort->bufferProcessType & BUFFER_SHARE)) {
         eMemType = NORMAL_MEMORY;
     }
 
@@ -228,7 +231,10 @@ OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
             pExynosPort->extendBufferHeader[i].buf_fd[0] = fdTempBuffer;
             pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED);
             INIT_SET_SIZE_VERSION(pTempBufferHdr, OMX_BUFFERHEADERTYPE);
-            pTempBufferHdr->pBuffer        = pTempBuffer;
+            if (eMemType == SECURE_MEMORY)
+                pTempBufferHdr->pBuffer = fdTempBuffer;
+            else
+                pTempBufferHdr->pBuffer = pTempBuffer;
             pTempBufferHdr->nAllocLen      = nSizeBytes;
             pTempBufferHdr->pAppPrivate    = pAppPrivate;
             if (nPortIndex == INPUT_PORT_INDEX)
@@ -308,13 +314,16 @@ OMX_ERRORTYPE Exynos_OMX_FreeBuffer(
         goto EXIT;
     }
 
-    if ((pExynosPort->portState != OMX_StateLoaded) &&
-        (pExynosPort->portState != OMX_StateInvalid)) {
+    if (((pExynosPort->portState != OMX_StateLoaded) &&
+         (pExynosPort->portState != OMX_StateInvalid)) &&
+        (pExynosPort->portDefinition.bEnabled != OMX_FALSE)) {
         (*(pExynosComponent->pCallbacks->EventHandler)) (pOMXComponent,
                         pExynosComponent->callbackData,
                         (OMX_U32)OMX_EventError,
                         (OMX_U32)OMX_ErrorPortUnpopulated,
                         nPortIndex, NULL);
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
     }
 
     for (i = 0; i < /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM; i++) {
@@ -324,7 +333,13 @@ OMX_ERRORTYPE Exynos_OMX_FreeBuffer(
 
             if (pOMXBufferHdr->pBuffer == pBufferHdr->pBuffer) {
                 if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ALLOCATED) {
-                    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pOMXBufferHdr->pBuffer);
+                    if ((pVideoEnc->bDRMPlayerMode == OMX_TRUE) &&
+                        (nPortIndex == OUTPUT_PORT_INDEX)) {
+                        OMX_PTR mapBuffer = Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc->hSharedMemory, (int)pOMXBufferHdr->pBuffer);
+                        Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, mapBuffer);
+                    } else {
+                        Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pOMXBufferHdr->pBuffer);
+                    }
                     pOMXBufferHdr->pBuffer = NULL;
                     pBufferHdr->pBuffer = NULL;
                 } else if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ASSIGNED) {
@@ -487,16 +502,16 @@ OMX_ERRORTYPE Exynos_OMX_FlushPort(
     if ((pDataBuffer[0] != NULL) &&
         (pDataBuffer[0]->dataValid == OMX_TRUE)) {
         if (nPortIndex == INPUT_PORT_INDEX)
-            Exynos_FlushInputBufferReturn(pOMXComponent, pDataBuffer[0]);
+            Exynos_InputBufferReturn(pOMXComponent, pDataBuffer[0]);
         else if (nPortIndex == OUTPUT_PORT_INDEX)
-            Exynos_FlushOutputBufferReturn(pOMXComponent, pDataBuffer[0]);
+            Exynos_OutputBufferReturn(pOMXComponent, pDataBuffer[0]);
     }
     if ((pDataBuffer[1] != NULL) &&
         (pDataBuffer[1]->dataValid == OMX_TRUE)) {
         if (nPortIndex == INPUT_PORT_INDEX)
-            Exynos_FlushInputBufferReturn(pOMXComponent, pDataBuffer[1]);
+            Exynos_InputBufferReturn(pOMXComponent, pDataBuffer[1]);
         else if (nPortIndex == OUTPUT_PORT_INDEX)
-            Exynos_FlushOutputBufferReturn(pOMXComponent, pDataBuffer[1]);
+            Exynos_OutputBufferReturn(pOMXComponent, pDataBuffer[1]);
     }
 
     if (pExynosComponent->bMultiThreadProcess == OMX_TRUE) {
@@ -644,6 +659,7 @@ OMX_ERRORTYPE Exynos_OMX_BufferFlush(
             Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
             pExynosComponent->getAllDelayBuffer = OMX_FALSE;
             pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+            pExynosComponent->bBehaviorEOS = OMX_FALSE;
             pExynosComponent->reInputData = OMX_FALSE;
         }
 
@@ -676,12 +692,12 @@ EXIT:
 }
 
 OMX_ERRORTYPE Exynos_InputBufferReturn(
-    OMX_COMPONENTTYPE   *pOMXComponent)
+    OMX_COMPONENTTYPE       *pOMXComponent,
+    EXYNOS_OMX_DATABUFFER   *pDataBuffer)
 {
     OMX_ERRORTYPE                ret                = OMX_ErrorNone;
     EXYNOS_OMX_BASECOMPONENT    *pExynosComponent   = NULL;
     EXYNOS_OMX_BASEPORT         *pExynosPort        = NULL;
-    EXYNOS_OMX_DATABUFFER       *pDataBuffer        = NULL;
     OMX_BUFFERHEADERTYPE        *pBufferHdr         = NULL;
 
     FunctionIn();
@@ -698,80 +714,15 @@ OMX_ERRORTYPE Exynos_InputBufferReturn(
     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
     pExynosPort = &(pExynosComponent->pExynosPort[INPUT_PORT_INDEX]);
 
-    if (pExynosPort->bufferProcessType & BUFFER_COPY) {
-        pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
-    } else if (pExynosPort->bufferProcessType & BUFFER_SHARE) {
-        pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
-    }
-
     if (pDataBuffer != NULL)
         pBufferHdr = pDataBuffer->bufferHeader;
 
     if (pBufferHdr != NULL) {
         if (pExynosPort->markType.hMarkTargetComponent != NULL) {
-            pBufferHdr->hMarkTargetComponent = pExynosPort->markType.hMarkTargetComponent;
-            pBufferHdr->pMarkData            = pExynosPort->markType.pMarkData;
-            pExynosPort->markType.hMarkTargetComponent = NULL;
-            pExynosPort->markType.pMarkData = NULL;
-        }
-
-        if (pBufferHdr->hMarkTargetComponent != NULL) {
-            if (pBufferHdr->hMarkTargetComponent == pOMXComponent) {
-                pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
-                                pExynosComponent->callbackData,
-                                OMX_EventMark,
-                                0, 0, pBufferHdr->pMarkData);
-            } else {
-                pExynosComponent->propagateMarkType.hMarkTargetComponent = pBufferHdr->hMarkTargetComponent;
-                pExynosComponent->propagateMarkType.pMarkData = pBufferHdr->pMarkData;
-            }
-        }
-
-        pBufferHdr->nFilledLen = 0;
-        pBufferHdr->nOffset = 0;
-        Exynos_OMX_InputBufferReturn(pOMXComponent, pBufferHdr);
-    }
-
-    /* reset dataBuffer */
-    Exynos_ResetDataBuffer(pDataBuffer);
-
-EXIT:
-    FunctionOut();
-
-    return ret;
-}
-
-OMX_ERRORTYPE Exynos_FlushInputBufferReturn(
-    OMX_COMPONENTTYPE       *pOMXComponent,
-    EXYNOS_OMX_DATABUFFER   *pDataBuffer)
-{
-    OMX_ERRORTYPE                ret = OMX_ErrorNone;
-    EXYNOS_OMX_BASECOMPONENT    *pExynosComponent   = NULL;
-    EXYNOS_OMX_BASEPORT         *pExynosPort        = NULL;
-    OMX_BUFFERHEADERTYPE        *pBufferHdr         = NULL;
-
-    FunctionIn();
-
-    if (pOMXComponent == NULL) {
-        ret = OMX_ErrorBadParameter;
-        goto EXIT;
-    }
-
-    if (pOMXComponent->pComponentPrivate == NULL) {
-        ret = OMX_ErrorBadParameter;
-        goto EXIT;
-    }
-    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
-    pExynosPort = &(pExynosComponent->pExynosPort[INPUT_PORT_INDEX]);
-
-    pBufferHdr = pDataBuffer->bufferHeader;
-
-    if (pBufferHdr != NULL) {
-        if (pExynosPort->markType.hMarkTargetComponent != NULL) {
-            pBufferHdr->hMarkTargetComponent  = pExynosPort->markType.hMarkTargetComponent;
-            pBufferHdr->pMarkData             = pExynosPort->markType.pMarkData;
-            pExynosPort->markType.hMarkTargetComponent = NULL;
-            pExynosPort->markType.pMarkData = NULL;
+            pBufferHdr->hMarkTargetComponent            = pExynosPort->markType.hMarkTargetComponent;
+            pBufferHdr->pMarkData                       = pExynosPort->markType.pMarkData;
+            pExynosPort->markType.hMarkTargetComponent  = NULL;
+            pExynosPort->markType.pMarkData             = NULL;
         }
 
         if (pBufferHdr->hMarkTargetComponent != NULL) {
@@ -781,13 +732,13 @@ OMX_ERRORTYPE Exynos_FlushInputBufferReturn(
                                 OMX_EventMark,
                                 0, 0, pBufferHdr->pMarkData);
             } else {
-                pExynosComponent->propagateMarkType.hMarkTargetComponent = pBufferHdr->hMarkTargetComponent;
-                pExynosComponent->propagateMarkType.pMarkData = pBufferHdr->pMarkData;
+                pExynosComponent->propagateMarkType.hMarkTargetComponent    = pBufferHdr->hMarkTargetComponent;
+                pExynosComponent->propagateMarkType.pMarkData               = pBufferHdr->pMarkData;
             }
         }
 
-        pBufferHdr->nFilledLen = 0;
-        pBufferHdr->nOffset = 0;
+        pBufferHdr->nFilledLen  = 0;
+        pBufferHdr->nOffset     = 0;
         Exynos_OMX_InputBufferReturn(pOMXComponent, pBufferHdr);
     }
 
@@ -858,12 +809,12 @@ EXIT:
 }
 
 OMX_ERRORTYPE Exynos_OutputBufferReturn(
-    OMX_COMPONENTTYPE   *pOMXComponent)
+    OMX_COMPONENTTYPE       *pOMXComponent,
+    EXYNOS_OMX_DATABUFFER   *pDataBuffer)
 {
     OMX_ERRORTYPE             ret               = OMX_ErrorNone;
     EXYNOS_OMX_BASECOMPONENT *pExynosComponent  = NULL;
     EXYNOS_OMX_BASEPORT      *pExynosPort       = NULL;
-    EXYNOS_OMX_DATABUFFER    *pDataBuffer       = NULL;
     OMX_BUFFERHEADERTYPE     *pBufferHdr        = NULL;
 
     FunctionIn();
@@ -880,8 +831,8 @@ OMX_ERRORTYPE Exynos_OutputBufferReturn(
     pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
     pExynosPort = &(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]);
 
-    pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
-    pBufferHdr = pDataBuffer->bufferHeader;
+    if (pDataBuffer != NULL)
+        pBufferHdr = pDataBuffer->bufferHeader;
 
     if (pBufferHdr != NULL) {
         pBufferHdr->nFilledLen = pDataBuffer->remainDataLen;
@@ -892,12 +843,11 @@ OMX_ERRORTYPE Exynos_OutputBufferReturn(
         if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
             pBufferHdr->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
             pBufferHdr->pMarkData            = pExynosComponent->propagateMarkType.pMarkData;
-            pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
-            pExynosComponent->propagateMarkType.pMarkData = NULL;
+            pExynosComponent->propagateMarkType.hMarkTargetComponent    = NULL;
+            pExynosComponent->propagateMarkType.pMarkData               = NULL;
         }
 
         if ((pBufferHdr->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
-            pBufferHdr->nFilledLen = 0;
             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "event OMX_BUFFERFLAG_EOS!!!");
             pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
                             pExynosComponent->callbackData,
@@ -918,62 +868,6 @@ EXIT:
     return ret;
 }
 
-OMX_ERRORTYPE Exynos_FlushOutputBufferReturn(
-    OMX_COMPONENTTYPE       *pOMXComponent,
-    EXYNOS_OMX_DATABUFFER   *pDataBuffer)
-{
-    OMX_ERRORTYPE             ret               = OMX_ErrorNone;
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent  = NULL;
-    OMX_BUFFERHEADERTYPE     *pBufferHdr        = NULL;
-
-    FunctionIn();
-
-    if (pOMXComponent == NULL) {
-        ret = OMX_ErrorBadParameter;
-        goto EXIT;
-    }
-
-    if (pOMXComponent->pComponentPrivate == NULL) {
-        ret = OMX_ErrorBadParameter;
-        goto EXIT;
-    }
-    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
-    pBufferHdr = pDataBuffer->bufferHeader;
-
-    if (pBufferHdr != NULL) {
-        pBufferHdr->nFilledLen = pDataBuffer->remainDataLen;
-        pBufferHdr->nOffset    = 0;
-        pBufferHdr->nFlags     = pDataBuffer->nFlags;
-        pBufferHdr->nTimeStamp = pDataBuffer->timeStamp;
-
-        if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
-            pBufferHdr->hMarkTargetComponent    = pExynosComponent->propagateMarkType.hMarkTargetComponent;
-            pBufferHdr->pMarkData               = pExynosComponent->propagateMarkType.pMarkData;
-            pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
-            pExynosComponent->propagateMarkType.pMarkData = NULL;
-        }
-
-        if ((pBufferHdr->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
-            pBufferHdr->nFilledLen = 0;
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "event OMX_BUFFERFLAG_EOS!!!");
-            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
-                            pExynosComponent->callbackData,
-                            OMX_EventBufferFlag,
-                            OUTPUT_PORT_INDEX,
-                            pBufferHdr->nFlags, NULL);
-        }
-        Exynos_OMX_OutputBufferReturn(pOMXComponent, pBufferHdr);
-    }
-
-    /* reset dataBuffer */
-    Exynos_ResetDataBuffer(pDataBuffer);
-
-EXIT:
-    FunctionOut();
-
-    return ret;
-}
-
 OMX_ERRORTYPE Exynos_OutputBufferGetQueue(
     EXYNOS_OMX_BASECOMPONENT    *pExynosComponent)
 {
@@ -994,6 +888,9 @@ OMX_ERRORTYPE Exynos_OutputBufferGetQueue(
         pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
     } else if (pExynosPort->bufferProcessType & BUFFER_SHARE) {
         pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
+    } else {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
     }
 
     if (pExynosComponent->currentState != OMX_StateExecuting) {
@@ -1002,8 +899,7 @@ OMX_ERRORTYPE Exynos_OutputBufferGetQueue(
     } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
                (!CHECK_PORT_BEING_FLUSHED(pExynosPort))) {
         Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
-        if ((pDataBuffer != NULL) &&
-            (pDataBuffer->dataValid != OMX_TRUE)) {
+        if (pDataBuffer->dataValid != OMX_TRUE) {
             pMessage = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
             if (pMessage == NULL) {
                 ret = OMX_ErrorUndefined;
@@ -1431,6 +1327,30 @@ OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetParameter(
         pPortMemType->bNeedContigMem = pExynosPort->bNeedContigMem;
     }
         break;
+    case OMX_IndexParamVideoIntraRefresh:
+    {
+        OMX_VIDEO_PARAM_INTRAREFRESHTYPE    *pIntraRefresh  = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)pComponentParameterStructure;
+        OMX_U32                              nPortIndex     = pIntraRefresh->nPortIndex;
+        EXYNOS_OMX_VIDEOENC_COMPONENT       *pVideoEnc      = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pIntraRefresh, sizeof(OMX_VIDEO_PARAM_INTRAREFRESHTYPE));
+        if (ret != OMX_ErrorNone)
+            goto EXIT;
+
+        if (nPortIndex != OUTPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+        pIntraRefresh->eRefreshMode = pVideoEnc->intraRefresh.eRefreshMode;
+        pIntraRefresh->nAirMBs      = pVideoEnc->intraRefresh.nAirMBs;
+        pIntraRefresh->nAirRef      = pVideoEnc->intraRefresh.nAirRef;
+        pIntraRefresh->nCirMBs      = pVideoEnc->intraRefresh.nCirMBs;
+
+        ret = OMX_ErrorNone;
+    }
+        break;
     default:
     {
         ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, pComponentParameterStructure);
@@ -1643,6 +1563,35 @@ OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetParameter(
         pExynosPort->bNeedContigMem = pPortMemType->bNeedContigMem;
     }
         break;
+    case OMX_IndexParamVideoIntraRefresh:
+    {
+        OMX_VIDEO_PARAM_INTRAREFRESHTYPE    *pIntraRefresh  = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)pComponentParameterStructure;
+        OMX_U32                              nPortIndex     = pIntraRefresh->nPortIndex;
+        EXYNOS_OMX_VIDEOENC_COMPONENT       *pVideoEnc      = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pIntraRefresh, sizeof(OMX_VIDEO_PARAM_INTRAREFRESHTYPE));
+        if (ret != OMX_ErrorNone)
+            goto EXIT;
+
+        if (nPortIndex != OUTPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+        if (pIntraRefresh->eRefreshMode == OMX_VIDEO_IntraRefreshCyclic) {
+            pVideoEnc->intraRefresh.eRefreshMode    = pIntraRefresh->eRefreshMode;
+            pVideoEnc->intraRefresh.nCirMBs         = pIntraRefresh->nCirMBs;
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_VIDEO_IntraRefreshCyclic Enable, nCirMBs: %d",
+                            pVideoEnc->intraRefresh.nCirMBs);
+        } else {
+            ret = OMX_ErrorUnsupportedSetting;
+            goto EXIT;
+        }
+
+        ret = OMX_ErrorNone;
+    }
+        break;
     default:
     {
         ret = Exynos_OMX_SetParameter(hComponent, nParamIndex, pComponentParameterStructure);