exynos_omx: multi_thread: Remove hardcoded limit on the max of number of input buffer...
authorSeungBeom Kim <sbcrux.kim@samsung.com>
Sat, 15 Sep 2012 03:01:55 +0000 (12:01 +0900)
committerJames Dong <jdong@google.com>
Sun, 23 Sep 2012 16:54:03 +0000 (09:54 -0700)
For [Issue 7166718] Remove hardcoded limit on the max of number of input buffers allowed in video encoders

Change-Id: I35bf8e5820aa95c3db5dd8d2cc049c3a028d93c9
Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com>
exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/enc/src/ExynosVideoEncoder.c
exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include/ExynosVideoApi.h
exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h
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
exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_SharedMemory.c

index 12636726c85c3f9d50f365b82e87d9e84f32fd28..b7797844e52a17734f7186fa55c6e8377c125074 100644 (file)
@@ -51,6 +51,7 @@
 #define H264_CTRL_NUM   91
 #define MPEG4_CTRL_NUM  26
 #define H263_CTRL_NUM   18
+#define MAX_INPUTBUFFER_COUNT 32
 
 /*
  * [Common] __CodingType_To_V4L2PixelFormat
@@ -1159,9 +1160,8 @@ static ExynosVideoErrorType MFC_Encoder_Setup_Inbuf(
     }
 
     if (nBufferCount == 0) {
-        ALOGE("%s: Buffer count must be greater than 0", __func__);
-        ret = VIDEO_ERROR_BADPARAM;
-        goto EXIT;
+        nBufferCount = MAX_INPUTBUFFER_COUNT;
+        ALOGV("%s: Change buffer count %d", __func__, nBufferCount);
     }
 
     memset(&req, 0, sizeof(req));
@@ -2090,6 +2090,157 @@ EXIT:
     return ret;
 }
 
+
+/*
+ * [Encoder Buffer OPS] FindIndex (Input)
+ */
+static int MFC_Encoder_FindEmpty_Inbuf(void *pHandle)
+{
+    ExynosVideoEncContext *pCtx = (ExynosVideoEncContext *)pHandle;
+    int nIndex = -1;
+
+    if (pCtx == NULL) {
+        ALOGE("%s: Video context info must be supplied", __func__);
+        goto EXIT;
+    }
+
+    for (nIndex = 0; nIndex < pCtx->nInbufs; nIndex++) {
+        if (pCtx->pInbuf[nIndex].bQueued == VIDEO_FALSE) {
+            break;
+        }
+    }
+
+    if (nIndex == pCtx->nInbufs)
+        nIndex = -1;
+
+EXIT:
+    return nIndex;
+}
+
+/*
+ * [Encoder Buffer OPS] ExtensionEnqueue (Input)
+ */
+static ExynosVideoErrorType MFC_Encoder_ExtensionEnqueue_Inbuf(
+    void          *pHandle,
+    unsigned char *pBuffer[],
+    unsigned int  *pFd[],
+    unsigned int   allocLen[],
+    unsigned int   dataSize[],
+    int            nPlanes,
+    void          *pPrivate)
+{
+    ExynosVideoEncContext *pCtx = (ExynosVideoEncContext *)pHandle;
+    ExynosVideoErrorType   ret  = VIDEO_ERROR_NONE;
+    pthread_mutex_t       *pMutex = NULL;
+
+    struct v4l2_plane planes[VIDEO_ENCODER_INBUF_PLANES];
+    struct v4l2_buffer buf;
+    int index, i;
+
+    if (pCtx == NULL) {
+        ALOGE("%s: Video context info must be supplied", __func__);
+        ret = VIDEO_ERROR_BADPARAM;
+        goto EXIT;
+    }
+
+    if (VIDEO_ENCODER_INBUF_PLANES < nPlanes) {
+        ALOGE("%s: Number of max planes : %d, nPlanes : %d", __func__,
+                                    VIDEO_ENCODER_INBUF_PLANES, nPlanes);
+        ret = VIDEO_ERROR_BADPARAM;
+        goto EXIT;
+    }
+
+    memset(&buf, 0, sizeof(buf));
+
+    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+    buf.m.planes = planes;
+    buf.length = VIDEO_ENCODER_INBUF_PLANES;
+
+    pMutex = (pthread_mutex_t*)pCtx->pInMutex;
+    pthread_mutex_lock(pMutex);
+    index = MFC_Encoder_FindEmpty_Inbuf(pCtx);
+    if (index == -1) {
+        pthread_mutex_unlock(pMutex);
+        ALOGE("%s: Failed to get index", __func__);
+        ret = VIDEO_ERROR_NOBUFFERS;
+        goto EXIT;
+    }
+
+    buf.index = index;
+
+    pCtx->pInbuf[buf.index].bQueued = VIDEO_TRUE;
+    pthread_mutex_unlock(pMutex);
+
+    buf.memory = pCtx->nMemoryType;
+    for (i = 0; i < nPlanes; i++) {
+        /* V4L2_MEMORY_DMABUF */
+        buf.m.planes[i].m.fd = (unsigned int)pFd[i];
+        buf.m.planes[i].length = allocLen[i];
+        buf.m.planes[i].bytesused = dataSize[i];
+
+        /* Temporary storage for Dequeue */
+        pCtx->pInbuf[buf.index].planes[i].addr = (unsigned long)pBuffer[i];
+        pCtx->pInbuf[buf.index].planes[i].fd = (unsigned int)pFd[i];
+        pCtx->pInbuf[buf.index].planes[i].allocSize = allocLen[i];
+    }
+
+    if (exynos_v4l2_qbuf(pCtx->hEnc, &buf) != 0) {
+        ALOGE("%s: Failed to enqueue input buffer", __func__);
+        pthread_mutex_lock(pMutex);
+        pCtx->pInbuf[buf.index].bQueued = VIDEO_FALSE;
+        pthread_mutex_unlock(pMutex);
+        ret = VIDEO_ERROR_APIFAIL;
+        goto EXIT;
+    }
+
+    pCtx->pInbuf[buf.index].pPrivate = pPrivate;
+
+EXIT:
+    return ret;
+}
+
+/*
+ * [Encoder Buffer OPS] ExtensionDequeue (Input)
+ */
+static ExynosVideoErrorType MFC_Encoder_ExtensionDequeue_Inbuf(void *pHandle, ExynosVideoBuffer *pVideoBuffer)
+{
+    ExynosVideoEncContext *pCtx     = (ExynosVideoEncContext *)pHandle;
+    ExynosVideoErrorType   ret  = VIDEO_ERROR_NONE;
+    pthread_mutex_t       *pMutex = NULL;
+
+    struct v4l2_buffer buf;
+
+    if (pCtx == NULL) {
+        ALOGE("%s: Video context info must be supplied", __func__);
+        ret = VIDEO_ERROR_BADPARAM;
+        goto EXIT;
+    }
+
+    if (pCtx->bStreamonInbuf == VIDEO_FALSE) {
+        ret = VIDEO_ERROR_APIFAIL;
+        goto EXIT;
+    }
+
+    memset(&buf, 0, sizeof(buf));
+    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+    buf.memory = pCtx->nMemoryType;
+    if (exynos_v4l2_dqbuf(pCtx->hEnc, &buf) != 0) {
+        ALOGE("%s: Failed to dequeue input buffer", __func__);
+        ret = VIDEO_ERROR_APIFAIL;
+        goto EXIT;
+    }
+
+    memcpy(pVideoBuffer, &pCtx->pInbuf[buf.index], sizeof(ExynosVideoBuffer));
+    pMutex = (pthread_mutex_t*)pCtx->pInMutex;
+    pthread_mutex_lock(pMutex);
+    pCtx->pInbuf[buf.index].bQueued = VIDEO_FALSE;
+    pthread_mutex_unlock(pMutex);
+
+EXIT:
+    return ret;
+}
+
+
 /*
  * [Encoder OPS] Common
  */
