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_Wmvdec.c
21 * @author HyeYeon Chung (hyeon.chung@samsung.com)
22 * @author Satish Kumar Reddy (palli.satish@samsung.com)
26 * : Support WMV3 (Vc-1 Simple/Main Profile)
27 * : Support WMvC1 (Vc-1 Advanced Profile)
35 #include "Exynos_OMX_Macros.h"
36 #include "Exynos_OMX_Basecomponent.h"
37 #include "Exynos_OMX_Baseport.h"
38 #include "Exynos_OMX_Vdec.h"
39 #include "Exynos_OSAL_ETC.h"
40 #include "Exynos_OSAL_Semaphore.h"
41 #include "Exynos_OSAL_Thread.h"
42 #include "library_register.h"
43 #include "Exynos_OMX_Wmvdec.h"
44 #include "ExynosVideoApi.h"
45 #include "Exynos_OSAL_SharedMemory.h"
46 #include "Exynos_OSAL_Event.h"
49 #include "Exynos_OSAL_Platform_Specific.h"
52 /* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
53 /* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
57 #define EXYNOS_LOG_TAG "EXYNOS_WMV_DEC"
58 #define EXYNOS_LOG_OFF
59 //#define EXYNOS_TRACE_ON
60 #include "Exynos_OSAL_Log.h"
62 #define WMV_DEC_NUM_OF_EXTRA_BUFFERS 7
64 //#define FULL_FRAME_SEARCH
66 /* ASF parser does not send start code on Stagefright */
68 /* Enable or disable "WMV3_ADDITIONAL_START_CODE" based on MFC F/W's need */
69 //#define WMV3_ADDITIONAL_START_CODE
71 const OMX_U32 wmv3 = 0x33564d57;
72 const OMX_U32 wvc1 = 0x31435657;
73 const OMX_U32 wmva = 0x41564d57;
76 static OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, void *pVirtAddr, OMX_U32 *dataSize)
78 OMX_ERRORTYPE ret = OMX_ErrorNone;
84 static OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, void *addr[], int size[])
86 OMX_ERRORTYPE ret = OMX_ErrorNone;
87 ExynosVideoBuffer *pCodecBuffer;
89 if (codecBuffer == NULL) {
90 ret = OMX_ErrorBadParameter;
94 pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
97 addr[0] = pCodecBuffer->planes[0].addr;
98 addr[1] = pCodecBuffer->planes[1].addr;
99 addr[2] = pCodecBuffer->planes[2].addr;
103 size[0] = pCodecBuffer->planes[0].allocSize;
104 size[1] = pCodecBuffer->planes[1].allocSize;
105 size[2] = pCodecBuffer->planes[2].allocSize;
112 #ifndef TIZEN_FEATURE_E3250
114 OMX_U8 *pInputStream,
117 OMX_BOOL bPreviousFrameEOF,
118 OMX_BOOL *pbEndOfFrame)
120 OMX_U32 compressionID;
121 OMX_BOOL bFrameStart;
122 OMX_U32 len, readStream;
124 WMV_FORMAT gWvmFormat = WMV_FORMAT_UNKNOWN;
126 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "buffSize = %d", buffSize);
129 bFrameStart = OMX_FALSE;
131 if (flag & OMX_BUFFERFLAG_CODECCONFIG) {
132 BitmapInfoHhr *pBitmapInfoHeader;
133 pBitmapInfoHeader = (BitmapInfoHhr *)pInputStream;
135 compressionID = pBitmapInfoHeader->BiCompression;
136 if (compressionID == wmv3) {
137 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "WMV_FORMAT_WMV3");
138 gWvmFormat = WMV_FORMAT_WMV3;
140 *pbEndOfFrame = OMX_TRUE;
143 else if ((compressionID == wvc1) || (compressionID == wmva)) {
144 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "WMV_FORMAT_VC1");
145 gWvmFormat = WMV_FORMAT_VC1;
148 /* ASF parser does not send start code on Stagefright */
149 *pbEndOfFrame = OMX_TRUE;
155 if (gWvmFormat == WMV_FORMAT_WMV3) {
156 *pbEndOfFrame = OMX_TRUE;
161 /* ASF parser does not send start code on Stagefright */
162 if (gWvmFormat == WMV_FORMAT_VC1) {
163 *pbEndOfFrame = OMX_TRUE;
167 /* TODO : for comformanc test based on common buffer scheme w/o parser */
169 if (bPreviousFrameEOF == OMX_FALSE)
170 bFrameStart = OMX_TRUE;
172 startCode = 0xFFFFFFFF;
173 if (bFrameStart == OMX_FALSE) {
174 /* find Frame start code */
175 while(startCode != 0x10D) {
176 readStream = *(pInputStream + len);
177 startCode = (startCode << 8) | readStream;
184 /* find next Frame start code */
185 startCode = 0xFFFFFFFF;
186 while ((startCode != 0x10D)) {
187 readStream = *(pInputStream + len);
188 startCode = (startCode << 8) | readStream;
194 *pbEndOfFrame = OMX_TRUE;
196 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "1. Check_Wmv_Frame returned EOF = %d, len = %d, buffSize = %d", *pbEndOfFrame, len - 4, buffSize);
202 *pbEndOfFrame = OMX_FALSE;
204 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "2. Check_Wmv_Frame returned EOF = %d, len = %d, buffSize = %d", *pbEndOfFrame, len - 1, buffSize);
210 static OMX_BOOL Check_Stream_PrefixCode(
211 OMX_U8 *pInputStream,
213 WMV_FORMAT wmvFormat)
216 case WMV_FORMAT_WMV3:
217 #ifdef WMV3_ADDITIONAL_START_CODE
226 /* TODO : for comformanc test based on common buffer scheme w/o parser */
227 if (streamSize < 3) {
228 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: streamSize is too small (%d)", __FUNCTION__, streamSize);
230 } else if ((pInputStream[0] == 0x00) &&
231 (pInputStream[1] == 0x00) &&
232 (pInputStream[2] == 0x01)) {
235 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Cannot find prefix", __FUNCTION__);
241 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "%s: undefined wmvFormat (%d)", __FUNCTION__, wmvFormat);
247 static OMX_BOOL Make_Stream_MetaData(
248 OMX_U8 *pInputStream,
249 OMX_U32 *pStreamSize,
251 #ifdef TIZEN_FEATURE_E3250
252 , OMX_U32 width, OMX_U32 height
256 OMX_U8 *pCurrBuf = pInputStream;
258 #ifndef TIZEN_FEATURE_E3250
259 OMX_U32 width, height;
263 /* Sequence Layer Data Structure */
264 OMX_U8 const_C5[4] = {0x00, 0x00, 0x00, 0xc5};
265 OMX_U8 const_04[4] = {0x04, 0x00, 0x00, 0x00};
266 OMX_U8 const_0C[4] = {0x0C, 0x00, 0x00, 0x00};
267 OMX_U8 struct_B_1[4] = {0xB3, 0x19, 0x00, 0x00};
268 OMX_U8 struct_B_2[4] = {0x44, 0x62, 0x05, 0x00};
269 OMX_U8 struct_B_3[4] = {0x0F, 0x00, 0x00, 0x00};
270 OMX_U8 struct_C[4] = {0x30, 0x00, 0x00, 0x00};
273 case WMV_FORMAT_WMV3:
274 if (*pStreamSize >= BITMAPINFOHEADER_SIZE) {
275 #ifndef TIZEN_FEATURE_E3250
276 BitmapInfoHhr *pBitmapInfoHeader;
277 pBitmapInfoHeader = (BitmapInfoHhr *)pInputStream;
279 width = pBitmapInfoHeader->BiWidth;
280 height = pBitmapInfoHeader->BiHeight;
282 if (*pStreamSize > BITMAPINFOHEADER_SIZE)
283 Exynos_OSAL_Memcpy(struct_C, pInputStream+BITMAPINFOHEADER_SIZE, 4);
285 Exynos_OSAL_Memcpy(pCurrBuf + currPos, const_C5, 4);
288 Exynos_OSAL_Memcpy(pCurrBuf + currPos, const_04, 4);
291 Exynos_OSAL_Memcpy(pCurrBuf + currPos, struct_C, 4);
294 /* struct_A : VERT_SIZE */
295 pCurrBuf[currPos] = height & 0xFF;
296 pCurrBuf[currPos+1] = (height>>8) & 0xFF;
297 pCurrBuf[currPos+2] = (height>>16) & 0xFF;
298 pCurrBuf[currPos+3] = (height>>24) & 0xFF;
301 /* struct_A : HORIZ_SIZE */
302 pCurrBuf[currPos] = width & 0xFF;
303 pCurrBuf[currPos+1] = (width>>8) & 0xFF;
304 pCurrBuf[currPos+2] = (width>>16) & 0xFF;
305 pCurrBuf[currPos+3] = (width>>24) & 0xFF;
308 Exynos_OSAL_Memcpy(pCurrBuf + currPos,const_0C, 4);
311 Exynos_OSAL_Memcpy(pCurrBuf + currPos, struct_B_1, 4);
314 Exynos_OSAL_Memcpy(pCurrBuf + currPos, struct_B_2, 4);
317 Exynos_OSAL_Memcpy(pCurrBuf + currPos, struct_B_3, 4);
320 *pStreamSize = currPos;
323 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: *pStreamSize is too small to contain metadata(%d)", __FUNCTION__, *pStreamSize);
328 if (*pStreamSize >= BITMAPINFOHEADER_ASFBINDING_SIZE) {
329 Exynos_OSAL_Memcpy(pCurrBuf, pInputStream + BITMAPINFOHEADER_ASFBINDING_SIZE, *pStreamSize - BITMAPINFOHEADER_ASFBINDING_SIZE);
330 *pStreamSize -= BITMAPINFOHEADER_ASFBINDING_SIZE;
333 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: *pStreamSize is too small to contain metadata(%d)", __FUNCTION__, *pStreamSize);
338 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "%s: It is not necessary to make bitstream metadata for wmvFormat (%d)", __FUNCTION__, wmvFormat);
344 static OMX_BOOL Make_Stream_StartCode(
345 OMX_U8 *pInputStream,
346 OMX_U32 *pStreamSize,
347 WMV_FORMAT wmvFormat)
349 OMX_U8 frameStartCode[4] = {0x00, 0x00, 0x01, 0x0d};
350 #ifdef WMV3_ADDITIONAL_START_CODE
351 /* first 4 bytes : size of Frame, second 4 bytes : present Time stamp */
352 OMX_U8 frameStartCode2[8] = {0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};
357 case WMV_FORMAT_WMV3:
358 #ifdef WMV3_ADDITIONAL_START_CODE
359 Exynos_OSAL_Memmove(pInputStream+8, pInputStream, *pStreamSize);
360 Exynos_OSAL_Memcpy(pInputStream, frameStartCode2, 8);
367 /* Should find better way to shift data */
368 Exynos_OSAL_Memmove(pInputStream+4, pInputStream, *pStreamSize);
369 Exynos_OSAL_Memcpy(pInputStream, frameStartCode, 4);
375 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "%s: undefined wmvFormat (%d)", __FUNCTION__, wmvFormat);
381 OMX_ERRORTYPE Process_Wmv_CodecConfigData(OMX_COMPONENTTYPE *pOMXComponent, void *pConfig)
383 OMX_ERRORTYPE ret = OMX_ErrorNone;
384 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
385 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
386 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
387 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
388 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)pVideoDec->hCodecHandle;
389 OMX_PTR hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
390 #ifdef TIZEN_FEATURE_E3250
391 EXYNOS_OMX_DATABUFFER *pSrcInputData = (EXYNOS_OMX_DATA *)pConfig;
392 OMX_U8 *pInputStream = pSrcInputData->bufferHeader->pBuffer;
397 #ifdef TIZEN_FEATURE_E3250
398 if (pWmvDec->wmvFormat == WMV_FORMAT_UNKNOWN) {
399 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Process_Wmv_CodecConfigData. dataLen = %d", pSrcInputData->dataLen);
400 if (pSrcInputData->dataLen < 4) {
401 pWmvDec->wmvFormat = WMV_FORMAT_UNKNOWN;
402 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "WMV_FORMAT_UNKNOWN");
403 } else if ((pInputStream[1] == 0x00) &&
404 (pInputStream[2] == 0x00) &&
405 (pInputStream[3] == 0x01)) {
406 pWmvDec->wmvFormat = WMV_FORMAT_VC1;
407 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "WMV_FORMAT_VC1");
409 pWmvDec->wmvFormat = WMV_FORMAT_WMV3;
410 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "WMV_FORMAT_WMV3");
414 pWmvDec->hMFCWmvHandle.wmvFormat = pWmvDec->wmvFormat;
416 BitmapInfoHhr *pBitmapInfoHeader;
417 pBitmapInfoHeader = (BitmapInfoHhr *)pConfig;
418 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_BUFFERFLAG_CODECCONFIG");
419 if (pBitmapInfoHeader->BiCompression == wmv3) {
420 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "WMV_FORMAT_WMV3");
421 pWmvDec->hMFCWmvHandle.wmvFormat = WMV_FORMAT_WMV3;
422 } else if ((pBitmapInfoHeader->BiCompression == wvc1) || (pBitmapInfoHeader->BiCompression == wmva)) {
423 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "WMV_FORMAT_VC1");
424 pWmvDec->hMFCWmvHandle.wmvFormat = WMV_FORMAT_VC1;
426 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "WMV_FORMAT_UNKNOWN (0x%x), default value will be used", pBitmapInfoHeader->BiCompression);
429 ret = WmvCodecSrcInit(pOMXComponent);
430 if (ret != OMX_ErrorNone) {
431 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to WmvCodecSrcInit");
443 OMX_ERRORTYPE WmvCodecOpen(EXYNOS_WMVDEC_HANDLE *pWmvDec)
445 OMX_ERRORTYPE ret = OMX_ErrorNone;
446 ExynosVideoDecOps *pDecOps = NULL;
447 ExynosVideoDecBufferOps *pInbufOps = NULL;
448 ExynosVideoDecBufferOps *pOutbufOps = NULL;
449 enum v4l2_memory v4l2MemoryType = V4L2_MEMORY_USERPTR;
453 if (pWmvDec == NULL) {
454 ret = OMX_ErrorBadParameter;
455 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
459 /* alloc ops structure */
460 pDecOps = (ExynosVideoDecOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps));
461 pInbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
462 pOutbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
464 if ((pDecOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
465 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate decoder ops buffer");
466 ret = OMX_ErrorInsufficientResources;
470 pWmvDec->hMFCWmvHandle.pDecOps = pDecOps;
471 pWmvDec->hMFCWmvHandle.pInbufOps = pInbufOps;
472 pWmvDec->hMFCWmvHandle.pOutbufOps = pOutbufOps;
474 /* function pointer mapping */
475 pDecOps->nSize = sizeof(ExynosVideoDecOps);
476 pInbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
477 pOutbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
479 Exynos_Video_Register_Decoder(pDecOps, pInbufOps, pOutbufOps);
481 /* check mandatory functions for decoder ops */
482 if ((pDecOps->Init == NULL) || (pDecOps->Finalize == NULL) ||
483 (pDecOps->Get_ActualBufferCount == NULL) || (pDecOps->Set_FrameTag == NULL) ||
484 (pDecOps->Get_FrameTag == NULL)) {
485 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
486 ret = OMX_ErrorInsufficientResources;
490 /* check mandatory functions for buffer ops */
491 if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
492 (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
493 (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
494 (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
495 (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
496 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
497 ret = OMX_ErrorInsufficientResources;
502 if (pWmvDec->hMFCWmvHandle.bShareableBuf == OMX_TRUE) {
504 v4l2MemoryType = V4L2_MEMORY_DMABUF;
505 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "using Dec V4L2_MEMORY_DMABUF");
507 v4l2MemoryType = V4L2_MEMORY_USERPTR;
508 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "using Dec V4L2_MEMORY_USEPTR");
511 v4l2MemoryType = V4L2_MEMORY_DMABUF;
512 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "using Dec V4L2_MEMORY_DMABUF");
515 /* alloc context, open, querycap */
516 pWmvDec->hMFCWmvHandle.hMFCHandle = pWmvDec->hMFCWmvHandle.pDecOps->Init(v4l2MemoryType);
517 if (pWmvDec->hMFCWmvHandle.hMFCHandle == NULL) {
518 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
519 ret = OMX_ErrorInsufficientResources;
526 if (ret != OMX_ErrorNone) {
527 if (pDecOps != NULL) {
528 Exynos_OSAL_Free(pDecOps);
529 pWmvDec->hMFCWmvHandle.pDecOps = NULL;
531 if (pInbufOps != NULL) {
532 Exynos_OSAL_Free(pInbufOps);
533 pWmvDec->hMFCWmvHandle.pInbufOps = NULL;
535 if (pOutbufOps != NULL) {
536 Exynos_OSAL_Free(pOutbufOps);
537 pWmvDec->hMFCWmvHandle.pOutbufOps = NULL;
546 OMX_ERRORTYPE WmvCodecClose(EXYNOS_WMVDEC_HANDLE *pWmvDec)
548 OMX_ERRORTYPE ret = OMX_ErrorNone;
549 void *hMFCHandle = NULL;
550 ExynosVideoDecOps *pDecOps = NULL;
551 ExynosVideoDecBufferOps *pInbufOps = NULL;
552 ExynosVideoDecBufferOps *pOutbufOps = NULL;
556 if (pWmvDec == NULL) {
557 ret = OMX_ErrorBadParameter;
561 hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
562 pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
563 pInbufOps = pWmvDec->hMFCWmvHandle.pInbufOps;
564 pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
566 if (hMFCHandle != NULL) {
567 pDecOps->Finalize(hMFCHandle);
568 pWmvDec->hMFCWmvHandle.hMFCHandle = NULL;
570 if (pOutbufOps != NULL) {
571 Exynos_OSAL_Free(pOutbufOps);
572 pWmvDec->hMFCWmvHandle.pOutbufOps = NULL;
574 if (pInbufOps != NULL) {
575 Exynos_OSAL_Free(pInbufOps);
576 pWmvDec->hMFCWmvHandle.pInbufOps = NULL;
578 if (pDecOps != NULL) {
579 Exynos_OSAL_Free(pDecOps);
580 pWmvDec->hMFCWmvHandle.pDecOps = NULL;
591 OMX_ERRORTYPE WmvCodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
593 OMX_ERRORTYPE ret = OMX_ErrorNone;
594 void *hMFCHandle = NULL;
595 ExynosVideoDecOps *pDecOps = NULL;
596 ExynosVideoDecBufferOps *pInbufOps = NULL;
597 ExynosVideoDecBufferOps *pOutbufOps = NULL;
598 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
599 EXYNOS_WMVDEC_HANDLE *pWmvDec = NULL;
603 if (pOMXComponent == NULL) {
604 ret = OMX_ErrorBadParameter;
608 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
609 if (pVideoDec == NULL) {
610 ret = OMX_ErrorBadParameter;
614 pWmvDec = (EXYNOS_WMVDEC_HANDLE *)pVideoDec->hCodecHandle;
615 if (pWmvDec == NULL) {
616 ret = OMX_ErrorBadParameter;
620 hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
621 pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
622 pInbufOps = pWmvDec->hMFCWmvHandle.pInbufOps;
623 pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
625 if (nPortIndex == INPUT_PORT_INDEX)
626 pInbufOps->Run(hMFCHandle);
627 else if (nPortIndex == OUTPUT_PORT_INDEX)
628 pOutbufOps->Run(hMFCHandle);
638 OMX_ERRORTYPE WmvCodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
640 OMX_ERRORTYPE ret = OMX_ErrorNone;
641 void *hMFCHandle = NULL;
642 ExynosVideoDecOps *pDecOps = NULL;
643 ExynosVideoDecBufferOps *pInbufOps = NULL;
644 ExynosVideoDecBufferOps *pOutbufOps = NULL;
645 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
646 EXYNOS_WMVDEC_HANDLE *pWmvDec = NULL;
650 if (pOMXComponent == NULL) {
651 ret = OMX_ErrorBadParameter;
655 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
656 if (pVideoDec == NULL) {
657 ret = OMX_ErrorBadParameter;
660 pWmvDec = (EXYNOS_WMVDEC_HANDLE *)pVideoDec->hCodecHandle;
661 if (pWmvDec == NULL) {
662 ret = OMX_ErrorBadParameter;
666 hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
667 pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
668 pInbufOps = pWmvDec->hMFCWmvHandle.pInbufOps;
669 pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
671 if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
672 pInbufOps->Stop(hMFCHandle);
673 else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
674 pOutbufOps->Stop(hMFCHandle);
685 OMX_ERRORTYPE WmvCodecSrcInit(OMX_COMPONENTTYPE *pOMXComponent)
687 OMX_ERRORTYPE ret = OMX_ErrorNone;
688 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
689 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
690 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
691 void *hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
692 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
693 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
695 ExynosVideoDecOps *pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
696 ExynosVideoDecBufferOps *pInbufOps = pWmvDec->hMFCWmvHandle.pInbufOps;
697 ExynosVideoDecBufferOps *pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
698 ExynosVideoGeometry bufferConf;
699 OMX_U32 inputBufferNumber = 0;
704 if (pVideoDec->bThumbnailMode == OMX_TRUE)
705 pDecOps->Set_DisplayDelay(hMFCHandle, 0);
707 /* input buffer info */
708 Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
709 if (pWmvDec->hMFCWmvHandle.wmvFormat == WMV_FORMAT_WMV3) {
710 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "VIDEO_CODING_VC1_RCV");
711 bufferConf.eCompressionFormat = VIDEO_CODING_VC1_RCV;
712 } else if (pWmvDec->hMFCWmvHandle.wmvFormat == WMV_FORMAT_VC1) {
713 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "VIDEO_CODING_VC1");
714 bufferConf.eCompressionFormat = VIDEO_CODING_VC1;
716 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Unsupported WMV Codec Format Type");
717 ret = OMX_ErrorUndefined;
721 if (pExynosInputPort->bufferProcessType & BUFFER_SHARE
722 ||pWmvDec->hMFCWmvHandle.bShareableBuf == OMX_TRUE)
723 pInbufOps->Set_Shareable(hMFCHandle);
725 if (pExynosInputPort->bufferProcessType & BUFFER_SHARE) {
726 bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth
727 * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
728 inputBufferNumber = MAX_VIDEO_INPUTBUFFER_NUM;
729 } else if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
730 bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE;
731 inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
734 /* should be done before prepare input buffer */
735 if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
736 ret = OMX_ErrorInsufficientResources;
740 /* set input buffer geometry */
741 if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
742 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
743 ret = OMX_ErrorInsufficientResources;
747 /* setup input buffer */
748 if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
749 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
750 ret = OMX_ErrorInsufficientResources;
754 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) &&
755 pWmvDec->hMFCWmvHandle.bShareableBuf == OMX_TRUE) {
756 /* Register input buffer */
757 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
758 ExynosVideoPlane plane;
759 plane.addr = pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0];
760 plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize[0];
761 plane.fd = pVideoDec->pMFCDecInputBuffer[i]->fd[0];
762 if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
763 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
764 ret = OMX_ErrorInsufficientResources;
768 } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) &&
769 pWmvDec->hMFCWmvHandle.bShareableBuf == OMX_FALSE) {
770 ExynosVideoBuffer *pBuffer = NULL;
772 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
773 pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
774 Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
775 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "@pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
776 /* get input buffer info */
777 if (pInbufOps->Get_Buffer) {
778 if (pInbufOps->Get_Buffer(pWmvDec->hMFCWmvHandle.hMFCHandle, i, &pBuffer) != VIDEO_ERROR_NONE) {
779 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get input buffer info");
780 ret = OMX_ErrorInsufficientResources;
785 for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
786 /* Use ION Allocator */
787 pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)pBuffer->planes[plane].addr;
788 pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = pBuffer->planes[plane].fd;
789 pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = pBuffer->planes[plane].allocSize;
790 pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
791 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "@pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
794 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
796 } else if (pExynosInputPort->bufferProcessType & BUFFER_SHARE) {
797 /* Register input buffer */
798 for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
799 ExynosVideoPlane plane;
800 plane.addr = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
801 plane.allocSize = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen;
802 plane.fd = pExynosInputPort->extendBufferHeader[i].buf_fd[0];
803 if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
804 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
805 ret = OMX_ErrorInsufficientResources;
817 OMX_ERRORTYPE WmvCodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
819 OMX_ERRORTYPE ret = OMX_ErrorNone;
820 void *hMFCHandle = NULL;
821 ExynosVideoDecOps *pDecOps = NULL;
822 ExynosVideoDecBufferOps *pInbufOps = NULL;
823 ExynosVideoDecBufferOps *pOutbufOps = NULL;
824 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
825 EXYNOS_WMVDEC_HANDLE *pWmvDec = NULL;
829 if (pOMXComponent == NULL) {
830 ret = OMX_ErrorBadParameter;
834 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
835 if (pVideoDec == NULL) {
836 ret = OMX_ErrorBadParameter;
839 pWmvDec = (EXYNOS_WMVDEC_HANDLE *)pVideoDec->hCodecHandle;
840 if (pWmvDec == NULL) {
841 ret = OMX_ErrorBadParameter;
845 hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
846 pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
847 pInbufOps = pWmvDec->hMFCWmvHandle.pInbufOps;
848 pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
850 if (nPortIndex == INPUT_PORT_INDEX) {
851 if (pWmvDec->bSourceStart == OMX_FALSE) {
852 Exynos_OSAL_SignalSet(pWmvDec->hSourceStartEvent);
853 Exynos_OSAL_SleepMillisec(0);
857 if (nPortIndex == OUTPUT_PORT_INDEX) {
858 if (pWmvDec->bDestinationStart == OMX_FALSE) {
859 Exynos_OSAL_SignalSet(pWmvDec->hDestinationStartEvent);
860 Exynos_OSAL_SleepMillisec(0);
872 OMX_ERRORTYPE WmvCodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
874 OMX_ERRORTYPE ret = OMX_ErrorNone;
875 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
876 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
877 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
878 void *hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
879 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
880 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
883 ExynosVideoDecOps *pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
884 ExynosVideoDecBufferOps *pInbufOps = pWmvDec->hMFCWmvHandle.pInbufOps;
885 ExynosVideoDecBufferOps *pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
889 if ((nPortIndex != INPUT_PORT_INDEX) && (nPortIndex != OUTPUT_PORT_INDEX)) {
890 ret = OMX_ErrorBadPortIndex;
894 if ((nPortIndex == INPUT_PORT_INDEX) &&
895 (pWmvDec->bSourceStart == OMX_TRUE)) {
896 Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
898 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
899 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
900 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
902 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
905 pInbufOps->Clear_Queue(hMFCHandle);
906 } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
907 (pWmvDec->bDestinationStart == OMX_TRUE)) {
908 OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
909 ExynosVideoBuffer *pBuffer = NULL;
911 Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
913 nOutbufs = pDecOps->Get_ActualBufferCount(hMFCHandle);
914 nOutbufs += EXTRA_DPB_NUM;
915 for (i = 0; i < nOutbufs; i++) {
916 pOutbufOps->Get_Buffer(hMFCHandle, i, &pBuffer);
917 Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, (OMX_PTR)pBuffer);
919 pOutbufOps->Clear_Queue(hMFCHandle);
928 OMX_ERRORTYPE WmvCodecDstFreeCodecBuffers(
929 OMX_COMPONENTTYPE *pOMXComponent)
931 OMX_ERRORTYPE ret = OMX_ErrorNone;
932 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
933 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
934 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)pVideoDec->hCodecHandle;
940 for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
941 if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
942 for (j = 0; j < MFC_OUTPUT_BUFFER_PLANE; j++) {
943 if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[j] != NULL &&
944 pWmvDec->hMFCWmvHandle.bShareableBuf == OMX_TRUE)
945 Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[j]);
948 Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
952 Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer, 0, sizeof(pVideoDec->pMFCDecOutputBuffer));
956 return OMX_ErrorNone;
959 OMX_ERRORTYPE WmvCodecDstAllocCodecBuffers(
960 OMX_COMPONENTTYPE *pOMXComponent,
963 OMX_ERRORTYPE ret = OMX_ErrorNone;
964 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
965 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
966 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)pVideoDec->hCodecHandle;
968 MEMORY_TYPE eMemoryType = NORMAL_MEMORY;
969 OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
974 nAllocLen[0] = calc_yplane(pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameWidth,
975 pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameHeight);
976 nAllocLen[1] = calc_uvplane(pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameWidth,
977 pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameHeight >> 1);
979 for (i = 0; i < nOutbufs; i++) {
980 pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
981 if (pVideoDec->pMFCDecOutputBuffer[i] == NULL) {
982 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc codec buffer");
983 ret = OMX_ErrorInsufficientResources;
986 Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
988 for (j = 0; j < MFC_OUTPUT_BUFFER_PLANE; j++) {
989 pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[j] =
990 (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[j], eMemoryType);
991 if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[j] == NULL) {
992 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
993 ret = OMX_ErrorInsufficientResources;
997 pVideoDec->pMFCDecOutputBuffer[i]->fd[j] =
998 Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
999 pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[j]);
1000 pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[j] = nAllocLen[j];
1004 return OMX_ErrorNone;
1007 WmvCodecDstFreeCodecBuffers(pOMXComponent);
1014 OMX_ERRORTYPE WmvCodecDstRegistCodecBuffers(
1015 OMX_COMPONENTTYPE *pOMXComponent,
1018 OMX_ERRORTYPE ret = OMX_ErrorNone;
1019 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1020 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1021 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)pVideoDec->hCodecHandle;
1022 void *hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
1023 ExynosVideoDecBufferOps *pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
1025 ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
1026 OMX_U32 nDataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
1031 /* Register output buffer */
1032 for (i = 0; i < nOutbufs; i++) {
1033 for (j = 0; j < MFC_OUTPUT_BUFFER_PLANE; j++) {
1034 planes[j].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[j];
1035 planes[j].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[j];
1036 planes[j].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[j];
1039 if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
1040 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
1041 ret = OMX_ErrorInsufficientResources;
1045 pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
1046 (unsigned int *)nDataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
1049 ret = OMX_ErrorNone;
1057 OMX_ERRORTYPE WmvCodecResetupAllElement(
1058 OMX_COMPONENTTYPE *pOMXComponent,
1061 OMX_ERRORTYPE ret = OMX_ErrorNone;
1062 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1063 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1064 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)pVideoDec->hCodecHandle;
1065 void *hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
1066 EXYNOS_OMX_BASEPORT *pOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1067 ExynosVideoDecBufferOps *pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
1073 if ((nPortIndex == INPUT_PORT_INDEX) &&
1074 (pWmvDec->bSourceStart == OMX_TRUE)) {
1075 ret = OMX_ErrorNotImplemented;
1077 } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
1078 (pWmvDec->bDestinationStart == OMX_TRUE)) {
1079 if (pOutputPort->bufferProcessType & BUFFER_COPY) {
1081 /**********************************/
1082 /* Codec Buffer Free & Unregister */
1083 /**********************************/
1084 WmvCodecDstFreeCodecBuffers(pOMXComponent);
1085 Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
1087 if (pWmvDec->hMFCWmvHandle.bShareableBuf == OMX_TRUE)
1088 pOutbufOps->Clear_RegisteredBuffer(hMFCHandle);
1090 pOutbufOps->Cleanup(hMFCHandle);
1091 /******************************************************/
1092 /* V4L2 Destnation Setup for DPB Buffer Number Change */
1093 /******************************************************/
1094 WmvCodecDstSetup(pOMXComponent);
1096 pVideoDec->bDRCProcessing = OMX_FALSE;
1097 } else if (pOutputPort->bufferProcessType & BUFFER_SHARE) {
1099 /**********************************/
1100 /* Codec Buffer Unregister */
1101 /**********************************/
1102 pOutbufOps->Clear_RegisteredBuffer(hMFCHandle);
1103 pOutbufOps->Cleanup(hMFCHandle);
1106 ret = OMX_ErrorBadParameter;
1116 OMX_ERRORTYPE WmvCodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
1118 OMX_ERRORTYPE ret = OMX_ErrorNone;
1119 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1120 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1121 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1122 void *hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
1123 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1124 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1125 OMX_U32 oneFrameSize = pSrcInputData->dataLen;
1126 OMX_BOOL bMetaData = OMX_FALSE;
1128 ExynosVideoDecOps *pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
1129 ExynosVideoDecBufferOps *pInbufOps = pWmvDec->hMFCWmvHandle.pInbufOps;
1130 ExynosVideoDecBufferOps *pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
1131 ExynosVideoGeometry bufferConf;
1132 OMX_U32 inputBufferNumber = 0;
1137 if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
1138 OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
1139 OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
1140 if (OMXBuffer == NULL) {
1141 ret = OMX_ErrorUndefined;
1145 OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
1146 OMXBuffer->nFlags = pSrcInputData->nFlags;
1147 Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
1149 ret = OMX_ErrorNone;
1153 if (!((pExynosInputPort->bufferProcessType & BUFFER_COPY) &&
1154 pWmvDec->hMFCWmvHandle.bShareableBuf == OMX_FALSE)) {
1155 if (pSrcInputData->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
1156 BitmapInfoHhr *pBitmapInfoHeader;
1157 pBitmapInfoHeader = (BitmapInfoHhr *)pSrcInputData->buffer.singlePlaneBuffer.dataBuffer;
1158 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_BUFFERFLAG_CODECCONFIG");
1159 if (pBitmapInfoHeader->BiCompression == wmv3) {
1160 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "WMV_FORMAT_WMV3");
1161 pWmvDec->hMFCWmvHandle.wmvFormat = WMV_FORMAT_WMV3;
1162 } else if ((pBitmapInfoHeader->BiCompression == wvc1) || (pBitmapInfoHeader->BiCompression == wmva)) {
1163 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "WMV_FORMAT_VC1");
1164 pWmvDec->hMFCWmvHandle.wmvFormat = WMV_FORMAT_VC1;
1168 ret = WmvCodecSrcInit(pOMXComponent);
1169 if (ret != OMX_ErrorNone)
1173 /* set output geometry */
1174 Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
1175 pWmvDec->hMFCWmvHandle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
1176 if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
1177 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
1178 ret = OMX_ErrorInsufficientResources;
1182 bMetaData = Make_Stream_MetaData(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, &oneFrameSize, pWmvDec->hMFCWmvHandle.wmvFormat
1183 #ifdef TIZEN_FEATURE_E3250
1184 , pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.nFrameWidth
1185 , pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.nFrameHeight
1188 if (bMetaData == OMX_FALSE) {
1189 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail to Make Stream MetaData");
1190 ret = OMX_ErrorInsufficientResources;
1194 /* input buffer enqueue for header parsing */
1195 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize);
1196 if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
1197 (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) {
1198 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing");
1199 // ret = OMX_ErrorInsufficientResources;
1200 ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit;
1204 /* start header parsing */
1205 if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
1206 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing");
1207 ret = OMX_ErrorCodecInit;
1211 ret = WmvCodecCheckResolutionChange(pOMXComponent);
1212 if (ret != OMX_ErrorNone) {
1213 ret = OMX_ErrorCodecInit;
1217 Exynos_OSAL_SleepMillisec(0);
1218 ret = OMX_ErrorInputDataDecodeYet;
1220 #ifdef USE_IMMEDIATE_DISPLAY
1221 /* Set Immediately display for I Frame*/
1222 pDecOps->Set_ImmediateDisplay(hMFCHandle);
1225 WmvCodecStop(pOMXComponent, INPUT_PORT_INDEX);
1231 OMX_ERRORTYPE WmvCodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
1233 OMX_ERRORTYPE ret = OMX_ErrorNone;
1234 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1235 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1236 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1237 void *hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
1238 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1239 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1241 ExynosVideoDecOps *pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
1242 ExynosVideoDecBufferOps *pInbufOps = pWmvDec->hMFCWmvHandle.pInbufOps;
1243 ExynosVideoDecBufferOps *pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
1250 nOutbufs = pWmvDec->hMFCWmvHandle.maxDPBNum;
1252 if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
1253 /* should be done before prepare output buffer */
1254 if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
1255 ret = OMX_ErrorInsufficientResources;
1260 if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE
1261 ||pWmvDec->hMFCWmvHandle.bShareableBuf == OMX_TRUE)
1262 pOutbufOps->Set_Shareable(hMFCHandle);
1264 if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) {
1265 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
1266 ret = OMX_ErrorInsufficientResources;
1270 ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
1271 OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
1272 OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
1275 nAllocLen[0] = calc_yplane(pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameWidth,
1276 pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameHeight);
1277 nAllocLen[1] = calc_uvplane(pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameWidth,
1278 pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameHeight >> 1);
1280 if (pExynosOutputPort->bufferProcessType & BUFFER_COPY &&
1281 pWmvDec->hMFCWmvHandle.bShareableBuf == OMX_TRUE) {
1282 WmvCodecDstAllocCodecBuffers(pOMXComponent, nOutbufs);
1283 WmvCodecDstRegistCodecBuffers(pOMXComponent, nOutbufs);
1284 } else if (pExynosOutputPort->bufferProcessType & BUFFER_COPY &&
1285 pWmvDec->hMFCWmvHandle.bShareableBuf == OMX_FALSE) {
1286 /* Register output buffer */
1287 for (i = 0; i < nOutbufs; i++) {
1289 OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
1290 ExynosVideoBuffer *pBuffer = NULL;
1291 pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
1292 Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
1294 if (pOutbufOps->Get_Buffer) {
1295 if (pOutbufOps->Get_Buffer(pWmvDec->hMFCWmvHandle.hMFCHandle, i, &pBuffer) != VIDEO_ERROR_NONE) {
1296 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get Output buffer info");
1297 ret = OMX_ErrorInsufficientResources;
1302 for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1303 pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] = (void *)pBuffer->planes[plane].addr;
1304 pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] = pBuffer->planes[plane].fd;
1305 pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = pBuffer->planes[plane].allocSize;
1308 pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
1309 (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
1312 } else if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
1314 if (pExynosOutputPort->bIsPBEnabled == OMX_TRUE) {
1315 for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
1316 for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1317 planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane];
1318 planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane];
1319 planes[plane].allocSize = nAllocLen[plane];
1322 if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
1323 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
1324 ret = OMX_ErrorInsufficientResources;
1327 pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf,
1328 (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
1331 ret = OMX_ErrorNotImplemented;
1335 ret = OMX_ErrorNotImplemented;
1340 if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
1341 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
1342 ret = OMX_ErrorInsufficientResources;
1346 if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
1347 WmvCodecStop (pOMXComponent, OUTPUT_PORT_INDEX);
1349 pWmvDec->hMFCWmvHandle.bConfiguredMFCDst = OMX_TRUE;
1351 ret = OMX_ErrorNone;
1359 OMX_ERRORTYPE WmvCodecCheckResolutionChange(OMX_COMPONENTTYPE *pOMXComponent)
1361 OMX_ERRORTYPE ret = OMX_ErrorNone;
1362 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1363 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1364 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1365 void *hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
1366 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1367 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1369 ExynosVideoDecOps *pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
1370 ExynosVideoDecBufferOps *pInbufOps = pWmvDec->hMFCWmvHandle.pInbufOps;
1371 ExynosVideoDecBufferOps *pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
1372 ExynosVideoGeometry bufferConf;
1377 /* get geometry for output */
1378 Exynos_OSAL_Memset(&pWmvDec->hMFCWmvHandle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry));
1379 if (pOutbufOps->Get_Geometry(hMFCHandle, &pWmvDec->hMFCWmvHandle.codecOutbufConf) != VIDEO_ERROR_NONE) {
1380 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info");
1381 ret = OMX_ErrorInsufficientResources;
1386 pWmvDec->hMFCWmvHandle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle);
1387 if (pVideoDec->bThumbnailMode == OMX_FALSE)
1388 pWmvDec->hMFCWmvHandle.maxDPBNum += EXTRA_DPB_NUM;
1389 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "WmvCodecCheckResolutionChange WmvCodecSetup nOutbufs: %d", pWmvDec->hMFCWmvHandle.maxDPBNum);
1391 pWmvDec->hMFCWmvHandle.bConfiguredMFCSrc = OMX_TRUE;
1393 if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
1394 if ((pVideoDec->bDRCProcessing) ||
1395 (pExynosInputPort->portDefinition.format.video.nFrameWidth != pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameWidth) ||
1396 (pExynosInputPort->portDefinition.format.video.nFrameHeight != pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameHeight)) {
1397 pExynosInputPort->portDefinition.format.video.nFrameWidth = pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameWidth;
1398 pExynosInputPort->portDefinition.format.video.nFrameHeight = pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameHeight;
1399 pExynosInputPort->portDefinition.format.video.nStride = ((pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameWidth + 15) & (~15));
1400 pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameHeight + 15) & (~15));
1402 if (pVideoDec->bDRCProcessing == OMX_TRUE) {
1403 pVideoDec->nDRCSavedBufferCount = pExynosOutputPort->portDefinition.nBufferCountActual;
1405 Exynos_UpdateFrameSize(pOMXComponent);
1406 pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
1408 /** Send Port Settings changed call back **/
1409 (*(pExynosComponent->pCallbacks->EventHandler))
1411 pExynosComponent->callbackData,
1412 OMX_EventPortSettingsChanged, /* The command was completed */
1413 OMX_DirOutput, /* This is the port index */
1417 } else if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
1418 if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameWidth) ||
1419 (pExynosInputPort->portDefinition.format.video.nFrameHeight != pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameHeight) ||
1420 (pExynosOutputPort->portDefinition.nBufferCountActual != pWmvDec->hMFCWmvHandle.maxDPBNum)) {
1421 pExynosInputPort->portDefinition.format.video.nFrameWidth = pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameWidth;
1422 pExynosInputPort->portDefinition.format.video.nFrameHeight = pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameHeight;
1423 pExynosInputPort->portDefinition.format.video.nStride = ((pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameWidth + 15) & (~15));
1424 pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pWmvDec->hMFCWmvHandle.codecOutbufConf.nFrameHeight + 15) & (~15));
1426 if (pVideoDec->bDRCProcessing == OMX_TRUE) {
1427 pVideoDec->nDRCSavedBufferCount = pExynosOutputPort->portDefinition.nBufferCountActual;
1429 #ifdef TIZEN_FEATURE_E3250
1430 pExynosOutputPort->portDefinition.nBufferCountActual = pWmvDec->hMFCWmvHandle.maxDPBNum;
1431 pExynosOutputPort->portDefinition.nBufferCountMin = pWmvDec->hMFCWmvHandle.maxDPBNum;
1433 pExynosOutputPort->portDefinition.nBufferCountActual = pWmvDec->hMFCWmvHandle.maxDPBNum - 4;
1434 pExynosOutputPort->portDefinition.nBufferCountMin = pWmvDec->hMFCWmvHandle.maxDPBNum - 4;
1436 Exynos_UpdateFrameSize(pOMXComponent);
1437 pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
1439 /** Send Port Settings changed call back **/
1440 (*(pExynosComponent->pCallbacks->EventHandler))
1442 pExynosComponent->callbackData,
1443 OMX_EventPortSettingsChanged, /* The command was completed */
1444 OMX_DirOutput, /* This is the port index */
1450 ret = OMX_ErrorNone;
1458 OMX_ERRORTYPE Exynos_WmvDec_GetParameter(
1459 OMX_IN OMX_HANDLETYPE hComponent,
1460 OMX_IN OMX_INDEXTYPE nParamIndex,
1461 OMX_INOUT OMX_PTR pComponentParameterStructure)
1463 OMX_ERRORTYPE ret = OMX_ErrorNone;
1464 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1465 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1469 if (hComponent == NULL || pComponentParameterStructure == NULL) {
1470 ret = OMX_ErrorBadParameter;
1473 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1474 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1475 if (ret != OMX_ErrorNone) {
1478 if (pOMXComponent->pComponentPrivate == NULL) {
1479 ret = OMX_ErrorBadParameter;
1483 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1484 if (pExynosComponent->currentState == OMX_StateInvalid ) {
1485 ret = OMX_ErrorInvalidState;
1489 switch (nParamIndex) {
1490 case OMX_IndexParamVideoWmv:
1492 OMX_VIDEO_PARAM_WMVTYPE *pDstWmvParam = (OMX_VIDEO_PARAM_WMVTYPE *)pComponentParameterStructure;
1493 OMX_VIDEO_PARAM_WMVTYPE *pSrcWmvParam = NULL;
1494 EXYNOS_WMVDEC_HANDLE *pWmvDec = NULL;
1495 ret = Exynos_OMX_Check_SizeVersion(pDstWmvParam, sizeof(OMX_VIDEO_PARAM_WMVTYPE));
1496 if (ret != OMX_ErrorNone) {
1500 if (pDstWmvParam->nPortIndex > OUTPUT_PORT_INDEX) {
1501 ret = OMX_ErrorBadPortIndex;
1504 pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1505 pSrcWmvParam = &pWmvDec->WmvComponent[pDstWmvParam->nPortIndex];
1507 Exynos_OSAL_Memcpy(pDstWmvParam, pSrcWmvParam, sizeof(OMX_VIDEO_PARAM_WMVTYPE));
1511 case OMX_IndexParamStandardComponentRole:
1513 OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
1514 ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
1515 if (ret != OMX_ErrorNone) {
1519 Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_WMV_DEC_ROLE);
1522 case OMX_IndexParamVideoErrorCorrection:
1524 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
1525 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
1526 EXYNOS_WMVDEC_HANDLE *pWmvDec = NULL;
1528 ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
1529 if (ret != OMX_ErrorNone) {
1533 if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
1534 ret = OMX_ErrorBadPortIndex;
1538 pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1539 pSrcErrorCorrectionType = &pWmvDec->errorCorrectionType[INPUT_PORT_INDEX];
1541 pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
1542 pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
1543 pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
1544 pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
1545 pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
1549 ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
1558 OMX_ERRORTYPE Exynos_WmvDec_SetParameter(
1559 OMX_IN OMX_HANDLETYPE hComponent,
1560 OMX_IN OMX_INDEXTYPE nIndex,
1561 OMX_IN OMX_PTR pComponentParameterStructure)
1563 OMX_ERRORTYPE ret = OMX_ErrorNone;
1564 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1565 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1569 if (hComponent == NULL || pComponentParameterStructure == NULL) {
1570 ret = OMX_ErrorBadParameter;
1573 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1574 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1575 if (ret != OMX_ErrorNone) {
1578 if (pOMXComponent->pComponentPrivate == NULL) {
1579 ret = OMX_ErrorBadParameter;
1583 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1584 if (pExynosComponent->currentState == OMX_StateInvalid ) {
1585 ret = OMX_ErrorInvalidState;
1590 case OMX_IndexParamVideoWmv:
1592 OMX_VIDEO_PARAM_WMVTYPE *pDstWmvParam = NULL;
1593 OMX_VIDEO_PARAM_WMVTYPE *pSrcWmvParam = (OMX_VIDEO_PARAM_WMVTYPE *)pComponentParameterStructure;
1594 EXYNOS_WMVDEC_HANDLE *pWmvDec = NULL;
1595 ret = Exynos_OMX_Check_SizeVersion(pSrcWmvParam, sizeof(OMX_VIDEO_PARAM_WMVTYPE));
1596 if (ret != OMX_ErrorNone) {
1600 if (pSrcWmvParam->nPortIndex > OUTPUT_PORT_INDEX) {
1601 ret = OMX_ErrorBadPortIndex;
1605 pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1606 pDstWmvParam = &pWmvDec->WmvComponent[pSrcWmvParam->nPortIndex];
1608 Exynos_OSAL_Memcpy(pDstWmvParam, pSrcWmvParam, sizeof(OMX_VIDEO_PARAM_WMVTYPE));
1611 case OMX_IndexParamStandardComponentRole:
1613 OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
1615 ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
1616 if (ret != OMX_ErrorNone) {
1620 if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1621 ret = OMX_ErrorIncorrectStateOperation;
1625 if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_WMV_DEC_ROLE)) {
1626 pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingWMV;
1628 ret = OMX_ErrorBadParameter;
1633 case OMX_IndexParamPortDefinition:
1635 OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)pComponentParameterStructure;
1636 OMX_U32 portIndex = pPortDefinition->nPortIndex;
1637 EXYNOS_OMX_BASEPORT *pExynosPort;
1638 OMX_U32 width, height, size;
1639 OMX_U32 realWidth, realHeight;
1640 OMX_PARAM_PORTDEFINITIONTYPE portDefinition_backup;
1642 if (portIndex >= pExynosComponent->portParam.nPorts) {
1643 ret = OMX_ErrorBadPortIndex;
1646 ret = Exynos_OMX_Check_SizeVersion(pPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
1647 if (ret != OMX_ErrorNone) {
1651 pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1653 if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1654 if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
1655 ret = OMX_ErrorIncorrectStateOperation;
1659 if (pPortDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) {
1660 ret = OMX_ErrorBadParameter;
1664 Exynos_OSAL_Memcpy(&portDefinition_backup, &pExynosPort->portDefinition, pPortDefinition->nSize);
1665 Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, pPortDefinition, pPortDefinition->nSize);
1666 RESTORE_READONLYPARAMETERS_OMX_PARAM_PORTDEFINITIONTYPE(&pExynosPort->portDefinition,&portDefinition_backup);
1668 realWidth = pExynosPort->portDefinition.format.video.nFrameWidth;
1669 realHeight = pExynosPort->portDefinition.format.video.nFrameHeight;
1670 width = ((realWidth + 15) & (~15));
1671 height = ((realHeight + 15) & (~15));
1672 size = (width * height * 3) / 2;
1673 pExynosPort->portDefinition.format.video.nStride = width;
1674 pExynosPort->portDefinition.format.video.nSliceHeight = height;
1675 pExynosPort->portDefinition.nBufferSize = (size > pExynosPort->portDefinition.nBufferSize) ? size : pExynosPort->portDefinition.nBufferSize;
1677 if (portIndex == INPUT_PORT_INDEX) {
1678 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1679 pExynosOutputPort->portDefinition.format.video.nFrameWidth = pExynosPort->portDefinition.format.video.nFrameWidth;
1680 pExynosOutputPort->portDefinition.format.video.nFrameHeight = pExynosPort->portDefinition.format.video.nFrameHeight;
1681 pExynosOutputPort->portDefinition.format.video.nStride = width;
1682 pExynosOutputPort->portDefinition.format.video.nSliceHeight = height;
1684 switch (pExynosOutputPort->portDefinition.format.video.eColorFormat) {
1685 case OMX_COLOR_FormatYUV420Planar:
1686 case OMX_COLOR_FormatYUV420SemiPlanar:
1687 pExynosOutputPort->portDefinition.nBufferSize = (width * height * 3) / 2;
1689 #ifdef TIZEN_FEATURE_E3250 /* NV12T fd */
1690 case OMX_SEC_COLOR_FormatNV12T_DmaBuf_Fd:
1691 pExynosOutputPort->portDefinition.nBufferSize = sizeof(MMVideoBuffer);
1694 case OMX_SEC_COLOR_FormatNV12Tiled:
1695 pExynosOutputPort->portDefinition.nBufferSize =
1696 calc_yplane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) +
1697 calc_uvplane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1);
1700 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Color format is not support!! use default YUV size!!");
1701 ret = OMX_ErrorUnsupportedSetting;
1705 if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
1706 pExynosOutputPort->portDefinition.nBufferSize =
1707 calc_yplane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) +
1708 calc_uvplane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1);
1713 case OMX_IndexParamVideoErrorCorrection:
1715 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
1716 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
1717 EXYNOS_WMVDEC_HANDLE *pWmvDec = NULL;
1719 ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
1720 if (ret != OMX_ErrorNone) {
1724 if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
1725 ret = OMX_ErrorBadPortIndex;
1729 pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1730 pDstErrorCorrectionType = &pWmvDec->errorCorrectionType[INPUT_PORT_INDEX];
1732 pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
1733 pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
1734 pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
1735 pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
1736 pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
1740 ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
1749 OMX_ERRORTYPE Exynos_WmvDec_GetConfig(
1750 OMX_HANDLETYPE hComponent,
1751 OMX_INDEXTYPE nIndex,
1752 OMX_PTR pComponentConfigStructure)
1754 OMX_ERRORTYPE ret = OMX_ErrorNone;
1755 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1756 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1760 if (hComponent == NULL || pComponentConfigStructure == NULL) {
1761 ret = OMX_ErrorBadParameter;
1764 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1765 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1766 if (ret != OMX_ErrorNone) {
1769 if (pOMXComponent->pComponentPrivate == NULL) {
1770 ret = OMX_ErrorBadParameter;
1773 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1774 if (pExynosComponent->currentState == OMX_StateInvalid) {
1775 ret = OMX_ErrorInvalidState;
1781 ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
1791 OMX_ERRORTYPE Exynos_WmvDec_SetConfig(
1792 OMX_HANDLETYPE hComponent,
1793 OMX_INDEXTYPE nIndex,
1794 OMX_PTR pComponentConfigStructure)
1796 OMX_ERRORTYPE ret = OMX_ErrorNone;
1797 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1798 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1802 if (hComponent == NULL || pComponentConfigStructure == NULL) {
1803 ret = OMX_ErrorBadParameter;
1806 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1807 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1808 if (ret != OMX_ErrorNone) {
1811 if (pOMXComponent->pComponentPrivate == NULL) {
1812 ret = OMX_ErrorBadParameter;
1815 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1816 if (pExynosComponent->currentState == OMX_StateInvalid) {
1817 ret = OMX_ErrorInvalidState;
1823 ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
1833 OMX_ERRORTYPE Exynos_WmvDec_GetExtensionIndex(
1834 OMX_IN OMX_HANDLETYPE hComponent,
1835 OMX_IN OMX_STRING cParameterName,
1836 OMX_OUT OMX_INDEXTYPE *pIndexType)
1838 OMX_ERRORTYPE ret = OMX_ErrorNone;
1839 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1840 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1844 if (hComponent == NULL) {
1845 ret = OMX_ErrorBadParameter;
1848 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1849 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1850 if (ret != OMX_ErrorNone) {
1853 if (pOMXComponent->pComponentPrivate == NULL) {
1854 ret = OMX_ErrorBadParameter;
1857 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1858 if ((cParameterName == NULL) || (pIndexType == NULL)) {
1859 ret = OMX_ErrorBadParameter;
1862 if (pExynosComponent->currentState == OMX_StateInvalid) {
1863 ret = OMX_ErrorInvalidState;
1867 if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) {
1868 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1869 *pIndexType = OMX_IndexVendorThumbnailMode;
1870 ret = OMX_ErrorNone;
1872 ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
1881 OMX_ERRORTYPE Exynos_WmvDec_ComponentRoleEnum(
1882 OMX_HANDLETYPE hComponent,
1886 OMX_ERRORTYPE ret = OMX_ErrorNone;
1887 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1888 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1892 if ((hComponent == NULL) || (cRole == NULL)) {
1893 ret = OMX_ErrorBadParameter;
1896 if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) {
1897 Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_WMV_DEC_ROLE);
1898 ret = OMX_ErrorNone;
1900 ret = OMX_ErrorNoMore;
1910 OMX_ERRORTYPE Exynos_WmvDec_Init(OMX_COMPONENTTYPE *pOMXComponent)
1912 OMX_ERRORTYPE ret = OMX_ErrorNone;
1913 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1914 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1915 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1916 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1917 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)pVideoDec->hCodecHandle;
1918 OMX_PTR hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
1920 ExynosVideoDecOps *pDecOps = NULL;
1921 ExynosVideoDecBufferOps *pInbufOps = NULL;
1922 ExynosVideoDecBufferOps *pOutbufOps = NULL;
1924 CSC_METHOD csc_method = CSC_METHOD_SW;
1929 pWmvDec->hMFCWmvHandle.bConfiguredMFCSrc = OMX_FALSE;
1930 pWmvDec->hMFCWmvHandle.bConfiguredMFCDst = OMX_FALSE;
1931 pExynosComponent->bUseFlagEOF = OMX_TRUE;
1932 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
1934 /* WMV Codec Open */
1935 ret = WmvCodecOpen(pWmvDec);
1936 if (ret != OMX_ErrorNone) {
1940 pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
1941 pInbufOps = pWmvDec->hMFCWmvHandle.pInbufOps;
1942 pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
1944 if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
1945 Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
1946 Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
1948 if (pWmvDec->hMFCWmvHandle.bShareableBuf == OMX_TRUE) {
1949 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
1950 pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
1951 Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
1952 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
1954 for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
1955 /* Use ION Allocator */
1956 pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
1957 pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1958 pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE;
1959 pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
1960 if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) {
1961 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
1962 ret = OMX_ErrorInsufficientResources;
1965 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
1967 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
1973 /* Does not require any actions. */
1975 } else if (pExynosInputPort->bufferProcessType & BUFFER_SHARE) {
1979 /* Does not require any actions. */
1982 if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
1983 Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
1984 Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
1985 } else if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
1989 /* Does not require any actions. */
1992 pWmvDec->bSourceStart = OMX_FALSE;
1993 Exynos_OSAL_SignalCreate(&pWmvDec->hSourceStartEvent);
1994 pWmvDec->bDestinationStart = OMX_FALSE;
1995 Exynos_OSAL_SignalCreate(&pWmvDec->hDestinationStartEvent);
1997 Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
1998 Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
1999 pWmvDec->hMFCWmvHandle.indexTimestamp = 0;
2000 pWmvDec->hMFCWmvHandle.outputIndexTimestamp = 0;
2001 /* Default WMV codec format is set as VC1*/
2002 pWmvDec->hMFCWmvHandle.wmvFormat = WMV_FORMAT_WMV3;//WMV_FORMAT_VC1;
2004 pExynosComponent->getAllDelayBuffer = OMX_FALSE;
2006 #if 0//defined(USE_CSC_GSCALER)
2007 csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
2009 pVideoDec->csc_handle = csc_init(csc_method);
2010 if (pVideoDec->csc_handle == NULL) {
2011 ret = OMX_ErrorInsufficientResources;
2014 pVideoDec->csc_set_format = OMX_FALSE;
2023 OMX_ERRORTYPE Exynos_WmvDec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
2025 OMX_ERRORTYPE ret = OMX_ErrorNone;
2026 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2027 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
2028 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2029 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2030 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2031 OMX_PTR hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
2033 ExynosVideoDecOps *pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
2034 ExynosVideoDecBufferOps *pInbufOps = pWmvDec->hMFCWmvHandle.pInbufOps;
2035 ExynosVideoDecBufferOps *pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
2041 if (pVideoDec->csc_handle != NULL) {
2042 csc_deinit(pVideoDec->csc_handle);
2043 pVideoDec->csc_handle = NULL;
2046 Exynos_OSAL_SignalTerminate(pWmvDec->hDestinationStartEvent);
2047 pWmvDec->hDestinationStartEvent = NULL;
2048 pWmvDec->bDestinationStart = OMX_FALSE;
2049 Exynos_OSAL_SignalTerminate(pWmvDec->hSourceStartEvent);
2050 pWmvDec->hSourceStartEvent = NULL;
2051 pWmvDec->bSourceStart = OMX_FALSE;
2053 if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
2054 WmvCodecDstFreeCodecBuffers(pOMXComponent);
2056 Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
2057 Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
2058 } else if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
2062 /* Does not require any actions. */
2065 if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
2066 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
2067 if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
2068 for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
2069 if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL)
2070 Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
2073 Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
2074 pVideoDec->pMFCDecInputBuffer[i] = NULL;
2078 Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
2079 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
2080 } else if (pExynosInputPort->bufferProcessType & BUFFER_SHARE) {
2084 /* Does not require any actions. */
2086 WmvCodecClose(pWmvDec);
2094 OMX_ERRORTYPE Exynos_WmvDec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
2096 OMX_ERRORTYPE ret = OMX_ErrorNone;
2097 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2098 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
2099 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2100 void *hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
2101 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2102 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2103 OMX_U32 oneFrameSize = pSrcInputData->dataLen;
2104 OMX_BOOL bStartCode = OMX_FALSE;
2105 ExynosVideoDecOps *pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
2106 ExynosVideoDecBufferOps *pInbufOps = pWmvDec->hMFCWmvHandle.pInbufOps;
2107 ExynosVideoDecBufferOps *pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
2108 ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
2113 if (pWmvDec->hMFCWmvHandle.bConfiguredMFCSrc == OMX_FALSE) {
2114 ret = WmvCodecSrcSetup(pOMXComponent, pSrcInputData);
2117 if (pWmvDec->hMFCWmvHandle.bConfiguredMFCDst == OMX_FALSE) {
2118 ret = WmvCodecDstSetup(pOMXComponent);
2121 bStartCode = Check_Stream_PrefixCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize, pWmvDec->hMFCWmvHandle.wmvFormat);
2122 if (bStartCode == OMX_FALSE && ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) != OMX_BUFFERFLAG_EOS)) {
2123 if (pSrcInputData->allocSize < oneFrameSize+4) {
2124 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can't attach startcode due to lack of buffer space");
2125 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
2129 bStartCode = Make_Stream_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, &oneFrameSize, pWmvDec->hMFCWmvHandle.wmvFormat);
2130 if (bStartCode == OMX_FALSE) {
2131 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail to Make Stream Start Code");
2132 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
2137 if ((bStartCode == OMX_TRUE) || ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)){
2138 pExynosComponent->timeStamp[pWmvDec->hMFCWmvHandle.indexTimestamp] = pSrcInputData->timeStamp;
2139 pExynosComponent->nFlags[pWmvDec->hMFCWmvHandle.indexTimestamp] = pSrcInputData->nFlags;
2140 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pWmvDec->hMFCWmvHandle.indexTimestamp, pSrcInputData->nFlags);
2141 pDecOps->Set_FrameTag(hMFCHandle, pWmvDec->hMFCWmvHandle.indexTimestamp);
2142 pWmvDec->hMFCWmvHandle.indexTimestamp++;
2143 pWmvDec->hMFCWmvHandle.indexTimestamp %= MAX_TIMESTAMP;
2145 #ifdef USE_IMMEDIATE_DISPLAY
2146 /* Set Immediately display for I Frame*/
2147 if (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp == OMX_TRUE) {
2148 if ( pExynosComponent->checkTimeStamp.bImmediateDisplay == OMX_FALSE) {
2149 /* Enable Immediately display After seek*/
2150 pDecOps->Set_ImmediateDisplay(hMFCHandle);
2151 pExynosComponent->checkTimeStamp.bImmediateDisplay = OMX_TRUE;
2156 /* queue work for input buffer */
2157 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer);
2158 codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
2159 (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
2160 if (codecReturn != VIDEO_ERROR_NONE) {
2161 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
2162 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
2165 WmvCodecStart(pOMXComponent, INPUT_PORT_INDEX);
2166 if (pWmvDec->bSourceStart == OMX_FALSE) {
2167 pWmvDec->bSourceStart = OMX_TRUE;
2168 Exynos_OSAL_SignalSet(pWmvDec->hSourceStartEvent);
2169 Exynos_OSAL_SleepMillisec(0);
2171 if (pWmvDec->bDestinationStart == OMX_FALSE) {
2172 pWmvDec->bDestinationStart = OMX_TRUE;
2173 Exynos_OSAL_SignalSet(pWmvDec->hDestinationStartEvent);
2174 Exynos_OSAL_SleepMillisec(0);
2178 ret = OMX_ErrorNone;
2186 OMX_ERRORTYPE Exynos_WmvDec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
2188 OMX_ERRORTYPE ret = OMX_ErrorNone;
2189 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2190 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
2191 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2192 void *hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
2193 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2194 ExynosVideoDecOps *pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
2195 ExynosVideoDecBufferOps *pInbufOps = pWmvDec->hMFCWmvHandle.pInbufOps;
2196 ExynosVideoBuffer *pVideoBuffer;
2200 pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
2202 pSrcOutputData->dataLen = 0;
2203 pSrcOutputData->usedDataLen = 0;
2204 pSrcOutputData->remainDataLen = 0;
2205 pSrcOutputData->nFlags = 0;
2206 pSrcOutputData->timeStamp = 0;
2208 if (pVideoBuffer == NULL) {
2209 pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
2210 pSrcOutputData->allocSize = 0;
2211 pSrcOutputData->pPrivate = NULL;
2212 pSrcOutputData->bufferHeader = NULL;
2214 pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
2215 pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
2216 pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize;
2218 if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
2220 while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
2222 if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
2223 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
2224 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
2228 pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
2229 pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
2232 /* For Share Buffer */
2233 pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
2236 ret = OMX_ErrorNone;
2244 OMX_ERRORTYPE Exynos_WmvDec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
2246 OMX_ERRORTYPE ret = OMX_ErrorNone;
2247 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2248 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
2249 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2250 void *hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
2251 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2252 ExynosVideoDecOps *pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
2253 ExynosVideoDecBufferOps *pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
2254 OMX_U32 dataLen[2] = {0,};
2255 ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
2259 if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
2260 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
2261 ret = OMX_ErrorBadParameter;
2265 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__,
2266 pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
2267 pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]);
2269 if ((pVideoDec->bDRCProcessing == OMX_TRUE) &&
2270 (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) &&
2271 (pExynosOutputPort->exceptionFlag == GENERAL_STATE)) {
2272 ret = WmvCodecDstSetup(pOMXComponent);
2273 if (ret != OMX_ErrorNone) {
2274 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "DRC Reconfig CodecDstSetup Failed");
2277 pVideoDec->bDRCProcessing = OMX_FALSE;
2280 codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
2281 (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
2284 if (codecReturn != VIDEO_ERROR_NONE) {
2285 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
2286 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
2289 WmvCodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
2291 ret = OMX_ErrorNone;
2299 OMX_ERRORTYPE Exynos_WmvDec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
2301 OMX_ERRORTYPE ret = OMX_ErrorNone;
2302 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2303 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
2304 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2305 void *hMFCHandle = pWmvDec->hMFCWmvHandle.hMFCHandle;
2306 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2307 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2308 ExynosVideoDecOps *pDecOps = pWmvDec->hMFCWmvHandle.pDecOps;
2309 ExynosVideoDecBufferOps *pOutbufOps = pWmvDec->hMFCWmvHandle.pOutbufOps;
2310 ExynosVideoBuffer *pVideoBuffer;
2311 ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
2312 ExynosVideoGeometry *bufferGeometry;
2313 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
2314 OMX_S32 indexTimestamp = 0;
2319 if (pWmvDec->bDestinationStart == OMX_FALSE) {
2320 ret = OMX_ErrorNone;
2325 pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle);
2326 if (pVideoBuffer == (ExynosVideoBuffer *)VIDEO_ERROR_DQBUF_EIO) {
2327 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "HW is not available");
2328 ret = OMX_ErrorHardware;
2332 if (pVideoBuffer == NULL) {
2333 ret = OMX_ErrorNone;
2336 displayStatus = pVideoBuffer->displayStatus;
2337 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
2339 if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
2340 (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
2341 (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
2342 (displayStatus == VIDEO_FRAME_STATUS_DECODING_FINISHED) ||
2343 (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
2344 if (pVideoBuffer != NULL) {
2345 ret = OMX_ErrorNone;
2348 ret = OMX_ErrorUndefined;
2354 if (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) {
2355 if (pVideoDec->bDRCProcessing != OMX_TRUE) {
2356 pExynosOutputPort->exceptionFlag = NEED_PORT_FLUSH;
2357 pVideoDec->bDRCProcessing = OMX_TRUE;
2358 WmvCodecCheckResolutionChange(pOMXComponent);
2359 pVideoDec->csc_set_format = OMX_FALSE;
2361 ret = OMX_ErrorNone;
2365 pWmvDec->hMFCWmvHandle.outputIndexTimestamp++;
2366 pWmvDec->hMFCWmvHandle.outputIndexTimestamp %= MAX_TIMESTAMP;
2368 pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
2369 for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
2370 pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
2371 pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
2372 pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
2373 pDstOutputData->dataLen += pVideoBuffer->planes[plane].dataSize;
2375 pDstOutputData->usedDataLen = 0;
2376 pDstOutputData->pPrivate = pVideoBuffer;
2377 /* For Share Buffer */
2378 pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
2380 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
2381 bufferGeometry = &pWmvDec->hMFCWmvHandle.codecOutbufConf;
2382 pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
2383 pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
2384 switch (bufferGeometry->eColorFormat) {
2385 case VIDEO_COLORFORMAT_NV12:
2386 #ifdef TIZEN_FEATURE_E3250 /* NV12T fd */
2387 pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12T_DmaBuf_Fd;
2389 pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
2392 case VIDEO_COLORFORMAT_NV12_TILED:
2394 pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
2398 indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
2399 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
2400 if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
2401 if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) &&
2402 (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) {
2403 pDstOutputData->timeStamp = pExynosComponent->timeStamp[pWmvDec->hMFCWmvHandle.outputIndexTimestamp];
2404 pDstOutputData->nFlags = pExynosComponent->nFlags[pWmvDec->hMFCWmvHandle.outputIndexTimestamp];
2405 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
2407 pDstOutputData->timeStamp = 0x00;
2408 pDstOutputData->nFlags = 0x00;
2411 /* For timestamp correction. if mfc support frametype detect */
2412 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
2414 //#ifdef NEED_TIMESTAMP_REORDER
2415 if (pVideoDec->bNeedTimestampReorder == OMX_TRUE) { /* TIZEN_FEATURE_E3250 */
2416 if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
2417 pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
2418 pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
2419 pWmvDec->hMFCWmvHandle.outputIndexTimestamp = indexTimestamp;
2421 pDstOutputData->timeStamp = pExynosComponent->timeStamp[pWmvDec->hMFCWmvHandle.outputIndexTimestamp];
2422 pDstOutputData->nFlags = pExynosComponent->nFlags[pWmvDec->hMFCWmvHandle.outputIndexTimestamp];
2426 pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
2427 pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
2430 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData->timeStamp, pDstOutputData->timeStamp / 1E6, indexTimestamp, pDstOutputData->nFlags);
2433 if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
2434 (displayStatus == VIDEO_FRAME_STATUS_DECODING_FINISHED) ||
2435 ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
2436 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
2437 pDstOutputData->remainDataLen = 0;
2439 pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
2442 ret = OMX_ErrorNone;
2450 OMX_ERRORTYPE Exynos_WmvDec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
2452 OMX_ERRORTYPE ret = OMX_ErrorNone;
2453 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2454 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2455 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2459 if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
2460 ret = OMX_ErrorNone;
2463 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
2464 ret = OMX_ErrorNone;
2468 ret = Exynos_WmvDec_SrcIn(pOMXComponent, pSrcInputData);
2469 if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) {
2470 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2471 pExynosComponent->callbackData,
2472 OMX_EventError, ret, 0, NULL);
2481 OMX_ERRORTYPE Exynos_WmvDec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
2483 OMX_ERRORTYPE ret = OMX_ErrorNone;
2484 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2485 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2486 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2490 if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
2491 ret = OMX_ErrorNone;
2495 if (pExynosInputPort->bufferProcessType & BUFFER_COPY) {
2496 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
2497 ret = OMX_ErrorNone;
2501 if ((pWmvDec->bSourceStart == OMX_FALSE) &&
2502 (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
2503 Exynos_OSAL_SignalWait(pWmvDec->hSourceStartEvent, DEF_MAX_WAIT_TIME);
2504 Exynos_OSAL_SignalReset(pWmvDec->hSourceStartEvent);
2507 ret = Exynos_WmvDec_SrcOut(pOMXComponent, pSrcOutputData);
2508 if ((ret != OMX_ErrorNone) &&
2509 (pExynosComponent->currentState == OMX_StateExecuting)) {
2510 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2511 pExynosComponent->callbackData,
2512 OMX_EventError, ret, 0, NULL);
2521 OMX_ERRORTYPE Exynos_WmvDec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
2523 OMX_ERRORTYPE ret = OMX_ErrorNone;
2524 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2525 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2526 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2530 if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
2531 ret = OMX_ErrorNone;
2534 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
2535 ret = OMX_ErrorNone;
2538 if (pExynosOutputPort->bufferProcessType & BUFFER_SHARE) {
2539 if ((pWmvDec->bDestinationStart == OMX_FALSE) &&
2540 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
2541 Exynos_OSAL_SignalWait(pWmvDec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
2542 Exynos_OSAL_SignalReset(pWmvDec->hDestinationStartEvent);
2545 if (pWmvDec->hMFCWmvHandle.bConfiguredMFCDst == OMX_TRUE) {
2546 ret = Exynos_WmvDec_DstIn(pOMXComponent, pDstInputData);
2547 if (ret != OMX_ErrorNone) {
2548 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2549 pExynosComponent->callbackData,
2550 OMX_EventError, ret, 0, NULL);
2560 OMX_ERRORTYPE Exynos_WmvDec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
2562 OMX_ERRORTYPE ret = OMX_ErrorNone;
2563 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2564 EXYNOS_WMVDEC_HANDLE *pWmvDec = (EXYNOS_WMVDEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2565 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2569 if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
2570 ret = OMX_ErrorNone;
2573 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
2574 ret = OMX_ErrorNone;
2578 if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
2579 if ((pWmvDec->bDestinationStart == OMX_FALSE) &&
2580 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
2581 Exynos_OSAL_SignalWait(pWmvDec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
2582 Exynos_OSAL_SignalReset(pWmvDec->hDestinationStartEvent);
2585 ret = Exynos_WmvDec_DstOut(pOMXComponent, pDstOutputData);
2586 if ((ret != OMX_ErrorNone) &&
2587 (pExynosComponent->currentState == OMX_StateExecuting)) {
2588 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2589 pExynosComponent->callbackData,
2590 OMX_EventError, ret, 0, NULL);
2599 OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(
2600 OMX_HANDLETYPE hComponent,
2601 OMX_STRING componentName)
2603 OMX_ERRORTYPE ret = OMX_ErrorNone;
2604 OMX_COMPONENTTYPE *pOMXComponent = NULL;
2605 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
2606 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
2607 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
2608 EXYNOS_WMVDEC_HANDLE *pWmvDec = NULL;
2609 OMX_S32 wmvFormat = WMV_FORMAT_UNKNOWN;
2614 if ((hComponent == NULL) || (componentName == NULL)) {
2615 ret = OMX_ErrorBadParameter;
2616 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
2619 if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_WMV_DEC, componentName) != 0) {
2620 ret = OMX_ErrorBadParameter;
2621 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
2625 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
2626 ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent);
2627 if (ret != OMX_ErrorNone) {
2628 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
2631 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2632 pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
2634 pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
2635 if (pExynosComponent->componentName == NULL) {
2636 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2637 ret = OMX_ErrorInsufficientResources;
2638 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
2641 Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
2643 pWmvDec = Exynos_OSAL_Malloc(sizeof(EXYNOS_WMVDEC_HANDLE));
2644 if (pWmvDec == NULL) {
2645 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2646 ret = OMX_ErrorInsufficientResources;
2647 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
2650 Exynos_OSAL_Memset(pWmvDec, 0, sizeof(EXYNOS_WMVDEC_HANDLE));
2651 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
2652 pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pWmvDec;
2653 pWmvDec->hMFCWmvHandle.wmvFormat = wmvFormat;
2655 Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_WMV_DEC);
2657 /* In case of BUFFER_COPY mode
2658 bShareableBuf = TRUE means MemoryType is V4L2_MEMORY_USERPTR
2659 bShareableBuf = FALSE means MemoryType is V4L2_MEMORY_MMAP
2660 In case of BUFFER_SHARE
2661 bShareableBuf should be TRUE, FALSE is ignored
2663 pWmvDec->hMFCWmvHandle.bShareableBuf = OMX_FALSE;
2665 /* Set componentVersion */
2666 pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
2667 pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
2668 pExynosComponent->componentVersion.s.nRevision = REVISION_NUMBER;
2669 pExynosComponent->componentVersion.s.nStep = STEP_NUMBER;
2670 /* Set specVersion */
2671 pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
2672 pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
2673 pExynosComponent->specVersion.s.nRevision = REVISION_NUMBER;
2674 pExynosComponent->specVersion.s.nStep = STEP_NUMBER;
2677 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2678 pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
2679 pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
2680 pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
2681 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
2682 pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
2683 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingWMV;
2684 Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2685 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/wmv");
2686 pExynosPort->portDefinition.format.video.pNativeRender = 0;
2687 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
2688 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
2689 pExynosPort->portDefinition.bEnabled = OMX_TRUE;
2690 pExynosPort->bufferProcessType = BUFFER_COPY;
2691 pExynosPort->portWayType = WAY2_PORT;
2694 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2695 pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
2696 pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
2697 pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
2698 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
2699 pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
2700 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
2701 Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2702 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
2703 pExynosPort->portDefinition.format.video.pNativeRender = 0;
2704 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
2705 #ifdef TIZEN_FEATURE_E3250
2706 pExynosPort->portDefinition.format.video.eColorFormat = OMX_SEC_COLOR_FormatNV12T_DmaBuf_Fd;
2708 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
2710 pExynosPort->portDefinition.bEnabled = OMX_TRUE;
2711 #ifdef TIZEN_FEATURE_E3250
2712 pExynosPort->bufferProcessType = BUFFER_SHARE;
2714 pExynosPort->bufferProcessType = BUFFER_COPY;
2716 pExynosPort->portWayType = WAY2_PORT;
2718 for(i = 0; i < ALL_PORT_NUM; i++) {
2719 INIT_SET_SIZE_VERSION(&pWmvDec->WmvComponent[i], OMX_VIDEO_PARAM_WMVTYPE);
2720 pWmvDec->WmvComponent[i].nPortIndex = i;
2721 pWmvDec->WmvComponent[i].eFormat = OMX_VIDEO_WMVFormat9;
2724 #ifdef TIZEN_FEATURE_E3250
2725 pWmvDec->wmvFormat = WMV_FORMAT_UNKNOWN;
2728 pOMXComponent->GetParameter = &Exynos_WmvDec_GetParameter;
2729 pOMXComponent->SetParameter = &Exynos_WmvDec_SetParameter;
2730 pOMXComponent->GetConfig = &Exynos_WmvDec_GetConfig;
2731 pOMXComponent->SetConfig = &Exynos_WmvDec_SetConfig;
2732 pOMXComponent->GetExtensionIndex = &Exynos_WmvDec_GetExtensionIndex;
2733 pOMXComponent->ComponentRoleEnum = &Exynos_WmvDec_ComponentRoleEnum;
2734 pOMXComponent->ComponentDeInit = &Exynos_OMX_ComponentDeinit;
2736 pExynosComponent->exynos_codec_componentInit = &Exynos_WmvDec_Init;
2737 pExynosComponent->exynos_codec_componentTerminate = &Exynos_WmvDec_Terminate;
2739 pVideoDec->exynos_codec_srcInputProcess = &Exynos_WmvDec_srcInputBufferProcess;
2740 pVideoDec->exynos_codec_srcOutputProcess = &Exynos_WmvDec_srcOutputBufferProcess;
2741 pVideoDec->exynos_codec_dstInputProcess = &Exynos_WmvDec_dstInputBufferProcess;
2742 pVideoDec->exynos_codec_dstOutputProcess = &Exynos_WmvDec_dstOutputBufferProcess;
2744 pVideoDec->exynos_codec_start = &WmvCodecStart;
2745 pVideoDec->exynos_codec_stop = &WmvCodecStop;
2746 pVideoDec->exynos_codec_bufferProcessRun = &WmvCodecOutputBufferProcessRun;
2747 pVideoDec->exynos_codec_enqueueAllBuffer = &WmvCodecEnQueueAllBuffer;
2748 pVideoDec->exynos_codec_resetupAllElement = &WmvCodecResetupAllElement;
2750 pVideoDec->exynos_checkInputFrame = NULL;
2751 pVideoDec->exynos_codec_getCodecInputPrivateData = &GetCodecInputPrivateData;
2752 pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
2754 pVideoDec->exynos_process_codecConfigData = &Process_Wmv_CodecConfigData;
2756 #ifndef TIZEN_FEATURE_E3250 /* do not use ion */
2757 pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
2758 if (pVideoDec->hSharedMemory == NULL) {
2759 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
2760 Exynos_OSAL_Free(pWmvDec);
2761 pWmvDec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
2762 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2763 ret = OMX_ErrorInsufficientResources;
2767 pExynosComponent->currentState = OMX_StateLoaded;
2769 ret = OMX_ErrorNone;
2777 OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(
2778 OMX_HANDLETYPE hComponent)
2780 OMX_ERRORTYPE ret = OMX_ErrorNone;
2781 OMX_COMPONENTTYPE *pOMXComponent = NULL;
2782 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
2783 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
2784 EXYNOS_WMVDEC_HANDLE *pWmvDec = NULL;
2788 if (hComponent == NULL) {
2789 ret = OMX_ErrorBadParameter;
2792 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
2793 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2794 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
2795 #ifndef TIZEN_FEATURE_E3250 /* do not use ion */
2796 Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
2798 Exynos_OSAL_Free(pExynosComponent->componentName);
2799 pExynosComponent->componentName = NULL;
2801 pWmvDec = (EXYNOS_WMVDEC_HANDLE *)pVideoDec->hCodecHandle;
2802 if (pWmvDec != NULL) {
2803 Exynos_OSAL_Free(pWmvDec);
2804 pWmvDec = pVideoDec->hCodecHandle = NULL;
2807 ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2808 if (ret != OMX_ErrorNone) {
2812 ret = OMX_ErrorNone;