exynos_omx: multi_thread: Add New Encode scheme for support input buffer shere.
authorSeungBeom Kim <sbcrux.kim@samsung.com>
Tue, 7 Aug 2012 23:22:29 +0000 (16:22 -0700)
committerDima Zavin <dima@android.com>
Mon, 13 Aug 2012 23:59:38 +0000 (16:59 -0700)
The case of camera recording, input buffer shere.
If input is store metadata and color format is NV12M then, OpenMAX using Input buffer share scheme.
(Without CSC.)
If input color format is RGB then, OpenMAX using copy(RGB to NV12M CSC) scheme.
This Scheme is supported Dynamic change in the execute state.
(But, Can be changed only once in the time of first frame receive.)
each frame changes can not support.

Change-Id: Iba59e8c04fcea3916665ae86ece52c825ee13eec
Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com>
exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.c
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/Android.mk
exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp
exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.h

index 8f0fd81e5add312cde9e06acf2f4abb3b7f0ffd0..59628f4b64538391871f85a3ad0ad723003f91c2 100644 (file)
 #include "Exynos_OMX_Basecomponent.h"
 #include "Exynos_OSAL_Thread.h"
 #include "Exynos_OSAL_Semaphore.h"
+#include "Exynos_OSAL_SharedMemory.h"
 #include "Exynos_OSAL_Mutex.h"
 #include "Exynos_OSAL_ETC.h"
 #include "csc.h"
 
 #ifdef USE_STOREMETADATA
+#include <system/window.h>
 #include "Exynos_OSAL_Android.h"
 #endif
 
@@ -337,27 +339,51 @@ OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
             if (exynosInputPort->bStoreMetaData == OMX_TRUE) {
                 OMX_PTR ppBuf[MAX_BUFFER_PLANE];
                 OMX_PTR allocSize[MAX_BUFFER_PLANE];
-                int plane = 0;
-
-                /* kMetadataBufferTypeCameraSource */
-                Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)inputUseBuffer->bufferHeader->pBuffer, ppBuf);
-                srcInputData->buffer.multiPlaneBuffer.fd[0] = ppBuf[0];
-                srcInputData->buffer.multiPlaneBuffer.fd[1] = ppBuf[1];
-                allocSize[0] = nFrameWidth * nFrameHeight;
-                allocSize[1] = nFrameWidth * nFrameHeight >> 1;
-
-                for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
-                    srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] =
-                        Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc->hSharedMemory, srcInputData->buffer.multiPlaneBuffer.fd[plane]);
-                    if(srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] == NULL) {
+                int     plane = 0;
+                if (eColorFormat == OMX_COLOR_FormatAndroidOpaque) {
+                    Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)inputUseBuffer->bufferHeader->pBuffer, ppBuf);
+                    ExynosVideoPlane planes[MAX_BUFFER_PLANE];
+
+                    Exynos_OSAL_LockANBHandle((OMX_U32)ppBuf[0], nFrameWidth, nFrameHeight, OMX_COLOR_FormatYUV420SemiPlanar, planes);
+
+                    srcInputData->buffer.multiPlaneBuffer.fd[0] = planes[0].fd;
+                    srcInputData->buffer.multiPlaneBuffer.fd[1] = planes[1].fd;
+                    allocSize[0] = nFrameWidth * nFrameHeight;
+                    allocSize[1] = nFrameWidth * nFrameHeight >> 1;
+
+                    for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
                         srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] =
-                            Exynos_OSAL_SharedMemory_Map(pVideoEnc->hSharedMemory, allocSize[plane], srcInputData->buffer.multiPlaneBuffer.fd[plane]);
+                            Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc->hSharedMemory, srcInputData->buffer.multiPlaneBuffer.fd[plane]);
+                        if(srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] == NULL) {
+                            srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] =
+                                Exynos_OSAL_SharedMemory_Map(pVideoEnc->hSharedMemory, allocSize[plane], srcInputData->buffer.multiPlaneBuffer.fd[plane]);
+                        }
                     }
