openmax: Additional code for Buffer flag processing scheme change after EOS.
[GitHub/LineageOS/android_hardware_samsung_slsi_openmax.git] / component / video / enc / Exynos_OMX_Venc.c
index 49beb26d23ba9c03f00a8e79ced3cf9bb61d9545..bd748e6f7fc5f361e363a4f420721f74d1d1c9a1 100644 (file)
@@ -80,6 +80,113 @@ inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent)
     return;
 }
 
+void Exynos_Free_CodecBuffers(
+    OMX_COMPONENTTYPE   *pOMXComponent,
+    OMX_U32              nPortIndex)
+{
+    OMX_ERRORTYPE                    ret                = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT        *pExynosComponent   = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT   *pVideoEnc          = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    CODEC_ENC_BUFFER               **ppCodecBuffer      = NULL;
+
+    OMX_U32 nBufferCnt = 0, nPlaneCnt = 0;
+    int i, j;
+
+    FunctionIn();
+
+    if (nPortIndex == INPUT_PORT_INDEX) {
+        ppCodecBuffer = &(pVideoEnc->pMFCEncInputBuffer[0]);
+        nBufferCnt = MFC_INPUT_BUFFER_NUM_MAX;
+        nPlaneCnt = MFC_INPUT_BUFFER_PLANE;
+    } else {
+        ppCodecBuffer = &(pVideoEnc->pMFCEncOutputBuffer[0]);
+        nBufferCnt = MFC_OUTPUT_BUFFER_NUM_MAX;
+        nPlaneCnt = MFC_OUTPUT_BUFFER_PLANE;
+    }
+
+    for (i = 0; i < nBufferCnt; i++) {
+        if (ppCodecBuffer[i] != NULL) {
+            for (j = 0; j < nPlaneCnt; j++) {
+                if (ppCodecBuffer[i]->pVirAddr[j] != NULL)
+                    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, ppCodecBuffer[i]->pVirAddr[j]);
+            }
+
+            Exynos_OSAL_Free(ppCodecBuffer[i]);
+            ppCodecBuffer[i] = NULL;
+        }
+    }
+
+    FunctionOut();
+}
+
+OMX_ERRORTYPE Exynos_Allocate_CodecBuffers(
+    OMX_COMPONENTTYPE   *pOMXComponent,
+    OMX_U32              nPortIndex,
+    OMX_U32              nBufferCnt,
+    OMX_U32              nPlaneSize[MFC_OUTPUT_BUFFER_PLANE])
+{
+    OMX_ERRORTYPE                    ret                = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT        *pExynosComponent   = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT   *pVideoEnc          = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    MEMORY_TYPE                      eMemoryType        = SYSTEM_MEMORY;
+    CODEC_ENC_BUFFER               **ppCodecBuffer      = NULL;
+
+    OMX_U32 nPlaneCnt = 0;
+    int i, j;
+
+    FunctionIn();
+
+    if (nPortIndex == INPUT_PORT_INDEX) {
+        ppCodecBuffer = &(pVideoEnc->pMFCEncInputBuffer[0]);
+        nPlaneCnt = MFC_INPUT_BUFFER_PLANE;
+    } else {
+        ppCodecBuffer = &(pVideoEnc->pMFCEncOutputBuffer[0]);
+        nPlaneCnt = MFC_OUTPUT_BUFFER_PLANE;
+#ifdef USE_CSC_HW
+        eMemoryType = NORMAL_MEMORY;
+#endif
+    }
+
+    if (pVideoEnc->bDRMPlayerMode == OMX_TRUE)
+        eMemoryType = SECURE_MEMORY;
+
+    for (i = 0; i < nBufferCnt; i++) {
+        ppCodecBuffer[i] = (CODEC_ENC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
+        if (ppCodecBuffer[i] == NULL) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc codec buffer");
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+        Exynos_OSAL_Memset(ppCodecBuffer[i], 0, sizeof(CODEC_ENC_BUFFER));
+
+        for (j = 0; j < nPlaneCnt; j++) {
+            ppCodecBuffer[i]->pVirAddr[j] =
+                (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, nPlaneSize[j], eMemoryType);
+            if (ppCodecBuffer[i]->pVirAddr[j] == NULL) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc plane");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+
+            ppCodecBuffer[i]->fd[j] =
+                Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, ppCodecBuffer[i]->pVirAddr[j]);
+            ppCodecBuffer[i]->bufferSize[j] = nPlaneSize[j];
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "PORT[%d]: pMFCCodecBuffer[%d]->pVirAddr[%d]: 0x%x", nPortIndex, i, j, ppCodecBuffer[i]->pVirAddr[j]);
+        }
+
+        ppCodecBuffer[i]->dataSize = 0;
+    }
+
+    return OMX_ErrorNone;
+
+EXIT:
+    Exynos_Free_CodecBuffers(pOMXComponent, nPortIndex);
+
+    FunctionOut();
+
+    return ret;
+}
+
 OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex)
 {
     OMX_BOOL ret = OMX_FALSE;
@@ -104,6 +211,8 @@ OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosCo
 
     pData->buffer.multiPlaneBuffer.dataBuffer[0] = pInputCodecBuffer->pVirAddr[0];
     pData->buffer.multiPlaneBuffer.dataBuffer[1] = pInputCodecBuffer->pVirAddr[1];
+    pData->buffer.multiPlaneBuffer.fd[0] = pInputCodecBuffer->fd[0];
+    pData->buffer.multiPlaneBuffer.fd[1] = pInputCodecBuffer->fd[1];
     pData->allocSize     = pInputCodecBuffer->bufferSize[0] + pInputCodecBuffer->bufferSize[1];
     pData->dataLen       = pInputCodecBuffer->dataSize;
     pData->usedDataLen   = 0;
@@ -124,6 +233,7 @@ OMX_ERRORTYPE Exynos_Output_CodecBufferToData(
     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
 
     pData->buffer.singlePlaneBuffer.dataBuffer = pCodecBuffer->pVirAddr[0];
+    pData->buffer.singlePlaneBuffer.fd = pCodecBuffer->fd[0];
     pData->allocSize     = pCodecBuffer->bufferSize[0];
     pData->dataLen       = 0;
     pData->usedDataLen   = 0;
@@ -184,14 +294,16 @@ OMX_BOOL Exynos_CSC_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA
 
     unsigned int csc_src_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar);
     unsigned int csc_dst_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar);