@@ -2126,6 +2277,8 @@ static ExynosVideoEncBufferOps defInbufOps = {
     .Register               = MFC_Encoder_Register_Inbuf,
     .Clear_RegisteredBuffer = MFC_Encoder_Clear_RegisteredBuffer_Inbuf,
     .Clear_Queue            = MFC_Encoder_Clear_Queued_Inbuf,
+    .ExtensionEnqueue       = MFC_Encoder_ExtensionEnqueue_Inbuf,
+    .ExtensionDequeue       = MFC_Encoder_ExtensionDequeue_Inbuf,
 };
 
 /*
index b7b643a1041a6a3c1e213aa86e42f09a11dca473..b8197de16f5f34193cbcc242a1282e86afd70e6d 100644 (file)
@@ -287,6 +287,8 @@ typedef struct _ExynosVideoEncBufferOps {
     ExynosVideoErrorType  (*Register)(void *pHandle, ExynosVideoPlane *planes, int nPlanes);
     ExynosVideoErrorType  (*Clear_RegisteredBuffer)(void *pHandle);
     ExynosVideoErrorType  (*Clear_Queue)(void *pHandle);
+    ExynosVideoErrorType  (*ExtensionEnqueue)(void *pHandle, unsigned char *pBuffer[], unsigned int *pFd[], unsigned int allocLen[], unsigned int dataSize[], int nPlanes, void *pPrivate);
+    ExynosVideoErrorType  (*ExtensionDequeue)(void *pHandle, ExynosVideoBuffer *pVideoBuffer);
 } ExynosVideoEncBufferOps;
 
 int Exynos_Video_Register_Decoder(
index 73e58e5bff79fa1cfc3a0d71770a2c73805c7300..cb5f11005361e19d73282e95208a651afc5ece5f 100644 (file)
@@ -58,7 +58,7 @@
 #define MFC_INPUT_BUFFER_PLANE              2
 #define MFC_OUTPUT_BUFFER_PLANE             1
 
-#define MAX_CAMERA_INPUTBUFFER_NUM          12 /* number of metadata buffer */
+#define MAX_INPUTBUFFER_NUM_DYNAMIC         0 /* Dynamic number of metadata buffer */
 
 // The largest metadata buffer size advertised
 // when metadata buffer mode is used for video encoding
