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>
#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
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 */
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;
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;
}
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
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;
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 */
/* 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);
pH264Enc->hMFCH264Handle.bConfiguredMFCSrc = OMX_FALSE;
pH264Enc->hMFCH264Handle.bConfiguredMFCDst = OMX_FALSE;
- pVideoEnc->bFirstOutput = OMX_FALSE;
pExynosComponent->bUseFlagEOF = OMX_TRUE;
pExynosComponent->bSaveFlagEOS = OMX_FALSE;
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) {
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 */
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 */
/* 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);
pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_FALSE;
pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_FALSE;
- pVideoEnc->bFirstOutput = OMX_FALSE;
pExynosComponent->bUseFlagEOF = OMX_TRUE;
pExynosComponent->bSaveFlagEOS = OMX_FALSE;
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) {
$(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 \
#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"
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,
OMX_ERRORTYPE ret = OMX_ErrorNone;
OMX_COMPONENTTYPE *pOMXComponent = NULL;
EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
- EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
FunctionIn();
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;
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;
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;
}
pExynosPort->bStoreMetaData = pANBParams->bStoreMetaData;
+ pVideoEnc->bFirstInput = OMX_TRUE;
}
break;
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