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_Vp8dec.c
21 * @author Satish Kumar Reddy (palli.satish@samsung.com)
22 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
32 #include "Exynos_OMX_Macros.h"
33 #include "Exynos_OMX_Basecomponent.h"
34 #include "Exynos_OMX_Baseport.h"
35 #include "Exynos_OMX_Vdec.h"
36 #include "Exynos_OSAL_ETC.h"
37 #include "Exynos_OSAL_Semaphore.h"
38 #include "Exynos_OSAL_Thread.h"
39 #include "library_register.h"
40 #include "Exynos_OMX_Vp8dec.h"
41 #include "ExynosVideoApi.h"
42 #include "Exynos_OSAL_SharedMemory.h"
43 #include "Exynos_OSAL_Event.h"
46 #include "Exynos_OSAL_Android.h"
49 /* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
50 /* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
54 #define EXYNOS_LOG_TAG "EXYNOS_VP8_DEC"
55 #define EXYNOS_LOG_OFF
56 //#define EXYNOS_TRACE_ON
57 #include "Exynos_OSAL_Log.h"
59 #define VP8_DEC_NUM_OF_EXTRA_BUFFERS 7
61 //#define FULL_FRAME_SEARCH /* Full frame search not support*/
63 static OMX_ERRORTYPE
GetCodecInputPrivateData(OMX_PTR codecBuffer
, void *pVirtAddr
, OMX_U32
*dataSize
)
65 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
71 static OMX_ERRORTYPE
GetCodecOutputPrivateData(OMX_PTR codecBuffer
, void *addr
[], int size
[])
73 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
74 ExynosVideoBuffer
*pCodecBuffer
;
76 if (codecBuffer
== NULL
) {
77 ret
= OMX_ErrorBadParameter
;
81 pCodecBuffer
= (ExynosVideoBuffer
*)codecBuffer
;
84 addr
[0] = pCodecBuffer
->planes
[0].addr
;
85 addr
[1] = pCodecBuffer
->planes
[1].addr
;
86 addr
[2] = pCodecBuffer
->planes
[2].addr
;
90 size
[0] = pCodecBuffer
->planes
[0].allocSize
;
91 size
[1] = pCodecBuffer
->planes
[1].allocSize
;
92 size
[2] = pCodecBuffer
->planes
[2].allocSize
;
99 static int Check_VP8_Frame(
100 OMX_U8
*pInputStream
,
103 OMX_BOOL bPreviousFrameEOF
,
104 OMX_BOOL
*pbEndOfFrame
)
106 /* Uncompressed data Chunk comprises a common
107 (for key frames and interframes) 3-byte frame tag that
109 - 1-bit frame type (0 - key frame, 1 - inter frame)
110 - 3-bit version number (0 - 3 are defined as four different
111 profiles with different decoding complexity)
112 - 1-bit show_frame flag ( 0 - current frame not for display,
113 1 - current frame is for dispaly)
114 - 19-bit field - size of the first data partition in bytes
116 Key Frames : frame tag followed by 7 bytes of uncompressed
118 3-bytes : Start code (byte 0: 0x9d,byte 1: 0x01,byte 2: 0x2a)
119 Next 4-bytes: Width & height, Horizontal and vertical scale information
120 16 bits : (2 bits Horizontal Scale << 14) | Width (14 bits)
121 16 bits : (2 bits Vertical Scale << 14) | Height (14 bits)
124 int horizSscale
, vertScale
;
128 *pbEndOfFrame
= OMX_TRUE
;
130 /*Check for Key frame*/
131 if (!(pInputStream
[0] & 0x01)){
132 /* Key Frame Start code*/
133 if (pInputStream
[3] != 0x9d || pInputStream
[4] != 0x01 || pInputStream
[5]!=0x2a) {
134 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, " VP8 Key Frame Start Code not Found");
135 *pbEndOfFrame
= OMX_FALSE
;
137 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, " VP8 Found Key Frame Start Code");
138 width
= (pInputStream
[6] | (pInputStream
[7] << 8)) & 0x3fff;
139 horizSscale
= pInputStream
[7] >> 6;
140 height
= (pInputStream
[8] | (pInputStream
[9] << 8)) & 0x3fff;
141 vertScale
= pInputStream
[9] >> 6;
142 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "width = %d, height = %d, horizSscale = %d, vertScale = %d", width
, height
, horizSscale
, vertScale
);
149 OMX_BOOL
Check_VP8_StartCode(
150 OMX_U8
*pInputStream
,
153 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "streamSize: %d",streamSize
);
154 if (streamSize
< 3) {
158 if (!(pInputStream
[0] & 0x01)){
159 /* Key Frame Start code*/
160 if (pInputStream
[3] != 0x9d || pInputStream
[4] != 0x01 || pInputStream
[5]!=0x2a) {
161 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, " VP8 Key Frame Start Code not Found");
164 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, " VP8 Found Key Frame Start Code");
170 OMX_ERRORTYPE
VP8CodecOpen(EXYNOS_VP8DEC_HANDLE
*pVp8Dec
)
172 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
173 ExynosVideoDecOps
*pDecOps
= NULL
;
174 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
175 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
179 if (pVp8Dec
== NULL
) {
180 ret
= OMX_ErrorBadParameter
;
181 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, Line:%d", __LINE__
);
185 /* alloc ops structure */
186 pDecOps
= (ExynosVideoDecOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps
));
187 pInbufOps
= (ExynosVideoDecBufferOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps
));
188 pOutbufOps
= (ExynosVideoDecBufferOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps
));
190 if ((pDecOps
== NULL
) || (pInbufOps
== NULL
) || (pOutbufOps
== NULL
)) {
191 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to allocate decoder ops buffer");
192 ret
= OMX_ErrorInsufficientResources
;
196 pVp8Dec
->hMFCVp8Handle
.pDecOps
= pDecOps
;
197 pVp8Dec
->hMFCVp8Handle
.pInbufOps
= pInbufOps
;
198 pVp8Dec
->hMFCVp8Handle
.pOutbufOps
= pOutbufOps
;
200 /* function pointer mapping */
201 pDecOps
->nSize
= sizeof(ExynosVideoDecOps
);
202 pInbufOps
->nSize
= sizeof(ExynosVideoDecBufferOps
);
203 pOutbufOps
->nSize
= sizeof(ExynosVideoDecBufferOps
);
205 Exynos_Video_Register_Decoder(pDecOps
, pInbufOps
, pOutbufOps
);
207 /* check mandatory functions for decoder ops */
208 if ((pDecOps
->Init
== NULL
) || (pDecOps
->Finalize
== NULL
) ||
209 (pDecOps
->Get_ActualBufferCount
== NULL
) || (pDecOps
->Set_FrameTag
== NULL
) ||
210 (pDecOps
->Get_FrameTag
== NULL
)) {
211 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Mandatory functions must be supplied");
212 ret
= OMX_ErrorInsufficientResources
;
216 /* check mandatory functions for buffer ops */
217 if ((pInbufOps
->Setup
== NULL
) || (pOutbufOps
->Setup
== NULL
) ||
218 (pInbufOps
->Run
== NULL
) || (pOutbufOps
->Run
== NULL
) ||
219 (pInbufOps
->Stop
== NULL
) || (pOutbufOps
->Stop
== NULL
) ||
220 (pInbufOps
->Enqueue
== NULL
) || (pOutbufOps
->Enqueue
== NULL
) ||
221 (pInbufOps
->Dequeue
== NULL
) || (pOutbufOps
->Dequeue
== NULL
)) {
222 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Mandatory functions must be supplied");
223 ret
= OMX_ErrorInsufficientResources
;
227 /* alloc context, open, querycap */
228 pVp8Dec
->hMFCVp8Handle
.hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.pDecOps
->Init(V4L2_MEMORY_DMABUF
);
229 if (pVp8Dec
->hMFCVp8Handle
.hMFCHandle
== NULL
) {
230 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to allocate context buffer");
231 ret
= OMX_ErrorInsufficientResources
;
238 if (ret
!= OMX_ErrorNone
) {
239 if (pDecOps
!= NULL
) {
240 Exynos_OSAL_Free(pDecOps
);
241 pVp8Dec
->hMFCVp8Handle
.pDecOps
= NULL
;
243 if (pInbufOps
!= NULL
) {
244 Exynos_OSAL_Free(pInbufOps
);
245 pVp8Dec
->hMFCVp8Handle
.pInbufOps
= NULL
;
247 if (pOutbufOps
!= NULL
) {
248 Exynos_OSAL_Free(pOutbufOps
);
249 pVp8Dec
->hMFCVp8Handle
.pOutbufOps
= NULL
;
258 OMX_ERRORTYPE
VP8CodecClose(EXYNOS_VP8DEC_HANDLE
*pVp8Dec
)
260 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
261 void *hMFCHandle
= NULL
;
262 ExynosVideoDecOps
*pDecOps
= NULL
;
263 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
264 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
268 if (pVp8Dec
== NULL
) {
269 ret
= OMX_ErrorBadParameter
;
273 hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
274 pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
275 pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
276 pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
278 if (hMFCHandle
!= NULL
) {
279 pDecOps
->Finalize(hMFCHandle
);
280 pVp8Dec
->hMFCVp8Handle
.hMFCHandle
= NULL
;
282 if (pOutbufOps
!= NULL
) {
283 Exynos_OSAL_Free(pOutbufOps
);
284 pVp8Dec
->hMFCVp8Handle
.pOutbufOps
= NULL
;
286 if (pInbufOps
!= NULL
) {
287 Exynos_OSAL_Free(pInbufOps
);
288 pVp8Dec
->hMFCVp8Handle
.pInbufOps
= NULL
;
290 if (pDecOps
!= NULL
) {
291 Exynos_OSAL_Free(pDecOps
);
292 pVp8Dec
->hMFCVp8Handle
.pDecOps
= NULL
;
303 OMX_ERRORTYPE
VP8CodecStart(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
305 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
306 void *hMFCHandle
= NULL
;
307 ExynosVideoDecOps
*pDecOps
= NULL
;
308 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
309 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
310 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
311 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
315 if (pOMXComponent
== NULL
) {
316 ret
= OMX_ErrorBadParameter
;
320 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
321 if (pVideoDec
== NULL
) {
322 ret
= OMX_ErrorBadParameter
;
326 pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
327 if (pVp8Dec
== NULL
) {
328 ret
= OMX_ErrorBadParameter
;
332 hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
333 pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
334 pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
335 pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
337 if (nPortIndex
== INPUT_PORT_INDEX
)
338 pInbufOps
->Run(hMFCHandle
);
339 else if (nPortIndex
== OUTPUT_PORT_INDEX
)
340 pOutbufOps
->Run(hMFCHandle
);
350 OMX_ERRORTYPE
VP8CodecStop(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
352 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
353 void *hMFCHandle
= NULL
;
354 ExynosVideoDecOps
*pDecOps
= NULL
;
355 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
356 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
357 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
358 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
362 if (pOMXComponent
== NULL
) {
363 ret
= OMX_ErrorBadParameter
;
367 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
368 if (pVideoDec
== NULL
) {
369 ret
= OMX_ErrorBadParameter
;
372 pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
373 if (pVp8Dec
== NULL
) {
374 ret
= OMX_ErrorBadParameter
;
378 hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
379 pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
380 pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
381 pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
383 if ((nPortIndex
== INPUT_PORT_INDEX
) && (pInbufOps
!= NULL
)) {
384 pInbufOps
->Stop(hMFCHandle
);
385 } else if ((nPortIndex
== OUTPUT_PORT_INDEX
) && (pOutbufOps
!= NULL
)) {
386 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
387 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
388 pOutbufOps
->Stop(hMFCHandle
);
389 if (pExynosOutputPort
->bufferProcessType
== BUFFER_SHARE
)
390 pOutbufOps
->Clear_RegisteredBuffer(hMFCHandle
);
400 OMX_ERRORTYPE
VP8CodecOutputBufferProcessRun(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
402 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
403 void *hMFCHandle
= NULL
;
404 ExynosVideoDecOps
*pDecOps
= NULL
;
405 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
406 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
407 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
408 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
412 if (pOMXComponent
== NULL
) {
413 ret
= OMX_ErrorBadParameter
;
417 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
418 if (pVideoDec
== NULL
) {
419 ret
= OMX_ErrorBadParameter
;
422 pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
423 if (pVp8Dec
== NULL
) {
424 ret
= OMX_ErrorBadParameter
;
428 hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
429 pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
430 pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
431 pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
433 if (nPortIndex
== INPUT_PORT_INDEX
) {
434 if (pVp8Dec
->bSourceStart
== OMX_FALSE
) {
435 Exynos_OSAL_SignalSet(pVp8Dec
->hSourceStartEvent
);
436 Exynos_OSAL_SleepMillisec(0);
440 if (nPortIndex
== OUTPUT_PORT_INDEX
) {
441 if (pVp8Dec
->bDestinationStart
== OMX_FALSE
) {
442 Exynos_OSAL_SignalSet(pVp8Dec
->hDestinationStartEvent
);
443 Exynos_OSAL_SleepMillisec(0);
455 OMX_ERRORTYPE
VP8CodecRegistCodecBuffers(
456 OMX_COMPONENTTYPE
*pOMXComponent
,
460 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
461 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
462 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
463 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
464 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
465 CODEC_DEC_BUFFER
**ppCodecBuffer
= NULL
;
466 ExynosVideoDecBufferOps
*pBufOps
= NULL
;
467 ExynosVideoPlane
*pPlanes
= NULL
;
469 OMX_U32 nPlaneCnt
= 0;
474 if (nPortIndex
== INPUT_PORT_INDEX
) {
475 ppCodecBuffer
= &(pVideoDec
->pMFCDecInputBuffer
[0]);
476 nPlaneCnt
= MFC_INPUT_BUFFER_PLANE
;
477 pBufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
479 ppCodecBuffer
= &(pVideoDec
->pMFCDecOutputBuffer
[0]);
480 nPlaneCnt
= MFC_OUTPUT_BUFFER_PLANE
;
481 pBufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
484 pPlanes
= (ExynosVideoPlane
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoPlane
) * nPlaneCnt
);
485 if (pPlanes
== NULL
) {
486 ret
= OMX_ErrorInsufficientResources
;
490 /* Register buffer */
491 for (i
= 0; i
< nBufferCnt
; i
++) {
492 for (j
= 0; j
< nPlaneCnt
; j
++) {
493 pPlanes
[j
].addr
= ppCodecBuffer
[i
]->pVirAddr
[j
];
494 pPlanes
[j
].fd
= ppCodecBuffer
[i
]->fd
[j
];
495 pPlanes
[j
].allocSize
= ppCodecBuffer
[i
]->bufferSize
[j
];
498 if (pBufOps
->Register(hMFCHandle
, pPlanes
, nPlaneCnt
) != VIDEO_ERROR_NONE
) {
499 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "PORT[%d]: Failed to Register buffer", nPortIndex
);
500 ret
= OMX_ErrorInsufficientResources
;
501 Exynos_OSAL_Free(pPlanes
);
506 Exynos_OSAL_Free(pPlanes
);
516 OMX_ERRORTYPE
VP8CodecReconfigAllBuffers(
517 OMX_COMPONENTTYPE
*pOMXComponent
,
520 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
521 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
522 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
523 EXYNOS_OMX_BASEPORT
*pExynosPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
524 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
525 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
526 ExynosVideoDecBufferOps
*pBufferOps
= NULL
;
530 if ((nPortIndex
== INPUT_PORT_INDEX
) &&
531 (pVp8Dec
->bSourceStart
== OMX_TRUE
)) {
532 ret
= OMX_ErrorNotImplemented
;
534 } else if ((nPortIndex
== OUTPUT_PORT_INDEX
) &&
535 (pVp8Dec
->bDestinationStart
== OMX_TRUE
)) {
536 pBufferOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
538 if (pExynosPort
->bufferProcessType
& BUFFER_COPY
) {
539 /**********************************/
540 /* Codec Buffer Free & Unregister */
541 /**********************************/
542 Exynos_Free_CodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
);
543 Exynos_CodecBufferReset(pExynosComponent
, OUTPUT_PORT_INDEX
);
544 pBufferOps
->Clear_RegisteredBuffer(hMFCHandle
);
545 pBufferOps
->Cleanup_Buffer(hMFCHandle
);
546 } else if (pExynosPort
->bufferProcessType
& BUFFER_SHARE
) {
547 /**********************************/
548 /* Codec Buffer Unregister */
549 /**********************************/
550 pBufferOps
->Clear_RegisteredBuffer(hMFCHandle
);
551 pBufferOps
->Cleanup_Buffer(hMFCHandle
);
553 /******************************************************/
554 /* V4L2 Destnation Setup for DPB Buffer Number Change */
555 /******************************************************/
556 VP8CodecDstSetup(pOMXComponent
);
557 pVideoDec
->bReconfigDPB
= OMX_FALSE
;
559 Exynos_ResolutionUpdate(pOMXComponent
);
561 ret
= OMX_ErrorBadParameter
;
571 OMX_ERRORTYPE
VP8CodecEnQueueAllBuffer(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
573 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
574 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
575 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
576 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
577 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
578 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
579 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
582 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
583 ExynosVideoDecBufferOps
*pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
584 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
588 if ((nPortIndex
!= INPUT_PORT_INDEX
) && (nPortIndex
!= OUTPUT_PORT_INDEX
)) {
589 ret
= OMX_ErrorBadPortIndex
;
593 if ((nPortIndex
== INPUT_PORT_INDEX
) &&
594 (pVp8Dec
->bSourceStart
== OMX_TRUE
)) {
595 Exynos_CodecBufferReset(pExynosComponent
, INPUT_PORT_INDEX
);
597 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++) {
598 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i
, pVideoDec
->pMFCDecInputBuffer
[i
]);
599 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i
, pVideoDec
->pMFCDecInputBuffer
[i
]->pVirAddr
[0]);
601 Exynos_CodecBufferEnQueue(pExynosComponent
, INPUT_PORT_INDEX
, pVideoDec
->pMFCDecInputBuffer
[i
]);
604 pInbufOps
->Clear_Queue(hMFCHandle
);
605 } else if ((nPortIndex
== OUTPUT_PORT_INDEX
) &&
606 (pVp8Dec
->bDestinationStart
== OMX_TRUE
)) {
607 OMX_U32 dataLen
[MFC_OUTPUT_BUFFER_PLANE
] = {0, 0};
608 ExynosVideoBuffer
*pBuffer
= NULL
;
610 Exynos_CodecBufferReset(pExynosComponent
, OUTPUT_PORT_INDEX
);
612 nOutbufs
= pDecOps
->Get_ActualBufferCount(hMFCHandle
);
613 nOutbufs
+= EXTRA_DPB_NUM
;
614 for (i
= 0; i
< nOutbufs
; i
++) {
615 Exynos_CodecBufferEnQueue(pExynosComponent
, OUTPUT_PORT_INDEX
, pVideoDec
->pMFCDecOutputBuffer
[i
]);
617 pOutbufOps
->Clear_Queue(hMFCHandle
);
619 ret
= OMX_ErrorBadParameter
;
629 OMX_ERRORTYPE
VP8CodecCheckResolutionChange(OMX_COMPONENTTYPE
*pOMXComponent
)
631 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
632 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
633 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
634 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
635 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
636 EXYNOS_OMX_BASEPORT
*pInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
637 EXYNOS_OMX_BASEPORT
*pOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
638 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
639 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
641 OMX_CONFIG_RECTTYPE
*pCropRectangle
= NULL
;
642 OMX_PARAM_PORTDEFINITIONTYPE
*pInputPortDefinition
= NULL
;
643 OMX_PARAM_PORTDEFINITIONTYPE
*pOutputPortDefinition
= NULL
;
646 /* get geometry for output */
647 Exynos_OSAL_Memset(&pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
, 0, sizeof(ExynosVideoGeometry
));
648 if (pOutbufOps
->Get_Geometry(hMFCHandle
, &pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
) != VIDEO_ERROR_NONE
) {
649 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to get geometry for parsed header info");
650 ret
= OMX_ErrorInsufficientResources
;
655 pVp8Dec
->hMFCVp8Handle
.maxDPBNum
= pDecOps
->Get_ActualBufferCount(hMFCHandle
);
656 if (pVideoDec
->bThumbnailMode
== OMX_FALSE
)
657 pVp8Dec
->hMFCVp8Handle
.maxDPBNum
+= EXTRA_DPB_NUM
;
658 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Vp8CodecSetup nOutbufs: %d", pVp8Dec
->hMFCVp8Handle
.maxDPBNum
);
660 pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCSrc
= OMX_TRUE
;
662 if (pVideoDec
->bReconfigDPB
!= OMX_TRUE
) {
663 pCropRectangle
= &(pOutputPort
->cropRectangle
);
664 pInputPortDefinition
= &(pInputPort
->portDefinition
);
665 pOutputPortDefinition
= &(pOutputPort
->portDefinition
);
667 pCropRectangle
= &(pOutputPort
->newCropRectangle
);
668 pInputPortDefinition
= &(pInputPort
->newPortDefinition
);
669 pOutputPortDefinition
= &(pOutputPort
->newPortDefinition
);
672 pCropRectangle
->nTop
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.cropRect
.nTop
;
673 pCropRectangle
->nLeft
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.cropRect
.nLeft
;
674 pCropRectangle
->nWidth
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.cropRect
.nWidth
;
675 pCropRectangle
->nHeight
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.cropRect
.nHeight
;
677 if (pOutputPort
->bufferProcessType
& BUFFER_COPY
) {
678 if ((pVideoDec
->bReconfigDPB
) ||
679 (pInputPort
->portDefinition
.format
.video
.nFrameWidth
!= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
) ||
680 (pInputPort
->portDefinition
.format
.video
.nFrameHeight
!= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
)) {
681 pInputPortDefinition
->format
.video
.nFrameWidth
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
;
682 pInputPortDefinition
->format
.video
.nFrameHeight
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
;
683 pInputPortDefinition
->format
.video
.nStride
= ((pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
+ 15) & (~15));
684 pInputPortDefinition
->format
.video
.nSliceHeight
= ((pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
+ 15) & (~15));
685 pOutputPortDefinition
->nBufferCountActual
= pOutputPort
->portDefinition
.nBufferCountActual
;
686 pOutputPortDefinition
->nBufferCountMin
= pOutputPort
->portDefinition
.nBufferCountMin
;
687 if (pVideoDec
->bReconfigDPB
!= OMX_TRUE
)
688 Exynos_UpdateFrameSize(pOMXComponent
);
689 pOutputPort
->exceptionFlag
= NEED_PORT_DISABLE
;
691 /** Send Port Settings changed call back **/
692 (*(pExynosComponent
->pCallbacks
->EventHandler
))
694 pExynosComponent
->callbackData
,
695 OMX_EventPortSettingsChanged
, /* The command was completed */
696 OMX_DirOutput
, /* This is the port index */
700 } else if (pOutputPort
->bufferProcessType
& BUFFER_SHARE
) {
701 if ((pVideoDec
->bReconfigDPB
) ||
702 (pInputPort
->portDefinition
.format
.video
.nFrameWidth
!= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
) ||
703 (pInputPort
->portDefinition
.format
.video
.nFrameHeight
!= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
) ||
704 (pOutputPort
->portDefinition
.nBufferCountActual
!= pVp8Dec
->hMFCVp8Handle
.maxDPBNum
)) {
705 pInputPortDefinition
->format
.video
.nFrameWidth
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
;
706 pInputPortDefinition
->format
.video
.nFrameHeight
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
;
707 pInputPortDefinition
->format
.video
.nStride
= ((pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
+ 15) & (~15));
708 pInputPortDefinition
->format
.video
.nSliceHeight
= ((pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
+ 15) & (~15));
709 pOutputPortDefinition
->nBufferCountActual
= pVp8Dec
->hMFCVp8Handle
.maxDPBNum
;
710 pOutputPortDefinition
->nBufferCountMin
= pVp8Dec
->hMFCVp8Handle
.maxDPBNum
;
711 if (pVideoDec
->bReconfigDPB
!= OMX_TRUE
)
712 Exynos_UpdateFrameSize(pOMXComponent
);
713 pOutputPort
->exceptionFlag
= NEED_PORT_DISABLE
;
715 /** Send Port Settings changed call back **/
716 (*(pExynosComponent
->pCallbacks
->EventHandler
))
718 pExynosComponent
->callbackData
,
719 OMX_EventPortSettingsChanged
, /* The command was completed */
720 OMX_DirOutput
, /* This is the port index */
725 if ((pVideoDec
->bReconfigDPB
== OMX_TRUE
) ||
726 (pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
!= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.cropRect
.nWidth
) ||
727 (pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
!= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.cropRect
.nHeight
)) {
729 pInputPortDefinition
->format
.video
.nFrameWidth
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
;
730 pInputPortDefinition
->format
.video
.nFrameHeight
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
;
731 pInputPortDefinition
->format
.video
.nStride
= ((pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
+ 15) & (~15));
732 pInputPortDefinition
->format
.video
.nSliceHeight
= ((pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
+ 15) & (~15));
733 if (pVideoDec
->bReconfigDPB
!= OMX_TRUE
)
734 Exynos_UpdateFrameSize(pOMXComponent
);
736 /** Send crop info call back **/
737 (*(pExynosComponent
->pCallbacks
->EventHandler
))
739 pExynosComponent
->callbackData
,
740 OMX_EventPortSettingsChanged
, /* The command was completed */
741 OMX_DirOutput
, /* This is the port index */
742 OMX_IndexConfigCommonOutputCrop
,
754 OMX_ERRORTYPE
VP8CodecSrcSetup(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
756 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
757 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
758 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
759 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
760 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
761 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
762 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
763 OMX_U32 oneFrameSize
= pSrcInputData
->dataLen
;
765 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
766 ExynosVideoDecBufferOps
*pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
767 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
768 ExynosVideoGeometry bufferConf
;
769 OMX_U32 inputBufferNumber
= 0;
774 if ((oneFrameSize
<= 0) && (pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
)) {
775 OMX_BUFFERHEADERTYPE
*OMXBuffer
= NULL
;
776 OMXBuffer
= Exynos_OutputBufferGetQueue_Direct(pExynosComponent
);
777 if (OMXBuffer
== NULL
) {
778 ret
= OMX_ErrorUndefined
;
782 OMXBuffer
->nTimeStamp
= pSrcInputData
->timeStamp
;
783 OMXBuffer
->nFlags
= pSrcInputData
->nFlags
;
784 Exynos_OMX_OutputBufferReturn(pOMXComponent
, OMXBuffer
);
790 if (pVideoDec
->bThumbnailMode
== OMX_TRUE
)
791 pDecOps
->Set_IFrameDecoding(hMFCHandle
);
793 /* input buffer info */
794 Exynos_OSAL_Memset(&bufferConf
, 0, sizeof(bufferConf
));
795 bufferConf
.eCompressionFormat
= VIDEO_CODING_VP8
;
796 pInbufOps
->Set_Shareable(hMFCHandle
);
797 if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
798 bufferConf
.nSizeImage
= pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
799 * pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
* 3 / 2;
800 inputBufferNumber
= MAX_VIDEO_INPUTBUFFER_NUM
;
801 } else if ((pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
802 bufferConf
.nSizeImage
= DEFAULT_MFC_INPUT_BUFFER_SIZE
;
803 inputBufferNumber
= MFC_INPUT_BUFFER_NUM_MAX
;
806 /* should be done before prepare input buffer */
807 if (pInbufOps
->Enable_Cacheable(hMFCHandle
) != VIDEO_ERROR_NONE
) {
808 ret
= OMX_ErrorInsufficientResources
;
812 /* set input buffer geometry */
813 if (pInbufOps
->Set_Geometry(hMFCHandle
, &bufferConf
) != VIDEO_ERROR_NONE
) {
814 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for input buffer");
815 ret
= OMX_ErrorInsufficientResources
;
819 /* setup input buffer */
820 if (pInbufOps
->Setup(hMFCHandle
, inputBufferNumber
) != VIDEO_ERROR_NONE
) {
821 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup input buffer");
822 ret
= OMX_ErrorInsufficientResources
;
826 if ((pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
827 ret
= VP8CodecRegistCodecBuffers(pOMXComponent
, INPUT_PORT_INDEX
, MFC_INPUT_BUFFER_NUM_MAX
);
828 if (ret
!= OMX_ErrorNone
)
830 } else if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
831 /* Register input buffer */
832 for (i
= 0; i
< pExynosInputPort
->portDefinition
.nBufferCountActual
; i
++) {
833 ExynosVideoPlane plane
;
834 plane
.addr
= pExynosInputPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
;
835 plane
.allocSize
= pExynosInputPort
->extendBufferHeader
[i
].OMXBufferHeader
->nAllocLen
;
836 plane
.fd
= pExynosInputPort
->extendBufferHeader
[i
].buf_fd
[0];
837 if (pInbufOps
->Register(hMFCHandle
, &plane
, MFC_INPUT_BUFFER_PLANE
) != VIDEO_ERROR_NONE
) {
838 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Register input buffer");
839 ret
= OMX_ErrorInsufficientResources
;
845 /* set output geometry */
846 Exynos_OSAL_Memset(&bufferConf
, 0, sizeof(bufferConf
));
847 pVp8Dec
->hMFCVp8Handle
.MFCOutputColorType
= bufferConf
.eColorFormat
= VIDEO_COLORFORMAT_NV12_TILED
;
848 if (pOutbufOps
->Set_Geometry(hMFCHandle
, &bufferConf
) != VIDEO_ERROR_NONE
) {
849 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for output buffer");
850 ret
= OMX_ErrorInsufficientResources
;
854 /* input buffer enqueue for header parsing */
855 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "oneFrameSize: %d", oneFrameSize
);
856 if (pInbufOps
->Enqueue(hMFCHandle
, (unsigned char **)&pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
,
857 (unsigned int *)&oneFrameSize
, MFC_INPUT_BUFFER_PLANE
, pSrcInputData
->bufferHeader
) != VIDEO_ERROR_NONE
) {
858 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to enqueue input buffer for header parsing");
859 // ret = OMX_ErrorInsufficientResources;
860 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecInit
;
864 /* start header parsing */
865 if (pInbufOps
->Run(hMFCHandle
) != VIDEO_ERROR_NONE
) {
866 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to run input buffer for header parsing");
867 ret
= OMX_ErrorCodecInit
;
871 VP8CodecCheckResolutionChange(pOMXComponent
);
873 Exynos_OSAL_SleepMillisec(0);
874 ret
= OMX_ErrorInputDataDecodeYet
;
875 VP8CodecStop(pOMXComponent
, INPUT_PORT_INDEX
);
883 OMX_ERRORTYPE
VP8CodecDstSetup(OMX_COMPONENTTYPE
*pOMXComponent
)
885 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
886 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
887 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
888 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
889 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
890 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
891 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
893 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
894 ExynosVideoDecBufferOps
*pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
895 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
901 if ((pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
902 /* BUFFER_COPY case, get dpb count */
903 nOutbufs
= pVp8Dec
->hMFCVp8Handle
.maxDPBNum
;
905 /* should be done before prepare output buffer */
906 if (pOutbufOps
->Enable_Cacheable(hMFCHandle
) != VIDEO_ERROR_NONE
) {
907 ret
= OMX_ErrorInsufficientResources
;
911 /*BUFFER_SHERE case, get dpb count */
912 nOutbufs
= pExynosOutputPort
->portDefinition
.nBufferCountActual
;
914 if (pOutbufOps
->Enable_DynamicDPB(hMFCHandle
) != VIDEO_ERROR_NONE
) {
915 ret
= OMX_ErrorUndefined
;
919 pOutbufOps
->Set_Shareable(hMFCHandle
);
920 if (pOutbufOps
->Setup(hMFCHandle
, MAX_OUTPUTBUFFER_NUM_DYNAMIC
) != VIDEO_ERROR_NONE
) {
921 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup output buffer");
922 ret
= OMX_ErrorInsufficientResources
;
926 ExynosVideoPlane planes
[MFC_OUTPUT_BUFFER_PLANE
];
927 OMX_U32 nAllocLen
[MFC_OUTPUT_BUFFER_PLANE
] = {0, 0};
928 OMX_U32 dataLen
[MFC_OUTPUT_BUFFER_PLANE
] = {0, 0};
931 nAllocLen
[0] = calc_plane(pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
,
932 pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
);
933 nAllocLen
[1] = calc_plane(pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
,
934 pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
>> 1);
936 if ((pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
937 ret
= Exynos_Allocate_CodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
, nOutbufs
, nAllocLen
);
938 if (ret
!= OMX_ErrorNone
)
940 for (i
= 0; i
< nOutbufs
; i
++) {
941 /* Enqueue output buffer */
942 pOutbufOps
->ExtensionEnqueue(hMFCHandle
,
943 (unsigned char **)pVideoDec
->pMFCDecOutputBuffer
[i
]->pVirAddr
,
944 (unsigned char **)pVideoDec
->pMFCDecOutputBuffer
[i
]->fd
,
945 (unsigned int *)pVideoDec
->pMFCDecOutputBuffer
[i
]->bufferSize
,
946 (unsigned int *)dataLen
, MFC_OUTPUT_BUFFER_PLANE
, NULL
);
949 if (pOutbufOps
->Run(hMFCHandle
) != VIDEO_ERROR_NONE
) {
950 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to run output buffer");
951 ret
= OMX_ErrorInsufficientResources
;
954 } else if (pExynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
959 if ((pExynosOutputPort
->bIsANBEnabled
== OMX_FALSE
) &&
960 (pExynosOutputPort
->bStoreMetaData
== OMX_FALSE
)) {
961 ret
= OMX_ErrorNotImplemented
;
965 ret
= OMX_ErrorNotImplemented
;
970 pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCDst
= OMX_TRUE
;
980 OMX_ERRORTYPE
Exynos_VP8Dec_GetParameter(
981 OMX_IN OMX_HANDLETYPE hComponent
,
982 OMX_IN OMX_INDEXTYPE nParamIndex
,
983 OMX_INOUT OMX_PTR pComponentParameterStructure
)
985 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
986 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
987 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
991 if (hComponent
== NULL
|| pComponentParameterStructure
== NULL
) {
992 ret
= OMX_ErrorBadParameter
;
995 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
996 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
997 if (ret
!= OMX_ErrorNone
) {
1000 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1001 ret
= OMX_ErrorBadParameter
;
1005 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1006 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1007 ret
= OMX_ErrorInvalidState
;
1011 switch (nParamIndex
) {
1012 case OMX_IndexParamStandardComponentRole
:
1014 OMX_PARAM_COMPONENTROLETYPE
*pComponentRole
= (OMX_PARAM_COMPONENTROLETYPE
*)pComponentParameterStructure
;
1015 ret
= Exynos_OMX_Check_SizeVersion(pComponentRole
, sizeof(OMX_PARAM_COMPONENTROLETYPE
));
1016 if (ret
!= OMX_ErrorNone
) {
1020 Exynos_OSAL_Strcpy((char *)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE
);
1023 case OMX_IndexParamVideoErrorCorrection
:
1025 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pDstErrorCorrectionType
= (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*)pComponentParameterStructure
;
1026 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pSrcErrorCorrectionType
= NULL
;
1027 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
1029 ret
= Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType
, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
));
1030 if (ret
!= OMX_ErrorNone
) {
1034 if (pDstErrorCorrectionType
->nPortIndex
!= INPUT_PORT_INDEX
) {
1035 ret
= OMX_ErrorBadPortIndex
;
1039 pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1040 pSrcErrorCorrectionType
= &pVp8Dec
->errorCorrectionType
[INPUT_PORT_INDEX
];
1042 pDstErrorCorrectionType
->bEnableHEC
= pSrcErrorCorrectionType
->bEnableHEC
;
1043 pDstErrorCorrectionType
->bEnableResync
= pSrcErrorCorrectionType
->bEnableResync
;
1044 pDstErrorCorrectionType
->nResynchMarkerSpacing
= pSrcErrorCorrectionType
->nResynchMarkerSpacing
;
1045 pDstErrorCorrectionType
->bEnableDataPartitioning
= pSrcErrorCorrectionType
->bEnableDataPartitioning
;
1046 pDstErrorCorrectionType
->bEnableRVLC
= pSrcErrorCorrectionType
->bEnableRVLC
;
1050 ret
= Exynos_OMX_VideoDecodeGetParameter(hComponent
, nParamIndex
, pComponentParameterStructure
);
1059 OMX_ERRORTYPE
Exynos_VP8Dec_SetParameter(
1060 OMX_IN OMX_HANDLETYPE hComponent
,
1061 OMX_IN OMX_INDEXTYPE nIndex
,
1062 OMX_IN OMX_PTR pComponentParameterStructure
)
1064 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1065 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1066 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1070 if (hComponent
== NULL
|| pComponentParameterStructure
== NULL
) {
1071 ret
= OMX_ErrorBadParameter
;
1074 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1075 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1076 if (ret
!= OMX_ErrorNone
) {
1079 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1080 ret
= OMX_ErrorBadParameter
;
1084 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1085 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1086 ret
= OMX_ErrorInvalidState
;
1091 case OMX_IndexParamStandardComponentRole
:
1093 OMX_PARAM_COMPONENTROLETYPE
*pComponentRole
= (OMX_PARAM_COMPONENTROLETYPE
*)pComponentParameterStructure
;
1095 ret
= Exynos_OMX_Check_SizeVersion(pComponentRole
, sizeof(OMX_PARAM_COMPONENTROLETYPE
));
1096 if (ret
!= OMX_ErrorNone
) {
1100 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) && (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
1101 ret
= OMX_ErrorIncorrectStateOperation
;
1105 if (!Exynos_OSAL_Strcmp((char*)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE
)) {
1106 pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingVPX
;
1108 ret
= OMX_ErrorBadParameter
;
1113 case OMX_IndexParamVideoErrorCorrection
:
1115 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pSrcErrorCorrectionType
= (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*)pComponentParameterStructure
;
1116 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pDstErrorCorrectionType
= NULL
;
1117 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
1119 ret
= Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType
, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
));
1120 if (ret
!= OMX_ErrorNone
) {
1124 if (pSrcErrorCorrectionType
->nPortIndex
!= INPUT_PORT_INDEX
) {
1125 ret
= OMX_ErrorBadPortIndex
;
1129 pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1130 pDstErrorCorrectionType
= &pVp8Dec
->errorCorrectionType
[INPUT_PORT_INDEX
];
1132 pDstErrorCorrectionType
->bEnableHEC
= pSrcErrorCorrectionType
->bEnableHEC
;
1133 pDstErrorCorrectionType
->bEnableResync
= pSrcErrorCorrectionType
->bEnableResync
;
1134 pDstErrorCorrectionType
->nResynchMarkerSpacing
= pSrcErrorCorrectionType
->nResynchMarkerSpacing
;
1135 pDstErrorCorrectionType
->bEnableDataPartitioning
= pSrcErrorCorrectionType
->bEnableDataPartitioning
;
1136 pDstErrorCorrectionType
->bEnableRVLC
= pSrcErrorCorrectionType
->bEnableRVLC
;
1140 ret
= Exynos_OMX_VideoDecodeSetParameter(hComponent
, nIndex
, pComponentParameterStructure
);
1149 OMX_ERRORTYPE
Exynos_VP8Dec_GetConfig(
1150 OMX_HANDLETYPE hComponent
,
1151 OMX_INDEXTYPE nIndex
,
1152 OMX_PTR pComponentConfigStructure
)
1154 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1155 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1156 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1160 if (hComponent
== NULL
|| pComponentConfigStructure
== NULL
) {
1161 ret
= OMX_ErrorBadParameter
;
1164 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1165 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1166 if (ret
!= OMX_ErrorNone
) {
1169 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1170 ret
= OMX_ErrorBadParameter
;
1173 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1174 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1175 ret
= OMX_ErrorInvalidState
;
1181 ret
= Exynos_OMX_VideoDecodeGetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1191 OMX_ERRORTYPE
Exynos_VP8Dec_SetConfig(
1192 OMX_HANDLETYPE hComponent
,
1193 OMX_INDEXTYPE nIndex
,
1194 OMX_PTR pComponentConfigStructure
)
1196 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1197 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1198 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1202 if (hComponent
== NULL
|| pComponentConfigStructure
== NULL
) {
1203 ret
= OMX_ErrorBadParameter
;
1206 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1207 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1208 if (ret
!= OMX_ErrorNone
) {
1211 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1212 ret
= OMX_ErrorBadParameter
;
1215 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1216 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1217 ret
= OMX_ErrorInvalidState
;
1223 ret
= Exynos_OMX_VideoDecodeSetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1233 OMX_ERRORTYPE
Exynos_VP8Dec_GetExtensionIndex(
1234 OMX_IN OMX_HANDLETYPE hComponent
,
1235 OMX_IN OMX_STRING cParameterName
,
1236 OMX_OUT OMX_INDEXTYPE
*pIndexType
)
1238 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1239 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1240 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1244 if (hComponent
== NULL
) {
1245 ret
= OMX_ErrorBadParameter
;
1248 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1249 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1250 if (ret
!= OMX_ErrorNone
) {
1253 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1254 ret
= OMX_ErrorBadParameter
;
1257 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1258 if ((cParameterName
== NULL
) || (pIndexType
== NULL
)) {
1259 ret
= OMX_ErrorBadParameter
;
1262 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1263 ret
= OMX_ErrorInvalidState
;
1267 ret
= Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent
, cParameterName
, pIndexType
);
1275 OMX_ERRORTYPE
Exynos_VP8Dec_ComponentRoleEnum(
1276 OMX_HANDLETYPE hComponent
,
1280 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1281 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1282 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1286 if ((hComponent
== NULL
) || (cRole
== NULL
)) {
1287 ret
= OMX_ErrorBadParameter
;
1290 if (nIndex
== (MAX_COMPONENT_ROLE_NUM
-1)) {
1291 Exynos_OSAL_Strcpy((char *)cRole
, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE
);
1292 ret
= OMX_ErrorNone
;
1294 ret
= OMX_ErrorNoMore
;
1304 OMX_ERRORTYPE
Exynos_VP8Dec_Init(OMX_COMPONENTTYPE
*pOMXComponent
)
1306 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1307 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1308 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1309 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1310 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1311 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
1312 OMX_PTR hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
1314 ExynosVideoDecOps
*pDecOps
= NULL
;
1315 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
1316 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
1318 CSC_METHOD csc_method
= CSC_METHOD_SW
;
1323 pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCSrc
= OMX_FALSE
;
1324 pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCDst
= OMX_FALSE
;
1325 pExynosComponent
->bUseFlagEOF
= OMX_TRUE
;
1326 pExynosComponent
->bSaveFlagEOS
= OMX_FALSE
;
1327 pExynosComponent
->bBehaviorEOS
= OMX_FALSE
;
1329 /* H.264 Codec Open */
1330 ret
= VP8CodecOpen(pVp8Dec
);
1331 if (ret
!= OMX_ErrorNone
) {
1335 pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
1336 pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
1337 pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
1339 if ((pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1340 OMX_U32 nPlaneSize
[MFC_INPUT_BUFFER_PLANE
] = {DEFAULT_MFC_INPUT_BUFFER_SIZE
};
1341 Exynos_OSAL_SemaphoreCreate(&pExynosInputPort
->codecSemID
);
1342 Exynos_OSAL_QueueCreate(&pExynosInputPort
->codecBufferQ
, MAX_QUEUE_ELEMENTS
);
1343 ret
= Exynos_Allocate_CodecBuffers(pOMXComponent
, INPUT_PORT_INDEX
, MFC_INPUT_BUFFER_NUM_MAX
, nPlaneSize
);
1344 if (ret
!= OMX_ErrorNone
)
1347 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++)
1348 Exynos_CodecBufferEnQueue(pExynosComponent
, INPUT_PORT_INDEX
, pVideoDec
->pMFCDecInputBuffer
[i
]);
1349 } else if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
1353 /* Does not require any actions. */
1356 if ((pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1357 Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort
->codecSemID
);
1358 Exynos_OSAL_QueueCreate(&pExynosOutputPort
->codecBufferQ
, MAX_QUEUE_ELEMENTS
);
1359 } else if (pExynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
1363 /* Does not require any actions. */
1366 pVp8Dec
->bSourceStart
= OMX_FALSE
;
1367 Exynos_OSAL_SignalCreate(&pVp8Dec
->hSourceStartEvent
);
1368 pVp8Dec
->bDestinationStart
= OMX_FALSE
;
1369 Exynos_OSAL_SignalCreate(&pVp8Dec
->hDestinationStartEvent
);
1371 Exynos_OSAL_Memset(pExynosComponent
->timeStamp
, -19771003, sizeof(OMX_TICKS
) * MAX_TIMESTAMP
);
1372 Exynos_OSAL_Memset(pExynosComponent
->nFlags
, 0, sizeof(OMX_U32
) * MAX_FLAGS
);
1373 pVp8Dec
->hMFCVp8Handle
.indexTimestamp
= 0;
1374 pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
= 0;
1376 pExynosComponent
->getAllDelayBuffer
= OMX_FALSE
;
1378 #if 0//defined(USE_CSC_GSCALER)
1379 csc_method
= CSC_METHOD_HW
; //in case of Use ION buffer.
1381 pVideoDec
->csc_handle
= csc_init(csc_method
);
1382 if (pVideoDec
->csc_handle
== NULL
) {
1383 ret
= OMX_ErrorInsufficientResources
;
1386 pVideoDec
->csc_set_format
= OMX_FALSE
;
1395 OMX_ERRORTYPE
Exynos_VP8Dec_Terminate(OMX_COMPONENTTYPE
*pOMXComponent
)
1397 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1398 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1399 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1400 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1401 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1402 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1403 OMX_PTR hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
1405 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
1406 ExynosVideoDecBufferOps
*pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
1407 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
1413 if (pVideoDec
->csc_handle
!= NULL
) {
1414 csc_deinit(pVideoDec
->csc_handle
);
1415 pVideoDec
->csc_handle
= NULL
;
1418 Exynos_OSAL_SignalTerminate(pVp8Dec
->hDestinationStartEvent
);
1419 pVp8Dec
->hDestinationStartEvent
= NULL
;
1420 pVp8Dec
->bDestinationStart
= OMX_FALSE
;
1421 Exynos_OSAL_SignalTerminate(pVp8Dec
->hSourceStartEvent
);
1422 pVp8Dec
->hSourceStartEvent
= NULL
;
1423 pVp8Dec
->bSourceStart
= OMX_FALSE
;
1425 if ((pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1426 Exynos_Free_CodecBuffers(pOMXComponent
, OUTPUT_PORT_INDEX
);
1427 Exynos_OSAL_QueueTerminate(&pExynosOutputPort
->codecBufferQ
);
1428 Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort
->codecSemID
);
1429 } else if (pExynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
1433 /* Does not require any actions. */
1436 if ((pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1437 Exynos_Free_CodecBuffers(pOMXComponent
, INPUT_PORT_INDEX
);
1438 Exynos_OSAL_QueueTerminate(&pExynosInputPort
->codecBufferQ
);
1439 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->codecSemID
);
1440 } else if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
1444 /* Does not require any actions. */
1446 VP8CodecClose(pVp8Dec
);
1448 Exynos_ResetAllPortConfig(pOMXComponent
);
1456 OMX_ERRORTYPE
Exynos_VP8Dec_SrcIn(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
1458 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1459 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1460 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1461 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1462 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
1463 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1464 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1465 OMX_U32 oneFrameSize
= pSrcInputData
->dataLen
;
1466 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
1467 ExynosVideoDecBufferOps
*pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
1468 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
1469 ExynosVideoErrorType codecReturn
= VIDEO_ERROR_NONE
;
1474 if (pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCSrc
== OMX_FALSE
) {
1475 ret
= VP8CodecSrcSetup(pOMXComponent
, pSrcInputData
);
1478 if (pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCDst
== OMX_FALSE
) {
1479 ret
= VP8CodecDstSetup(pOMXComponent
);
1482 if ((Check_VP8_StartCode(pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
, oneFrameSize
) == OMX_TRUE
) ||
1483 ((pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)) {
1484 pExynosComponent
->timeStamp
[pVp8Dec
->hMFCVp8Handle
.indexTimestamp
] = pSrcInputData
->timeStamp
;
1485 pExynosComponent
->nFlags
[pVp8Dec
->hMFCVp8Handle
.indexTimestamp
] = pSrcInputData
->nFlags
;
1486 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData
->timeStamp
, pSrcInputData
->timeStamp
/ 1E6
, pVp8Dec
->hMFCVp8Handle
.indexTimestamp
, pSrcInputData
->nFlags
);
1487 pDecOps
->Set_FrameTag(hMFCHandle
, pVp8Dec
->hMFCVp8Handle
.indexTimestamp
);
1488 pVp8Dec
->hMFCVp8Handle
.indexTimestamp
++;
1489 pVp8Dec
->hMFCVp8Handle
.indexTimestamp
%= MAX_TIMESTAMP
;
1491 /* queue work for input buffer */
1492 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize
, pSrcInputData
->bufferHeader
, pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
);
1493 codecReturn
= pInbufOps
->Enqueue(hMFCHandle
, (unsigned char **)&pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
,
1494 (unsigned int *)&oneFrameSize
, MFC_INPUT_BUFFER_PLANE
, pSrcInputData
->bufferHeader
);
1495 if (codecReturn
!= VIDEO_ERROR_NONE
) {
1496 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1497 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s : %d", __FUNCTION__
, __LINE__
);
1500 VP8CodecStart(pOMXComponent
, INPUT_PORT_INDEX
);
1501 if (pVp8Dec
->bSourceStart
== OMX_FALSE
) {
1502 pVp8Dec
->bSourceStart
= OMX_TRUE
;
1503 Exynos_OSAL_SignalSet(pVp8Dec
->hSourceStartEvent
);
1504 Exynos_OSAL_SleepMillisec(0);
1506 if (pVp8Dec
->bDestinationStart
== OMX_FALSE
) {
1507 pVp8Dec
->bDestinationStart
= OMX_TRUE
;
1508 Exynos_OSAL_SignalSet(pVp8Dec
->hDestinationStartEvent
);
1509 Exynos_OSAL_SleepMillisec(0);
1513 ret
= OMX_ErrorNone
;
1521 OMX_ERRORTYPE
Exynos_VP8Dec_SrcOut(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcOutputData
)
1523 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1524 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1525 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1526 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1527 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
1528 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1529 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
1530 ExynosVideoDecBufferOps
*pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
1531 ExynosVideoBuffer
*pVideoBuffer
;
1535 pVideoBuffer
= pInbufOps
->Dequeue(hMFCHandle
);
1537 pSrcOutputData
->dataLen
= 0;
1538 pSrcOutputData
->usedDataLen
= 0;
1539 pSrcOutputData
->remainDataLen
= 0;
1540 pSrcOutputData
->nFlags
= 0;
1541 pSrcOutputData
->timeStamp
= 0;
1543 if (pVideoBuffer
== NULL
) {
1544 pSrcOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
= NULL
;
1545 pSrcOutputData
->allocSize
= 0;
1546 pSrcOutputData
->pPrivate
= NULL
;
1547 pSrcOutputData
->bufferHeader
= NULL
;
1549 pSrcOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
= pVideoBuffer
->planes
[0].addr
;
1550 pSrcOutputData
->buffer
.singlePlaneBuffer
.fd
= pVideoBuffer
->planes
[0].fd
;
1551 pSrcOutputData
->allocSize
= pVideoBuffer
->planes
[0].allocSize
;
1553 if ((pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1555 while (pSrcOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
!= pVideoDec
->pMFCDecInputBuffer
[i
]->pVirAddr
[0]) {
1556 if (i
>= MFC_INPUT_BUFFER_NUM_MAX
) {
1557 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can not find buffer");
1558 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1563 pVideoDec
->pMFCDecInputBuffer
[i
]->dataSize
= 0;
1564 pSrcOutputData
->pPrivate
= pVideoDec
->pMFCDecInputBuffer
[i
];
1567 /* For Share Buffer */
1568 pSrcOutputData
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)pVideoBuffer
->pPrivate
;
1571 ret
= OMX_ErrorNone
;
1579 OMX_ERRORTYPE
Exynos_VP8Dec_DstIn(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstInputData
)
1581 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1582 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1583 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1584 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1585 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
1586 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1587 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
1588 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
1589 OMX_U32 dataLen
[MFC_OUTPUT_BUFFER_PLANE
] = {0,};
1590 ExynosVideoErrorType codecReturn
= VIDEO_ERROR_NONE
;
1594 if (pDstInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] == NULL
) {
1595 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to find input buffer");
1596 ret
= OMX_ErrorBadParameter
;
1600 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x, FD[0]:%d, FD[1]:%d", __FUNCTION__
, __LINE__
,
1601 pDstInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0],
1602 pDstInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[1],
1603 pDstInputData
->buffer
.multiPlaneBuffer
.fd
[0],
1604 pDstInputData
->buffer
.multiPlaneBuffer
.fd
[1]);
1606 OMX_U32 nAllocLen
[VIDEO_BUFFER_MAX_PLANES
] = {0, 0, 0};
1607 nAllocLen
[0] = pExynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
* pExynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
;
1608 nAllocLen
[1] = pExynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
* pExynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
/ 2;
1610 codecReturn
= pOutbufOps
->ExtensionEnqueue(hMFCHandle
,
1611 (unsigned char **)pDstInputData
->buffer
.multiPlaneBuffer
.dataBuffer
,
1612 (unsigned int **)pDstInputData
->buffer
.multiPlaneBuffer
.fd
,
1613 (unsigned int *)nAllocLen
, (unsigned int *)dataLen
,
1614 MFC_OUTPUT_BUFFER_PLANE
, pDstInputData
->bufferHeader
);
1615 if (codecReturn
!= VIDEO_ERROR_NONE
) {
1616 if (codecReturn
!= VIDEO_ERROR_WRONGBUFFERSIZE
) {
1617 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s : %d", __FUNCTION__
, __LINE__
);
1618 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1622 VP8CodecStart(pOMXComponent
, OUTPUT_PORT_INDEX
);
1624 ret
= OMX_ErrorNone
;
1632 OMX_ERRORTYPE
Exynos_VP8Dec_DstOut(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstOutputData
)
1634 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1635 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1636 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1637 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1638 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
1639 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1640 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1641 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
1642 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
1643 ExynosVideoBuffer
*pVideoBuffer
;
1644 ExynosVideoBuffer videoBuffer
;
1645 ExynosVideoFrameStatusType displayStatus
= VIDEO_FRAME_STATUS_UNKNOWN
;
1646 ExynosVideoGeometry
*bufferGeometry
;
1647 DECODE_CODEC_EXTRA_BUFFERINFO
*pBufferInfo
= NULL
;
1648 OMX_S32 indexTimestamp
= 0;
1653 if (pVp8Dec
->bDestinationStart
== OMX_FALSE
) {
1654 ret
= OMX_ErrorNone
;
1659 Exynos_OSAL_Memset(&videoBuffer
, 0, sizeof(ExynosVideoBuffer
));
1660 if (pOutbufOps
->ExtensionDequeue(hMFCHandle
, &videoBuffer
) == VIDEO_ERROR_NONE
) {
1661 pVideoBuffer
= &videoBuffer
;
1663 pVideoBuffer
= NULL
;
1664 ret
= OMX_ErrorNone
;
1667 displayStatus
= pVideoBuffer
->displayStatus
;
1668 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "displayStatus: 0x%x", displayStatus
);
1670 if ((displayStatus
== VIDEO_FRAME_STATUS_DISPLAY_DECODING
) ||
1671 (displayStatus
== VIDEO_FRAME_STATUS_DISPLAY_ONLY
) ||
1672 (displayStatus
== VIDEO_FRAME_STATUS_CHANGE_RESOL
) ||
1673 (displayStatus
== VIDEO_FRAME_STATUS_DECODING_FINISHED
) ||
1674 (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
1675 if (pVideoBuffer
!= NULL
) {
1676 ret
= OMX_ErrorNone
;
1679 ret
= OMX_ErrorUndefined
;
1685 if ((pVideoDec
->bThumbnailMode
== OMX_FALSE
) &&
1686 (displayStatus
== VIDEO_FRAME_STATUS_CHANGE_RESOL
)) {
1687 if (pVideoDec
->bReconfigDPB
!= OMX_TRUE
) {
1688 pExynosOutputPort
->exceptionFlag
= NEED_PORT_FLUSH
;
1689 pVideoDec
->bReconfigDPB
= OMX_TRUE
;
1690 VP8CodecCheckResolutionChange(pOMXComponent
);
1691 pVideoDec
->csc_set_format
= OMX_FALSE
;
1693 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "VIDEO_FRAME_STATUS_CHANGE_RESOL");
1694 ret
= OMX_ErrorNone
;
1698 if (ret
!= OMX_ErrorNone
)
1701 pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
++;
1702 pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
%= MAX_TIMESTAMP
;
1704 pDstOutputData
->allocSize
= pDstOutputData
->dataLen
= 0;
1705 for (plane
= 0; plane
< MFC_OUTPUT_BUFFER_PLANE
; plane
++) {
1706 pDstOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[plane
] = pVideoBuffer
->planes
[plane
].addr
;
1707 pDstOutputData
->buffer
.multiPlaneBuffer
.fd
[plane
] = pVideoBuffer
->planes
[plane
].fd
;
1708 pDstOutputData
->allocSize
+= pVideoBuffer
->planes
[plane
].allocSize
;
1709 pDstOutputData
->dataLen
+= pVideoBuffer
->planes
[plane
].dataSize
;
1711 pDstOutputData
->usedDataLen
= 0;
1712 pDstOutputData
->pPrivate
= pVideoBuffer
;
1713 if (pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) {
1715 pDstOutputData
->pPrivate
= NULL
;
1717 for (i
= 0; i
< MFC_OUTPUT_BUFFER_NUM_MAX
; i
++) {
1718 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecOutputBuffer[%d]:0x%x", i
, pVideoDec
->pMFCDecOutputBuffer
[i
]);
1719 if ((pVideoDec
->pMFCDecOutputBuffer
[i
] != NULL
) &&
1720 (pDstOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] ==
1721 pVideoDec
->pMFCDecOutputBuffer
[i
]->pVirAddr
[0])) {
1722 pDstOutputData
->pPrivate
= pVideoDec
->pMFCDecOutputBuffer
[i
];
1723 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x, FD[0]:%d, FD[1]:%d", __FUNCTION__
, __LINE__
,
1724 pVideoDec
->pMFCDecOutputBuffer
[i
]->pVirAddr
[0],
1725 pVideoDec
->pMFCDecOutputBuffer
[i
]->pVirAddr
[1],
1726 pVideoDec
->pMFCDecOutputBuffer
[i
]->fd
[0],
1727 pVideoDec
->pMFCDecOutputBuffer
[i
]->fd
[1]);
1732 if (pDstOutputData
->pPrivate
== NULL
) {
1733 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can not find buffer");
1734 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1738 /* For Share Buffer */
1739 pDstOutputData
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)pVideoBuffer
->pPrivate
;
1741 pBufferInfo
= (DECODE_CODEC_EXTRA_BUFFERINFO
*)pDstOutputData
->extInfo
;
1742 bufferGeometry
= &pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
;
1743 pBufferInfo
->imageWidth
= bufferGeometry
->nFrameWidth
;
1744 pBufferInfo
->imageHeight
= bufferGeometry
->nFrameHeight
;
1745 Exynos_OSAL_Memcpy(&pBufferInfo
->PDSB
, &pVideoBuffer
->PDSB
, sizeof(PrivateDataShareBuffer
));
1746 switch (bufferGeometry
->eColorFormat
) {
1747 case VIDEO_COLORFORMAT_NV12
:
1748 pBufferInfo
->ColorFormat
= OMX_COLOR_FormatYUV420SemiPlanar
;
1750 case VIDEO_COLORFORMAT_NV12_TILED
:
1752 pBufferInfo
->ColorFormat
= OMX_SEC_COLOR_FormatNV12Tiled
;
1756 indexTimestamp
= pDecOps
->Get_FrameTag(hMFCHandle
);
1757 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "out indexTimestamp: %d", indexTimestamp
);
1758 if ((indexTimestamp
< 0) || (indexTimestamp
>= MAX_TIMESTAMP
)) {
1759 if ((pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
!= OMX_TRUE
) &&
1760 (pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
!= OMX_TRUE
)) {
1761 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
];
1762 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
];
1763 pExynosComponent
->nFlags
[pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
] = 0x00;
1764 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "missing out indexTimestamp: %d", indexTimestamp
);
1766 pDstOutputData
->timeStamp
= 0x00;
1767 pDstOutputData
->nFlags
= 0x00;
1770 /* For timestamp correction. if mfc support frametype detect */
1771 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "disp_pic_frame_type: %d", pVideoBuffer
->frameType
);
1772 #ifdef NEED_TIMESTAMP_REORDER
1773 if ((pVideoBuffer
->frameType
== VIDEO_FRAME_I
)) {
1774 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[indexTimestamp
];
1775 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[indexTimestamp
];
1776 pExynosComponent
->nFlags
[indexTimestamp
] = 0x00;
1777 pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
= indexTimestamp
;
1779 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
];
1780 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
];
1781 pExynosComponent
->nFlags
[pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
] = 0x00;
1784 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[indexTimestamp
];
1785 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[indexTimestamp
];
1786 pExynosComponent
->nFlags
[indexTimestamp
] = 0x00;
1788 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData
->timeStamp
, pDstOutputData
->timeStamp
/ 1E6
, indexTimestamp
, pDstOutputData
->nFlags
);
1791 if ((displayStatus
== VIDEO_FRAME_STATUS_DECODING_FINISHED
) ||
1792 ((pDstOutputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)) {
1793 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "displayStatus:%d, nFlags0x%x", displayStatus
, pDstOutputData
->nFlags
);
1794 pDstOutputData
->remainDataLen
= 0;
1795 if (((pDstOutputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) &&
1796 (pExynosComponent
->bBehaviorEOS
== OMX_TRUE
)) {
1797 pDstOutputData
->remainDataLen
= bufferGeometry
->nFrameWidth
* bufferGeometry
->nFrameHeight
* 3 / 2;
1798 pExynosComponent
->bBehaviorEOS
= OMX_FALSE
;
1801 pDstOutputData
->remainDataLen
= bufferGeometry
->nFrameWidth
* bufferGeometry
->nFrameHeight
* 3 / 2;
1804 ret
= OMX_ErrorNone
;
1812 OMX_ERRORTYPE
Exynos_VP8Dec_srcInputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
1814 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1815 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1816 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1817 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1821 if ((!CHECK_PORT_ENABLED(pExynosInputPort
)) || (!CHECK_PORT_POPULATED(pExynosInputPort
))) {
1822 ret
= OMX_ErrorNone
;
1825 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) {
1826 ret
= OMX_ErrorNone
;
1830 ret
= Exynos_VP8Dec_SrcIn(pOMXComponent
, pSrcInputData
);
1831 if ((ret
!= OMX_ErrorNone
) && (ret
!= OMX_ErrorInputDataDecodeYet
)) {
1832 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
1833 pExynosComponent
->callbackData
,
1834 OMX_EventError
, ret
, 0, NULL
);
1843 OMX_ERRORTYPE
Exynos_VP8Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcOutputData
)
1845 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1846 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1847 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1848 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1852 if ((!CHECK_PORT_ENABLED(pExynosInputPort
)) || (!CHECK_PORT_POPULATED(pExynosInputPort
))) {
1853 ret
= OMX_ErrorNone
;
1857 if ((pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1858 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) {
1859 ret
= OMX_ErrorNone
;
1863 if ((pVp8Dec
->bSourceStart
== OMX_FALSE
) &&
1864 (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort
))) {
1865 Exynos_OSAL_SignalWait(pVp8Dec
->hSourceStartEvent
, DEF_MAX_WAIT_TIME
);
1866 Exynos_OSAL_SignalReset(pVp8Dec
->hSourceStartEvent
);
1869 ret
= Exynos_VP8Dec_SrcOut(pOMXComponent
, pSrcOutputData
);
1870 if ((ret
!= OMX_ErrorNone
) &&
1871 (pExynosComponent
->currentState
== OMX_StateExecuting
)) {
1872 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
1873 pExynosComponent
->callbackData
,
1874 OMX_EventError
, ret
, 0, NULL
);
1883 OMX_ERRORTYPE
Exynos_VP8Dec_dstInputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstInputData
)
1885 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1886 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1887 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1888 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1892 if ((!CHECK_PORT_ENABLED(pExynosOutputPort
)) || (!CHECK_PORT_POPULATED(pExynosOutputPort
))) {
1893 ret
= OMX_ErrorNone
;
1896 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) {
1897 ret
= OMX_ErrorNone
;
1900 if (pExynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
1901 if ((pVp8Dec
->bDestinationStart
== OMX_FALSE
) &&
1902 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
1903 Exynos_OSAL_SignalWait(pVp8Dec
->hDestinationStartEvent
, DEF_MAX_WAIT_TIME
);
1904 Exynos_OSAL_SignalReset(pVp8Dec
->hDestinationStartEvent
);
1907 if (pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCDst
== OMX_TRUE
) {
1908 ret
= Exynos_VP8Dec_DstIn(pOMXComponent
, pDstInputData
);
1909 if (ret
!= OMX_ErrorNone
) {
1910 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
1911 pExynosComponent
->callbackData
,
1912 OMX_EventError
, ret
, 0, NULL
);
1922 OMX_ERRORTYPE
Exynos_VP8Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstOutputData
)
1924 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1925 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1926 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1927 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1931 if ((!CHECK_PORT_ENABLED(pExynosOutputPort
)) || (!CHECK_PORT_POPULATED(pExynosOutputPort
))) {
1932 ret
= OMX_ErrorNone
;
1935 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) {
1936 ret
= OMX_ErrorNone
;
1940 if ((pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1941 if ((pVp8Dec
->bDestinationStart
== OMX_FALSE
) &&
1942 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
1943 Exynos_OSAL_SignalWait(pVp8Dec
->hDestinationStartEvent
, DEF_MAX_WAIT_TIME
);
1944 Exynos_OSAL_SignalReset(pVp8Dec
->hDestinationStartEvent
);
1947 ret
= Exynos_VP8Dec_DstOut(pOMXComponent
, pDstOutputData
);
1948 if ((ret
!= OMX_ErrorNone
) &&
1949 (pExynosComponent
->currentState
== OMX_StateExecuting
)) {
1950 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
1951 pExynosComponent
->callbackData
,
1952 OMX_EventError
, ret
, 0, NULL
);
1961 OSCL_EXPORT_REF OMX_ERRORTYPE
Exynos_OMX_ComponentInit(
1962 OMX_HANDLETYPE hComponent
,
1963 OMX_STRING componentName
)
1965 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1966 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1967 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1968 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1969 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
1970 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
1975 if ((hComponent
== NULL
) || (componentName
== NULL
)) {
1976 ret
= OMX_ErrorBadParameter
;
1977 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, Line:%d", __LINE__
);
1980 if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_VP8_DEC
, componentName
) != 0) {
1981 ret
= OMX_ErrorBadParameter
;
1982 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName
, __LINE__
);
1986 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1987 ret
= Exynos_OMX_VideoDecodeComponentInit(pOMXComponent
);
1988 if (ret
!= OMX_ErrorNone
) {
1989 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_Error, Line:%d", __LINE__
);
1992 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1993 pExynosComponent
->codecType
= HW_VIDEO_DEC_CODEC
;
1995 pExynosComponent
->componentName
= (OMX_STRING
)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE
);
1996 if (pExynosComponent
->componentName
== NULL
) {
1997 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
1998 ret
= OMX_ErrorInsufficientResources
;
1999 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
2002 Exynos_OSAL_Memset(pExynosComponent
->componentName
, 0, MAX_OMX_COMPONENT_NAME_SIZE
);
2004 pVp8Dec
= Exynos_OSAL_Malloc(sizeof(EXYNOS_VP8DEC_HANDLE
));
2005 if (pVp8Dec
== NULL
) {
2006 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
2007 ret
= OMX_ErrorInsufficientResources
;
2008 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
2011 Exynos_OSAL_Memset(pVp8Dec
, 0, sizeof(EXYNOS_VP8DEC_HANDLE
));
2012 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2013 pVideoDec
->hCodecHandle
= (OMX_HANDLETYPE
)pVp8Dec
;
2015 Exynos_OSAL_Strcpy(pExynosComponent
->componentName
, EXYNOS_OMX_COMPONENT_VP8_DEC
);
2017 /* Set componentVersion */
2018 pExynosComponent
->componentVersion
.s
.nVersionMajor
= VERSIONMAJOR_NUMBER
;
2019 pExynosComponent
->componentVersion
.s
.nVersionMinor
= VERSIONMINOR_NUMBER
;
2020 pExynosComponent
->componentVersion
.s
.nRevision
= REVISION_NUMBER
;
2021 pExynosComponent
->componentVersion
.s
.nStep
= STEP_NUMBER
;
2022 /* Set specVersion */
2023 pExynosComponent
->specVersion
.s
.nVersionMajor
= VERSIONMAJOR_NUMBER
;
2024 pExynosComponent
->specVersion
.s
.nVersionMinor
= VERSIONMINOR_NUMBER
;
2025 pExynosComponent
->specVersion
.s
.nRevision
= REVISION_NUMBER
;
2026 pExynosComponent
->specVersion
.s
.nStep
= STEP_NUMBER
;
2029 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
2030 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
2031 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
2032 pExynosPort
->portDefinition
.format
.video
.nStride
= 0; /*DEFAULT_FRAME_WIDTH;*/
2033 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
2034 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_INPUT_BUFFER_SIZE
;
2035 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingVPX
;
2036 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
2037 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "video/x-vnd.on2.vp8");
2038 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
2039 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
2040 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatUnused
;
2041 pExynosPort
->portDefinition
.bEnabled
= OMX_TRUE
;
2042 pExynosPort
->bufferProcessType
= BUFFER_SHARE
;
2043 pExynosPort
->portWayType
= WAY2_PORT
;
2046 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
2047 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
2048 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
2049 pExynosPort
->portDefinition
.format
.video
.nStride
= 0; /*DEFAULT_FRAME_WIDTH;*/
2050 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
2051 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE
;
2052 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingUnused
;
2053 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
2054 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "raw/video");
2055 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
2056 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
2057 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatYUV420Planar
;
2058 pExynosPort
->portDefinition
.bEnabled
= OMX_TRUE
;
2059 pExynosPort
->bufferProcessType
= BUFFER_COPY
| BUFFER_ANBSHARE
;
2060 pExynosPort
->portWayType
= WAY2_PORT
;
2062 pOMXComponent
->GetParameter
= &Exynos_VP8Dec_GetParameter
;
2063 pOMXComponent
->SetParameter
= &Exynos_VP8Dec_SetParameter
;
2064 pOMXComponent
->GetConfig
= &Exynos_VP8Dec_GetConfig
;
2065 pOMXComponent
->SetConfig
= &Exynos_VP8Dec_SetConfig
;
2066 pOMXComponent
->GetExtensionIndex
= &Exynos_VP8Dec_GetExtensionIndex
;
2067 pOMXComponent
->ComponentRoleEnum
= &Exynos_VP8Dec_ComponentRoleEnum
;
2068 pOMXComponent
->ComponentDeInit
= &Exynos_OMX_ComponentDeinit
;
2070 pExynosComponent
->exynos_codec_componentInit
= &Exynos_VP8Dec_Init
;
2071 pExynosComponent
->exynos_codec_componentTerminate
= &Exynos_VP8Dec_Terminate
;
2073 pVideoDec
->exynos_codec_srcInputProcess
= &Exynos_VP8Dec_srcInputBufferProcess
;
2074 pVideoDec
->exynos_codec_srcOutputProcess
= &Exynos_VP8Dec_srcOutputBufferProcess
;
2075 pVideoDec
->exynos_codec_dstInputProcess
= &Exynos_VP8Dec_dstInputBufferProcess
;
2076 pVideoDec
->exynos_codec_dstOutputProcess
= &Exynos_VP8Dec_dstOutputBufferProcess
;
2078 pVideoDec
->exynos_codec_start
= &VP8CodecStart
;
2079 pVideoDec
->exynos_codec_stop
= &VP8CodecStop
;
2080 pVideoDec
->exynos_codec_bufferProcessRun
= &VP8CodecOutputBufferProcessRun
;
2081 pVideoDec
->exynos_codec_enqueueAllBuffer
= &VP8CodecEnQueueAllBuffer
;
2083 pVideoDec
->exynos_checkInputFrame
= &Check_VP8_Frame
;
2084 pVideoDec
->exynos_codec_getCodecInputPrivateData
= &GetCodecInputPrivateData
;
2085 pVideoDec
->exynos_codec_getCodecOutputPrivateData
= &GetCodecOutputPrivateData
;
2086 pVideoDec
->exynos_codec_reconfigAllBuffers
= &VP8CodecReconfigAllBuffers
;
2088 pVideoDec
->hSharedMemory
= Exynos_OSAL_SharedMemory_Open();
2089 if (pVideoDec
->hSharedMemory
== NULL
) {
2090 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
2091 Exynos_OSAL_Free(pVp8Dec
);
2092 pVp8Dec
= ((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
= NULL
;
2093 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
2094 ret
= OMX_ErrorInsufficientResources
;
2098 pExynosComponent
->currentState
= OMX_StateLoaded
;
2100 ret
= OMX_ErrorNone
;
2108 OMX_ERRORTYPE
Exynos_OMX_ComponentDeinit(
2109 OMX_HANDLETYPE hComponent
)
2111 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
2112 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
2113 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
2114 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
2115 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
2119 if (hComponent
== NULL
) {
2120 ret
= OMX_ErrorBadParameter
;
2123 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
2124 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2125 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2127 Exynos_OSAL_SharedMemory_Close(pVideoDec
->hSharedMemory
);
2129 Exynos_OSAL_Free(pExynosComponent
->componentName
);
2130 pExynosComponent
->componentName
= NULL
;
2132 pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
2133 if (pVp8Dec
!= NULL
) {
2134 Exynos_OSAL_Free(pVp8Dec
);
2135 pVp8Dec
= pVideoDec
->hCodecHandle
= NULL
;
2138 ret
= Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
2139 if (ret
!= OMX_ErrorNone
) {
2143 ret
= OMX_ErrorNone
;