if (pVideoDec->bThumbnailMode == OMX_TRUE)
pDecOps->Set_DisplayDelay(hMFCHandle, 0);
+ if ((pDecOps->Enable_DTSMode != NULL) &&
+ (pVideoDec->bDTSMode == OMX_TRUE))
+ pDecOps->Enable_DTSMode(hMFCHandle);
+
/* input buffer info */
Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
bufferConf.eCompressionFormat = VIDEO_CODING_VP8;
if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) ||
(pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight)) {
+ pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
+
pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth;
pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight;
pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
Exynos_UpdateFrameSize(pOMXComponent);
- pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
/** Send Port Settings changed call back **/
(*(pExynosComponent->pCallbacks->EventHandler))
if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) ||
(pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight) ||
(pExynosOutputPort->portDefinition.nBufferCountActual != pVp8Dec->hMFCVp8Handle.maxDPBNum)) {
+ pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
+
pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth;
pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight;
pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
pExynosOutputPort->portDefinition.nBufferCountMin = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2;
Exynos_UpdateFrameSize(pOMXComponent);
- pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
/** Send Port Settings changed call back **/
(*(pExynosComponent->pCallbacks->EventHandler))
int i, nOutbufs;
+ OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+ OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+
FunctionIn();
- /* get dpb count */
- nOutbufs = pVp8Dec->hMFCVp8Handle.maxDPBNum;
+ nAllocLen[0] = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nAlignPlaneSize[0];
+ nAllocLen[1] = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nAlignPlaneSize[1];
+
+ pOutbufOps->Set_Shareable(hMFCHandle);
if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
/* should be done before prepare output buffer */
ret = OMX_ErrorInsufficientResources;
goto EXIT;
}
- }
- pOutbufOps->Set_Shareable(hMFCHandle);
- if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) {
- Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
- ret = OMX_ErrorInsufficientResources;
- goto EXIT;
- }
-
- 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] = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nAlignPlaneSize[0];
- nAllocLen[1] = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nAlignPlaneSize[1];
+ /* get dpb count */
+ nOutbufs = pVp8Dec->hMFCVp8Handle.maxDPBNum;
+ if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
- if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
ret = Exynos_Allocate_CodecBuffers(pOMXComponent, OUTPUT_PORT_INDEX, nOutbufs, nAllocLen);
if (ret != OMX_ErrorNone)
goto EXIT;
pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
(unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
}
+
+ if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
} else if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
+ ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
+ int plane;
+
+ /* get dpb count */
+ nOutbufs = pExynosOutputPort->portDefinition.nBufferCountActual;
+ if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
+ ret = OMX_ErrorInsufficientResources;
+ goto EXIT;
+ }
+
/* Register output buffer */
/*************/
/* TBD */
pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf,
(unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
}
+
+ if (pOutbufOps->Apply_RegisteredBuffer(hMFCHandle) != VIDEO_ERROR_NONE) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Apply output buffer");
+ ret = OMX_ErrorHardware;
+ 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;
- goto EXIT;
- }
-
- if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
- VP8CodecStop (pOMXComponent, OUTPUT_PORT_INDEX);
- }
pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_TRUE;
ret = OMX_ErrorNone;
pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize;
if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
- int i = 0;
- 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;
- goto EXIT;
+ int i;
+ for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+ if (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer ==
+ pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
+ pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
+ pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
+ break;
}
- i++;
}
- pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
- pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
+
+ if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
+ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
+ ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
+ goto EXIT;
+ }
}
/* For Share Buffer */
} else {
/* For timestamp correction. if mfc support frametype detect */
Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
-#ifdef NEED_TIMESTAMP_REORDER
- if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
- pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
- pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
- pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = indexTimestamp;
- } else {
- pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
- pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
+
+ /* NEED TIMESTAMP REORDER */
+ if (pVideoDec->bDTSMode == OMX_TRUE) {
+ if (pVideoBuffer->frameType == VIDEO_FRAME_I)
+ pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = indexTimestamp;
+ else
+ indexTimestamp = pVp8Dec->hMFCVp8Handle.outputIndexTimestamp;
}
-#else
+
pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
-#endif
+
Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData->timeStamp, pDstOutputData->timeStamp / 1E6, indexTimestamp, pDstOutputData->nFlags);
}