+                    /* input buffers are 2 plane. */
+                    srcInputData->buffer.multiPlaneBuffer.dataBuffer[2] = NULL;
+                    srcInputData->buffer.multiPlaneBuffer.fd[2] = -1;
+                    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s:%d YAddr: 0x%x CbCrAddr: 0x%x", __FUNCTION__, __LINE__, (unsigned int)ppBuf[0], (unsigned int)ppBuf[0]);
+                } else {
+                    /* kMetadataBufferTypeCameraSource */
+                    Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)inputUseBuffer->bufferHeader->pBuffer, ppBuf);
+                    srcInputData->buffer.multiPlaneBuffer.fd[0] = ppBuf[0];
+                    srcInputData->buffer.multiPlaneBuffer.fd[1] = ppBuf[1];
+                    allocSize[0] = nFrameWidth * nFrameHeight;
+                    allocSize[1] = nFrameWidth * nFrameHeight >> 1;
+
+                    for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                        srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] =
+                            Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc->hSharedMemory, srcInputData->buffer.multiPlaneBuffer.fd[plane]);
+                        if(srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] == NULL) {
+                            srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] =
+                                Exynos_OSAL_SharedMemory_Map(pVideoEnc->hSharedMemory, allocSize[plane], srcInputData->buffer.multiPlaneBuffer.fd[plane]);
+                        }
+                    }
+                    /* input buffers are 2 plane. */
+                    srcInputData->buffer.multiPlaneBuffer.dataBuffer[2] = NULL;
+                    srcInputData->buffer.multiPlaneBuffer.fd[2] = -1;
+                    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s:%d YAddr: 0x%x CbCrAddr: 0x%x", __FUNCTION__, __LINE__, (unsigned int)ppBuf[0], (unsigned int)ppBuf[0]);
                 }
-                /* input buffers are 2 plane. */
-                srcInputData->buffer.multiPlaneBuffer.dataBuffer[2] = NULL;
-                srcInputData->buffer.multiPlaneBuffer.fd[2] = -1;
-                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 */
@@ -505,6 +531,86 @@ EXIT:
     return ret;
 }
 
+#ifdef USE_METADATABUFFERTYPE
+OMX_ERRORTYPE Exynos_OMX_ExtensionSetup(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *srcInputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer;
+    EXYNOS_OMX_DATA          *pSrcInputData = &exynosInputPort->processData;
+    OMX_COLOR_FORMATTYPE      eColorFormat = exynosInputPort->portDefinition.format.video.eColorFormat;
+
+    int i = 0;
+    OMX_PTR ppBuf[MAX_BUFFER_PLANE];
+
+
+    /* kMetadataBufferTypeGrallocSource */
+    if (exynosInputPort->bStoreMetaData == OMX_TRUE) {
+        Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)srcInputUseBuffer->bufferHeader->pBuffer, ppBuf);
+        if (eColorFormat == OMX_COLOR_FormatAndroidOpaque) {
+            pVideoEnc->ANBColorFormat = Exynos_OSAL_GetANBColorFormat(ppBuf[0]);
+            if ((pVideoEnc->ANBColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) ||
+                (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV12Tiled)) {
+                exynosInputPort->bufferProcessType = BUFFER_SHARE;
+            } else {
+                exynosInputPort->bufferProcessType = BUFFER_COPY;
+            }
+
+            if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                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]);
+
+                    Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
+                }
+            } else if (exynosInputPort->bufferProcessType == BUFFER_SHARE) {
+                /*************/
+                /*    TBD    */
+                /*************/
+                /* Does not require any actions. */
+            }
+        }
+    }
+
+
+EXIT:
+
+    return ret;
+}
+#endif
+
 OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent)
 {
     OMX_ERRORTYPE          ret = OMX_ErrorNone;
@@ -533,27 +639,34 @@ OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent)
                 break;
 
             Exynos_OSAL_MutexLock(srcInputUseBuffer->bufferMutex);
