exynos_omx: multi_thread: Fix bug for adaptiveDrc tests.
[GitHub/LineageOS/android_hardware_samsung_slsi_exynos5.git] / exynos_omx / openmax / exynos_omx / component / video / dec / vp8 / Exynos_OMX_Vp8dec.c
CommitLineData
20d3e6e3
JC
1/*
2 *
38ef2572 3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
20d3e6e3
JC
4 *
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
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
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.
16 */
17
18/*
19 * @file Exynos_OMX_Vp8dec.c
20 * @brief
21 * @author Satish Kumar Reddy (palli.satish@samsung.com)
38ef2572
JC
22 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
23 * @version 2.0.0
20d3e6e3 24 * @history
38ef2572 25 * 2012.02.20 : Create
20d3e6e3
JC
26 */
27
28#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31
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"
38ef2572
JC
42#include "Exynos_OSAL_SharedMemory.h"
43#include "Exynos_OSAL_Event.h"
20d3e6e3
JC
44
45#ifdef USE_ANB
46#include "Exynos_OSAL_Android.h"
47#endif
48
800a8d75 49/* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
20d3e6e3
JC
50/* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
51#include "csc.h"
52
53#undef EXYNOS_LOG_TAG
54#define EXYNOS_LOG_TAG "EXYNOS_VP8_DEC"
55#define EXYNOS_LOG_OFF
38ef2572 56//#define EXYNOS_TRACE_ON
20d3e6e3
JC
57#include "Exynos_OSAL_Log.h"
58
59#define VP8_DEC_NUM_OF_EXTRA_BUFFERS 7
60
61//#define FULL_FRAME_SEARCH /* Full frame search not support*/
62
38ef2572
JC
63static OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, void *pVirtAddr, OMX_U32 *dataSize)
64{
65 OMX_ERRORTYPE ret = OMX_ErrorNone;
66
67EXIT:
68 return ret;
69}
70
71static OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, void *addr[], int size[])
72{
73 OMX_ERRORTYPE ret = OMX_ErrorNone;
74 ExynosVideoBuffer *pCodecBuffer;
75
76 if (codecBuffer == NULL) {
77 ret = OMX_ErrorBadParameter;
78 goto EXIT;
79 }
80
81 pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
82
83 if (addr != NULL) {
84 addr[0] = pCodecBuffer->planes[0].addr;
85 addr[1] = pCodecBuffer->planes[1].addr;
86 addr[2] = pCodecBuffer->planes[2].addr;
87 }
88
89 if (size != NULL) {
90 size[0] = pCodecBuffer->planes[0].allocSize;
91 size[1] = pCodecBuffer->planes[1].allocSize;
92 size[2] = pCodecBuffer->planes[2].allocSize;
93 }
94
95EXIT:
96 return ret;
97}
98
99static int Check_VP8_Frame(
20d3e6e3
JC
100 OMX_U8 *pInputStream,
101 int buffSize,
102 OMX_U32 flag,
103 OMX_BOOL bPreviousFrameEOF,
104 OMX_BOOL *pbEndOfFrame)
105{
106 /* Uncompressed data Chunk comprises a common
107 (for key frames and interframes) 3-byte frame tag that
108 contains four fields
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
115
116 Key Frames : frame tag followed by 7 bytes of uncompressed
117 data
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)
122 */
123 int width, height;
124 int horizSscale, vertScale;
125
126 FunctionIn();
127
128 *pbEndOfFrame = OMX_TRUE;
129
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;
136 }
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);
143 }
144
145 FunctionOut();
146 return buffSize;
147}
148
38ef2572 149OMX_BOOL Check_VP8_StartCode(
20d3e6e3
JC
150 OMX_U8 *pInputStream,
151 OMX_U32 streamSize)
152{
153 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "streamSize: %d",streamSize);
154 if (streamSize < 3) {
155 return OMX_FALSE;
156 }
157
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");
162 return OMX_FALSE;
163 }
164 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, " VP8 Found Key Frame Start Code");
165 }
166
167 return OMX_TRUE;
168}
169
38ef2572
JC
170OMX_ERRORTYPE VP8CodecOpen(EXYNOS_VP8DEC_HANDLE *pVp8Dec)
171{
3e79a27e 172 OMX_ERRORTYPE ret = OMX_ErrorNone;
38ef2572
JC
173 ExynosVideoDecOps *pDecOps = NULL;
174 ExynosVideoDecBufferOps *pInbufOps = NULL;
175 ExynosVideoDecBufferOps *pOutbufOps = NULL;
176
177 FunctionIn();
178
179 if (pVp8Dec == NULL) {
180 ret = OMX_ErrorBadParameter;
181 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
182 goto EXIT;
183 }
184
38ef2572
JC
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));
189
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;
193 goto EXIT;
194 }
195
196 pVp8Dec->hMFCVp8Handle.pDecOps = pDecOps;
197 pVp8Dec->hMFCVp8Handle.pInbufOps = pInbufOps;
198 pVp8Dec->hMFCVp8Handle.pOutbufOps = pOutbufOps;
199
200 /* function pointer mapping */
201 pDecOps->nSize = sizeof(ExynosVideoDecOps);
202 pInbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
203 pOutbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
204
205 Exynos_Video_Register_Decoder(pDecOps, pInbufOps, pOutbufOps);
3e79a27e 206
38ef2572
JC
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;
213 goto EXIT;
214 }
215
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;
224 goto EXIT;
225 }
226
227 /* alloc context, open, querycap */
c94beaeb 228 pVp8Dec->hMFCVp8Handle.hMFCHandle = pVp8Dec->hMFCVp8Handle.pDecOps->Init(V4L2_MEMORY_DMABUF);
38ef2572
JC
229 if (pVp8Dec->hMFCVp8Handle.hMFCHandle == NULL) {
230 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
231 ret = OMX_ErrorInsufficientResources;
232 goto EXIT;
233 }
234
235 ret = OMX_ErrorNone;
236
237EXIT:
44025235
SK
238 if (ret != OMX_ErrorNone) {
239 if (pDecOps != NULL) {
240 Exynos_OSAL_Free(pDecOps);
241 pVp8Dec->hMFCVp8Handle.pDecOps = NULL;
242 }
243 if (pInbufOps != NULL) {
244 Exynos_OSAL_Free(pInbufOps);
245 pVp8Dec->hMFCVp8Handle.pInbufOps = NULL;
246 }
247 if (pOutbufOps != NULL) {
248 Exynos_OSAL_Free(pOutbufOps);
249 pVp8Dec->hMFCVp8Handle.pOutbufOps = NULL;
250 }
251 }
252
38ef2572
JC
253 FunctionOut();
254
255 return ret;
256}
257
258OMX_ERRORTYPE VP8CodecClose(EXYNOS_VP8DEC_HANDLE *pVp8Dec)
259{
3e79a27e 260 OMX_ERRORTYPE ret = OMX_ErrorNone;
38ef2572
JC
261 void *hMFCHandle = NULL;
262 ExynosVideoDecOps *pDecOps = NULL;
263 ExynosVideoDecBufferOps *pInbufOps = NULL;
264 ExynosVideoDecBufferOps *pOutbufOps = NULL;
265
3e79a27e
SK
266 FunctionIn();
267
38ef2572
JC
268 if (pVp8Dec == NULL) {
269 ret = OMX_ErrorBadParameter;
270 goto EXIT;
271 }
272
273 hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
274 pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps;
275 pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps;
276 pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
277
278 if (hMFCHandle != NULL) {
279 pDecOps->Finalize(hMFCHandle);
3e79a27e 280 pVp8Dec->hMFCVp8Handle.hMFCHandle = NULL;
38ef2572
JC
281 }
282 if (pOutbufOps != NULL) {
283 Exynos_OSAL_Free(pOutbufOps);
3e79a27e 284 pVp8Dec->hMFCVp8Handle.pOutbufOps = NULL;
38ef2572
JC
285 }
286 if (pInbufOps != NULL) {
287 Exynos_OSAL_Free(pInbufOps);
3e79a27e 288 pVp8Dec->hMFCVp8Handle.pInbufOps = NULL;
38ef2572
JC
289 }
290 if (pDecOps != NULL) {
291 Exynos_OSAL_Free(pDecOps);
3e79a27e 292 pVp8Dec->hMFCVp8Handle.pDecOps = NULL;
38ef2572
JC
293 }
294
295 ret = OMX_ErrorNone;
296
297EXIT:
298 FunctionOut();
299
300 return ret;
301}
302
303OMX_ERRORTYPE VP8CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
304{
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;
312
3e79a27e
SK
313 FunctionIn();
314
38ef2572
JC
315 if (pOMXComponent == NULL) {
316 ret = OMX_ErrorBadParameter;
317 goto EXIT;
318 }
319
320 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
321 if (pVideoDec == NULL) {
322 ret = OMX_ErrorBadParameter;
323 goto EXIT;
324 }
3e79a27e 325
38ef2572
JC
326 pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
327 if (pVp8Dec == NULL) {
328 ret = OMX_ErrorBadParameter;
329 goto EXIT;
330 }
331
332 hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
333 pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps;
334 pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps;
335 pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
336
337 if (nPortIndex == INPUT_PORT_INDEX)
338 pInbufOps->Run(hMFCHandle);
339 else if (nPortIndex == OUTPUT_PORT_INDEX)
340 pOutbufOps->Run(hMFCHandle);
341
38ef2572
JC
342 ret = OMX_ErrorNone;
343
344EXIT:
345 FunctionOut();
346
347 return ret;
348}
349
350OMX_ERRORTYPE VP8CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
351{
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;
359
3e79a27e
SK
360 FunctionIn();
361
38ef2572
JC
362 if (pOMXComponent == NULL) {
363 ret = OMX_ErrorBadParameter;
364 goto EXIT;
365 }
366
367 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
368 if (pVideoDec == NULL) {
369 ret = OMX_ErrorBadParameter;
370 goto EXIT;
371 }
372 pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
373 if (pVp8Dec == NULL) {
374 ret = OMX_ErrorBadParameter;
375 goto EXIT;
376 }
377
38ef2572
JC
378 hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
379 pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps;
380 pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps;
381 pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
382
eb5bed43 383 if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL)) {
38ef2572 384 pInbufOps->Stop(hMFCHandle);
eb5bed43
SK
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];
38ef2572 388 pOutbufOps->Stop(hMFCHandle);
eb5bed43
SK
389 if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE)
390 pOutbufOps->Clear_RegisteredBuffer(hMFCHandle);
391 }
38ef2572
JC
392 ret = OMX_ErrorNone;
393
394EXIT:
395 FunctionOut();
396
397 return ret;
398}
399
400OMX_ERRORTYPE VP8CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
401{
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;
409
3e79a27e
SK
410 FunctionIn();
411
38ef2572
JC
412 if (pOMXComponent == NULL) {
413 ret = OMX_ErrorBadParameter;
414 goto EXIT;
415 }
416
417 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
418 if (pVideoDec == NULL) {
419 ret = OMX_ErrorBadParameter;
420 goto EXIT;
421 }
422 pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
423 if (pVp8Dec == NULL) {
424 ret = OMX_ErrorBadParameter;
425 goto EXIT;
426 }
427
428 hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
429 pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps;
430 pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps;
431 pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
432
433 if (nPortIndex == INPUT_PORT_INDEX) {
434 if (pVp8Dec->bSourceStart == OMX_FALSE) {
435 Exynos_OSAL_SignalSet(pVp8Dec->hSourceStartEvent);
436 Exynos_OSAL_SleepMillisec(0);
437 }
438 }
439
440 if (nPortIndex == OUTPUT_PORT_INDEX) {
441 if (pVp8Dec->bDestinationStart == OMX_FALSE) {
442 Exynos_OSAL_SignalSet(pVp8Dec->hDestinationStartEvent);
443 Exynos_OSAL_SleepMillisec(0);
444 }
445 }
446
447 ret = OMX_ErrorNone;
448
449EXIT:
450 FunctionOut();
451
452 return ret;
453}
454
f8d511af
SK
455OMX_ERRORTYPE VP8CodecRegistCodecBuffers(
456 OMX_COMPONENTTYPE *pOMXComponent,
457 OMX_U32 nPortIndex,
458 OMX_U32 nBufferCnt)
459{
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;
468
469 OMX_U32 nPlaneCnt = 0;
470 int i, j;
471
472 FunctionIn();
473
474 if (nPortIndex == INPUT_PORT_INDEX) {
475 ppCodecBuffer = &(pVideoDec->pMFCDecInputBuffer[0]);
476 nPlaneCnt = MFC_INPUT_BUFFER_PLANE;
477 pBufOps = pVp8Dec->hMFCVp8Handle.pInbufOps;
478 } else {
479 ppCodecBuffer = &(pVideoDec->pMFCDecOutputBuffer[0]);
480 nPlaneCnt = MFC_OUTPUT_BUFFER_PLANE;
481 pBufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
482 }
483
484 pPlanes = (ExynosVideoPlane *)Exynos_OSAL_Malloc(sizeof(ExynosVideoPlane) * nPlaneCnt);
485 if (pPlanes == NULL) {
486 ret = OMX_ErrorInsufficientResources;
487 goto EXIT;
488 }
489
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];
496 }
497
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);
502 goto EXIT;
503 }
504 }
505
506 Exynos_OSAL_Free(pPlanes);
507
508 ret = OMX_ErrorNone;
509
510EXIT:
511 FunctionOut();
512
513 return ret;
514}
515
fcf4e7ff
SK
516OMX_ERRORTYPE VP8CodecReconfigAllBuffers(
517 OMX_COMPONENTTYPE *pOMXComponent,
518 OMX_U32 nPortIndex)
519{
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;
527
528 FunctionIn();
529
530 if ((nPortIndex == INPUT_PORT_INDEX) &&
531 (pVp8Dec->bSourceStart == OMX_TRUE)) {
532 ret = OMX_ErrorNotImplemented;
533 goto EXIT;
534 } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
535 (pVp8Dec->bDestinationStart == OMX_TRUE)) {
536 pBufferOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
537
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);
552 }
553 /******************************************************/
554 /* V4L2 Destnation Setup for DPB Buffer Number Change */
555 /******************************************************/
556 VP8CodecDstSetup(pOMXComponent);
557 pVideoDec->bReconfigDPB = OMX_FALSE;
558
559 Exynos_ResolutionUpdate(pOMXComponent);
560 } else {
561 ret = OMX_ErrorBadParameter;
562 goto EXIT;
563 }
564
565EXIT:
566 FunctionOut();
567
568 return ret;
569}
570
38ef2572
JC
571OMX_ERRORTYPE VP8CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
572{
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];
580 int i, nOutbufs;
38ef2572
JC
581
582 ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps;
583 ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps;
584 ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
585
3e79a27e 586 FunctionIn();
38ef2572 587
f8d511af
SK
588 if ((nPortIndex != INPUT_PORT_INDEX) && (nPortIndex != OUTPUT_PORT_INDEX)) {
589 ret = OMX_ErrorBadPortIndex;
590 goto EXIT;
591 }
592
38ef2572
JC
593 if ((nPortIndex == INPUT_PORT_INDEX) &&
594 (pVp8Dec->bSourceStart == OMX_TRUE)) {
595 Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
596
3e79a27e 597 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
38ef2572 598 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
ef059a02 599 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
38ef2572
JC
600
601 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
602 }
603
604 pInbufOps->Clear_Queue(hMFCHandle);
605 } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
606 (pVp8Dec->bDestinationStart == OMX_TRUE)) {
94d259f5 607 OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
38ef2572
JC
608 ExynosVideoBuffer *pBuffer = NULL;
609
610 Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
611
612 nOutbufs = pDecOps->Get_ActualBufferCount(hMFCHandle);
613 nOutbufs += EXTRA_DPB_NUM;
614 for (i = 0; i < nOutbufs; i++) {
3b1c2e30 615 Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, pVideoDec->pMFCDecOutputBuffer[i]);
38ef2572
JC
616 }
617 pOutbufOps->Clear_Queue(hMFCHandle);
618 } else {
619 ret = OMX_ErrorBadParameter;
620 goto EXIT;
621 }
622
623EXIT:
624 FunctionOut();
625
626 return ret;
627}
628
fcf4e7ff
SK
629OMX_ERRORTYPE VP8CodecCheckResolutionChange(OMX_COMPONENTTYPE *pOMXComponent)
630{
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;
640
641 OMX_CONFIG_RECTTYPE *pCropRectangle = NULL;
642 OMX_PARAM_PORTDEFINITIONTYPE *pInputPortDefinition = NULL;
643 OMX_PARAM_PORTDEFINITIONTYPE *pOutputPortDefinition = NULL;
644
645 FunctionIn();
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;
651 goto EXIT;
652 }
653
654 /* get dpb count */
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);
659
660 pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_TRUE;
661
662 if (pVideoDec->bReconfigDPB != OMX_TRUE) {
663 pCropRectangle = &(pOutputPort->cropRectangle);
664 pInputPortDefinition = &(pInputPort->portDefinition);
665 pOutputPortDefinition = &(pOutputPort->portDefinition);
666 } else {
667 pCropRectangle = &(pOutputPort->newCropRectangle);
668 pInputPortDefinition = &(pInputPort->newPortDefinition);
669 pOutputPortDefinition = &(pOutputPort->newPortDefinition);
670 }
671
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;
676
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;
690
691 /** Send Port Settings changed call back **/
692 (*(pExynosComponent->pCallbacks->EventHandler))
693 (pOMXComponent,
694 pExynosComponent->callbackData,
695 OMX_EventPortSettingsChanged, /* The command was completed */
696 OMX_DirOutput, /* This is the port index */
697 0,
698 NULL);
699 }
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;
714
715 /** Send Port Settings changed call back **/
716 (*(pExynosComponent->pCallbacks->EventHandler))
717 (pOMXComponent,
718 pExynosComponent->callbackData,
719 OMX_EventPortSettingsChanged, /* The command was completed */
720 OMX_DirOutput, /* This is the port index */
721 0,
722 NULL);
723 }
724 }
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)) {
728 /* Check Crop */
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);
735
736 /** Send crop info call back **/
737 (*(pExynosComponent->pCallbacks->EventHandler))
738 (pOMXComponent,
739 pExynosComponent->callbackData,
740 OMX_EventPortSettingsChanged, /* The command was completed */
741 OMX_DirOutput, /* This is the port index */
742 OMX_IndexConfigCommonOutputCrop,
743 NULL);
744 }
745
746 ret = OMX_ErrorNone;
747
748EXIT:
749 FunctionOut();
750
751 return ret;
752}
753
38ef2572
JC
754OMX_ERRORTYPE VP8CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
755{
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;
38ef2572
JC
764
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;
770 int i;
771
38ef2572
JC
772 FunctionIn();
773
774 if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
54cbf397
SK
775 OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
776 OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
777 if (OMXBuffer == NULL) {
38ef2572
JC
778 ret = OMX_ErrorUndefined;
779 goto EXIT;
780 }
38ef2572 781
54cbf397
SK
782 OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
783 OMXBuffer->nFlags = pSrcInputData->nFlags;
784 Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
38ef2572
JC
785
786 ret = OMX_ErrorNone;
787 goto EXIT;
788 }
789
790 if (pVideoDec->bThumbnailMode == OMX_TRUE)
e8aae8ed 791 pDecOps->Set_IFrameDecoding(hMFCHandle);
38ef2572
JC
792
793 /* input buffer info */
794 Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
795 bufferConf.eCompressionFormat = VIDEO_CODING_VP8;
1ed2fc89 796 pInbufOps->Set_Shareable(hMFCHandle);
38ef2572 797 if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
94d259f5
SK
798 bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth
799 * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
38ef2572
JC
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;
804 }
805
806 /* should be done before prepare input buffer */
807 if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
808 ret = OMX_ErrorInsufficientResources;
809 goto EXIT;
810 }
811
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;
816 goto EXIT;
817 }
818
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;
823 goto EXIT;
824 }
825
826 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
f8d511af
SK
827 ret = VP8CodecRegistCodecBuffers(pOMXComponent, INPUT_PORT_INDEX, MFC_INPUT_BUFFER_NUM_MAX);
828 if (ret != OMX_ErrorNone)
829 goto EXIT;
38ef2572
JC
830 } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
831 /* Register input buffer */
832 for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
01fa64f5
DZ
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];
94d259f5 837 if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
38ef2572
JC
838 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
839 ret = OMX_ErrorInsufficientResources;
840 goto EXIT;
841 }
842 }
843 }
844
845 /* set output geometry */
846 Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
38ef2572 847 pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
38ef2572
JC
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;
851 goto EXIT;
852 }
853
854 /* input buffer enqueue for header parsing */
3e79a27e 855 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize);
94d259f5
SK
856 if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
857 (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) {
38ef2572
JC
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;
861 goto EXIT;
862 }
863
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;
868 goto EXIT;
869 }
870
fcf4e7ff 871 VP8CodecCheckResolutionChange(pOMXComponent);
38ef2572 872
38ef2572
JC
873 Exynos_OSAL_SleepMillisec(0);
874 ret = OMX_ErrorInputDataDecodeYet;
875 VP8CodecStop(pOMXComponent, INPUT_PORT_INDEX);
876
877EXIT:
878 FunctionOut();
879
880 return ret;
881}
882
883OMX_ERRORTYPE VP8CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
884{
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];
38ef2572
JC
892
893 ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps;
894 ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps;
895 ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
57fbf5ba 896
38ef2572
JC
897 int i, nOutbufs;
898
38ef2572
JC
899 FunctionIn();
900
fa894814 901 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
bd09b814
SK
902 /* BUFFER_COPY case, get dpb count */
903 nOutbufs = pVp8Dec->hMFCVp8Handle.maxDPBNum;
904
fa894814
SK
905 /* should be done before prepare output buffer */
906 if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
907 ret = OMX_ErrorInsufficientResources;
908 goto EXIT;
909 }
bd09b814
SK
910 } else {
911 /*BUFFER_SHERE case, get dpb count */
912 nOutbufs = pExynosOutputPort->portDefinition.nBufferCountActual;
38ef2572 913 }
3b1c2e30
SK
914 if (pOutbufOps->Enable_DynamicDPB(hMFCHandle) != VIDEO_ERROR_NONE) {
915 ret = OMX_ErrorUndefined;
916 goto EXIT;
917 }
38ef2572
JC
918
919 pOutbufOps->Set_Shareable(hMFCHandle);
3b1c2e30 920 if (pOutbufOps->Setup(hMFCHandle, MAX_OUTPUTBUFFER_NUM_DYNAMIC) != VIDEO_ERROR_NONE) {
38ef2572
JC
921 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
922 ret = OMX_ErrorInsufficientResources;
923 goto EXIT;
924 }
925
ef059a02
SK
926 ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
927 OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
94d259f5 928 OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
ef059a02
SK
929 int plane;
930
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);
935
38ef2572 936 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
f8d511af
SK
937 ret = Exynos_Allocate_CodecBuffers(pOMXComponent, OUTPUT_PORT_INDEX, nOutbufs, nAllocLen);
938 if (ret != OMX_ErrorNone)
939 goto EXIT;
38ef2572 940 for (i = 0; i < nOutbufs; i++) {
3b1c2e30
SK
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,
94d259f5 946 (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
38ef2572 947 }
f8d511af 948
3b1c2e30
SK
949 if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
950 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
951 ret = OMX_ErrorInsufficientResources;
952 goto EXIT;
953 }
38ef2572 954 } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
38ef2572
JC
955 /*************/
956 /* TBD */
957 /*************/
ef059a02 958#ifdef USE_ANB
3b1c2e30
SK
959 if ((pExynosOutputPort->bIsANBEnabled == OMX_FALSE) &&
960 (pExynosOutputPort->bStoreMetaData == OMX_FALSE)) {
ef059a02
SK
961 ret = OMX_ErrorNotImplemented;
962 goto EXIT;
38ef2572 963 }
ef059a02
SK
964#else
965 ret = OMX_ErrorNotImplemented;
966 goto EXIT;
967#endif
38ef2572 968 }
ef059a02 969
38ef2572
JC
970 pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_TRUE;
971
972 ret = OMX_ErrorNone;
973
974EXIT:
975 FunctionOut();
976
977 return ret;
978}
979
980OMX_ERRORTYPE Exynos_VP8Dec_GetParameter(
20d3e6e3
JC
981 OMX_IN OMX_HANDLETYPE hComponent,
982 OMX_IN OMX_INDEXTYPE nParamIndex,
983 OMX_INOUT OMX_PTR pComponentParameterStructure)
984{
38ef2572
JC
985 OMX_ERRORTYPE ret = OMX_ErrorNone;
986 OMX_COMPONENTTYPE *pOMXComponent = NULL;
20d3e6e3
JC
987 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
988
989 FunctionIn();
990
991 if (hComponent == NULL || pComponentParameterStructure == NULL) {
992 ret = OMX_ErrorBadParameter;
993 goto EXIT;
994 }
995 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
996 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
997 if (ret != OMX_ErrorNone) {
998 goto EXIT;
999 }
1000 if (pOMXComponent->pComponentPrivate == NULL) {
1001 ret = OMX_ErrorBadParameter;
1002 goto EXIT;
1003 }
1004
1005 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1006 if (pExynosComponent->currentState == OMX_StateInvalid ) {
1007 ret = OMX_ErrorInvalidState;
1008 goto EXIT;
1009 }
1010
1011 switch (nParamIndex) {
1012 case OMX_IndexParamStandardComponentRole:
1013 {
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) {
1017 goto EXIT;
1018 }
1019
1020 Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE);
1021 }
1022 break;
1023 case OMX_IndexParamVideoErrorCorrection:
1024 {
1025 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
1026 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
1027 EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL;
1028
1029 ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
1030 if (ret != OMX_ErrorNone) {
1031 goto EXIT;
1032 }
1033
1034 if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
1035 ret = OMX_ErrorBadPortIndex;
1036 goto EXIT;
1037 }
1038
1039 pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1040 pSrcErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX];
1041
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;
1047 }
1048 break;
1049 default:
1050 ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
1051 break;
1052 }
1053EXIT:
1054 FunctionOut();
1055
1056 return ret;
1057}
1058
38ef2572 1059OMX_ERRORTYPE Exynos_VP8Dec_SetParameter(
20d3e6e3
JC
1060 OMX_IN OMX_HANDLETYPE hComponent,
1061 OMX_IN OMX_INDEXTYPE nIndex,
1062 OMX_IN OMX_PTR pComponentParameterStructure)
1063{
38ef2572
JC
1064 OMX_ERRORTYPE ret = OMX_ErrorNone;
1065 OMX_COMPONENTTYPE *pOMXComponent = NULL;
20d3e6e3
JC
1066 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1067
1068 FunctionIn();
1069
1070 if (hComponent == NULL || pComponentParameterStructure == NULL) {
1071 ret = OMX_ErrorBadParameter;
1072 goto EXIT;
1073 }
1074 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1075 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1076 if (ret != OMX_ErrorNone) {
1077 goto EXIT;
1078 }
1079 if (pOMXComponent->pComponentPrivate == NULL) {
1080 ret = OMX_ErrorBadParameter;
1081 goto EXIT;
1082 }
1083
1084 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1085 if (pExynosComponent->currentState == OMX_StateInvalid ) {
1086 ret = OMX_ErrorInvalidState;
1087 goto EXIT;
1088 }
1089
1090 switch (nIndex) {
1091 case OMX_IndexParamStandardComponentRole:
1092 {
1093 OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
1094
1095 ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
1096 if (ret != OMX_ErrorNone) {
1097 goto EXIT;
1098 }
1099
1100 if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1101 ret = OMX_ErrorIncorrectStateOperation;
1102 goto EXIT;
1103 }
1104
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;
1107 } else {
1108 ret = OMX_ErrorBadParameter;
1109 goto EXIT;
1110 }
1111 }
1112 break;
20d3e6e3
JC
1113 case OMX_IndexParamVideoErrorCorrection:
1114 {
1115 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
1116 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
1117 EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL;
1118
1119 ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
1120 if (ret != OMX_ErrorNone) {
1121 goto EXIT;
1122 }
1123
1124 if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
1125 ret = OMX_ErrorBadPortIndex;
1126 goto EXIT;
1127 }
1128
1129 pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1130 pDstErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX];
1131
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;
1137 }
1138 break;
1139 default:
1140 ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
1141 break;
1142 }
1143EXIT:
1144 FunctionOut();
1145
1146 return ret;
1147}
1148
38ef2572 1149OMX_ERRORTYPE Exynos_VP8Dec_GetConfig(
20d3e6e3
JC
1150 OMX_HANDLETYPE hComponent,
1151 OMX_INDEXTYPE nIndex,
1152 OMX_PTR pComponentConfigStructure)
1153{
1154 OMX_ERRORTYPE ret = OMX_ErrorNone;
1155 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1156 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1157
1158 FunctionIn();
1159
44025235 1160 if (hComponent == NULL || pComponentConfigStructure == NULL) {
20d3e6e3
JC
1161 ret = OMX_ErrorBadParameter;
1162 goto EXIT;
1163 }
1164 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1165 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1166 if (ret != OMX_ErrorNone) {
1167 goto EXIT;
1168 }
20d3e6e3
JC
1169 if (pOMXComponent->pComponentPrivate == NULL) {
1170 ret = OMX_ErrorBadParameter;
1171 goto EXIT;
1172 }
1173 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
20d3e6e3
JC
1174 if (pExynosComponent->currentState == OMX_StateInvalid) {
1175 ret = OMX_ErrorInvalidState;
1176 goto EXIT;
1177 }
1178
1179 switch (nIndex) {
1180 default:
1181 ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
1182 break;
1183 }
1184
1185EXIT:
1186 FunctionOut();
1187
1188 return ret;
1189}
1190
38ef2572 1191OMX_ERRORTYPE Exynos_VP8Dec_SetConfig(
20d3e6e3
JC
1192 OMX_HANDLETYPE hComponent,
1193 OMX_INDEXTYPE nIndex,
1194 OMX_PTR pComponentConfigStructure)
1195{
1196 OMX_ERRORTYPE ret = OMX_ErrorNone;
1197 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1198 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1199
1200 FunctionIn();
1201
44025235 1202 if (hComponent == NULL || pComponentConfigStructure == NULL) {
20d3e6e3
JC
1203 ret = OMX_ErrorBadParameter;
1204 goto EXIT;
1205 }
1206 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1207 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1208 if (ret != OMX_ErrorNone) {
1209 goto EXIT;
1210 }
20d3e6e3
JC
1211 if (pOMXComponent->pComponentPrivate == NULL) {
1212 ret = OMX_ErrorBadParameter;
1213 goto EXIT;
1214 }
1215 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
20d3e6e3
JC
1216 if (pExynosComponent->currentState == OMX_StateInvalid) {
1217 ret = OMX_ErrorInvalidState;
1218 goto EXIT;
1219 }
1220
1221 switch (nIndex) {
1222 default:
1223 ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
1224 break;
1225 }
1226
1227EXIT:
1228 FunctionOut();
1229
1230 return ret;
1231}
1232
38ef2572 1233OMX_ERRORTYPE Exynos_VP8Dec_GetExtensionIndex(
20d3e6e3
JC
1234 OMX_IN OMX_HANDLETYPE hComponent,
1235 OMX_IN OMX_STRING cParameterName,
3e79a27e 1236 OMX_OUT OMX_INDEXTYPE *pIndexType)
20d3e6e3
JC
1237{
1238 OMX_ERRORTYPE ret = OMX_ErrorNone;
1239 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1240 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1241
1242 FunctionIn();
1243
1244 if (hComponent == NULL) {
1245 ret = OMX_ErrorBadParameter;
1246 goto EXIT;
1247 }
1248 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1249 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1250 if (ret != OMX_ErrorNone) {
1251 goto EXIT;
1252 }
20d3e6e3
JC
1253 if (pOMXComponent->pComponentPrivate == NULL) {
1254 ret = OMX_ErrorBadParameter;
1255 goto EXIT;
1256 }
1257 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
20d3e6e3
JC
1258 if ((cParameterName == NULL) || (pIndexType == NULL)) {
1259 ret = OMX_ErrorBadParameter;
1260 goto EXIT;
1261 }
1262 if (pExynosComponent->currentState == OMX_StateInvalid) {
1263 ret = OMX_ErrorInvalidState;
1264 goto EXIT;
1265 }
1266
e8aae8ed 1267 ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
20d3e6e3
JC
1268
1269EXIT:
1270 FunctionOut();
1271
1272 return ret;
1273}
1274
38ef2572 1275OMX_ERRORTYPE Exynos_VP8Dec_ComponentRoleEnum(
20d3e6e3
JC
1276 OMX_HANDLETYPE hComponent,
1277 OMX_U8 *cRole,
1278 OMX_U32 nIndex)
1279{
1280 OMX_ERRORTYPE ret = OMX_ErrorNone;
1281 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1282 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1283
1284 FunctionIn();
1285
1286 if ((hComponent == NULL) || (cRole == NULL)) {
1287 ret = OMX_ErrorBadParameter;
1288 goto EXIT;
1289 }
1290 if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) {
1291 Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE);
1292 ret = OMX_ErrorNone;
1293 } else {
1294 ret = OMX_ErrorNoMore;
1295 }
1296
1297EXIT:
1298 FunctionOut();
1299
1300 return ret;
1301}
1302
20d3e6e3 1303/* MFC Init */
38ef2572 1304OMX_ERRORTYPE Exynos_VP8Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
20d3e6e3 1305{
3e79a27e
SK
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;
38ef2572
JC
1313
1314 ExynosVideoDecOps *pDecOps = NULL;
1315 ExynosVideoDecBufferOps *pInbufOps = NULL;
1316 ExynosVideoDecBufferOps *pOutbufOps = NULL;
20d3e6e3
JC
1317
1318 CSC_METHOD csc_method = CSC_METHOD_SW;
ef059a02 1319 int i, plane;
800a8d75 1320
3e79a27e
SK
1321 FunctionIn();
1322
38ef2572
JC
1323 pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_FALSE;
1324 pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_FALSE;
1325 pExynosComponent->bUseFlagEOF = OMX_TRUE;
1326 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
81a947ba 1327 pExynosComponent->bBehaviorEOS = OMX_FALSE;
38ef2572
JC
1328
1329 /* H.264 Codec Open */
1330 ret = VP8CodecOpen(pVp8Dec);
1331 if (ret != OMX_ErrorNone) {
20d3e6e3
JC
1332 goto EXIT;
1333 }
1334
38ef2572
JC
1335 pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps;
1336 pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps;
1337 pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
1338
1339 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
f8d511af 1340 OMX_U32 nPlaneSize[MFC_INPUT_BUFFER_PLANE] = {DEFAULT_MFC_INPUT_BUFFER_SIZE};
38ef2572
JC
1341 Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
1342 Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
f8d511af
SK
1343 ret = Exynos_Allocate_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX, MFC_INPUT_BUFFER_NUM_MAX, nPlaneSize);
1344 if (ret != OMX_ErrorNone)
1345 goto EXIT;
38ef2572 1346
f8d511af 1347 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++)
38ef2572 1348 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
38ef2572 1349 } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
38ef2572
JC
1350 /*************/
1351 /* TBD */
1352 /*************/
1353 /* Does not require any actions. */
20d3e6e3
JC
1354 }
1355
38ef2572
JC
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) {
1360 /*************/
1361 /* TBD */
1362 /*************/
1363 /* Does not require any actions. */
1364 }
1365
1366 pVp8Dec->bSourceStart = OMX_FALSE;
1367 Exynos_OSAL_SignalCreate(&pVp8Dec->hSourceStartEvent);
1368 pVp8Dec->bDestinationStart = OMX_FALSE;
1369 Exynos_OSAL_SignalCreate(&pVp8Dec->hDestinationStartEvent);
20d3e6e3
JC
1370
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;
1375
1376 pExynosComponent->getAllDelayBuffer = OMX_FALSE;
1377
38ef2572
JC
1378#if 0//defined(USE_CSC_GSCALER)
1379 csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
800a8d75 1380#endif
38ef2572
JC
1381 pVideoDec->csc_handle = csc_init(csc_method);
1382 if (pVideoDec->csc_handle == NULL) {
1383 ret = OMX_ErrorInsufficientResources;
1384 goto EXIT;
800a8d75 1385 }
38ef2572 1386 pVideoDec->csc_set_format = OMX_FALSE;
20d3e6e3
JC
1387
1388EXIT:
1389 FunctionOut();
1390
1391 return ret;
1392}
1393
1394/* MFC Terminate */
38ef2572 1395OMX_ERRORTYPE Exynos_VP8Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
20d3e6e3 1396{
38ef2572
JC
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;
1404
1405 ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps;
1406 ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps;
1407 ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
1408
ef059a02 1409 int i, plane;
20d3e6e3
JC
1410
1411 FunctionIn();
1412
38ef2572
JC
1413 if (pVideoDec->csc_handle != NULL) {
1414 csc_deinit(pVideoDec->csc_handle);
1415 pVideoDec->csc_handle = NULL;
1416 }
20d3e6e3 1417
38ef2572
JC
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;
1424
1425 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
f8d511af 1426 Exynos_Free_CodecBuffers(pOMXComponent, OUTPUT_PORT_INDEX);
38ef2572
JC
1427 Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
1428 Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
1429 } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
38ef2572
JC
1430 /*************/
1431 /* TBD */
1432 /*************/
1433 /* Does not require any actions. */
20d3e6e3
JC
1434 }
1435
38ef2572 1436 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
f8d511af 1437 Exynos_Free_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX);
38ef2572
JC
1438 Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
1439 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
1440 } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
38ef2572
JC
1441 /*************/
1442 /* TBD */
1443 /*************/
1444 /* Does not require any actions. */
20d3e6e3 1445 }
38ef2572 1446 VP8CodecClose(pVp8Dec);
20d3e6e3 1447
81a947ba
SK
1448 Exynos_ResetAllPortConfig(pOMXComponent);
1449
20d3e6e3
JC
1450EXIT:
1451 FunctionOut();
1452
1453 return ret;
1454}
1455
38ef2572 1456OMX_ERRORTYPE Exynos_VP8Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
20d3e6e3 1457{
38ef2572
JC
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;
38ef2572
JC
1466 ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps;
1467 ExynosVideoDecBufferOps *pInbufOps = pVp8Dec->hMFCVp8Handle.pInbufOps;
1468 ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
1469 ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
1470 int i;
20d3e6e3
JC
1471
1472 FunctionIn();
1473
38ef2572
JC
1474 if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc == OMX_FALSE) {
1475 ret = VP8CodecSrcSetup(pOMXComponent, pSrcInputData);
20d3e6e3
JC
1476 goto EXIT;
1477 }
38ef2572
JC
1478 if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_FALSE) {
1479 ret = VP8CodecDstSetup(pOMXComponent);
1480 }
1481
1482 if ((Check_VP8_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize) == OMX_TRUE) ||
3e79a27e 1483 ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
38ef2572
JC
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;
1490
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);
94d259f5
SK
1493 codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
1494 (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
38ef2572
JC
1495 if (codecReturn != VIDEO_ERROR_NONE) {
1496 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
1497 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
20d3e6e3
JC
1498 goto EXIT;
1499 }
38ef2572
JC
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);
1505 }
1506 if (pVp8Dec->bDestinationStart == OMX_FALSE) {
1507 pVp8Dec->bDestinationStart = OMX_TRUE;
1508 Exynos_OSAL_SignalSet(pVp8Dec->hDestinationStartEvent);
1509 Exynos_OSAL_SleepMillisec(0);
800a8d75
JC
1510 }
1511 }
1512
38ef2572 1513 ret = OMX_ErrorNone;
20d3e6e3 1514
38ef2572 1515EXIT:
38ef2572 1516 FunctionOut();
20d3e6e3 1517
38ef2572
JC
1518 return ret;
1519}
20d3e6e3 1520
38ef2572
JC
1521OMX_ERRORTYPE Exynos_VP8Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
1522{
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;
20d3e6e3 1532
38ef2572 1533 FunctionIn();
20d3e6e3 1534
38ef2572 1535 pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
20d3e6e3 1536
38ef2572
JC
1537 pSrcOutputData->dataLen = 0;
1538 pSrcOutputData->usedDataLen = 0;
1539 pSrcOutputData->remainDataLen = 0;
1540 pSrcOutputData->nFlags = 0;
1541 pSrcOutputData->timeStamp = 0;
20d3e6e3 1542
38ef2572
JC
1543 if (pVideoBuffer == NULL) {
1544 pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
1545 pSrcOutputData->allocSize = 0;
1546 pSrcOutputData->pPrivate = NULL;
1547 pSrcOutputData->bufferHeader = NULL;
1548 } else {
1549 pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
01fa64f5 1550 pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
38ef2572
JC
1551 pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize;
1552
1553 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1554 int i = 0;
ef059a02 1555 while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
38ef2572 1556 if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
38ef2572 1557 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
3e79a27e 1558 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
38ef2572
JC
1559 goto EXIT;
1560 }
1561 i++;
1562 }
38ef2572
JC
1563 pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
1564 pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
20d3e6e3 1565 }
20d3e6e3 1566
38ef2572
JC
1567 /* For Share Buffer */
1568 pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
20d3e6e3
JC
1569 }
1570
38ef2572 1571 ret = OMX_ErrorNone;
20d3e6e3
JC
1572
1573EXIT:
1574 FunctionOut();
38ef2572 1575
20d3e6e3
JC
1576 return ret;
1577}
800a8d75 1578
38ef2572 1579OMX_ERRORTYPE Exynos_VP8Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
20d3e6e3 1580{
38ef2572
JC
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;
ef059a02 1586 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
38ef2572
JC
1587 ExynosVideoDecOps *pDecOps = pVp8Dec->hMFCVp8Handle.pDecOps;
1588 ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
94d259f5 1589 OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
38ef2572 1590 ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
20d3e6e3
JC
1591
1592 FunctionIn();
1593
38ef2572
JC
1594 if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
1595 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
1596 ret = OMX_ErrorBadParameter;
20d3e6e3
JC
1597 goto EXIT;
1598 }
1599
3b1c2e30 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__,
ef059a02 1601 pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
3b1c2e30
SK
1602 pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1],
1603 pDstInputData->buffer.multiPlaneBuffer.fd[0],
1604 pDstInputData->buffer.multiPlaneBuffer.fd[1]);
1605
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;
1609
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);
38ef2572 1615 if (codecReturn != VIDEO_ERROR_NONE) {
6f3be1e3
SK
1616 if (codecReturn != VIDEO_ERROR_WRONGBUFFERSIZE) {
1617 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
1618 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
1619 }
38ef2572
JC
1620 goto EXIT;
1621 }
1622 VP8CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
20d3e6e3 1623
38ef2572 1624 ret = OMX_ErrorNone;
20d3e6e3 1625
38ef2572
JC
1626EXIT:
1627 FunctionOut();
20d3e6e3 1628
38ef2572
JC
1629 return ret;
1630}
20d3e6e3 1631
38ef2572
JC
1632OMX_ERRORTYPE Exynos_VP8Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
1633{
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;
3b1c2e30 1644 ExynosVideoBuffer videoBuffer;
38ef2572
JC
1645 ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
1646 ExynosVideoGeometry *bufferGeometry;
1647 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
1648 OMX_S32 indexTimestamp = 0;
ef059a02 1649 int plane;
20d3e6e3 1650
38ef2572 1651 FunctionIn();
20d3e6e3 1652
38ef2572
JC
1653 if (pVp8Dec->bDestinationStart == OMX_FALSE) {
1654 ret = OMX_ErrorNone;
1655 goto EXIT;
1656 }
20d3e6e3 1657
38ef2572 1658 while (1) {
3b1c2e30
SK
1659 Exynos_OSAL_Memset(&videoBuffer, 0, sizeof(ExynosVideoBuffer));
1660 if (pOutbufOps->ExtensionDequeue(hMFCHandle, &videoBuffer) == VIDEO_ERROR_NONE) {
1661 pVideoBuffer = &videoBuffer;
1662 } else {
1663 pVideoBuffer = NULL;
38ef2572
JC
1664 ret = OMX_ErrorNone;
1665 goto EXIT;
1666 }
1667 displayStatus = pVideoBuffer->displayStatus;
1668 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
1669
1670 if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
1671 (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
1672 (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
c01f2434 1673 (displayStatus == VIDEO_FRAME_STATUS_DECODING_FINISHED) ||
38ef2572
JC
1674 (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
1675 if (pVideoBuffer != NULL) {
1676 ret = OMX_ErrorNone;
1677 break;
20d3e6e3 1678 } else {
38ef2572
JC
1679 ret = OMX_ErrorUndefined;
1680 break;
20d3e6e3 1681 }
20d3e6e3 1682 }
38ef2572
JC
1683 }
1684
fcf4e7ff
SK
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;
1692 }
1693 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "VIDEO_FRAME_STATUS_CHANGE_RESOL");
1694 ret = OMX_ErrorNone;
1695 goto EXIT;
1696 }
1697
38ef2572
JC
1698 if (ret != OMX_ErrorNone)
1699 goto EXIT;
1700
1701 pVp8Dec->hMFCVp8Handle.outputIndexTimestamp++;
1702 pVp8Dec->hMFCVp8Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
1703
ef059a02
SK
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;
1710 }
38ef2572
JC
1711 pDstOutputData->usedDataLen = 0;
1712 pDstOutputData->pPrivate = pVideoBuffer;
3b1c2e30
SK
1713 if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
1714 int i = 0;
1715 pDstOutputData->pPrivate = NULL;
1716
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]);
1728 break;
1729 }
1730 }
1731
1732 if (pDstOutputData->pPrivate == NULL) {
1733 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
1734 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
1735 goto EXIT;
1736 }
1737 }
38ef2572
JC
1738 /* For Share Buffer */
1739 pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
1740
1741 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
1742 bufferGeometry = &pVp8Dec->hMFCVp8Handle.codecOutbufConf;
1743 pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
1744 pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
3b1c2e30 1745 Exynos_OSAL_Memcpy(&pBufferInfo->PDSB, &pVideoBuffer->PDSB, sizeof(PrivateDataShareBuffer));
38ef2572
JC
1746 switch (bufferGeometry->eColorFormat) {
1747 case VIDEO_COLORFORMAT_NV12:
1748 pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
1749 break;
1750 case VIDEO_COLORFORMAT_NV12_TILED:
1751 default:
1752 pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
1753 break;
1754 }
1755
1756 indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
3e79a27e 1757 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
38ef2572
JC
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];
cb767331 1763 pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp] = 0x00;
3e79a27e 1764 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
38ef2572
JC
1765 } else {
1766 pDstOutputData->timeStamp = 0x00;
1767 pDstOutputData->nFlags = 0x00;
20d3e6e3
JC
1768 }
1769 } else {
38ef2572
JC
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];
cb767331 1776 pExynosComponent->nFlags[indexTimestamp] = 0x00;
38ef2572
JC
1777 pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = indexTimestamp;
1778 } else {
1779 pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
1780 pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
cb767331 1781 pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp] = 0x00;
20d3e6e3 1782 }
38ef2572
JC
1783#else
1784 pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
1785 pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
cb767331 1786 pExynosComponent->nFlags[indexTimestamp] = 0x00;
38ef2572
JC
1787#endif
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);
1789 }
20d3e6e3 1790
6f3be1e3 1791 if ((displayStatus == VIDEO_FRAME_STATUS_DECODING_FINISHED) ||
38ef2572 1792 ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
3e79a27e 1793 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
38ef2572 1794 pDstOutputData->remainDataLen = 0;
81a947ba
SK
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;
1799 }
38ef2572
JC
1800 } else {
1801 pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
1802 }
1803
1804 ret = OMX_ErrorNone;
1805
1806EXIT:
1807 FunctionOut();
1808
1809 return ret;
1810}
1811
1812OMX_ERRORTYPE Exynos_VP8Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
1813{
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];
20d3e6e3 1818
38ef2572 1819 FunctionIn();
20d3e6e3 1820
38ef2572 1821 if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
20d3e6e3 1822 ret = OMX_ErrorNone;
38ef2572 1823 goto EXIT;
20d3e6e3 1824 }
38ef2572
JC
1825 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
1826 ret = OMX_ErrorNone;
1827 goto EXIT;
20d3e6e3
JC
1828 }
1829
38ef2572
JC
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);
1835 }
20d3e6e3 1836
38ef2572
JC
1837EXIT:
1838 FunctionOut();
20d3e6e3 1839
38ef2572
JC
1840 return ret;
1841}
800a8d75 1842
38ef2572
JC
1843OMX_ERRORTYPE Exynos_VP8Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
1844{
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];
20d3e6e3 1849
38ef2572 1850 FunctionIn();
20d3e6e3 1851
38ef2572
JC
1852 if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
1853 ret = OMX_ErrorNone;
1854 goto EXIT;
1855 }
800a8d75 1856
38ef2572
JC
1857 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1858 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
1859 ret = OMX_ErrorNone;
1860 goto EXIT;
20d3e6e3 1861 }
38ef2572
JC
1862 }
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);
1867 }
20d3e6e3 1868
38ef2572
JC
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);
1875 }
20d3e6e3 1876
38ef2572
JC
1877EXIT:
1878 FunctionOut();
20d3e6e3 1879
38ef2572
JC
1880 return ret;
1881}
1882
1883OMX_ERRORTYPE Exynos_VP8Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
1884{
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;
38ef2572
JC
1888 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1889
1890 FunctionIn();
1891
1892 if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
1893 ret = OMX_ErrorNone;
1894 goto EXIT;
1895 }
1896 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
1897 ret = OMX_ErrorNone;
1898 goto EXIT;
1899 }
38ef2572
JC
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);
20d3e6e3 1905 }
38ef2572
JC
1906 }
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);
20d3e6e3 1913 }
20d3e6e3
JC
1914 }
1915
1916EXIT:
1917 FunctionOut();
1918
1919 return ret;
1920}
1921
38ef2572 1922OMX_ERRORTYPE Exynos_VP8Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
20d3e6e3 1923{
38ef2572
JC
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;
38ef2572 1927 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
20d3e6e3
JC
1928
1929 FunctionIn();
1930
38ef2572 1931 if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
20d3e6e3
JC
1932 ret = OMX_ErrorNone;
1933 goto EXIT;
1934 }
38ef2572 1935 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
20d3e6e3
JC
1936 ret = OMX_ErrorNone;
1937 goto EXIT;
1938 }
1939
38ef2572
JC
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);
20d3e6e3 1945 }
38ef2572 1946 }
38ef2572
JC
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);
20d3e6e3
JC
1953 }
1954
1955EXIT:
1956 FunctionOut();
1957
1958 return ret;
1959}
1960
1961OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(
1962 OMX_HANDLETYPE hComponent,
1963 OMX_STRING componentName)
1964{
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;
20d3e6e3
JC
1971 int i = 0;
1972
1973 FunctionIn();
1974
1975 if ((hComponent == NULL) || (componentName == NULL)) {
1976 ret = OMX_ErrorBadParameter;
1977 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
1978 goto EXIT;
1979 }
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__);
1983 goto EXIT;
1984 }
1985
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__);
1990 goto EXIT;
1991 }
1992 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1993 pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
1994
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__);
2000 goto EXIT;
2001 }
2002 Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
2003
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__);
2009 goto EXIT;
2010 }
2011 Exynos_OSAL_Memset(pVp8Dec, 0, sizeof(EXYNOS_VP8DEC_HANDLE));
2012 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
2013 pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pVp8Dec;
2014
2015 Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_VP8_DEC);
2016
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;
2027
20d3e6e3
JC
2028 /* Input port */
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;
38ef2572
JC
2042 pExynosPort->bufferProcessType = BUFFER_SHARE;
2043 pExynosPort->portWayType = WAY2_PORT;
20d3e6e3
JC
2044
2045 /* Output 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;
38ef2572
JC
2059 pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE;
2060 pExynosPort->portWayType = WAY2_PORT;
2061
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;
20d3e6e3
JC
2068 pOMXComponent->ComponentDeInit = &Exynos_OMX_ComponentDeinit;
2069
38ef2572
JC
2070 pExynosComponent->exynos_codec_componentInit = &Exynos_VP8Dec_Init;
2071 pExynosComponent->exynos_codec_componentTerminate = &Exynos_VP8Dec_Terminate;
2072
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;
2077
3e79a27e
SK
2078 pVideoDec->exynos_codec_start = &VP8CodecStart;
2079 pVideoDec->exynos_codec_stop = &VP8CodecStop;
38ef2572
JC
2080 pVideoDec->exynos_codec_bufferProcessRun = &VP8CodecOutputBufferProcessRun;
2081 pVideoDec->exynos_codec_enqueueAllBuffer = &VP8CodecEnQueueAllBuffer;
2082
2083 pVideoDec->exynos_checkInputFrame = &Check_VP8_Frame;
2084 pVideoDec->exynos_codec_getCodecInputPrivateData = &GetCodecInputPrivateData;
2085 pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
fcf4e7ff 2086 pVideoDec->exynos_codec_reconfigAllBuffers = &VP8CodecReconfigAllBuffers;
38ef2572
JC
2087
2088 pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
2089 if (pVideoDec->hSharedMemory == NULL) {
3e79a27e 2090 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
38ef2572
JC
2091 Exynos_OSAL_Free(pVp8Dec);
2092 pVp8Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
2093 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2094 ret = OMX_ErrorInsufficientResources;
2095 goto EXIT;
2096 }
20d3e6e3
JC
2097
2098 pExynosComponent->currentState = OMX_StateLoaded;
2099
2100 ret = OMX_ErrorNone;
2101
2102EXIT:
2103 FunctionOut();
2104
2105 return ret;
2106}
2107
2108OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(
2109 OMX_HANDLETYPE hComponent)
2110{
2111 OMX_ERRORTYPE ret = OMX_ErrorNone;
2112 OMX_COMPONENTTYPE *pOMXComponent = NULL;
2113 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
38ef2572 2114 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
20d3e6e3
JC
2115 EXYNOS_VP8DEC_HANDLE *pVp8Dec = NULL;
2116
2117 FunctionIn();
2118
2119 if (hComponent == NULL) {
2120 ret = OMX_ErrorBadParameter;
2121 goto EXIT;
2122 }
2123 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
2124 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
38ef2572
JC
2125 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
2126
2127 Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
20d3e6e3
JC
2128
2129 Exynos_OSAL_Free(pExynosComponent->componentName);
2130 pExynosComponent->componentName = NULL;
2131
38ef2572 2132 pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
20d3e6e3
JC
2133 if (pVp8Dec != NULL) {
2134 Exynos_OSAL_Free(pVp8Dec);
38ef2572 2135 pVp8Dec = pVideoDec->hCodecHandle = NULL;
20d3e6e3
JC
2136 }
2137
2138 ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2139 if (ret != OMX_ErrorNone) {
2140 goto EXIT;
2141 }
2142
2143 ret = OMX_ErrorNone;
2144
2145EXIT:
2146 FunctionOut();
2147
2148 return ret;
2149}