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
;
174 ExynosVideoDecOps
*pDecOps
= NULL
;
175 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
176 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
180 if (pVp8Dec
== NULL
) {
181 ret
= OMX_ErrorBadParameter
;
182 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, Line:%d", __LINE__
);
187 /* alloc ops structure */
188 pDecOps
= (ExynosVideoDecOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps
));
189 pInbufOps
= (ExynosVideoDecBufferOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps
));
190 pOutbufOps
= (ExynosVideoDecBufferOps
*)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps
));
192 if ((pDecOps
== NULL
) || (pInbufOps
== NULL
) || (pOutbufOps
== NULL
)) {
193 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to allocate decoder ops buffer");
194 ret
= OMX_ErrorInsufficientResources
;
198 pVp8Dec
->hMFCVp8Handle
.pDecOps
= pDecOps
;
199 pVp8Dec
->hMFCVp8Handle
.pInbufOps
= pInbufOps
;
200 pVp8Dec
->hMFCVp8Handle
.pOutbufOps
= pOutbufOps
;
202 /* function pointer mapping */
203 pDecOps
->nSize
= sizeof(ExynosVideoDecOps
);
204 pInbufOps
->nSize
= sizeof(ExynosVideoDecBufferOps
);
205 pOutbufOps
->nSize
= sizeof(ExynosVideoDecBufferOps
);
207 Exynos_Video_Register_Decoder(pDecOps
, pInbufOps
, pOutbufOps
);
208 /* check mandatory functions for decoder ops */
209 if ((pDecOps
->Init
== NULL
) || (pDecOps
->Finalize
== NULL
) ||
210 (pDecOps
->Get_ActualBufferCount
== NULL
) || (pDecOps
->Set_FrameTag
== NULL
) ||
211 (pDecOps
->Get_FrameTag
== NULL
)) {
212 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Mandatory functions must be supplied");
213 ret
= OMX_ErrorInsufficientResources
;
217 /* check mandatory functions for buffer ops */
218 if ((pInbufOps
->Setup
== NULL
) || (pOutbufOps
->Setup
== NULL
) ||
219 (pInbufOps
->Run
== NULL
) || (pOutbufOps
->Run
== NULL
) ||
220 (pInbufOps
->Stop
== NULL
) || (pOutbufOps
->Stop
== NULL
) ||
221 (pInbufOps
->Enqueue
== NULL
) || (pOutbufOps
->Enqueue
== NULL
) ||
222 (pInbufOps
->Dequeue
== NULL
) || (pOutbufOps
->Dequeue
== NULL
)) {
223 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Mandatory functions must be supplied");
224 ret
= OMX_ErrorInsufficientResources
;
228 /* alloc context, open, querycap */
229 pVp8Dec
->hMFCVp8Handle
.hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.pDecOps
->Init(V4L2_MEMORY_DMABUF
);
230 if (pVp8Dec
->hMFCVp8Handle
.hMFCHandle
== NULL
) {
231 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to allocate context buffer");
232 ret
= OMX_ErrorInsufficientResources
;
244 OMX_ERRORTYPE
VP8CodecClose(EXYNOS_VP8DEC_HANDLE
*pVp8Dec
)
246 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
247 void *hMFCHandle
= NULL
;
248 ExynosVideoDecOps
*pDecOps
= NULL
;
249 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
250 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
252 if (pVp8Dec
== NULL
) {
253 ret
= OMX_ErrorBadParameter
;
257 hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
258 pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
259 pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
260 pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
262 if (hMFCHandle
!= NULL
) {
263 pDecOps
->Finalize(hMFCHandle
);
264 hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
= NULL
;
266 if (pOutbufOps
!= NULL
) {
267 Exynos_OSAL_Free(pOutbufOps
);
268 pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
= NULL
;
270 if (pInbufOps
!= NULL
) {
271 Exynos_OSAL_Free(pInbufOps
);
272 pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
= NULL
;
274 if (pDecOps
!= NULL
) {
275 Exynos_OSAL_Free(pDecOps
);
276 pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
= NULL
;
287 OMX_ERRORTYPE
VP8CodecStart(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
289 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
290 void *hMFCHandle
= NULL
;
291 ExynosVideoDecOps
*pDecOps
= NULL
;
292 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
293 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
294 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
295 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
297 if (pOMXComponent
== NULL
) {
298 ret
= OMX_ErrorBadParameter
;
302 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
303 if (pVideoDec
== NULL
) {
304 ret
= OMX_ErrorBadParameter
;
307 pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
308 if (pVp8Dec
== NULL
) {
309 ret
= OMX_ErrorBadParameter
;
313 hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
314 pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
315 pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
316 pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
318 if (nPortIndex
== INPUT_PORT_INDEX
)
319 pInbufOps
->Run(hMFCHandle
);
320 else if (nPortIndex
== OUTPUT_PORT_INDEX
)
321 pOutbufOps
->Run(hMFCHandle
);
332 OMX_ERRORTYPE
VP8CodecStop(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
334 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
335 void *hMFCHandle
= NULL
;
336 ExynosVideoDecOps
*pDecOps
= NULL
;
337 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
338 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
339 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
340 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
342 if (pOMXComponent
== NULL
) {
343 ret
= OMX_ErrorBadParameter
;
347 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
348 if (pVideoDec
== NULL
) {
349 ret
= OMX_ErrorBadParameter
;
352 pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
353 if (pVp8Dec
== NULL
) {
354 ret
= OMX_ErrorBadParameter
;
359 hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
360 pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
361 pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
362 pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
364 if (nPortIndex
== INPUT_PORT_INDEX
)
365 pInbufOps
->Stop(hMFCHandle
);
366 else if (nPortIndex
== OUTPUT_PORT_INDEX
)
367 pOutbufOps
->Stop(hMFCHandle
);
378 OMX_ERRORTYPE
VP8CodecOutputBufferProcessRun(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
380 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
381 void *hMFCHandle
= NULL
;
382 ExynosVideoDecOps
*pDecOps
= NULL
;
383 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
384 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
385 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
386 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
388 if (pOMXComponent
== NULL
) {
389 ret
= OMX_ErrorBadParameter
;
393 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)((EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
)->hComponentHandle
;
394 if (pVideoDec
== NULL
) {
395 ret
= OMX_ErrorBadParameter
;
398 pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
399 if (pVp8Dec
== NULL
) {
400 ret
= OMX_ErrorBadParameter
;
404 hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
405 pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
406 pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
407 pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
409 if (nPortIndex
== INPUT_PORT_INDEX
) {
410 if (pVp8Dec
->bSourceStart
== OMX_FALSE
) {
411 Exynos_OSAL_SignalSet(pVp8Dec
->hSourceStartEvent
);
412 Exynos_OSAL_SleepMillisec(0);
416 if (nPortIndex
== OUTPUT_PORT_INDEX
) {
417 if (pVp8Dec
->bDestinationStart
== OMX_FALSE
) {
418 Exynos_OSAL_SignalSet(pVp8Dec
->hDestinationStartEvent
);
419 Exynos_OSAL_SleepMillisec(0);
431 OMX_ERRORTYPE
VP8CodecEnQueueAllBuffer(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_U32 nPortIndex
)
433 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
434 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
435 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
436 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
437 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
438 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
439 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
442 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
443 ExynosVideoDecBufferOps
*pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
444 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
447 if ((nPortIndex
== INPUT_PORT_INDEX
) &&
448 (pVp8Dec
->bSourceStart
== OMX_TRUE
)) {
449 Exynos_CodecBufferReset(pExynosComponent
, INPUT_PORT_INDEX
);
451 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++)
453 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i
, pVideoDec
->pMFCDecInputBuffer
[i
]);
454 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i
, pVideoDec
->pMFCDecInputBuffer
[i
]->VirAddr
);
456 Exynos_CodecBufferEnQueue(pExynosComponent
, INPUT_PORT_INDEX
, pVideoDec
->pMFCDecInputBuffer
[i
]);
459 pInbufOps
->Clear_Queue(hMFCHandle
);
460 } else if ((nPortIndex
== OUTPUT_PORT_INDEX
) &&
461 (pVp8Dec
->bDestinationStart
== OMX_TRUE
)) {
462 OMX_U32 dataLen
[2] = {0, 0};
463 ExynosVideoBuffer
*pBuffer
= NULL
;
465 Exynos_CodecBufferReset(pExynosComponent
, OUTPUT_PORT_INDEX
);
467 nOutbufs
= pDecOps
->Get_ActualBufferCount(hMFCHandle
);
468 nOutbufs
+= EXTRA_DPB_NUM
;
469 for (i
= 0; i
< nOutbufs
; i
++) {
470 pOutbufOps
->Get_Buffer(hMFCHandle
, i
, &pBuffer
);
471 Exynos_CodecBufferEnQueue(pExynosComponent
, OUTPUT_PORT_INDEX
, (OMX_PTR
)pBuffer
);
473 pOutbufOps
->Clear_Queue(hMFCHandle
);
475 ret
= OMX_ErrorBadParameter
;
485 OMX_ERRORTYPE
VP8CodecSrcSetup(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
487 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
488 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
489 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
490 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
491 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
492 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
493 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
494 OMX_U32 oneFrameSize
= pSrcInputData
->dataLen
;
496 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
497 ExynosVideoDecBufferOps
*pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
498 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
499 ExynosVideoGeometry bufferConf
;
500 OMX_U32 inputBufferNumber
= 0;
506 if ((oneFrameSize
<= 0) && (pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
)) {
507 EXYNOS_OMX_DATA
*pDstOutputData
= &pExynosOutputPort
->processData
;
508 ret
= Exynos_OutputBufferGetQueue(pExynosComponent
);
509 if (ret
!= OMX_ErrorNone
) {
510 ret
= OMX_ErrorUndefined
;
513 pDstOutputData
->timeStamp
= pSrcInputData
->timeStamp
;
514 pDstOutputData
->nFlags
= pSrcInputData
->nFlags
;
516 Exynos_Postprocess_OutputData(pOMXComponent
, pDstOutputData
);
522 if (pVideoDec
->bThumbnailMode
== OMX_TRUE
)
523 pDecOps
->Set_DisplayDelay(hMFCHandle
, 0);
525 /* input buffer info */
526 Exynos_OSAL_Memset(&bufferConf
, 0, sizeof(bufferConf
));
527 bufferConf
.eCompressionFormat
= VIDEO_CODING_VP8
;
528 pInbufOps
->Set_Shareable(hMFCHandle
);
529 if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
530 bufferConf
.nSizeImage
= pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
* pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
* 3 / 2;
531 inputBufferNumber
= MAX_VIDEO_INPUTBUFFER_NUM
;
532 } else if ((pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
533 bufferConf
.nSizeImage
= DEFAULT_MFC_INPUT_BUFFER_SIZE
;
534 inputBufferNumber
= MFC_INPUT_BUFFER_NUM_MAX
;
537 /* should be done before prepare input buffer */
538 if (pInbufOps
->Enable_Cacheable(hMFCHandle
) != VIDEO_ERROR_NONE
) {
539 ret
= OMX_ErrorInsufficientResources
;
543 /* set input buffer geometry */
544 if (pInbufOps
->Set_Geometry(hMFCHandle
, &bufferConf
) != VIDEO_ERROR_NONE
) {
545 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for input buffer");
546 ret
= OMX_ErrorInsufficientResources
;
550 /* setup input buffer */
551 if (pInbufOps
->Setup(hMFCHandle
, inputBufferNumber
) != VIDEO_ERROR_NONE
) {
552 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup input buffer");
553 ret
= OMX_ErrorInsufficientResources
;
557 if ((pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
558 /* Register input buffer */
559 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++) {
560 ExynosVideoPlane plane
;
561 plane
.addr
= pVideoDec
->pMFCDecInputBuffer
[i
]->VirAddr
;
562 plane
.allocSize
= pVideoDec
->pMFCDecInputBuffer
[i
]->bufferSize
;
564 if (pInbufOps
->Register(hMFCHandle
, &plane
, 1) != VIDEO_ERROR_NONE
) {
565 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Register input buffer");
566 ret
= OMX_ErrorInsufficientResources
;
570 } else if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
571 /* Register input buffer */
572 for (i
= 0; i
< pExynosInputPort
->portDefinition
.nBufferCountActual
; i
++) {
573 ExynosVideoPlane plane
;
574 plane
.addr
= pExynosInputPort
->extendBufferHeader
[i
].OMXBufferHeader
->pBuffer
;
575 plane
.allocSize
= pExynosInputPort
->extendBufferHeader
[i
].OMXBufferHeader
->nAllocLen
;
576 plane
.fd
= pExynosInputPort
->extendBufferHeader
[i
].buf_fd
[0];
578 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,
579 "%s: registering buf %d (hdr=%p) (addr=%p alloc_sz=%ld fd=%d)\n", __func__
,
580 i
, &pExynosInputPort
->extendBufferHeader
[i
], plane
.addr
, plane
.allocSize
,
582 if (pInbufOps
->Register(hMFCHandle
, &plane
, 1) != VIDEO_ERROR_NONE
) {
583 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Register input buffer");
584 ret
= OMX_ErrorInsufficientResources
;
590 /* set output geometry */
591 Exynos_OSAL_Memset(&bufferConf
, 0, sizeof(bufferConf
));
593 pVp8Dec
->hMFCVp8Handle
.MFCOutputColorType
= bufferConf
.eColorFormat
= VIDEO_COLORFORMAT_NV12_TILED
;
594 #else /* This is temporal code to fix broken thumbnail until 3D ddk supports tiled mode */
595 if (pExynosOutputPort
->bIsANBEnabled
== OMX_TRUE
)
596 pVp8Dec
->hMFCVp8Handle
.MFCOutputColorType
= bufferConf
.eColorFormat
= VIDEO_COLORFORMAT_NV12
;
598 pVp8Dec
->hMFCVp8Handle
.MFCOutputColorType
= bufferConf
.eColorFormat
= VIDEO_COLORFORMAT_NV12_TILED
;
600 if (pOutbufOps
->Set_Geometry(hMFCHandle
, &bufferConf
) != VIDEO_ERROR_NONE
) {
601 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to set geometry for output buffer");
602 ret
= OMX_ErrorInsufficientResources
;
606 /* input buffer enqueue for header parsing */
607 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "oneFrameSize: %d", oneFrameSize
);
608 if (pInbufOps
->Enqueue(hMFCHandle
, (unsigned char **)&pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
, (unsigned int *)&oneFrameSize
, 1, pSrcInputData
->bufferHeader
) != VIDEO_ERROR_NONE
) {
609 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to enqueue input buffer for header parsing");
610 // ret = OMX_ErrorInsufficientResources;
611 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecInit
;
615 /* start header parsing */
616 if (pInbufOps
->Run(hMFCHandle
) != VIDEO_ERROR_NONE
) {
617 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to run input buffer for header parsing");
618 ret
= OMX_ErrorCodecInit
;
622 /* get geometry for output */
623 Exynos_OSAL_Memset(&pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
, 0, sizeof(ExynosVideoGeometry
));
624 if (pOutbufOps
->Get_Geometry(hMFCHandle
, &pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
) != VIDEO_ERROR_NONE
) {
625 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to get geometry for parsed header info");
626 ret
= OMX_ErrorInsufficientResources
;
631 pVp8Dec
->hMFCVp8Handle
.MAXDPBNum
= pDecOps
->Get_ActualBufferCount(hMFCHandle
);
632 if (pVideoDec
->bThumbnailMode
== OMX_FALSE
)
633 pVp8Dec
->hMFCVp8Handle
.MAXDPBNum
+= EXTRA_DPB_NUM
;
634 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "Vp8CodecSetup nOutbufs: %d", pVp8Dec
->hMFCVp8Handle
.MAXDPBNum
);
636 pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCSrc
= OMX_TRUE
;
638 if ((pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
639 if ((pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
!= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
) ||
640 (pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
!= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
)) {
641 pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
;
642 pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
;
643 pExynosInputPort
->portDefinition
.format
.video
.nStride
= ((pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
+ 15) & (~15));
644 pExynosInputPort
->portDefinition
.format
.video
.nSliceHeight
= ((pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
+ 15) & (~15));
646 Exynos_UpdateFrameSize(pOMXComponent
);
647 pExynosOutputPort
->exceptionFlag
= NEED_PORT_DISABLE
;
649 /** Send Port Settings changed call back **/
650 (*(pExynosComponent
->pCallbacks
->EventHandler
))
652 pExynosComponent
->callbackData
,
653 OMX_EventPortSettingsChanged
, /* The command was completed */
654 OMX_DirOutput
, /* This is the port index */
658 } else if (pExynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
659 if ((pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
!= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
) ||
660 (pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
!= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
) ||
661 (pExynosOutputPort
->portDefinition
.nBufferCountActual
!= pVp8Dec
->hMFCVp8Handle
.MAXDPBNum
)) {
662 pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
;
663 pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
= pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
;
664 pExynosInputPort
->portDefinition
.format
.video
.nStride
= ((pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
+ 15) & (~15));
665 pExynosInputPort
->portDefinition
.format
.video
.nSliceHeight
= ((pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
+ 15) & (~15));
667 pExynosOutputPort
->portDefinition
.nBufferCountActual
= pVp8Dec
->hMFCVp8Handle
.MAXDPBNum
- 2;
668 pExynosOutputPort
->portDefinition
.nBufferCountMin
= pVp8Dec
->hMFCVp8Handle
.MAXDPBNum
- 2;
670 Exynos_UpdateFrameSize(pOMXComponent
);
671 pExynosOutputPort
->exceptionFlag
= NEED_PORT_DISABLE
;
673 /** Send Port Settings changed call back **/
674 (*(pExynosComponent
->pCallbacks
->EventHandler
))
676 pExynosComponent
->callbackData
,
677 OMX_EventPortSettingsChanged
, /* The command was completed */
678 OMX_DirOutput
, /* This is the port index */
683 Exynos_OSAL_SleepMillisec(0);
684 ret
= OMX_ErrorInputDataDecodeYet
;
685 VP8CodecStop(pOMXComponent
, INPUT_PORT_INDEX
);
693 OMX_ERRORTYPE
VP8CodecDstSetup(OMX_COMPONENTTYPE
*pOMXComponent
)
695 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
696 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
697 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
698 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
699 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
700 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
701 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
703 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
704 ExynosVideoDecBufferOps
*pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
705 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
713 nOutbufs
= pVp8Dec
->hMFCVp8Handle
.MAXDPBNum
;
715 /* should be done before prepare output buffer */
716 if (pOutbufOps
->Enable_Cacheable(hMFCHandle
) != VIDEO_ERROR_NONE
) {
717 ret
= OMX_ErrorInsufficientResources
;
721 pOutbufOps
->Set_Shareable(hMFCHandle
);
722 if (pOutbufOps
->Setup(hMFCHandle
, nOutbufs
) != VIDEO_ERROR_NONE
) {
723 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to setup output buffer");
724 ret
= OMX_ErrorInsufficientResources
;
728 int YBufferSize
= calc_plane(pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
, pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
);
729 int CBufferSize
= calc_plane(pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameWidth
, pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
.nFrameHeight
>> 1);
730 OMX_U32 dataLen
[2] = {0, 0};
731 if ((pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
732 /* Register output buffer */
733 for (i
= 0; i
< nOutbufs
; i
++) {
734 ExynosVideoPlane planes
[2];
737 pVideoDec
->pMFCDecOutputBuffer
[i
] = (CODEC_DEC_OUTPUT_BUFFER
*)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_OUTPUT_BUFFER
));
738 pVideoDec
->pMFCDecOutputBuffer
[i
]->VirAddr
[0] =
739 (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec
->hSharedMemory
, YBufferSize
, NORMAL_MEMORY
);
740 pVideoDec
->pMFCDecOutputBuffer
[i
]->VirAddr
[1] =
741 (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec
->hSharedMemory
, CBufferSize
, NORMAL_MEMORY
);
742 pVideoDec
->pMFCDecOutputBuffer
[i
]->bufferSize
[0] = YBufferSize
;
743 pVideoDec
->pMFCDecOutputBuffer
[i
]->bufferSize
[1] = CBufferSize
;
745 pVideoDec
->pMFCDecOutputBuffer
[i
]->fd
[0] =
746 Exynos_OSAL_SharedMemory_VirtToION(pVideoDec
->hSharedMemory
,
747 pVideoDec
->pMFCDecOutputBuffer
[i
]->VirAddr
[0]);
748 pVideoDec
->pMFCDecOutputBuffer
[i
]->fd
[1] =
749 Exynos_OSAL_SharedMemory_VirtToION(pVideoDec
->hSharedMemory
,
750 pVideoDec
->pMFCDecOutputBuffer
[i
]->VirAddr
[1]);
752 if ((pVideoDec
->pMFCDecOutputBuffer
[i
]->VirAddr
[0] == NULL
) ||
753 (pVideoDec
->pMFCDecOutputBuffer
[i
]->VirAddr
[1] == NULL
)) {
754 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Alloc output buffer");
755 ret
= OMX_ErrorInsufficientResources
;
759 for (plane
= 0; plane
< 2; plane
++) {
760 planes
[plane
].addr
= pVideoDec
->pMFCDecOutputBuffer
[i
]->VirAddr
[plane
];
761 planes
[plane
].allocSize
= pVideoDec
->pMFCDecOutputBuffer
[i
]->bufferSize
[plane
];
762 planes
[plane
].fd
= pVideoDec
->pMFCDecOutputBuffer
[i
]->fd
[plane
];
765 if (pOutbufOps
->Register(hMFCHandle
, planes
, 2) != VIDEO_ERROR_NONE
) {
766 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Register output buffer");
767 ret
= OMX_ErrorInsufficientResources
;
770 pOutbufOps
->Enqueue(hMFCHandle
, (unsigned char **)pVideoDec
->pMFCDecOutputBuffer
[i
]->VirAddr
, (unsigned int *)dataLen
, 2, NULL
);
772 } else if (pExynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
773 /* Register output buffer */
777 // OMX_U32 width = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
778 // OMX_U32 height = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
780 for (i
= 0; i
< pExynosOutputPort
->assignedBufferNum
; i
++) {
781 EXYNOS_OMX_BUFFERHEADERTYPE
*buffer
= &pExynosOutputPort
->extendBufferHeader
[i
];
782 ExynosVideoPlane planes
[2];
785 planes
[0].addr
= buffer
->pYUVBuf
[0];
786 planes
[0].fd
= buffer
->buf_fd
[0];
787 planes
[0].allocSize
= YBufferSize
;
789 planes
[1].addr
= buffer
->pYUVBuf
[1];
790 planes
[1].fd
= buffer
->buf_fd
[1];
791 planes
[1].allocSize
= CBufferSize
;
793 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,
794 "%s: registering buf %d (hdr=%p) (l_addr=%p l_fd=%d c_addr=%p c_fd=%d)\n",
795 __func__
, i
, buffer
, planes
[0].addr
, planes
[0].fd
, planes
[1].addr
,
798 // Exynos_OSAL_LockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, width, height,
799 // pExynosOutputPort->portDefinition.format.video.eColorFormat,
800 // &stride, pExynosOutputPort->extendBufferHeader[i].pYUVBuf);
801 if (pOutbufOps
->Register(hMFCHandle
, planes
, 2) != VIDEO_ERROR_NONE
) {
802 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Register input buffer");
803 ret
= OMX_ErrorInsufficientResources
;
806 pOutbufOps
->Enqueue(hMFCHandle
, (unsigned char **)pExynosOutputPort
->extendBufferHeader
[i
].pYUVBuf
, (unsigned int *)dataLen
, 2, NULL
);
807 // Exynos_OSAL_UnlockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
810 if (pOutbufOps
->Run(hMFCHandle
) != VIDEO_ERROR_NONE
) {
811 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to run output buffer");
812 ret
= OMX_ErrorInsufficientResources
;
816 if (pExynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
817 VP8CodecStop (pOMXComponent
, OUTPUT_PORT_INDEX
);
819 pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCDst
= OMX_TRUE
;
829 OMX_ERRORTYPE
Exynos_VP8Dec_GetParameter(
830 OMX_IN OMX_HANDLETYPE hComponent
,
831 OMX_IN OMX_INDEXTYPE nParamIndex
,
832 OMX_INOUT OMX_PTR pComponentParameterStructure
)
834 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
835 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
836 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
840 if (hComponent
== NULL
|| pComponentParameterStructure
== NULL
) {
841 ret
= OMX_ErrorBadParameter
;
844 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
845 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
846 if (ret
!= OMX_ErrorNone
) {
849 if (pOMXComponent
->pComponentPrivate
== NULL
) {
850 ret
= OMX_ErrorBadParameter
;
854 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
855 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
856 ret
= OMX_ErrorInvalidState
;
860 switch (nParamIndex
) {
861 case OMX_IndexParamStandardComponentRole
:
863 OMX_PARAM_COMPONENTROLETYPE
*pComponentRole
= (OMX_PARAM_COMPONENTROLETYPE
*)pComponentParameterStructure
;
864 ret
= Exynos_OMX_Check_SizeVersion(pComponentRole
, sizeof(OMX_PARAM_COMPONENTROLETYPE
));
865 if (ret
!= OMX_ErrorNone
) {
869 Exynos_OSAL_Strcpy((char *)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE
);
872 case OMX_IndexParamVideoErrorCorrection
:
874 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pDstErrorCorrectionType
= (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*)pComponentParameterStructure
;
875 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pSrcErrorCorrectionType
= NULL
;
876 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
878 ret
= Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType
, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
));
879 if (ret
!= OMX_ErrorNone
) {
883 if (pDstErrorCorrectionType
->nPortIndex
!= INPUT_PORT_INDEX
) {
884 ret
= OMX_ErrorBadPortIndex
;
888 pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
889 pSrcErrorCorrectionType
= &pVp8Dec
->errorCorrectionType
[INPUT_PORT_INDEX
];
891 pDstErrorCorrectionType
->bEnableHEC
= pSrcErrorCorrectionType
->bEnableHEC
;
892 pDstErrorCorrectionType
->bEnableResync
= pSrcErrorCorrectionType
->bEnableResync
;
893 pDstErrorCorrectionType
->nResynchMarkerSpacing
= pSrcErrorCorrectionType
->nResynchMarkerSpacing
;
894 pDstErrorCorrectionType
->bEnableDataPartitioning
= pSrcErrorCorrectionType
->bEnableDataPartitioning
;
895 pDstErrorCorrectionType
->bEnableRVLC
= pSrcErrorCorrectionType
->bEnableRVLC
;
899 ret
= Exynos_OMX_VideoDecodeGetParameter(hComponent
, nParamIndex
, pComponentParameterStructure
);
908 OMX_ERRORTYPE
Exynos_VP8Dec_SetParameter(
909 OMX_IN OMX_HANDLETYPE hComponent
,
910 OMX_IN OMX_INDEXTYPE nIndex
,
911 OMX_IN OMX_PTR pComponentParameterStructure
)
913 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
914 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
915 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
919 if (hComponent
== NULL
|| pComponentParameterStructure
== NULL
) {
920 ret
= OMX_ErrorBadParameter
;
923 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
924 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
925 if (ret
!= OMX_ErrorNone
) {
928 if (pOMXComponent
->pComponentPrivate
== NULL
) {
929 ret
= OMX_ErrorBadParameter
;
933 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
934 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
935 ret
= OMX_ErrorInvalidState
;
940 case OMX_IndexParamStandardComponentRole
:
942 OMX_PARAM_COMPONENTROLETYPE
*pComponentRole
= (OMX_PARAM_COMPONENTROLETYPE
*)pComponentParameterStructure
;
944 ret
= Exynos_OMX_Check_SizeVersion(pComponentRole
, sizeof(OMX_PARAM_COMPONENTROLETYPE
));
945 if (ret
!= OMX_ErrorNone
) {
949 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) && (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
950 ret
= OMX_ErrorIncorrectStateOperation
;
954 if (!Exynos_OSAL_Strcmp((char*)pComponentRole
->cRole
, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE
)) {
955 pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingVPX
;
957 ret
= OMX_ErrorBadParameter
;
962 case OMX_IndexParamVideoErrorCorrection
:
964 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pSrcErrorCorrectionType
= (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*)pComponentParameterStructure
;
965 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
*pDstErrorCorrectionType
= NULL
;
966 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
968 ret
= Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType
, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE
));
969 if (ret
!= OMX_ErrorNone
) {
973 if (pSrcErrorCorrectionType
->nPortIndex
!= INPUT_PORT_INDEX
) {
974 ret
= OMX_ErrorBadPortIndex
;
978 pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
979 pDstErrorCorrectionType
= &pVp8Dec
->errorCorrectionType
[INPUT_PORT_INDEX
];
981 pDstErrorCorrectionType
->bEnableHEC
= pSrcErrorCorrectionType
->bEnableHEC
;
982 pDstErrorCorrectionType
->bEnableResync
= pSrcErrorCorrectionType
->bEnableResync
;
983 pDstErrorCorrectionType
->nResynchMarkerSpacing
= pSrcErrorCorrectionType
->nResynchMarkerSpacing
;
984 pDstErrorCorrectionType
->bEnableDataPartitioning
= pSrcErrorCorrectionType
->bEnableDataPartitioning
;
985 pDstErrorCorrectionType
->bEnableRVLC
= pSrcErrorCorrectionType
->bEnableRVLC
;
989 ret
= Exynos_OMX_VideoDecodeSetParameter(hComponent
, nIndex
, pComponentParameterStructure
);
998 OMX_ERRORTYPE
Exynos_VP8Dec_GetConfig(
999 OMX_HANDLETYPE hComponent
,
1000 OMX_INDEXTYPE nIndex
,
1001 OMX_PTR pComponentConfigStructure
)
1003 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1004 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1005 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1009 if (hComponent
== NULL
) {
1010 ret
= OMX_ErrorBadParameter
;
1013 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1014 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1015 if (ret
!= OMX_ErrorNone
) {
1019 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1020 ret
= OMX_ErrorBadParameter
;
1024 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1026 if (pComponentConfigStructure
== NULL
) {
1027 ret
= OMX_ErrorBadParameter
;
1030 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1031 ret
= OMX_ErrorInvalidState
;
1037 ret
= Exynos_OMX_VideoDecodeGetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1047 OMX_ERRORTYPE
Exynos_VP8Dec_SetConfig(
1048 OMX_HANDLETYPE hComponent
,
1049 OMX_INDEXTYPE nIndex
,
1050 OMX_PTR pComponentConfigStructure
)
1052 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1053 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1054 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1058 if (hComponent
== NULL
) {
1059 ret
= OMX_ErrorBadParameter
;
1062 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1063 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1064 if (ret
!= OMX_ErrorNone
) {
1068 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1069 ret
= OMX_ErrorBadParameter
;
1073 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1075 if (pComponentConfigStructure
== NULL
) {
1076 ret
= OMX_ErrorBadParameter
;
1079 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1080 ret
= OMX_ErrorInvalidState
;
1086 ret
= Exynos_OMX_VideoDecodeSetConfig(hComponent
, nIndex
, pComponentConfigStructure
);
1096 OMX_ERRORTYPE
Exynos_VP8Dec_GetExtensionIndex(
1097 OMX_IN OMX_HANDLETYPE hComponent
,
1098 OMX_IN OMX_STRING cParameterName
,
1099 OMX_OUT OMX_INDEXTYPE
*pIndexType
)
1101 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1102 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1103 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1107 if (hComponent
== NULL
) {
1108 ret
= OMX_ErrorBadParameter
;
1111 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1112 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1113 if (ret
!= OMX_ErrorNone
) {
1116 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1117 ret
= OMX_ErrorBadParameter
;
1120 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1121 if ((cParameterName
== NULL
) || (pIndexType
== NULL
)) {
1122 ret
= OMX_ErrorBadParameter
;
1125 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
1126 ret
= OMX_ErrorInvalidState
;
1130 if (Exynos_OSAL_Strcmp(cParameterName
, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL
) == 0) {
1131 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1133 *pIndexType
= OMX_IndexVendorThumbnailMode
;
1135 ret
= OMX_ErrorNone
;
1137 ret
= Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent
, cParameterName
, pIndexType
);
1146 OMX_ERRORTYPE
Exynos_VP8Dec_ComponentRoleEnum(
1147 OMX_HANDLETYPE hComponent
,
1151 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1152 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1153 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1157 if ((hComponent
== NULL
) || (cRole
== NULL
)) {
1158 ret
= OMX_ErrorBadParameter
;
1161 if (nIndex
== (MAX_COMPONENT_ROLE_NUM
-1)) {
1162 Exynos_OSAL_Strcpy((char *)cRole
, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE
);
1163 ret
= OMX_ErrorNone
;
1165 ret
= OMX_ErrorNoMore
;
1175 OMX_ERRORTYPE
Exynos_VP8Dec_Init(OMX_COMPONENTTYPE
*pOMXComponent
)
1177 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1178 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1179 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1180 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1181 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1182 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1183 OMX_PTR hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
1185 ExynosVideoDecOps
*pDecOps
= NULL
;
1186 ExynosVideoDecBufferOps
*pInbufOps
= NULL
;
1187 ExynosVideoDecBufferOps
*pOutbufOps
= NULL
;
1189 CSC_METHOD csc_method
= CSC_METHOD_SW
;
1193 pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCSrc
= OMX_FALSE
;
1194 pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCDst
= OMX_FALSE
;
1195 pExynosComponent
->bUseFlagEOF
= OMX_TRUE
;
1196 pExynosComponent
->bSaveFlagEOS
= OMX_FALSE
;
1198 /* H.264 Codec Open */
1199 ret
= VP8CodecOpen(pVp8Dec
);
1200 if (ret
!= OMX_ErrorNone
) {
1204 pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
1205 pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
1206 pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
1208 if ((pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1209 Exynos_OSAL_SemaphoreCreate(&pExynosInputPort
->codecSemID
);
1210 Exynos_OSAL_QueueCreate(&pExynosInputPort
->codecBufferQ
, MAX_QUEUE_ELEMENTS
);
1212 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++)
1217 /* Use ION Allocator */
1218 pVideoDec
->pMFCDecInputBuffer
[i
] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_INPUT_BUFFER
));
1219 pVideoDec
->pMFCDecInputBuffer
[i
]->VirAddr
= (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec
->hSharedMemory
, DEFAULT_MFC_INPUT_BUFFER_SIZE
, NORMAL_MEMORY
);
1220 if (pVideoDec
->pMFCDecInputBuffer
[i
]->VirAddr
== NULL
) {
1221 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Fail input buffer");
1222 ret
= OMX_ErrorInsufficientResources
;
1225 pVideoDec
->pMFCDecInputBuffer
[i
]->fd
= Exynos_OSAL_SharedMemory_VirtToION(pVideoDec
->hSharedMemory
, pVideoDec
->pMFCDecInputBuffer
[i
]->VirAddr
);
1226 pVideoDec
->pMFCDecInputBuffer
[i
]->bufferSize
= DEFAULT_MFC_INPUT_BUFFER_SIZE
;
1227 pVideoDec
->pMFCDecInputBuffer
[i
]->dataSize
= 0;
1229 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i
, pVideoDec
->pMFCDecInputBuffer
[i
]);
1230 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i
, pVideoDec
->pMFCDecInputBuffer
[i
]->VirAddr
);
1232 Exynos_CodecBufferEnQueue(pExynosComponent
, INPUT_PORT_INDEX
, pVideoDec
->pMFCDecInputBuffer
[i
]);
1234 } else if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
1240 /* Does not require any actions. */
1244 if ((pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1245 Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort
->codecSemID
);
1246 Exynos_OSAL_QueueCreate(&pExynosOutputPort
->codecBufferQ
, MAX_QUEUE_ELEMENTS
);
1247 } else if (pExynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
1251 /* Does not require any actions. */
1254 pVp8Dec
->bSourceStart
= OMX_FALSE
;
1255 Exynos_OSAL_SignalCreate(&pVp8Dec
->hSourceStartEvent
);
1256 pVp8Dec
->bDestinationStart
= OMX_FALSE
;
1257 Exynos_OSAL_SignalCreate(&pVp8Dec
->hDestinationStartEvent
);
1259 Exynos_OSAL_Memset(pExynosComponent
->timeStamp
, -19771003, sizeof(OMX_TICKS
) * MAX_TIMESTAMP
);
1260 Exynos_OSAL_Memset(pExynosComponent
->nFlags
, 0, sizeof(OMX_U32
) * MAX_FLAGS
);
1261 pVp8Dec
->hMFCVp8Handle
.indexTimestamp
= 0;
1262 pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
= 0;
1264 pExynosComponent
->getAllDelayBuffer
= OMX_FALSE
;
1266 #if 0//defined(USE_CSC_GSCALER)
1267 csc_method
= CSC_METHOD_HW
; //in case of Use ION buffer.
1269 pVideoDec
->csc_handle
= csc_init(csc_method
);
1270 if (pVideoDec
->csc_handle
== NULL
) {
1271 ret
= OMX_ErrorInsufficientResources
;
1274 pVideoDec
->csc_set_format
= OMX_FALSE
;
1283 OMX_ERRORTYPE
Exynos_VP8Dec_Terminate(OMX_COMPONENTTYPE
*pOMXComponent
)
1285 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1286 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1287 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1288 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1289 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1290 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1291 OMX_PTR hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
1293 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
1294 ExynosVideoDecBufferOps
*pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
1295 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
1301 if (pVideoDec
->csc_handle
!= NULL
) {
1302 csc_deinit(pVideoDec
->csc_handle
);
1303 pVideoDec
->csc_handle
= NULL
;
1306 // pInbufOps->Stop(hMFCHandle);
1307 // pOutbufOps->Stop(hMFCHandle);
1309 Exynos_OSAL_SignalTerminate(pVp8Dec
->hDestinationStartEvent
);
1310 pVp8Dec
->hDestinationStartEvent
= NULL
;
1311 pVp8Dec
->bDestinationStart
= OMX_FALSE
;
1312 Exynos_OSAL_SignalTerminate(pVp8Dec
->hSourceStartEvent
);
1313 pVp8Dec
->hSourceStartEvent
= NULL
;
1314 pVp8Dec
->bSourceStart
= OMX_FALSE
;
1316 if ((pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1317 for (i
= 0; i
< MFC_OUTPUT_BUFFER_NUM_MAX
; i
++)
1319 if (pVideoDec
->pMFCDecOutputBuffer
[i
] != NULL
) {
1320 if (pVideoDec
->pMFCDecOutputBuffer
[i
]->VirAddr
[0] != NULL
)
1321 Exynos_OSAL_SharedMemory_Free(pVideoDec
->hSharedMemory
, pVideoDec
->pMFCDecOutputBuffer
[i
]->VirAddr
[0]);
1322 if (pVideoDec
->pMFCDecOutputBuffer
[i
]->VirAddr
[1] != NULL
)
1323 Exynos_OSAL_SharedMemory_Free(pVideoDec
->hSharedMemory
, pVideoDec
->pMFCDecOutputBuffer
[i
]->VirAddr
[1]);
1324 Exynos_OSAL_Free(pVideoDec
->pMFCDecOutputBuffer
[i
]);
1325 pVideoDec
->pMFCDecOutputBuffer
[i
] = NULL
;
1329 Exynos_OSAL_QueueTerminate(&pExynosOutputPort
->codecBufferQ
);
1330 Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort
->codecSemID
);
1331 } else if (pExynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
1337 /* Does not require any actions. */
1342 if ((pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1343 for (i
= 0; i
< MFC_INPUT_BUFFER_NUM_MAX
; i
++)
1345 if (pVideoDec
->pMFCDecInputBuffer
[i
] != NULL
) {
1346 if (pVideoDec
->pMFCDecInputBuffer
[i
]->VirAddr
!= NULL
)
1347 Exynos_OSAL_SharedMemory_Free(pVideoDec
->hSharedMemory
, pVideoDec
->pMFCDecInputBuffer
[i
]->VirAddr
);
1348 Exynos_OSAL_Free(pVideoDec
->pMFCDecInputBuffer
[i
]);
1349 pVideoDec
->pMFCDecInputBuffer
[i
] = NULL
;
1353 Exynos_OSAL_QueueTerminate(&pExynosInputPort
->codecBufferQ
);
1354 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->codecSemID
);
1355 } else if (pExynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
1361 /* Does not require any actions. */
1365 VP8CodecClose(pVp8Dec
);
1373 OMX_ERRORTYPE
Exynos_VP8Dec_SrcIn(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
1375 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1376 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1377 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1378 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1379 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
1380 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1381 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1382 OMX_U32 oneFrameSize
= pSrcInputData
->dataLen
;
1383 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
1384 ExynosVideoDecBufferOps
*pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
1385 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
1386 ExynosVideoErrorType codecReturn
= VIDEO_ERROR_NONE
;
1391 if (pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCSrc
== OMX_FALSE
) {
1392 ret
= VP8CodecSrcSetup(pOMXComponent
, pSrcInputData
);
1395 if (pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCDst
== OMX_FALSE
) {
1396 ret
= VP8CodecDstSetup(pOMXComponent
);
1399 if ((Check_VP8_StartCode(pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
, oneFrameSize
) == OMX_TRUE
) ||
1400 ((pSrcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)){
1401 pExynosComponent
->timeStamp
[pVp8Dec
->hMFCVp8Handle
.indexTimestamp
] = pSrcInputData
->timeStamp
;
1402 pExynosComponent
->nFlags
[pVp8Dec
->hMFCVp8Handle
.indexTimestamp
] = pSrcInputData
->nFlags
;
1403 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
);
1404 pDecOps
->Set_FrameTag(hMFCHandle
, pVp8Dec
->hMFCVp8Handle
.indexTimestamp
);
1405 pVp8Dec
->hMFCVp8Handle
.indexTimestamp
++;
1406 pVp8Dec
->hMFCVp8Handle
.indexTimestamp
%= MAX_TIMESTAMP
;
1408 /* queue work for input buffer */
1409 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize
, pSrcInputData
->bufferHeader
, pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
);
1410 codecReturn
= pInbufOps
->Enqueue(hMFCHandle
, (unsigned char **)&pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
, (unsigned int *)&oneFrameSize
, 1, pSrcInputData
->bufferHeader
);
1411 if (codecReturn
!= VIDEO_ERROR_NONE
) {
1412 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1413 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s : %d", __FUNCTION__
, __LINE__
);
1417 VP8CodecStart(pOMXComponent
, INPUT_PORT_INDEX
);
1418 if (pVp8Dec
->bSourceStart
== OMX_FALSE
) {
1419 pVp8Dec
->bSourceStart
= OMX_TRUE
;
1420 Exynos_OSAL_SignalSet(pVp8Dec
->hSourceStartEvent
);
1421 Exynos_OSAL_SleepMillisec(0);
1423 if (pVp8Dec
->bDestinationStart
== OMX_FALSE
) {
1424 pVp8Dec
->bDestinationStart
= OMX_TRUE
;
1425 Exynos_OSAL_SignalSet(pVp8Dec
->hDestinationStartEvent
);
1426 Exynos_OSAL_SleepMillisec(0);
1430 ret
= OMX_ErrorNone
;
1439 OMX_ERRORTYPE
Exynos_VP8Dec_SrcOut(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcOutputData
)
1441 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1442 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1443 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1444 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1445 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
1446 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1447 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
1448 ExynosVideoDecBufferOps
*pInbufOps
= pVp8Dec
->hMFCVp8Handle
.pInbufOps
;
1449 ExynosVideoBuffer
*pVideoBuffer
;
1453 pVideoBuffer
= pInbufOps
->Dequeue(hMFCHandle
);
1455 pSrcOutputData
->dataLen
= 0;
1456 pSrcOutputData
->usedDataLen
= 0;
1457 pSrcOutputData
->remainDataLen
= 0;
1458 pSrcOutputData
->nFlags
= 0;
1459 pSrcOutputData
->timeStamp
= 0;
1461 if (pVideoBuffer
== NULL
) {
1462 pSrcOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
= NULL
;
1463 pSrcOutputData
->buffer
.singlePlaneBuffer
.fd
= 0;
1464 pSrcOutputData
->allocSize
= 0;
1465 pSrcOutputData
->pPrivate
= NULL
;
1466 pSrcOutputData
->bufferHeader
= NULL
;
1468 pSrcOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
= pVideoBuffer
->planes
[0].addr
;
1469 pSrcOutputData
->buffer
.singlePlaneBuffer
.fd
= pVideoBuffer
->planes
[0].fd
;
1470 pSrcOutputData
->allocSize
= pVideoBuffer
->planes
[0].allocSize
;
1472 if ((pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1474 while (pSrcOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
!= pVideoDec
->pMFCDecInputBuffer
[i
]->VirAddr
) {
1475 if (i
>= MFC_INPUT_BUFFER_NUM_MAX
) {
1476 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1477 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can not find buffer");
1483 pVideoDec
->pMFCDecInputBuffer
[i
]->dataSize
= 0;
1484 pSrcOutputData
->pPrivate
= pVideoDec
->pMFCDecInputBuffer
[i
];
1486 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "i: %d, out dataBuffer: 0x%x", i
, pSrcOutputData
->buffer
.singlePlaneBuffer
.dataBuffer
);
1489 /* For Share Buffer */
1490 pSrcOutputData
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)pVideoBuffer
->pPrivate
;
1493 ret
= OMX_ErrorNone
;
1501 OMX_ERRORTYPE
Exynos_VP8Dec_DstIn(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstInputData
)
1503 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1504 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1505 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1506 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1507 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
1508 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
1509 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
1510 OMX_U32 dataLen
= 0;
1511 ExynosVideoErrorType codecReturn
= VIDEO_ERROR_NONE
;
1515 if (pDstInputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] == NULL
) {
1516 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to find input buffer");
1517 ret
= OMX_ErrorBadParameter
;
1521 codecReturn
= pOutbufOps
->Enqueue(hMFCHandle
, (unsigned char **)pDstInputData
->buffer
.multiPlaneBuffer
.dataBuffer
, (unsigned int *)&dataLen
, 2, pDstInputData
->bufferHeader
);
1522 if (codecReturn
!= VIDEO_ERROR_NONE
) {
1523 ret
= (OMX_ERRORTYPE
)OMX_ErrorCodecDecode
;
1524 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "%s : %d", __FUNCTION__
, __LINE__
);
1527 VP8CodecStart(pOMXComponent
, OUTPUT_PORT_INDEX
);
1529 ret
= OMX_ErrorNone
;
1537 OMX_ERRORTYPE
Exynos_VP8Dec_DstOut(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstOutputData
)
1539 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1540 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1541 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1542 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1543 void *hMFCHandle
= pVp8Dec
->hMFCVp8Handle
.hMFCHandle
;
1544 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1545 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1546 ExynosVideoDecOps
*pDecOps
= pVp8Dec
->hMFCVp8Handle
.pDecOps
;
1547 ExynosVideoDecBufferOps
*pOutbufOps
= pVp8Dec
->hMFCVp8Handle
.pOutbufOps
;
1548 ExynosVideoBuffer
*pVideoBuffer
;
1549 ExynosVideoFrameStatusType displayStatus
= VIDEO_FRAME_STATUS_UNKNOWN
;
1550 ExynosVideoGeometry
*bufferGeometry
;
1551 DECODE_CODEC_EXTRA_BUFFERINFO
*pBufferInfo
= NULL
;
1552 OMX_S32 indexTimestamp
= 0;
1556 if (pVp8Dec
->bDestinationStart
== OMX_FALSE
) {
1557 ret
= OMX_ErrorNone
;
1562 if ((pVideoBuffer
= pOutbufOps
->Dequeue(hMFCHandle
)) == NULL
) {
1563 ret
= OMX_ErrorNone
;
1566 displayStatus
= pVideoBuffer
->displayStatus
;
1567 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "displayStatus: 0x%x", displayStatus
);
1569 if ((displayStatus
== VIDEO_FRAME_STATUS_DISPLAY_DECODING
) ||
1570 (displayStatus
== VIDEO_FRAME_STATUS_DISPLAY_ONLY
) ||
1571 (displayStatus
== VIDEO_FRAME_STATUS_CHANGE_RESOL
) ||
1572 (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
1573 if (pVideoBuffer
!= NULL
) {
1574 ret
= OMX_ErrorNone
;
1577 ret
= OMX_ErrorUndefined
;
1582 if ((CHECK_PORT_BEING_FLUSHED(pExynosOutputPort)) &&
1583 (pVideoBuffer != NULL)) {
1584 ret = OMX_ErrorNone;
1589 else if (displayStatus
== VIDEO_FRAME_STATUS_DECODING_ONLY
) {
1590 if (pVideoBuffer
!= NULL
) {
1591 /* Just Flush Case */
1592 ret
= OMX_ErrorNone
;
1599 if (ret
!= OMX_ErrorNone
)
1602 pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
++;
1603 pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
%= MAX_TIMESTAMP
;
1605 pDstOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0] = pVideoBuffer
->planes
[0].addr
;
1606 pDstOutputData
->buffer
.multiPlaneBuffer
.fd
[0] = pVideoBuffer
->planes
[0].fd
;
1607 pDstOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[1] = pVideoBuffer
->planes
[1].addr
;
1608 pDstOutputData
->buffer
.multiPlaneBuffer
.fd
[1] = pVideoBuffer
->planes
[1].fd
;
1609 pDstOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[2] = pVideoBuffer
->planes
[2].addr
;
1610 pDstOutputData
->buffer
.multiPlaneBuffer
.fd
[2] = pVideoBuffer
->planes
[2].fd
;
1611 pDstOutputData
->allocSize
= pVideoBuffer
->planes
[0].allocSize
+ pVideoBuffer
->planes
[1].allocSize
+ pVideoBuffer
->planes
[2].allocSize
;
1612 pDstOutputData
->dataLen
= pVideoBuffer
->planes
[0].dataSize
+ pVideoBuffer
->planes
[1].dataSize
+ pVideoBuffer
->planes
[2].dataSize
;
1613 pDstOutputData
->usedDataLen
= 0;
1614 pDstOutputData
->pPrivate
= pVideoBuffer
;
1615 /* For Share Buffer */
1616 pDstOutputData
->bufferHeader
= (OMX_BUFFERHEADERTYPE
*)pVideoBuffer
->pPrivate
;
1618 pBufferInfo
= (DECODE_CODEC_EXTRA_BUFFERINFO
*)pDstOutputData
->extInfo
;
1619 bufferGeometry
= &pVp8Dec
->hMFCVp8Handle
.codecOutbufConf
;
1620 pBufferInfo
->imageWidth
= bufferGeometry
->nFrameWidth
;
1621 pBufferInfo
->imageHeight
= bufferGeometry
->nFrameHeight
;
1622 switch (bufferGeometry
->eColorFormat
) {
1623 case VIDEO_COLORFORMAT_NV12
:
1624 pBufferInfo
->ColorFormat
= OMX_COLOR_FormatYUV420SemiPlanar
;
1626 case VIDEO_COLORFORMAT_NV12_TILED
:
1628 pBufferInfo
->ColorFormat
= OMX_SEC_COLOR_FormatNV12Tiled
;
1632 indexTimestamp
= pDecOps
->Get_FrameTag(hMFCHandle
);
1633 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "%x indexTimestamp: %d", pExynosComponent
, indexTimestamp
);
1634 if ((indexTimestamp
< 0) || (indexTimestamp
>= MAX_TIMESTAMP
)) {
1635 if ((pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
!= OMX_TRUE
) &&
1636 (pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
!= OMX_TRUE
)) {
1637 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
];
1638 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
];
1639 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "indexTimestamp: %d", indexTimestamp
);
1641 pDstOutputData
->timeStamp
= 0x00;
1642 pDstOutputData
->nFlags
= 0x00;
1645 /* For timestamp correction. if mfc support frametype detect */
1646 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "disp_pic_frame_type: %d", pVideoBuffer
->frameType
);
1647 #ifdef NEED_TIMESTAMP_REORDER
1648 if ((pVideoBuffer
->frameType
== VIDEO_FRAME_I
)) {
1649 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[indexTimestamp
];
1650 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[indexTimestamp
];
1651 pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
= indexTimestamp
;
1653 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
];
1654 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[pVp8Dec
->hMFCVp8Handle
.outputIndexTimestamp
];
1657 pDstOutputData
->timeStamp
= pExynosComponent
->timeStamp
[indexTimestamp
];
1658 pDstOutputData
->nFlags
= pExynosComponent
->nFlags
[indexTimestamp
];
1660 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData
->timeStamp
, pDstOutputData
->timeStamp
/ 1E6
, indexTimestamp
, pDstOutputData
->nFlags
);
1663 if ((displayStatus
== VIDEO_FRAME_STATUS_CHANGE_RESOL
) ||
1664 ((pDstOutputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
)) {
1665 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "%x displayStatus:%d, nFlags0x%x", pExynosComponent
, displayStatus
, pDstOutputData
->nFlags
);
1666 pDstOutputData
->remainDataLen
= 0;
1668 pDstOutputData
->remainDataLen
= bufferGeometry
->nFrameWidth
* bufferGeometry
->nFrameHeight
* 3 / 2;
1671 ret
= OMX_ErrorNone
;
1679 OMX_ERRORTYPE
Exynos_VP8Dec_srcInputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcInputData
)
1681 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1682 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1683 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1684 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1685 // EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1689 if ((!CHECK_PORT_ENABLED(pExynosInputPort
)) || (!CHECK_PORT_POPULATED(pExynosInputPort
))) {
1690 ret
= OMX_ErrorNone
;
1693 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) {
1694 ret
= OMX_ErrorNone
;
1698 ret
= Exynos_VP8Dec_SrcIn(pOMXComponent
, pSrcInputData
);
1699 if ((ret
!= OMX_ErrorNone
) && (ret
!= OMX_ErrorInputDataDecodeYet
)) {
1700 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
1701 pExynosComponent
->callbackData
,
1702 OMX_EventError
, ret
, 0, NULL
);
1711 OMX_ERRORTYPE
Exynos_VP8Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pSrcOutputData
)
1713 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1714 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1715 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1716 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1717 // EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1721 if ((!CHECK_PORT_ENABLED(pExynosInputPort
)) || (!CHECK_PORT_POPULATED(pExynosInputPort
))) {
1722 ret
= OMX_ErrorNone
;
1726 if ((pExynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1727 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) {
1728 ret
= OMX_ErrorNone
;
1732 if ((pVp8Dec
->bSourceStart
== OMX_FALSE
) &&
1733 (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort
))) {
1734 Exynos_OSAL_SignalWait(pVp8Dec
->hSourceStartEvent
, DEF_MAX_WAIT_TIME
);
1735 Exynos_OSAL_SignalReset(pVp8Dec
->hSourceStartEvent
);
1738 ret
= Exynos_VP8Dec_SrcOut(pOMXComponent
, pSrcOutputData
);
1739 if ((ret
!= OMX_ErrorNone
) &&
1740 (pExynosComponent
->currentState
== OMX_StateExecuting
)) {
1741 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
1742 pExynosComponent
->callbackData
,
1743 OMX_EventError
, ret
, 0, NULL
);
1752 OMX_ERRORTYPE
Exynos_VP8Dec_dstInputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstInputData
)
1754 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1755 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1756 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1757 // EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1758 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1762 if ((!CHECK_PORT_ENABLED(pExynosOutputPort
)) || (!CHECK_PORT_POPULATED(pExynosOutputPort
))) {
1763 ret
= OMX_ErrorNone
;
1766 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) {
1767 ret
= OMX_ErrorNone
;
1771 if (pExynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
1772 if ((pVp8Dec
->bDestinationStart
== OMX_FALSE
) &&
1773 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
1774 Exynos_OSAL_SignalWait(pVp8Dec
->hDestinationStartEvent
, DEF_MAX_WAIT_TIME
);
1775 Exynos_OSAL_SignalReset(pVp8Dec
->hDestinationStartEvent
);
1778 if (pVp8Dec
->hMFCVp8Handle
.bConfiguredMFCDst
== OMX_TRUE
) {
1779 ret
= Exynos_VP8Dec_DstIn(pOMXComponent
, pDstInputData
);
1780 if (ret
!= OMX_ErrorNone
) {
1781 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
1782 pExynosComponent
->callbackData
,
1783 OMX_EventError
, ret
, 0, NULL
);
1793 OMX_ERRORTYPE
Exynos_VP8Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*pDstOutputData
)
1795 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1796 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1797 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
;
1798 // EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1799 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1803 if ((!CHECK_PORT_ENABLED(pExynosOutputPort
)) || (!CHECK_PORT_POPULATED(pExynosOutputPort
))) {
1804 ret
= OMX_ErrorNone
;
1807 if (OMX_FALSE
== Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) {
1808 ret
= OMX_ErrorNone
;
1812 if ((pExynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
1813 if ((pVp8Dec
->bDestinationStart
== OMX_FALSE
) &&
1814 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort
))) {
1815 Exynos_OSAL_SignalWait(pVp8Dec
->hDestinationStartEvent
, DEF_MAX_WAIT_TIME
);
1816 Exynos_OSAL_SignalReset(pVp8Dec
->hDestinationStartEvent
);
1820 ret
= Exynos_VP8Dec_DstOut(pOMXComponent
, pDstOutputData
);
1821 if ((ret
!= OMX_ErrorNone
) &&
1822 (pExynosComponent
->currentState
== OMX_StateExecuting
)) {
1823 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
1824 pExynosComponent
->callbackData
,
1825 OMX_EventError
, ret
, 0, NULL
);
1834 OSCL_EXPORT_REF OMX_ERRORTYPE
Exynos_OMX_ComponentInit(
1835 OMX_HANDLETYPE hComponent
,
1836 OMX_STRING componentName
)
1838 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1839 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1840 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1841 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1842 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
1843 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
1848 if ((hComponent
== NULL
) || (componentName
== NULL
)) {
1849 ret
= OMX_ErrorBadParameter
;
1850 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, Line:%d", __LINE__
);
1853 if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_VP8_DEC
, componentName
) != 0) {
1854 ret
= OMX_ErrorBadParameter
;
1855 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName
, __LINE__
);
1859 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1860 ret
= Exynos_OMX_VideoDecodeComponentInit(pOMXComponent
);
1861 if (ret
!= OMX_ErrorNone
) {
1862 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_Error, Line:%d", __LINE__
);
1865 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1866 pExynosComponent
->codecType
= HW_VIDEO_DEC_CODEC
;
1868 pExynosComponent
->componentName
= (OMX_STRING
)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE
);
1869 if (pExynosComponent
->componentName
== NULL
) {
1870 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
1871 ret
= OMX_ErrorInsufficientResources
;
1872 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
1875 Exynos_OSAL_Memset(pExynosComponent
->componentName
, 0, MAX_OMX_COMPONENT_NAME_SIZE
);
1877 pVp8Dec
= Exynos_OSAL_Malloc(sizeof(EXYNOS_VP8DEC_HANDLE
));
1878 if (pVp8Dec
== NULL
) {
1879 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
1880 ret
= OMX_ErrorInsufficientResources
;
1881 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
1884 Exynos_OSAL_Memset(pVp8Dec
, 0, sizeof(EXYNOS_VP8DEC_HANDLE
));
1885 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1886 pVideoDec
->hCodecHandle
= (OMX_HANDLETYPE
)pVp8Dec
;
1888 Exynos_OSAL_Strcpy(pExynosComponent
->componentName
, EXYNOS_OMX_COMPONENT_VP8_DEC
);
1890 /* Set componentVersion */
1891 pExynosComponent
->componentVersion
.s
.nVersionMajor
= VERSIONMAJOR_NUMBER
;
1892 pExynosComponent
->componentVersion
.s
.nVersionMinor
= VERSIONMINOR_NUMBER
;
1893 pExynosComponent
->componentVersion
.s
.nRevision
= REVISION_NUMBER
;
1894 pExynosComponent
->componentVersion
.s
.nStep
= STEP_NUMBER
;
1895 /* Set specVersion */
1896 pExynosComponent
->specVersion
.s
.nVersionMajor
= VERSIONMAJOR_NUMBER
;
1897 pExynosComponent
->specVersion
.s
.nVersionMinor
= VERSIONMINOR_NUMBER
;
1898 pExynosComponent
->specVersion
.s
.nRevision
= REVISION_NUMBER
;
1899 pExynosComponent
->specVersion
.s
.nStep
= STEP_NUMBER
;
1901 /* Android CapabilityFlags */
1902 pExynosComponent
->capabilityFlags
.iIsOMXComponentMultiThreaded
= OMX_TRUE
;
1903 pExynosComponent
->capabilityFlags
.iOMXComponentSupportsExternalInputBufferAlloc
= OMX_TRUE
;
1904 pExynosComponent
->capabilityFlags
.iOMXComponentSupportsExternalOutputBufferAlloc
= OMX_TRUE
;
1905 pExynosComponent
->capabilityFlags
.iOMXComponentSupportsMovableInputBuffers
= OMX_FALSE
;
1906 pExynosComponent
->capabilityFlags
.iOMXComponentSupportsPartialFrames
= OMX_FALSE
;
1907 pExynosComponent
->capabilityFlags
.iOMXComponentUsesNALStartCodes
= OMX_TRUE
;
1908 pExynosComponent
->capabilityFlags
.iOMXComponentCanHandleIncompleteFrames
= OMX_TRUE
;
1909 pExynosComponent
->capabilityFlags
.iOMXComponentUsesFullAVCFrames
= OMX_TRUE
;
1912 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1913 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
1914 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
1915 pExynosPort
->portDefinition
.format
.video
.nStride
= 0; /*DEFAULT_FRAME_WIDTH;*/
1916 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
1917 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_INPUT_BUFFER_SIZE
;
1918 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingVPX
;
1919 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
1920 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "video/x-vnd.on2.vp8");
1921 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
1922 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
1923 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatUnused
;
1924 pExynosPort
->portDefinition
.bEnabled
= OMX_TRUE
;
1925 pExynosPort
->bufferProcessType
= BUFFER_SHARE
;
1926 pExynosPort
->portWayType
= WAY2_PORT
;
1929 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1930 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
1931 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
1932 pExynosPort
->portDefinition
.format
.video
.nStride
= 0; /*DEFAULT_FRAME_WIDTH;*/
1933 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
1934 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE
;
1935 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1936 Exynos_OSAL_Memset(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
1937 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "raw/video");
1938 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
1939 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
1940 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatYUV420Planar
;
1941 pExynosPort
->portDefinition
.bEnabled
= OMX_TRUE
;
1942 pExynosPort
->bufferProcessType
= BUFFER_COPY
| BUFFER_ANBSHARE
;
1943 pExynosPort
->portWayType
= WAY2_PORT
;
1945 pOMXComponent
->GetParameter
= &Exynos_VP8Dec_GetParameter
;
1946 pOMXComponent
->SetParameter
= &Exynos_VP8Dec_SetParameter
;
1947 pOMXComponent
->GetConfig
= &Exynos_VP8Dec_GetConfig
;
1948 pOMXComponent
->SetConfig
= &Exynos_VP8Dec_SetConfig
;
1949 pOMXComponent
->GetExtensionIndex
= &Exynos_VP8Dec_GetExtensionIndex
;
1950 pOMXComponent
->ComponentRoleEnum
= &Exynos_VP8Dec_ComponentRoleEnum
;
1951 pOMXComponent
->ComponentDeInit
= &Exynos_OMX_ComponentDeinit
;
1953 pExynosComponent
->exynos_codec_componentInit
= &Exynos_VP8Dec_Init
;
1954 pExynosComponent
->exynos_codec_componentTerminate
= &Exynos_VP8Dec_Terminate
;
1956 pVideoDec
->exynos_codec_srcInputProcess
= &Exynos_VP8Dec_srcInputBufferProcess
;
1957 pVideoDec
->exynos_codec_srcOutputProcess
= &Exynos_VP8Dec_srcOutputBufferProcess
;
1958 pVideoDec
->exynos_codec_dstInputProcess
= &Exynos_VP8Dec_dstInputBufferProcess
;
1959 pVideoDec
->exynos_codec_dstOutputProcess
= &Exynos_VP8Dec_dstOutputBufferProcess
;
1961 pVideoDec
->exynos_codec_start
= &VP8CodecStart
;
1962 pVideoDec
->exynos_codec_stop
= &VP8CodecStop
;
1963 pVideoDec
->exynos_codec_bufferProcessRun
= &VP8CodecOutputBufferProcessRun
;
1964 pVideoDec
->exynos_codec_enqueueAllBuffer
= &VP8CodecEnQueueAllBuffer
;
1966 pVideoDec
->exynos_checkInputFrame
= &Check_VP8_Frame
;
1967 pVideoDec
->exynos_codec_getCodecInputPrivateData
= &GetCodecInputPrivateData
;
1968 pVideoDec
->exynos_codec_getCodecOutputPrivateData
= &GetCodecOutputPrivateData
;
1970 pVideoDec
->hSharedMemory
= Exynos_OSAL_SharedMemory_Open();
1971 if (pVideoDec
->hSharedMemory
== NULL
) {
1972 Exynos_OSAL_Free(pVp8Dec
);
1973 pVp8Dec
= ((EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
)->hCodecHandle
= NULL
;
1974 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
1975 ret
= OMX_ErrorInsufficientResources
;
1979 pExynosComponent
->currentState
= OMX_StateLoaded
;
1981 ret
= OMX_ErrorNone
;
1989 OMX_ERRORTYPE
Exynos_OMX_ComponentDeinit(
1990 OMX_HANDLETYPE hComponent
)
1992 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1993 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1994 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1995 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
1996 EXYNOS_VP8DEC_HANDLE
*pVp8Dec
= NULL
;
2000 if (hComponent
== NULL
) {
2001 ret
= OMX_ErrorBadParameter
;
2004 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
2005 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
2006 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
2008 Exynos_OSAL_SharedMemory_Close(pVideoDec
->hSharedMemory
);
2010 Exynos_OSAL_Free(pExynosComponent
->componentName
);
2011 pExynosComponent
->componentName
= NULL
;
2013 pVp8Dec
= (EXYNOS_VP8DEC_HANDLE
*)pVideoDec
->hCodecHandle
;
2014 if (pVp8Dec
!= NULL
) {
2015 Exynos_OSAL_Free(pVp8Dec
);
2016 pVp8Dec
= pVideoDec
->hCodecHandle
= NULL
;
2019 ret
= Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent
);
2020 if (ret
!= OMX_ErrorNone
) {
2024 ret
= OMX_ErrorNone
;