-    CSC_METHOD csc_method = CSC_METHOD_SW;
-    unsigned int cacheable = 1;
+
+    CSC_ERRORCODE   cscRet      = CSC_ErrorNone;
+    CSC_METHOD      csc_method  = CSC_METHOD_SW;
+    CSC_MEMTYPE     csc_memType = CSC_MEMORY_USERPTR;
+
+    unsigned int srcCacheable = 1, dstCacheable = 1;
 
     unsigned char *pSrcBuf[3] = {NULL, };
     unsigned char *pDstBuf[3] = {NULL, };
 
-    CSC_ERRORCODE cscRet = CSC_ErrorNone;
-
     pSrcBuf[0]  = checkInputStream;
     pSrcBuf[1]  = checkInputStream + (nFrameWidth * nFrameHeight);
     pSrcBuf[2]  = checkInputStream + (((nFrameWidth * nFrameHeight) * 5) / 4);
@@ -201,11 +313,8 @@ OMX_BOOL Exynos_CSC_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA
     pDstBuf[2] = srcInputData->buffer.multiPlaneBuffer.dataBuffer[2];
 
     csc_get_method(pVideoEnc->csc_handle, &csc_method);
-    if (csc_method == CSC_METHOD_HW) {
-        pDstBuf[0] = srcInputData->buffer.multiPlaneBuffer.fd[0];
-        pDstBuf[1] = srcInputData->buffer.multiPlaneBuffer.fd[1];
-        pDstBuf[2] = srcInputData->buffer.multiPlaneBuffer.fd[2];
-    }
+    if (csc_method == CSC_METHOD_HW)
+        dstCacheable = 0;
 
 #ifdef USE_METADATABUFFERTYPE
     OMX_PTR ppBuf[MAX_BUFFER_PLANE];
