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)
34 #include "Exynos_OMX_Macros.h"
35 #include "Exynos_OMX_Basecomponent.h"
36 #include "Exynos_OMX_Baseport.h"
37 #include "Exynos_OMX_Vdec.h"
38 #include "Exynos_OMX_VdecControl.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_Android.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 #include "Exynos_OSAL_Log.h"
61 #define WMV_DEC_NUM_OF_EXTRA_BUFFERS 7
63 //#define FULL_FRAME_SEARCH
65 /* ASF parser does not send start code on Stagefright */
67 /* Enable or disable "WMV3_ADDITIONAL_START_CODE" based on MFC F/W's need */
68 #define WMV3_ADDITIONAL_START_CODE
70 WMV_FORMAT gWvmFormat
= WMV_FORMAT_UNKNOWN
;
72 const OMX_U32 wmv3
= 0x33564d57;
73 const OMX_U32 wvc1
= 0x31435657;
74 const OMX_U32 wmva
= 0x41564d57;
77 static OMX_ERRORTYPE
GetCodecInputPrivateData(OMX_PTR codecBuffer
, void *pVirtAddr
, OMX_U32
*dataSize
)
79 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
85 static OMX_ERRORTYPE
GetCodecOutputPrivateData(OMX_PTR codecBuffer
, void *addr
[], int size
[])
87 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
88 ExynosVideoBuffer
*pCodecBuffer
;
90 if (codecBuffer
== NULL
) {
91 ret
= OMX_ErrorBadParameter
;
95 pCodecBuffer
= (ExynosVideoBuffer
*)codecBuffer
;
98 addr
[0] = pCodecBuffer
->planes
[0].addr
;
99 addr
[1] = pCodecBuffer
->planes
[1].addr
;
100 addr
[2] = pCodecBuffer
->planes
[2].addr
;
104 size
[0] = pCodecBuffer
->planes
[0].allocSize
;
105 size
[1] = pCodecBuffer
->planes
[1].allocSize
;
106 size
[2] = pCodecBuffer
->planes
[2].allocSize
;
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
;
125 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "buffSize = %d", buffSize
);
128 bFrameStart
= OMX_FALSE
;
130 if (flag
& OMX_BUFFERFLAG_CODECCONFIG
) {
131 BitmapInfoHhr
*pBitmapInfoHeader
;
132 pBitmapInfoHeader
= (BitmapInfoHhr
*)pInputStream
;
134 compressionID
= pBitmapInfoHeader
->BiCompression
;
135 if (compressionID
== wmv3
) {
136 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "WMV_FORMAT_WMV3");
137 gWvmFormat
= WMV_FORMAT_WMV3
;
139 *pbEndOfFrame
= OMX_TRUE
;
142 else if ((compressionID
== wvc1
) || (compressionID
== wmva
)) {
143 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "WMV_FORMAT_VC1");
144 gWvmFormat
= WMV_FORMAT_VC1
;
147 /* ASF parser does not send start code on Stagefright */
148 *pbEndOfFrame
= OMX_TRUE
;
154 if (gWvmFormat
== WMV_FORMAT_WMV3
) {
155 *pbEndOfFrame
= OMX_TRUE
;
160 /* ASF parser does not send start code on Stagefright */
161 if (gWvmFormat
== WMV_FORMAT_VC1
) {
162 *pbEndOfFrame
= OMX_TRUE
;
166 /* TODO : for comformanc test based on common buffer scheme w/o parser */
168 if (bPreviousFrameEOF
== OMX_FALSE
)
169 bFrameStart
= OMX_TRUE
;
171 startCode
= 0xFFFFFFFF;
172 if (bFrameStart
== OMX_FALSE
) {
173 /* find Frame start code */
174 while(startCode
!= 0x10D) {
175 readStream
= *(pInputStream
+ len
);
176 startCode
= (startCode
<< 8) | readStream
;
183 /* find next Frame start code */
184 startCode
= 0xFFFFFFFF;
185 while ((startCode
!= 0x10D)) {
186 readStream
= *(pInputStream
+ len
);
187 startCode
= (startCode
<< 8) | readStream
;
193 *pbEndOfFrame
= OMX_TRUE
;
195 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "1. Check_Wmv_Frame returned EOF = %d, len = %d, buffSize = %d", *pbEndOfFrame
, len
- 4, buffSize
);
201 *pbEndOfFrame
= OMX_FALSE
;
203 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "2. Check_Wmv_Frame returned EOF = %d, len = %d, buffSize = %d", *pbEndOfFrame
, len
- 1, buffSize
);
208 static OMX_BOOL
Check_Stream_PrefixCode(
209 OMX_U8
*pInputStream
,
211 WMV_FORMAT wmvFormat
)
214 case WMV_FORMAT_WMV3
:
215 #ifdef WMV3_ADDITIONAL_START_CODE
225 /* TODO : for comformanc test based on common buffer scheme w/o parser */
226 if (streamSize
< 3) {
227 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: streamSize is too small (%d)", __FUNCTION__
, streamSize
);
229 } else if ((pInputStream
[0] == 0x00) &&
230 (pInputStream
[1] == 0x00) &&
231 (pInputStream
[2] == 0x01)) {
234 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: Cannot find prefix", __FUNCTION__
);
240 Exynos_OSAL_Log(EXYNOS_LOG_WARNING
, "%s: undefined wmvFormat (%d)", __FUNCTION__
, wmvFormat
);
246 static OMX_BOOL
Make_Stream_MetaData(
247 OMX_U8
*pInputStream
,
248 OMX_U32
*pStreamSize
,
249 WMV_FORMAT wmvFormat
)
251 OMX_U8
*pCurrBuf
= pInputStream
;
253 OMX_U32 width
, height
;
257 /* Sequence Layer Data Structure */
258 OMX_U8 const_C5
[4] = {0x00, 0x00, 0x00, 0xc5};
259 OMX_U8 const_04
[4] = {0x04, 0x00, 0x00, 0x00};
260 OMX_U8 const_0C
[4] = {0x0C, 0x00, 0x00, 0x00};
261 OMX_U8 struct_B_1
[4] = {0xB3, 0x19, 0x00, 0x00};
262 OMX_U8 struct_B_2
[4] = {0x44, 0x62, 0x05, 0x00};
263 OMX_U8 struct_B_3
[4] = {0x0F, 0x00, 0x00, 0x00};
264 OMX_U8 struct_C
[4] = {0x30, 0x00, 0x00, 0x00};
267 case WMV_FORMAT_WMV3
:
268 if (*pStreamSize
>= BITMAPINFOHEADER_SIZE
) {
269 BitmapInfoHhr
*pBitmapInfoHeader
;
270 pBitmapInfoHeader
= (BitmapInfoHhr
*)pInputStream
;
272 width
= pBitmapInfoHeader
->BiWidth
;
273 height
= pBitmapInfoHeader
->BiHeight
;
274 if (*pStreamSize
> BITMAPINFOHEADER_SIZE
)
275 Exynos_OSAL_Memcpy(struct_C
, pInputStream
+BITMAPINFOHEADER_SIZE
, 4);
277 Exynos_OSAL_Memcpy(pCurrBuf
+ currPos
, const_C5
, 4);
280 Exynos_OSAL_Memcpy(pCurrBuf
+ currPos
, const_04
, 4);
283 Exynos_OSAL_Memcpy(pCurrBuf
+ currPos
, struct_C
, 4);
286 /* struct_A : VERT_SIZE */
287 pCurrBuf
[currPos
] = height
& 0xFF;
288 pCurrBuf
[currPos
+1] = (height
>>8) & 0xFF;
289 pCurrBuf
[currPos
+2] = (height
>>16) & 0xFF;
290 pCurrBuf
[currPos
+3] = (height
>>24) & 0xFF;
293 /* struct_A : HORIZ_SIZE */
294 pCurrBuf
[currPos
] = width
& 0xFF;
295 pCurrBuf
[currPos
+1] = (width
>>8) & 0xFF;
296 pCurrBuf
[currPos
+2] = (width
>>16) & 0xFF;
297 pCurrBuf
[currPos
+3] = (width
>>24) & 0xFF;
300 Exynos_OSAL_Memcpy(pCurrBuf
+ currPos
,const_0C
, 4);
303 Exynos_OSAL_Memcpy(pCurrBuf
+ currPos
, struct_B_1
, 4);
306 Exynos_OSAL_Memcpy(pCurrBuf
+ currPos
, struct_B_2
, 4);
309 Exynos_OSAL_Memcpy(pCurrBuf
+ currPos
, struct_B_3
, 4);
312 *pStreamSize
= currPos
;
315 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: *pStreamSize is too small to contain metadata(%d)", __FUNCTION__
, *pStreamSize
);
320 if (*pStreamSize
>= BITMAPINFOHEADER_ASFBINDING_SIZE
) {
321 Exynos_OSAL_Memcpy(pCurrBuf
, pInputStream
+ BITMAPINFOHEADER_ASFBINDING_SIZE
, *pStreamSize
- BITMAPINFOHEADER_ASFBINDING_SIZE
);
322 *pStreamSize
-= BITMAPINFOHEADER_ASFBINDING_SIZE
;
325 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s: *pStreamSize is too small to contain metadata(%d)", __FUNCTION__
, *pStreamSize
);
330 Exynos_OSAL_Log(EXYNOS_LOG_WARNING
, "%s: It is not necessary to make bitstream metadata for wmvFormat (%d)", __FUNCTION__
, wmvFormat
);
336 static OMX_BOOL
Make_Stream_StartCode(
337 OMX_U8
*pInputStream
,
338 OMX_U32
*pStreamSize
,
339 WMV_FORMAT wmvFormat
)
341 OMX_U8 frameStartCode
[4] = {0x00, 0x00, 0x01, 0x0d};
342 #ifdef WMV3_ADDITIONAL_START_CODE
343 /* first 4 bytes : size of Frame, second 4 bytes : present Time stamp */
344 OMX_U8 frameStartCode2
[8] = {0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};
349 case WMV_FORMAT_WMV3
:
350 #ifdef WMV3_ADDITIONAL_START_CODE
351 Exynos_OSAL_Memmove(pInputStream
+8, pInputStream
, *pStreamSize
);
352 Exynos_OSAL_Memcpy(pInputStream
, frameStartCode2
, 8);
359 /* Should find better way to shift data */
360 Exynos_OSAL_Memmove(pInputStream
+4, pInputStream
, *pStreamSize
);
361 Exynos_OSAL_Memcpy(pInputStream
, frameStartCode
, 4);
367 Exynos_OSAL_Log(EXYNOS_LOG_WARNING
, "%s: undefined wmvFormat (%d)", __FUNCTION__
, wmvFormat
);
373 OMX_ERRORTYPE
WmvCodecOpen(EXYNOS_WMVDEC_HANDLE
*pWmvDec
)
375 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
376 ExynosVideoDecOps
*pDecOps
= NULL
;
377 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
378 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
382 if (pWmvDec
== NULL
) {
383 ret
= OMX_ErrorBadParameter
;
384 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, Line:%d", __LINE__
);
388 /* alloc ops structure */
389 pDecOps
= (ExynosVideoDecOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps
));
390 pInbufOps
= (ExynosVideoDecBufferOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps
));
391 pOutbufOps
= (ExynosVideoDecBufferOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps
));
393 if ((pDecOps
== NULL
) || (pInbufOps
== NULL
) || (pOutbufOps
== NULL
)) {
394 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to allocate decoder ops buffer");
395 ret
= OMX_ErrorInsufficientResources
;
399 pWmvDec
->hMFCWmvHandle
.pDecOps
= pDecOps
;
400 pWmvDec
->hMFCWmvHandle
.pInbufOps
= pInbufOps
;
401 pWmvDec
->hMFCWmvHandle
.pOutbufOps
= pOutbufOps
;
403 /* function pointer mapping */
404 pDecOps
->nSize
= sizeof(ExynosVideoDecOps
);
405 pInbufOps
->nSize
= sizeof(ExynosVideoDecBufferOps
);
406 pOutbufOps
->nSize
= sizeof(ExynosVideoDecBufferOps
);
408 Exynos_Video_Register_Decoder(pDecOps
, pInbufOps
, pOutbufOps
);
410 /* check mandatory functions for decoder ops */
411 if ((pDecOps
->Init
== NULL
) || (pDecOps
->Finalize
== NULL
) ||
412 (pDecOps
->Get_ActualBufferCount
== NULL
) || (pDecOps
->Set_FrameTag
== NULL
) ||
413 (pDecOps
->Get_FrameTag
== NULL
)) {
414 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Mandatory functions must be supplied");
415 ret
= OMX_ErrorInsufficientResources
;
419 /* check mandatory functions for buffer ops */
420 if ((pInbufOps
->Setup
== NULL
) || (pOutbufOps
->Setup
== NULL
) ||
421 (pInbufOps
->Run
== NULL
) || (pOutbufOps
->Run
== NULL
) ||
422 (pInbufOps
->Stop
== NULL
) || (pOutbufOps
->Stop
== NULL
) ||
423 (pInbufOps
->Enqueue
== NULL
) || (pOutbufOps
->Enqueue
== NULL
) ||
424 (pInbufOps
->Dequeue
== NULL
) || (pOutbufOps
->Dequeue
== NULL
)) {
425 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Mandatory functions must be supplied");
426 ret
= OMX_ErrorInsufficientResources
;
430 /* alloc context, open, querycap */
432 pWmvDec
->hMFCWmvHandle
.hMFCHandle
= pWmvDec
->hMFCWmvHandle
.pDecOps
->Init(V4L2_MEMORY_DMABUF
);
434 pWmvDec
->hMFCWmvHandle
.hMFCHandle
= pWmvDec
->hMFCWmvHandle
.pDecOps
->Init(V4L2_MEMORY_USERPTR
);
436 if (pWmvDec
->hMFCWmvHandle
.hMFCHandle
== NULL
) {
437 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to allocate context buffer");
438 ret
= OMX_ErrorInsufficientResources
;
445 if (ret
!= OMX_ErrorNone
) {
446 if (pDecOps
!= NULL
) {
447 Exynos_OSAL_Free(pDecOps
);
448 pWmvDec
->hMFCWmvHandle
.pDecOps
= NULL
;
450 if (pInbufOps
!= NULL
) {
451 Exynos_OSAL_Free(pInbufOps
);
452 pWmvDec
->hMFCWmvHandle
.pInbufOps
= NULL
;
454 if (pOutbufOps
!= NULL
) {
455 Exynos_OSAL_Free(pOutbufOps
);
456 pWmvDec
->hMFCWmvHandle
.pOutbufOps
= NULL
;
465 OMX_ERRORTYPE
WmvCodecClose(EXYNOS_WMVDEC_HANDLE
*pWmvDec
)
467 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
468 void *hMFCHandle
= NULL
;
469 ExynosVideoDecOps
*pDecOps
= NULL
;
470 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
471 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
475 if (pWmvDec
== NULL
) {
476 ret
= OMX_ErrorBadParameter
;
480 hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
481 pDecOps
= pWmvDec
->hMFCWmvHandle
.pDecOps
;
482 pInbufOps
= pWmvDec
->hMFCWmvHandle
.pInbufOps
;
483 pOutbufOps
= pWmvDec
->hMFCWmvHandle
.pOutbufOps
;
485 if (hMFCHandle
!= NULL
) {
486 pDecOps
->Finalize(hMFCHandle
);
487 pWmvDec
->hMFCWmvHandle
.hMFCHandle
= NULL
;
489 if (pOutbufOps
!= NULL
) {
490 Exynos_OSAL_Free(pOutbufOps
);
491 pWmvDec
->hMFCWmvHandle
.pOutbufOps
= NULL
;
493 if (pInbufOps
!= NULL
) {
494 Exynos_OSAL_Free(pInbufOps
);
495 pWmvDec
->hMFCWmvHandle
.pInbufOps
= NULL
;
497 if (pDecOps
!= NULL
) {
498 Exynos_OSAL_Free(pDecOps
);
499 pWmvDec
->hMFCWmvHandle
.pDecOps
= NULL
;
510 OMX_ERRORTYPE
WmvCodecStart(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
512 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
513 void *hMFCHandle
= NULL
;
514 ExynosVideoDecOps
*pDecOps
= NULL
;
515 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
516 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
517 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
518 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= NULL
;
522 if (pOMXComponent
== NULL
) {
523 ret
= OMX_ErrorBadParameter
;
527 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
528 if (pVideoDec
== NULL
) {
529 ret
= OMX_ErrorBadParameter
;
533 pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)pVideoDec
->hCodecHandle
;
534 if (pWmvDec
== NULL
) {
535 ret
= OMX_ErrorBadParameter
;
539 hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
540 pDecOps
= pWmvDec
->hMFCWmvHandle
.pDecOps
;
541 pInbufOps
= pWmvDec
->hMFCWmvHandle
.pInbufOps
;
542 pOutbufOps
= pWmvDec
->hMFCWmvHandle
.pOutbufOps
;
544 if (nPortIndex
== INPUT_PORT_INDEX
)
545 pInbufOps
->Run(hMFCHandle
);
546 else if (nPortIndex
== OUTPUT_PORT_INDEX
)
547 pOutbufOps
->Run(hMFCHandle
);
557 OMX_ERRORTYPE
WmvCodecStop(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
559 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
560 void *hMFCHandle
= NULL
;
561 ExynosVideoDecOps
*pDecOps
= NULL
;
562 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
563 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
564 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
565 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= NULL
;
569 if (pOMXComponent
== NULL
) {
570 ret
= OMX_ErrorBadParameter
;
574 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
575 if (pVideoDec
== NULL
) {
576 ret
= OMX_ErrorBadParameter
;
579 pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)pVideoDec
->hCodecHandle
;
580 if (pWmvDec
== NULL
) {
581 ret
= OMX_ErrorBadParameter
;
585 hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
586 pDecOps
= pWmvDec
->hMFCWmvHandle
.pDecOps
;
587 pInbufOps
= pWmvDec
->hMFCWmvHandle
.pInbufOps
;
588 pOutbufOps
= pWmvDec
->hMFCWmvHandle
.pOutbufOps
;
590 if ((nPortIndex
== INPUT_PORT_INDEX
) && (pInbufOps
!= NULL
))
591 pInbufOps
->Stop(hMFCHandle
);
592 else if ((nPortIndex
== OUTPUT_PORT_INDEX
) && (pOutbufOps
!= NULL
))
593 pOutbufOps
->Stop(hMFCHandle
);
603 OMX_ERRORTYPE
WmvCodecOutputBufferProcessRun(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
605 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
606 void *hMFCHandle
= NULL
;
607 ExynosVideoDecOps
*pDecOps
= NULL
;
608 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
609 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
610 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
611 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= NULL
;
615 if (pOMXComponent
== NULL
) {
616 ret
= OMX_ErrorBadParameter
;
620 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
621 if (pVideoDec
== NULL
) {
622 ret
= OMX_ErrorBadParameter
;
625 pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)pVideoDec
->hCodecHandle
;
626 if (pWmvDec
== NULL
) {
627 ret
= OMX_ErrorBadParameter
;
631 hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
632 pDecOps
= pWmvDec
->hMFCWmvHandle
.pDecOps
;
633 pInbufOps
= pWmvDec
->hMFCWmvHandle
.pInbufOps
;
634 pOutbufOps
= pWmvDec
->hMFCWmvHandle
.pOutbufOps
;
636 if (nPortIndex
== INPUT_PORT_INDEX
) {
637 if (pWmvDec
->bSourceStart
== OMX_FALSE
) {
638 Exynos_OSAL_SignalSet(pWmvDec
->hSourceStartEvent
);
639 Exynos_OSAL_SleepMillisec(0);
643 if (nPortIndex
== OUTPUT_PORT_INDEX
) {
644 if (pWmvDec
->bDestinationStart
== OMX_FALSE
) {
645 Exynos_OSAL_SignalSet(pWmvDec
->hDestinationStartEvent
);
646 Exynos_OSAL_SleepMillisec(0);
658 OMX_ERRORTYPE
WMVCodecRegistCodecBuffers(
659 OMX_COMPONENTTYPE
*pOMXComponent
,
663 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
664 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
665 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
666 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
667 void *hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
668 CODEC_DEC_BUFFER
**ppCodecBuffer
= NULL
;
669 ExynosVideoDecBufferOps
*pBufOps
= NULL
;
670 ExynosVideoPlane
*pPlanes
= NULL
;
672 OMX_U32 nPlaneCnt
= 0;
677 if (nPortIndex
== INPUT_PORT_INDEX
) {
678 ppCodecBuffer
= &(pVideoDec
->pMFCDecInputBuffer
[0]);
679 pBufOps
= pWmvDec
->hMFCWmvHandle
.pInbufOps
;
681 ppCodecBuffer
= &(pVideoDec
->pMFCDecOutputBuffer
[0]);
682 pBufOps
= pWmvDec
->hMFCWmvHandle
.pOutbufOps
;
684 nPlaneCnt
= pExynosComponent
->pExynosPort
[nPortIndex
].nPlaneCnt
;
686 pPlanes
= (ExynosVideoPlane
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoPlane
) * nPlaneCnt
);
687 if (pPlanes
== NULL
) {
688 ret
= OMX_ErrorInsufficientResources
;
692 /* Register buffer */
693 for (i
= 0; i
< nBufferCnt
; i
++) {
694 for (j
= 0; j
< nPlaneCnt
; j
++) {
695 pPlanes
[j
].addr
= ppCodecBuffer
[i
]->pVirAddr
[j
];
696 pPlanes
[j
].fd
= ppCodecBuffer
[i
]->fd
[j
];
697 pPlanes
[j
].allocSize
= ppCodecBuffer
[i
]->bufferSize
[j
];
700 if (pBufOps
->Register(hMFCHandle
, pPlanes
, nPlaneCnt
) != VIDEO_ERROR_NONE
) {
701 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "PORT[%d]: Failed to Register buffer", nPortIndex
);
702 ret
= OMX_ErrorInsufficientResources
;
703 Exynos_OSAL_Free(pPlanes
);
708 Exynos_OSAL_Free(pPlanes
);
718 OMX_ERRORTYPE
WmvCodecEnQueueAllBuffer(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
720 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
721 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
722 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
723 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
724 void *hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
725 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
726 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
729 ExynosVideoDecOps
*pDecOps
= pWmvDec
->hMFCWmvHandle
.pDecOps
;
730 ExynosVideoDecBufferOps
*pInbufOps
= pWmvDec
->hMFCWmvHandle
.pInbufOps
;
731 ExynosVideoDecBufferOps
*pOutbufOps
= pWmvDec
->hMFCWmvHandle
.pOutbufOps
;
735 if ((nPortIndex
!= INPUT_PORT_INDEX
) && (nPortIndex
!= OUTPUT_PORT_INDEX
)) {
736 ret
= OMX_ErrorBadPortIndex
;
740 if ((nPortIndex
== INPUT_PORT_INDEX
) &&
741 (pWmvDec
->bSourceStart
== OMX_TRUE
)) {
742 Exynos_CodecBufferReset(pExynosComponent
, INPUT_PORT_INDEX
);
744 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++) {
745 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i
, pVideoDec
->pMFCDecInputBuffer
[i
]);
746 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i
, pVideoDec
->pMFCDecInputBuffer
[i
]->pVirAddr
[0]);
748 Exynos_CodecBufferEnQueue(pExynosComponent
, INPUT_PORT_INDEX
, pVideoDec
->pMFCDecInputBuffer
[i
]);
751 pInbufOps
->Clear_Queue(hMFCHandle
);
752 } else if ((nPortIndex
== OUTPUT_PORT_INDEX
) &&
753 (pWmvDec
->bDestinationStart
== OMX_TRUE
)) {
754 Exynos_CodecBufferReset(pExynosComponent
, OUTPUT_PORT_INDEX
);
756 for (i
= 0; i
< pWmvDec
->hMFCWmvHandle
.maxDPBNum
; i
++) {
757 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecOutputBuffer[%d]: 0x%x", i
, pVideoDec
->pMFCDecOutputBuffer
[i
]);
758 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecOutputBuffer[%d]->pVirAddr[0]: 0x%x", i
, pVideoDec
->pMFCDecOutputBuffer
[i
]->pVirAddr
[0]);
760 Exynos_CodecBufferEnQueue(pExynosComponent
, OUTPUT_PORT_INDEX
, pVideoDec
->pMFCDecOutputBuffer
[i
]);
762 pOutbufOps
->Clear_Queue(hMFCHandle
);
771 OMX_ERRORTYPE
WmvCodecSrcSetup(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
773 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
774 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
775 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
776 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
777 void *hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
778 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
779 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
780 OMX_U32 oneFrameSize
= pSrcInputData
->dataLen
;
781 OMX_BOOL bMetaData
= OMX_FALSE
;
783 ExynosVideoDecOps
*pDecOps
= pWmvDec
->hMFCWmvHandle
.pDecOps
;
784 ExynosVideoDecBufferOps
*pInbufOps
= pWmvDec
->hMFCWmvHandle
.pInbufOps
;
785 ExynosVideoDecBufferOps
*pOutbufOps
= pWmvDec
->hMFCWmvHandle
.pOutbufOps
;
786 ExynosVideoGeometry bufferConf
;
787 OMX_U32 inputBufferNumber
= 0;
792 if ((oneFrameSize
<= 0) && (pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
)) {
793 BYPASS_BUFFER_INFO
*pBufferInfo
= (BYPASS_BUFFER_INFO
*)Exynos_OSAL_Malloc(sizeof(BYPASS_BUFFER_INFO
));
794 if (pBufferInfo
== NULL
) {
795 ret
= OMX_ErrorInsufficientResources
;
799 pBufferInfo
->nFlags
= pSrcInputData
->nFlags
;
800 pBufferInfo
->timeStamp
= pSrcInputData
->timeStamp
;
801 ret
= Exynos_OSAL_Queue(&pWmvDec
->bypassBufferInfoQ
, (void *)pBufferInfo
);
802 Exynos_OSAL_SignalSet(pWmvDec
->hDestinationStartEvent
);
808 if (pVideoDec
->bThumbnailMode
== OMX_TRUE
)
809 pDecOps
->Set_DisplayDelay(hMFCHandle
, 0);
811 if ((pDecOps
->Enable_DTSMode
!= NULL
) &&
812 (pVideoDec
->bDTSMode
== OMX_TRUE
))
813 pDecOps
->Enable_DTSMode(hMFCHandle
);
815 if (pSrcInputData
->nFlags
& OMX_BUFFERFLAG_CODECCONFIG
) {
816 BitmapInfoHhr
*pBitmapInfoHeader
;
817 pBitmapInfoHeader
= (BitmapInfoHhr
*)pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
;
818 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "OMX_BUFFERFLAG_CODECCONFIG");
819 if (pBitmapInfoHeader
->BiCompression
== wmv3
) {
820 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "WMV_FORMAT_WMV3");
821 pWmvDec
->hMFCWmvHandle
.wmvFormat
= WMV_FORMAT_WMV3
;
822 } else if ((pBitmapInfoHeader
->BiCompression
== wvc1
) || (pBitmapInfoHeader
->BiCompression
== wmva
)) {
823 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "WMV_FORMAT_VC1");
824 pWmvDec
->hMFCWmvHandle
.wmvFormat
= WMV_FORMAT_VC1
;
828 /* input buffer info */
829 Exynos_OSAL_Memset(&bufferConf
, 0, sizeof(bufferConf
));
830 if (pWmvDec
->hMFCWmvHandle
.wmvFormat
== WMV_FORMAT_WMV3
) {
831 bufferConf
.eCompressionFormat
= VIDEO_CODING_VC1_RCV
;
832 } else if (pWmvDec
->hMFCWmvHandle
.wmvFormat
== WMV_FORMAT_VC1
) {
833 bufferConf
.eCompressionFormat
= VIDEO_CODING_VC1
;
835 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Unsupported WMV Codec Format Type");
836 ret
= OMX_ErrorUndefined
;
840 pInbufOps
->Set_Shareable(hMFCHandle
);
841 if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
842 bufferConf
.nSizeImage
= pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
843 * pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
* 3 / 2;
844 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
845 bufferConf
.nSizeImage
= DEFAULT_MFC_INPUT_BUFFER_SIZE
;
847 bufferConf
.nPlaneCnt
= pExynosInputPort
->nPlaneCnt
;
848 inputBufferNumber
= MAX_INPUTBUFFER_NUM_DYNAMIC
;
850 /* should be done before prepare input buffer */
851 if (pInbufOps
->Enable_Cacheable(hMFCHandle
) != VIDEO_ERROR_NONE
) {
852 ret
= OMX_ErrorInsufficientResources
;
856 /* set input buffer geometry */
857 if (pInbufOps
->Set_Geometry(hMFCHandle
, &bufferConf
) != VIDEO_ERROR_NONE
) {
858 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for input buffer");
859 ret
= OMX_ErrorInsufficientResources
;
863 /* setup input buffer */
864 if (pInbufOps
->Setup(hMFCHandle
, inputBufferNumber
) != VIDEO_ERROR_NONE
) {
865 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup input buffer");
866 ret
= OMX_ErrorInsufficientResources
;
870 /* set output geometry */
871 Exynos_OSAL_Memset(&bufferConf
, 0, sizeof(bufferConf
));
873 #ifdef USE_DUALDPB_MODE
874 switch (pExynosOutputPort
->portDefinition
.format
.video
.eColorFormat
) {
875 case OMX_COLOR_FormatYUV420SemiPlanar
:
876 bufferConf
.eColorFormat
= VIDEO_COLORFORMAT_NV12
;
878 case OMX_COLOR_FormatYUV420Planar
:
879 bufferConf
.eColorFormat
= VIDEO_COLORFORMAT_I420
;
881 case OMX_SEC_COLOR_FormatYVU420Planar
:
882 bufferConf
.eColorFormat
= VIDEO_COLORFORMAT_YV12
;
884 case OMX_SEC_COLOR_FormatNV21Linear
:
885 bufferConf
.eColorFormat
= VIDEO_COLORFORMAT_NV21
;
887 case OMX_SEC_COLOR_FormatNV12Tiled
:
888 bufferConf
.eColorFormat
= VIDEO_COLORFORMAT_NV12_TILED
;
891 bufferConf
.eColorFormat
= VIDEO_COLORFORMAT_NV12_TILED
;
895 if (bufferConf
.eColorFormat
!= VIDEO_COLORFORMAT_NV12_TILED
) {
896 if ((pDecOps
->Enable_DualDPBMode
!= NULL
) &&
897 (pDecOps
->Enable_DualDPBMode(hMFCHandle
) == VIDEO_ERROR_NONE
)) {
898 pVideoDec
->bDualDPBMode
= OMX_TRUE
;
899 pExynosOutputPort
->nPlaneCnt
= Exynos_OSAL_GetPlaneCount(pExynosOutputPort
->portDefinition
.format
.video
.eColorFormat
);
901 bufferConf
.eColorFormat
= VIDEO_COLORFORMAT_NV12_TILED
;
902 pExynosOutputPort
->nPlaneCnt
= MFC_DEFAULT_OUTPUT_BUFFER_PLANE
;
905 pWmvDec
->hMFCWmvHandle
.MFCOutputColorType
= bufferConf
.eColorFormat
;
907 pWmvDec
->hMFCWmvHandle
.MFCOutputColorType
= bufferConf
.eColorFormat
= VIDEO_COLORFORMAT_NV12_TILED
;
909 bufferConf
.nPlaneCnt
= pExynosOutputPort
->nPlaneCnt
;
910 if (pOutbufOps
->Set_Geometry(hMFCHandle
, &bufferConf
) != VIDEO_ERROR_NONE
) {
911 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for output buffer");
912 ret
= OMX_ErrorInsufficientResources
;
916 bMetaData
= Make_Stream_MetaData(pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
, &oneFrameSize
, pWmvDec
->hMFCWmvHandle
.wmvFormat
);
917 if (bMetaData
== OMX_FALSE
) {
918 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Fail to Make Stream MetaData");
919 ret
= OMX_ErrorInsufficientResources
;
923 /* input buffer enqueue for header parsing */
924 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "oneFrameSize: %d", oneFrameSize
);
925 OMX_U32 nAllocLen
[MAX_BUFFER_PLANE
] = {pSrcInputData
->bufferHeader
->nAllocLen
, 0, 0};
926 if (pInbufOps
->ExtensionEnqueue(hMFCHandle
,
927 (unsigned char **)&pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
,
928 (unsigned char **)&pSrcInputData
->buffer
.singlePlaneBuffer
.fd
,
929 (unsigned int *)nAllocLen
, (unsigned int *)&oneFrameSize
,
930 pExynosInputPort
->nPlaneCnt
, pSrcInputData
->bufferHeader
) != VIDEO_ERROR_NONE
) {
931 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to enqueue input buffer for header parsing");
932 // ret = OMX_ErrorInsufficientResources;
933 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecInit
;
937 /* start header parsing */
938 if (pInbufOps
->Run(hMFCHandle
) != VIDEO_ERROR_NONE
) {
939 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to run input buffer for header parsing");
940 ret
= OMX_ErrorCodecInit
;
944 /* get geometry for output */
945 Exynos_OSAL_Memset(&pWmvDec
->hMFCWmvHandle
.codecOutbufConf
, 0, sizeof(ExynosVideoGeometry
));
946 if (pOutbufOps
->Get_Geometry(hMFCHandle
, &pWmvDec
->hMFCWmvHandle
.codecOutbufConf
) != VIDEO_ERROR_NONE
) {
947 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to get geometry for parsed header info");
948 WmvCodecStop(pOMXComponent
, INPUT_PORT_INDEX
);
949 pInbufOps
->Cleanup_Buffer(hMFCHandle
);
950 ret
= OMX_ErrorInsufficientResources
;
955 pWmvDec
->hMFCWmvHandle
.maxDPBNum
= pDecOps
->Get_ActualBufferCount(hMFCHandle
);
956 if (pVideoDec
->bThumbnailMode
== OMX_FALSE
)
957 pWmvDec
->hMFCWmvHandle
.maxDPBNum
+= EXTRA_DPB_NUM
;
958 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "WmvCodecSetup nOutbufs: %d", pWmvDec
->hMFCWmvHandle
.maxDPBNum
);
960 pWmvDec
->hMFCWmvHandle
.bConfiguredMFCSrc
= OMX_TRUE
;
962 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
963 if ((pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
!= pWmvDec
->hMFCWmvHandle
.codecOutbufConf
.nFrameWidth
) ||
964 (pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
!= pWmvDec
->hMFCWmvHandle
.codecOutbufConf
.nFrameHeight
)) {
965 pExynosOutputPort
->exceptionFlag
= NEED_PORT_DISABLE
;
967 pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
= pWmvDec
->hMFCWmvHandle
.codecOutbufConf
.nFrameWidth
;
968 pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
= pWmvDec
->hMFCWmvHandle
.codecOutbufConf
.nFrameHeight
;
969 pExynosInputPort
->portDefinition
.format
.video
.nStride
= ((pWmvDec
->hMFCWmvHandle
.codecOutbufConf
.nFrameWidth
+ 15) & (~15));
970 pExynosInputPort
->portDefinition
.format
.video
.nSliceHeight
= ((pWmvDec
->hMFCWmvHandle
.codecOutbufConf
.nFrameHeight
+ 15) & (~15));
972 Exynos_UpdateFrameSize(pOMXComponent
);
974 /** Send Port Settings changed call back **/
975 (*(pExynosComponent
->pCallbacks
->EventHandler
))
977 pExynosComponent
->callbackData
,
978 OMX_EventPortSettingsChanged
, /* The command was completed */
979 OMX_DirOutput
, /* This is the port index */
983 } else if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
984 if ((pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
!= pWmvDec
->hMFCWmvHandle
.codecOutbufConf
.nFrameWidth
) ||
985 (pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
!= pWmvDec
->hMFCWmvHandle
.codecOutbufConf
.nFrameHeight
) ||
986 (pExynosOutputPort
->portDefinition
.nBufferCountActual
!= pWmvDec
->hMFCWmvHandle
.maxDPBNum
)) {
987 pExynosOutputPort
->exceptionFlag
= NEED_PORT_DISABLE
;
989 pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
= pWmvDec
->hMFCWmvHandle
.codecOutbufConf
.nFrameWidth
;
990 pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
= pWmvDec
->hMFCWmvHandle
.codecOutbufConf
.nFrameHeight
;
991 pExynosInputPort
->portDefinition
.format
.video
.nStride
= ((pWmvDec
->hMFCWmvHandle
.codecOutbufConf
.nFrameWidth
+ 15) & (~15));
992 pExynosInputPort
->portDefinition
.format
.video
.nSliceHeight
= ((pWmvDec
->hMFCWmvHandle
.codecOutbufConf
.nFrameHeight
+ 15) & (~15));
994 pExynosOutputPort
->portDefinition
.nBufferCountActual
= pWmvDec
->hMFCWmvHandle
.maxDPBNum
- 2;
995 pExynosOutputPort
->portDefinition
.nBufferCountMin
= pWmvDec
->hMFCWmvHandle
.maxDPBNum
- 2;
997 Exynos_UpdateFrameSize(pOMXComponent
);
999 /** Send Port Settings changed call back **/
1000 (*(pExynosComponent
->pCallbacks
->EventHandler
))
1002 pExynosComponent
->callbackData
,
1003 OMX_EventPortSettingsChanged
, /* The command was completed */
1004 OMX_DirOutput
, /* This is the port index */
1009 Exynos_OSAL_SleepMillisec(0);
1010 ret
= OMX_ErrorInputDataDecodeYet
;
1011 WmvCodecStop(pOMXComponent
, INPUT_PORT_INDEX
);
1019 OMX_ERRORTYPE
WmvCodecDstSetup(OMX_COMPONENTTYPE
*pOMXComponent
)
1021 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1022 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1023 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1024 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1025 void *hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
1026 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1027 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1029 ExynosVideoDecOps
*pDecOps
= pWmvDec
->hMFCWmvHandle
.pDecOps
;
1030 ExynosVideoDecBufferOps
*pInbufOps
= pWmvDec
->hMFCWmvHandle
.pInbufOps
;
1031 ExynosVideoDecBufferOps
*pOutbufOps
= pWmvDec
->hMFCWmvHandle
.pOutbufOps
;
1035 OMX_U32 nAllocLen
[MAX_BUFFER_PLANE
] = {0, 0, 0};
1036 OMX_U32 dataLen
[MAX_BUFFER_PLANE
] = {0, 0, 0};
1040 for (i
= 0; i
< pExynosOutputPort
->nPlaneCnt
; i
++)
1041 nAllocLen
[i
] = pWmvDec
->hMFCWmvHandle
.codecOutbufConf
.nAlignPlaneSize
[i
];
1043 pOutbufOps
->Set_Shareable(hMFCHandle
);
1045 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1046 /* should be done before prepare output buffer */
1047 if (pOutbufOps
->Enable_Cacheable(hMFCHandle
) != VIDEO_ERROR_NONE
) {
1048 ret
= OMX_ErrorInsufficientResources
;
1053 nOutbufs
= pWmvDec
->hMFCWmvHandle
.maxDPBNum
;
1054 if (pOutbufOps
->Setup(hMFCHandle
, nOutbufs
) != VIDEO_ERROR_NONE
) {
1055 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup output buffer");
1056 ret
= OMX_ErrorInsufficientResources
;
1060 ret
= Exynos_Allocate_CodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
, nOutbufs
, nAllocLen
);
1061 if (ret
!= OMX_ErrorNone
)
1064 ret
= WMVCodecRegistCodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
, nOutbufs
);
1065 if (ret
!= OMX_ErrorNone
)
1068 /* Enqueue output buffer */
1069 for (i
= 0; i
< nOutbufs
; i
++) {
1070 pOutbufOps
->Enqueue(hMFCHandle
, (unsigned char **)pVideoDec
->pMFCDecOutputBuffer
[i
]->pVirAddr
,
1071 (unsigned int *)dataLen
, pExynosOutputPort
->nPlaneCnt
, NULL
);
1074 if (pOutbufOps
->Run(hMFCHandle
) != VIDEO_ERROR_NONE
) {
1075 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to run output buffer");
1076 ret
= OMX_ErrorInsufficientResources
;
1079 } else if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
1080 ExynosVideoPlane planes
[MAX_BUFFER_PLANE
] = {0, 0, 0};
1084 nOutbufs
= pExynosOutputPort
->portDefinition
.nBufferCountActual
;
1085 if (pOutbufOps
->Setup(hMFCHandle
, nOutbufs
) != VIDEO_ERROR_NONE
) {
1086 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup output buffer");
1087 ret
= OMX_ErrorInsufficientResources
;
1091 /* Register output buffer */
1096 if (pExynosOutputPort
->bIsANBEnabled
== OMX_TRUE
) {
1097 for (i
= 0; i
< pExynosOutputPort
->assignedBufferNum
; i
++) {
1098 for (plane
= 0; plane
< pExynosOutputPort
->nPlaneCnt
; plane
++) {
1099 planes
[plane
].fd
= pExynosOutputPort
->extendBufferHeader
[i
].buf_fd
[plane
];
1100 planes
[plane
].addr
= pExynosOutputPort
->extendBufferHeader
[i
].pYUVBuf
[plane
];
1101 planes
[plane
].allocSize
= nAllocLen
[plane
];
1104 if (pOutbufOps
->Register(hMFCHandle
, planes
, pExynosOutputPort
->nPlaneCnt
) != VIDEO_ERROR_NONE
) {
1105 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Register output buffer");
1106 ret
= OMX_ErrorInsufficientResources
;
1109 pOutbufOps
->Enqueue(hMFCHandle
, (unsigned char **)pExynosOutputPort
->extendBufferHeader
[i
].pYUVBuf
,
1110 (unsigned int *)dataLen
, pExynosOutputPort
->nPlaneCnt
, NULL
);
1113 if (pOutbufOps
->Apply_RegisteredBuffer(hMFCHandle
) != VIDEO_ERROR_NONE
) {
1114 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Apply output buffer");
1115 ret
= OMX_ErrorHardware
;
1119 ret
= OMX_ErrorNotImplemented
;
1123 ret
= OMX_ErrorNotImplemented
;
1128 pWmvDec
->hMFCWmvHandle
.bConfiguredMFCDst
= OMX_TRUE
;
1130 ret
= OMX_ErrorNone
;
1138 OMX_ERRORTYPE
Exynos_WmvDec_GetParameter(
1139 OMX_IN OMX_HANDLETYPE hComponent
,
1140 OMX_IN OMX_INDEXTYPE nParamIndex
,
1141 OMX_INOUT OMX_PTR pComponentParameterStructure
)
1143 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1144 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1145 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1149 if (hComponent
== NULL
|| pComponentParameterStructure
== NULL
) {
1150 ret
= OMX_ErrorBadParameter
;
1153 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1154 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1155 if (ret
!= OMX_ErrorNone
) {
1158 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1159 ret
= OMX_ErrorBadParameter
;
1163 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1164 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1165 ret
= OMX_ErrorInvalidState
;
1169 switch (nParamIndex
) {
1170 case OMX_IndexParamVideoWmv
:
1172 OMX_VIDEO_PARAM_WMVTYPE
*pDstWmvParam
= (OMX_VIDEO_PARAM_WMVTYPE
*)pComponentParameterStructure
;
1173 OMX_VIDEO_PARAM_WMVTYPE
*pSrcWmvParam
= NULL
;
1174 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= NULL
;
1175 ret
= Exynos_OMX_Check_SizeVersion(pDstWmvParam
, sizeof(OMX_VIDEO_PARAM_WMVTYPE
));
1176 if (ret
!= OMX_ErrorNone
) {
1180 if (pDstWmvParam
->nPortIndex
> OUTPUT_PORT_INDEX
) {
1181 ret
= OMX_ErrorBadPortIndex
;
1185 pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1186 pSrcWmvParam
= &pWmvDec
->WmvComponent
[pDstWmvParam
->nPortIndex
];
1188 Exynos_OSAL_Memcpy(pDstWmvParam
, pSrcWmvParam
, sizeof(OMX_VIDEO_PARAM_WMVTYPE
));
1192 case OMX_IndexParamStandardComponentRole
:
1194 OMX_PARAM_COMPONENTROLETYPE
*pComponentRole
= (OMX_PARAM_COMPONENTROLETYPE
*)pComponentParameterStructure
;
1195 ret
= Exynos_OMX_Check_SizeVersion(pComponentRole
, sizeof(OMX_PARAM_COMPONENTROLETYPE
));
1196 if (ret
!= OMX_ErrorNone
) {
1200 Exynos_OSAL_Strcpy((char *)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_WMV_DEC_ROLE
);
1203 case OMX_IndexParamVideoErrorCorrection
:
1205 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pDstErrorCorrectionType
= (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*)pComponentParameterStructure
;
1206 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pSrcErrorCorrectionType
= NULL
;
1207 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= NULL
;
1209 ret
= Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType
, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
));
1210 if (ret
!= OMX_ErrorNone
) {
1214 if (pDstErrorCorrectionType
->nPortIndex
!= INPUT_PORT_INDEX
) {
1215 ret
= OMX_ErrorBadPortIndex
;
1219 pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1220 pSrcErrorCorrectionType
= &pWmvDec
->errorCorrectionType
[INPUT_PORT_INDEX
];
1222 pDstErrorCorrectionType
->bEnableHEC
= pSrcErrorCorrectionType
->bEnableHEC
;
1223 pDstErrorCorrectionType
->bEnableResync
= pSrcErrorCorrectionType
->bEnableResync
;
1224 pDstErrorCorrectionType
->nResynchMarkerSpacing
= pSrcErrorCorrectionType
->nResynchMarkerSpacing
;
1225 pDstErrorCorrectionType
->bEnableDataPartitioning
= pSrcErrorCorrectionType
->bEnableDataPartitioning
;
1226 pDstErrorCorrectionType
->bEnableRVLC
= pSrcErrorCorrectionType
->bEnableRVLC
;
1230 ret
= Exynos_OMX_VideoDecodeGetParameter(hComponent
, nParamIndex
, pComponentParameterStructure
);
1239 OMX_ERRORTYPE
Exynos_WmvDec_SetParameter(
1240 OMX_IN OMX_HANDLETYPE hComponent
,
1241 OMX_IN OMX_INDEXTYPE nIndex
,
1242 OMX_IN OMX_PTR pComponentParameterStructure
)
1244 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1245 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1246 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1250 if (hComponent
== NULL
|| pComponentParameterStructure
== NULL
) {
1251 ret
= OMX_ErrorBadParameter
;
1254 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1255 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1256 if (ret
!= OMX_ErrorNone
) {
1259 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1260 ret
= OMX_ErrorBadParameter
;
1264 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1265 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1266 ret
= OMX_ErrorInvalidState
;
1271 case OMX_IndexParamVideoWmv
:
1273 OMX_VIDEO_PARAM_WMVTYPE
*pDstWmvParam
= NULL
;
1274 OMX_VIDEO_PARAM_WMVTYPE
*pSrcWmvParam
= (OMX_VIDEO_PARAM_WMVTYPE
*)pComponentParameterStructure
;
1275 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= NULL
;
1276 ret
= Exynos_OMX_Check_SizeVersion(pSrcWmvParam
, sizeof(OMX_VIDEO_PARAM_WMVTYPE
));
1277 if (ret
!= OMX_ErrorNone
) {
1281 if (pSrcWmvParam
->nPortIndex
> OUTPUT_PORT_INDEX
) {
1282 ret
= OMX_ErrorBadPortIndex
;
1286 pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1287 pDstWmvParam
= &pWmvDec
->WmvComponent
[pSrcWmvParam
->nPortIndex
];
1289 Exynos_OSAL_Memcpy(pDstWmvParam
, pSrcWmvParam
, sizeof(OMX_VIDEO_PARAM_WMVTYPE
));
1292 case OMX_IndexParamStandardComponentRole
:
1294 OMX_PARAM_COMPONENTROLETYPE
*pComponentRole
= (OMX_PARAM_COMPONENTROLETYPE
*)pComponentParameterStructure
;
1296 ret
= Exynos_OMX_Check_SizeVersion(pComponentRole
, sizeof(OMX_PARAM_COMPONENTROLETYPE
));
1297 if (ret
!= OMX_ErrorNone
) {
1301 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) && (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
1302 ret
= OMX_ErrorIncorrectStateOperation
;
1306 if (!Exynos_OSAL_Strcmp((char*)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_WMV_DEC_ROLE
)) {
1307 pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingWMV
;
1309 ret
= OMX_ErrorBadParameter
;
1314 case OMX_IndexParamVideoErrorCorrection
:
1316 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pSrcErrorCorrectionType
= (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*)pComponentParameterStructure
;
1317 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pDstErrorCorrectionType
= NULL
;
1318 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= NULL
;
1320 ret
= Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType
, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
));
1321 if (ret
!= OMX_ErrorNone
) {
1325 if (pSrcErrorCorrectionType
->nPortIndex
!= INPUT_PORT_INDEX
) {
1326 ret
= OMX_ErrorBadPortIndex
;
1330 pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1331 pDstErrorCorrectionType
= &pWmvDec
->errorCorrectionType
[INPUT_PORT_INDEX
];
1333 pDstErrorCorrectionType
->bEnableHEC
= pSrcErrorCorrectionType
->bEnableHEC
;
1334 pDstErrorCorrectionType
->bEnableResync
= pSrcErrorCorrectionType
->bEnableResync
;
1335 pDstErrorCorrectionType
->nResynchMarkerSpacing
= pSrcErrorCorrectionType
->nResynchMarkerSpacing
;
1336 pDstErrorCorrectionType
->bEnableDataPartitioning
= pSrcErrorCorrectionType
->bEnableDataPartitioning
;
1337 pDstErrorCorrectionType
->bEnableRVLC
= pSrcErrorCorrectionType
->bEnableRVLC
;
1341 ret
= Exynos_OMX_VideoDecodeSetParameter(hComponent
, nIndex
, pComponentParameterStructure
);
1350 OMX_ERRORTYPE
Exynos_WmvDec_GetConfig(
1351 OMX_HANDLETYPE hComponent
,
1352 OMX_INDEXTYPE nIndex
,
1353 OMX_PTR pComponentConfigStructure
)
1355 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1356 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1357 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1361 if (hComponent
== NULL
|| pComponentConfigStructure
== NULL
) {
1362 ret
= OMX_ErrorBadParameter
;
1365 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1366 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1367 if (ret
!= OMX_ErrorNone
) {
1370 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1371 ret
= OMX_ErrorBadParameter
;
1374 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1375 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1376 ret
= OMX_ErrorInvalidState
;
1382 ret
= Exynos_OMX_VideoDecodeGetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1392 OMX_ERRORTYPE
Exynos_WmvDec_SetConfig(
1393 OMX_HANDLETYPE hComponent
,
1394 OMX_INDEXTYPE nIndex
,
1395 OMX_PTR pComponentConfigStructure
)
1397 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1398 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1399 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1403 if (hComponent
== NULL
|| pComponentConfigStructure
== NULL
) {
1404 ret
= OMX_ErrorBadParameter
;
1407 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1408 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1409 if (ret
!= OMX_ErrorNone
) {
1412 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1413 ret
= OMX_ErrorBadParameter
;
1416 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1417 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1418 ret
= OMX_ErrorInvalidState
;
1424 ret
= Exynos_OMX_VideoDecodeSetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1434 OMX_ERRORTYPE
Exynos_WmvDec_GetExtensionIndex(
1435 OMX_IN OMX_HANDLETYPE hComponent
,
1436 OMX_IN OMX_STRING cParameterName
,
1437 OMX_OUT OMX_INDEXTYPE
*pIndexType
)
1439 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1440 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1441 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1445 if (hComponent
== NULL
) {
1446 ret
= OMX_ErrorBadParameter
;
1449 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1450 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1451 if (ret
!= OMX_ErrorNone
) {
1454 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1455 ret
= OMX_ErrorBadParameter
;
1458 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1459 if ((cParameterName
== NULL
) || (pIndexType
== NULL
)) {
1460 ret
= OMX_ErrorBadParameter
;
1463 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1464 ret
= OMX_ErrorInvalidState
;
1468 if (Exynos_OSAL_Strcmp(cParameterName
, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL
) == 0) {
1469 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1470 *pIndexType
= OMX_IndexParamEnableThumbnailMode
;
1471 ret
= OMX_ErrorNone
;
1473 ret
= Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent
, cParameterName
, pIndexType
);
1482 OMX_ERRORTYPE
Exynos_WmvDec_ComponentRoleEnum(
1483 OMX_HANDLETYPE hComponent
,
1487 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1488 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1489 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1493 if ((hComponent
== NULL
) || (cRole
== NULL
)) {
1494 ret
= OMX_ErrorBadParameter
;
1497 if (nIndex
== (MAX_COMPONENT_ROLE_NUM
-1)) {
1498 Exynos_OSAL_Strcpy((char *)cRole
, EXYNOS_OMX_COMPONENT_WMV_DEC_ROLE
);
1499 ret
= OMX_ErrorNone
;
1501 ret
= OMX_ErrorNoMore
;
1511 OMX_ERRORTYPE
Exynos_WmvDec_Init(OMX_COMPONENTTYPE
*pOMXComponent
)
1513 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1514 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1515 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1516 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1517 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1518 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)pVideoDec
->hCodecHandle
;
1519 OMX_PTR hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
1521 ExynosVideoDecOps
*pDecOps
= NULL
;
1522 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
1523 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
1525 CSC_METHOD csc_method
= CSC_METHOD_SW
;
1530 pWmvDec
->hMFCWmvHandle
.bConfiguredMFCSrc
= OMX_FALSE
;
1531 pWmvDec
->hMFCWmvHandle
.bConfiguredMFCDst
= OMX_FALSE
;
1532 pExynosComponent
->bUseFlagEOF
= OMX_TRUE
;
1533 pExynosComponent
->bSaveFlagEOS
= OMX_FALSE
;
1534 pExynosComponent
->bBehaviorEOS
= OMX_FALSE
;
1536 /* WMV Codec Open */
1537 ret
= WmvCodecOpen(pWmvDec
);
1538 if (ret
!= OMX_ErrorNone
) {
1542 pDecOps
= pWmvDec
->hMFCWmvHandle
.pDecOps
;
1543 pInbufOps
= pWmvDec
->hMFCWmvHandle
.pInbufOps
;
1544 pOutbufOps
= pWmvDec
->hMFCWmvHandle
.pOutbufOps
;
1546 pExynosInputPort
->nPlaneCnt
= MFC_DEFAULT_INPUT_BUFFER_PLANE
;
1547 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1548 OMX_U32 nPlaneSize
[MAX_BUFFER_PLANE
] = {DEFAULT_MFC_INPUT_BUFFER_SIZE
, 0, 0};
1549 Exynos_OSAL_SemaphoreCreate(&pExynosInputPort
->codecSemID
);
1550 Exynos_OSAL_QueueCreate(&pExynosInputPort
->codecBufferQ
, MAX_QUEUE_ELEMENTS
);
1551 ret
= Exynos_Allocate_CodecBuffers(pOMXComponent
, INPUT_PORT_INDEX
, MFC_INPUT_BUFFER_NUM_MAX
, nPlaneSize
);
1552 if (ret
!= OMX_ErrorNone
)
1555 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++)
1556 Exynos_CodecBufferEnQueue(pExynosComponent
, INPUT_PORT_INDEX
, pVideoDec
->pMFCDecInputBuffer
[i
]);
1557 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
1561 /* Does not require any actions. */
1564 pExynosOutputPort
->nPlaneCnt
= MFC_DEFAULT_OUTPUT_BUFFER_PLANE
;
1565 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1566 Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort
->codecSemID
);
1567 Exynos_OSAL_QueueCreate(&pExynosOutputPort
->codecBufferQ
, MAX_QUEUE_ELEMENTS
);
1568 } else if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
1572 /* Does not require any actions. */
1575 pWmvDec
->bSourceStart
= OMX_FALSE
;
1576 Exynos_OSAL_SignalCreate(&pWmvDec
->hSourceStartEvent
);
1577 pWmvDec
->bDestinationStart
= OMX_FALSE
;
1578 Exynos_OSAL_SignalCreate(&pWmvDec
->hDestinationStartEvent
);
1580 Exynos_OSAL_Memset(pExynosComponent
->timeStamp
, -19771003, sizeof(OMX_TICKS
) * MAX_TIMESTAMP
);
1581 Exynos_OSAL_Memset(pExynosComponent
->nFlags
, 0, sizeof(OMX_U32
) * MAX_FLAGS
);
1582 pWmvDec
->hMFCWmvHandle
.indexTimestamp
= 0;
1583 pWmvDec
->hMFCWmvHandle
.outputIndexTimestamp
= 0;
1584 /* Default WMV codec format is set as VC1*/
1585 pWmvDec
->hMFCWmvHandle
.wmvFormat
= WMV_FORMAT_VC1
;
1587 pExynosComponent
->getAllDelayBuffer
= OMX_FALSE
;
1589 Exynos_OSAL_QueueCreate(&pWmvDec
->bypassBufferInfoQ
, QUEUE_ELEMENTS
);
1592 csc_method
= CSC_METHOD_HW
;
1594 pVideoDec
->csc_handle
= csc_init(csc_method
);
1595 if (pVideoDec
->csc_handle
== NULL
) {
1596 ret
= OMX_ErrorInsufficientResources
;
1599 pVideoDec
->csc_set_format
= OMX_FALSE
;
1608 OMX_ERRORTYPE
Exynos_WmvDec_Terminate(OMX_COMPONENTTYPE
*pOMXComponent
)
1610 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1611 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1612 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1613 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1614 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1615 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1616 OMX_PTR hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
1618 ExynosVideoDecOps
*pDecOps
= pWmvDec
->hMFCWmvHandle
.pDecOps
;
1619 ExynosVideoDecBufferOps
*pInbufOps
= pWmvDec
->hMFCWmvHandle
.pInbufOps
;
1620 ExynosVideoDecBufferOps
*pOutbufOps
= pWmvDec
->hMFCWmvHandle
.pOutbufOps
;
1626 if (pVideoDec
->csc_handle
!= NULL
) {
1627 csc_deinit(pVideoDec
->csc_handle
);
1628 pVideoDec
->csc_handle
= NULL
;
1631 Exynos_OSAL_QueueTerminate(&pWmvDec
->bypassBufferInfoQ
);
1633 Exynos_OSAL_SignalTerminate(pWmvDec
->hDestinationStartEvent
);
1634 pWmvDec
->hDestinationStartEvent
= NULL
;
1635 pWmvDec
->bDestinationStart
= OMX_FALSE
;
1636 Exynos_OSAL_SignalTerminate(pWmvDec
->hSourceStartEvent
);
1637 pWmvDec
->hSourceStartEvent
= NULL
;
1638 pWmvDec
->bSourceStart
= OMX_FALSE
;
1640 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1641 Exynos_Free_CodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
);
1642 Exynos_OSAL_QueueTerminate(&pExynosOutputPort
->codecBufferQ
);
1643 Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort
->codecSemID
);
1644 } else if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
1648 /* Does not require any actions. */
1651 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1652 Exynos_Free_CodecBuffers(pOMXComponent
, INPUT_PORT_INDEX
);
1653 Exynos_OSAL_QueueTerminate(&pExynosInputPort
->codecBufferQ
);
1654 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->codecSemID
);
1655 } else if (pExynosInputPort
->bufferProcessType
& BUFFER_SHARE
) {
1659 /* Does not require any actions. */
1661 WmvCodecClose(pWmvDec
);
1663 Exynos_ResetAllPortConfig(pOMXComponent
);
1671 OMX_ERRORTYPE
Exynos_WmvDec_SrcIn(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
1673 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1674 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1675 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1676 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)pVideoDec
->hCodecHandle
;
1677 void *hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
1678 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1679 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1681 OMX_BUFFERHEADERTYPE tempBufferHeader
;
1682 void *pPrivate
= NULL
;
1684 OMX_U32 oneFrameSize
= pSrcInputData
->dataLen
;
1685 OMX_BOOL bStartCode
= OMX_FALSE
;
1687 ExynosVideoDecOps
*pDecOps
= pWmvDec
->hMFCWmvHandle
.pDecOps
;
1688 ExynosVideoDecBufferOps
*pInbufOps
= pWmvDec
->hMFCWmvHandle
.pInbufOps
;
1689 ExynosVideoDecBufferOps
*pOutbufOps
= pWmvDec
->hMFCWmvHandle
.pOutbufOps
;
1690 ExynosVideoErrorType codecReturn
= VIDEO_ERROR_NONE
;
1696 if (pWmvDec
->hMFCWmvHandle
.bConfiguredMFCSrc
== OMX_FALSE
) {
1697 ret
= WmvCodecSrcSetup(pOMXComponent
, pSrcInputData
);
1700 if (pWmvDec
->hMFCWmvHandle
.bConfiguredMFCDst
== OMX_FALSE
) {
1701 ret
= WmvCodecDstSetup(pOMXComponent
);
1704 bStartCode
= Check_Stream_PrefixCode(pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
, oneFrameSize
, pWmvDec
->hMFCWmvHandle
.wmvFormat
);
1705 if ((bStartCode
== OMX_FALSE
) &&
1706 ((pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
) != OMX_BUFFERFLAG_EOS
)) {
1707 if (pSrcInputData
->allocSize
< oneFrameSize
+4) {
1708 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can't attach startcode due to lack of buffer space");
1709 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1713 bStartCode
= Make_Stream_StartCode(pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
, &oneFrameSize
, pWmvDec
->hMFCWmvHandle
.wmvFormat
);
1714 if (bStartCode
== OMX_FALSE
) {
1715 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Fail to Make Stream Start Code");
1716 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1721 if ((bStartCode
== OMX_TRUE
) || ((pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)){
1722 pExynosComponent
->timeStamp
[pWmvDec
->hMFCWmvHandle
.indexTimestamp
] = pSrcInputData
->timeStamp
;
1723 pExynosComponent
->nFlags
[pWmvDec
->hMFCWmvHandle
.indexTimestamp
] = pSrcInputData
->nFlags
;
1724 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
);
1725 pDecOps
->Set_FrameTag(hMFCHandle
, pWmvDec
->hMFCWmvHandle
.indexTimestamp
);
1726 pWmvDec
->hMFCWmvHandle
.indexTimestamp
++;
1727 pWmvDec
->hMFCWmvHandle
.indexTimestamp
%= MAX_TIMESTAMP
;
1729 if ((pVideoDec
->bQosChanged
== OMX_TRUE
) &&
1730 (pDecOps
->Set_QosRatio
!= NULL
)) {
1731 pDecOps
->Set_QosRatio(hMFCHandle
, pVideoDec
->nQosRatio
);
1732 pVideoDec
->bQosChanged
= OMX_FALSE
;
1735 /* queue work for input buffer */
1736 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize
, pSrcInputData
->bufferHeader
, pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
);
1737 OMX_U32 nAllocLen
[MAX_BUFFER_PLANE
] = {pSrcInputData
->bufferHeader
->nAllocLen
, 0, 0};
1739 if (pExynosInputPort
->bufferProcessType
== BUFFER_COPY
) {
1740 tempBufferHeader
.nFlags
= pSrcInputData
->nFlags
;
1741 tempBufferHeader
.nTimeStamp
= pSrcInputData
->timeStamp
;
1742 pPrivate
= (void *)&tempBufferHeader
;
1744 pPrivate
= (void *)pSrcInputData
->bufferHeader
;
1746 codecReturn
= pInbufOps
->ExtensionEnqueue(hMFCHandle
,
1747 (unsigned char **)&pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
,
1748 (unsigned char **)&pSrcInputData
->buffer
.singlePlaneBuffer
.fd
,
1749 (unsigned int *)nAllocLen
, (unsigned int *)&oneFrameSize
,
1750 pExynosInputPort
->nPlaneCnt
, pPrivate
);
1751 if (codecReturn
!= VIDEO_ERROR_NONE
) {
1752 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1753 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s : %d", __FUNCTION__
, __LINE__
);
1756 WmvCodecStart(pOMXComponent
, INPUT_PORT_INDEX
);
1757 if (pWmvDec
->bSourceStart
== OMX_FALSE
) {
1758 pWmvDec
->bSourceStart
= OMX_TRUE
;
1759 Exynos_OSAL_SignalSet(pWmvDec
->hSourceStartEvent
);
1760 Exynos_OSAL_SleepMillisec(0);
1762 if (pWmvDec
->bDestinationStart
== OMX_FALSE
) {
1763 pWmvDec
->bDestinationStart
= OMX_TRUE
;
1764 Exynos_OSAL_SignalSet(pWmvDec
->hDestinationStartEvent
);
1765 Exynos_OSAL_SleepMillisec(0);
1769 ret
= OMX_ErrorNone
;
1777 OMX_ERRORTYPE
Exynos_WmvDec_SrcOut(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcOutputData
)
1779 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1780 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1781 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1782 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1783 void *hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
1784 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1785 ExynosVideoDecOps
*pDecOps
= pWmvDec
->hMFCWmvHandle
.pDecOps
;
1786 ExynosVideoDecBufferOps
*pInbufOps
= pWmvDec
->hMFCWmvHandle
.pInbufOps
;
1787 ExynosVideoBuffer
*pVideoBuffer
;
1788 ExynosVideoBuffer videoBuffer
;
1792 if (pInbufOps
->ExtensionDequeue(hMFCHandle
, &videoBuffer
) == VIDEO_ERROR_NONE
)
1793 pVideoBuffer
= &videoBuffer
;
1795 pVideoBuffer
= NULL
;
1797 pSrcOutputData
->dataLen
= 0;
1798 pSrcOutputData
->usedDataLen
= 0;
1799 pSrcOutputData
->remainDataLen
= 0;
1800 pSrcOutputData
->nFlags
= 0;
1801 pSrcOutputData
->timeStamp
= 0;
1802 pSrcOutputData
->bufferHeader
= NULL
;
1804 if (pVideoBuffer
== NULL
) {
1805 pSrcOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
= NULL
;
1806 pSrcOutputData
->allocSize
= 0;
1807 pSrcOutputData
->pPrivate
= NULL
;
1808 pSrcOutputData
->bufferHeader
= NULL
;
1810 pSrcOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
= pVideoBuffer
->planes
[0].addr
;
1811 pSrcOutputData
->buffer
.singlePlaneBuffer
.fd
= pVideoBuffer
->planes
[0].fd
;
1812 pSrcOutputData
->allocSize
= pVideoBuffer
->planes
[0].allocSize
;
1814 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
1816 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++) {
1817 if (pSrcOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
==
1818 pVideoDec
->pMFCDecInputBuffer
[i
]->pVirAddr
[0]) {
1819 pVideoDec
->pMFCDecInputBuffer
[i
]->dataSize
= 0;
1820 pSrcOutputData
->pPrivate
= pVideoDec
->pMFCDecInputBuffer
[i
];
1825 if (i
>= MFC_INPUT_BUFFER_NUM_MAX
) {
1826 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can not find buffer");
1827 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1832 /* For Share Buffer */
1833 if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
)
1834 pSrcOutputData
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)pVideoBuffer
->pPrivate
;
1837 ret
= OMX_ErrorNone
;
1845 OMX_ERRORTYPE
Exynos_WmvDec_DstIn(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstInputData
)
1847 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1848 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1849 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1850 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)pVideoDec
->hCodecHandle
;
1851 void *hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
1852 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1854 ExynosVideoDecOps
*pDecOps
= pWmvDec
->hMFCWmvHandle
.pDecOps
;
1855 ExynosVideoDecBufferOps
*pOutbufOps
= pWmvDec
->hMFCWmvHandle
.pOutbufOps
;
1856 ExynosVideoErrorType codecReturn
= VIDEO_ERROR_NONE
;
1858 OMX_U32 dataLen
[MAX_BUFFER_PLANE
] = {0, 0, 0};
1863 if (pDstInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] == NULL
) {
1864 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to find input buffer");
1865 ret
= OMX_ErrorBadParameter
;
1869 for (i
= 0; i
< pExynosOutputPort
->nPlaneCnt
; i
++) {
1870 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "%s : %d => ADDR[i]: 0x%x", __FUNCTION__
, __LINE__
, i
,
1871 pDstInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[i
]);
1874 codecReturn
= pOutbufOps
->Enqueue(hMFCHandle
, (unsigned char **)pDstInputData
->buffer
.multiPlaneBuffer
.dataBuffer
,
1875 (unsigned int *)dataLen
, pExynosOutputPort
->nPlaneCnt
, pDstInputData
->bufferHeader
);
1877 if (codecReturn
!= VIDEO_ERROR_NONE
) {
1878 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s : %d", __FUNCTION__
, __LINE__
);
1879 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1882 WmvCodecStart(pOMXComponent
, OUTPUT_PORT_INDEX
);
1884 ret
= OMX_ErrorNone
;
1892 OMX_ERRORTYPE
Exynos_WmvDec_DstOut(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstOutputData
)
1894 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1895 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1896 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1897 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1898 void *hMFCHandle
= pWmvDec
->hMFCWmvHandle
.hMFCHandle
;
1899 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1900 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1901 ExynosVideoDecOps
*pDecOps
= pWmvDec
->hMFCWmvHandle
.pDecOps
;
1902 ExynosVideoDecBufferOps
*pOutbufOps
= pWmvDec
->hMFCWmvHandle
.pOutbufOps
;
1903 ExynosVideoBuffer
*pVideoBuffer
= NULL
;
1904 ExynosVideoFrameStatusType displayStatus
= VIDEO_FRAME_STATUS_UNKNOWN
;
1905 ExynosVideoGeometry
*bufferGeometry
;
1906 DECODE_CODEC_EXTRA_BUFFERINFO
*pBufferInfo
= NULL
;
1907 OMX_S32 indexTimestamp
= 0;
1912 if (pWmvDec
->bDestinationStart
== OMX_FALSE
) {
1913 ret
= OMX_ErrorNone
;
1918 pVideoBuffer
= pOutbufOps
->Dequeue(hMFCHandle
);
1919 if (pVideoBuffer
== (ExynosVideoBuffer
*)VIDEO_ERROR_DQBUF_EIO
) {
1920 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "HW is not available");
1921 ret
= OMX_ErrorHardware
;
1925 if (pVideoBuffer
== NULL
) {
1926 ret
= OMX_ErrorNone
;
1929 displayStatus
= pVideoBuffer
->displayStatus
;
1930 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "displayStatus: 0x%x", displayStatus
);
1932 if ((displayStatus
== VIDEO_FRAME_STATUS_DISPLAY_DECODING
) ||
1933 (displayStatus
== VIDEO_FRAME_STATUS_DISPLAY_ONLY
) ||
1934 (displayStatus
== VIDEO_FRAME_STATUS_CHANGE_RESOL
) ||
1935 (displayStatus
== VIDEO_FRAME_STATUS_DECODING_FINISHED
) ||
1936 (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
1937 ret
= OMX_ErrorNone
;
1942 pWmvDec
->hMFCWmvHandle
.outputIndexTimestamp
++;
1943 pWmvDec
->hMFCWmvHandle
.outputIndexTimestamp
%= MAX_TIMESTAMP
;
1945 pDstOutputData
->allocSize
= pDstOutputData
->dataLen
= 0;
1946 for (plane
= 0; plane
< pExynosOutputPort
->nPlaneCnt
; plane
++) {
1947 pDstOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[plane
] = pVideoBuffer
->planes
[plane
].addr
;
1948 pDstOutputData
->buffer
.multiPlaneBuffer
.fd
[plane
] = pVideoBuffer
->planes
[plane
].fd
;
1949 pDstOutputData
->allocSize
+= pVideoBuffer
->planes
[plane
].allocSize
;
1950 pDstOutputData
->dataLen
+= pVideoBuffer
->planes
[plane
].dataSize
;
1952 pDstOutputData
->usedDataLen
= 0;
1953 pDstOutputData
->pPrivate
= pVideoBuffer
;
1954 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1956 pDstOutputData
->pPrivate
= NULL
;
1957 for (i
= 0; i
< MFC_OUTPUT_BUFFER_NUM_MAX
; i
++) {
1958 if (pDstOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] ==
1959 pVideoDec
->pMFCDecOutputBuffer
[i
]->pVirAddr
[0]) {
1960 pDstOutputData
->pPrivate
= pVideoDec
->pMFCDecOutputBuffer
[i
];
1965 if (pDstOutputData
->pPrivate
== NULL
) {
1966 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can not find buffer");
1967 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1972 /* For Share Buffer */
1973 pDstOutputData
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)pVideoBuffer
->pPrivate
;
1975 pBufferInfo
= (DECODE_CODEC_EXTRA_BUFFERINFO
*)pDstOutputData
->extInfo
;
1976 bufferGeometry
= &pWmvDec
->hMFCWmvHandle
.codecOutbufConf
;
1977 pBufferInfo
->imageWidth
= bufferGeometry
->nFrameWidth
;
1978 pBufferInfo
->imageHeight
= bufferGeometry
->nFrameHeight
;
1979 switch (bufferGeometry
->eColorFormat
) {
1980 case VIDEO_COLORFORMAT_NV12
:
1981 pBufferInfo
->ColorFormat
= OMX_COLOR_FormatYUV420SemiPlanar
;
1983 #ifdef USE_DUALDPB_MODE
1984 case VIDEO_COLORFORMAT_I420
:
1985 pBufferInfo
->ColorFormat
= OMX_COLOR_FormatYUV420Planar
;
1987 case VIDEO_COLORFORMAT_YV12
:
1988 pBufferInfo
->ColorFormat
= OMX_SEC_COLOR_FormatYVU420Planar
;
1990 case VIDEO_COLORFORMAT_NV21
:
1991 pBufferInfo
->ColorFormat
= OMX_SEC_COLOR_FormatNV21Linear
;
1994 case VIDEO_COLORFORMAT_NV12_TILED
:
1996 pBufferInfo
->ColorFormat
= OMX_SEC_COLOR_FormatNV12Tiled
;
2000 indexTimestamp
= pDecOps
->Get_FrameTag(hMFCHandle
);
2001 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "out indexTimestamp: %d", indexTimestamp
);
2002 if ((indexTimestamp
< 0) || (indexTimestamp
>= MAX_TIMESTAMP
)) {
2003 if ((pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
!= OMX_TRUE
) &&
2004 (pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
!= OMX_TRUE
)) {
2005 if (indexTimestamp
== INDEX_AFTER_EOS
) {
2006 pDstOutputData
->timeStamp
= 0x00;
2007 pDstOutputData
->nFlags
= 0x00;
2009 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[pWmvDec
->hMFCWmvHandle
.outputIndexTimestamp
];
2010 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[pWmvDec
->hMFCWmvHandle
.outputIndexTimestamp
];
2011 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "missing out indexTimestamp: %d", indexTimestamp
);
2014 pDstOutputData
->timeStamp
= 0x00;
2015 pDstOutputData
->nFlags
= 0x00;
2018 /* For timestamp correction. if mfc support frametype detect */
2019 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "disp_pic_frame_type: %d", pVideoBuffer
->frameType
);
2021 /* NEED TIMESTAMP REORDER */
2022 if (pVideoDec
->bDTSMode
== OMX_TRUE
) {
2023 if ((pVideoBuffer
->frameType
== VIDEO_FRAME_I
) ||
2024 ((pVideoBuffer
->frameType
== VIDEO_FRAME_OTHERS
) &&
2025 ((pExynosComponent
->nFlags
[indexTimestamp
] & OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)) ||
2026 (pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
== OMX_TRUE
))
2027 pWmvDec
->hMFCWmvHandle
.outputIndexTimestamp
= indexTimestamp
;
2029 indexTimestamp
= pWmvDec
->hMFCWmvHandle
.outputIndexTimestamp
;
2032 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[indexTimestamp
];
2033 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[indexTimestamp
];
2035 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData
->timeStamp
, pDstOutputData
->timeStamp
/ 1E6
, indexTimestamp
, pDstOutputData
->nFlags
);
2038 if ((displayStatus
== VIDEO_FRAME_STATUS_CHANGE_RESOL
) ||
2039 (displayStatus
== VIDEO_FRAME_STATUS_DECODING_FINISHED
) ||
2040 ((pDstOutputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)) {
2041 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "displayStatus:%d, nFlags0x%x", displayStatus
, pDstOutputData
->nFlags
);
2042 pDstOutputData
->remainDataLen
= 0;
2044 if (((pDstOutputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) &&
2045 (pExynosComponent
->bBehaviorEOS
== OMX_TRUE
)) {
2046 pDstOutputData
->remainDataLen
= bufferGeometry
->nFrameWidth
* bufferGeometry
->nFrameHeight
* 3 / 2;
2047 pExynosComponent
->bBehaviorEOS
= OMX_FALSE
;
2050 pDstOutputData
->remainDataLen
= bufferGeometry
->nFrameWidth
* bufferGeometry
->nFrameHeight
* 3 / 2;
2053 ret
= OMX_ErrorNone
;
2061 OMX_ERRORTYPE
Exynos_WmvDec_srcInputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
2063 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2064 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2065 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2066 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2070 if ((!CHECK_PORT_ENABLED(pExynosInputPort
)) || (!CHECK_PORT_POPULATED(pExynosInputPort
))) {
2071 ret
= OMX_ErrorNone
;
2074 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) {
2075 ret
= OMX_ErrorNone
;
2079 ret
= Exynos_WmvDec_SrcIn(pOMXComponent
, pSrcInputData
);
2080 if ((ret
!= OMX_ErrorNone
) && (ret
!= OMX_ErrorInputDataDecodeYet
)) {
2081 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2082 pExynosComponent
->callbackData
,
2083 OMX_EventError
, ret
, 0, NULL
);
2092 OMX_ERRORTYPE
Exynos_WmvDec_srcOutputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcOutputData
)
2094 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2095 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2096 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2097 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2101 if ((!CHECK_PORT_ENABLED(pExynosInputPort
)) || (!CHECK_PORT_POPULATED(pExynosInputPort
))) {
2102 ret
= OMX_ErrorNone
;
2106 if (pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) {
2107 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) {
2108 ret
= OMX_ErrorNone
;
2112 if ((pWmvDec
->bSourceStart
== OMX_FALSE
) &&
2113 (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort
))) {
2114 Exynos_OSAL_SignalWait(pWmvDec
->hSourceStartEvent
, DEF_MAX_WAIT_TIME
);
2115 Exynos_OSAL_SignalReset(pWmvDec
->hSourceStartEvent
);
2118 ret
= Exynos_WmvDec_SrcOut(pOMXComponent
, pSrcOutputData
);
2119 if ((ret
!= OMX_ErrorNone
) &&
2120 (pExynosComponent
->currentState
== OMX_StateExecuting
)) {
2121 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2122 pExynosComponent
->callbackData
,
2123 OMX_EventError
, ret
, 0, NULL
);
2132 OMX_ERRORTYPE
Exynos_WmvDec_dstInputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstInputData
)
2134 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2135 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2136 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2137 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2141 if ((!CHECK_PORT_ENABLED(pExynosOutputPort
)) || (!CHECK_PORT_POPULATED(pExynosOutputPort
))) {
2142 ret
= OMX_ErrorNone
;
2145 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) {
2146 ret
= OMX_ErrorNone
;
2149 if (pExynosOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
2150 if ((pWmvDec
->bDestinationStart
== OMX_FALSE
) &&
2151 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
2152 Exynos_OSAL_SignalWait(pWmvDec
->hDestinationStartEvent
, DEF_MAX_WAIT_TIME
);
2153 Exynos_OSAL_SignalReset(pWmvDec
->hDestinationStartEvent
);
2155 if (Exynos_OSAL_GetElemNum(&pWmvDec
->bypassBufferInfoQ
) > 0) {
2156 BYPASS_BUFFER_INFO
*pBufferInfo
= (BYPASS_BUFFER_INFO
*)Exynos_OSAL_Dequeue(&pWmvDec
->bypassBufferInfoQ
);
2157 if (pBufferInfo
== NULL
) {
2158 ret
= OMX_ErrorUndefined
;
2162 pDstInputData
->bufferHeader
->nFlags
= pBufferInfo
->nFlags
;
2163 pDstInputData
->bufferHeader
->nTimeStamp
= pBufferInfo
->timeStamp
;
2164 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pDstInputData
->bufferHeader
);
2165 Exynos_OSAL_Free(pBufferInfo
);
2167 ret
= OMX_ErrorNone
;
2171 if (pWmvDec
->hMFCWmvHandle
.bConfiguredMFCDst
== OMX_TRUE
) {
2172 ret
= Exynos_WmvDec_DstIn(pOMXComponent
, pDstInputData
);
2173 if (ret
!= OMX_ErrorNone
) {
2174 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2175 pExynosComponent
->callbackData
,
2176 OMX_EventError
, ret
, 0, NULL
);
2186 OMX_ERRORTYPE
Exynos_WmvDec_dstOutputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstOutputData
)
2188 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2189 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2190 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
2191 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2195 if ((!CHECK_PORT_ENABLED(pExynosOutputPort
)) || (!CHECK_PORT_POPULATED(pExynosOutputPort
))) {
2196 ret
= OMX_ErrorNone
;
2199 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) {
2200 ret
= OMX_ErrorNone
;
2204 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
2205 if ((pWmvDec
->bDestinationStart
== OMX_FALSE
) &&
2206 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
2207 Exynos_OSAL_SignalWait(pWmvDec
->hDestinationStartEvent
, DEF_MAX_WAIT_TIME
);
2208 Exynos_OSAL_SignalReset(pWmvDec
->hDestinationStartEvent
);
2210 if (Exynos_OSAL_GetElemNum(&pWmvDec
->bypassBufferInfoQ
) > 0) {
2211 EXYNOS_OMX_DATABUFFER
*dstOutputUseBuffer
= &pExynosOutputPort
->way
.port2WayDataBuffer
.outputDataBuffer
;
2212 OMX_BUFFERHEADERTYPE
*pOMXBuffer
= NULL
;
2213 BYPASS_BUFFER_INFO
*pBufferInfo
= NULL
;
2215 if (dstOutputUseBuffer
->dataValid
== OMX_FALSE
) {
2216 pOMXBuffer
= Exynos_OutputBufferGetQueue_Direct(pExynosComponent
);
2217 if (pOMXBuffer
== NULL
) {
2218 ret
= OMX_ErrorUndefined
;
2222 pOMXBuffer
= dstOutputUseBuffer
->bufferHeader
;
2225 pBufferInfo
= Exynos_OSAL_Dequeue(&pWmvDec
->bypassBufferInfoQ
);
2226 if (pBufferInfo
== NULL
) {
2227 ret
= OMX_ErrorUndefined
;
2231 pOMXBuffer
->nFlags
= pBufferInfo
->nFlags
;
2232 pOMXBuffer
->nTimeStamp
= pBufferInfo
->timeStamp
;
2233 Exynos_OMX_OutputBufferReturn(pOMXComponent
, pOMXBuffer
);
2234 Exynos_OSAL_Free(pBufferInfo
);
2236 dstOutputUseBuffer
->dataValid
= OMX_FALSE
;
2238 ret
= OMX_ErrorNone
;
2242 ret
= Exynos_WmvDec_DstOut(pOMXComponent
, pDstOutputData
);
2243 if ((ret
!= OMX_ErrorNone
) &&
2244 (pExynosComponent
->currentState
== OMX_StateExecuting
)) {
2245 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
2246 pExynosComponent
->callbackData
,
2247 OMX_EventError
, ret
, 0, NULL
);
2256 OSCL_EXPORT_REF OMX_ERRORTYPE
Exynos_OMX_ComponentInit(
2257 OMX_HANDLETYPE hComponent
,
2258 OMX_STRING componentName
)
2260 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2261 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
2262 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
2263 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
2264 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
2265 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= NULL
;
2266 OMX_S32 wmvFormat
= WMV_FORMAT_UNKNOWN
;
2271 if ((hComponent
== NULL
) || (componentName
== NULL
)) {
2272 ret
= OMX_ErrorBadParameter
;
2273 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, Line:%d", __LINE__
);
2276 if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_WMV_DEC
, componentName
) != 0) {
2277 ret
= OMX_ErrorBadParameter
;
2278 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName
, __LINE__
);
2282 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
2283 ret
= Exynos_OMX_VideoDecodeComponentInit(pOMXComponent
);
2284 if (ret
!= OMX_ErrorNone
) {
2285 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_Error, Line:%d", __LINE__
);
2288 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2289 pExynosComponent
->codecType
= HW_VIDEO_DEC_CODEC
;
2291 pExynosComponent
->componentName
= (OMX_STRING
)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE
);
2292 if (pExynosComponent
->componentName
== NULL
) {
2293 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
2294 ret
= OMX_ErrorInsufficientResources
;
2295 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
2298 Exynos_OSAL_Memset(pExynosComponent
->componentName
, 0, MAX_OMX_COMPONENT_NAME_SIZE
);
2300 pWmvDec
= Exynos_OSAL_Malloc(sizeof(EXYNOS_WMVDEC_HANDLE
));
2301 if (pWmvDec
== NULL
) {
2302 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
2303 ret
= OMX_ErrorInsufficientResources
;
2304 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
2307 Exynos_OSAL_Memset(pWmvDec
, 0, sizeof(EXYNOS_WMVDEC_HANDLE
));
2308 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2309 pVideoDec
->hCodecHandle
= (OMX_HANDLETYPE
)pWmvDec
;
2310 pWmvDec
->hMFCWmvHandle
.wmvFormat
= wmvFormat
;
2312 Exynos_OSAL_Strcpy(pExynosComponent
->componentName
, EXYNOS_OMX_COMPONENT_WMV_DEC
);
2314 /* Set componentVersion */
2315 pExynosComponent
->componentVersion
.s
.nVersionMajor
= VERSIONMAJOR_NUMBER
;
2316 pExynosComponent
->componentVersion
.s
.nVersionMinor
= VERSIONMINOR_NUMBER
;
2317 pExynosComponent
->componentVersion
.s
.nRevision
= REVISION_NUMBER
;
2318 pExynosComponent
->componentVersion
.s
.nStep
= STEP_NUMBER
;
2319 /* Set specVersion */
2320 pExynosComponent
->specVersion
.s
.nVersionMajor
= VERSIONMAJOR_NUMBER
;
2321 pExynosComponent
->specVersion
.s
.nVersionMinor
= VERSIONMINOR_NUMBER
;
2322 pExynosComponent
->specVersion
.s
.nRevision
= REVISION_NUMBER
;
2323 pExynosComponent
->specVersion
.s
.nStep
= STEP_NUMBER
;
2326 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2327 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
2328 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
2329 pExynosPort
->portDefinition
.format
.video
.nStride
= 0; /*DEFAULT_FRAME_WIDTH;*/
2330 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
2331 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_INPUT_BUFFER_SIZE
;
2332 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingWMV
;
2333 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
2334 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "video/wmv");
2335 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
2336 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
2337 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatUnused
;
2338 pExynosPort
->portDefinition
.bEnabled
= OMX_TRUE
;
2339 //pExynosPort->bufferProcessType = BUFFER_SHARE;
2340 pExynosPort
->bufferProcessType
= BUFFER_COPY
;
2341 pExynosPort
->portWayType
= WAY2_PORT
;
2344 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2345 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
2346 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
2347 pExynosPort
->portDefinition
.format
.video
.nStride
= 0; /*DEFAULT_FRAME_WIDTH;*/
2348 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
2349 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE
;
2350 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingUnused
;
2351 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
2352 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "raw/video");
2353 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
2354 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
2355 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatYUV420Planar
;
2356 pExynosPort
->portDefinition
.bEnabled
= OMX_TRUE
;
2357 pExynosPort
->bufferProcessType
= BUFFER_COPY
| BUFFER_ANBSHARE
;
2358 pExynosPort
->portWayType
= WAY2_PORT
;
2360 for(i
= 0; i
< ALL_PORT_NUM
; i
++) {
2361 INIT_SET_SIZE_VERSION(&pWmvDec
->WmvComponent
[i
], OMX_VIDEO_PARAM_WMVTYPE
);
2362 pWmvDec
->WmvComponent
[i
].nPortIndex
= i
;
2363 pWmvDec
->WmvComponent
[i
].eFormat
= OMX_VIDEO_WMVFormat9
;
2366 pOMXComponent
->GetParameter
= &Exynos_WmvDec_GetParameter
;
2367 pOMXComponent
->SetParameter
= &Exynos_WmvDec_SetParameter
;
2368 pOMXComponent
->GetConfig
= &Exynos_WmvDec_GetConfig
;
2369 pOMXComponent
->SetConfig
= &Exynos_WmvDec_SetConfig
;
2370 pOMXComponent
->GetExtensionIndex
= &Exynos_WmvDec_GetExtensionIndex
;
2371 pOMXComponent
->ComponentRoleEnum
= &Exynos_WmvDec_ComponentRoleEnum
;
2372 pOMXComponent
->ComponentDeInit
= &Exynos_OMX_ComponentDeinit
;
2374 pExynosComponent
->exynos_codec_componentInit
= &Exynos_WmvDec_Init
;
2375 pExynosComponent
->exynos_codec_componentTerminate
= &Exynos_WmvDec_Terminate
;
2377 pVideoDec
->exynos_codec_srcInputProcess
= &Exynos_WmvDec_srcInputBufferProcess
;
2378 pVideoDec
->exynos_codec_srcOutputProcess
= &Exynos_WmvDec_srcOutputBufferProcess
;
2379 pVideoDec
->exynos_codec_dstInputProcess
= &Exynos_WmvDec_dstInputBufferProcess
;
2380 pVideoDec
->exynos_codec_dstOutputProcess
= &Exynos_WmvDec_dstOutputBufferProcess
;
2382 pVideoDec
->exynos_codec_start
= &WmvCodecStart
;
2383 pVideoDec
->exynos_codec_stop
= &WmvCodecStop
;
2384 pVideoDec
->exynos_codec_bufferProcessRun
= &WmvCodecOutputBufferProcessRun
;
2385 pVideoDec
->exynos_codec_enqueueAllBuffer
= &WmvCodecEnQueueAllBuffer
;
2387 pVideoDec
->exynos_checkInputFrame
= &Check_Wmv_Frame
;
2388 pVideoDec
->exynos_codec_getCodecInputPrivateData
= &GetCodecInputPrivateData
;
2389 pVideoDec
->exynos_codec_getCodecOutputPrivateData
= &GetCodecOutputPrivateData
;
2391 pVideoDec
->hSharedMemory
= Exynos_OSAL_SharedMemory_Open();
2392 if (pVideoDec
->hSharedMemory
== NULL
) {
2393 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
2394 Exynos_OSAL_Free(pWmvDec
);
2395 pWmvDec
= ((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
= NULL
;
2396 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
2397 ret
= OMX_ErrorInsufficientResources
;
2401 pExynosComponent
->currentState
= OMX_StateLoaded
;
2403 ret
= OMX_ErrorNone
;
2411 OMX_ERRORTYPE
Exynos_OMX_ComponentDeinit(
2412 OMX_HANDLETYPE hComponent
)
2414 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2415 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
2416 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
2417 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
2418 EXYNOS_WMVDEC_HANDLE
*pWmvDec
= NULL
;
2422 if (hComponent
== NULL
) {
2423 ret
= OMX_ErrorBadParameter
;
2426 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
2427 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2428 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2430 Exynos_OSAL_SharedMemory_Close(pVideoDec
->hSharedMemory
);
2432 Exynos_OSAL_Free(pExynosComponent
->componentName
);
2433 pExynosComponent
->componentName
= NULL
;
2435 pWmvDec
= (EXYNOS_WMVDEC_HANDLE
*)pVideoDec
->hCodecHandle
;
2436 if (pWmvDec
!= NULL
) {
2437 Exynos_OSAL_Free(pWmvDec
);
2438 pWmvDec
= pVideoDec
->hCodecHandle
= NULL
;
2441 ret
= Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
2442 if (ret
!= OMX_ErrorNone
) {
2446 ret
= OMX_ErrorNone
;