{
OMX_ERRORTYPE ret = OMX_ErrorNone;
EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
- CODEC_DEC_INPUT_BUFFER *pInputCodecBuffer = (CODEC_DEC_INPUT_BUFFER*)codecBuffer;
+ CODEC_DEC_BUFFER *pInputCodecBuffer = (CODEC_DEC_BUFFER *)codecBuffer;
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s: buffer=%p\n", __func__, codecBuffer);
-
- pData->buffer.singlePlaneBuffer.dataBuffer = pInputCodecBuffer->VirAddr;
- pData->buffer.singlePlaneBuffer.fd = pInputCodecBuffer->fd;
- pData->allocSize = pInputCodecBuffer->bufferSize;
+ pData->buffer.singlePlaneBuffer.dataBuffer = pInputCodecBuffer->pVirAddr[0];
+ pData->buffer.singlePlaneBuffer.fd = pInputCodecBuffer->fd[0];
+ pData->allocSize = pInputCodecBuffer->bufferSize[0];
pData->dataLen = pInputCodecBuffer->dataSize;
pData->usedDataLen = 0;
pData->remainDataLen = pInputCodecBuffer->dataSize;
return;
}
+OMX_BOOL Exynos_CSC_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *dstOutputData)
+{
+ OMX_BOOL ret = OMX_FALSE;
+ EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+ EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+ EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+ EXYNOS_OMX_DATABUFFER *outputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer;
+ OMX_U32 copySize = 0;
+ DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
+
+ FunctionIn();
+
+ OMX_U32 width = 0, height = 0;
+ int imageSize = 0;
+ OMX_COLOR_FORMATTYPE colorFormat;
+
+ void *pOutputBuf = (void *)outputUseBuffer->bufferHeader->pBuffer;
+ void *pSrcBuf[MAX_BUFFER_PLANE] = {NULL, };
+ void *pYUVBuf[MAX_BUFFER_PLANE] = {NULL, };
+
+ CSC_ERRORCODE cscRet = CSC_ErrorNone;
+ CSC_METHOD csc_method = CSC_METHOD_SW;
+ unsigned int cacheable = 1;
+
+ pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)dstOutputData->extInfo;
+
+ width = pBufferInfo->imageWidth;
+ height = pBufferInfo->imageHeight;
+ imageSize = width * height;
+ colorFormat = pBufferInfo->ColorFormat;
+
+ pSrcBuf[0] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[0];
+ pSrcBuf[1] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[1];
+ pSrcBuf[2] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[2];
+
+ pYUVBuf[0] = (unsigned char *)pOutputBuf;
+ pYUVBuf[1] = (unsigned char *)pOutputBuf + imageSize;
+ pYUVBuf[2] = (unsigned char *)pOutputBuf + imageSize + imageSize / 4;
+
+ csc_get_method(pVideoDec->csc_handle, &csc_method);
+ if (csc_method == CSC_METHOD_HW) {
+ pSrcBuf[0] = dstOutputData->buffer.multiPlaneBuffer.fd[0];
+ pSrcBuf[1] = dstOutputData->buffer.multiPlaneBuffer.fd[1];
+ pSrcBuf[2] = dstOutputData->buffer.multiPlaneBuffer.fd[2];
+ }
+
+#ifdef USE_ANB
+ if (exynosOutputPort->bIsANBEnabled == OMX_TRUE) {
+ ExynosVideoPlane planes[MAX_BUFFER_PLANE];
+ OMX_U32 stride;
+ Exynos_OSAL_LockANB(pOutputBuf, width, height, exynosOutputPort->portDefinition.format.video.eColorFormat, &stride, planes);
+ width = stride;
+ outputUseBuffer->dataLen = sizeof(void *);
+
+ if (csc_method == CSC_METHOD_SW) {
+ pYUVBuf[0] = (unsigned char *)planes[0].addr;
+ pYUVBuf[1] = (unsigned char *)planes[1].addr;
+ pYUVBuf[2] = (unsigned char *)planes[2].addr;
+ } else {
+ pYUVBuf[0] = (unsigned char *)planes[0].fd;
+ pYUVBuf[1] = (unsigned char *)planes[1].fd;
+ pYUVBuf[2] = (unsigned char *)planes[2].fd;
+ }
+ }
+#endif
+ if ((exynosOutputPort->bIsANBEnabled == OMX_FALSE) &&
+ (csc_method == CSC_METHOD_HW)) {
+ pYUVBuf[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pOutputBuf);
+ pYUVBuf[1] = NULL;
+ pYUVBuf[2] = NULL;
+ }
+
+ if (pVideoDec->csc_set_format == OMX_FALSE) {
+ csc_set_src_format(
+ pVideoDec->csc_handle, /* handle */
+ width, /* width */
+ height, /* height */
+ 0, /* crop_left */
+ 0, /* crop_right */
+ width, /* crop_width */
+ height, /* crop_height */
+ omx_2_hal_pixel_format(colorFormat), /* color_format */
+ cacheable); /* cacheable */
+ csc_set_dst_format(
+ pVideoDec->csc_handle, /* handle */
+ width, /* width */
+ height, /* height */
+ 0, /* crop_left */
+ 0, /* crop_right */
+ width, /* crop_width */
+ height, /* crop_height */
+ omx_2_hal_pixel_format(exynosOutputPort->portDefinition.format.video.eColorFormat), /* color_format */
+ cacheable); /* cacheable */
+ pVideoDec->csc_set_format = OMX_TRUE;
+ }
+ csc_set_src_buffer(
+ pVideoDec->csc_handle, /* handle */
+ pSrcBuf[0], /* y addr */
+ pSrcBuf[1], /* u addr or uv addr */
+ pSrcBuf[2], /* v addr or none */
+ 0); /* ion fd */
+ csc_set_dst_buffer(
+ pVideoDec->csc_handle, /* handle */
+ pYUVBuf[0], /* y addr */
+ pYUVBuf[1], /* u addr or uv addr */
+ pYUVBuf[2], /* v addr or none */
+ 0); /* ion fd */
+ cscRet = csc_convert(pVideoDec->csc_handle);
+ if (cscRet != CSC_ErrorNone)
+ ret = OMX_FALSE;
+ else
+ ret = OMX_TRUE;
+
+#ifdef USE_ANB
+ if (exynosOutputPort->bIsANBEnabled == OMX_TRUE) {
+ Exynos_OSAL_UnlockANB(pOutputBuf);
+ }
+#endif
+
+EXIT:
+ FunctionOut();
+
+ return ret;
+}
+
OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *srcInputData)
{
OMX_BOOL ret = OMX_FALSE;
OMX_U32 copySize = 0;
OMX_BYTE checkInputStream = NULL;
OMX_U32 checkInputStreamLen = 0;
- OMX_U32 checkedSize = 0;
- OMX_BOOL flagEOF = OMX_FALSE;
- OMX_BOOL previousFrameEOF = OMX_FALSE;
FunctionIn();
/* reset dataBuffer */
Exynos_ResetDataBuffer(inputUseBuffer);
-
- flagEOF = OMX_TRUE;
} else if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
checkInputStream = inputUseBuffer->bufferHeader->pBuffer + inputUseBuffer->usedDataLen;
checkInputStreamLen = inputUseBuffer->remainDataLen;
- if (srcInputData->dataLen == 0) {
- previousFrameEOF = OMX_TRUE;
- } else {
- previousFrameEOF = OMX_FALSE;
- }
-
- flagEOF = OMX_TRUE;
pExynosComponent->bUseFlagEOF = OMX_TRUE;
- checkedSize = checkInputStreamLen;
-
- if (flagEOF == OMX_TRUE) {
- copySize = checkedSize;
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_TRUE");
- } else {
- copySize = checkInputStreamLen;
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_FALSE");
- }
+ copySize = checkInputStreamLen;
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_TRUE");
if (((srcInputData->allocSize) - (srcInputData->dataLen)) >= copySize) {
if (copySize > 0) {
pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
pExynosComponent->callbackData,
OMX_EventError, OMX_ErrorUndefined, 0, NULL);
- flagEOF = OMX_FALSE;
+ ret = OMX_FALSE;
}
Exynos_InputBufferReturn(pOMXComponent);
pExynosComponent->bSaveFlagEOS = OMX_TRUE;
}
- if (flagEOF == OMX_TRUE) {
- if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
- pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_TRUE;
- pExynosComponent->checkTimeStamp.startTimeStamp = srcInputData->timeStamp;
- pExynosComponent->checkTimeStamp.nStartFlags = srcInputData->nFlags;
- pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "first frame timestamp after seeking %lld us (%.2f secs)",
- srcInputData->timeStamp, srcInputData->timeStamp / 1E6);
- }
-
- ret = OMX_TRUE;
- } else {
- ret = OMX_FALSE;
+ if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
+ pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_TRUE;
+ pExynosComponent->checkTimeStamp.startTimeStamp = srcInputData->timeStamp;
+ pExynosComponent->checkTimeStamp.nStartFlags = srcInputData->nFlags;
+ pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "first frame timestamp after seeking %lld us (%.2f secs)",
+ srcInputData->timeStamp, srcInputData->timeStamp / 1E6);
}
+
+ ret = OMX_TRUE;
}
EXIT:
if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
OMX_U32 width = 0, height = 0;
int imageSize = 0;
- OMX_COLOR_FORMATTYPE colorFormat;
-
void *pOutputBuf = (void *)outputUseBuffer->bufferHeader->pBuffer;
- void *pSrcBuf[MAX_BUFFER_PLANE] = {NULL, };
- void *pYUVBuf[MAX_BUFFER_PLANE] = {NULL, };
- int fds[MAX_BUFFER_PLANE];
-
- CSC_ERRORCODE cscRet = CSC_ErrorNone;
- CSC_METHOD csc_method = CSC_METHOD_SW;
- unsigned int cacheable = 1;
pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)dstOutputData->extInfo;
-#if 0
- pVideoDec->exynos_codec_getCodecOutputPrivateData(dstOutputData->pPrivate, pSrcBuf, NULL);
-#else
- pSrcBuf[0] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[0];
- pSrcBuf[1] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[1];
- pSrcBuf[2] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[2];
-#endif
+
width = pBufferInfo->imageWidth;
height = pBufferInfo->imageHeight;
imageSize = width * height;
- colorFormat = pBufferInfo->ColorFormat;
-
- pYUVBuf[0] = (unsigned char *)pOutputBuf;
- pYUVBuf[1] = (unsigned char *)pOutputBuf + imageSize;
- pYUVBuf[2] = (unsigned char *)pOutputBuf + imageSize + imageSize / 4;
if ((dstOutputData->remainDataLen <= (outputUseBuffer->allocSize - outputUseBuffer->dataLen)) &&
(!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
outputUseBuffer->timeStamp = dstOutputData->timeStamp;
if (outputUseBuffer->remainDataLen > 0) {
-#ifdef USE_ANB
- void *pPhys[MAX_BUFFER_PLANE];
-
- if (exynosOutputPort->bIsANBEnabled == OMX_TRUE) {
- OMX_U32 stride;
- ExynosVideoPlane planes[MAX_BUFFER_PLANE];
- Exynos_OSAL_LockANB(outputUseBuffer->bufferHeader->pBuffer, width, height, exynosOutputPort->portDefinition.format.video.eColorFormat, &stride, planes);
- width = stride;
- fds[0] = planes[0].fd;
- fds[1] = planes[1].fd;
- fds[2] = planes[2].fd;
- pYUVBuf[0] = planes[0].addr;
- pYUVBuf[1] = planes[1].addr;
- pYUVBuf[2] = planes[2].addr;
- outputUseBuffer->dataLen = sizeof(void *);
- }
-#endif
- if (exynosOutputPort->portDefinition.format.video.eColorFormat == (OMX_COLOR_FORMATTYPE)OMX_SEC_COLOR_FormatNV12TPhysicalAddress) {
- /* if use Post copy address structure */
- Exynos_OSAL_Memcpy(pYUVBuf[0], &(pSrcBuf[0]), sizeof(void *));
- Exynos_OSAL_Memcpy((unsigned char *)pYUVBuf[0] + (sizeof(void *) * 1), &(pSrcBuf[1]), sizeof(void *));
- Exynos_OSAL_Memcpy((unsigned char *)pYUVBuf[0] + (sizeof(void *) * 2), &(pSrcBuf[0]), sizeof(void *));
- Exynos_OSAL_Memcpy((unsigned char *)pYUVBuf[0] + (sizeof(void *) * 3), &(pSrcBuf[1]), sizeof(void *));
- outputUseBuffer->dataLen = sizeof(void *) * 4;
- } else {
- csc_get_method(pVideoDec->csc_handle, &csc_method);
- if (pVideoDec->csc_set_format == OMX_FALSE) {
- csc_set_src_format(
- pVideoDec->csc_handle, /* handle */
- width, /* width */
- height, /* height */
- 0, /* crop_left */
- 0, /* crop_right */
- width, /* crop_width */
- height, /* crop_height */
- omx_2_hal_pixel_format(colorFormat), /* color_format */
- cacheable); /* cacheable */
- csc_set_dst_format(
- pVideoDec->csc_handle, /* handle */
- width, /* width */
- height, /* height */
- 0, /* crop_left */
- 0, /* crop_right */
- width, /* crop_width */
- height, /* crop_height */
- omx_2_hal_pixel_format(exynosOutputPort->portDefinition.format.video.eColorFormat), /* color_format */
- cacheable); /* cacheable */
- pVideoDec->csc_set_format = OMX_TRUE;
- }
- csc_set_src_buffer(
- pVideoDec->csc_handle, /* handle */
- pSrcBuf[0], /* y addr */
- pSrcBuf[1], /* u addr or uv addr */
- pSrcBuf[2], /* v addr or none */
- 0); /* ion fd */
- csc_set_dst_buffer(
- pVideoDec->csc_handle, /* handle */
- pYUVBuf[0], /* y addr */
- pYUVBuf[1], /* u addr or uv addr */
- pYUVBuf[2], /* v addr or none */
- 0); /* ion fd */
- cscRet = csc_convert(pVideoDec->csc_handle);
- }
-#ifdef USE_ANB
- if (exynosOutputPort->bIsANBEnabled == OMX_TRUE) {
- Exynos_OSAL_UnlockANB(outputUseBuffer->bufferHeader->pBuffer/*dstOutputData->dataBuffer*/);
- }
-#endif
+ ret = Exynos_CSC_OutputData(pOMXComponent, dstOutputData);
} else {
- cscRet = CSC_ErrorNone;
- }
-
- if (cscRet == CSC_ErrorNone) {
ret = OMX_TRUE;
+ }
+ if (ret == OMX_TRUE) {
if ((outputUseBuffer->remainDataLen > 0) ||
((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
(CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
OMX_PTR codecBuffer;
- DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
codecBuffer = pDstOutputData->pPrivate;
if (codecBuffer != NULL) {
Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, codecBuffer);
void *pAddrC;
} CODEC_DEC_ADDR_INFO;
-typedef struct _CODEC_DEC_INPUT_BUFFER
+typedef struct _CODEC_DEC_BUFFER
{
- void *VirAddr; // virtual address
- int bufferSize; // input buffer alloc size
- int dataSize; // Data length
- int fd;
-} CODEC_DEC_INPUT_BUFFER;
-
-typedef struct _CODEC_DEC_OUTPUT_BUFFER
-{
- void *VirAddr[MFC_OUTPUT_BUFFER_PLANE]; // virtual address
- int bufferSize[MFC_OUTPUT_BUFFER_PLANE]; // input buffer alloc size
- int dataSize; // Data length
- int fd[MFC_OUTPUT_BUFFER_PLANE];
-} CODEC_DEC_OUTPUT_BUFFER;
-
+ void *pVirAddr[MAX_BUFFER_PLANE]; /* virtual address */
+ int bufferSize[MAX_BUFFER_PLANE]; /* buffer alloc size */
+ int fd[MAX_BUFFER_PLANE]; /* buffer FD */
+ int dataSize; /* total data length */
+} CODEC_DEC_BUFFER;
typedef struct _DECODE_CODEC_EXTRA_BUFFERINFO
{
OMX_HANDLETYPE hCodecHandle;
OMX_BOOL bThumbnailMode;
OMX_BOOL bFirstFrame;
- CODEC_DEC_INPUT_BUFFER *pMFCDecInputBuffer[MFC_INPUT_BUFFER_NUM_MAX];
- CODEC_DEC_OUTPUT_BUFFER *pMFCDecOutputBuffer[MFC_OUTPUT_BUFFER_NUM_MAX];
+ CODEC_DEC_BUFFER *pMFCDecInputBuffer[MFC_INPUT_BUFFER_NUM_MAX];
+ CODEC_DEC_BUFFER *pMFCDecOutputBuffer[MFC_OUTPUT_BUFFER_NUM_MAX];
/* Buffer Process */
OMX_BOOL bExitBufferProcessThread;
for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
}
/* Register input buffer */
for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
ExynosVideoPlane plane;
- plane.addr = pVideoDec->pMFCDecInputBuffer[i]->VirAddr;
- plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize;
- plane.fd = 0;
+ plane.addr = pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0];
+ plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize[0];
+ plane.fd = pVideoDec->pMFCDecInputBuffer[i]->fd[0];
if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
ret = OMX_ErrorInsufficientResources;
goto EXIT;
}
- int YBufferSize = calc_plane(pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth, pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight);
- int CBufferSize = calc_plane(pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth, pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight >> 1);
+ ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
+ OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+ int plane;
+
+ nAllocLen[0] = calc_plane(pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth,
+ pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight);
+ nAllocLen[1] = calc_plane(pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth,
+ pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight >> 1);
+
if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s: using copy buf\n", __func__);
+ MEMORY_TYPE memoryType;
+ if (pVideoDec->bDRMPlayerMode == OMX_TRUE)
+ memoryType = SECURE_MEMORY;
+ else
+ memoryType = NORMAL_MEMORY;
+
/* Register output buffer */
for (i = 0; i < nOutbufs; i++) {
- ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
- int plane;
-
- pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_OUTPUT_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_OUTPUT_BUFFER));
- if (pVideoDec->bDRMPlayerMode == OMX_TRUE) {
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] =
- (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, YBufferSize, SECURE_MEMORY);
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] =
- (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, CBufferSize, SECURE_MEMORY);
- pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[0] = YBufferSize;
- pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[1] = CBufferSize;
- } else {
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] =
- (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, YBufferSize, NORMAL_MEMORY);
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] =
- (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, CBufferSize, NORMAL_MEMORY);
- pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[0] = YBufferSize;
- pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[1] = CBufferSize;
- }
-
- pVideoDec->pMFCDecOutputBuffer[i]->fd[0] =
- Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
- pVideoDec->pMFCDecOutputBuffer[i]->fd[1] =
- Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
-
- if ((pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] == NULL) ||
- (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] == NULL)) {
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
- ret = OMX_ErrorInsufficientResources;
- goto EXIT;
- }
+ pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
+ Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
- planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[plane];
- planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
+ pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] =
+ (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[plane], memoryType);
+ if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] == NULL) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] =
+ Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
+ pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
+ pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = nAllocLen[plane];
+
+ planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane];
planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane];
+ planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
}
if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
ret = OMX_ErrorInsufficientResources;
goto EXIT;
}
- pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->VirAddr,
+ pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
(unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
}
} else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
/*************/
/* TBD */
/*************/
-// OMX_U32 width = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
-// OMX_U32 height = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
-// OMX_U32 stride;
- for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
- EXYNOS_OMX_BUFFERHEADERTYPE *buffer = &pExynosOutputPort->extendBufferHeader[i];
- ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
-
- /* luma */
- planes[0].addr = buffer->pYUVBuf[0];
- planes[0].fd = buffer->buf_fd[0];
- planes[0].allocSize = YBufferSize;
- /* chroma */
- planes[1].addr = buffer->pYUVBuf[1];
- planes[1].fd = buffer->buf_fd[1];
- planes[1].allocSize = CBufferSize;
-
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE,
- "%s: registering buf %d (hdr=%p) (l_addr=%p l_fd=%d c_addr=%p c_fd=%d)\n",
- __func__, i, buffer, planes[0].addr, planes[0].fd, planes[1].addr,
- planes[1].fd);
-
-// Exynos_OSAL_LockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, width, height,
-// pExynosOutputPort->portDefinition.format.video.eColorFormat,
-// &stride, pExynosOutputPort->extendBufferHeader[i].pYUVBuf);
- if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
- ret = OMX_ErrorInsufficientResources;
- goto EXIT;
+#ifdef USE_ANB
+ if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) {
+ for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
+ for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+ planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane];
+ planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane];
+ planes[plane].allocSize = nAllocLen[plane];
+ }
+
+ if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ pOutbufOps->Enqueue(hMFCHandle, planes, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
}
- pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
-// Exynos_OSAL_UnlockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
+ } else {
+ ret = OMX_ErrorNotImplemented;
+ goto EXIT;
}
+#else
+ ret = OMX_ErrorNotImplemented;
+ goto EXIT;
+#endif
}
+
if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
ret = OMX_ErrorInsufficientResources;
ExynosVideoDecBufferOps *pOutbufOps = NULL;
CSC_METHOD csc_method = CSC_METHOD_SW;
- int i = 0;
+ int i, plane;
FunctionIn();
Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
- /*************/
- /* TBD */
- /*************/
- /* Use ION Allocator */
- pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_INPUT_BUFFER));
- pVideoDec->pMFCDecInputBuffer[i]->VirAddr = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
- if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr == NULL) {
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
- ret = OMX_ErrorInsufficientResources;
- goto EXIT;
- }
- pVideoDec->pMFCDecInputBuffer[i]->fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
- pVideoDec->pMFCDecInputBuffer[i]->bufferSize = DEFAULT_MFC_INPUT_BUFFER_SIZE;
- pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
-
+ pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
+ Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+
+ for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+ /* Use ION Allocator */
+ pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
+ pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+ pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE;
+ pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
+ if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+ }
Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
}
ExynosVideoDecBufferOps *pInbufOps = pH264Dec->hMFCH264Handle.pInbufOps;
ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
- int i = 0;
+ int i, plane;
FunctionIn();
if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
- if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] != NULL)
- Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
- if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] != NULL)
- Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
+ for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+ if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL)
+ Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
+ }
+
Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
pVideoDec->pMFCDecOutputBuffer[i] = NULL;
}
if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
- if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr != NULL)
- Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+ for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+ if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL)
+ Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+ }
Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
pVideoDec->pMFCDecInputBuffer[i] = NULL;
}
if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
int i = 0;
- while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->VirAddr) {
+ while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
EXYNOS_H264DEC_HANDLE *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
void *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
+ EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
ExynosVideoDecOps *pDecOps = pH264Dec->hMFCH264Handle.pDecOps;
ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
goto EXIT;
}
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR: 0x%x", __FUNCTION__, __LINE__, pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0]);
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__,
+ pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
+ pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]);
+
codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
(unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
ExynosVideoGeometry *bufferGeometry;
DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
OMX_S32 indexTimestamp = 0;
+ int plane;
FunctionIn();
pH264Dec->hMFCH264Handle.outputIndexTimestamp++;
pH264Dec->hMFCH264Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
- pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[0] = pVideoBuffer->planes[0].addr;
- pDstOutputData->buffer.multiPlaneBuffer.fd[0] = pVideoBuffer->planes[0].fd;
- pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[1] = pVideoBuffer->planes[1].addr;
- pDstOutputData->buffer.multiPlaneBuffer.fd[1] = pVideoBuffer->planes[1].fd;
- pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[2] = pVideoBuffer->planes[2].addr;
- pDstOutputData->buffer.multiPlaneBuffer.fd[2] = pVideoBuffer->planes[2].fd;
- pDstOutputData->allocSize = pVideoBuffer->planes[0].allocSize + pVideoBuffer->planes[1].allocSize + pVideoBuffer->planes[2].allocSize;
- pDstOutputData->dataLen = pVideoBuffer->planes[0].dataSize + pVideoBuffer->planes[1].dataSize + pVideoBuffer->planes[2].dataSize;
+ pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
+ for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+ pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
+ pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
+ pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
+ pDstOutputData->dataLen += pVideoBuffer->planes[plane].dataSize;
+ }
pDstOutputData->usedDataLen = 0;
pDstOutputData->pPrivate = pVideoBuffer;
/* For Share Buffer */
for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
}
/* Register input buffer */
for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
ExynosVideoPlane plane;
- plane.addr = pVideoDec->pMFCDecInputBuffer[i]->VirAddr;
- plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize;
- plane.fd = 0;
+ plane.addr = pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0];
+ plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize[0];
+ plane.fd = pVideoDec->pMFCDecInputBuffer[i]->fd[0];
if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
ret = OMX_ErrorInsufficientResources;
goto EXIT;
}
- int YBufferSize = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth, pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight);
- int CBufferSize = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth, pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight >> 1);
+ ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
+ OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+ int plane;
+
+ nAllocLen[0] = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth,
+ pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight);
+ nAllocLen[1] = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth,
+ pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight >> 1);
+
if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
/* Register output buffer */
for (i = 0; i < nOutbufs; i++) {
- ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
- int plane;
-
- pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_OUTPUT_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_OUTPUT_BUFFER));
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] =
- (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, YBufferSize, NORMAL_MEMORY);
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] =
- (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, CBufferSize, NORMAL_MEMORY);
- pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[0] = YBufferSize;
- pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[1] = CBufferSize;
-
- pVideoDec->pMFCDecOutputBuffer[i]->fd[0] =
- Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
- pVideoDec->pMFCDecOutputBuffer[i]->fd[1] =
- Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
-
- if ((pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] == NULL) ||
- (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] == NULL)) {
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
- ret = OMX_ErrorInsufficientResources;
- goto EXIT;
- }
+ pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
+ Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
- planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[plane];
- planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
+ pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] =
+ (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[plane], NORMAL_MEMORY);
+ if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] == NULL) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] =
+ Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
+ pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
+ pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = nAllocLen[plane];
+
+ planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane];
planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane];
+ planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
}
if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
ret = OMX_ErrorInsufficientResources;
goto EXIT;
}
- pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->VirAddr,
+ pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
(unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
}
} else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
/*************/
/* TBD */
/*************/
-// OMX_U32 width = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
-// OMX_U32 height = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
-// OMX_U32 stride;
- for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
- EXYNOS_OMX_BUFFERHEADERTYPE *buffer = &pExynosOutputPort->extendBufferHeader[i];
- ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
-
- /* luma */
- planes[0].addr = buffer->pYUVBuf[0];
- planes[0].fd = buffer->buf_fd[0];
- planes[0].allocSize = YBufferSize;
- /* chroma */
- planes[1].addr = buffer->pYUVBuf[1];
- planes[1].fd = buffer->buf_fd[1];
- planes[1].allocSize = CBufferSize;
-
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE,
- "%s: registering buf %d (hdr=%p) (l_addr=%p l_fd=%d c_addr=%p c_fd=%d)\n",
- __func__, i, buffer, planes[0].addr, planes[0].fd, planes[1].addr,
- planes[1].fd);
-
-// Exynos_OSAL_LockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, width, height,
-// pExynosOutputPort->portDefinition.format.video.eColorFormat,
-// &stride, pExynosOutputPort->extendBufferHeader[i].pYUVBuf);
- if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
- ret = OMX_ErrorInsufficientResources;
- goto EXIT;
+#ifdef USE_ANB
+ if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) {
+ for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
+ for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+ planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane];
+ planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane];
+ planes[plane].allocSize = nAllocLen[plane];
+ }
+
+ if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ pOutbufOps->Enqueue(hMFCHandle, planes, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
}
- pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
-// Exynos_OSAL_UnlockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
+ } else {
+ ret = OMX_ErrorNotImplemented;
+ goto EXIT;
}
+#else
+ ret = OMX_ErrorNotImplemented;
+ goto EXIT;
+#endif
}
if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
ExynosVideoDecBufferOps *pOutbufOps = NULL;
CSC_METHOD csc_method = CSC_METHOD_SW;
- int i = 0;
+ int i, plane;
FunctionIn();
Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
- /*************/
- /* TBD */
- /*************/
- /* Use ION Allocator */
- pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_INPUT_BUFFER));
- pVideoDec->pMFCDecInputBuffer[i]->VirAddr = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
- if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr == NULL) {
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
- ret = OMX_ErrorInsufficientResources;
- goto EXIT;
- }
- pVideoDec->pMFCDecInputBuffer[i]->fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
- pVideoDec->pMFCDecInputBuffer[i]->bufferSize = DEFAULT_MFC_INPUT_BUFFER_SIZE;
- pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
-
+ pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
+ Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+
+ for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+ /* Use ION Allocator */
+ pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
+ pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+ pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE;
+ pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
+ if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+ }
Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
}
ExynosVideoDecBufferOps *pInbufOps = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
- int i = 0;
+ int i, plane;
FunctionIn();
if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
- if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] != NULL)
- Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
- if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] != NULL)
- Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
+ for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+ if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL)
+ Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
+ }
+
Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
pVideoDec->pMFCDecOutputBuffer[i] = NULL;
}
if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
- if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr != NULL)
- Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+ for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+ if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL)
+ Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+ }
+
Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
pVideoDec->pMFCDecInputBuffer[i] = NULL;
}
if (pVideoBuffer == NULL) {
pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
- pSrcOutputData->buffer.singlePlaneBuffer.fd = 0;
pSrcOutputData->allocSize = 0;
pSrcOutputData->pPrivate = NULL;
pSrcOutputData->bufferHeader = NULL;
if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
int i = 0;
- while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->VirAddr) {
+ while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
void *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+ EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
ExynosVideoDecOps *pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
goto EXIT;
}
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__,
+ pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
+ pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]);
+
codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
(unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
ExynosVideoGeometry *bufferGeometry;
DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
OMX_S32 indexTimestamp = 0;
+ int plane;
FunctionIn();
pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp++;
pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
- pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[0] = pVideoBuffer->planes[0].addr;
- pDstOutputData->buffer.multiPlaneBuffer.fd[0] = pVideoBuffer->planes[0].fd;
- pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[1] = pVideoBuffer->planes[1].addr;
- pDstOutputData->buffer.multiPlaneBuffer.fd[1] = pVideoBuffer->planes[1].fd;
- pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[2] = pVideoBuffer->planes[2].addr;
- pDstOutputData->buffer.multiPlaneBuffer.fd[2] = pVideoBuffer->planes[2].fd;
- pDstOutputData->allocSize = pVideoBuffer->planes[0].allocSize + pVideoBuffer->planes[1].allocSize + pVideoBuffer->planes[2].allocSize;
- pDstOutputData->dataLen = pVideoBuffer->planes[0].dataSize + pVideoBuffer->planes[1].dataSize + pVideoBuffer->planes[2].dataSize;
+ pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
+ for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+ pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
+ pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
+ pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
+ pDstOutputData->dataLen += pVideoBuffer->planes[plane].dataSize;
+ }
pDstOutputData->usedDataLen = 0;
pDstOutputData->pPrivate = pVideoBuffer;
/* For Share Buffer */
for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
}
/* Register input buffer */
for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
ExynosVideoPlane plane;
- plane.addr = pVideoDec->pMFCDecInputBuffer[i]->VirAddr;
- plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize;
- plane.fd = 0;
+ plane.addr = pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0];
+ plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize[0];
+ plane.fd = pVideoDec->pMFCDecInputBuffer[i]->fd[0];
if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
ret = OMX_ErrorInsufficientResources;
goto EXIT;
}
- int YBufferSize = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth, pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight);
- int CBufferSize = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth, pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight >> 1);
+ ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
+ OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+ int plane;
+
+ nAllocLen[0] = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth,
+ pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight);
+ nAllocLen[1] = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth,
+ pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight >> 1);
+
if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
/* Register output buffer */
for (i = 0; i < nOutbufs; i++) {
- ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
- int plane;
-
- pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_OUTPUT_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_OUTPUT_BUFFER));
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] =
- (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, YBufferSize, NORMAL_MEMORY);
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] =
- (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, CBufferSize, NORMAL_MEMORY);
- pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[0] = YBufferSize;
- pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[1] = CBufferSize;
-
- pVideoDec->pMFCDecOutputBuffer[i]->fd[0] =
- Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
- pVideoDec->pMFCDecOutputBuffer[i]->fd[1] =
- Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
- pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
-
- if ((pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] == NULL) ||
- (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] == NULL)) {
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
- ret = OMX_ErrorInsufficientResources;
- goto EXIT;
- }
+ pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
+ Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
- planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[plane];
- planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
+ pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] =
+ (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[plane], NORMAL_MEMORY);
+ if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] == NULL) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] =
+ Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
+ pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
+ pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = nAllocLen[plane];
+
+ planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane];
planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane];
+ planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
}
if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
ret = OMX_ErrorInsufficientResources;
goto EXIT;
}
- pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->VirAddr,
+ pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
(unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
}
} else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
/*************/
/* TBD */
/*************/
-// OMX_U32 width = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
-// OMX_U32 height = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
-// OMX_U32 stride;
- for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
- EXYNOS_OMX_BUFFERHEADERTYPE *buffer = &pExynosOutputPort->extendBufferHeader[i];
- ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
-
- /* luma */
- planes[0].addr = buffer->pYUVBuf[0];
- planes[0].fd = buffer->buf_fd[0];
- planes[0].allocSize = YBufferSize;
- /* chroma */
- planes[1].addr = buffer->pYUVBuf[1];
- planes[1].fd = buffer->buf_fd[1];
- planes[1].allocSize = CBufferSize;
-
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE,
- "%s: registering buf %d (hdr=%p) (l_addr=%p l_fd=%d c_addr=%p c_fd=%d)\n",
- __func__, i, buffer, planes[0].addr, planes[0].fd, planes[1].addr,
- planes[1].fd);
-
-// Exynos_OSAL_LockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, width, height,
-// pExynosOutputPort->portDefinition.format.video.eColorFormat,
-// &stride, pExynosOutputPort->extendBufferHeader[i].pYUVBuf);
- if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
- ret = OMX_ErrorInsufficientResources;
- goto EXIT;
+#ifdef USE_ANB
+ if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) {
+ for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
+ for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+ planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane];
+ planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane];
+ planes[plane].allocSize = nAllocLen[plane];
+ }
+
+ if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ pOutbufOps->Enqueue(hMFCHandle, planes, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
}
- pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
-// Exynos_OSAL_UnlockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
+ } else {
+ ret = OMX_ErrorNotImplemented;
+ goto EXIT;
}
+#else
+ ret = OMX_ErrorNotImplemented;
+ goto EXIT;
+#endif
}
+
if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
ret = OMX_ErrorInsufficientResources;
ExynosVideoDecBufferOps *pOutbufOps = NULL;
CSC_METHOD csc_method = CSC_METHOD_SW;
- int i = 0;
+ int i, plane;
FunctionIn();
Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
- /*************/
- /* TBD */
- /*************/
- /* Use ION Allocator */
- pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_INPUT_BUFFER));
- pVideoDec->pMFCDecInputBuffer[i]->VirAddr = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
- if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr == NULL) {
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
- ret = OMX_ErrorInsufficientResources;
- goto EXIT;
- }
- pVideoDec->pMFCDecInputBuffer[i]->fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
- pVideoDec->pMFCDecInputBuffer[i]->bufferSize = DEFAULT_MFC_INPUT_BUFFER_SIZE;
- pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
-
+ pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
+ Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+
+ for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+ /* Use ION Allocator */
+ pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
+ pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+ pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE;
+ pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
+ if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+ }
Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
}
ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps;
ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
- int i = 0;
+ int i, plane;
FunctionIn();
if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
- if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] != NULL)
- Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
- if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] != NULL)
- Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
+ for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+ if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL)
+ Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
+ }
+
Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
pVideoDec->pMFCDecOutputBuffer[i] = NULL;
}
if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
- if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr != NULL)
- Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+ for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+ if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL)
+ Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+ }
+
Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
pVideoDec->pMFCDecInputBuffer[i] = NULL;
}
if (pVideoBuffer == NULL) {
pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
- pSrcOutputData->buffer.singlePlaneBuffer.fd = 0;
pSrcOutputData->allocSize = 0;
pSrcOutputData->pPrivate = NULL;
pSrcOutputData->bufferHeader = NULL;
if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
int i = 0;
- while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->VirAddr) {
+ while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
void *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+ EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps;
ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
goto EXIT;
}
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__,
+ pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
+ pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]);
+
codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
(unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
ExynosVideoGeometry *bufferGeometry;
DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
OMX_S32 indexTimestamp = 0;
+ int plane;
FunctionIn();
pVp8Dec->hMFCVp8Handle.outputIndexTimestamp++;
pVp8Dec->hMFCVp8Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
- pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[0] = pVideoBuffer->planes[0].addr;
- pDstOutputData->buffer.multiPlaneBuffer.fd[0] = pVideoBuffer->planes[0].fd;
- pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[1] = pVideoBuffer->planes[1].addr;
- pDstOutputData->buffer.multiPlaneBuffer.fd[1] = pVideoBuffer->planes[1].fd;
- pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[2] = pVideoBuffer->planes[2].addr;
- pDstOutputData->buffer.multiPlaneBuffer.fd[2] = pVideoBuffer->planes[2].fd;
- pDstOutputData->allocSize = pVideoBuffer->planes[0].allocSize + pVideoBuffer->planes[1].allocSize + pVideoBuffer->planes[2].allocSize;
- pDstOutputData->dataLen = pVideoBuffer->planes[0].dataSize + pVideoBuffer->planes[1].dataSize + pVideoBuffer->planes[2].dataSize;
+ pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
+ for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+ pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
+ pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
+ pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
+ pDstOutputData->dataLen += pVideoBuffer->planes[plane].dataSize;
+ }
pDstOutputData->usedDataLen = 0;
pDstOutputData->pPrivate = pVideoBuffer;
/* For Share Buffer */