exynos_omx: multi_thread: Fix for dynamic resolution change timing issue.
[GitHub/LineageOS/android_hardware_samsung_slsi_exynos5.git] / exynos_omx / openmax / exynos_omx / component / video / dec / mpeg4 / Exynos_OMX_Mpeg4dec.c
1 /*
2 *
3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
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_Mpeg4dec.c
20 * @brief
21 * @author Yunji Kim (yunji.kim@samsung.com)
22 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
23 * @version 2.0.0
24 * @history
25 * 2012.02.20 : Create
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_Mpeg4dec.h"
41 #include "ExynosVideoApi.h"
42 #include "Exynos_OSAL_SharedMemory.h"
43 #include "Exynos_OSAL_Event.h"
44
45 #ifdef USE_ANB
46 #include "Exynos_OSAL_Android.h"
47 #endif
48
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 */
51 #include "csc.h"
52
53 #undef EXYNOS_LOG_TAG
54 #define EXYNOS_LOG_TAG "EXYNOS_MPEG4_DEC"
55 #define EXYNOS_LOG_OFF
56 //#define EXYNOS_TRACE_ON
57 #include "Exynos_OSAL_Log.h"
58
59 #define MPEG4_DEC_NUM_OF_EXTRA_BUFFERS 7
60
61 //#define FULL_FRAME_SEARCH
62
63 /* MPEG4 Decoder Supported Levels & profiles */
64 EXYNOS_OMX_VIDEO_PROFILELEVEL supportedMPEG4ProfileLevels[] ={
65 {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0},
66 {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0b},
67 {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1},
68 {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level2},
69 {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level3},
70 {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4},
71 {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4a},
72 {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level5},
73 {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0},
74 {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0b},
75 {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level1},
76 {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level2},
77 {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level3},
78 {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4},
79 {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4a},
80 {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level5}};
81
82 /* H.263 Decoder Supported Levels & profiles */
83 EXYNOS_OMX_VIDEO_PROFILELEVEL supportedH263ProfileLevels[] = {
84 /* Baseline (Profile 0) */
85 {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level10},
86 {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level20},
87 {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level30},
88 {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level40},
89 {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level45},
90 {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level50},
91 {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level60},
92 {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level70},
93 /* Profile 1 */
94 {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level10},
95 {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level20},
96 {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level30},
97 {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level40},
98 {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level45},
99 {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level50},
100 {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level60},
101 {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level70},
102 /* Profile 2 */
103 {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level10},
104 {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level20},
105 {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level30},
106 {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level40},
107 {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level45},
108 {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level50},
109 {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level60},
110 {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level70},
111 /* Profile 3, restricted up to SD resolution */
112 {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level10},
113 {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level20},
114 {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level30},
115 {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level40},
116 {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level45},
117 {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level50},
118 {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level60},
119 {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level70}};
120
121
122 static OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, void *pVirtAddr, OMX_U32 *dataSize)
123 {
124 OMX_ERRORTYPE ret = OMX_ErrorNone;
125
126 EXIT:
127 return ret;
128 }
129
130 static OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, void *addr[], int size[])
131 {
132 OMX_ERRORTYPE ret = OMX_ErrorNone;
133 ExynosVideoBuffer *pCodecBuffer;
134
135 if (codecBuffer == NULL) {
136 ret = OMX_ErrorBadParameter;
137 goto EXIT;
138 }
139
140 pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
141
142 if (addr != NULL) {
143 addr[0] = pCodecBuffer->planes[0].addr;
144 addr[1] = pCodecBuffer->planes[1].addr;
145 addr[2] = pCodecBuffer->planes[2].addr;
146 }
147
148 if (size != NULL) {
149 size[0] = pCodecBuffer->planes[0].allocSize;
150 size[1] = pCodecBuffer->planes[1].allocSize;
151 size[2] = pCodecBuffer->planes[2].allocSize;
152 }
153
154 EXIT:
155 return ret;
156 }
157
158 static OMX_BOOL gbFIMV1 = OMX_FALSE;
159
160 static int Check_Mpeg4_Frame(
161 OMX_U8 *pInputStream,
162 OMX_U32 buffSize,
163 OMX_U32 flag,
164 OMX_BOOL bPreviousFrameEOF,
165 OMX_BOOL *pbEndOfFrame)
166 {
167 OMX_U32 len;
168 int readStream;
169 unsigned startCode;
170 OMX_BOOL bFrameStart;
171
172 len = 0;
173 bFrameStart = OMX_FALSE;
174
175 if (flag & OMX_BUFFERFLAG_CODECCONFIG) {
176 if (*pInputStream == 0x03) { /* FIMV1 */
177 BitmapInfoHhr *pInfoHeader;
178
179 pInfoHeader = (BitmapInfoHhr *)(pInputStream + 1);
180 /* FIXME */
181 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "############## NOT SUPPORTED #################");
182 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "width(%d), height(%d)", pInfoHeader->BiWidth, pInfoHeader->BiHeight);
183 gbFIMV1 = OMX_TRUE;
184 *pbEndOfFrame = OMX_TRUE;
185 return buffSize;
186 }
187 }
188
189 if (gbFIMV1) {
190 *pbEndOfFrame = OMX_TRUE;
191 return buffSize;
192 }
193
194 if (bPreviousFrameEOF == OMX_FALSE)
195 bFrameStart = OMX_TRUE;
196
197 startCode = 0xFFFFFFFF;
198 if (bFrameStart == OMX_FALSE) {
199 /* find VOP start code */
200 while(startCode != 0x1B6) {
201 readStream = *(pInputStream + len);
202 startCode = (startCode << 8) | readStream;
203 len++;
204 if (len > buffSize)
205 goto EXIT;
206 }
207 }
208
209 /* find next VOP start code */
210 startCode = 0xFFFFFFFF;
211 while ((startCode != 0x1B6)) {
212 readStream = *(pInputStream + len);
213 startCode = (startCode << 8) | readStream;
214 len++;
215 if (len > buffSize)
216 goto EXIT;
217 }
218
219 *pbEndOfFrame = OMX_TRUE;
220
221 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "1. Check_Mpeg4_Frame returned EOF = %d, len = %d, buffSize = %d", *pbEndOfFrame, len - 4, buffSize);
222
223 return len - 4;
224
225 EXIT :
226 *pbEndOfFrame = OMX_FALSE;
227
228 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "2. Check_Mpeg4_Frame returned EOF = %d, len = %d, buffSize = %d", *pbEndOfFrame, len - 1, buffSize);
229
230 return --len;
231 }
232
233 static int Check_H263_Frame(
234 OMX_U8 *pInputStream,
235 OMX_U32 buffSize,
236 OMX_U32 flag,
237 OMX_BOOL bPreviousFrameEOF,
238 OMX_BOOL *pbEndOfFrame)
239 {
240 OMX_U32 len;
241 int readStream;
242 unsigned startCode;
243 OMX_BOOL bFrameStart = 0;
244 unsigned pTypeMask = 0x03;
245 unsigned pType = 0;
246
247 len = 0;
248 bFrameStart = OMX_FALSE;
249
250 if (bPreviousFrameEOF == OMX_FALSE)
251 bFrameStart = OMX_TRUE;
252
253 startCode = 0xFFFFFFFF;
254 if (bFrameStart == OMX_FALSE) {
255 /* find PSC(Picture Start Code) : 0000 0000 0000 0000 1000 00 */
256 while (((startCode << 8 >> 10) != 0x20) || (pType != 0x02)) {
257 readStream = *(pInputStream + len);
258 startCode = (startCode << 8) | readStream;
259
260 readStream = *(pInputStream + len + 1);
261 pType = readStream & pTypeMask;
262
263 len++;
264 if (len > buffSize)
265 goto EXIT;
266 }
267 }
268
269 /* find next PSC */
270 startCode = 0xFFFFFFFF;
271 pType = 0;
272 while (((startCode << 8 >> 10) != 0x20) || (pType != 0x02)) {
273 readStream = *(pInputStream + len);
274 startCode = (startCode << 8) | readStream;
275
276 readStream = *(pInputStream + len + 1);
277 pType = readStream & pTypeMask;
278
279 len++;
280 if (len > buffSize)
281 goto EXIT;
282 }
283
284 *pbEndOfFrame = OMX_TRUE;
285
286 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "1. Check_H263_Frame returned EOF = %d, len = %d, iBuffSize = %d", *pbEndOfFrame, len - 3, buffSize);
287
288 return len - 3;
289
290 EXIT :
291
292 *pbEndOfFrame = OMX_FALSE;
293
294 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "2. Check_H263_Frame returned EOF = %d, len = %d, iBuffSize = %d", *pbEndOfFrame, len - 1, buffSize);
295
296 return --len;
297 }
298
299 static OMX_BOOL Check_Stream_StartCode(
300 OMX_U8 *pInputStream,
301 OMX_U32 streamSize,
302 CODEC_TYPE codecType)
303 {
304 switch (codecType) {
305 case CODEC_TYPE_MPEG4:
306 if (gbFIMV1) {
307 return OMX_TRUE;
308 } else {
309 if (streamSize < 3) {
310 return OMX_FALSE;
311 } else if ((pInputStream[0] == 0x00) &&
312 (pInputStream[1] == 0x00) &&
313 (pInputStream[2] == 0x01)) {
314 return OMX_TRUE;
315 } else {
316 return OMX_FALSE;
317 }
318 }
319 break;
320 case CODEC_TYPE_H263:
321 if (streamSize > 0) {
322 unsigned startCode = 0xFFFFFFFF;
323 unsigned pTypeMask = 0x03;
324 unsigned pType = 0;
325 OMX_U32 len = 0;
326 int readStream;
327 /* Check PSC(Picture Start Code) : 0000 0000 0000 0000 1000 00 */
328 while (((startCode << 8 >> 10) != 0x20) || (pType != 0x02)) {
329 readStream = *(pInputStream + len);
330 startCode = (startCode << 8) | readStream;
331
332 readStream = *(pInputStream + len + 1);
333 pType = readStream & pTypeMask;
334
335 len++;
336 if (len > 0x3)
337 break;
338 }
339
340 if (len > 0x3) {
341 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "[%s] Picture Start Code Missing", __FUNCTION__);
342 return OMX_FALSE;
343 } else {
344 return OMX_TRUE;
345 }
346 } else {
347 return OMX_FALSE;
348 }
349 default:
350 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "%s: undefined codec type (%d)", __FUNCTION__, codecType);
351 return OMX_FALSE;
352 }
353 }
354
355 OMX_ERRORTYPE Mpeg4CodecOpen(EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec)
356 {
357 OMX_ERRORTYPE ret = OMX_ErrorNone;
358 ExynosVideoDecOps *pDecOps = NULL;
359 ExynosVideoDecBufferOps *pInbufOps = NULL;
360 ExynosVideoDecBufferOps *pOutbufOps = NULL;
361
362 FunctionIn();
363
364 if (pMpeg4Dec == NULL) {
365 ret = OMX_ErrorBadParameter;
366 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
367 goto EXIT;
368 }
369
370 /* alloc ops structure */
371 pDecOps = (ExynosVideoDecOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps));
372 pInbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
373 pOutbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
374
375 if ((pDecOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
376 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate decoder ops buffer");
377 ret = OMX_ErrorInsufficientResources;
378 goto EXIT;
379 }
380
381 pMpeg4Dec->hMFCMpeg4Handle.pDecOps = pDecOps;
382 pMpeg4Dec->hMFCMpeg4Handle.pInbufOps = pInbufOps;
383 pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps = pOutbufOps;
384
385 /* function pointer mapping */
386 pDecOps->nSize = sizeof(ExynosVideoDecOps);
387 pInbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
388 pOutbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
389
390 Exynos_Video_Register_Decoder(pDecOps, pInbufOps, pOutbufOps);
391
392 /* check mandatory functions for decoder ops */
393 if ((pDecOps->Init == NULL) || (pDecOps->Finalize == NULL) ||
394 (pDecOps->Get_ActualBufferCount == NULL) || (pDecOps->Set_FrameTag == NULL) ||
395 (pDecOps->Get_FrameTag == NULL)) {
396 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
397 ret = OMX_ErrorInsufficientResources;
398 goto EXIT;
399 }
400
401 /* check mandatory functions for buffer ops */
402 if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
403 (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
404 (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
405 (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
406 (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
407 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
408 ret = OMX_ErrorInsufficientResources;
409 goto EXIT;
410 }
411
412 /* alloc context, open, querycap */
413 pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.pDecOps->Init(V4L2_MEMORY_DMABUF);
414 if (pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle == NULL) {
415 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
416 ret = OMX_ErrorInsufficientResources;
417 goto EXIT;
418 }
419
420 ret = OMX_ErrorNone;
421
422 EXIT:
423 if (ret != OMX_ErrorNone) {
424 if (pDecOps != NULL) {
425 Exynos_OSAL_Free(pDecOps);
426 pMpeg4Dec->hMFCMpeg4Handle.pDecOps = NULL;
427 }
428 if (pInbufOps != NULL) {
429 Exynos_OSAL_Free(pInbufOps);
430 pMpeg4Dec->hMFCMpeg4Handle.pInbufOps = NULL;
431 }
432 if (pOutbufOps != NULL) {
433 Exynos_OSAL_Free(pOutbufOps);
434 pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps = NULL;
435 }
436 }
437
438 FunctionOut();
439
440 return ret;
441 }
442
443 OMX_ERRORTYPE Mpeg4CodecClose(EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec)
444 {
445 OMX_ERRORTYPE ret = OMX_ErrorNone;
446 void *hMFCHandle = NULL;
447 ExynosVideoDecOps *pDecOps = NULL;
448 ExynosVideoDecBufferOps *pInbufOps = NULL;
449 ExynosVideoDecBufferOps *pOutbufOps = NULL;
450
451 FunctionIn();
452
453 if (pMpeg4Dec == NULL) {
454 ret = OMX_ErrorBadParameter;
455 goto EXIT;
456 }
457
458 hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
459 pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
460 pInbufOps = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
461 pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
462
463 if (hMFCHandle != NULL) {
464 pDecOps->Finalize(hMFCHandle);
465 pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle = NULL;
466 }
467 if (pOutbufOps != NULL) {
468 Exynos_OSAL_Free(pOutbufOps);
469 pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps = NULL;
470 }
471 if (pInbufOps != NULL) {
472 Exynos_OSAL_Free(pInbufOps);
473 pMpeg4Dec->hMFCMpeg4Handle.pInbufOps = NULL;
474 }
475 if (pDecOps != NULL) {
476 Exynos_OSAL_Free(pDecOps);
477 pMpeg4Dec->hMFCMpeg4Handle.pDecOps = NULL;
478 }
479
480 ret = OMX_ErrorNone;
481
482 EXIT:
483 FunctionOut();
484
485 return ret;
486 }
487
488 OMX_ERRORTYPE Mpeg4CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
489 {
490 OMX_ERRORTYPE ret = OMX_ErrorNone;
491 void *hMFCHandle = NULL;
492 ExynosVideoDecOps *pDecOps = NULL;
493 ExynosVideoDecBufferOps *pInbufOps = NULL;
494 ExynosVideoDecBufferOps *pOutbufOps = NULL;
495 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
496 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = NULL;
497
498 FunctionIn();
499
500 if (pOMXComponent == NULL) {
501 ret = OMX_ErrorBadParameter;
502 goto EXIT;
503 }
504
505 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
506 if (pVideoDec == NULL) {
507 ret = OMX_ErrorBadParameter;
508 goto EXIT;
509 }
510
511 pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
512 if (pMpeg4Dec == NULL) {
513 ret = OMX_ErrorBadParameter;
514 goto EXIT;
515 }
516
517 hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
518 pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
519 pInbufOps = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
520 pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
521
522 if (nPortIndex == INPUT_PORT_INDEX)
523 pInbufOps->Run(hMFCHandle);
524 else if (nPortIndex == OUTPUT_PORT_INDEX)
525 pOutbufOps->Run(hMFCHandle);
526
527 ret = OMX_ErrorNone;
528
529 EXIT:
530 FunctionOut();
531
532 return ret;
533 }
534
535 OMX_ERRORTYPE Mpeg4CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
536 {
537 OMX_ERRORTYPE ret = OMX_ErrorNone;
538 void *hMFCHandle = NULL;
539 ExynosVideoDecOps *pDecOps = NULL;
540 ExynosVideoDecBufferOps *pInbufOps = NULL;
541 ExynosVideoDecBufferOps *pOutbufOps = NULL;
542 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
543 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = NULL;
544
545 FunctionIn();
546
547 if (pOMXComponent == NULL) {
548 ret = OMX_ErrorBadParameter;
549 goto EXIT;
550 }
551
552 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
553 if (pVideoDec == NULL) {
554 ret = OMX_ErrorBadParameter;
555 goto EXIT;
556 }
557 pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
558 if (pMpeg4Dec == NULL) {
559 ret = OMX_ErrorBadParameter;
560 goto EXIT;
561 }
562
563 hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
564 pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
565 pInbufOps = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
566 pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
567
568 if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
569 pInbufOps->Stop(hMFCHandle);
570 else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
571 pOutbufOps->Stop(hMFCHandle);
572
573 ret = OMX_ErrorNone;
574
575 EXIT:
576 FunctionOut();
577
578 return ret;
579 }
580
581 OMX_ERRORTYPE Mpeg4CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
582 {
583 OMX_ERRORTYPE ret = OMX_ErrorNone;
584 void *hMFCHandle = NULL;
585 ExynosVideoDecOps *pDecOps = NULL;
586 ExynosVideoDecBufferOps *pInbufOps = NULL;
587 ExynosVideoDecBufferOps *pOutbufOps = NULL;
588 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
589 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = NULL;
590
591 FunctionIn();
592
593 if (pOMXComponent == NULL) {
594 ret = OMX_ErrorBadParameter;
595 goto EXIT;
596 }
597
598 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
599 if (pVideoDec == NULL) {
600 ret = OMX_ErrorBadParameter;
601 goto EXIT;
602 }
603 pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
604 if (pMpeg4Dec == NULL) {
605 ret = OMX_ErrorBadParameter;
606 goto EXIT;
607 }
608
609 hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
610 pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
611 pInbufOps = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
612 pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
613
614 if (nPortIndex == INPUT_PORT_INDEX) {
615 if (pMpeg4Dec->bSourceStart == OMX_FALSE) {
616 Exynos_OSAL_SignalSet(pMpeg4Dec->hSourceStartEvent);
617 Exynos_OSAL_SleepMillisec(0);
618 }
619 }
620
621 if (nPortIndex == OUTPUT_PORT_INDEX) {
622 if (pMpeg4Dec->bDestinationStart == OMX_FALSE) {
623 Exynos_OSAL_SignalSet(pMpeg4Dec->hDestinationStartEvent);
624 Exynos_OSAL_SleepMillisec(0);
625 }
626 }
627
628 ret = OMX_ErrorNone;
629
630 EXIT:
631 FunctionOut();
632
633 return ret;
634 }
635
636 OMX_ERRORTYPE Mpeg4CodecRegistCodecBuffers(
637 OMX_COMPONENTTYPE *pOMXComponent,
638 OMX_U32 nPortIndex,
639 OMX_U32 nBufferCnt)
640 {
641 OMX_ERRORTYPE ret = OMX_ErrorNone;
642 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
643 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
644 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
645 void *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
646 CODEC_DEC_BUFFER **ppCodecBuffer = NULL;
647 ExynosVideoDecBufferOps *pBufOps = NULL;
648 ExynosVideoPlane *pPlanes = NULL;
649
650 OMX_U32 nPlaneCnt = 0;
651 int i, j;
652
653 FunctionIn();
654
655 if (nPortIndex == INPUT_PORT_INDEX) {
656 ppCodecBuffer = &(pVideoDec->pMFCDecInputBuffer[0]);
657 nPlaneCnt = MFC_INPUT_BUFFER_PLANE;
658 pBufOps = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
659 } else {
660 ppCodecBuffer = &(pVideoDec->pMFCDecOutputBuffer[0]);
661 nPlaneCnt = MFC_OUTPUT_BUFFER_PLANE;
662 pBufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
663 }
664
665 pPlanes = (ExynosVideoPlane *)Exynos_OSAL_Malloc(sizeof(ExynosVideoPlane) * nPlaneCnt);
666 if (pPlanes == NULL) {
667 ret = OMX_ErrorInsufficientResources;
668 goto EXIT;
669 }
670
671 /* Register buffer */
672 for (i = 0; i < nBufferCnt; i++) {
673 for (j = 0; j < nPlaneCnt; j++) {
674 pPlanes[j].addr = ppCodecBuffer[i]->pVirAddr[j];
675 pPlanes[j].fd = ppCodecBuffer[i]->fd[j];
676 pPlanes[j].allocSize = ppCodecBuffer[i]->bufferSize[j];
677 }
678
679 if (pBufOps->Register(hMFCHandle, pPlanes, nPlaneCnt) != VIDEO_ERROR_NONE) {
680 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "PORT[%d]: Failed to Register buffer", nPortIndex);
681 ret = OMX_ErrorInsufficientResources;
682 Exynos_OSAL_Free(pPlanes);
683 goto EXIT;
684 }
685 }
686
687 Exynos_OSAL_Free(pPlanes);
688
689 ret = OMX_ErrorNone;
690
691 EXIT:
692 FunctionOut();
693
694 return ret;
695 }
696
697 OMX_ERRORTYPE Mpeg4CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
698 {
699 OMX_ERRORTYPE ret = OMX_ErrorNone;
700 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
701 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
702 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
703 void *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
704 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
705 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
706 int i, nOutbufs;
707
708 ExynosVideoDecOps *pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
709 ExynosVideoDecBufferOps *pInbufOps = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
710 ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
711
712 FunctionIn();
713
714 if ((nPortIndex != INPUT_PORT_INDEX) && (nPortIndex != OUTPUT_PORT_INDEX)) {
715 ret = OMX_ErrorBadPortIndex;
716 goto EXIT;
717 }
718
719 if ((nPortIndex == INPUT_PORT_INDEX) &&
720 (pMpeg4Dec->bSourceStart == OMX_TRUE)) {
721 Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
722
723 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
724 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
725 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
726
727 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
728 }
729
730 pInbufOps->Clear_Queue(hMFCHandle);
731 } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
732 (pMpeg4Dec->bDestinationStart == OMX_TRUE)) {
733 OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
734 ExynosVideoBuffer *pBuffer = NULL;
735
736 Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
737
738 nOutbufs = pDecOps->Get_ActualBufferCount(hMFCHandle);
739 nOutbufs += EXTRA_DPB_NUM;
740 for (i = 0; i < nOutbufs; i++) {
741 Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, pVideoDec->pMFCDecOutputBuffer[i]);
742 }
743 pOutbufOps->Clear_Queue(hMFCHandle);
744 } else {
745 ret = OMX_ErrorBadParameter;
746 goto EXIT;
747 }
748
749 EXIT:
750 FunctionOut();
751
752 return ret;
753 }
754
755 OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
756 {
757 OMX_ERRORTYPE ret = OMX_ErrorNone;
758 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
759 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
760 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
761 void *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
762 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
763 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
764 OMX_U32 oneFrameSize = pSrcInputData->dataLen;
765
766 ExynosVideoDecOps *pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
767 ExynosVideoDecBufferOps *pInbufOps = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
768 ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
769 ExynosVideoGeometry bufferConf;
770 OMX_U32 inputBufferNumber = 0;
771 int i;
772
773 FunctionIn();
774
775 if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
776 OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
777 OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
778 if (OMXBuffer == NULL) {
779 ret = OMX_ErrorUndefined;
780 goto EXIT;
781 }
782
783 OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
784 OMXBuffer->nFlags = pSrcInputData->nFlags;
785 Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
786
787 ret = OMX_ErrorNone;
788 goto EXIT;
789 }
790
791 if (pVideoDec->bThumbnailMode == OMX_TRUE)
792 pDecOps->Set_IFrameDecoding(hMFCHandle);
793
794 /* input buffer info */
795 Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
796 if (pMpeg4Dec->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
797 bufferConf.eCompressionFormat = VIDEO_CODING_MPEG4;
798 else
799 bufferConf.eCompressionFormat = VIDEO_CODING_H263;
800
801 pInbufOps->Set_Shareable(hMFCHandle);
802 if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
803 bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth
804 * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
805 inputBufferNumber = MAX_VIDEO_INPUTBUFFER_NUM;
806 } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
807 bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE;
808 inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
809 }
810
811 /* should be done before prepare input buffer */
812 if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
813 ret = OMX_ErrorInsufficientResources;
814 goto EXIT;
815 }
816
817 /* set input buffer geometry */
818 if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
819 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
820 ret = OMX_ErrorInsufficientResources;
821 goto EXIT;
822 }
823
824 /* setup input buffer */
825 if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
826 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
827 ret = OMX_ErrorInsufficientResources;
828 goto EXIT;
829 }
830
831 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
832 ret = Mpeg4CodecRegistCodecBuffers(pOMXComponent, INPUT_PORT_INDEX, MFC_INPUT_BUFFER_NUM_MAX);
833 if (ret != OMX_ErrorNone)
834 goto EXIT;
835 } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
836 /* Register input buffer */
837 for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
838 ExynosVideoPlane plane;
839 plane.addr = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
840 plane.allocSize = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen;
841 plane.fd = pExynosInputPort->extendBufferHeader[i].buf_fd[0];
842 if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
843 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
844 ret = OMX_ErrorInsufficientResources;
845 goto EXIT;
846 }
847 }
848 }
849
850 /* set output geometry */
851 Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
852 pMpeg4Dec->hMFCMpeg4Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
853 if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
854 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
855 ret = OMX_ErrorInsufficientResources;
856 goto EXIT;
857 }
858
859 /* input buffer enqueue for header parsing */
860 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize);
861 if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
862 (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) {
863 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing");
864 // ret = OMX_ErrorInsufficientResources;
865 ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit;
866 goto EXIT;
867 }
868
869 /* start header parsing */
870 if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
871 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing");
872 ret = OMX_ErrorCodecInit;
873 goto EXIT;
874 }
875
876 /* get geometry for output */
877 Exynos_OSAL_Memset(&pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry));
878 if (pOutbufOps->Get_Geometry(hMFCHandle, &pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf) != VIDEO_ERROR_NONE) {
879 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info");
880 ret = OMX_ErrorInsufficientResources;
881 goto EXIT;
882 }
883
884 /* get dpb count */
885 pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle);
886 if (pVideoDec->bThumbnailMode == OMX_FALSE)
887 pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum += EXTRA_DPB_NUM;
888 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Mpeg4CodecSetup nOutbufs: %d", pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum);
889
890 pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_TRUE;
891
892 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
893 if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth) ||
894 (pExynosInputPort->portDefinition.format.video.nFrameHeight != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight)) {
895 pExynosInputPort->portDefinition.format.video.nFrameWidth = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth;
896 pExynosInputPort->portDefinition.format.video.nFrameHeight = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight;
897 pExynosInputPort->portDefinition.format.video.nStride = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
898 pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
899
900 Exynos_UpdateFrameSize(pOMXComponent);
901 pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
902
903 /** Send Port Settings changed call back **/
904 (*(pExynosComponent->pCallbacks->EventHandler))
905 (pOMXComponent,
906 pExynosComponent->callbackData,
907 OMX_EventPortSettingsChanged, /* The command was completed */
908 OMX_DirOutput, /* This is the port index */
909 0,
910 NULL);
911 }
912 } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
913 if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth) ||
914 (pExynosInputPort->portDefinition.format.video.nFrameHeight != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight) ||
915 (pExynosOutputPort->portDefinition.nBufferCountActual != pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum)) {
916 pExynosInputPort->portDefinition.format.video.nFrameWidth = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth;
917 pExynosInputPort->portDefinition.format.video.nFrameHeight = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight;
918 pExynosInputPort->portDefinition.format.video.nStride = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
919 pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
920
921 pExynosOutputPort->portDefinition.nBufferCountActual = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum;
922 pExynosOutputPort->portDefinition.nBufferCountMin = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum;
923
924 Exynos_UpdateFrameSize(pOMXComponent);
925 pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
926
927 /** Send Port Settings changed call back **/
928 (*(pExynosComponent->pCallbacks->EventHandler))
929 (pOMXComponent,
930 pExynosComponent->callbackData,
931 OMX_EventPortSettingsChanged, /* The command was completed */
932 OMX_DirOutput, /* This is the port index */
933 0,
934 NULL);
935 }
936 }
937 Exynos_OSAL_SleepMillisec(0);
938 ret = OMX_ErrorInputDataDecodeYet;
939 Mpeg4CodecStop(pOMXComponent, INPUT_PORT_INDEX);
940
941 EXIT:
942 FunctionOut();
943
944 return ret;
945 }
946
947 OMX_ERRORTYPE Mpeg4CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
948 {
949 OMX_ERRORTYPE ret = OMX_ErrorNone;
950 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
951 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
952 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
953 void *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
954 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
955 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
956
957 ExynosVideoDecOps *pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
958 ExynosVideoDecBufferOps *pInbufOps = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
959 ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
960
961 int i, nOutbufs;
962
963 FunctionIn();
964
965 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
966 /* BUFFER_COPY case, get dpb count */
967 nOutbufs = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum;
968
969 /* should be done before prepare output buffer */
970 if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
971 ret = OMX_ErrorInsufficientResources;
972 goto EXIT;
973 }
974 } else {
975 /*BUFFER_SHERE case, get dpb count */
976 nOutbufs = pExynosOutputPort->portDefinition.nBufferCountActual;
977 }
978
979 if (pOutbufOps->Enable_DynamicDPB(hMFCHandle) != VIDEO_ERROR_NONE) {
980 ret = OMX_ErrorUndefined;
981 goto EXIT;
982 }
983
984 pOutbufOps->Set_Shareable(hMFCHandle);
985 if (pOutbufOps->Setup(hMFCHandle, MAX_OUTPUTBUFFER_NUM_DYNAMIC) != VIDEO_ERROR_NONE) {
986 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
987 ret = OMX_ErrorInsufficientResources;
988 goto EXIT;
989 }
990
991 ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
992 OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
993 OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
994 int plane;
995
996 nAllocLen[0] = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth,
997 pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight);
998 nAllocLen[1] = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth,
999 pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight >> 1);
1000
1001 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1002 ret = Exynos_Allocate_CodecBuffers(pOMXComponent, OUTPUT_PORT_INDEX, nOutbufs, nAllocLen);
1003 if (ret != OMX_ErrorNone)
1004 goto EXIT;
1005
1006 for (i = 0; i < nOutbufs; i++) {
1007 /* Enqueue output buffer */
1008 pOutbufOps->ExtensionEnqueue(hMFCHandle,
1009 (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
1010 (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->fd,
1011 (unsigned int *)pVideoDec->pMFCDecOutputBuffer[i]->bufferSize,
1012 (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
1013 }
1014
1015 if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
1016 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
1017 ret = OMX_ErrorInsufficientResources;
1018 goto EXIT;
1019 }
1020 } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
1021 /*************/
1022 /* TBD */
1023 /*************/
1024 #ifdef USE_ANB
1025 if ((pExynosOutputPort->bIsANBEnabled == OMX_FALSE) &&
1026 (pExynosOutputPort->bStoreMetaData == OMX_FALSE)) {
1027 ret = OMX_ErrorNotImplemented;
1028 goto EXIT;
1029 }
1030 #else
1031 ret = OMX_ErrorNotImplemented;
1032 goto EXIT;
1033 #endif
1034 }
1035
1036 pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_TRUE;
1037
1038 ret = OMX_ErrorNone;
1039
1040 EXIT:
1041 FunctionOut();
1042
1043 return ret;
1044 }
1045
1046 OMX_ERRORTYPE Exynos_Mpeg4Dec_GetParameter(
1047 OMX_IN OMX_HANDLETYPE hComponent,
1048 OMX_IN OMX_INDEXTYPE nParamIndex,
1049 OMX_INOUT OMX_PTR pComponentParameterStructure)
1050 {
1051 OMX_ERRORTYPE ret = OMX_ErrorNone;
1052 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1053 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1054
1055 FunctionIn();
1056
1057 if (hComponent == NULL || pComponentParameterStructure == NULL) {
1058 ret = OMX_ErrorBadParameter;
1059 goto EXIT;
1060 }
1061 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1062 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1063 if (ret != OMX_ErrorNone) {
1064 goto EXIT;
1065 }
1066 if (pOMXComponent->pComponentPrivate == NULL) {
1067 ret = OMX_ErrorBadParameter;
1068 goto EXIT;
1069 }
1070
1071 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1072 if (pExynosComponent->currentState == OMX_StateInvalid ) {
1073 ret = OMX_ErrorInvalidState;
1074 goto EXIT;
1075 }
1076
1077 switch (nParamIndex) {
1078 case OMX_IndexParamVideoMpeg4:
1079 {
1080 OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Param = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
1081 OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Param = NULL;
1082 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = NULL;
1083
1084 ret = Exynos_OMX_Check_SizeVersion(pDstMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
1085 if (ret != OMX_ErrorNone) {
1086 goto EXIT;
1087 }
1088
1089 if (pDstMpeg4Param->nPortIndex >= ALL_PORT_NUM) {
1090 ret = OMX_ErrorBadPortIndex;
1091 goto EXIT;
1092 }
1093
1094 pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1095 pSrcMpeg4Param = &pMpeg4Dec->mpeg4Component[pDstMpeg4Param->nPortIndex];
1096
1097 Exynos_OSAL_Memcpy(pDstMpeg4Param, pSrcMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
1098 }
1099 break;
1100 case OMX_IndexParamVideoH263:
1101 {
1102 OMX_VIDEO_PARAM_H263TYPE *pDstH263Param = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
1103 OMX_VIDEO_PARAM_H263TYPE *pSrcH263Param = NULL;
1104 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = NULL;
1105
1106 ret = Exynos_OMX_Check_SizeVersion(pDstH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
1107 if (ret != OMX_ErrorNone) {
1108 goto EXIT;
1109 }
1110
1111 if (pDstH263Param->nPortIndex >= ALL_PORT_NUM) {
1112 ret = OMX_ErrorBadPortIndex;
1113 goto EXIT;
1114 }
1115
1116 pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1117 pSrcH263Param = &pMpeg4Dec->h263Component[pDstH263Param->nPortIndex];
1118
1119 Exynos_OSAL_Memcpy(pDstH263Param, pSrcH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
1120 }
1121 break;
1122 case OMX_IndexParamStandardComponentRole:
1123 {
1124 OMX_S32 codecType;
1125 OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
1126
1127 ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
1128 if (ret != OMX_ErrorNone) {
1129 goto EXIT;
1130 }
1131
1132 codecType = ((EXYNOS_MPEG4DEC_HANDLE *)(((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
1133 if (codecType == CODEC_TYPE_MPEG4)
1134 Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE);
1135 else
1136 Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_DEC_ROLE);
1137 }
1138 break;
1139 case OMX_IndexParamVideoProfileLevelQuerySupported:
1140 {
1141 OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
1142 EXYNOS_OMX_VIDEO_PROFILELEVEL *pProfileLevel = NULL;
1143 OMX_U32 maxProfileLevelNum = 0;
1144 OMX_S32 codecType;
1145
1146 ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
1147 if (ret != OMX_ErrorNone) {
1148 goto EXIT;
1149 }
1150
1151 if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
1152 ret = OMX_ErrorBadPortIndex;
1153 goto EXIT;
1154 }
1155
1156 codecType = ((EXYNOS_MPEG4DEC_HANDLE *)(((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
1157 if (codecType == CODEC_TYPE_MPEG4) {
1158 pProfileLevel = supportedMPEG4ProfileLevels;
1159 maxProfileLevelNum = sizeof(supportedMPEG4ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
1160 } else {
1161 pProfileLevel = supportedH263ProfileLevels;
1162 maxProfileLevelNum = sizeof(supportedH263ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
1163 }
1164
1165 if (pDstProfileLevel->nProfileIndex >= maxProfileLevelNum) {
1166 ret = OMX_ErrorNoMore;
1167 goto EXIT;
1168 }
1169
1170 pProfileLevel += pDstProfileLevel->nProfileIndex;
1171 pDstProfileLevel->eProfile = pProfileLevel->profile;
1172 pDstProfileLevel->eLevel = pProfileLevel->level;
1173 }
1174 break;
1175 case OMX_IndexParamVideoProfileLevelCurrent:
1176 {
1177 OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
1178 OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Param = NULL;
1179 OMX_VIDEO_PARAM_H263TYPE *pSrcH263Param = NULL;
1180 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = NULL;
1181 OMX_S32 codecType;
1182
1183 ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
1184 if (ret != OMX_ErrorNone) {
1185 goto EXIT;
1186 }
1187
1188 if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
1189 ret = OMX_ErrorBadPortIndex;
1190 goto EXIT;
1191 }
1192
1193 pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1194 codecType = pMpeg4Dec->hMFCMpeg4Handle.codecType;
1195 if (codecType == CODEC_TYPE_MPEG4) {
1196 pSrcMpeg4Param = &pMpeg4Dec->mpeg4Component[pDstProfileLevel->nPortIndex];
1197 pDstProfileLevel->eProfile = pSrcMpeg4Param->eProfile;
1198 pDstProfileLevel->eLevel = pSrcMpeg4Param->eLevel;
1199 } else {
1200 pSrcH263Param = &pMpeg4Dec->h263Component[pDstProfileLevel->nPortIndex];
1201 pDstProfileLevel->eProfile = pSrcH263Param->eProfile;
1202 pDstProfileLevel->eLevel = pSrcH263Param->eLevel;
1203 }
1204 }
1205 break;
1206 case OMX_IndexParamVideoErrorCorrection:
1207 {
1208 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
1209 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
1210 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = NULL;
1211
1212 ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
1213 if (ret != OMX_ErrorNone) {
1214 goto EXIT;
1215 }
1216
1217 if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
1218 ret = OMX_ErrorBadPortIndex;
1219 goto EXIT;
1220 }
1221
1222 pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1223 pSrcErrorCorrectionType = &pMpeg4Dec->errorCorrectionType[INPUT_PORT_INDEX];
1224
1225 pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
1226 pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
1227 pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
1228 pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
1229 pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
1230 }
1231 break;
1232 default:
1233 ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
1234 break;
1235 }
1236 EXIT:
1237 FunctionOut();
1238
1239 return ret;
1240 }
1241
1242 OMX_ERRORTYPE Exynos_Mpeg4Dec_SetParameter(
1243 OMX_IN OMX_HANDLETYPE hComponent,
1244 OMX_IN OMX_INDEXTYPE nIndex,
1245 OMX_IN OMX_PTR pComponentParameterStructure)
1246 {
1247 OMX_ERRORTYPE ret = OMX_ErrorNone;
1248 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1249 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1250
1251 FunctionIn();
1252
1253 if (hComponent == NULL || pComponentParameterStructure == NULL) {
1254 ret = OMX_ErrorBadParameter;
1255 goto EXIT;
1256 }
1257 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1258 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1259 if (ret != OMX_ErrorNone) {
1260 goto EXIT;
1261 }
1262 if (pOMXComponent->pComponentPrivate == NULL) {
1263 ret = OMX_ErrorBadParameter;
1264 goto EXIT;
1265 }
1266
1267 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1268 if (pExynosComponent->currentState == OMX_StateInvalid ) {
1269 ret = OMX_ErrorInvalidState;
1270 goto EXIT;
1271 }
1272
1273 switch (nIndex) {
1274 case OMX_IndexParamVideoMpeg4:
1275 {
1276 OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Param = NULL;
1277 OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Param = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
1278 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = NULL;
1279
1280 ret = Exynos_OMX_Check_SizeVersion(pSrcMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
1281 if (ret != OMX_ErrorNone) {
1282 goto EXIT;
1283 }
1284
1285 if (pSrcMpeg4Param->nPortIndex >= ALL_PORT_NUM) {
1286 ret = OMX_ErrorBadPortIndex;
1287 goto EXIT;
1288 }
1289
1290 pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1291 pDstMpeg4Param = &pMpeg4Dec->mpeg4Component[pSrcMpeg4Param->nPortIndex];
1292
1293 Exynos_OSAL_Memcpy(pDstMpeg4Param, pSrcMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
1294 }
1295 break;
1296 case OMX_IndexParamVideoH263:
1297 {
1298 OMX_VIDEO_PARAM_H263TYPE *pDstH263Param = NULL;
1299 OMX_VIDEO_PARAM_H263TYPE *pSrcH263Param = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
1300 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = NULL;
1301
1302 ret = Exynos_OMX_Check_SizeVersion(pSrcH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
1303 if (ret != OMX_ErrorNone) {
1304 goto EXIT;
1305 }
1306
1307 if (pSrcH263Param->nPortIndex >= ALL_PORT_NUM) {
1308 ret = OMX_ErrorBadPortIndex;
1309 goto EXIT;
1310 }
1311
1312 pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1313 pDstH263Param = &pMpeg4Dec->h263Component[pSrcH263Param->nPortIndex];
1314
1315 Exynos_OSAL_Memcpy(pDstH263Param, pSrcH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
1316 }
1317 break;
1318 case OMX_IndexParamStandardComponentRole:
1319 {
1320 OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
1321
1322 ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
1323 if (ret != OMX_ErrorNone) {
1324 goto EXIT;
1325 }
1326
1327 if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1328 ret = OMX_ErrorIncorrectStateOperation;
1329 goto EXIT;
1330 }
1331
1332 if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE)) {
1333 pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
1334 } else if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_DEC_ROLE)) {
1335 pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
1336 } else {
1337 ret = OMX_ErrorBadParameter;
1338 goto EXIT;
1339 }
1340 }
1341 break;
1342 case OMX_IndexParamVideoProfileLevelCurrent:
1343 {
1344 OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
1345 OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Param = NULL;
1346 OMX_VIDEO_PARAM_H263TYPE *pDstH263Param = NULL;
1347 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = NULL;
1348 OMX_S32 codecType;
1349
1350 ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
1351 if (ret != OMX_ErrorNone)
1352 goto EXIT;
1353
1354 if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) {
1355 ret = OMX_ErrorBadPortIndex;
1356 goto EXIT;
1357 }
1358
1359 pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1360 codecType = pMpeg4Dec->hMFCMpeg4Handle.codecType;
1361 if (codecType == CODEC_TYPE_MPEG4) {
1362 /*
1363 * To do: Check validity of profile & level parameters
1364 */
1365
1366 pDstMpeg4Param = &pMpeg4Dec->mpeg4Component[pSrcProfileLevel->nPortIndex];
1367 pDstMpeg4Param->eProfile = pSrcProfileLevel->eProfile;
1368 pDstMpeg4Param->eLevel = pSrcProfileLevel->eLevel;
1369 } else {
1370 /*
1371 * To do: Check validity of profile & level parameters
1372 */
1373
1374 pDstH263Param = &pMpeg4Dec->h263Component[pSrcProfileLevel->nPortIndex];
1375 pDstH263Param->eProfile = pSrcProfileLevel->eProfile;
1376 pDstH263Param->eLevel = pSrcProfileLevel->eLevel;
1377 }
1378 }
1379 break;
1380 case OMX_IndexParamVideoErrorCorrection:
1381 {
1382 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
1383 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
1384 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = NULL;
1385
1386 ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
1387 if (ret != OMX_ErrorNone) {
1388 goto EXIT;
1389 }
1390
1391 if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
1392 ret = OMX_ErrorBadPortIndex;
1393 goto EXIT;
1394 }
1395
1396 pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1397 pDstErrorCorrectionType = &pMpeg4Dec->errorCorrectionType[INPUT_PORT_INDEX];
1398
1399 pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
1400 pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
1401 pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
1402 pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
1403 pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
1404 }
1405 break;
1406 default:
1407 ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
1408 break;
1409 }
1410 EXIT:
1411 FunctionOut();
1412
1413 return ret;
1414 }
1415
1416 OMX_ERRORTYPE Exynos_Mpeg4Dec_GetConfig(
1417 OMX_IN OMX_HANDLETYPE hComponent,
1418 OMX_IN OMX_INDEXTYPE nIndex,
1419 OMX_IN OMX_PTR pComponentConfigStructure)
1420 {
1421 OMX_ERRORTYPE ret = OMX_ErrorNone;
1422 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1423 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1424
1425 FunctionIn();
1426
1427 if (hComponent == NULL || pComponentConfigStructure == NULL) {
1428 ret = OMX_ErrorBadParameter;
1429 goto EXIT;
1430 }
1431 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1432 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1433 if (ret != OMX_ErrorNone) {
1434 goto EXIT;
1435 }
1436 if (pOMXComponent->pComponentPrivate == NULL) {
1437 ret = OMX_ErrorBadParameter;
1438 goto EXIT;
1439 }
1440 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1441 if (pExynosComponent->currentState == OMX_StateInvalid) {
1442 ret = OMX_ErrorInvalidState;
1443 goto EXIT;
1444 }
1445
1446 switch (nIndex) {
1447 default:
1448 ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
1449 break;
1450 }
1451
1452 EXIT:
1453 FunctionOut();
1454
1455 return ret;
1456 }
1457
1458 OMX_ERRORTYPE Exynos_Mpeg4Dec_SetConfig(
1459 OMX_IN OMX_HANDLETYPE hComponent,
1460 OMX_IN OMX_INDEXTYPE nIndex,
1461 OMX_IN OMX_PTR pComponentConfigStructure)
1462 {
1463 OMX_ERRORTYPE ret = OMX_ErrorNone;
1464 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1465 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1466
1467 FunctionIn();
1468
1469 if (hComponent == NULL || pComponentConfigStructure == NULL) {
1470 ret = OMX_ErrorBadParameter;
1471 goto EXIT;
1472 }
1473 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1474 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1475 if (ret != OMX_ErrorNone) {
1476 goto EXIT;
1477 }
1478 if (pOMXComponent->pComponentPrivate == NULL) {
1479 ret = OMX_ErrorBadParameter;
1480 goto EXIT;
1481 }
1482 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1483 if (pExynosComponent->currentState == OMX_StateInvalid) {
1484 ret = OMX_ErrorInvalidState;
1485 goto EXIT;
1486 }
1487
1488 switch (nIndex) {
1489 default:
1490 ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
1491 break;
1492 }
1493
1494 EXIT:
1495 FunctionOut();
1496
1497 return ret;
1498 }
1499
1500 OMX_ERRORTYPE Exynos_Mpeg4Dec_GetExtensionIndex(
1501 OMX_IN OMX_HANDLETYPE hComponent,
1502 OMX_IN OMX_STRING cParameterName,
1503 OMX_OUT OMX_INDEXTYPE *pIndexType)
1504 {
1505 OMX_ERRORTYPE ret = OMX_ErrorNone;
1506 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1507 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1508
1509 FunctionIn();
1510
1511 if (hComponent == NULL) {
1512 ret = OMX_ErrorBadParameter;
1513 goto EXIT;
1514 }
1515 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1516 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1517 if (ret != OMX_ErrorNone) {
1518 goto EXIT;
1519 }
1520 if (pOMXComponent->pComponentPrivate == NULL) {
1521 ret = OMX_ErrorBadParameter;
1522 goto EXIT;
1523 }
1524 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1525 if ((cParameterName == NULL) || (pIndexType == NULL)) {
1526 ret = OMX_ErrorBadParameter;
1527 goto EXIT;
1528 }
1529 if (pExynosComponent->currentState == OMX_StateInvalid) {
1530 ret = OMX_ErrorInvalidState;
1531 goto EXIT;
1532 }
1533
1534 ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
1535
1536 EXIT:
1537 FunctionOut();
1538
1539 return ret;
1540 }
1541
1542 OMX_ERRORTYPE Exynos_Mpeg4Dec_ComponentRoleEnum(
1543 OMX_IN OMX_HANDLETYPE hComponent,
1544 OMX_OUT OMX_U8 *cRole,
1545 OMX_IN OMX_U32 nIndex)
1546 {
1547 OMX_ERRORTYPE ret = OMX_ErrorNone;
1548 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1549 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1550 OMX_S32 codecType;
1551
1552 FunctionIn();
1553
1554 if ((hComponent == NULL) || (cRole == NULL)) {
1555 ret = OMX_ErrorBadParameter;
1556 goto EXIT;
1557 }
1558 if (nIndex != (MAX_COMPONENT_ROLE_NUM - 1)) {
1559 ret = OMX_ErrorNoMore;
1560 goto EXIT;
1561 }
1562 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1563 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1564 if (ret != OMX_ErrorNone) {
1565 goto EXIT;
1566 }
1567 if (pOMXComponent->pComponentPrivate == NULL) {
1568 ret = OMX_ErrorBadParameter;
1569 goto EXIT;
1570 }
1571 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1572 if (pExynosComponent->currentState == OMX_StateInvalid ) {
1573 ret = OMX_ErrorInvalidState;
1574 goto EXIT;
1575 }
1576
1577 codecType = ((EXYNOS_MPEG4DEC_HANDLE *)(((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
1578 if (codecType == CODEC_TYPE_MPEG4)
1579 Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE);
1580 else
1581 Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_H263_DEC_ROLE);
1582
1583 EXIT:
1584 FunctionOut();
1585
1586 return ret;
1587 }
1588
1589 /* MFC Init */
1590 OMX_ERRORTYPE Exynos_Mpeg4Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
1591 {
1592 OMX_ERRORTYPE ret = OMX_ErrorNone;
1593 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1594 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1595 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1596 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1597 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
1598 OMX_PTR hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
1599
1600 ExynosVideoDecOps *pDecOps = NULL;
1601 ExynosVideoDecBufferOps *pInbufOps = NULL;
1602 ExynosVideoDecBufferOps *pOutbufOps = NULL;
1603
1604 CSC_METHOD csc_method = CSC_METHOD_SW;
1605 int i, plane;
1606
1607 FunctionIn();
1608
1609 pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_FALSE;
1610 pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_FALSE;
1611 pExynosComponent->bUseFlagEOF = OMX_TRUE;
1612 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
1613 pExynosComponent->bBehaviorEOS = OMX_FALSE;
1614
1615 /* H.264 Codec Open */
1616 ret = Mpeg4CodecOpen(pMpeg4Dec);
1617 if (ret != OMX_ErrorNone) {
1618 goto EXIT;
1619 }
1620
1621 pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
1622 pInbufOps = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
1623 pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
1624
1625 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1626 OMX_U32 nPlaneSize[MFC_INPUT_BUFFER_PLANE] = {DEFAULT_MFC_INPUT_BUFFER_SIZE};
1627 Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
1628 Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
1629 ret = Exynos_Allocate_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX, MFC_INPUT_BUFFER_NUM_MAX, nPlaneSize);
1630 if (ret != OMX_ErrorNone)
1631 goto EXIT;
1632
1633 for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++)
1634 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
1635 } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
1636 /*************/
1637 /* TBD */
1638 /*************/
1639 /* Does not require any actions. */
1640 }
1641
1642 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1643 Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
1644 Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
1645 } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
1646 /*************/
1647 /* TBD */
1648 /*************/
1649 /* Does not require any actions. */
1650 }
1651
1652 pMpeg4Dec->bSourceStart = OMX_FALSE;
1653 Exynos_OSAL_SignalCreate(&pMpeg4Dec->hSourceStartEvent);
1654 pMpeg4Dec->bDestinationStart = OMX_FALSE;
1655 Exynos_OSAL_SignalCreate(&pMpeg4Dec->hDestinationStartEvent);
1656
1657 Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
1658 Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
1659 pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp = 0;
1660 pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp = 0;
1661
1662 pExynosComponent->getAllDelayBuffer = OMX_FALSE;
1663
1664 #if 0//defined(USE_CSC_GSCALER)
1665 csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
1666 #endif
1667 pVideoDec->csc_handle = csc_init(csc_method);
1668 if (pVideoDec->csc_handle == NULL) {
1669 ret = OMX_ErrorInsufficientResources;
1670 goto EXIT;
1671 }
1672 pVideoDec->csc_set_format = OMX_FALSE;
1673
1674 EXIT:
1675 FunctionOut();
1676
1677 return ret;
1678 }
1679
1680 /* MFC Terminate */
1681 OMX_ERRORTYPE Exynos_Mpeg4Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
1682 {
1683 OMX_ERRORTYPE ret = OMX_ErrorNone;
1684 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1685 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1686 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1687 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1688 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1689 OMX_PTR hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
1690
1691 ExynosVideoDecOps *pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
1692 ExynosVideoDecBufferOps *pInbufOps = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
1693 ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
1694
1695 int i, plane;
1696
1697 FunctionIn();
1698
1699 if (pVideoDec->csc_handle != NULL) {
1700 csc_deinit(pVideoDec->csc_handle);
1701 pVideoDec->csc_handle = NULL;
1702 }
1703
1704 Exynos_OSAL_SignalTerminate(pMpeg4Dec->hDestinationStartEvent);
1705 pMpeg4Dec->hDestinationStartEvent = NULL;
1706 pMpeg4Dec->bDestinationStart = OMX_FALSE;
1707 Exynos_OSAL_SignalTerminate(pMpeg4Dec->hSourceStartEvent);
1708 pMpeg4Dec->hSourceStartEvent = NULL;
1709 pMpeg4Dec->bSourceStart = OMX_FALSE;
1710
1711 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1712 Exynos_Free_CodecBuffers(pOMXComponent, OUTPUT_PORT_INDEX);
1713 Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
1714 Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
1715 } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
1716 /*************/
1717 /* TBD */
1718 /*************/
1719 /* Does not require any actions. */
1720 }
1721
1722 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1723 Exynos_Free_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX);
1724 Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
1725 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
1726 } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
1727 /*************/
1728 /* TBD */
1729 /*************/
1730 /* Does not require any actions. */
1731 }
1732 Mpeg4CodecClose(pMpeg4Dec);
1733
1734 Exynos_ResetAllPortConfig(pOMXComponent);
1735
1736 EXIT:
1737 FunctionOut();
1738
1739 return ret;
1740 }
1741
1742 OMX_ERRORTYPE Exynos_Mpeg4Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
1743 {
1744 OMX_ERRORTYPE ret = OMX_ErrorNone;
1745 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1746 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1747 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1748 void *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
1749 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1750 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1751 OMX_U32 oneFrameSize = pSrcInputData->dataLen;
1752 ExynosVideoDecOps *pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
1753 ExynosVideoDecBufferOps *pInbufOps = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
1754 ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
1755 ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
1756 int i;
1757
1758 FunctionIn();
1759
1760 if (pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc == OMX_FALSE) {
1761 ret = Mpeg4CodecSrcSetup(pOMXComponent, pSrcInputData);
1762 goto EXIT;
1763 }
1764 if (pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_FALSE) {
1765 ret = Mpeg4CodecDstSetup(pOMXComponent);
1766 }
1767
1768 if ((Check_Stream_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize, pMpeg4Dec->hMFCMpeg4Handle.codecType) == OMX_TRUE) ||
1769 ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
1770 pExynosComponent->timeStamp[pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->timeStamp;
1771 pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->nFlags;
1772 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp, pSrcInputData->nFlags);
1773 pDecOps->Set_FrameTag(hMFCHandle, pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp);
1774 pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp++;
1775 pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp %= MAX_TIMESTAMP;
1776
1777 /* queue work for input buffer */
1778 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer);
1779 codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
1780 (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
1781 if (codecReturn != VIDEO_ERROR_NONE) {
1782 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
1783 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
1784 goto EXIT;
1785 }
1786 Mpeg4CodecStart(pOMXComponent, INPUT_PORT_INDEX);
1787 if (pMpeg4Dec->bSourceStart == OMX_FALSE) {
1788 pMpeg4Dec->bSourceStart = OMX_TRUE;
1789 Exynos_OSAL_SignalSet(pMpeg4Dec->hSourceStartEvent);
1790 Exynos_OSAL_SleepMillisec(0);
1791 }
1792 if (pMpeg4Dec->bDestinationStart == OMX_FALSE) {
1793 pMpeg4Dec->bDestinationStart = OMX_TRUE;
1794 Exynos_OSAL_SignalSet(pMpeg4Dec->hDestinationStartEvent);
1795 Exynos_OSAL_SleepMillisec(0);
1796 }
1797 }
1798
1799 ret = OMX_ErrorNone;
1800
1801 EXIT:
1802 FunctionOut();
1803
1804 return ret;
1805 }
1806
1807 OMX_ERRORTYPE Exynos_Mpeg4Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
1808 {
1809 OMX_ERRORTYPE ret = OMX_ErrorNone;
1810 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1811 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1812 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1813 void *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
1814 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1815 ExynosVideoDecOps *pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
1816 ExynosVideoDecBufferOps *pInbufOps = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
1817 ExynosVideoBuffer *pVideoBuffer;
1818
1819 FunctionIn();
1820
1821 pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
1822
1823 pSrcOutputData->dataLen = 0;
1824 pSrcOutputData->usedDataLen = 0;
1825 pSrcOutputData->remainDataLen = 0;
1826 pSrcOutputData->nFlags = 0;
1827 pSrcOutputData->timeStamp = 0;
1828
1829 if (pVideoBuffer == NULL) {
1830 pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
1831 pSrcOutputData->allocSize = 0;
1832 pSrcOutputData->pPrivate = NULL;
1833 pSrcOutputData->bufferHeader = NULL;
1834 } else {
1835 pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
1836 pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
1837 pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize;
1838
1839 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1840 int i = 0;
1841 while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
1842 if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
1843 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
1844 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
1845 goto EXIT;
1846 }
1847 i++;
1848 }
1849 pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
1850 pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
1851 }
1852
1853 /* For Share Buffer */
1854 pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
1855 }
1856
1857 ret = OMX_ErrorNone;
1858
1859 EXIT:
1860 FunctionOut();
1861
1862 return ret;
1863 }
1864
1865 OMX_ERRORTYPE Exynos_Mpeg4Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
1866 {
1867 OMX_ERRORTYPE ret = OMX_ErrorNone;
1868 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1869 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1870 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1871 void *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
1872 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1873 ExynosVideoDecOps *pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
1874 ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
1875 OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
1876 ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
1877
1878 FunctionIn();
1879
1880 if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
1881 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
1882 ret = OMX_ErrorBadParameter;
1883 goto EXIT;
1884 }
1885
1886 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x, FD[0]:%d, FD[1]:%d", __FUNCTION__, __LINE__,
1887 pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
1888 pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1],
1889 pDstInputData->buffer.multiPlaneBuffer.fd[0],
1890 pDstInputData->buffer.multiPlaneBuffer.fd[1]);
1891
1892 OMX_U32 nAllocLen[VIDEO_BUFFER_MAX_PLANES] = {0, 0, 0};
1893 nAllocLen[0] = pExynosOutputPort->portDefinition.format.video.nFrameWidth * pExynosOutputPort->portDefinition.format.video.nFrameHeight;
1894 nAllocLen[1] = pExynosOutputPort->portDefinition.format.video.nFrameWidth * pExynosOutputPort->portDefinition.format.video.nFrameHeight / 2;
1895
1896 codecReturn = pOutbufOps->ExtensionEnqueue(hMFCHandle,
1897 (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
1898 (unsigned int **)pDstInputData->buffer.multiPlaneBuffer.fd,
1899 (unsigned int *)nAllocLen, (unsigned int *)dataLen,
1900 MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
1901 if (codecReturn != VIDEO_ERROR_NONE) {
1902 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
1903 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
1904 goto EXIT;
1905 }
1906 Mpeg4CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
1907
1908 ret = OMX_ErrorNone;
1909
1910 EXIT:
1911 FunctionOut();
1912
1913 return ret;
1914 }
1915
1916 OMX_ERRORTYPE Exynos_Mpeg4Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
1917 {
1918 OMX_ERRORTYPE ret = OMX_ErrorNone;
1919 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1920 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1921 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
1922 void *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
1923 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1924 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1925 ExynosVideoDecOps *pDecOps = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
1926 ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
1927 ExynosVideoBuffer *pVideoBuffer;
1928 ExynosVideoBuffer videoBuffer;
1929 ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
1930 ExynosVideoGeometry *bufferGeometry;
1931 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
1932 OMX_S32 indexTimestamp = 0;
1933 int plane;
1934
1935 FunctionIn();
1936
1937 if (pMpeg4Dec->bDestinationStart == OMX_FALSE) {
1938 ret = OMX_ErrorNone;
1939 goto EXIT;
1940 }
1941
1942 while (1) {
1943 Exynos_OSAL_Memset(&videoBuffer, 0, sizeof(ExynosVideoBuffer));
1944 if (pOutbufOps->ExtensionDequeue(hMFCHandle, &videoBuffer) == VIDEO_ERROR_NONE) {
1945 pVideoBuffer = &videoBuffer;
1946 } else {
1947 pVideoBuffer = NULL;
1948 ret = OMX_ErrorNone;
1949 goto EXIT;
1950 }
1951 displayStatus = pVideoBuffer->displayStatus;
1952 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
1953
1954 if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
1955 (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
1956 (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
1957 (displayStatus == VIDEO_FRAME_STATUS_DECODING_FINISHED) ||
1958 (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
1959 if (pVideoBuffer != NULL) {
1960 ret = OMX_ErrorNone;
1961 break;
1962 } else {
1963 ret = OMX_ErrorUndefined;
1964 break;
1965 }
1966 }
1967 }
1968
1969 if (ret != OMX_ErrorNone)
1970 goto EXIT;
1971
1972 pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp++;
1973 pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
1974
1975 pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
1976 for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
1977 pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
1978 pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
1979 pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
1980 pDstOutputData->dataLen += pVideoBuffer->planes[plane].dataSize;
1981 }
1982 pDstOutputData->usedDataLen = 0;
1983 pDstOutputData->pPrivate = pVideoBuffer;
1984 if (pExynosOutputPort->bufferProcessType & BUFFER_COPY) {
1985 int i = 0;
1986 pDstOutputData->pPrivate = NULL;
1987 for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
1988 if (pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[0] ==
1989 pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[0]) {
1990 pDstOutputData->pPrivate = pVideoDec->pMFCDecOutputBuffer[i];
1991 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x, FD[0]:%d, FD[1]:%d", __FUNCTION__, __LINE__,
1992 pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[0],
1993 pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[1],
1994 pVideoDec->pMFCDecOutputBuffer[i]->fd[0],
1995 pVideoDec->pMFCDecOutputBuffer[i]->fd[1]);
1996 break;
1997 }
1998 }
1999
2000 if (pDstOutputData->pPrivate == NULL) {
2001 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
2002 ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
2003 goto EXIT;
2004 }
2005 }
2006 /* For Share Buffer */
2007 pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
2008
2009 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
2010 bufferGeometry = &pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf;
2011 pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
2012 pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
2013 Exynos_OSAL_Memcpy(&pBufferInfo->PDSB, &pVideoBuffer->PDSB, sizeof(PrivateDataShareBuffer));
2014 switch (bufferGeometry->eColorFormat) {
2015 case VIDEO_COLORFORMAT_NV12:
2016 pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
2017 break;
2018 case VIDEO_COLORFORMAT_NV12_TILED:
2019 default:
2020 pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
2021 break;
2022 }
2023
2024 indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
2025 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
2026 if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
2027 if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) &&
2028 (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) {
2029 pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
2030 pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
2031 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
2032 } else {
2033 pDstOutputData->timeStamp = 0x00;
2034 pDstOutputData->nFlags = 0x00;
2035 }
2036 } else {
2037 /* For timestamp correction. if mfc support frametype detect */
2038 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
2039 #ifdef NEED_TIMESTAMP_REORDER
2040 if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
2041 pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
2042 pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
2043 pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp = indexTimestamp;
2044 } else {
2045 pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
2046 pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
2047 }
2048 #else
2049 pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
2050 pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
2051 #endif
2052 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData->timeStamp, pDstOutputData->timeStamp / 1E6, indexTimestamp, pDstOutputData->nFlags);
2053 }
2054
2055 if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
2056 (displayStatus == VIDEO_FRAME_STATUS_DECODING_FINISHED) ||
2057 ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
2058 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
2059 pDstOutputData->remainDataLen = 0;
2060 if (((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) &&
2061 (pExynosComponent->bBehaviorEOS == OMX_TRUE)) {
2062 pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
2063 pExynosComponent->bBehaviorEOS = OMX_FALSE;
2064 }
2065 } else {
2066 pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
2067 }
2068
2069 ret = OMX_ErrorNone;
2070
2071 EXIT:
2072 FunctionOut();
2073
2074 return ret;
2075 }
2076
2077 OMX_ERRORTYPE Exynos_Mpeg4Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
2078 {
2079 OMX_ERRORTYPE ret = OMX_ErrorNone;
2080 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2081 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2082 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2083
2084 FunctionIn();
2085
2086 if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
2087 ret = OMX_ErrorNone;
2088 goto EXIT;
2089 }
2090 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
2091 ret = OMX_ErrorNone;
2092 goto EXIT;
2093 }
2094
2095 ret = Exynos_Mpeg4Dec_SrcIn(pOMXComponent, pSrcInputData);
2096 if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) {
2097 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2098 pExynosComponent->callbackData,
2099 OMX_EventError, ret, 0, NULL);
2100 }
2101
2102 EXIT:
2103 FunctionOut();
2104
2105 return ret;
2106 }
2107
2108 OMX_ERRORTYPE Exynos_Mpeg4Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
2109 {
2110 OMX_ERRORTYPE ret = OMX_ErrorNone;
2111 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2112 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2113 EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2114
2115 FunctionIn();
2116
2117 if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
2118 ret = OMX_ErrorNone;
2119 goto EXIT;
2120 }
2121
2122 if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
2123 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
2124 ret = OMX_ErrorNone;
2125 goto EXIT;
2126 }
2127 }
2128 if ((pMpeg4Dec->bSourceStart == OMX_FALSE) &&
2129 (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
2130 Exynos_OSAL_SignalWait(pMpeg4Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME);
2131 Exynos_OSAL_SignalReset(pMpeg4Dec->hSourceStartEvent);
2132 }
2133
2134 ret = Exynos_Mpeg4Dec_SrcOut(pOMXComponent, pSrcOutputData);
2135 if ((ret != OMX_ErrorNone) &&
2136 (pExynosComponent->currentState == OMX_StateExecuting)) {
2137 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2138 pExynosComponent->callbackData,
2139 OMX_EventError, ret, 0, NULL);
2140 }
2141
2142 EXIT:
2143 FunctionOut();
2144
2145 return ret;
2146 }
2147
2148 OMX_ERRORTYPE Exynos_Mpeg4Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
2149 {
2150 OMX_ERRORTYPE ret = OMX_ErrorNone;
2151 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2152 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2153 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2154
2155 FunctionIn();
2156
2157 if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
2158 ret = OMX_ErrorNone;
2159 goto EXIT;
2160 }
2161 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
2162 ret = OMX_ErrorNone;
2163 goto EXIT;
2164 }
2165 if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
2166 if ((pMpeg4Dec->bDestinationStart == OMX_FALSE) &&
2167 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
2168 Exynos_OSAL_SignalWait(pMpeg4Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
2169 Exynos_OSAL_SignalReset(pMpeg4Dec->hDestinationStartEvent);
2170 }
2171 }
2172 if (pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_TRUE) {
2173 ret = Exynos_Mpeg4Dec_DstIn(pOMXComponent, pDstInputData);
2174 if (ret != OMX_ErrorNone) {
2175 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2176 pExynosComponent->callbackData,
2177 OMX_EventError, ret, 0, NULL);
2178 }
2179 }
2180
2181 EXIT:
2182 FunctionOut();
2183
2184 return ret;
2185 }
2186
2187 OMX_ERRORTYPE Exynos_Mpeg4Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
2188 {
2189 OMX_ERRORTYPE ret = OMX_ErrorNone;
2190 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2191 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
2192 EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2193
2194 FunctionIn();
2195
2196 if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
2197 ret = OMX_ErrorNone;
2198 goto EXIT;
2199 }
2200 if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
2201 ret = OMX_ErrorNone;
2202 goto EXIT;
2203 }
2204
2205 if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
2206 if ((pMpeg4Dec->bDestinationStart == OMX_FALSE) &&
2207 (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
2208 Exynos_OSAL_SignalWait(pMpeg4Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
2209 Exynos_OSAL_SignalReset(pMpeg4Dec->hDestinationStartEvent);
2210 }
2211 }
2212 ret = Exynos_Mpeg4Dec_DstOut(pOMXComponent, pDstOutputData);
2213 if ((ret != OMX_ErrorNone) &&
2214 (pExynosComponent->currentState == OMX_StateExecuting)) {
2215 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
2216 pExynosComponent->callbackData,
2217 OMX_EventError, ret, 0, NULL);
2218 }
2219
2220 EXIT:
2221 FunctionOut();
2222
2223 return ret;
2224 }
2225
2226 OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName)
2227 {
2228 OMX_ERRORTYPE ret = OMX_ErrorNone;
2229 OMX_COMPONENTTYPE *pOMXComponent = NULL;
2230 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
2231 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
2232 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
2233 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = NULL;
2234 int i = 0;
2235 OMX_S32 codecType = -1;
2236
2237 FunctionIn();
2238
2239 if ((hComponent == NULL) || (componentName == NULL)) {
2240 ret = OMX_ErrorBadParameter;
2241 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
2242 goto EXIT;
2243 }
2244 if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MPEG4_DEC, componentName) == 0) {
2245 codecType = CODEC_TYPE_MPEG4;
2246 } else if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H263_DEC, componentName) == 0) {
2247 codecType = CODEC_TYPE_H263;
2248 } else {
2249 ret = OMX_ErrorBadParameter;
2250 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
2251 goto EXIT;
2252 }
2253
2254 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
2255 ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent);
2256 if (ret != OMX_ErrorNone) {
2257 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
2258 goto EXIT;
2259 }
2260 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2261 pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
2262
2263 pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
2264 if (pExynosComponent->componentName == NULL) {
2265 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2266 ret = OMX_ErrorInsufficientResources;
2267 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
2268 goto EXIT;
2269 }
2270 Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
2271
2272 pMpeg4Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_MPEG4DEC_HANDLE));
2273 if (pMpeg4Dec == NULL) {
2274 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2275 ret = OMX_ErrorInsufficientResources;
2276 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
2277 goto EXIT;
2278 }
2279 Exynos_OSAL_Memset(pMpeg4Dec, 0, sizeof(EXYNOS_MPEG4DEC_HANDLE));
2280 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
2281 pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pMpeg4Dec;
2282 pMpeg4Dec->hMFCMpeg4Handle.codecType = codecType;
2283
2284 if (codecType == CODEC_TYPE_MPEG4)
2285 Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MPEG4_DEC);
2286 else
2287 Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H263_DEC);
2288
2289 /* Set componentVersion */
2290 pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
2291 pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
2292 pExynosComponent->componentVersion.s.nRevision = REVISION_NUMBER;
2293 pExynosComponent->componentVersion.s.nStep = STEP_NUMBER;
2294 /* Set specVersion */
2295 pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
2296 pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
2297 pExynosComponent->specVersion.s.nRevision = REVISION_NUMBER;
2298 pExynosComponent->specVersion.s.nStep = STEP_NUMBER;
2299
2300 /* Input port */
2301 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
2302 pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
2303 pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
2304 pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
2305 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
2306 pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
2307 if (codecType == CODEC_TYPE_MPEG4) {
2308 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
2309 Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2310 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/mpeg4");
2311 } else {
2312 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
2313 Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2314 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/h263");
2315 }
2316 pExynosPort->portDefinition.format.video.pNativeRender = 0;
2317 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
2318 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
2319 pExynosPort->portDefinition.bEnabled = OMX_TRUE;
2320 pExynosPort->bufferProcessType = BUFFER_SHARE;
2321 pExynosPort->portWayType = WAY2_PORT;
2322
2323 /* Output port */
2324 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
2325 pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
2326 pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
2327 pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
2328 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
2329 pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
2330 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
2331 Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
2332 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
2333 pExynosPort->portDefinition.format.video.pNativeRender = 0;
2334 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
2335 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
2336 pExynosPort->portDefinition.bEnabled = OMX_TRUE;
2337 pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE;
2338 pExynosPort->portWayType = WAY2_PORT;
2339
2340 if (codecType == CODEC_TYPE_MPEG4) {
2341 for(i = 0; i < ALL_PORT_NUM; i++) {
2342 INIT_SET_SIZE_VERSION(&pMpeg4Dec->mpeg4Component[i], OMX_VIDEO_PARAM_MPEG4TYPE);
2343 pMpeg4Dec->mpeg4Component[i].nPortIndex = i;
2344 pMpeg4Dec->mpeg4Component[i].eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2345 pMpeg4Dec->mpeg4Component[i].eLevel = OMX_VIDEO_MPEG4Level3;
2346 }
2347 } else {
2348 for(i = 0; i < ALL_PORT_NUM; i++) {
2349 INIT_SET_SIZE_VERSION(&pMpeg4Dec->h263Component[i], OMX_VIDEO_PARAM_H263TYPE);
2350 pMpeg4Dec->h263Component[i].nPortIndex = i;
2351 pMpeg4Dec->h263Component[i].eProfile = OMX_VIDEO_H263ProfileBaseline | OMX_VIDEO_H263ProfileISWV2;
2352 pMpeg4Dec->h263Component[i].eLevel = OMX_VIDEO_H263Level45;
2353 }
2354 }
2355
2356 pOMXComponent->GetParameter = &Exynos_Mpeg4Dec_GetParameter;
2357 pOMXComponent->SetParameter = &Exynos_Mpeg4Dec_SetParameter;
2358 pOMXComponent->GetConfig = &Exynos_Mpeg4Dec_GetConfig;
2359 pOMXComponent->SetConfig = &Exynos_Mpeg4Dec_SetConfig;
2360 pOMXComponent->GetExtensionIndex = &Exynos_Mpeg4Dec_GetExtensionIndex;
2361 pOMXComponent->ComponentRoleEnum = &Exynos_Mpeg4Dec_ComponentRoleEnum;
2362 pOMXComponent->ComponentDeInit = &Exynos_OMX_ComponentDeinit;
2363
2364 pExynosComponent->exynos_codec_componentInit = &Exynos_Mpeg4Dec_Init;
2365 pExynosComponent->exynos_codec_componentTerminate = &Exynos_Mpeg4Dec_Terminate;
2366
2367 pVideoDec->exynos_codec_srcInputProcess = &Exynos_Mpeg4Dec_srcInputBufferProcess;
2368 pVideoDec->exynos_codec_srcOutputProcess = &Exynos_Mpeg4Dec_srcOutputBufferProcess;
2369 pVideoDec->exynos_codec_dstInputProcess = &Exynos_Mpeg4Dec_dstInputBufferProcess;
2370 pVideoDec->exynos_codec_dstOutputProcess = &Exynos_Mpeg4Dec_dstOutputBufferProcess;
2371
2372 pVideoDec->exynos_codec_start = &Mpeg4CodecStart;
2373 pVideoDec->exynos_codec_stop = &Mpeg4CodecStop;
2374 pVideoDec->exynos_codec_bufferProcessRun = &Mpeg4CodecOutputBufferProcessRun;
2375 pVideoDec->exynos_codec_enqueueAllBuffer = &Mpeg4CodecEnQueueAllBuffer;
2376
2377 if (codecType == CODEC_TYPE_MPEG4)
2378 pVideoDec->exynos_checkInputFrame = &Check_Mpeg4_Frame;
2379 else
2380 pVideoDec->exynos_checkInputFrame = &Check_H263_Frame;
2381
2382 pVideoDec->exynos_codec_getCodecInputPrivateData = &GetCodecInputPrivateData;
2383 pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
2384
2385 pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
2386 if (pVideoDec->hSharedMemory == NULL) {
2387 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
2388 Exynos_OSAL_Free(pMpeg4Dec);
2389 pMpeg4Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
2390 Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2391 ret = OMX_ErrorInsufficientResources;
2392 goto EXIT;
2393 }
2394
2395 pExynosComponent->currentState = OMX_StateLoaded;
2396
2397 ret = OMX_ErrorNone;
2398
2399 EXIT:
2400 FunctionOut();
2401
2402 return ret;
2403 }
2404
2405 OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
2406 {
2407 OMX_ERRORTYPE ret = OMX_ErrorNone;
2408 OMX_COMPONENTTYPE *pOMXComponent = NULL;
2409 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
2410 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
2411 EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = NULL;
2412
2413 FunctionIn();
2414
2415 if (hComponent == NULL) {
2416 ret = OMX_ErrorBadParameter;
2417 goto EXIT;
2418 }
2419 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
2420 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
2421 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
2422
2423 Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
2424
2425 Exynos_OSAL_Free(pExynosComponent->componentName);
2426 pExynosComponent->componentName = NULL;
2427
2428 pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
2429 if (pMpeg4Dec != NULL) {
2430 Exynos_OSAL_Free(pMpeg4Dec);
2431 pMpeg4Dec = pVideoDec->hCodecHandle = NULL;
2432 }
2433
2434 ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
2435 if (ret != OMX_ErrorNone) {
2436 goto EXIT;
2437 }
2438
2439 ret = OMX_ErrorNone;
2440
2441 EXIT:
2442 FunctionOut();
2443
2444 return ret;
2445 }