-            if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
-                OMX_PTR codecBuffer;
-                if ((pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) || (pSrcInputData->pPrivate == NULL)) {
-                    Exynos_CodecBufferDeQueue(pExynosComponent, INPUT_PORT_INDEX, &codecBuffer);
-                    if (codecBuffer != NULL) {
-                        Exynos_Input_CodecBufferToData(pExynosComponent, codecBuffer, pSrcInputData);
+            if (pVideoEnc->bFirstInput == OMX_FALSE) {
+                if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                    OMX_PTR codecBuffer;
+                    if ((pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) || (pSrcInputData->pPrivate == NULL)) {
+                        Exynos_CodecBufferDeQueue(pExynosComponent, INPUT_PORT_INDEX, &codecBuffer);
+                        if (codecBuffer != NULL) {
+                            Exynos_Input_CodecBufferToData(pExynosComponent, codecBuffer, pSrcInputData);
+                        }
+                        Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
+                        break;
                     }
-                    Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
-                    break;
                 }
-            }
 
-            if (srcInputUseBuffer->dataValid == OMX_TRUE) {
-                bCheckInputData = Exynos_Preprocessor_InputData(pOMXComponent, pSrcInputData);
-            } else {
-                bCheckInputData = OMX_FALSE;
+                if (srcInputUseBuffer->dataValid == OMX_TRUE) {
+                    bCheckInputData = Exynos_Preprocessor_InputData(pOMXComponent, pSrcInputData);
+                } else {
+                    bCheckInputData = OMX_FALSE;
+                }
             }
-
             if ((bCheckInputData == OMX_FALSE) &&
                 (!CHECK_PORT_BEING_FLUSHED(exynosInputPort))) {
                 ret = Exynos_InputBufferGetQueue(pExynosComponent);
+#ifdef USE_METADATABUFFERTYPE
+                if (pVideoEnc->bFirstInput == OMX_TRUE) {
+                    Exynos_OMX_ExtensionSetup(hComponent);
+                    pVideoEnc->bFirstInput = OMX_FALSE;
+                }
+#endif
                 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
                 break;
             }
@@ -1012,6 +1125,8 @@ OMX_ERRORTYPE Exynos_OMX_VideoEncodeComponentInit(OMX_IN OMX_HANDLETYPE hCompone
 
     pExynosComponent->bSaveFlagEOS = OMX_FALSE;
 
+    pVideoEnc->bFirstInput  = OMX_FALSE;
+    pVideoEnc->bFirstOutput = OMX_FALSE;
     pVideoEnc->configChange = OMX_FALSE;
     pVideoEnc->quantization.nQpI = 4; // I frame quantization parameter
     pVideoEnc->quantization.nQpP = 5; // P frame quantization parameter
index 1d4ba7218a45d0181579f1498930e1eea7715dd7..73e58e5bff79fa1cfc3a0d71770a2c73805c7300 100644 (file)
@@ -100,8 +100,11 @@ typedef struct _EXYNOS_OMX_VIDEOENC_COMPONENT
     OMX_VIDEO_CONTROLRATETYPE eControlRate[ALL_PORT_NUM];
     OMX_VIDEO_PARAM_QUANTIZATIONTYPE quantization;
 
+    OMX_BOOL bFirstInput;
     OMX_BOOL bFirstOutput;
 
+    OMX_COLOR_FORMATTYPE ANBColorFormat;
+
     /* CSC handle */
     OMX_PTR csc_handle;
     OMX_U32 csc_set_format;
index 070327afbade8806f44132fa9a096274ddf1815a..0a5ca34ae3021a35e134373cef035df621c5035e 100644 (file)
@@ -252,23 +252,28 @@ static void Set_H264Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
     pCommonParam->CbPadVal     = 0;
     pCommonParam->CrPadVal     = 0;
 
-    switch ((EXYNOS_OMX_COLOR_FORMATTYPE)pExynosInputPort->portDefinition.format.video.eColorFormat) {
-    case OMX_COLOR_FormatYUV420SemiPlanar:
-    case OMX_COLOR_FormatYUV420Planar: /* Converted to NV12 in Exynos_Preprocessor_InputData */
+    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        if (pVideoEnc->ANBColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
+        if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV12Tiled)
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
+    } else {
+        switch ((EXYNOS_OMX_COLOR_FORMATTYPE)pExynosInputPort->portDefinition.format.video.eColorFormat) {
+        case OMX_COLOR_FormatYUV420SemiPlanar:
+        case OMX_COLOR_FormatYUV420Planar: /* Converted to NV12 in Exynos_CSC_InputData */
 #ifdef USE_METADATABUFFERTYPE
-    case OMX_COLOR_FormatAndroidOpaque:
+        case OMX_COLOR_FormatAndroidOpaque:
 #endif
-        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
-        break;
-    case OMX_SEC_COLOR_FormatNV12Tiled:
-        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
-        break;
-    case OMX_SEC_COLOR_FormatNV21Linear:
-        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21;
-        break;
-    default:
-        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
-        break;
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
+            break;
+        case OMX_SEC_COLOR_FormatNV21Linear:
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21;
+            break;
+        case OMX_SEC_COLOR_FormatNV12Tiled:
+        default:
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
+            break;
+        }
     }
 
     /* H.264 specific parameters */
@@ -785,7 +790,7 @@ OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DAT
 
     /* input buffer info: only 3 config values needed */
     Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
-    bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12;
+    bufferConf.eColorFormat = pEncParam->commonParam.FrameMap;//VIDEO_COLORFORMAT_NV12;
     bufferConf.nFrameWidth = pExynosInputPort->portDefinition.format.video.nFrameWidth;
     bufferConf.nFrameHeight = pExynosInputPort->portDefinition.format.video.nFrameHeight;
     pInbufOps->Set_Shareable(hMFCHandle);
@@ -1527,7 +1532,6 @@ OMX_ERRORTYPE Exynos_H264Enc_Init(OMX_COMPONENTTYPE *pOMXComponent)
 
     pH264Enc->hMFCH264Handle.bConfiguredMFCSrc = OMX_FALSE;
     pH264Enc->hMFCH264Handle.bConfiguredMFCDst = OMX_FALSE;
-    pVideoEnc->bFirstOutput = OMX_FALSE;
     pExynosComponent->bUseFlagEOF = OMX_TRUE;
     pExynosComponent->bSaveFlagEOS = OMX_FALSE;
 
@@ -1552,47 +1556,50 @@ OMX_ERRORTYPE Exynos_H264Enc_Init(OMX_COMPONENTTYPE *pOMXComponent)
     pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
     pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
 
-    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
-        Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
-        Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
+    if ((pExynosInputPort->bStoreMetaData != OMX_TRUE) &&
+        (eColorFormat != OMX_COLOR_FormatAndroidOpaque)) {
+        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+            Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
+            Exynos_OSAL_QueueCreate(&pExynosInputPort->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;
+                }
 
-        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;
+                /* MFC input buffers are 1 plane. */
+                pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[2] = NULL;
+                pVideoEnc->pMFCEncInputBuffer[i]->fd[2] = -1;
+                pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[2] = 0;
 
-            pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 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]);
 
-            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;
+                Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
             }