@@ -231,10 +340,21 @@ OMX_BOOL Exynos_CSC_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA
 
             imageSize = nFrameWidth * nFrameHeight * 3; /* RGB888 */
 
+#ifdef USE_GSC_RGB_ENCODER
+            if (pVideoEnc->csc_set_format == OMX_FALSE) {
+                cscRet = csc_set_method(pVideoEnc->csc_handle, CSC_METHOD_HW);
+                if (cscRet != CSC_ErrorNone) {
+                    ret = OMX_FALSE;
+                    goto EXIT;
+                }
+            }
+#endif
+
 #ifdef USE_DMA_BUF
-            if (csc_method == CSC_METHOD_HW)
+            if (csc_method == CSC_METHOD_HW) {
+                csc_memType = CSC_MEMORY_DMABUF;
                 pSrcBuf[0]  = (unsigned char *)planes[0].fd;
-            else
+            else
 #endif
             pSrcBuf[0] = planes[0].addr;
             pSrcBuf[1]  = NULL;
@@ -245,6 +365,7 @@ OMX_BOOL Exynos_CSC_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA
     {
 #ifdef USE_DMA_BUF
         if (csc_method == CSC_METHOD_HW) {
+            csc_memType = CSC_MEMORY_DMABUF;
             pSrcBuf[0]  = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, checkInputStream);
             pSrcBuf[1]  = NULL;
             pSrcBuf[2]  = NULL;
@@ -269,6 +390,14 @@ OMX_BOOL Exynos_CSC_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA
         }
     }
 
+#ifdef USE_DMA_BUF
+    if (csc_method == CSC_METHOD_HW) {
+        pDstBuf[0] = srcInputData->buffer.multiPlaneBuffer.fd[0];
+        pDstBuf[1] = srcInputData->buffer.multiPlaneBuffer.fd[1];
+        pDstBuf[2] = srcInputData->buffer.multiPlaneBuffer.fd[2];
+    }
+#endif
+
     csc_set_src_format(
         pVideoEnc->csc_handle,  /* handle */
         nFrameWidth,                  /* width */
@@ -278,7 +407,7 @@ OMX_BOOL Exynos_CSC_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA
         nFrameWidth,                  /* crop_width */
         nFrameHeight,                 /* crop_height */
         csc_src_color_format,   /* color_format */
-        cacheable);             /* cacheable */
+        srcCacheable);             /* cacheable */
     csc_set_dst_format(
         pVideoEnc->csc_handle,  /* handle */
         nFrameWidth,                  /* width */
@@ -288,15 +417,15 @@ OMX_BOOL Exynos_CSC_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA
         nFrameWidth,                  /* crop_width */
         nFrameHeight,                 /* crop_height */
         csc_dst_color_format,   /* color_format */
-        cacheable);             /* cacheable */
+        dstCacheable);             /* cacheable */
     csc_set_src_buffer(
         pVideoEnc->csc_handle,  /* handle */
         pSrcBuf,
-        CSC_MEMORY_DMABUF);     /* YUV Addr or FD */
+        csc_memType);           /* YUV Addr or FD */
     csc_set_dst_buffer(
         pVideoEnc->csc_handle,  /* handle */
         pDstBuf,
-        CSC_MEMORY_DMABUF);     /* YUV Addr or FD */
+        csc_memType);           /* YUV Addr or FD */
     cscRet = csc_convert(pVideoEnc->csc_handle);
     if (cscRet != CSC_ErrorNone)
         ret = OMX_FALSE;
@@ -377,7 +506,6 @@ OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
                 } else {
                     /* kMetadataBufferTypeCameraSource */
                     Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)inputUseBuffer->bufferHeader->pBuffer, ppBuf);
-#ifndef USE_USERPTR_CAMERA_INPUT
 #ifdef USE_DMA_BUF
                     srcInputData->buffer.multiPlaneBuffer.fd[0] = ppBuf[0];
                     srcInputData->buffer.multiPlaneBuffer.fd[1] = ppBuf[1];