index a5cf04ec463b428e4a4e56c07d89891c9462648c..d17a93424f0654ac26b35ab97ab1c5b0ff86ac26 100644 (file)
@@ -795,7 +795,7 @@ OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DAT
     bufferConf.nFrameHeight = pExynosInputPort->portDefinition.format.video.nFrameHeight;
     pInbufOps->Set_Shareable(hMFCHandle);
     if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
-        inputBufferNumber = MAX_CAMERA_INPUTBUFFER_NUM; /* Need change to number of camera buffer */
+        inputBufferNumber = MAX_INPUTBUFFER_NUM_DYNAMIC;
     } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
         inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
     }
@@ -907,7 +907,7 @@ OMX_ERRORTYPE H264CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
         SetupBufferNumber = MFC_OUTPUT_BUFFER_NUM_MAX;
     else
         SetupBufferNumber = pExynosOutputPort->portDefinition.nBufferCountActual;
-    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SetupBufferNumber:%d", SetupBufferNumber);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SetupBufferNumber:%d", SetupBufferNumber);
 
     if (pOutbufOps->Setup(pH264Enc->hMFCH264Handle.hMFCHandle, SetupBufferNumber) != VIDEO_ERROR_NONE) {
         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
@@ -1747,6 +1747,7 @@ OMX_ERRORTYPE Exynos_H264Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_
 
     if ((pSrcInputData->dataLen >= 0) ||
         ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
+        OMX_U32 nAllocLen[MFC_INPUT_BUFFER_PLANE] = {0, 0};
         OMX_U32 pMFCYUVDataSize[MFC_INPUT_BUFFER_PLANE]  = {NULL, NULL};
         ExynosVideoPlane planes[MFC_INPUT_BUFFER_PLANE];
         int plane;
@@ -1763,33 +1764,25 @@ OMX_ERRORTYPE Exynos_H264Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_
         pMFCYUVDataSize[0] = pExynosInputPort->portDefinition.format.video.nFrameWidth * pExynosInputPort->portDefinition.format.video.nFrameHeight;
         pMFCYUVDataSize[1] = pMFCYUVDataSize[0] / 2;
 
-        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
-                                    (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
 #ifdef USE_METADATABUFFERTYPE
-        if ((codecReturn == VIDEO_ERROR_NOBUFFERS) &&
-            (pExynosInputPort->bStoreMetaData == OMX_TRUE) &&
-            (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) {
-            OMX_U32 nAllocLen[MFC_INPUT_BUFFER_PLANE] = {0, 0};
-            nAllocLen[0] = ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameWidth) *
-                                ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameHeight);
-            nAllocLen[1] = ALIGN(nAllocLen[0]/2,256);
-            for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
-                planes[plane].addr = pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[plane];
-                planes[plane].allocSize = nAllocLen[plane];
-                planes[plane].fd = pSrcInputData->buffer.multiPlaneBuffer.fd[plane];
-            }
+        nAllocLen[0] = ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameWidth) *
+                            ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameHeight);
+        nAllocLen[1] = ALIGN(nAllocLen[0]/2,256);
 