-
-            /* 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_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]);
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
-
-            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
+        } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+            /*************/
+            /*    TBD    */
+            /*************/
+            /* Does not require any actions. */
         }
-    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
-        /*************/
-        /*    TBD    */
-        /*************/
-        /* Does not require any actions. */
     }
 
     if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
index a2f23372a6d9146700c0ae4a4a176a16db1ece5d..b391f9992631616afa7797a4d70d37a7947d9deb 100644 (file)
@@ -243,23 +243,28 @@ static void Set_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
     pCommonParam->CbPadVal     = 0;
     pCommonParam->CrPadVal     = 0;
 
-    switch ((EXYNOS_OMX_COLOR_FORMATTYPE)pExynosInputPort->portDefinition.format.video.eColorFormat) {
-    case OMX_COLOR_FormatYUV420SemiPlanar:
-    case OMX_COLOR_FormatYUV420Planar: /* Converted to NV12 in Exynos_Preprocessor_InputData */
+    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV21Linear)
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
+        if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV12Tiled)
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
+    } else {
+        switch ((EXYNOS_OMX_COLOR_FORMATTYPE)pExynosInputPort->portDefinition.format.video.eColorFormat) {
+        case OMX_COLOR_FormatYUV420SemiPlanar:
+        case OMX_COLOR_FormatYUV420Planar: /* Converted to NV12 in Exynos_CSC_InputData */
 #ifdef USE_METADATABUFFERTYPE
-    case OMX_COLOR_FormatAndroidOpaque:
+        case OMX_COLOR_FormatAndroidOpaque:
 #endif
-        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
-        break;
-    case OMX_SEC_COLOR_FormatNV12Tiled:
-        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
-        break;
-    case OMX_SEC_COLOR_FormatNV21Linear:
-        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21;
-        break;
-    default:
-        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
-        break;
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
+            break;
+        case OMX_SEC_COLOR_FormatNV21Linear:
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21;
+            break;
+        case OMX_SEC_COLOR_FormatNV12Tiled:
+        default:
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
+            break;
+        }
     }
 
     /* Mpeg4 specific parameters */