@@ -395,12 +523,6 @@ OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
                     /* input buffers are 2 plane. */
                     srcInputData->buffer.multiPlaneBuffer.dataBuffer[2] = NULL;
                     srcInputData->buffer.multiPlaneBuffer.fd[2] = -1;
-#else
-                    for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
-                        srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] = ppBuf[plane];
-                    }
-                    srcInputData->buffer.multiPlaneBuffer.dataBuffer[2] = NULL;
-#endif
 #else
                     for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
                         srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] = ppBuf[plane];
@@ -452,7 +574,7 @@ OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
 
             if (((exynosInputPort->bStoreMetaData == OMX_TRUE) && (eColorFormat == OMX_COLOR_FormatAndroidOpaque)) ||
                 (exynosInputPort->bStoreMetaData == OMX_FALSE)) {
-                Exynos_InputBufferReturn(pOMXComponent);
+                Exynos_InputBufferReturn(pOMXComponent, inputUseBuffer);
             } else {
                 inputUseBuffer->dataValid = OMX_TRUE;
             }
@@ -460,9 +582,9 @@ OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
 
         if ((srcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "bSaveFlagEOS : OMX_TRUE");
-            srcInputData->dataLen = 0;
-            srcInputData->remainDataLen = 0;
             pExynosComponent->bSaveFlagEOS = OMX_TRUE;
+            if (srcInputData->dataLen != 0)
+                pExynosComponent->bBehaviorEOS = OMX_TRUE;
         }
 
         if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
@@ -495,7 +617,7 @@ OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
     FunctionIn();
 
     if (exynosOutputPort->bufferProcessType & BUFFER_SHARE) {
-        if (Exynos_Shared_DataToBuffer(dstOutputData, outputUseBuffer) == OMX_ErrorNone)
+        if (Exynos_Shared_DataToBuffer(dstOutputData, outputUseBuffer, OMX_FALSE) == OMX_ErrorNone)
             outputUseBuffer->dataValid = OMX_TRUE;
     }
 
@@ -533,7 +655,7 @@ OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
 
                 if ((outputUseBuffer->remainDataLen > 0) ||
                     (outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS)) {
-                    Exynos_OutputBufferReturn(pOMXComponent);
+                    Exynos_OutputBufferReturn(pOMXComponent, outputUseBuffer);
                 }
             } else {
                 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "output buffer is smaller than encoded data size Out Length");
@@ -546,7 +668,9 @@ OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
             if ((outputUseBuffer->remainDataLen > 0) ||
                 ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
                 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)))
-                Exynos_OutputBufferReturn(pOMXComponent);
+                Exynos_OutputBufferReturn(pOMXComponent, outputUseBuffer);
+            else
+                Exynos_OMX_FillThisBuffer(pOMXComponent, outputUseBuffer->bufferHeader);
         }
     } else {
         ret = OMX_FALSE;
@@ -587,41 +711,19 @@ OMX_ERRORTYPE Exynos_OMX_ExtensionSetup(OMX_HANDLETYPE hComponent)
             }
 
             if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                OMX_U32 nPlaneSize[MFC_INPUT_BUFFER_PLANE] = {0, };
+                nPlaneSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE;
+                nPlaneSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE;
+
                 Exynos_OSAL_SemaphoreCreate(&exynosInputPort->codecSemID);
                 Exynos_OSAL_QueueCreate(&exynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
 
-                for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
-                    pVideoEnc->pMFCEncInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
-                    /* Use ION Allocator */
-                    /*Alloc Y-Buffer */
-                    pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_YBUFFER_SIZE, NORMAL_MEMORY);
-                    pVideoEnc->pMFCEncInputBuffer[i]->fd[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
-                    pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE;
-                    /*Alloc C-Buffer */
-                    pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_CBUFFER_SIZE, NORMAL_MEMORY);
-                    pVideoEnc->pMFCEncInputBuffer[i]->fd[1] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
-                    pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE;
-
-                    pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
-
-                    if ((pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] == NULL) ||
-                        (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] == NULL)) {
-                        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
-                        ret = OMX_ErrorInsufficientResources;
-                        goto EXIT;
-                    }
-
-                    /* MFC input buffers are 1 plane. */
-                    pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[2] = NULL;
-                    pVideoEnc->pMFCEncInputBuffer[i]->fd[2] = -1;
-                    pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[2] = 0;
-
-                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]);
-                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
-                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
+                ret = Exynos_Allocate_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX, MFC_INPUT_BUFFER_NUM_MAX, nPlaneSize);
+                if (ret != OMX_ErrorNone)
+                    goto EXIT;
 
