return;
}
+void Exynos_Free_CodecBuffers(
+ OMX_COMPONENTTYPE *pOMXComponent,
+ OMX_U32 nPortIndex)
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+ EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+ CODEC_ENC_BUFFER **ppCodecBuffer = NULL;
+
+ OMX_U32 nBufferCnt = 0, nPlaneCnt = 0;
+ int i, j;
+
+ FunctionIn();
+
+ if (nPortIndex == INPUT_PORT_INDEX) {
+ ppCodecBuffer = &(pVideoEnc->pMFCEncInputBuffer[0]);
+ nBufferCnt = MFC_INPUT_BUFFER_NUM_MAX;
+ nPlaneCnt = MFC_INPUT_BUFFER_PLANE;
+ } else {
+ ppCodecBuffer = &(pVideoEnc->pMFCEncOutputBuffer[0]);
+ nBufferCnt = MFC_OUTPUT_BUFFER_NUM_MAX;
+ nPlaneCnt = MFC_OUTPUT_BUFFER_PLANE;
+ }
+
+ for (i = 0; i < nBufferCnt; i++) {
+ if (ppCodecBuffer[i] != NULL) {
+ for (j = 0; j < nPlaneCnt; j++) {
+ if (ppCodecBuffer[i]->pVirAddr[j] != NULL)
+ Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, ppCodecBuffer[i]->pVirAddr[j]);
+ }
+
+ Exynos_OSAL_Free(ppCodecBuffer[i]);
+ ppCodecBuffer[i] = NULL;
+ }
+ }
+
+ FunctionOut();
+}
+
+OMX_ERRORTYPE Exynos_Allocate_CodecBuffers(
+ OMX_COMPONENTTYPE *pOMXComponent,
+ OMX_U32 nPortIndex,
+ OMX_U32 nBufferCnt,
+ OMX_U32 nPlaneSize[MFC_OUTPUT_BUFFER_PLANE])
+{
+ OMX_ERRORTYPE ret = OMX_ErrorNone;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+ EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+ MEMORY_TYPE eMemoryType = SYSTEM_MEMORY;
+ CODEC_ENC_BUFFER **ppCodecBuffer = NULL;
+
+ OMX_U32 nPlaneCnt = 0;
+ int i, j;
+
+ FunctionIn();
+
+ if (nPortIndex == INPUT_PORT_INDEX) {
+ ppCodecBuffer = &(pVideoEnc->pMFCEncInputBuffer[0]);
+ nPlaneCnt = MFC_INPUT_BUFFER_PLANE;
+ } else {
+ ppCodecBuffer = &(pVideoEnc->pMFCEncOutputBuffer[0]);
+ nPlaneCnt = MFC_OUTPUT_BUFFER_PLANE;
+#ifdef USE_CSC_HW
+ eMemoryType = NORMAL_MEMORY;
+#endif
+ }
+
+ if (pVideoEnc->bDRMPlayerMode == OMX_TRUE)
+ eMemoryType = SECURE_MEMORY;
+
+ for (i = 0; i < nBufferCnt; i++) {
+ ppCodecBuffer[i] = (CODEC_ENC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
+ if (ppCodecBuffer[i] == NULL) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc codec buffer");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ Exynos_OSAL_Memset(ppCodecBuffer[i], 0, sizeof(CODEC_ENC_BUFFER));
+
+ for (j = 0; j < nPlaneCnt; j++) {
+ ppCodecBuffer[i]->pVirAddr[j] =
+ (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, nPlaneSize[j], eMemoryType);
+ if (ppCodecBuffer[i]->pVirAddr[j] == NULL) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc plane");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+
+ ppCodecBuffer[i]->fd[j] =
+ Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, ppCodecBuffer[i]->pVirAddr[j]);
+ ppCodecBuffer[i]->bufferSize[j] = nPlaneSize[j];
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "PORT[%d]: pMFCCodecBuffer[%d]->pVirAddr[%d]: 0x%x", nPortIndex, i, j, ppCodecBuffer[i]->pVirAddr[j]);
+ }
+
+ ppCodecBuffer[i]->dataSize = 0;
+ }
+
+ return OMX_ErrorNone;
+
+EXIT:
+ Exynos_Free_CodecBuffers(pOMXComponent, nPortIndex);
+
+ FunctionOut();
+
+ return ret;
+}
+
OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex)
{
OMX_BOOL ret = OMX_FALSE;
pData->buffer.multiPlaneBuffer.dataBuffer[0] = pInputCodecBuffer->pVirAddr[0];
pData->buffer.multiPlaneBuffer.dataBuffer[1] = pInputCodecBuffer->pVirAddr[1];
+ pData->buffer.multiPlaneBuffer.fd[0] = pInputCodecBuffer->fd[0];
+ pData->buffer.multiPlaneBuffer.fd[1] = pInputCodecBuffer->fd[1];
pData->allocSize = pInputCodecBuffer->bufferSize[0] + pInputCodecBuffer->bufferSize[1];
pData->dataLen = pInputCodecBuffer->dataSize;
pData->usedDataLen = 0;
OMX_ERRORTYPE ret = OMX_ErrorNone;
pData->buffer.singlePlaneBuffer.dataBuffer = pCodecBuffer->pVirAddr[0];
+ pData->buffer.singlePlaneBuffer.fd = pCodecBuffer->fd[0];
pData->allocSize = pCodecBuffer->bufferSize[0];
pData->dataLen = 0;
pData->usedDataLen = 0;
unsigned int csc_src_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar);
unsigned int csc_dst_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar);
- CSC_METHOD csc_method = CSC_METHOD_SW;
- unsigned int cacheable = 1;
+
+ CSC_ERRORCODE cscRet = CSC_ErrorNone;
+ CSC_METHOD csc_method = CSC_METHOD_SW;
+ CSC_MEMTYPE csc_memType = CSC_MEMORY_USERPTR;
+
+ unsigned int srcCacheable = 1, dstCacheable = 1;
unsigned char *pSrcBuf[3] = {NULL, };
unsigned char *pDstBuf[3] = {NULL, };
- CSC_ERRORCODE cscRet = CSC_ErrorNone;
-
pSrcBuf[0] = checkInputStream;
pSrcBuf[1] = checkInputStream + (nFrameWidth * nFrameHeight);
pSrcBuf[2] = checkInputStream + (((nFrameWidth * nFrameHeight) * 5) / 4);
pDstBuf[2] = srcInputData->buffer.multiPlaneBuffer.dataBuffer[2];
csc_get_method(pVideoEnc->csc_handle, &csc_method);
- if (csc_method == CSC_METHOD_HW) {
- pDstBuf[0] = srcInputData->buffer.multiPlaneBuffer.fd[0];
- pDstBuf[1] = srcInputData->buffer.multiPlaneBuffer.fd[1];
- pDstBuf[2] = srcInputData->buffer.multiPlaneBuffer.fd[2];
- }
+ if (csc_method == CSC_METHOD_HW)
+ dstCacheable = 0;
#ifdef USE_METADATABUFFERTYPE
OMX_PTR ppBuf[MAX_BUFFER_PLANE];
imageSize = nFrameWidth * nFrameHeight * 3; /* RGB888 */
+#ifdef USE_GSC_RGB_ENCODER
+ if (pVideoEnc->csc_set_format == OMX_FALSE) {
+ cscRet = csc_set_method(pVideoEnc->csc_handle, CSC_METHOD_HW);
+ if (cscRet != CSC_ErrorNone) {
+ ret = OMX_FALSE;
+ goto EXIT;
+ }
+ }
+#endif
+
#ifdef USE_DMA_BUF
- if (csc_method == CSC_METHOD_HW)
+ if (csc_method == CSC_METHOD_HW) {
+ csc_memType = CSC_MEMORY_DMABUF;
pSrcBuf[0] = (unsigned char *)planes[0].fd;
- else
+ } else
#endif
pSrcBuf[0] = planes[0].addr;
pSrcBuf[1] = NULL;
{
#ifdef USE_DMA_BUF
if (csc_method == CSC_METHOD_HW) {
+ csc_memType = CSC_MEMORY_DMABUF;
pSrcBuf[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, checkInputStream);
pSrcBuf[1] = NULL;
pSrcBuf[2] = NULL;
}
}
+#ifdef USE_DMA_BUF
+ if (csc_method == CSC_METHOD_HW) {
+ pDstBuf[0] = srcInputData->buffer.multiPlaneBuffer.fd[0];
+ pDstBuf[1] = srcInputData->buffer.multiPlaneBuffer.fd[1];
+ pDstBuf[2] = srcInputData->buffer.multiPlaneBuffer.fd[2];
+ }
+#endif
+
csc_set_src_format(
pVideoEnc->csc_handle, /* handle */
nFrameWidth, /* width */
nFrameWidth, /* crop_width */
nFrameHeight, /* crop_height */
csc_src_color_format, /* color_format */
- cacheable); /* cacheable */
+ srcCacheable); /* cacheable */
csc_set_dst_format(
pVideoEnc->csc_handle, /* handle */
nFrameWidth, /* width */
nFrameWidth, /* crop_width */
nFrameHeight, /* crop_height */
csc_dst_color_format, /* color_format */
- cacheable); /* cacheable */
+ dstCacheable); /* cacheable */
csc_set_src_buffer(
pVideoEnc->csc_handle, /* handle */
pSrcBuf,
- CSC_MEMORY_DMABUF); /* YUV Addr or FD */
+ csc_memType); /* YUV Addr or FD */
csc_set_dst_buffer(
pVideoEnc->csc_handle, /* handle */
pDstBuf,
- CSC_MEMORY_DMABUF); /* YUV Addr or FD */
+ csc_memType); /* YUV Addr or FD */
cscRet = csc_convert(pVideoEnc->csc_handle);
if (cscRet != CSC_ErrorNone)
ret = OMX_FALSE;
} else {
/* kMetadataBufferTypeCameraSource */
Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)inputUseBuffer->bufferHeader->pBuffer, ppBuf);
-#ifndef USE_USERPTR_CAMERA_INPUT
#ifdef USE_DMA_BUF
srcInputData->buffer.multiPlaneBuffer.fd[0] = ppBuf[0];
srcInputData->buffer.multiPlaneBuffer.fd[1] = ppBuf[1];
/* input buffers are 2 plane. */
srcInputData->buffer.multiPlaneBuffer.dataBuffer[2] = NULL;
srcInputData->buffer.multiPlaneBuffer.fd[2] = -1;
-#else
- for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
- srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] = ppBuf[plane];
- }
- srcInputData->buffer.multiPlaneBuffer.dataBuffer[2] = NULL;
-#endif
#else
for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] = ppBuf[plane];
if (((exynosInputPort->bStoreMetaData == OMX_TRUE) && (eColorFormat == OMX_COLOR_FormatAndroidOpaque)) ||
(exynosInputPort->bStoreMetaData == OMX_FALSE)) {
- Exynos_InputBufferReturn(pOMXComponent);
+ Exynos_InputBufferReturn(pOMXComponent, inputUseBuffer);
} else {
inputUseBuffer->dataValid = OMX_TRUE;
}
if ((srcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "bSaveFlagEOS : OMX_TRUE");
- srcInputData->dataLen = 0;
- srcInputData->remainDataLen = 0;
pExynosComponent->bSaveFlagEOS = OMX_TRUE;
+ if (srcInputData->dataLen != 0)
+ pExynosComponent->bBehaviorEOS = OMX_TRUE;
}
if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
FunctionIn();
if (exynosOutputPort->bufferProcessType & BUFFER_SHARE) {
- if (Exynos_Shared_DataToBuffer(dstOutputData, outputUseBuffer) == OMX_ErrorNone)
+ if (Exynos_Shared_DataToBuffer(dstOutputData, outputUseBuffer, OMX_FALSE) == OMX_ErrorNone)
outputUseBuffer->dataValid = OMX_TRUE;
}
if ((outputUseBuffer->remainDataLen > 0) ||
(outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS)) {
- Exynos_OutputBufferReturn(pOMXComponent);
+ Exynos_OutputBufferReturn(pOMXComponent, outputUseBuffer);
}
} else {
Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "output buffer is smaller than encoded data size Out Length");
if ((outputUseBuffer->remainDataLen > 0) ||
((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
(CHECK_PORT_BEING_FLUSHED(exynosOutputPort)))
- Exynos_OutputBufferReturn(pOMXComponent);
+ Exynos_OutputBufferReturn(pOMXComponent, outputUseBuffer);
+ else
+ Exynos_OMX_FillThisBuffer(pOMXComponent, outputUseBuffer->bufferHeader);
}
} else {
ret = OMX_FALSE;
}
if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+ OMX_U32 nPlaneSize[MFC_INPUT_BUFFER_PLANE] = {0, };
+ nPlaneSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE;
+ nPlaneSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE;
+
Exynos_OSAL_SemaphoreCreate(&exynosInputPort->codecSemID);
Exynos_OSAL_QueueCreate(&exynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
- for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
- pVideoEnc->pMFCEncInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
- /* Use ION Allocator */
- /*Alloc Y-Buffer */
- pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_YBUFFER_SIZE, NORMAL_MEMORY);
- pVideoEnc->pMFCEncInputBuffer[i]->fd[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
- pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE;
- /*Alloc C-Buffer */
- pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_CBUFFER_SIZE, NORMAL_MEMORY);
- pVideoEnc->pMFCEncInputBuffer[i]->fd[1] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
- pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE;
-
- pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
-
- if ((pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] == NULL) ||
- (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] == NULL)) {
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
- ret = OMX_ErrorInsufficientResources;
- goto EXIT;
- }
-
- /* MFC input buffers are 1 plane. */
- pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[2] = NULL;
- pVideoEnc->pMFCEncInputBuffer[i]->fd[2] = -1;
- pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[2] = 0;
-
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]);
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
+ ret = Exynos_Allocate_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX, MFC_INPUT_BUFFER_NUM_MAX, nPlaneSize);
+ if (ret != OMX_ErrorNone)
+ goto EXIT;
+ for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++)
Exynos_CodecBufferEnqueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
- }
} else if (exynosInputPort->bufferProcessType == BUFFER_SHARE) {
/*************/
/* TBD */
}
}
-
EXIT:
return ret;
Exynos_CodecBufferEnqueue(pExynosComponent, INPUT_PORT_INDEX, codecBuffer);
}
if (exynosInputPort->bufferProcessType & BUFFER_SHARE) {
- Exynos_Shared_DataToBuffer(&srcOutputData, srcOutputUseBuffer);
- Exynos_InputBufferReturn(pOMXComponent);
+ OMX_BOOL bNeedUnlock = OMX_FALSE;
+ OMX_COLOR_FORMATTYPE eColorFormat = exynosInputPort->portDefinition.format.video.eColorFormat;
+ if (eColorFormat == OMX_COLOR_FormatAndroidOpaque)
+ bNeedUnlock = OMX_TRUE;
+ Exynos_Shared_DataToBuffer(&srcOutputData, srcOutputUseBuffer, bNeedUnlock);
+ Exynos_InputBufferReturn(pOMXComponent, srcOutputUseBuffer);
}
Exynos_ResetCodecData(&srcOutputData);
}
break;
}
Exynos_Shared_BufferToData(dstInputUseBuffer, &dstInputData, ONE_PLANE);
+ if (pVideoEnc->bDRMPlayerMode == OMX_TRUE) {
+ OMX_PTR dataBuffer = NULL;
+ dataBuffer = Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc->hSharedMemory,
+ dstInputData.buffer.singlePlaneBuffer.dataBuffer);
+ if (dataBuffer == NULL) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Wrong dst-input Secure buffer", __LINE__);
+ ret = OMX_ErrorUndefined;
+ break;
+ }
+
+ dstInputData.buffer.singlePlaneBuffer.dataBuffer = dataBuffer;
+ }
Exynos_ResetDataBuffer(dstInputUseBuffer);
}
}
Exynos_OSAL_ThreadTerminate(pVideoEnc->hDstOutputThread);
pVideoEnc->hDstOutputThread = NULL;
+ pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
+ pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
+
EXIT:
FunctionOut();
pExynosComponent->hComponentHandle = (OMX_HANDLETYPE)pVideoEnc;
pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+ pExynosComponent->bBehaviorEOS = OMX_FALSE;
pVideoEnc->bFirstInput = OMX_FALSE;
pVideoEnc->bFirstOutput = OMX_FALSE;