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].allocSize = nAllocLen[plane];
768 if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
769 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
770 ret = OMX_ErrorInsufficientResources;
773 pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf,
774 (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
777 ret = OMX_ErrorNotImplemented;
781 ret = OMX_ErrorNotImplemented;
786 if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
787 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
788 ret = OMX_ErrorInsufficientResources;
792 if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
793 Mpeg2CodecStop (pOMXComponent, OUTPUT_PORT_INDEX);
795 pMpeg2Dec->hMFCMpeg2Handle.bConfiguredMFCDst = OMX_TRUE;
805 OMX_ERRORTYPE Exynos_Mpeg2Dec_GetParameter(
806 OMX_IN OMX_HANDLETYPE hComponent,
807 OMX_IN OMX_INDEXTYPE nParamIndex,
808 OMX_INOUT OMX_PTR pComponentParameterStructure)
810 OMX_ERRORTYPE ret = OMX_ErrorNone;
811 OMX_COMPONENTTYPE *pOMXComponent = NULL;
812 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
816 if (hComponent == NULL || pComponentParameterStructure == NULL) {
817 ret = OMX_ErrorBadParameter;
820 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
821 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
822 if (ret != OMX_ErrorNone) {
825 if (pOMXComponent->pComponentPrivate == NULL) {
826 ret = OMX_ErrorBadParameter;
830 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
831 if (pExynosComponent->currentState == OMX_StateInvalid ) {
832 ret = OMX_ErrorInvalidState;
836 switch (nParamIndex) {
837 case OMX_IndexParamVideoMpeg2:
839 OMX_VIDEO_PARAM_MPEG2TYPE *pDstMpeg2Param = (OMX_VIDEO_PARAM_MPEG2TYPE *)pComponentParameterStructure;
840 OMX_VIDEO_PARAM_MPEG2TYPE *pSrcMpeg2Param = NULL;
841 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
842 ret = Exynos_OMX_Check_SizeVersion(pDstMpeg2Param, sizeof(OMX_VIDEO_PARAM_MPEG2TYPE));
843 if (ret != OMX_ErrorNone) {
844 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "1");
848 if (pDstMpeg2Param->nPortIndex > OUTPUT_PORT_INDEX) {
849 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "2");
850 ret = OMX_ErrorBadPortIndex;
853 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
854 pSrcMpeg2Param = &pMpeg2Dec->Mpeg2Component[pDstMpeg2Param->nPortIndex];
856 Exynos_OSAL_Memcpy(pDstMpeg2Param, pSrcMpeg2Param, sizeof(OMX_VIDEO_PARAM_MPEG2TYPE));
859 case OMX_IndexParamStandardComponentRole:
861 OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
862 ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
863 if (ret != OMX_ErrorNone) {
867 Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG2_DEC_ROLE);
870 case OMX_IndexParamVideoProfileLevelCurrent:
872 OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)pComponentParameterStructure;
873 OMX_VIDEO_PARAM_MPEG2TYPE *pSrcMpeg2Component = NULL;
874 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
876 ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
877 if (ret != OMX_ErrorNone) {
881 if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
882 ret = OMX_ErrorBadPortIndex;
886 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
887 pSrcMpeg2Component = &pMpeg2Dec->Mpeg2Component[pDstProfileLevel->nPortIndex];
889 pDstProfileLevel->eProfile = pSrcMpeg2Component->eProfile;
890 pDstProfileLevel->eLevel = pSrcMpeg2Component->eLevel;
893 case OMX_IndexParamVideoErrorCorrection:
895 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
896 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
897 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
899 ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
900 if (ret != OMX_ErrorNone) {
904 if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
905 ret = OMX_ErrorBadPortIndex;
909 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
910 pSrcErrorCorrectionType = &pMpeg2Dec->errorCorrectionType[INPUT_PORT_INDEX];
912 pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
913 pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
914 pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
915 pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
916 pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
920 ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
929 OMX_ERRORTYPE Exynos_Mpeg2Dec_SetParameter(
930 OMX_IN OMX_HANDLETYPE hComponent,
931 OMX_IN OMX_INDEXTYPE nIndex,
932 OMX_IN OMX_PTR pComponentParameterStructure)
934 OMX_ERRORTYPE ret = OMX_ErrorNone;
935 OMX_COMPONENTTYPE *pOMXComponent = NULL;
936 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
940 if (hComponent == NULL || pComponentParameterStructure == NULL) {
941 ret = OMX_ErrorBadParameter;
944 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
945 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
946 if (ret != OMX_ErrorNone) {
949 if (pOMXComponent->pComponentPrivate == NULL) {
950 ret = OMX_ErrorBadParameter;
954 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
955 if (pExynosComponent->currentState == OMX_StateInvalid ) {
956 ret = OMX_ErrorInvalidState;
961 case OMX_IndexParamVideoMpeg2:
963 OMX_VIDEO_PARAM_MPEG2TYPE *pDstMpeg2Param = NULL;
964 OMX_VIDEO_PARAM_MPEG2TYPE *pSrcMpeg2Param = (OMX_VIDEO_PARAM_MPEG2TYPE *)pComponentParameterStructure;
965 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
966 ret = Exynos_OMX_Check_SizeVersion(pSrcMpeg2Param, sizeof(OMX_VIDEO_PARAM_MPEG2TYPE));
967 if (ret != OMX_ErrorNone) {
971 if (pSrcMpeg2Param->nPortIndex > OUTPUT_PORT_INDEX) {
972 ret = OMX_ErrorBadPortIndex;
976 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
977 pDstMpeg2Param = &pMpeg2Dec->Mpeg2Component[pSrcMpeg2Param->nPortIndex];
979 Exynos_OSAL_Memcpy(pDstMpeg2Param, pSrcMpeg2Param, sizeof(OMX_VIDEO_PARAM_MPEG2TYPE));
982 case OMX_IndexParamStandardComponentRole:
984 OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
986 ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
987 if (ret != OMX_ErrorNone) {
991 if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
992 ret = OMX_ErrorIncorrectStateOperation;
996 if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG2_DEC_ROLE)) {
997 pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG2;
999 ret = OMX_ErrorBadParameter;
1004 case OMX_IndexParamPortDefinition:
1006 OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)pComponentParameterStructure;
1007 OMX_U32 portIndex = pPortDefinition->nPortIndex;
1008 EXYNOS_OMX_BASEPORT *pExynosPort;
1009 OMX_U32 width, height, size;
1010 OMX_U32 realWidth, realHeight;
1012 if (portIndex >= pExynosComponent->portParam.nPorts) {
1013 ret = OMX_ErrorBadPortIndex;
1016 ret = Exynos_OMX_Check_SizeVersion(pPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
1017 if (ret != OMX_ErrorNone) {
1021 pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1023 if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1024 if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
1025 ret = OMX_ErrorIncorrectStateOperation;
1029 if (pPortDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) {
1030 ret = OMX_ErrorBadParameter;
1034 Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, pPortDefinition, pPortDefinition->nSize);
1036 realWidth = pExynosPort->portDefinition.format.video.nFrameWidth;
1037 realHeight = pExynosPort->portDefinition.format.video.nFrameHeight;
1038 width = ((realWidth + 15) & (~15));
1039 height = ((realHeight + 15) & (~15));
1040 size = (width * height * 3) / 2;
1041 pExynosPort->portDefinition.format.video.nStride = width;
1042 pExynosPort->portDefinition.format.video.nSliceHeight = height;
1043 pExynosPort->portDefinition.nBufferSize = (size > pExynosPort->portDefinition.nBufferSize) ? size : pExynosPort->portDefinition.nBufferSize;
1045 if (portIndex == INPUT_PORT_INDEX) {
1046 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1047 pExynosOutputPort->portDefinition.format.video.nFrameWidth = pExynosPort->portDefinition.format.video.nFrameWidth;
1048 pExynosOutputPort->portDefinition.format.video.nFrameHeight = pExynosPort->portDefinition.format.video.nFrameHeight;
1049 pExynosOutputPort->portDefinition.format.video.nStride = width;
1050 pExynosOutputPort->portDefinition.format.video.nSliceHeight = height;
1052 switch (pExynosOutputPort->portDefinition.format.video.eColorFormat) {
1053 case OMX_COLOR_FormatYUV420Planar:
1054 case OMX_COLOR_FormatYUV420SemiPlanar:
1055 // case OMX_SEC_COLOR_FormatNV12TPhysicalAddress:
1056 //case OMX_SEC_COLOR_FormatANBYUV420SemiPlanar:
1057 pExynosOutputPort->portDefinition.nBufferSize = (width * height * 3) / 2;
1059 case OMX_SEC_COLOR_FormatNV12Tiled:
1060 pExynosOutputPort->portDefinition.nBufferSize =
1061 calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) +
1062 calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1);
1065 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Color format is not support!! use default YUV size!!");
1066 ret = OMX_ErrorUnsupportedSetting;
1070 if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
1071 pExynosOutputPort->portDefinition.nBufferSize =
1072 calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) +
1073 calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1);
1078 case OMX_IndexParamVideoProfileLevelCurrent:
1080 OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
1081 OMX_VIDEO_PARAM_MPEG2TYPE *pDstMpeg2Component = NULL;
1082 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
1084 ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
1085 if (ret != OMX_ErrorNone)
1088 if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) {
1089 ret = OMX_ErrorBadPortIndex;
1093 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1095 pDstMpeg2Component = &pMpeg2Dec->Mpeg2Component[pSrcProfileLevel->nPortIndex];
1096 pDstMpeg2Component->eProfile = pSrcProfileLevel->eProfile;
1097 pDstMpeg2Component->eLevel = pSrcProfileLevel->eLevel;
1100 case OMX_IndexParamVideoErrorCorrection:
1102 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
1103 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
1104 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
1106 ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
1107 if (ret != OMX_ErrorNone) {
1111 if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
1112 ret = OMX_ErrorBadPortIndex;
1116 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1117 pDstErrorCorrectionType = &pMpeg2Dec->errorCorrectionType[INPUT_PORT_INDEX];
1119 pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
1120 pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
1121 pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
1122 pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
1123 pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
1127 ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
1136 OMX_ERRORTYPE Exynos_Mpeg2Dec_GetConfig(
1137 OMX_HANDLETYPE hComponent,
1138 OMX_INDEXTYPE nIndex,
1139 OMX_PTR pComponentConfigStructure)
1141 OMX_ERRORTYPE ret = OMX_ErrorNone;
1142 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1143 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1147 if (hComponent == NULL) {
1148 ret = OMX_ErrorBadParameter;
1151 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1152 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1153 if (ret != OMX_ErrorNone) {
1156 if (pOMXComponent->pComponentPrivate == NULL) {
1157 ret = OMX_ErrorBadParameter;
1160 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1161 if (pExynosComponent->currentState == OMX_StateInvalid) {
1162 ret = OMX_ErrorInvalidState;
1168 ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
1178 OMX_ERRORTYPE Exynos_Mpeg2Dec_SetConfig(
1179 OMX_HANDLETYPE hComponent,
1180 OMX_INDEXTYPE nIndex,
1181 OMX_PTR pComponentConfigStructure)
1183 OMX_ERRORTYPE ret = OMX_ErrorNone;
1184 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1185 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1189 if (hComponent == NULL) {
1190 ret = OMX_ErrorBadParameter;
1193 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1194 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1195 if (ret != OMX_ErrorNone) {
1198 if (pOMXComponent->pComponentPrivate == NULL) {
1199 ret = OMX_ErrorBadParameter;
1202 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1203 if (pExynosComponent->currentState == OMX_StateInvalid) {
1204 ret = OMX_ErrorInvalidState;
1210 ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
1220 OMX_ERRORTYPE Exynos_Mpeg2Dec_GetExtensionIndex(
1221 OMX_IN OMX_HANDLETYPE hComponent,
1222 OMX_IN OMX_STRING cParameterName,
1223 OMX_OUT OMX_INDEXTYPE *pIndexType)
1225 OMX_ERRORTYPE ret = OMX_ErrorNone;
1226 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1227 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1231 if (hComponent == NULL) {
1232 ret = OMX_ErrorBadParameter;
1235 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1236 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1237 if (ret != OMX_ErrorNone) {
1240 if (pOMXComponent->pComponentPrivate == NULL) {
1241 ret = OMX_ErrorBadParameter;
1244 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1245 if ((cParameterName == NULL) || (pIndexType == NULL)) {
1246 ret = OMX_ErrorBadParameter;
1249 if (pExynosComponent->currentState == OMX_StateInvalid) {
1250 ret = OMX_ErrorInvalidState;
1254 if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) {
1255 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1256 *pIndexType = OMX_IndexVendorThumbnailMode;
1257 ret = OMX_ErrorNone;
1259 ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
1268 OMX_ERRORTYPE Exynos_Mpeg2Dec_ComponentRoleEnum(
1269 OMX_HANDLETYPE hComponent,
1273 OMX_ERRORTYPE ret = OMX_ErrorNone;
1274 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1275 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1279 if ((hComponent == NULL) || (cRole == NULL)) {
1280 ret = OMX_ErrorBadParameter;
1283 if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) {
1284 Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MPEG2_DEC_ROLE);
1285 ret = OMX_ErrorNone;
1287 ret = OMX_ErrorNoMore;
1297 OMX_ERRORTYPE Exynos_Mpeg2Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
1299 OMX_ERRORTYPE ret = OMX_ErrorNone;
1300 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1301 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1302 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1303 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1304 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)pVideoDec->hCodecHandle;
1305 OMX_PTR hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
1307 ExynosVideoDecOps *pDecOps = NULL;
1308 ExynosVideoDecBufferOps *pInbufOps = NULL;
1309 ExynosVideoDecBufferOps *pOutbufOps = NULL;
1311 CSC_METHOD csc_method = CSC_METHOD_SW;
1316 pMpeg2Dec->hMFCMpeg2Handle.bConfiguredMFCSrc = OMX_FALSE;
1317 pMpeg2Dec->hMFCMpeg2Handle.bConfiguredMFCDst = OMX_FALSE;
1318 pExynosComponent->bUseFlagEOF = OMX_TRUE;
1319 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
1321 /* Mpeg2 Codec Open */
1322 ret = Mpeg2CodecOpen(pMpeg2Dec);
1323 if (ret != OMX_ErrorNone) {
1327 pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
1328 pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
1329 pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
1331 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1332 Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
1333 Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
1335 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1336 pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
1337 Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
1338 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
1340 for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1341 /* Use ION Allocator */
1342 pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
1343 pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1344 pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE;
1345 pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
1346 if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) {
1347 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
1348 ret = OMX_ErrorInsufficientResources;
1351 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1354 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
1356 } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
1360 /* Does not require any actions. */
1363 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1364 Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
1365 Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
1366 } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
1370 /* Does not require any actions. */
1373 pMpeg2Dec->bSourceStart = OMX_FALSE;
1374 Exynos_OSAL_SignalCreate(&pMpeg2Dec->hSourceStartEvent);
1375 pMpeg2Dec->bDestinationStart = OMX_FALSE;
1376 Exynos_OSAL_SignalCreate(&pMpeg2Dec->hDestinationStartEvent);
1378 Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
1379 Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
1380 pMpeg2Dec->hMFCMpeg2Handle.indexTimestamp = 0;
1381 pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp = 0;
1383 pExynosComponent->getAllDelayBuffer = OMX_FALSE;
1385 #if 0//defined(USE_CSC_GSCALER)
1386 csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
1388 pVideoDec->csc_handle = csc_init(csc_method);
1389 if (pVideoDec->csc_handle == NULL) {
1390 ret = OMX_ErrorInsufficientResources;
1393 pVideoDec->csc_set_format = OMX_FALSE;
1402 OMX_ERRORTYPE Exynos_Mpeg2Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
1404 OMX_ERRORTYPE ret = OMX_ErrorNone;
1405 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1406 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1407 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1408 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1409 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1410 OMX_PTR hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
1412 ExynosVideoDecOps *pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
1413 ExynosVideoDecBufferOps *pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
1414 ExynosVideoDecBufferOps *pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
1420 if (pVideoDec->csc_handle != NULL) {
1421 csc_deinit(pVideoDec->csc_handle);
1422 pVideoDec->csc_handle = NULL;
1425 Exynos_OSAL_SignalTerminate(pMpeg2Dec->hDestinationStartEvent);
1426 pMpeg2Dec->hDestinationStartEvent = NULL;
1427 pMpeg2Dec->bDestinationStart = OMX_FALSE;
1428 Exynos_OSAL_SignalTerminate(pMpeg2Dec->hSourceStartEvent);
1429 pMpeg2Dec->hSourceStartEvent = NULL;
1430 pMpeg2Dec->bSourceStart = OMX_FALSE;
1432 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1433 for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
1434 if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
1435 #ifndef SLP_PLATFORM /* do not use ion */
1436 for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1437 if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL)
1438 Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
1441 Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
1442 pVideoDec->pMFCDecOutputBuffer[i] = NULL;
1446 Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
1447 Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
1448 } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
1452 /* Does not require any actions. */
1455 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1456 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1457 if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
1458 #ifndef SLP_PLATFORM /* do not use ion */
1459 for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1460 if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL)
1461 Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1464 Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
1465 pVideoDec->pMFCDecInputBuffer[i] = NULL;
1469 Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
1470 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
1471 } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
1475 /* Does not require any actions. */
1477 Mpeg2CodecClose(pMpeg2Dec);
1485 OMX_ERRORTYPE Exynos_Mpeg2Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
1487 OMX_ERRORTYPE ret = OMX_ErrorNone;
1488 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1489 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1490 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1491 void *hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
1492 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1493 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1494 OMX_U32 oneFrameSize = pSrcInputData->dataLen;
1495 ExynosVideoDecOps *pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
1496 ExynosVideoDecBufferOps *pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
1497 ExynosVideoDecBufferOps *pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
1498 ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
1503 if (pMpeg2Dec->hMFCMpeg2Handle.bConfiguredMFCSrc == OMX_FALSE) {
1504 ret = Mpeg2CodecSrcSetup(pOMXComponent, pSrcInputData);
1507 if (pMpeg2Dec->hMFCMpeg2Handle.bConfiguredMFCDst == OMX_FALSE) {
1508 ret = Mpeg2CodecDstSetup(pOMXComponent);
1511 if ((Check_Mpeg2_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize) == OMX_TRUE) ||
1512 ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)){
1513 pExynosComponent->timeStamp[pMpeg2Dec->hMFCMpeg2Handle.indexTimestamp] = pSrcInputData->timeStamp;
1514 pExynosComponent->nFlags[pMpeg2Dec->hMFCMpeg2Handle.indexTimestamp] = pSrcInputData->nFlags;
1515 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);
1516 pDecOps->Set_FrameTag(hMFCHandle, pMpeg2Dec->hMFCMpeg2Handle.indexTimestamp);
1517 pMpeg2Dec->hMFCMpeg2Handle.indexTimestamp++;
1518 pMpeg2Dec->hMFCMpeg2Handle.indexTimestamp %= MAX_TIMESTAMP;
1520 /* queue work for input buffer */
1521 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer);
1522 codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
1523 (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
1524 if (codecReturn != VIDEO_ERROR_NONE) {
1525 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
1526 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
1529 Mpeg2CodecStart(pOMXComponent, INPUT_PORT_INDEX);
1530 if (pMpeg2Dec->bSourceStart == OMX_FALSE) {
1531 pMpeg2Dec->bSourceStart = OMX_TRUE;
1532 Exynos_OSAL_SignalSet(pMpeg2Dec->hSourceStartEvent);
1533 Exynos_OSAL_SleepMillisec(0);
1535 if (pMpeg2Dec->bDestinationStart == OMX_FALSE) {
1536 pMpeg2Dec->bDestinationStart = OMX_TRUE;
1537 Exynos_OSAL_SignalSet(pMpeg2Dec->hDestinationStartEvent);
1538 Exynos_OSAL_SleepMillisec(0);
1542 ret = OMX_ErrorNone;
1550 OMX_ERRORTYPE Exynos_Mpeg2Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
1552 OMX_ERRORTYPE ret = OMX_ErrorNone;
1553 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1554 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1555 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1556 void *hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
1557 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1558 ExynosVideoDecOps *pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
1559 ExynosVideoDecBufferOps *pInbufOps = pMpeg2Dec->hMFCMpeg2Handle.pInbufOps;
1560 ExynosVideoBuffer *pVideoBuffer;
1564 pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
1566 pSrcOutputData->dataLen = 0;
1567 pSrcOutputData->usedDataLen = 0;
1568 pSrcOutputData->remainDataLen = 0;
1569 pSrcOutputData->nFlags = 0;
1570 pSrcOutputData->timeStamp = 0;
1572 if (pVideoBuffer == NULL) {
1573 pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
1574 pSrcOutputData->allocSize = 0;
1575 pSrcOutputData->pPrivate = NULL;
1576 pSrcOutputData->bufferHeader = NULL;
1578 pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
1579 pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
1580 pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize;
1582 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1584 while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
1585 if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
1586 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
1587 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
1592 pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
1593 pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
1596 /* For Share Buffer */
1597 pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
1600 ret = OMX_ErrorNone;
1608 OMX_ERRORTYPE Exynos_Mpeg2Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
1610 OMX_ERRORTYPE ret = OMX_ErrorNone;
1611 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1612 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1613 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1614 void *hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
1615 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1616 ExynosVideoDecOps *pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
1617 ExynosVideoDecBufferOps *pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
1618 OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
1619 ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
1623 if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
1624 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
1625 ret = OMX_ErrorBadParameter;
1629 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__,
1630 pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
1631 pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]);
1633 codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
1634 (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
1636 if (codecReturn != VIDEO_ERROR_NONE) {
1637 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
1638 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
1641 Mpeg2CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
1643 ret = OMX_ErrorNone;
1651 OMX_ERRORTYPE Exynos_Mpeg2Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
1653 OMX_ERRORTYPE ret = OMX_ErrorNone;
1654 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1655 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1656 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1657 void *hMFCHandle = pMpeg2Dec->hMFCMpeg2Handle.hMFCHandle;
1658 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1659 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1660 ExynosVideoDecOps *pDecOps = pMpeg2Dec->hMFCMpeg2Handle.pDecOps;
1661 ExynosVideoDecBufferOps *pOutbufOps = pMpeg2Dec->hMFCMpeg2Handle.pOutbufOps;
1662 ExynosVideoBuffer *pVideoBuffer;
1663 ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
1664 ExynosVideoGeometry *bufferGeometry;
1665 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
1666 OMX_S32 indexTimestamp = 0;
1671 if (pMpeg2Dec->bDestinationStart == OMX_FALSE) {
1672 ret = OMX_ErrorNone;
1677 if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
1678 ret = OMX_ErrorNone;
1681 displayStatus = pVideoBuffer->displayStatus;
1682 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
1684 if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
1685 (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
1686 (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
1687 (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
1688 if (pVideoBuffer != NULL) {
1689 ret = OMX_ErrorNone;
1692 ret = OMX_ErrorUndefined;
1698 if (ret != OMX_ErrorNone)
1701 pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp++;
1702 pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
1704 pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
1705 for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1706 pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
1707 pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
1708 pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
1709 pDstOutputData->dataLen += pVideoBuffer->planes[plane].dataSize;
1711 pDstOutputData->usedDataLen = 0;
1712 pDstOutputData->pPrivate = pVideoBuffer;
1713 /* For Share Buffer */
1714 pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
1716 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
1717 bufferGeometry = &pMpeg2Dec->hMFCMpeg2Handle.codecOutbufConf;
1718 pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
1719 pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
1720 switch (bufferGeometry->eColorFormat) {
1721 case VIDEO_COLORFORMAT_NV12:
1722 pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
1724 case VIDEO_COLORFORMAT_NV12_TILED:
1726 pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
1730 indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
1731 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
1732 if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
1733 if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) &&
1734 (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) {
1735 pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp];
1736 pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp];
1737 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
1739 pDstOutputData->timeStamp = 0x00;
1740 pDstOutputData->nFlags = 0x00;
1743 /* For timestamp correction. if mfc support frametype detect */
1744 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
1745 //#ifdef NEED_TIMESTAMP_REORDER
1747 if (pVideoDec->bNeedTimestampReorder == OMX_TRUE) {
1748 if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
1749 pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
1750 pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
1751 pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp = indexTimestamp;
1753 pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp];
1754 pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg2Dec->hMFCMpeg2Handle.outputIndexTimestamp];
1758 pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
1759 pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
1762 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData->timeStamp, pDstOutputData->timeStamp / 1E6, indexTimestamp, pDstOutputData->nFlags);
1765 if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
1766 ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
1767 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
1768 pDstOutputData->remainDataLen = 0;
1770 pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
1773 ret = OMX_ErrorNone;
1781 OMX_ERRORTYPE Exynos_Mpeg2Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
1783 OMX_ERRORTYPE ret = OMX_ErrorNone;
1784 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1785 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1786 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1790 if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
1791 ret = OMX_ErrorNone;
1794 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
1795 ret = OMX_ErrorNone;
1799 ret = Exynos_Mpeg2Dec_SrcIn(pOMXComponent, pSrcInputData);
1800 if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) {
1801 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
1802 pExynosComponent->callbackData,
1803 OMX_EventError, ret, 0, NULL);
1812 OMX_ERRORTYPE Exynos_Mpeg2Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
1814 OMX_ERRORTYPE ret = OMX_ErrorNone;
1815 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1816 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1817 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1821 if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
1822 ret = OMX_ErrorNone;
1826 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1827 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
1828 ret = OMX_ErrorNone;
1832 if ((pMpeg2Dec->bSourceStart == OMX_FALSE) &&
1833 (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
1834 Exynos_OSAL_SignalWait(pMpeg2Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME);
1835 Exynos_OSAL_SignalReset(pMpeg2Dec->hSourceStartEvent);
1838 ret = Exynos_Mpeg2Dec_SrcOut(pOMXComponent, pSrcOutputData);
1839 if ((ret != OMX_ErrorNone) &&
1840 (pExynosComponent->currentState == OMX_StateExecuting)) {
1841 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
1842 pExynosComponent->callbackData,
1843 OMX_EventError, ret, 0, NULL);
1852 OMX_ERRORTYPE Exynos_Mpeg2Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
1854 OMX_ERRORTYPE ret = OMX_ErrorNone;
1855 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1856 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1857 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1861 if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
1862 ret = OMX_ErrorNone;
1865 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
1866 ret = OMX_ErrorNone;
1869 if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
1870 if ((pMpeg2Dec->bDestinationStart == OMX_FALSE) &&
1871 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
1872 Exynos_OSAL_SignalWait(pMpeg2Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
1873 Exynos_OSAL_SignalReset(pMpeg2Dec->hDestinationStartEvent);
1876 if (pMpeg2Dec->hMFCMpeg2Handle.bConfiguredMFCDst == OMX_TRUE) {
1877 ret = Exynos_Mpeg2Dec_DstIn(pOMXComponent, pDstInputData);
1878 if (ret != OMX_ErrorNone) {
1879 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
1880 pExynosComponent->callbackData,
1881 OMX_EventError, ret, 0, NULL);
1891 OMX_ERRORTYPE Exynos_Mpeg2Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
1893 OMX_ERRORTYPE ret = OMX_ErrorNone;
1894 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1895 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1896 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1900 if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
1901 ret = OMX_ErrorNone;
1904 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
1905 ret = OMX_ErrorNone;
1909 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1910 if ((pMpeg2Dec->bDestinationStart == OMX_FALSE) &&
1911 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
1912 Exynos_OSAL_SignalWait(pMpeg2Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
1913 Exynos_OSAL_SignalReset(pMpeg2Dec->hDestinationStartEvent);
1916 ret = Exynos_Mpeg2Dec_DstOut(pOMXComponent, pDstOutputData);
1917 if ((ret != OMX_ErrorNone) &&
1918 (pExynosComponent->currentState == OMX_StateExecuting)) {
1919 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
1920 pExynosComponent->callbackData,
1921 OMX_EventError, ret, 0, NULL);
1930 OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(
1931 OMX_HANDLETYPE hComponent,
1932 OMX_STRING componentName)
1934 OMX_ERRORTYPE ret = OMX_ErrorNone;
1935 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1936 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1937 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1938 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
1939 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
1944 if ((hComponent == NULL) || (componentName == NULL)) {
1945 ret = OMX_ErrorBadParameter;
1946 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
1949 if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MPEG2_DEC, componentName) != 0) {
1950 ret = OMX_ErrorBadParameter;
1951 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
1955 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1956 ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent);
1957 if (ret != OMX_ErrorNone) {
1958 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1961 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1962 pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
1964 pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
1965 if (pExynosComponent->componentName == NULL) {
1966 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
1967 ret = OMX_ErrorInsufficientResources;
1968 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
1971 Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
1973 pMpeg2Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_MPEG2DEC_HANDLE));
1974 if (pMpeg2Dec == NULL) {
1975 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
1976 ret = OMX_ErrorInsufficientResources;
1977 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
1980 Exynos_OSAL_Memset(pMpeg2Dec, 0, sizeof(EXYNOS_MPEG2DEC_HANDLE));
1981 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1982 pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pMpeg2Dec;
1984 Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MPEG2_DEC);
1986 /* Set componentVersion */
1987 pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
1988 pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
1989 pExynosComponent->componentVersion.s.nRevision = REVISION_NUMBER;
1990 pExynosComponent->componentVersion.s.nStep = STEP_NUMBER;
1991 /* Set specVersion */
1992 pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
1993 pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
1994 pExynosComponent->specVersion.s.nRevision = REVISION_NUMBER;
1995 pExynosComponent->specVersion.s.nStep = STEP_NUMBER;
1998 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1999 pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
2000 pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
2001 pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
2002 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
2003 pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
2004 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG2;
2005 Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2006 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/mpeg2");
2007 pExynosPort->portDefinition.format.video.pNativeRender = 0;
2008 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
2009 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
2010 pExynosPort->portDefinition.bEnabled = OMX_TRUE;
2011 //pExynosPort->bufferProcessType = BUFFER_SHARE;
2012 pExynosPort->bufferProcessType = BUFFER_COPY;
2013 pExynosPort->portWayType = WAY2_PORT;
2016 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2017 pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
2018 pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
2019 pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
2020 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
2021 pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
2022 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
2023 Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2024 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
2025 pExynosPort->portDefinition.format.video.pNativeRender = 0;
2026 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
2027 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
2028 pExynosPort->portDefinition.bEnabled = OMX_TRUE;
2030 pExynosPort->bufferProcessType = BUFFER_SHARE;
2032 pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_PBSHARE;
2034 pExynosPort->portWayType = WAY2_PORT;
2036 for(i = 0; i < ALL_PORT_NUM; i++) {
2037 INIT_SET_SIZE_VERSION(&pMpeg2Dec->Mpeg2Component[i], OMX_VIDEO_PARAM_MPEG2TYPE);
2038 pMpeg2Dec->Mpeg2Component[i].nPortIndex = i;
2039 pMpeg2Dec->Mpeg2Component[i].eProfile = OMX_VIDEO_MPEG2ProfileMain;
2040 pMpeg2Dec->Mpeg2Component[i].eLevel = OMX_VIDEO_MPEG2LevelML; /* Check again**** */
2043 pOMXComponent->GetParameter = &Exynos_Mpeg2Dec_GetParameter;
2044 pOMXComponent->SetParameter = &Exynos_Mpeg2Dec_SetParameter;
2045 pOMXComponent->GetConfig = &Exynos_Mpeg2Dec_GetConfig;
2046 pOMXComponent->SetConfig = &Exynos_Mpeg2Dec_SetConfig;
2047 pOMXComponent->GetExtensionIndex = &Exynos_Mpeg2Dec_GetExtensionIndex;
2048 pOMXComponent->ComponentRoleEnum = &Exynos_Mpeg2Dec_ComponentRoleEnum;
2049 pOMXComponent->ComponentDeInit = &Exynos_OMX_ComponentDeinit;
2051 pExynosComponent->exynos_codec_componentInit = &Exynos_Mpeg2Dec_Init;
2052 pExynosComponent->exynos_codec_componentTerminate = &Exynos_Mpeg2Dec_Terminate;
2054 pVideoDec->exynos_codec_srcInputProcess = &Exynos_Mpeg2Dec_srcInputBufferProcess;
2055 pVideoDec->exynos_codec_srcOutputProcess = &Exynos_Mpeg2Dec_srcOutputBufferProcess;
2056 pVideoDec->exynos_codec_dstInputProcess = &Exynos_Mpeg2Dec_dstInputBufferProcess;
2057 pVideoDec->exynos_codec_dstOutputProcess = &Exynos_Mpeg2Dec_dstOutputBufferProcess;
2059 pVideoDec->exynos_codec_start = &Mpeg2CodecStart;
2060 pVideoDec->exynos_codec_stop = &Mpeg2CodecStop;
2061 pVideoDec->exynos_codec_bufferProcessRun = &Mpeg2CodecOutputBufferProcessRun;
2062 pVideoDec->exynos_codec_enqueueAllBuffer = &Mpeg2CodecEnQueueAllBuffer;
2064 pVideoDec->exynos_checkInputFrame = &Check_Mpeg2_Frame;
2065 pVideoDec->exynos_codec_getCodecInputPrivateData = &GetCodecInputPrivateData;
2066 pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
2068 #ifndef SLP_PLATFORM /* do not use ion */
2069 pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
2070 if (pVideoDec->hSharedMemory == NULL) {
2071 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
2072 Exynos_OSAL_Free(pMpeg2Dec);
2073 pMpeg2Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
2074 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2075 ret = OMX_ErrorInsufficientResources;
2079 pExynosComponent->currentState = OMX_StateLoaded;
2081 ret = OMX_ErrorNone;
2089 OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(
2090 OMX_HANDLETYPE hComponent)
2092 OMX_ERRORTYPE ret = OMX_ErrorNone;
2093 OMX_COMPONENTTYPE *pOMXComponent = NULL;
2094 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
2095 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
2096 EXYNOS_MPEG2DEC_HANDLE *pMpeg2Dec = NULL;
2100 if (hComponent == NULL) {
2101 ret = OMX_ErrorBadParameter;
2104 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
2105 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2106 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
2107 #ifndef SLP_PLATFORM /* do not use ion */
2108 Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
2110 Exynos_OSAL_Free(pExynosComponent->componentName);
2111 pExynosComponent->componentName = NULL;
2113 pMpeg2Dec = (EXYNOS_MPEG2DEC_HANDLE *)pVideoDec->hCodecHandle;
2114 if (pMpeg2Dec != NULL) {
2115 Exynos_OSAL_Free(pMpeg2Dec);
2116 pMpeg2Dec = pVideoDec->hCodecHandle = NULL;
2119 ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2120 if (ret != OMX_ErrorNone) {
2124 ret = OMX_ErrorNone;