-            /* Register input buffer */
-            if (pInbufOps->Register(pH264Enc->hMFCH264Handle.hMFCHandle,
-                        planes, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
-                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
-                ret = OMX_ErrorInsufficientResources;
-                goto EXIT;
-            }
+        if ((pExynosInputPort->bStoreMetaData == OMX_TRUE) &&
+            (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) {
+            codecReturn = pInbufOps->ExtensionEnqueue(hMFCHandle,
+                                        (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                        (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.fd,
+                                        (unsigned int *)nAllocLen, (unsigned int *)pMFCYUVDataSize,
+                                        MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
+        } else {
             codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
                                         (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
-
         }
+#else
+        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                    (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
 #endif
         if (codecReturn != VIDEO_ERROR_NONE) {
             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pInbufOps->Enqueue", __FUNCTION__, __LINE__);
@@ -1828,10 +1821,19 @@ OMX_ERRORTYPE Exynos_H264Enc_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
     ExynosVideoEncOps       *pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
     ExynosVideoEncBufferOps *pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
     ExynosVideoBuffer       *pVideoBuffer;
+    ExynosVideoBuffer        videoBuffer;
 
     FunctionIn();
 
-    pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
+    if ((pExynosInputPort->bStoreMetaData == OMX_TRUE) &&
+        (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) {
+        if (pInbufOps->ExtensionDequeue(hMFCHandle, &videoBuffer) == VIDEO_ERROR_NONE)
+            pVideoBuffer = &videoBuffer;
+        else
+            pVideoBuffer = NULL;
+    } else {
+        pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
+    }
 
     pSrcOutputData->dataLen       = 0;
     pSrcOutputData->usedDataLen   = 0;
index 8d129b40f8f15ed2c5df7e7c26ce524529a52bdd..3174deae4e9566c7b8b691b270d2726d75dbf6f9 100644 (file)
@@ -921,7 +921,7 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA
     bufferConf.nFrameHeight = pExynosInputPort->portDefinition.format.video.nFrameHeight;
     pInbufOps->Set_Shareable(hMFCHandle);
     if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
-        inputBufferNumber = MAX_CAMERA_INPUTBUFFER_NUM; /* Need change to number of camera buffer */
+        inputBufferNumber = MAX_INPUTBUFFER_NUM_DYNAMIC;
     } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
         inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
     }
@@ -1040,7 +1040,7 @@ OMX_ERRORTYPE Mpeg4CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
         SetupBufferNumber = MFC_OUTPUT_BUFFER_NUM_MAX;
     else
         SetupBufferNumber = pExynosOutputPort->portDefinition.nBufferCountActual;
-    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SetupBufferNumber:%d", SetupBufferNumber);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SetupBufferNumber:%d", SetupBufferNumber);
 
     if (pOutbufOps->Setup(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, SetupBufferNumber) != VIDEO_ERROR_NONE) {
         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
@@ -1957,6 +1957,7 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
 
     if ((pSrcInputData->dataLen >= 0) ||
         ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
+        OMX_U32 nAllocLen[MFC_INPUT_BUFFER_PLANE] = {0, 0};
         OMX_U32 pMFCYUVDataSize[MFC_INPUT_BUFFER_PLANE]  = {NULL, NULL};
         ExynosVideoPlane planes[MFC_INPUT_BUFFER_PLANE];
         int plane;
@@ -1973,33 +1974,25 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
         pMFCYUVDataSize[0] = pExynosInputPort->portDefinition.format.video.nFrameWidth * pExynosInputPort->portDefinition.format.video.nFrameHeight;
         pMFCYUVDataSize[1] = pMFCYUVDataSize[0] / 2;
 
-        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
-                                    (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
 #ifdef USE_METADATABUFFERTYPE
-        if ((codecReturn == VIDEO_ERROR_NOBUFFERS) &&
-            (pExynosInputPort->bStoreMetaData == OMX_TRUE) &&
-            (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) {
-            OMX_U32 nAllocLen[MFC_INPUT_BUFFER_PLANE] = {0, 0};
-            nAllocLen[0] = ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameWidth) *
-                                ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameHeight);
-            nAllocLen[1] = ALIGN(nAllocLen[0]/2,256);
-            for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
-                planes[plane].addr = pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[plane];
-                planes[plane].allocSize = nAllocLen[plane];
-                planes[plane].fd = pSrcInputData->buffer.multiPlaneBuffer.fd[plane];
-            }
+        nAllocLen[0] = ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameWidth) *
+                            ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameHeight);
+        nAllocLen[1] = ALIGN(nAllocLen[0]/2,256);
 
-            /* Register input buffer */
-            if (pInbufOps->Register(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle,
-                        planes, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
-                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
-                ret = OMX_ErrorInsufficientResources;
-                goto EXIT;
-            }
+        if ((pExynosInputPort->bStoreMetaData == OMX_TRUE) &&
+            (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) {
+            codecReturn = pInbufOps->ExtensionEnqueue(hMFCHandle,
+                                        (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                        (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.fd,
+                                        (unsigned int *)nAllocLen, (unsigned int *)pMFCYUVDataSize,
+                                        MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
+        } else {
             codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
                                         (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
-
         }
+#else
+        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                    (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
 #endif
         if (codecReturn != VIDEO_ERROR_NONE) {
             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pInbufOps->Enqueue", __FUNCTION__, __LINE__);
@@ -2038,10 +2031,19 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OM
     ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
     ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
     ExynosVideoBuffer       *pVideoBuffer;
+    ExynosVideoBuffer        videoBuffer;
 
     FunctionIn();
 
-    pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
+    if ((pExynosInputPort->bStoreMetaData == OMX_TRUE) &&
+        (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) {
+        if (pInbufOps->ExtensionDequeue(hMFCHandle, &videoBuffer) == VIDEO_ERROR_NONE)
+            pVideoBuffer = &videoBuffer;
+        else
+            pVideoBuffer = NULL;
+    } else {
+        pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
+    }
 
     pSrcOutputData->dataLen       = 0;
     pSrcOutputData->usedDataLen   = 0;
index b757ff69762ed3f477dc82b5650cdbd35f0a9fbb..775d48b9dfc99ba153f4c19298793f373710aee2 100644 (file)
@@ -414,7 +414,7 @@ int Exynos_OSAL_SharedMemory_VirtToION(OMX_HANDLETYPE handle, OMX_PTR pBuffer)
             pFindElement = pCurrentElement->pNextMemory;
         } else {
             Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
-            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find SharedMemory");
+            Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Can not find SharedMemory");
             goto EXIT;
         }
     }
@@ -456,7 +456,7 @@ OMX_PTR Exynos_OSAL_SharedMemory_IONToVirt(OMX_HANDLETYPE handle, int ion_addr)
             pFindElement = pCurrentElement->pNextMemory;
         } else {
             Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
-            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find SharedMemory");
+            Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Can not find SharedMemory");
             goto EXIT;
         }
     }