3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 * @file Exynos_OMX_Mpeg2dec.c
21 * @author Satish Kumar Reddy (palli.satish@samsung.com)
32 #include "Exynos_OMX_Macros.h"
33 #include "Exynos_OMX_Basecomponent.h"
34 #include "Exynos_OMX_Baseport.h"
35 #include "Exynos_OMX_Vdec.h"
36 #include "Exynos_OSAL_ETC.h"
37 #include "Exynos_OSAL_Semaphore.h"
38 #include "Exynos_OSAL_Thread.h"
39 #include "library_register.h"
40 #include "Exynos_OMX_Mpeg2dec.h"
41 #include "ExynosVideoApi.h"
42 #include "Exynos_OSAL_SharedMemory.h"
43 #include "Exynos_OSAL_Event.h"
46 #include "Exynos_OSAL_Platform_Specific.h"
49 /* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
50 /* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
54 #define EXYNOS_LOG_TAG "EXYNOS_MPEG2_DEC"
55 #define EXYNOS_LOG_OFF
56 //#define EXYNOS_TRACE_ON
57 #include "Exynos_OSAL_Log.h"
59 #define MPEG2_DEC_NUM_OF_EXTRA_BUFFERS 7
61 //#define FULL_FRAME_SEARCH /* Full frame search not support*/
63 static OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, void *pVirtAddr, OMX_U32 *dataSize)
65 OMX_ERRORTYPE ret = OMX_ErrorNone;
71 static OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, void *addr[], int size[])
73 OMX_ERRORTYPE ret = OMX_ErrorNone;
74 ExynosVideoBuffer *pCodecBuffer;
76 if (codecBuffer == NULL) {
77 ret = OMX_ErrorBadParameter;
81 pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
84 addr[0] = pCodecBuffer->planes[0].addr;
85 addr[1] = pCodecBuffer->planes[1].addr;
86 addr[2] = pCodecBuffer->planes[2].addr;
90 size[0] = pCodecBuffer->planes[0].allocSize;
91 size[1] = pCodecBuffer->planes[1].allocSize;
92 size[2] = pCodecBuffer->planes[2].allocSize;
99 int Check_Mpeg2_Frame(
100 OMX_U8 *pInputStream,
103 OMX_BOOL bPreviousFrameEOF,
104 OMX_BOOL *pbEndOfFrame)
108 *pbEndOfFrame = OMX_TRUE;
110 /* Frame Start code*/
111 if (pInputStream[0] != 0x00 || pInputStream[1] != 0x00 || pInputStream[2]!=0x01) {
112 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mpeg2 Frame Start Code not Found");
113 *pbEndOfFrame = OMX_FALSE;
120 static OMX_BOOL Check_Mpeg2_StartCode(
121 OMX_U8 *pInputStream,
124 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "streamSize: %d",streamSize);
126 if (streamSize < 3) {
130 /* Frame Start code*/
131 if (pInputStream[0] != 0x00 || pInputStream[1] != 0x00 || pInputStream[2]!=0x01) {
132 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mpeg2 Frame Start Code not Found");
139 OMX_ERRORTYPE Mpeg2CodecOpen(EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec)
141 OMX_ERRORTYPE ret = OMX_ErrorNone;
142 ExynosVideoDecOps *pDecOps = NULL;
143 ExynosVideoDecBufferOps *pInbufOps = NULL;
144 ExynosVideoDecBufferOps *pOutbufOps = NULL;
148 if (pMpeg2Dec == NULL) {
149 ret = OMX_ErrorBadParameter;
150 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
154 /* alloc ops structure */
155 pDecOps = (ExynosVideoDecOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps));
156 pInbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
157 pOutbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
159 if ((pDecOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
160 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate decoder ops buffer");
161 ret = OMX_ErrorInsufficientResources;
165 pMpeg2Dec->hMFCMpeg2Handle.pDecOps = pDecOps;
166 pMpeg2Dec->hMFCMpeg2Handle.pInbufOps = pInbufOps;
167 pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps = pOutbufOps;
169 /* function pointer mapping */
170 pDecOps->nSize = sizeof(ExynosVideoDecOps);
171 pInbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
172 pOutbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
174 Exynos_Video_Register_Decoder(pDecOps, pInbufOps, pOutbufOps);
176 /* check mandatory functions for decoder ops */
177 if ((pDecOps->Init == NULL) || (pDecOps->Finalize == NULL) ||
178 (pDecOps->Get_ActualBufferCount == NULL) || (pDecOps->Set_FrameTag == NULL) ||
179 (pDecOps->Get_FrameTag == NULL)) {
180 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
181 ret = OMX_ErrorInsufficientResources;
185 /* check mandatory functions for buffer ops */
186 if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
187 (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
188 (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
189 (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
190 (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
191 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
192 ret = OMX_ErrorInsufficientResources;
196 /* alloc context, open, querycap */
198 pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.pDecOps->Init(V4L2_MEMORY_DMABUF);
200 pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.pDecOps->Init(V4L2_MEMORY_USERPTR);
202 if (pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle == NULL) {
203 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
204 ret = OMX_ErrorInsufficientResources;
211 if (ret != OMX_ErrorNone) {
212 if (pDecOps != NULL) {
213 Exynos_OSAL_Free(pDecOps);
214 pMpeg2Dec->hMFCMpeg2Handle.pDecOps = NULL;
216 if (pInbufOps != NULL) {
217 Exynos_OSAL_Free(pInbufOps);
218 pMpeg2Dec->hMFCMpeg2Handle.pInbufOps = NULL;
220 if (pOutbufOps != NULL) {
221 Exynos_OSAL_Free(pOutbufOps);
222 pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps = NULL;
231 OMX_ERRORTYPE Mpeg2CodecClose(EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec)
233 OMX_ERRORTYPE ret = OMX_ErrorNone;
234 void *hMFCHandle = NULL;
235 ExynosVideoDecOps *pDecOps = NULL;
236 ExynosVideoDecBufferOps *pInbufOps = NULL;
237 ExynosVideoDecBufferOps *pOutbufOps = NULL;
241 if (pMpeg2Dec == NULL) {
242 ret = OMX_ErrorBadParameter;
246 hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
247 pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
248 pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
249 pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
251 if (hMFCHandle != NULL) {
252 pDecOps->Finalize(hMFCHandle);
253 pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle = NULL;
255 if (pOutbufOps != NULL) {
256 Exynos_OSAL_Free(pOutbufOps);
257 pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps = NULL;
259 if (pInbufOps != NULL) {
260 Exynos_OSAL_Free(pInbufOps);
261 pMpeg2Dec->hMFCMpeg2Handle.pInbufOps = NULL;
263 if (pDecOps != NULL) {
264 Exynos_OSAL_Free(pDecOps);
265 pMpeg2Dec->hMFCMpeg2Handle.pDecOps = NULL;
276 OMX_ERRORTYPE Mpeg2CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
278 OMX_ERRORTYPE ret = OMX_ErrorNone;
279 void *hMFCHandle = NULL;
280 ExynosVideoDecOps *pDecOps = NULL;
281 ExynosVideoDecBufferOps *pInbufOps = NULL;
282 ExynosVideoDecBufferOps *pOutbufOps = NULL;
283 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
284 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
288 if (pOMXComponent == NULL) {
289 ret = OMX_ErrorBadParameter;
293 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
294 if (pVideoDec == NULL) {
295 ret = OMX_ErrorBadParameter;
299 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)pVideoDec->hCodecHandle;
300 if (pMpeg2Dec == NULL) {
301 ret = OMX_ErrorBadParameter;
305 hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
306 pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
307 pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
308 pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
310 if (nPortIndex == INPUT_PORT_INDEX)
311 pInbufOps->Run(hMFCHandle);
312 else if (nPortIndex == OUTPUT_PORT_INDEX)
313 pOutbufOps->Run(hMFCHandle);
323 OMX_ERRORTYPE Mpeg2CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
325 OMX_ERRORTYPE ret = OMX_ErrorNone;
326 void *hMFCHandle = NULL;
327 ExynosVideoDecOps *pDecOps = NULL;
328 ExynosVideoDecBufferOps *pInbufOps = NULL;
329 ExynosVideoDecBufferOps *pOutbufOps = NULL;
330 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
331 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
335 if (pOMXComponent == NULL) {
336 ret = OMX_ErrorBadParameter;
340 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
341 if (pVideoDec == NULL) {
342 ret = OMX_ErrorBadParameter;
345 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)pVideoDec->hCodecHandle;
346 if (pMpeg2Dec == NULL) {
347 ret = OMX_ErrorBadParameter;
351 hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
352 pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
353 pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
354 pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
356 if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
357 pInbufOps->Stop(hMFCHandle);
358 else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
359 pOutbufOps->Stop(hMFCHandle);
369 OMX_ERRORTYPE Mpeg2CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
371 OMX_ERRORTYPE ret = OMX_ErrorNone;
372 void *hMFCHandle = NULL;
373 ExynosVideoDecOps *pDecOps = NULL;
374 ExynosVideoDecBufferOps *pInbufOps = NULL;
375 ExynosVideoDecBufferOps *pOutbufOps = NULL;
376 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
377 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
381 if (pOMXComponent == NULL) {
382 ret = OMX_ErrorBadParameter;
386 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
387 if (pVideoDec == NULL) {
388 ret = OMX_ErrorBadParameter;
391 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)pVideoDec->hCodecHandle;
392 if (pMpeg2Dec == NULL) {
393 ret = OMX_ErrorBadParameter;
397 hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
398 pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
399 pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
400 pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
402 if (nPortIndex == INPUT_PORT_INDEX) {
403 if (pMpeg2Dec->bSourceStart == OMX_FALSE) {
404 Exynos_OSAL_SignalSet(pMpeg2Dec->hSourceStartEvent);
405 Exynos_OSAL_SleepMillisec(0);
409 if (nPortIndex == OUTPUT_PORT_INDEX) {
410 if (pMpeg2Dec->bDestinationStart == OMX_FALSE) {
411 Exynos_OSAL_SignalSet(pMpeg2Dec->hDestinationStartEvent);
412 Exynos_OSAL_SleepMillisec(0);
424 OMX_ERRORTYPE Mpeg2CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
426 OMX_ERRORTYPE ret = OMX_ErrorNone;
427 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
428 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
429 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
430 void *hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
431 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
432 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
435 ExynosVideoDecOps *pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
436 ExynosVideoDecBufferOps *pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
437 ExynosVideoDecBufferOps *pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
441 if ((nPortIndex == INPUT_PORT_INDEX) &&
442 (pMpeg2Dec->bSourceStart == OMX_TRUE)) {
443 Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
445 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
446 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
447 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
449 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
452 pInbufOps->Clear_Queue(hMFCHandle);
453 } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
454 (pMpeg2Dec->bDestinationStart == OMX_TRUE)) {
455 OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
456 ExynosVideoBuffer *pBuffer = NULL;
458 Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
460 nOutbufs = pDecOps->Get_ActualBufferCount(hMFCHandle);
461 nOutbufs += EXTRA_DPB_NUM;
462 for (i = 0; i < nOutbufs; i++) {
463 pOutbufOps->Get_Buffer(hMFCHandle, i, &pBuffer);
464 Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, (OMX_PTR)pBuffer);
466 pOutbufOps->Clear_Queue(hMFCHandle);
468 ret = OMX_ErrorBadParameter;
478 OMX_ERRORTYPE Mpeg2CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
480 OMX_ERRORTYPE ret = OMX_ErrorNone;
481 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
482 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
483 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
484 void *hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
485 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
486 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
487 OMX_U32 oneFrameSize = pSrcInputData->dataLen;
489 ExynosVideoDecOps *pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
490 ExynosVideoDecBufferOps *pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
491 ExynosVideoDecBufferOps *pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
492 ExynosVideoGeometry bufferConf;
493 OMX_U32 inputBufferNumber = 0;
498 if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
499 OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
500 OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
501 if (OMXBuffer == NULL) {
502 ret = OMX_ErrorUndefined;
506 OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
507 OMXBuffer->nFlags = pSrcInputData->nFlags;
508 Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
514 if (pVideoDec->bThumbnailMode == OMX_TRUE)
515 pDecOps->Set_DisplayDelay(hMFCHandle, 0);
517 /* input buffer info */
518 Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
519 bufferConf.eCompressionFormat = VIDEO_CODING_MPEG2;
520 pInbufOps->Set_Shareable(hMFCHandle);
521 if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
522 bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth
523 * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
524 inputBufferNumber = MAX_VIDEO_INPUTBUFFER_NUM;
525 } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
526 bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE;
527 inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
530 /* should be done before prepare input buffer */
531 if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
532 ret = OMX_ErrorInsufficientResources;
536 /* set input buffer geometry */
537 if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
538 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
539 ret = OMX_ErrorInsufficientResources;
543 /* setup input buffer */
544 if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
545 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
546 ret = OMX_ErrorInsufficientResources;
550 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
551 /* Register input buffer */
552 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
553 ExynosVideoPlane plane;
554 plane.addr = pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0];
555 plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize[0];
556 plane.fd = pVideoDec->pMFCDecInputBuffer[i]->fd[0];
557 if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
558 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "BUFFER_COPY Failed to Register input buffer");
559 ret = OMX_ErrorInsufficientResources;
563 } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
564 /* Register input buffer */
565 for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
566 ExynosVideoPlane plane;
567 plane.addr = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
568 plane.allocSize = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen;
569 plane.fd = pExynosInputPort->extendBufferHeader[i].buf_fd[0];
570 if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
571 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "BUFFER_SHARE Failed to Register input buffer");
572 ret = OMX_ErrorInsufficientResources;
578 /* set output geometry */
579 Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
580 pMpeg2Dec->hMFCMpeg2Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
581 if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
582 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
583 ret = OMX_ErrorInsufficientResources;
587 /* input buffer enqueue for header parsing */
588 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize);
589 if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
590 (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) {
591 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing");
592 // ret = OMX_ErrorInsufficientResources;
593 ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit;
597 /* start header parsing */
598 if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
599 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing");
600 ret = OMX_ErrorCodecInit;
604 /* get geometry for output */
605 Exynos_OSAL_Memset(&pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry));
606 if (pOutbufOps->Get_Geometry(hMFCHandle, &pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf) != VIDEO_ERROR_NONE) {
607 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info");
608 ret = OMX_ErrorInsufficientResources;
613 pMpeg2Dec->hMFCMpeg2Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle);
614 if (pVideoDec->bThumbnailMode == OMX_FALSE)
615 pMpeg2Dec->hMFCMpeg2Handle.maxDPBNum += EXTRA_DPB_NUM;
616 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Mpeg2CodecSetup nOutbufs: %d", pMpeg2Dec->hMFCMpeg2Handle.maxDPBNum);
618 pMpeg2Dec->hMFCMpeg2Handle.bConfiguredMFCSrc = OMX_TRUE;
620 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
621 if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameWidth) ||
622 (pExynosInputPort->portDefinition.format.video.nFrameHeight != pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameHeight)) {
623 pExynosInputPort->portDefinition.format.video.nFrameWidth = pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameWidth;
624 pExynosInputPort->portDefinition.format.video.nFrameHeight = pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameHeight;
625 pExynosInputPort->portDefinition.format.video.nStride = ((pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
626 pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
628 Exynos_UpdateFrameSize(pOMXComponent);
629 /* FIXME: OMX_EventPortSettingsChanged. do not set NEED_PORT_DISABLE in SLP platform now */
630 /* pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;*/
632 /** Send Port Settings changed call back **/
633 (*(pExynosComponent->pCallbacks->EventHandler))
635 pExynosComponent->callbackData,
636 OMX_EventPortSettingsChanged, /* The command was completed */
637 OMX_DirOutput, /* This is the port index */
641 } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
642 if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameWidth) ||
643 (pExynosInputPort->portDefinition.format.video.nFrameHeight != pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameHeight) ||
644 (pExynosOutputPort->portDefinition.nBufferCountActual != pMpeg2Dec->hMFCMpeg2Handle.maxDPBNum)) {
645 pExynosInputPort->portDefinition.format.video.nFrameWidth = pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameWidth;
646 pExynosInputPort->portDefinition.format.video.nFrameHeight = pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameHeight;
647 pExynosInputPort->portDefinition.format.video.nStride = ((pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
648 pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
650 pExynosOutputPort->portDefinition.nBufferCountActual = pMpeg2Dec->hMFCMpeg2Handle.maxDPBNum - 4;
651 pExynosOutputPort->portDefinition.nBufferCountMin = pMpeg2Dec->hMFCMpeg2Handle.maxDPBNum - 4;
653 Exynos_UpdateFrameSize(pOMXComponent);
654 pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
656 /** Send Port Settings changed call back **/
657 (*(pExynosComponent->pCallbacks->EventHandler))
659 pExynosComponent->callbackData,
660 OMX_EventPortSettingsChanged, /* The command was completed */
661 OMX_DirOutput, /* This is the port index */
666 Exynos_OSAL_SleepMillisec(0);
667 ret = OMX_ErrorInputDataDecodeYet;
668 Mpeg2CodecStop(pOMXComponent, INPUT_PORT_INDEX);
676 OMX_ERRORTYPE Mpeg2CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
678 OMX_ERRORTYPE ret = OMX_ErrorNone;
679 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
680 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
681 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
682 void *hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
683 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
684 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
686 ExynosVideoDecOps *pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
687 ExynosVideoDecBufferOps *pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
688 ExynosVideoDecBufferOps *pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
695 nOutbufs = pMpeg2Dec->hMFCMpeg2Handle.maxDPBNum;
697 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
698 /* should be done before prepare output buffer */
699 if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
700 ret = OMX_ErrorInsufficientResources;
705 pOutbufOps->Set_Shareable(hMFCHandle);
706 if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) {
707 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
708 ret = OMX_ErrorInsufficientResources;
712 ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
713 OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
714 OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
717 nAllocLen[0] = calc_plane(pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameWidth,
718 pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameHeight);
719 nAllocLen[1] = calc_plane(pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameWidth,
720 pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf.nFrameHeight >> 1);
722 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
723 /* Register output buffer */
724 for (i = 0; i < nOutbufs; i++) {
725 pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
726 Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
728 for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
729 pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] =
730 (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[plane], NORMAL_MEMORY);
731 if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] == NULL) {
732 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
733 ret = OMX_ErrorInsufficientResources;
736 pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] =
737 Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
738 pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
739 pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = nAllocLen[plane];
741 planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane];
742 planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane];
743 planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
746 if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
747 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
748 ret = OMX_ErrorInsufficientResources;
751 pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
752 (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
754 } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
755 /* Register output buffer */
760 if (pExynosOutputPort->bIsPBEnabled == OMX_TRUE) {
761 for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
762 for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
763 planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane];
764 planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane];
765 planes[plane].tbm_bo = pExynosOutputPort->extendBufferHeader[i].tbm_bo[plane];
766 planes[plane].allocSize = nAllocLen[plane];
769 if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
770 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
771 ret = OMX_ErrorInsufficientResources;
774 pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf,
775 (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
778 ret = OMX_ErrorNotImplemented;
782 ret = OMX_ErrorNotImplemented;
787 if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
788 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
789 ret = OMX_ErrorInsufficientResources;
793 if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
794 Mpeg2CodecStop (pOMXComponent, OUTPUT_PORT_INDEX);
796 pMpeg2Dec->hMFCMpeg2Handle.bConfiguredMFCDst = OMX_TRUE;
806 OMX_ERRORTYPE Exynos_Mpeg2Dec_GetParameter(
807 OMX_IN OMX_HANDLETYPE hComponent,
808 OMX_IN OMX_INDEXTYPE nParamIndex,
809 OMX_INOUT OMX_PTR pComponentParameterStructure)
811 OMX_ERRORTYPE ret = OMX_ErrorNone;
812 OMX_COMPONENTTYPE *pOMXComponent = NULL;
813 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
817 if (hComponent == NULL || pComponentParameterStructure == NULL) {
818 ret = OMX_ErrorBadParameter;
821 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
822 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
823 if (ret != OMX_ErrorNone) {
826 if (pOMXComponent->pComponentPrivate == NULL) {
827 ret = OMX_ErrorBadParameter;
831 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
832 if (pExynosComponent->currentState == OMX_StateInvalid ) {
833 ret = OMX_ErrorInvalidState;
837 switch (nParamIndex) {
838 case OMX_IndexParamVideoMpeg2:
840 OMX_VIDEO_PARAM_MPEG2TYPE *pDstMpeg2Param = (OMX_VIDEO_PARAM_MPEG2TYPE *)pComponentParameterStructure;
841 OMX_VIDEO_PARAM_MPEG2TYPE *pSrcMpeg2Param = NULL;
842 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
843 ret = Exynos_OMX_Check_SizeVersion(pDstMpeg2Param, sizeof(OMX_VIDEO_PARAM_MPEG2TYPE));
844 if (ret != OMX_ErrorNone) {
845 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "1");
849 if (pDstMpeg2Param->nPortIndex > OUTPUT_PORT_INDEX) {
850 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "2");
851 ret = OMX_ErrorBadPortIndex;
854 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
855 pSrcMpeg2Param = &pMpeg2Dec->Mpeg2Component[pDstMpeg2Param->nPortIndex];
857 Exynos_OSAL_Memcpy(pDstMpeg2Param, pSrcMpeg2Param, sizeof(OMX_VIDEO_PARAM_MPEG2TYPE));
860 case OMX_IndexParamStandardComponentRole:
862 OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
863 ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
864 if (ret != OMX_ErrorNone) {
868 Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG2_DEC_ROLE);
871 case OMX_IndexParamVideoProfileLevelCurrent:
873 OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)pComponentParameterStructure;
874 OMX_VIDEO_PARAM_MPEG2TYPE *pSrcMpeg2Component = NULL;
875 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
877 ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
878 if (ret != OMX_ErrorNone) {
882 if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
883 ret = OMX_ErrorBadPortIndex;
887 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
888 pSrcMpeg2Component = &pMpeg2Dec->Mpeg2Component[pDstProfileLevel->nPortIndex];
890 pDstProfileLevel->eProfile = pSrcMpeg2Component->eProfile;
891 pDstProfileLevel->eLevel = pSrcMpeg2Component->eLevel;
894 case OMX_IndexParamVideoErrorCorrection:
896 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
897 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
898 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
900 ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
901 if (ret != OMX_ErrorNone) {
905 if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
906 ret = OMX_ErrorBadPortIndex;
910 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
911 pSrcErrorCorrectionType = &pMpeg2Dec->errorCorrectionType[INPUT_PORT_INDEX];
913 pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
914 pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
915 pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
916 pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
917 pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
921 ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
930 OMX_ERRORTYPE Exynos_Mpeg2Dec_SetParameter(
931 OMX_IN OMX_HANDLETYPE hComponent,
932 OMX_IN OMX_INDEXTYPE nIndex,
933 OMX_IN OMX_PTR pComponentParameterStructure)
935 OMX_ERRORTYPE ret = OMX_ErrorNone;
936 OMX_COMPONENTTYPE *pOMXComponent = NULL;
937 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
941 if (hComponent == NULL || pComponentParameterStructure == NULL) {
942 ret = OMX_ErrorBadParameter;
945 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
946 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
947 if (ret != OMX_ErrorNone) {
950 if (pOMXComponent->pComponentPrivate == NULL) {
951 ret = OMX_ErrorBadParameter;
955 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
956 if (pExynosComponent->currentState == OMX_StateInvalid ) {
957 ret = OMX_ErrorInvalidState;
962 case OMX_IndexParamVideoMpeg2:
964 OMX_VIDEO_PARAM_MPEG2TYPE *pDstMpeg2Param = NULL;
965 OMX_VIDEO_PARAM_MPEG2TYPE *pSrcMpeg2Param = (OMX_VIDEO_PARAM_MPEG2TYPE *)pComponentParameterStructure;
966 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
967 ret = Exynos_OMX_Check_SizeVersion(pSrcMpeg2Param, sizeof(OMX_VIDEO_PARAM_MPEG2TYPE));
968 if (ret != OMX_ErrorNone) {
972 if (pSrcMpeg2Param->nPortIndex > OUTPUT_PORT_INDEX) {
973 ret = OMX_ErrorBadPortIndex;
977 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
978 pDstMpeg2Param = &pMpeg2Dec->Mpeg2Component[pSrcMpeg2Param->nPortIndex];
980 Exynos_OSAL_Memcpy(pDstMpeg2Param, pSrcMpeg2Param, sizeof(OMX_VIDEO_PARAM_MPEG2TYPE));
983 case OMX_IndexParamStandardComponentRole:
985 OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
987 ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
988 if (ret != OMX_ErrorNone) {
992 if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
993 ret = OMX_ErrorIncorrectStateOperation;
997 if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG2_DEC_ROLE)) {
998 pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG2;
1000 ret = OMX_ErrorBadParameter;
1005 case OMX_IndexParamPortDefinition:
1007 OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)pComponentParameterStructure;
1008 OMX_U32 portIndex = pPortDefinition->nPortIndex;
1009 EXYNOS_OMX_BASEPORT *pExynosPort;
1010 OMX_U32 width, height, size;
1011 OMX_U32 realWidth, realHeight;
1013 if (portIndex >= pExynosComponent->portParam.nPorts) {
1014 ret = OMX_ErrorBadPortIndex;
1017 ret = Exynos_OMX_Check_SizeVersion(pPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
1018 if (ret != OMX_ErrorNone) {
1022 pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1024 if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1025 if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
1026 ret = OMX_ErrorIncorrectStateOperation;
1030 if (pPortDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) {
1031 ret = OMX_ErrorBadParameter;
1035 Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, pPortDefinition, pPortDefinition->nSize);
1037 realWidth = pExynosPort->portDefinition.format.video.nFrameWidth;
1038 realHeight = pExynosPort->portDefinition.format.video.nFrameHeight;
1039 width = ((realWidth + 15) & (~15));
1040 height = ((realHeight + 15) & (~15));
1041 size = (width * height * 3) / 2;
1042 pExynosPort->portDefinition.format.video.nStride = width;
1043 pExynosPort->portDefinition.format.video.nSliceHeight = height;
1044 pExynosPort->portDefinition.nBufferSize = (size > pExynosPort->portDefinition.nBufferSize) ? size : pExynosPort->portDefinition.nBufferSize;
1046 if (portIndex == INPUT_PORT_INDEX) {
1047 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1048 pExynosOutputPort->portDefinition.format.video.nFrameWidth = pExynosPort->portDefinition.format.video.nFrameWidth;
1049 pExynosOutputPort->portDefinition.format.video.nFrameHeight = pExynosPort->portDefinition.format.video.nFrameHeight;
1050 pExynosOutputPort->portDefinition.format.video.nStride = width;
1051 pExynosOutputPort->portDefinition.format.video.nSliceHeight = height;
1053 switch (pExynosOutputPort->portDefinition.format.video.eColorFormat) {
1054 case OMX_COLOR_FormatYUV420Planar:
1055 case OMX_COLOR_FormatYUV420SemiPlanar:
1056 // case OMX_SEC_COLOR_FormatNV12TPhysicalAddress:
1057 //case OMX_SEC_COLOR_FormatANBYUV420SemiPlanar:
1058 pExynosOutputPort->portDefinition.nBufferSize = (width * height * 3) / 2;
1060 case OMX_SEC_COLOR_FormatNV12Tiled:
1061 pExynosOutputPort->portDefinition.nBufferSize =
1062 calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) +
1063 calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1);
1066 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Color format is not support!! use default YUV size!!");
1067 ret = OMX_ErrorUnsupportedSetting;
1071 if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
1072 pExynosOutputPort->portDefinition.nBufferSize =
1073 calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) +
1074 calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1);
1079 case OMX_IndexParamVideoProfileLevelCurrent:
1081 OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
1082 OMX_VIDEO_PARAM_MPEG2TYPE *pDstMpeg2Component = NULL;
1083 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
1085 ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
1086 if (ret != OMX_ErrorNone)
1089 if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) {
1090 ret = OMX_ErrorBadPortIndex;
1094 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1096 pDstMpeg2Component = &pMpeg2Dec->Mpeg2Component[pSrcProfileLevel->nPortIndex];
1097 pDstMpeg2Component->eProfile = pSrcProfileLevel->eProfile;
1098 pDstMpeg2Component->eLevel = pSrcProfileLevel->eLevel;
1101 case OMX_IndexParamVideoErrorCorrection:
1103 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
1104 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
1105 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
1107 ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
1108 if (ret != OMX_ErrorNone) {
1112 if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
1113 ret = OMX_ErrorBadPortIndex;
1117 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1118 pDstErrorCorrectionType = &pMpeg2Dec->errorCorrectionType[INPUT_PORT_INDEX];
1120 pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
1121 pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
1122 pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
1123 pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
1124 pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
1128 ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
1137 OMX_ERRORTYPE Exynos_Mpeg2Dec_GetConfig(
1138 OMX_HANDLETYPE hComponent,
1139 OMX_INDEXTYPE nIndex,
1140 OMX_PTR pComponentConfigStructure)
1142 OMX_ERRORTYPE ret = OMX_ErrorNone;
1143 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1144 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1148 if (hComponent == NULL) {
1149 ret = OMX_ErrorBadParameter;
1152 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1153 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1154 if (ret != OMX_ErrorNone) {
1157 if (pOMXComponent->pComponentPrivate == NULL) {
1158 ret = OMX_ErrorBadParameter;
1161 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1162 if (pExynosComponent->currentState == OMX_StateInvalid) {
1163 ret = OMX_ErrorInvalidState;
1169 ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
1179 OMX_ERRORTYPE Exynos_Mpeg2Dec_SetConfig(
1180 OMX_HANDLETYPE hComponent,
1181 OMX_INDEXTYPE nIndex,
1182 OMX_PTR pComponentConfigStructure)
1184 OMX_ERRORTYPE ret = OMX_ErrorNone;
1185 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1186 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1190 if (hComponent == NULL) {
1191 ret = OMX_ErrorBadParameter;
1194 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1195 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1196 if (ret != OMX_ErrorNone) {
1199 if (pOMXComponent->pComponentPrivate == NULL) {
1200 ret = OMX_ErrorBadParameter;
1203 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1204 if (pExynosComponent->currentState == OMX_StateInvalid) {
1205 ret = OMX_ErrorInvalidState;
1211 ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
1221 OMX_ERRORTYPE Exynos_Mpeg2Dec_GetExtensionIndex(
1222 OMX_IN OMX_HANDLETYPE hComponent,
1223 OMX_IN OMX_STRING cParameterName,
1224 OMX_OUT OMX_INDEXTYPE *pIndexType)
1226 OMX_ERRORTYPE ret = OMX_ErrorNone;
1227 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1228 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1232 if (hComponent == NULL) {
1233 ret = OMX_ErrorBadParameter;
1236 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1237 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1238 if (ret != OMX_ErrorNone) {
1241 if (pOMXComponent->pComponentPrivate == NULL) {
1242 ret = OMX_ErrorBadParameter;
1245 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1246 if ((cParameterName == NULL) || (pIndexType == NULL)) {
1247 ret = OMX_ErrorBadParameter;
1250 if (pExynosComponent->currentState == OMX_StateInvalid) {
1251 ret = OMX_ErrorInvalidState;
1255 if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) {
1256 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1257 *pIndexType = OMX_IndexVendorThumbnailMode;
1258 ret = OMX_ErrorNone;
1260 ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
1269 OMX_ERRORTYPE Exynos_Mpeg2Dec_ComponentRoleEnum(
1270 OMX_HANDLETYPE hComponent,
1274 OMX_ERRORTYPE ret = OMX_ErrorNone;
1275 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1276 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1280 if ((hComponent == NULL) || (cRole == NULL)) {
1281 ret = OMX_ErrorBadParameter;
1284 if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) {
1285 Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MPEG2_DEC_ROLE);
1286 ret = OMX_ErrorNone;
1288 ret = OMX_ErrorNoMore;
1298 OMX_ERRORTYPE Exynos_Mpeg2Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
1300 OMX_ERRORTYPE ret = OMX_ErrorNone;
1301 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1302 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1303 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1304 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1305 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)pVideoDec->hCodecHandle;
1306 OMX_PTR hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
1308 ExynosVideoDecOps *pDecOps = NULL;
1309 ExynosVideoDecBufferOps *pInbufOps = NULL;
1310 ExynosVideoDecBufferOps *pOutbufOps = NULL;
1312 CSC_METHOD csc_method = CSC_METHOD_SW;
1317 pMpeg2Dec->hMFCMpeg2Handle.bConfiguredMFCSrc = OMX_FALSE;
1318 pMpeg2Dec->hMFCMpeg2Handle.bConfiguredMFCDst = OMX_FALSE;
1319 pExynosComponent->bUseFlagEOF = OMX_TRUE;
1320 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
1322 /* Mpeg2 Codec Open */
1323 ret = Mpeg2CodecOpen(pMpeg2Dec);
1324 if (ret != OMX_ErrorNone) {
1328 pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
1329 pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
1330 pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
1332 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1333 Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
1334 Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
1336 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1337 pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
1338 Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
1339 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
1341 for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1342 /* Use ION Allocator */
1343 pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
1344 pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1345 pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE;
1346 pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
1347 if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) {
1348 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
1349 ret = OMX_ErrorInsufficientResources;
1352 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1355 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
1357 } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
1361 /* Does not require any actions. */
1364 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1365 Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
1366 Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
1367 } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
1371 /* Does not require any actions. */
1374 pMpeg2Dec->bSourceStart = OMX_FALSE;
1375 Exynos_OSAL_SignalCreate(&pMpeg2Dec->hSourceStartEvent);
1376 pMpeg2Dec->bDestinationStart = OMX_FALSE;
1377 Exynos_OSAL_SignalCreate(&pMpeg2Dec->hDestinationStartEvent);
1379 Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
1380 Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
1381 pMpeg2Dec->hMFCMpeg2Handle.indexTimestamp = 0;
1382 pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp = 0;
1384 pExynosComponent->getAllDelayBuffer = OMX_FALSE;
1386 #if 0//defined(USE_CSC_GSCALER)
1387 csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
1389 pVideoDec->csc_handle = csc_init(csc_method);
1390 if (pVideoDec->csc_handle == NULL) {
1391 ret = OMX_ErrorInsufficientResources;
1394 pVideoDec->csc_set_format = OMX_FALSE;
1403 OMX_ERRORTYPE Exynos_Mpeg2Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
1405 OMX_ERRORTYPE ret = OMX_ErrorNone;
1406 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1407 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1408 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1409 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1410 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1411 OMX_PTR hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
1413 ExynosVideoDecOps *pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
1414 ExynosVideoDecBufferOps *pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
1415 ExynosVideoDecBufferOps *pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
1421 if (pVideoDec->csc_handle != NULL) {
1422 csc_deinit(pVideoDec->csc_handle);
1423 pVideoDec->csc_handle = NULL;
1426 Exynos_OSAL_SignalTerminate(pMpeg2Dec->hDestinationStartEvent);
1427 pMpeg2Dec->hDestinationStartEvent = NULL;
1428 pMpeg2Dec->bDestinationStart = OMX_FALSE;
1429 Exynos_OSAL_SignalTerminate(pMpeg2Dec->hSourceStartEvent);
1430 pMpeg2Dec->hSourceStartEvent = NULL;
1431 pMpeg2Dec->bSourceStart = OMX_FALSE;
1433 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1434 for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
1435 if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
1436 #ifndef SLP_PLATFORM /* do not use ion */
1437 for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1438 if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL)
1439 Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
1442 Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
1443 pVideoDec->pMFCDecOutputBuffer[i] = NULL;
1447 Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
1448 Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
1449 } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
1453 /* Does not require any actions. */
1456 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1457 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1458 if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
1459 #ifndef SLP_PLATFORM /* do not use ion */
1460 for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1461 if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL)
1462 Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1465 Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
1466 pVideoDec->pMFCDecInputBuffer[i] = NULL;
1470 Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
1471 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
1472 } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
1476 /* Does not require any actions. */
1478 Mpeg2CodecClose(pMpeg2Dec);
1486 OMX_ERRORTYPE Exynos_Mpeg2Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
1488 OMX_ERRORTYPE ret = OMX_ErrorNone;
1489 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1490 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1491 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1492 void *hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
1493 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1494 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1495 OMX_U32 oneFrameSize = pSrcInputData->dataLen;
1496 ExynosVideoDecOps *pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
1497 ExynosVideoDecBufferOps *pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
1498 ExynosVideoDecBufferOps *pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
1499 ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
1504 if (pMpeg2Dec->hMFCMpeg2Handle.bConfiguredMFCSrc == OMX_FALSE) {
1505 ret = Mpeg2CodecSrcSetup(pOMXComponent, pSrcInputData);
1508 if (pMpeg2Dec->hMFCMpeg2Handle.bConfiguredMFCDst == OMX_FALSE) {
1509 ret = Mpeg2CodecDstSetup(pOMXComponent);
1512 if ((Check_Mpeg2_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize) == OMX_TRUE) ||
1513 ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)){
1514 pExynosComponent->timeStamp[pMpeg2Dec->hMFCMpeg2Handle.indexTimestamp] = pSrcInputData->timeStamp;
1515 pExynosComponent->nFlags[pMpeg2Dec->hMFCMpeg2Handle.indexTimestamp] = pSrcInputData->nFlags;
1516 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pMpeg2Dec->hMFCMpeg2Handle.indexTimestamp, pSrcInputData->nFlags);
1517 pDecOps->Set_FrameTag(hMFCHandle, pMpeg2Dec->hMFCMpeg2Handle.indexTimestamp);
1518 pMpeg2Dec->hMFCMpeg2Handle.indexTimestamp++;
1519 pMpeg2Dec->hMFCMpeg2Handle.indexTimestamp %= MAX_TIMESTAMP;
1521 /* queue work for input buffer */
1522 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer);
1523 codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
1524 (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
1525 if (codecReturn != VIDEO_ERROR_NONE) {
1526 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
1527 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
1530 Mpeg2CodecStart(pOMXComponent, INPUT_PORT_INDEX);
1531 if (pMpeg2Dec->bSourceStart == OMX_FALSE) {
1532 pMpeg2Dec->bSourceStart = OMX_TRUE;
1533 Exynos_OSAL_SignalSet(pMpeg2Dec->hSourceStartEvent);
1534 Exynos_OSAL_SleepMillisec(0);
1536 if (pMpeg2Dec->bDestinationStart == OMX_FALSE) {
1537 pMpeg2Dec->bDestinationStart = OMX_TRUE;
1538 Exynos_OSAL_SignalSet(pMpeg2Dec->hDestinationStartEvent);
1539 Exynos_OSAL_SleepMillisec(0);
1543 ret = OMX_ErrorNone;
1551 OMX_ERRORTYPE Exynos_Mpeg2Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
1553 OMX_ERRORTYPE ret = OMX_ErrorNone;
1554 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1555 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1556 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1557 void *hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
1558 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1559 ExynosVideoDecOps *pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
1560 ExynosVideoDecBufferOps *pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
1561 ExynosVideoBuffer *pVideoBuffer;
1565 pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
1567 pSrcOutputData->dataLen = 0;
1568 pSrcOutputData->usedDataLen = 0;
1569 pSrcOutputData->remainDataLen = 0;
1570 pSrcOutputData->nFlags = 0;
1571 pSrcOutputData->timeStamp = 0;
1573 if (pVideoBuffer == NULL) {
1574 pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
1575 pSrcOutputData->allocSize = 0;
1576 pSrcOutputData->pPrivate = NULL;
1577 pSrcOutputData->bufferHeader = NULL;
1579 pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
1580 pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
1581 pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize;
1583 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1585 while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
1586 if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
1587 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
1588 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
1593 pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
1594 pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
1597 /* For Share Buffer */
1598 pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
1601 ret = OMX_ErrorNone;
1609 OMX_ERRORTYPE Exynos_Mpeg2Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
1611 OMX_ERRORTYPE ret = OMX_ErrorNone;
1612 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1613 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1614 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1615 void *hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
1616 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1617 ExynosVideoDecOps *pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
1618 ExynosVideoDecBufferOps *pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
1619 OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
1620 ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
1624 if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
1625 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
1626 ret = OMX_ErrorBadParameter;
1630 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__,
1631 pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
1632 pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]);
1634 codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
1635 (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
1637 if (codecReturn != VIDEO_ERROR_NONE) {
1638 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
1639 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
1642 Mpeg2CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
1644 ret = OMX_ErrorNone;
1652 OMX_ERRORTYPE Exynos_Mpeg2Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
1654 OMX_ERRORTYPE ret = OMX_ErrorNone;
1655 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1656 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1657 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1658 void *hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
1659 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1660 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1661 ExynosVideoDecOps *pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
1662 ExynosVideoDecBufferOps *pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
1663 ExynosVideoBuffer *pVideoBuffer;
1664 ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
1665 ExynosVideoGeometry *bufferGeometry;
1666 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
1667 OMX_S32 indexTimestamp = 0;
1672 if (pMpeg2Dec->bDestinationStart == OMX_FALSE) {
1673 ret = OMX_ErrorNone;
1678 if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
1679 ret = OMX_ErrorNone;
1682 displayStatus = pVideoBuffer->displayStatus;
1683 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
1685 if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
1686 (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
1687 (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
1688 (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
1689 if (pVideoBuffer != NULL) {
1690 ret = OMX_ErrorNone;
1693 ret = OMX_ErrorUndefined;
1699 if (ret != OMX_ErrorNone)
1702 pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp++;
1703 pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
1705 pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
1706 for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1707 pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
1708 pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
1709 pDstOutputData->buffer.multiPlaneBuffer.tbm_bo[plane] = pVideoBuffer->planes[plane].tbm_bo;
1710 pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
1711 pDstOutputData->dataLen += pVideoBuffer->planes[plane].dataSize;
1713 pDstOutputData->usedDataLen = 0;
1714 pDstOutputData->pPrivate = pVideoBuffer;
1715 /* For Share Buffer */
1716 pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
1718 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
1719 bufferGeometry = &pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf;
1720 pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
1721 pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
1722 switch (bufferGeometry->eColorFormat) {
1723 case VIDEO_COLORFORMAT_NV12:
1724 pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
1726 case VIDEO_COLORFORMAT_NV12_TILED:
1728 pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
1732 indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
1733 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
1734 if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
1735 if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) &&
1736 (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) {
1737 pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp];
1738 pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp];
1739 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
1741 pDstOutputData->timeStamp = 0x00;
1742 pDstOutputData->nFlags = 0x00;
1745 /* For timestamp correction. if mfc support frametype detect */
1746 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
1747 //#ifdef NEED_TIMESTAMP_REORDER
1749 if (pVideoDec->bNeedTimestampReorder == OMX_TRUE) {
1750 if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
1751 pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
1752 pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
1753 pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp = indexTimestamp;
1755 pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp];
1756 pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp];
1760 pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
1761 pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
1764 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData->timeStamp, pDstOutputData->timeStamp / 1E6, indexTimestamp, pDstOutputData->nFlags);
1767 if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
1768 ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
1769 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
1770 pDstOutputData->remainDataLen = 0;
1772 pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
1775 ret = OMX_ErrorNone;
1783 OMX_ERRORTYPE Exynos_Mpeg2Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
1785 OMX_ERRORTYPE ret = OMX_ErrorNone;
1786 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1787 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1788 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1792 if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
1793 ret = OMX_ErrorNone;
1796 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
1797 ret = OMX_ErrorNone;
1801 ret = Exynos_Mpeg2Dec_SrcIn(pOMXComponent, pSrcInputData);
1802 if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) {
1803 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
1804 pExynosComponent->callbackData,
1805 OMX_EventError, ret, 0, NULL);
1814 OMX_ERRORTYPE Exynos_Mpeg2Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
1816 OMX_ERRORTYPE ret = OMX_ErrorNone;
1817 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1818 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1819 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1823 if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
1824 ret = OMX_ErrorNone;
1828 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1829 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
1830 ret = OMX_ErrorNone;
1834 if ((pMpeg2Dec->bSourceStart == OMX_FALSE) &&
1835 (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
1836 Exynos_OSAL_SignalWait(pMpeg2Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME);
1837 Exynos_OSAL_SignalReset(pMpeg2Dec->hSourceStartEvent);
1840 ret = Exynos_Mpeg2Dec_SrcOut(pOMXComponent, pSrcOutputData);
1841 if ((ret != OMX_ErrorNone) &&
1842 (pExynosComponent->currentState == OMX_StateExecuting)) {
1843 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
1844 pExynosComponent->callbackData,
1845 OMX_EventError, ret, 0, NULL);
1854 OMX_ERRORTYPE Exynos_Mpeg2Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
1856 OMX_ERRORTYPE ret = OMX_ErrorNone;
1857 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1858 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1859 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1863 if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
1864 ret = OMX_ErrorNone;
1867 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
1868 ret = OMX_ErrorNone;
1871 if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
1872 if ((pMpeg2Dec->bDestinationStart == OMX_FALSE) &&
1873 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
1874 Exynos_OSAL_SignalWait(pMpeg2Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
1875 Exynos_OSAL_SignalReset(pMpeg2Dec->hDestinationStartEvent);
1878 if (pMpeg2Dec->hMFCMpeg2Handle.bConfiguredMFCDst == OMX_TRUE) {
1879 ret = Exynos_Mpeg2Dec_DstIn(pOMXComponent, pDstInputData);
1880 if (ret != OMX_ErrorNone) {
1881 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
1882 pExynosComponent->callbackData,
1883 OMX_EventError, ret, 0, NULL);
1893 OMX_ERRORTYPE Exynos_Mpeg2Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
1895 OMX_ERRORTYPE ret = OMX_ErrorNone;
1896 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1897 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1898 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1902 if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
1903 ret = OMX_ErrorNone;
1906 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
1907 ret = OMX_ErrorNone;
1911 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1912 if ((pMpeg2Dec->bDestinationStart == OMX_FALSE) &&
1913 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
1914 Exynos_OSAL_SignalWait(pMpeg2Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
1915 Exynos_OSAL_SignalReset(pMpeg2Dec->hDestinationStartEvent);
1918 ret = Exynos_Mpeg2Dec_DstOut(pOMXComponent, pDstOutputData);
1919 if ((ret != OMX_ErrorNone) &&
1920 (pExynosComponent->currentState == OMX_StateExecuting)) {
1921 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
1922 pExynosComponent->callbackData,
1923 OMX_EventError, ret, 0, NULL);
1932 OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(
1933 OMX_HANDLETYPE hComponent,
1934 OMX_STRING componentName)
1936 OMX_ERRORTYPE ret = OMX_ErrorNone;
1937 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1938 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1939 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1940 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
1941 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
1946 if ((hComponent == NULL) || (componentName == NULL)) {
1947 ret = OMX_ErrorBadParameter;
1948 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
1951 if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MPEG2_DEC, componentName) != 0) {
1952 ret = OMX_ErrorBadParameter;
1953 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
1957 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1958 ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent);
1959 if (ret != OMX_ErrorNone) {
1960 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1963 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1964 pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
1966 pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
1967 if (pExynosComponent->componentName == NULL) {
1968 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
1969 ret = OMX_ErrorInsufficientResources;
1970 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
1973 Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
1975 pMpeg2Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_MPEG2DEC_HANDLE));
1976 if (pMpeg2Dec == NULL) {
1977 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
1978 ret = OMX_ErrorInsufficientResources;
1979 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
1982 Exynos_OSAL_Memset(pMpeg2Dec, 0, sizeof(EXYNOS_MPEG2DEC_HANDLE));
1983 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1984 pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pMpeg2Dec;
1986 Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MPEG2_DEC);
1988 /* Set componentVersion */
1989 pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
1990 pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
1991 pExynosComponent->componentVersion.s.nRevision = REVISION_NUMBER;
1992 pExynosComponent->componentVersion.s.nStep = STEP_NUMBER;
1993 /* Set specVersion */
1994 pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
1995 pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
1996 pExynosComponent->specVersion.s.nRevision = REVISION_NUMBER;
1997 pExynosComponent->specVersion.s.nStep = STEP_NUMBER;
2000 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2001 pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
2002 pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
2003 pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
2004 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
2005 pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
2006 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG2;
2007 Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2008 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/mpeg2");
2009 pExynosPort->portDefinition.format.video.pNativeRender = 0;
2010 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
2011 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
2012 pExynosPort->portDefinition.bEnabled = OMX_TRUE;
2013 //pExynosPort->bufferProcessType = BUFFER_SHARE;
2014 pExynosPort->bufferProcessType = BUFFER_COPY;
2015 pExynosPort->portWayType = WAY2_PORT;
2018 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2019 pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
2020 pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
2021 pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
2022 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
2023 pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
2024 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
2025 Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2026 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
2027 pExynosPort->portDefinition.format.video.pNativeRender = 0;
2028 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
2029 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
2030 pExynosPort->portDefinition.bEnabled = OMX_TRUE;
2032 pExynosPort->bufferProcessType = BUFFER_SHARE;
2034 pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_PBSHARE;
2036 pExynosPort->portWayType = WAY2_PORT;
2038 for(i = 0; i < ALL_PORT_NUM; i++) {
2039 INIT_SET_SIZE_VERSION(&pMpeg2Dec->Mpeg2Component[i], OMX_VIDEO_PARAM_MPEG2TYPE);
2040 pMpeg2Dec->Mpeg2Component[i].nPortIndex = i;
2041 pMpeg2Dec->Mpeg2Component[i].eProfile = OMX_VIDEO_MPEG2ProfileMain;
2042 pMpeg2Dec->Mpeg2Component[i].eLevel = OMX_VIDEO_MPEG2LevelML; /* Check again**** */
2045 pOMXComponent->GetParameter = &Exynos_Mpeg2Dec_GetParameter;
2046 pOMXComponent->SetParameter = &Exynos_Mpeg2Dec_SetParameter;
2047 pOMXComponent->GetConfig = &Exynos_Mpeg2Dec_GetConfig;
2048 pOMXComponent->SetConfig = &Exynos_Mpeg2Dec_SetConfig;
2049 pOMXComponent->GetExtensionIndex = &Exynos_Mpeg2Dec_GetExtensionIndex;
2050 pOMXComponent->ComponentRoleEnum = &Exynos_Mpeg2Dec_ComponentRoleEnum;
2051 pOMXComponent->ComponentDeInit = &Exynos_OMX_ComponentDeinit;
2053 pExynosComponent->exynos_codec_componentInit = &Exynos_Mpeg2Dec_Init;
2054 pExynosComponent->exynos_codec_componentTerminate = &Exynos_Mpeg2Dec_Terminate;
2056 pVideoDec->exynos_codec_srcInputProcess = &Exynos_Mpeg2Dec_srcInputBufferProcess;
2057 pVideoDec->exynos_codec_srcOutputProcess = &Exynos_Mpeg2Dec_srcOutputBufferProcess;
2058 pVideoDec->exynos_codec_dstInputProcess = &Exynos_Mpeg2Dec_dstInputBufferProcess;
2059 pVideoDec->exynos_codec_dstOutputProcess = &Exynos_Mpeg2Dec_dstOutputBufferProcess;
2061 pVideoDec->exynos_codec_start = &Mpeg2CodecStart;
2062 pVideoDec->exynos_codec_stop = &Mpeg2CodecStop;
2063 pVideoDec->exynos_codec_bufferProcessRun = &Mpeg2CodecOutputBufferProcessRun;
2064 pVideoDec->exynos_codec_enqueueAllBuffer = &Mpeg2CodecEnQueueAllBuffer;
2066 pVideoDec->exynos_checkInputFrame = &Check_Mpeg2_Frame;
2067 pVideoDec->exynos_codec_getCodecInputPrivateData = &GetCodecInputPrivateData;
2068 pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
2070 #ifndef SLP_PLATFORM /* do not use ion */
2071 pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
2072 if (pVideoDec->hSharedMemory == NULL) {
2073 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
2074 Exynos_OSAL_Free(pMpeg2Dec);
2075 pMpeg2Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
2076 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2077 ret = OMX_ErrorInsufficientResources;
2081 pExynosComponent->currentState = OMX_StateLoaded;
2083 ret = OMX_ErrorNone;
2091 OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(
2092 OMX_HANDLETYPE hComponent)
2094 OMX_ERRORTYPE ret = OMX_ErrorNone;
2095 OMX_COMPONENTTYPE *pOMXComponent = NULL;
2096 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
2097 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
2098 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
2102 if (hComponent == NULL) {
2103 ret = OMX_ErrorBadParameter;
2106 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
2107 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2108 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
2109 #ifndef SLP_PLATFORM /* do not use ion */
2110 Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
2112 Exynos_OSAL_Free(pExynosComponent->componentName);
2113 pExynosComponent->componentName = NULL;
2115 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)pVideoDec->hCodecHandle;
2116 if (pMpeg2Dec != NULL) {
2117 Exynos_OSAL_Free(pMpeg2Dec);
2118 pMpeg2Dec = pVideoDec->hCodecHandle = NULL;
2121 ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2122 if (ret != OMX_ErrorNone) {
2126 ret = OMX_ErrorNone;