@@ -339,23 +344,28 @@ static void Set_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
     pCommonParam->CbPadVal     = 0;
     pCommonParam->CrPadVal     = 0;
 
-    switch ((EXYNOS_OMX_COLOR_FORMATTYPE)pExynosInputPort->portDefinition.format.video.eColorFormat) {
-    case OMX_COLOR_FormatYUV420SemiPlanar:
-    case OMX_COLOR_FormatYUV420Planar: /* Converted to NV12 in Exynos_Preprocessor_InputData */
+    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV21Linear)
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
+        if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV12Tiled)
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
+    } else {
+        switch ((EXYNOS_OMX_COLOR_FORMATTYPE)pExynosInputPort->portDefinition.format.video.eColorFormat) {
+        case OMX_COLOR_FormatYUV420SemiPlanar:
+        case OMX_COLOR_FormatYUV420Planar: /* Converted to NV12 in Exynos_CSC_InputData */
 #ifdef USE_METADATABUFFERTYPE
-    case OMX_COLOR_FormatAndroidOpaque:
+        case OMX_COLOR_FormatAndroidOpaque:
 #endif
-        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
-        break;
-    case OMX_SEC_COLOR_FormatNV12Tiled:
-        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
-        break;
-    case OMX_SEC_COLOR_FormatNV21Linear:
-        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21;
-        break;
-    default:
-        pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
-        break;
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
+            break;
+        case OMX_SEC_COLOR_FormatNV21Linear:
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21;
+            break;
+        case OMX_SEC_COLOR_FormatNV12Tiled:
+        default:
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
+            break;
+        }
     }
 
     /* H263 specific parameters */
@@ -906,7 +916,7 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA
 
     /* input buffer info: only 3 config values needed */
     Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
-    bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12;
+    bufferConf.eColorFormat = pEncParam->commonParam.FrameMap;//VIDEO_COLORFORMAT_NV12;
     bufferConf.nFrameWidth = pExynosInputPort->portDefinition.format.video.nFrameWidth;
     bufferConf.nFrameHeight = pExynosInputPort->portDefinition.format.video.nFrameHeight;
     pInbufOps->Set_Shareable(hMFCHandle);
@@ -1732,7 +1742,6 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_Init(OMX_COMPONENTTYPE *pOMXComponent)
 
     pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_FALSE;
     pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_FALSE;
-    pVideoEnc->bFirstOutput = OMX_FALSE;
     pExynosComponent->bUseFlagEOF = OMX_TRUE;
     pExynosComponent->bSaveFlagEOS = OMX_FALSE;
 
@@ -1757,47 +1766,50 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_Init(OMX_COMPONENTTYPE *pOMXComponent)
     pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
     pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
 
-    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
-        Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
-        Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
+    if ((pExynosInputPort->bStoreMetaData != OMX_TRUE) &&
+        (eColorFormat != OMX_COLOR_FormatAndroidOpaque)) {
+        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+            Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
+            Exynos_OSAL_QueueCreate(&pExynosInputPort->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;
+                }
 
-        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;
+                /* MFC input buffers are 1 plane. */
+                pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[2] = NULL;
+                pVideoEnc->pMFCEncInputBuffer[i]->fd[2] = -1;
+                pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[2] = 0;
 
-            pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 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]);
 
-            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;
+                Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
             }
-
-            /* 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_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]);
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
-
-            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
+        } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+            /*************/
+            /*    TBD    */
+            /*************/
+            /* Does not require any actions. */
         }
-    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
-        /*************/
-        /*    TBD    */
-        /*************/
-        /* Does not require any actions. */
     }
 
     if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
index 73f2a1307e279b3d48725a432d0dd6c598782e87..c58f5e08813600b7c46b584c87966c0e23e9d8e4 100644 (file)
@@ -32,7 +32,9 @@ LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
        $(EXYNOS_OMX_TOP)/osal \
        $(EXYNOS_OMX_COMPONENT)/common \
        $(EXYNOS_OMX_COMPONENT)/video/dec \
+       $(EXYNOS_OMX_COMPONENT)/video/enc \
        $(EXYNOS_OMX_TOP)/video/dec \
