From 33d6044e338e2ea5c8580b6a52840808e459d998 Mon Sep 17 00:00:00 2001 From: SeungBeom Kim Date: Tue, 7 Aug 2012 16:22:29 -0700 Subject: [PATCH] exynos_omx: multi_thread: Add New Encode scheme for support input buffer shere. 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 --- .../component/video/enc/Exynos_OMX_Venc.c | 179 ++++++++++++++---- .../component/video/enc/Exynos_OMX_Venc.h | 3 + .../video/enc/h264/Exynos_OMX_H264enc.c | 113 +++++------ .../video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c | 148 ++++++++------- exynos_omx/openmax/exynos_omx/osal/Android.mk | 2 + .../exynos_omx/osal/Exynos_OSAL_Android.cpp | 23 ++- .../exynos_omx/osal/Exynos_OSAL_Android.h | 4 + 7 files changed, 317 insertions(+), 155 deletions(-) diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.c b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.c index 8f0fd81..59628f4 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.c +++ b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.c @@ -35,11 +35,13 @@ #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 #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 diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h index 1d4ba72..73e58e5 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h +++ b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h @@ -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; diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c index 070327a..0a5ca34 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c +++ b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c @@ -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) { diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c b/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c index a2f2337..b391f99 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c +++ b/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c @@ -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) { diff --git a/exynos_omx/openmax/exynos_omx/osal/Android.mk b/exynos_omx/openmax/exynos_omx/osal/Android.mk index 73f2a13..c58f5e0 100644 --- a/exynos_omx/openmax/exynos_omx/osal/Android.mk +++ b/exynos_omx/openmax/exynos_omx/osal/Android.mk @@ -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 \ diff --git a/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp b/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp index c327be7..142580c 100644 --- a/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp +++ b/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp @@ -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; diff --git a/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.h b/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.h index 753020e..cfe8c36 100644 --- a/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.h +++ b/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.h @@ -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 -- 2.20.1