+                for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++)
                     Exynos_CodecBufferEnqueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
-                }
             } else if (exynosInputPort->bufferProcessType == BUFFER_SHARE) {
                 /*************/
                 /*    TBD    */
@@ -631,7 +733,6 @@ OMX_ERRORTYPE Exynos_OMX_ExtensionSetup(OMX_HANDLETYPE hComponent)
         }
     }
 
-
 EXIT:
 
     return ret;
@@ -755,8 +856,12 @@ OMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent)
                         Exynos_CodecBufferEnqueue(pExynosComponent, INPUT_PORT_INDEX, codecBuffer);
                 }
                 if (exynosInputPort->bufferProcessType & BUFFER_SHARE) {
-                    Exynos_Shared_DataToBuffer(&srcOutputData, srcOutputUseBuffer);
-                    Exynos_InputBufferReturn(pOMXComponent);
+                    OMX_BOOL bNeedUnlock = OMX_FALSE;
+                    OMX_COLOR_FORMATTYPE eColorFormat = exynosInputPort->portDefinition.format.video.eColorFormat;
+                    if (eColorFormat == OMX_COLOR_FormatAndroidOpaque)
+                        bNeedUnlock = OMX_TRUE;
+                    Exynos_Shared_DataToBuffer(&srcOutputData, srcOutputUseBuffer, bNeedUnlock);
+                    Exynos_InputBufferReturn(pOMXComponent, srcOutputUseBuffer);
                 }
                 Exynos_ResetCodecData(&srcOutputData);
             }
@@ -816,6 +921,18 @@ OMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent)
                         break;
                     }
                     Exynos_Shared_BufferToData(dstInputUseBuffer, &dstInputData, ONE_PLANE);
+                    if (pVideoEnc->bDRMPlayerMode == OMX_TRUE) {
+                        OMX_PTR dataBuffer = NULL;
+                        dataBuffer = Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc->hSharedMemory,
+                                                    dstInputData.buffer.singlePlaneBuffer.dataBuffer);
+                        if (dataBuffer == NULL) {
+                            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Wrong dst-input Secure buffer", __LINE__);
+                            ret = OMX_ErrorUndefined;
+                            break;
+                        }
+
+                        dstInputData.buffer.singlePlaneBuffer.dataBuffer = dataBuffer;
+                    }
                     Exynos_ResetDataBuffer(dstInputUseBuffer);
                 }
             }
@@ -1096,6 +1213,9 @@ OMX_ERRORTYPE Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent)
     Exynos_OSAL_ThreadTerminate(pVideoEnc->hDstOutputThread);
     pVideoEnc->hDstOutputThread = NULL;
 
+    pExynosComponent->checkTimeStamp.needSetStartTimeStamp      = OMX_FALSE;
+    pExynosComponent->checkTimeStamp.needCheckStartTimeStamp    = OMX_FALSE;
+
 EXIT:
     FunctionOut();
 
@@ -1150,6 +1270,7 @@ OMX_ERRORTYPE Exynos_OMX_VideoEncodeComponentInit(OMX_IN OMX_HANDLETYPE hCompone
     pExynosComponent->hComponentHandle = (OMX_HANDLETYPE)pVideoEnc;
 
     pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+    pExynosComponent->bBehaviorEOS = OMX_FALSE;
 
     pVideoEnc->bFirstInput  = OMX_FALSE;
     pVideoEnc->bFirstOutput = OMX_FALSE;