+       $(EXYNOS_OMX_TOP)/video/enc \
        hardware/samsung_slsi/exynos5/include \
        frameworks/native/include/media/hardware \
        frameworks/native/include/media/openmax \
index c327be7a22c04699252e8b4ff737f559089298ab..142580ca85ddb00a42c0a57e672792db8b6310b6 100644 (file)
@@ -44,6 +44,7 @@
 #include "Exynos_OMX_Basecomponent.h"
 #include "Exynos_OMX_Macros.h"
 #include "Exynos_OMX_Vdec.h"
+#include "Exynos_OMX_Venc.h"
 #include "Exynos_OSAL_Android.h"
 #include "exynos_format.h"
 
@@ -139,6 +140,22 @@ EXIT:
     return ret;
 }
 
+OMX_COLOR_FORMATTYPE Exynos_OSAL_GetANBColorFormat(OMX_IN OMX_U32 handle)
+{
+    FunctionIn();
+
+    OMX_COLOR_FORMATTYPE ret = OMX_COLOR_FormatUnused;
+    private_handle_t *priv_hnd = (private_handle_t *) handle;
+
+    ret = Exynos_OSAL_Hal2OMXPixelFormat(priv_hnd->format);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "ColorFormat: 0x%x", ret);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
 OMX_ERRORTYPE Exynos_OSAL_LockANB(
     OMX_IN OMX_PTR pBuffer,
     OMX_IN OMX_U32 width,
@@ -352,7 +369,6 @@ OMX_ERRORTYPE Exynos_OSAL_SetANBParameter(
     OMX_ERRORTYPE          ret = OMX_ErrorNone;
     OMX_COMPONENTTYPE     *pOMXComponent = NULL;
     EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
-    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
 
     FunctionIn();
 
@@ -383,11 +399,11 @@ OMX_ERRORTYPE Exynos_OSAL_SetANBParameter(
         goto EXIT;
     }
 
-    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
 
     switch (nIndex) {
     case OMX_IndexParamEnableAndroidBuffers:
     {
+        EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
         EnableAndroidNativeBuffersParams *pANBParams = (EnableAndroidNativeBuffersParams *) ComponentParameterStructure;
         OMX_U32 portIndex = pANBParams->nPortIndex;
         EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
@@ -425,6 +441,7 @@ OMX_ERRORTYPE Exynos_OSAL_SetANBParameter(
 
     case OMX_IndexParamUseAndroidNativeBuffer:
     {
+        EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
         UseAndroidNativeBufferParams *pANBParams = (UseAndroidNativeBufferParams *) ComponentParameterStructure;
         OMX_U32 portIndex = pANBParams->nPortIndex;
         EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
@@ -477,6 +494,7 @@ OMX_ERRORTYPE Exynos_OSAL_SetANBParameter(
 
     case OMX_IndexParamStoreMetaDataBuffer:
     {
+        EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;;
         StoreMetaDataInBuffersParams *pANBParams = (StoreMetaDataInBuffersParams *) ComponentParameterStructure;
         OMX_U32 portIndex = pANBParams->nPortIndex;
         EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
@@ -501,6 +519,7 @@ OMX_ERRORTYPE Exynos_OSAL_SetANBParameter(
         }
 
         pExynosPort->bStoreMetaData = pANBParams->bStoreMetaData;
+        pVideoEnc->bFirstInput = OMX_TRUE;
     }
         break;
 
index 753020ecbd7534a95c7c527ffa9903e0544d7f3f..cfe8c36420257a34ba845cbedc44e25068c1973e 100644 (file)
@@ -68,6 +68,10 @@ OMX_ERRORTYPE Exynos_OSAL_GetInfoFromMetaData(OMX_IN OMX_BYTE pBuffer,
 OMX_ERRORTYPE Exynos_OSAL_CheckANB(OMX_IN EXYNOS_OMX_DATA *pBuffer,
                                    OMX_OUT OMX_BOOL *bIsANBEnabled);
 
+OMX_COLOR_FORMATTYPE Exynos_OSAL_Hal2OMXPixelFormat(unsigned int hal_format);
+
+unsigned int Exynos_OSAL_OMX2HalPixelFormat(OMX_COLOR_FORMATTYPE omx_format);
+
 #ifdef __cplusplus
 }
 #endif