3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 * @file Exynos_OMX_Vdec.c
21 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
22 * HyeYeon Chung (hyeon.chung@samsung.com)
23 * Yunji Kim (yunji.kim@samsung.com)
32 #include "Exynos_OMX_Macros.h"
33 #include "Exynos_OSAL_Event.h"
34 #include "Exynos_OMX_Vdec.h"
35 #include "Exynos_OMX_VdecControl.h"
36 #include "Exynos_OMX_Basecomponent.h"
37 #include "Exynos_OSAL_SharedMemory.h"
38 #include "Exynos_OSAL_Thread.h"
39 #include "Exynos_OSAL_Semaphore.h"
40 #include "Exynos_OSAL_Mutex.h"
41 #include "Exynos_OSAL_ETC.h"
45 #include "Exynos_OSAL_Android.h"
49 #define EXYNOS_LOG_TAG "EXYNOS_VIDEO_DEC"
50 #define EXYNOS_LOG_OFF
51 //#define EXYNOS_TRACE_ON
52 #include "Exynos_OSAL_Log.h"
55 int calc_plane(int width
, int height
)
59 mbX
= (width
+ 15)/16;
60 mbY
= (height
+ 15)/16;
62 /* Alignment for interlaced processing */
63 mbY
= (mbY
+ 1) / 2 * 2;
65 return (mbX
* 16) * (mbY
* 16);
68 inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE
*pOMXComponent
)
70 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
71 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
72 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
74 if ((exynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
!=
75 exynosInputPort
->portDefinition
.format
.video
.nFrameWidth
) ||
76 (exynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
!=
77 exynosInputPort
->portDefinition
.format
.video
.nFrameHeight
)) {
78 OMX_U32 width
= 0, height
= 0;
80 exynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
=
81 exynosInputPort
->portDefinition
.format
.video
.nFrameWidth
;
82 exynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
=
83 exynosInputPort
->portDefinition
.format
.video
.nFrameHeight
;
84 width
= exynosOutputPort
->portDefinition
.format
.video
.nStride
=
85 exynosInputPort
->portDefinition
.format
.video
.nStride
;
86 height
= exynosOutputPort
->portDefinition
.format
.video
.nSliceHeight
=
87 exynosInputPort
->portDefinition
.format
.video
.nSliceHeight
;
89 switch(exynosOutputPort
->portDefinition
.format
.video
.eColorFormat
) {
90 case OMX_COLOR_FormatYUV420Planar
:
91 case OMX_COLOR_FormatYUV420SemiPlanar
:
92 case OMX_SEC_COLOR_FormatNV12TPhysicalAddress
:
94 exynosOutputPort
->portDefinition
.nBufferSize
= (width
* height
* 3) / 2;
96 case OMX_SEC_COLOR_FormatNV12Tiled
:
97 width
= exynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
;
98 height
= exynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
;
99 if (width
&& height
) {
100 int YBufferSize
= calc_plane(width
, height
);
101 int CBufferSize
= calc_plane(width
, height
>> 1);
102 exynosOutputPort
->portDefinition
.nBufferSize
= YBufferSize
+ CBufferSize
;
107 exynosOutputPort
->portDefinition
.nBufferSize
= width
* height
* 2;
115 void Exynos_Free_CodecBuffers(
116 OMX_COMPONENTTYPE
*pOMXComponent
,
119 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
120 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
121 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
122 CODEC_DEC_BUFFER
**ppCodecBuffer
= NULL
;
124 OMX_U32 nPlaneCnt
= 0;
129 if (nPortIndex
== INPUT_PORT_INDEX
) {
130 ppCodecBuffer
= &(pVideoDec
->pMFCDecInputBuffer
[0]);
131 nPlaneCnt
= MFC_INPUT_BUFFER_PLANE
;
133 ppCodecBuffer
= &(pVideoDec
->pMFCDecOutputBuffer
[0]);
134 nPlaneCnt
= MFC_OUTPUT_BUFFER_PLANE
;
137 for (i
= 0; i
< MFC_OUTPUT_BUFFER_NUM_MAX
; i
++) {
138 if (ppCodecBuffer
[i
] != NULL
) {
139 for (j
= 0; j
< nPlaneCnt
; j
++) {
140 if (ppCodecBuffer
[i
]->pVirAddr
[j
] != NULL
)
141 Exynos_OSAL_SharedMemory_Free(pVideoDec
->hSharedMemory
, ppCodecBuffer
[i
]->pVirAddr
[j
]);
144 Exynos_OSAL_Free(ppCodecBuffer
[i
]);
145 ppCodecBuffer
[i
] = NULL
;
152 OMX_ERRORTYPE
Exynos_Allocate_CodecBuffers(
153 OMX_COMPONENTTYPE
*pOMXComponent
,
156 OMX_U32 nPlaneSize
[MFC_OUTPUT_BUFFER_PLANE
])
158 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
159 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
160 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
161 MEMORY_TYPE eMemoryType
= NORMAL_MEMORY
;
162 CODEC_DEC_BUFFER
**ppCodecBuffer
= NULL
;
164 OMX_U32 nPlaneCnt
= 0;
169 if (pVideoDec
->bDRMPlayerMode
== OMX_TRUE
)
170 eMemoryType
= SECURE_MEMORY
;
172 if (nPortIndex
== INPUT_PORT_INDEX
) {
173 ppCodecBuffer
= &(pVideoDec
->pMFCDecInputBuffer
[0]);
174 nPlaneCnt
= MFC_INPUT_BUFFER_PLANE
;
176 ppCodecBuffer
= &(pVideoDec
->pMFCDecOutputBuffer
[0]);
177 nPlaneCnt
= MFC_OUTPUT_BUFFER_PLANE
;
180 for (i
= 0; i
< nBufferCnt
; i
++) {
181 ppCodecBuffer
[i
] = (CODEC_DEC_BUFFER
*)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER
));
182 if (ppCodecBuffer
[i
] == NULL
) {
183 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Alloc codec buffer");
184 ret
= OMX_ErrorInsufficientResources
;
187 Exynos_OSAL_Memset(ppCodecBuffer
[i
], 0, sizeof(CODEC_DEC_BUFFER
));
189 for (j
= 0; j
< nPlaneCnt
; j
++) {
190 ppCodecBuffer
[i
]->pVirAddr
[j
] =
191 (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec
->hSharedMemory
, nPlaneSize
[j
], eMemoryType
);
192 if (ppCodecBuffer
[i
]->pVirAddr
[j
] == NULL
) {
193 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Failed to Alloc plane");
194 ret
= OMX_ErrorInsufficientResources
;
198 ppCodecBuffer
[i
]->fd
[j
] =
199 Exynos_OSAL_SharedMemory_VirtToION(pVideoDec
->hSharedMemory
, ppCodecBuffer
[i
]->pVirAddr
[j
]);
200 ppCodecBuffer
[i
]->bufferSize
[j
] = nPlaneSize
[j
];
201 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "PORT[%d]: pMFCCodecBuffer[%d]->pVirAddr[%d]: 0x%x", nPortIndex
, i
, j
, ppCodecBuffer
[i
]->pVirAddr
[j
]);
204 ppCodecBuffer
[i
]->dataSize
= 0;
207 return OMX_ErrorNone
;
210 Exynos_Free_CodecBuffers(pOMXComponent
, nPortIndex
);
217 OMX_BOOL
Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_U32 nPortIndex
)
219 OMX_BOOL ret
= OMX_FALSE
;
221 if ((pExynosComponent
->currentState
== OMX_StateExecuting
) &&
222 (pExynosComponent
->pExynosPort
[nPortIndex
].portState
== OMX_StateIdle
) &&
223 (pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateExecutingToIdle
) &&
224 (pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateIdleToExecuting
)) {
233 OMX_ERRORTYPE
Exynos_ResetAllPortConfig(OMX_COMPONENTTYPE
*pOMXComponent
)
235 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
236 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
237 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
238 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
241 pExynosInputPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
242 pExynosInputPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
243 pExynosInputPort
->portDefinition
.format
.video
.nStride
= 0; /*DEFAULT_FRAME_WIDTH;*/
244 pExynosInputPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
245 pExynosInputPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_INPUT_BUFFER_SIZE
;
246 pExynosInputPort
->portDefinition
.format
.video
.pNativeRender
= 0;
247 pExynosInputPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
248 pExynosInputPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatUnused
;
249 pExynosInputPort
->portDefinition
.bEnabled
= OMX_TRUE
;
250 pExynosInputPort
->bufferProcessType
= BUFFER_SHARE
;
251 pExynosInputPort
->portWayType
= WAY2_PORT
;
254 pExynosOutputPort
->portDefinition
.format
.video
.nFrameWidth
= DEFAULT_FRAME_WIDTH
;
255 pExynosOutputPort
->portDefinition
.format
.video
.nFrameHeight
= DEFAULT_FRAME_HEIGHT
;
256 pExynosOutputPort
->portDefinition
.format
.video
.nStride
= 0; /*DEFAULT_FRAME_WIDTH;*/
257 pExynosOutputPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
258 pExynosOutputPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE
;
259 pExynosOutputPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingUnused
;
260 Exynos_OSAL_Memset(pExynosOutputPort
->portDefinition
.format
.video
.cMIMEType
, 0, MAX_OMX_MIMETYPE_SIZE
);
261 Exynos_OSAL_Strcpy(pExynosOutputPort
->portDefinition
.format
.video
.cMIMEType
, "raw/video");
262 pExynosOutputPort
->portDefinition
.format
.video
.pNativeRender
= 0;
263 pExynosOutputPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
264 pExynosOutputPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatYUV420Planar
;
265 pExynosOutputPort
->portDefinition
.bEnabled
= OMX_TRUE
;
266 pExynosOutputPort
->bufferProcessType
= BUFFER_COPY
| BUFFER_ANBSHARE
;
267 pExynosOutputPort
->bIsANBEnabled
= OMX_FALSE
;
268 pExynosOutputPort
->portWayType
= WAY2_PORT
;
273 OMX_ERRORTYPE
Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_PTR codecBuffer
, EXYNOS_OMX_DATA
*pData
)
275 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
276 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
277 CODEC_DEC_BUFFER
*pInputCodecBuffer
= (CODEC_DEC_BUFFER
*)codecBuffer
;
279 pData
->buffer
.singlePlaneBuffer
.dataBuffer
= pInputCodecBuffer
->pVirAddr
[0];
280 pData
->buffer
.singlePlaneBuffer
.fd
= pInputCodecBuffer
->fd
[0];
281 pData
->allocSize
= pInputCodecBuffer
->bufferSize
[0];
282 pData
->dataLen
= pInputCodecBuffer
->dataSize
;
283 pData
->usedDataLen
= 0;
284 pData
->remainDataLen
= pInputCodecBuffer
->dataSize
;
287 pData
->timeStamp
= 0;
288 pData
->pPrivate
= codecBuffer
;
289 pData
->bufferHeader
= NULL
;
294 OMX_ERRORTYPE
Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_PTR codecBuffer
, EXYNOS_OMX_DATA
*pData
)
296 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
297 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
298 CODEC_DEC_BUFFER
*pCodecBuffer
= (CODEC_DEC_BUFFER
*)codecBuffer
;
301 pData
->allocSize
= 0;
303 pData
->usedDataLen
= 0;
304 pData
->remainDataLen
= 0;
307 pData
->timeStamp
= 0;
308 pData
->pPrivate
= codecBuffer
;
309 pData
->bufferHeader
= NULL
;
311 for (i
= 0; i
< MAX_BUFFER_PLANE
; i
++) {
312 pData
->buffer
.multiPlaneBuffer
.dataBuffer
[i
] = pCodecBuffer
->pVirAddr
[i
];
313 pData
->buffer
.multiPlaneBuffer
.fd
[i
] = pCodecBuffer
->fd
[i
];
314 pData
->allocSize
+= pCodecBuffer
->bufferSize
[i
];
320 void Exynos_Wait_ProcessPause(EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
, OMX_U32 nPortIndex
)
322 EXYNOS_OMX_BASEPORT
*exynosOMXInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
323 EXYNOS_OMX_BASEPORT
*exynosOMXOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
324 EXYNOS_OMX_BASEPORT
*exynosOMXPort
= NULL
;
328 exynosOMXPort
= &pExynosComponent
->pExynosPort
[nPortIndex
];
330 if (((pExynosComponent
->currentState
== OMX_StatePause
) ||
331 (pExynosComponent
->currentState
== OMX_StateIdle
) ||
332 (pExynosComponent
->transientState
== EXYNOS_OMX_TransStateLoadedToIdle
) ||
333 (pExynosComponent
->transientState
== EXYNOS_OMX_TransStateExecutingToIdle
)) &&
334 (pExynosComponent
->transientState
!= EXYNOS_OMX_TransStateIdleToLoaded
) &&
335 (!CHECK_PORT_BEING_FLUSHED(exynosOMXPort
))) {
336 Exynos_OSAL_SignalWait(pExynosComponent
->pExynosPort
[nPortIndex
].pauseEvent
, DEF_MAX_WAIT_TIME
);
337 Exynos_OSAL_SignalReset(pExynosComponent
->pExynosPort
[nPortIndex
].pauseEvent
);
345 OMX_BOOL
Exynos_CSC_OutputData(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*dstOutputData
)
347 OMX_BOOL ret
= OMX_FALSE
;
348 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
349 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
350 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
351 EXYNOS_OMX_DATABUFFER
*outputUseBuffer
= &exynosOutputPort
->way
.port2WayDataBuffer
.outputDataBuffer
;
352 OMX_U32 copySize
= 0;
353 DECODE_CODEC_EXTRA_BUFFERINFO
*pBufferInfo
= NULL
;
357 OMX_U32 width
= 0, height
= 0;
359 OMX_COLOR_FORMATTYPE colorFormat
;
361 void *pOutputBuf
= (void *)outputUseBuffer
->bufferHeader
->pBuffer
;
362 void *pSrcBuf
[MAX_BUFFER_PLANE
] = {NULL
, };
363 void *pYUVBuf
[MAX_BUFFER_PLANE
] = {NULL
, };
365 CSC_ERRORCODE cscRet
= CSC_ErrorNone
;
366 CSC_METHOD csc_method
= CSC_METHOD_SW
;
367 unsigned int cacheable
= 1;
369 pBufferInfo
= (DECODE_CODEC_EXTRA_BUFFERINFO
*)dstOutputData
->extInfo
;
371 width
= pBufferInfo
->imageWidth
;
372 height
= pBufferInfo
->imageHeight
;
373 imageSize
= width
* height
;
374 colorFormat
= pBufferInfo
->ColorFormat
;
376 pSrcBuf
[0] = dstOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[0];
377 pSrcBuf
[1] = dstOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[1];
378 pSrcBuf
[2] = dstOutputData
->buffer
.multiPlaneBuffer
.dataBuffer
[2];
380 pYUVBuf
[0] = (unsigned char *)pOutputBuf
;
381 pYUVBuf
[1] = (unsigned char *)pOutputBuf
+ imageSize
;
382 pYUVBuf
[2] = (unsigned char *)pOutputBuf
+ imageSize
+ imageSize
/ 4;
384 csc_get_method(pVideoDec
->csc_handle
, &csc_method
);
385 if (csc_method
== CSC_METHOD_HW
) {
386 pSrcBuf
[0] = dstOutputData
->buffer
.multiPlaneBuffer
.fd
[0];
387 pSrcBuf
[1] = dstOutputData
->buffer
.multiPlaneBuffer
.fd
[1];
388 pSrcBuf
[2] = dstOutputData
->buffer
.multiPlaneBuffer
.fd
[2];
392 if ((exynosOutputPort
->bIsANBEnabled
== OMX_TRUE
) ||
393 (exynosOutputPort
->bStoreMetaData
== OMX_TRUE
)) {
394 ExynosVideoPlane planes
[MAX_BUFFER_PLANE
];
396 if (exynosOutputPort
->bIsANBEnabled
== OMX_TRUE
) {
397 Exynos_OSAL_LockANB(pOutputBuf
, width
, height
, exynosOutputPort
->portDefinition
.format
.video
.eColorFormat
, &stride
, planes
);
398 } else if (exynosOutputPort
->bStoreMetaData
== OMX_TRUE
) {
399 Exynos_OSAL_LockMetaData(pOutputBuf
, width
, height
, exynosOutputPort
->portDefinition
.format
.video
.eColorFormat
, &stride
, planes
);
402 outputUseBuffer
->dataLen
= sizeof(void *);
404 if (csc_method
== CSC_METHOD_SW
) {
405 pYUVBuf
[0] = (unsigned char *)planes
[0].addr
;
406 pYUVBuf
[1] = (unsigned char *)planes
[1].addr
;
407 pYUVBuf
[2] = (unsigned char *)planes
[2].addr
;
409 pYUVBuf
[0] = (unsigned char *)planes
[0].fd
;
410 pYUVBuf
[1] = (unsigned char *)planes
[1].fd
;
411 pYUVBuf
[2] = (unsigned char *)planes
[2].fd
;
415 if ((exynosOutputPort
->bIsANBEnabled
== OMX_FALSE
) &&
416 (exynosOutputPort
->bStoreMetaData
== OMX_FALSE
) &&
417 (csc_method
== CSC_METHOD_HW
)) {
418 pYUVBuf
[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec
->hSharedMemory
, pOutputBuf
);
423 if (pVideoDec
->csc_set_format
== OMX_FALSE
) {
425 pVideoDec
->csc_handle
, /* handle */
430 width
, /* crop_width */
431 height
, /* crop_height */
432 omx_2_hal_pixel_format(colorFormat
), /* color_format */
433 cacheable
); /* cacheable */
435 pVideoDec
->csc_handle
, /* handle */
440 width
, /* crop_width */
441 height
, /* crop_height */
442 omx_2_hal_pixel_format(exynosOutputPort
->portDefinition
.format
.video
.eColorFormat
), /* color_format */
443 cacheable
); /* cacheable */
444 pVideoDec
->csc_set_format
= OMX_TRUE
;
447 pVideoDec
->csc_handle
, /* handle */
448 pSrcBuf
); /* YUV Addr or FD */
450 pVideoDec
->csc_handle
, /* handle */
451 pYUVBuf
); /* YUV Addr or FD */
452 cscRet
= csc_convert(pVideoDec
->csc_handle
);
453 if (cscRet
!= CSC_ErrorNone
)
459 if (exynosOutputPort
->bIsANBEnabled
== OMX_TRUE
) {
460 Exynos_OSAL_UnlockANB(pOutputBuf
);
461 } else if (exynosOutputPort
->bStoreMetaData
== OMX_TRUE
) {
462 Exynos_OSAL_UnlockMetaData(pOutputBuf
);
472 OMX_BOOL
Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*srcInputData
)
474 OMX_BOOL ret
= OMX_FALSE
;
475 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
476 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
477 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
478 EXYNOS_OMX_DATABUFFER
*inputUseBuffer
= &exynosInputPort
->way
.port2WayDataBuffer
.inputDataBuffer
;
479 OMX_U32 copySize
= 0;
480 OMX_BYTE checkInputStream
= NULL
;
481 OMX_U32 checkInputStreamLen
= 0;
485 if ((exynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
486 if ((srcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
== NULL
) ||
487 (srcInputData
->pPrivate
== NULL
)) {
493 if (inputUseBuffer
->dataValid
== OMX_TRUE
) {
494 if (exynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
495 Exynos_Shared_BufferToData(inputUseBuffer
, srcInputData
, ONE_PLANE
);
497 if (pVideoDec
->bDRMPlayerMode
== OMX_TRUE
) {
498 OMX_PTR dataBuffer
= NULL
;
500 dataBuffer
= Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec
->hSharedMemory
,
501 srcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
);
502 if (dataBuffer
== NULL
) {
507 srcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
= dataBuffer
;
510 /* reset dataBuffer */
511 Exynos_ResetDataBuffer(inputUseBuffer
);
512 } else if ((exynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
513 checkInputStream
= inputUseBuffer
->bufferHeader
->pBuffer
+ inputUseBuffer
->usedDataLen
;
514 checkInputStreamLen
= inputUseBuffer
->remainDataLen
;
516 pExynosComponent
->bUseFlagEOF
= OMX_TRUE
;
518 copySize
= checkInputStreamLen
;
519 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "exynos_checkInputFrame : OMX_TRUE");
521 if (((srcInputData
->allocSize
) - (srcInputData
->dataLen
)) >= copySize
) {
523 Exynos_OSAL_Memcpy(srcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
+ srcInputData
->dataLen
,
524 checkInputStream
, copySize
);
527 inputUseBuffer
->dataLen
-= copySize
;
528 inputUseBuffer
->remainDataLen
-= copySize
;
529 inputUseBuffer
->usedDataLen
+= copySize
;
531 srcInputData
->dataLen
+= copySize
;
532 srcInputData
->remainDataLen
+= copySize
;
534 srcInputData
->timeStamp
= inputUseBuffer
->timeStamp
;
535 srcInputData
->nFlags
= inputUseBuffer
->nFlags
;
536 srcInputData
->bufferHeader
= inputUseBuffer
->bufferHeader
;
538 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "input codec buffer is smaller than decoded input data size Out Length");
539 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
540 pExynosComponent
->callbackData
,
541 OMX_EventError
, OMX_ErrorUndefined
, 0, NULL
);
545 Exynos_InputBufferReturn(pOMXComponent
, inputUseBuffer
);
548 if ((srcInputData
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) {
549 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "bSaveFlagEOS : OMX_TRUE");
550 pExynosComponent
->bSaveFlagEOS
= OMX_TRUE
;
551 if (srcInputData
->dataLen
!= 0)
552 pExynosComponent
->bBehaviorEOS
= OMX_TRUE
;
555 if (pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
== OMX_TRUE
) {
556 pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
= OMX_TRUE
;
557 pExynosComponent
->checkTimeStamp
.startTimeStamp
= srcInputData
->timeStamp
;
558 pExynosComponent
->checkTimeStamp
.nStartFlags
= srcInputData
->nFlags
;
559 pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
= OMX_FALSE
;
560 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "first frame timestamp after seeking %lld us (%.2f secs)",
561 srcInputData
->timeStamp
, srcInputData
->timeStamp
/ 1E6
);
574 OMX_BOOL
Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE
*pOMXComponent
, EXYNOS_OMX_DATA
*dstOutputData
)
576 OMX_BOOL ret
= OMX_FALSE
;
577 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
578 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
579 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
580 EXYNOS_OMX_DATABUFFER
*outputUseBuffer
= &exynosOutputPort
->way
.port2WayDataBuffer
.outputDataBuffer
;
581 OMX_U32 copySize
= 0;
582 DECODE_CODEC_EXTRA_BUFFERINFO
*pBufferInfo
= NULL
;
586 if (exynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
587 if ((exynosOutputPort
->bIsANBEnabled
== OMX_FALSE
) &&
588 (exynosOutputPort
->bStoreMetaData
== OMX_FALSE
)) {
589 if (Exynos_Shared_DataToBuffer(dstOutputData
, outputUseBuffer
) == OMX_ErrorNone
)
590 outputUseBuffer
->dataValid
= OMX_TRUE
;
592 if (Exynos_Shared_DataToANBBuffer(dstOutputData
, outputUseBuffer
, exynosOutputPort
) == OMX_ErrorNone
) {
593 outputUseBuffer
->dataValid
= OMX_TRUE
;
601 if (outputUseBuffer
->dataValid
== OMX_TRUE
) {
602 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "out timestamp after seeking %lld us (%.2f secs)",
603 dstOutputData
->timeStamp
, dstOutputData
->timeStamp
/ 1E6
);
604 if ((pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
== OMX_TRUE
) &&
605 ((dstOutputData
->nFlags
& OMX_BUFFERFLAG_EOS
) != OMX_BUFFERFLAG_EOS
)) {
606 if ((pExynosComponent
->checkTimeStamp
.startTimeStamp
== dstOutputData
->timeStamp
) &&
607 (pExynosComponent
->checkTimeStamp
.nStartFlags
== dstOutputData
->nFlags
)){
608 pExynosComponent
->checkTimeStamp
.startTimeStamp
= -19761123;
609 pExynosComponent
->checkTimeStamp
.nStartFlags
= 0x0;
610 pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
= OMX_FALSE
;
611 pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
= OMX_FALSE
;
613 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "drop frame after seeking", pExynosComponent
);
614 if (exynosOutputPort
->bufferProcessType
== BUFFER_SHARE
)
615 Exynos_OMX_FillThisBuffer(pOMXComponent
, outputUseBuffer
->bufferHeader
);
619 } else if ((pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
== OMX_TRUE
)) {
621 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "not set check timestame after seeking");
625 if ((exynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
626 OMX_U32 width
= 0, height
= 0;
628 void *pOutputBuf
= (void *)outputUseBuffer
->bufferHeader
->pBuffer
;
630 pBufferInfo
= (DECODE_CODEC_EXTRA_BUFFERINFO
*)dstOutputData
->extInfo
;
632 width
= pBufferInfo
->imageWidth
;
633 height
= pBufferInfo
->imageHeight
;
634 imageSize
= width
* height
;
636 if ((dstOutputData
->remainDataLen
<= (outputUseBuffer
->allocSize
- outputUseBuffer
->dataLen
)) &&
637 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort
))) {
638 copySize
= dstOutputData
->remainDataLen
;
639 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
,"copySize: %d", copySize
);
641 outputUseBuffer
->dataLen
+= copySize
;
642 outputUseBuffer
->remainDataLen
+= copySize
;
643 outputUseBuffer
->nFlags
= dstOutputData
->nFlags
;
644 outputUseBuffer
->timeStamp
= dstOutputData
->timeStamp
;
646 if (outputUseBuffer
->remainDataLen
> 0) {
647 ret
= Exynos_CSC_OutputData(pOMXComponent
, dstOutputData
);
652 if (ret
== OMX_TRUE
) {
653 if ((outputUseBuffer
->remainDataLen
> 0) ||
654 ((outputUseBuffer
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) ||
655 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort
))) {
656 Exynos_OutputBufferReturn(pOMXComponent
, outputUseBuffer
);
659 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "csc_convert Error");
660 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
661 pExynosComponent
->callbackData
,
662 OMX_EventError
, OMX_ErrorUndefined
, 0, NULL
);
665 } else if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort
)) {
666 outputUseBuffer
->dataLen
= 0;
667 outputUseBuffer
->remainDataLen
= 0;
668 outputUseBuffer
->nFlags
= dstOutputData
->nFlags
;
669 outputUseBuffer
->timeStamp
= dstOutputData
->timeStamp
;
670 Exynos_OutputBufferReturn(pOMXComponent
, outputUseBuffer
);
672 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "output buffer is smaller than decoded data size Out Length");
673 pExynosComponent
->pCallbacks
->EventHandler((OMX_HANDLETYPE
)pOMXComponent
,
674 pExynosComponent
->callbackData
,
675 OMX_EventError
, OMX_ErrorUndefined
, 0, NULL
);
678 } else if (exynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
679 if ((outputUseBuffer
->remainDataLen
> 0) ||
680 ((outputUseBuffer
->nFlags
& OMX_BUFFERFLAG_EOS
) == OMX_BUFFERFLAG_EOS
) ||
681 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort
)))
682 Exynos_OutputBufferReturn(pOMXComponent
, outputUseBuffer
);
694 OMX_ERRORTYPE
Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent
)
696 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
697 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
698 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
699 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
700 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
701 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
702 EXYNOS_OMX_DATABUFFER
*srcInputUseBuffer
= &exynosInputPort
->way
.port2WayDataBuffer
.inputDataBuffer
;
703 EXYNOS_OMX_DATA
*pSrcInputData
= &exynosInputPort
->processData
;
704 OMX_BOOL bCheckInputData
= OMX_FALSE
;
705 OMX_BOOL bValidCodecData
= OMX_FALSE
;
709 while (!pVideoDec
->bExitBufferProcessThread
) {
710 Exynos_OSAL_SleepMillisec(0);
711 Exynos_Wait_ProcessPause(pExynosComponent
, INPUT_PORT_INDEX
);
713 while ((Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
)) &&
714 (!pVideoDec
->bExitBufferProcessThread
)) {
715 Exynos_OSAL_SleepMillisec(0);
717 if ((CHECK_PORT_BEING_FLUSHED(exynosInputPort
)) ||
718 ((exynosOutputPort
->exceptionFlag
== NEED_PORT_DISABLE
) && (ret
== OMX_ErrorInputDataDecodeYet
)))
720 if (exynosInputPort
->portState
!= OMX_StateIdle
)
723 Exynos_OSAL_MutexLock(srcInputUseBuffer
->bufferMutex
);
724 if (ret
!= OMX_ErrorInputDataDecodeYet
) {
725 if ((exynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
727 if ((pSrcInputData
->buffer
.singlePlaneBuffer
.dataBuffer
== NULL
) || (pSrcInputData
->pPrivate
== NULL
)) {
728 Exynos_CodecBufferDeQueue(pExynosComponent
, INPUT_PORT_INDEX
, &codecBuffer
);
729 if (codecBuffer
!= NULL
) {
730 Exynos_Input_CodecBufferToData(pExynosComponent
, codecBuffer
, pSrcInputData
);
732 Exynos_OSAL_MutexUnlock(srcInputUseBuffer
->bufferMutex
);
737 if (srcInputUseBuffer
->dataValid
== OMX_TRUE
) {
738 bCheckInputData
= Exynos_Preprocessor_InputData(pOMXComponent
, pSrcInputData
);
740 bCheckInputData
= OMX_FALSE
;
743 if ((bCheckInputData
== OMX_FALSE
) &&
744 (!CHECK_PORT_BEING_FLUSHED(exynosInputPort
))) {
745 ret
= Exynos_InputBufferGetQueue(pExynosComponent
);
746 Exynos_OSAL_MutexUnlock(srcInputUseBuffer
->bufferMutex
);
750 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort
)) {
751 Exynos_OSAL_MutexUnlock(srcInputUseBuffer
->bufferMutex
);
756 ret
= pVideoDec
->exynos_codec_srcInputProcess(pOMXComponent
, pSrcInputData
);
757 if (ret
!= OMX_ErrorInputDataDecodeYet
) {
758 Exynos_ResetCodecData(pSrcInputData
);
760 Exynos_OSAL_MutexUnlock(srcInputUseBuffer
->bufferMutex
);
761 if (ret
== OMX_ErrorCodecInit
)
762 pVideoDec
->bExitBufferProcessThread
= OMX_TRUE
;
773 OMX_ERRORTYPE
Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent
)
775 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
776 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
777 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
778 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
779 EXYNOS_OMX_BASEPORT
*exynosInputPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
780 EXYNOS_OMX_DATABUFFER
*srcOutputUseBuffer
= &exynosInputPort
->way
.port2WayDataBuffer
.outputDataBuffer
;
781 EXYNOS_OMX_DATA srcOutputData
;
785 while (!pVideoDec
->bExitBufferProcessThread
) {
786 Exynos_OSAL_SleepMillisec(0);
788 while (!pVideoDec
->bExitBufferProcessThread
) {
789 if ((exynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
790 if (Exynos_Check_BufferProcess_State(pExynosComponent
, INPUT_PORT_INDEX
) == OMX_FALSE
)
793 Exynos_OSAL_SleepMillisec(0);
795 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort
))
798 Exynos_OSAL_MutexLock(srcOutputUseBuffer
->bufferMutex
);
799 ret
= pVideoDec
->exynos_codec_srcOutputProcess(pOMXComponent
, &srcOutputData
);
801 if (ret
== OMX_ErrorNone
) {
802 if ((exynosInputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
804 codecBuffer
= srcOutputData
.pPrivate
;
805 if (codecBuffer
!= NULL
)
806 Exynos_CodecBufferEnQueue(pExynosComponent
, INPUT_PORT_INDEX
, codecBuffer
);
808 if (exynosInputPort
->bufferProcessType
== BUFFER_SHARE
) {
809 Exynos_Shared_DataToBuffer(&srcOutputData
, srcOutputUseBuffer
);
810 Exynos_InputBufferReturn(pOMXComponent
, srcOutputUseBuffer
);
812 Exynos_ResetCodecData(&srcOutputData
);
814 Exynos_OSAL_MutexUnlock(srcOutputUseBuffer
->bufferMutex
);
825 OMX_ERRORTYPE
Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent
)
827 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
828 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
829 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
830 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
831 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
832 EXYNOS_OMX_DATABUFFER
*dstInputUseBuffer
= &exynosOutputPort
->way
.port2WayDataBuffer
.inputDataBuffer
;
833 EXYNOS_OMX_DATA dstInputData
;
837 while (!pVideoDec
->bExitBufferProcessThread
) {
838 Exynos_OSAL_SleepMillisec(0);
840 while ((Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) &&
841 (!pVideoDec
->bExitBufferProcessThread
)) {
842 Exynos_OSAL_SleepMillisec(0);
844 if ((CHECK_PORT_BEING_FLUSHED(exynosOutputPort
)) ||
845 (!CHECK_PORT_POPULATED(exynosOutputPort
)))
847 if (exynosOutputPort
->portState
!= OMX_StateIdle
)
850 Exynos_OSAL_MutexLock(dstInputUseBuffer
->bufferMutex
);
851 if (ret
!= OMX_ErrorOutputBufferUseYet
) {
852 if ((exynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
854 ret
= Exynos_CodecBufferDeQueue(pExynosComponent
, OUTPUT_PORT_INDEX
, &codecBuffer
);
855 if (ret
!= OMX_ErrorNone
) {
856 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
859 Exynos_Output_CodecBufferToData(pExynosComponent
, codecBuffer
, &dstInputData
);
862 if (exynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
863 if ((dstInputUseBuffer
->dataValid
!= OMX_TRUE
) &&
864 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort
))) {
865 ret
= Exynos_OutputBufferGetQueue(pExynosComponent
);
866 if (ret
!= OMX_ErrorNone
) {
867 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
870 if ((exynosOutputPort
->bIsANBEnabled
== OMX_FALSE
) &&
871 (exynosOutputPort
->bStoreMetaData
== OMX_FALSE
)) {
872 Exynos_Shared_BufferToData(dstInputUseBuffer
, &dstInputData
, TWO_PLANE
);
874 ret
= Exynos_Shared_ANBBufferToData(dstInputUseBuffer
, &dstInputData
, exynosOutputPort
, TWO_PLANE
);
875 if (ret
!= OMX_ErrorNone
) {
876 dstInputUseBuffer
->dataValid
= OMX_FALSE
;
877 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
881 Exynos_OSAL_RefANB_Increase(pVideoDec
->hRefHandle
, dstInputData
.bufferHeader
->pBuffer
);
882 Exynos_ResetDataBuffer(dstInputUseBuffer
);
886 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort
)) {
887 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
892 ret
= pVideoDec
->exynos_codec_dstInputProcess(pOMXComponent
, &dstInputData
);
893 if (ret
!= OMX_ErrorOutputBufferUseYet
) {
894 Exynos_ResetCodecData(&dstInputData
);
896 Exynos_OSAL_MutexUnlock(dstInputUseBuffer
->bufferMutex
);
907 OMX_ERRORTYPE
Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent
)
909 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
910 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
911 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
912 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
913 EXYNOS_OMX_BASEPORT
*exynosOutputPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
914 EXYNOS_OMX_DATABUFFER
*dstOutputUseBuffer
= &exynosOutputPort
->way
.port2WayDataBuffer
.outputDataBuffer
;
915 EXYNOS_OMX_DATA
*pDstOutputData
= &exynosOutputPort
->processData
;
919 while (!pVideoDec
->bExitBufferProcessThread
) {
920 Exynos_OSAL_SleepMillisec(0);
921 Exynos_Wait_ProcessPause(pExynosComponent
, OUTPUT_PORT_INDEX
);
923 while ((Exynos_Check_BufferProcess_State(pExynosComponent
, OUTPUT_PORT_INDEX
)) &&
924 (!pVideoDec
->bExitBufferProcessThread
)) {
925 Exynos_OSAL_SleepMillisec(0);
927 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort
))
930 Exynos_OSAL_MutexLock(dstOutputUseBuffer
->bufferMutex
);
931 if ((exynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
932 if ((dstOutputUseBuffer
->dataValid
!= OMX_TRUE
) &&
933 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort
))) {
934 ret
= Exynos_OutputBufferGetQueue(pExynosComponent
);
935 if (ret
!= OMX_ErrorNone
) {
936 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer
->bufferMutex
);
942 if ((dstOutputUseBuffer
->dataValid
== OMX_TRUE
) ||
943 (exynosOutputPort
->bufferProcessType
== BUFFER_SHARE
))
944 ret
= pVideoDec
->exynos_codec_dstOutputProcess(pOMXComponent
, pDstOutputData
);
946 if (((ret
== OMX_ErrorNone
) && (dstOutputUseBuffer
->dataValid
== OMX_TRUE
)) ||
947 (exynosOutputPort
->bufferProcessType
== BUFFER_SHARE
)) {
948 if (exynosOutputPort
->bufferProcessType
== BUFFER_SHARE
) {
949 DECODE_CODEC_EXTRA_BUFFERINFO
*pBufferInfo
= NULL
;
951 pBufferInfo
= (DECODE_CODEC_EXTRA_BUFFERINFO
*)pDstOutputData
->extInfo
;
952 for (i
= 0; i
< VIDEO_BUFFER_MAX_NUM
; i
++) {
953 if (pBufferInfo
->PDSB
.dpbFD
[i
].fd
> -1) {
954 Exynos_OSAL_Log(EXYNOS_LOG_TRACE
, "decRefCnt-FD:%d", pBufferInfo
->PDSB
.dpbFD
[i
].fd
);
955 Exynos_OSAL_RefANB_Decrease(pVideoDec
->hRefHandle
, pBufferInfo
->PDSB
.dpbFD
[i
].fd
);
961 Exynos_Postprocess_OutputData(pOMXComponent
, pDstOutputData
);
964 if ((exynosOutputPort
->bufferProcessType
& BUFFER_COPY
) == BUFFER_COPY
) {
965 OMX_PTR codecBuffer
= pDstOutputData
->pPrivate
;
966 if (codecBuffer
!= NULL
) {
967 Exynos_CodecBufferEnQueue(pExynosComponent
, OUTPUT_PORT_INDEX
, codecBuffer
);
968 pDstOutputData
->pPrivate
= NULL
;
972 /* reset outputData */
973 Exynos_ResetCodecData(pDstOutputData
);
974 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer
->bufferMutex
);
985 static OMX_ERRORTYPE
Exynos_OMX_SrcInputProcessThread(OMX_PTR threadData
)
987 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
988 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
989 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
990 EXYNOS_OMX_MESSAGE
*message
= NULL
;
994 if (threadData
== NULL
) {
995 ret
= OMX_ErrorBadParameter
;
998 pOMXComponent
= (OMX_COMPONENTTYPE
*)threadData
;
999 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1000 if (ret
!= OMX_ErrorNone
) {
1003 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1004 Exynos_OMX_SrcInputBufferProcess(pOMXComponent
);
1006 Exynos_OSAL_ThreadExit(NULL
);
1014 static OMX_ERRORTYPE
Exynos_OMX_SrcOutputProcessThread(OMX_PTR threadData
)
1016 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1017 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1018 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1019 EXYNOS_OMX_MESSAGE
*message
= NULL
;
1023 if (threadData
== NULL
) {
1024 ret
= OMX_ErrorBadParameter
;
1027 pOMXComponent
= (OMX_COMPONENTTYPE
*)threadData
;
1028 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1029 if (ret
!= OMX_ErrorNone
) {
1032 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1033 Exynos_OMX_SrcOutputBufferProcess(pOMXComponent
);
1035 Exynos_OSAL_ThreadExit(NULL
);
1043 static OMX_ERRORTYPE
Exynos_OMX_DstInputProcessThread(OMX_PTR threadData
)
1045 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1046 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1047 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1048 EXYNOS_OMX_MESSAGE
*message
= NULL
;
1052 if (threadData
== NULL
) {
1053 ret
= OMX_ErrorBadParameter
;
1056 pOMXComponent
= (OMX_COMPONENTTYPE
*)threadData
;
1057 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1058 if (ret
!= OMX_ErrorNone
) {
1061 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1062 Exynos_OMX_DstInputBufferProcess(pOMXComponent
);
1064 Exynos_OSAL_ThreadExit(NULL
);
1072 static OMX_ERRORTYPE
Exynos_OMX_DstOutputProcessThread(OMX_PTR threadData
)
1074 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1075 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1076 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1077 EXYNOS_OMX_MESSAGE
*message
= NULL
;
1081 if (threadData
== NULL
) {
1082 ret
= OMX_ErrorBadParameter
;
1085 pOMXComponent
= (OMX_COMPONENTTYPE
*)threadData
;
1086 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1087 if (ret
!= OMX_ErrorNone
) {
1090 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1091 Exynos_OMX_DstOutputBufferProcess(pOMXComponent
);
1093 Exynos_OSAL_ThreadExit(NULL
);
1101 OMX_ERRORTYPE
Exynos_OMX_BufferProcess_Create(OMX_HANDLETYPE hComponent
)
1103 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1104 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1105 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1106 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1110 pVideoDec
->bExitBufferProcessThread
= OMX_FALSE
;
1112 ret
= Exynos_OSAL_ThreadCreate(&pVideoDec
->hDstOutputThread
,
1113 Exynos_OMX_DstOutputProcessThread
,
1115 if (ret
== OMX_ErrorNone
)
1116 ret
= Exynos_OSAL_ThreadCreate(&pVideoDec
->hSrcOutputThread
,
1117 Exynos_OMX_SrcOutputProcessThread
,
1119 if (ret
== OMX_ErrorNone
)
1120 ret
= Exynos_OSAL_ThreadCreate(&pVideoDec
->hDstInputThread
,
1121 Exynos_OMX_DstInputProcessThread
,
1123 if (ret
== OMX_ErrorNone
)
1124 ret
= Exynos_OSAL_ThreadCreate(&pVideoDec
->hSrcInputThread
,
1125 Exynos_OMX_SrcInputProcessThread
,
1134 OMX_ERRORTYPE
Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent
)
1136 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1137 OMX_COMPONENTTYPE
*pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1138 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1139 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1140 OMX_S32 countValue
= 0;
1145 pVideoDec
->bExitBufferProcessThread
= OMX_TRUE
;
1147 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].bufferSemID
, &countValue
);
1148 if (countValue
== 0)
1149 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].bufferSemID
);
1150 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].codecSemID
, &countValue
);
1151 if (countValue
== 0)
1152 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].codecSemID
);
1153 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].pauseEvent
);
1154 Exynos_OSAL_ThreadTerminate(pVideoDec
->hSrcInputThread
);
1155 pVideoDec
->hSrcInputThread
= NULL
;
1157 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].bufferSemID
, &countValue
);
1158 if (countValue
== 0)
1159 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].bufferSemID
);
1160 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].codecSemID
, &countValue
);
1161 if (countValue
== 0)
1162 Exynos_OSAL_SemaphorePost(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].codecSemID
);
1163 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].pauseEvent
);
1164 Exynos_OSAL_ThreadTerminate(pVideoDec
->hDstInputThread
);
1165 pVideoDec
->hDstInputThread
= NULL
;
1167 pVideoDec
->exynos_codec_stop(pOMXComponent
, INPUT_PORT_INDEX
);
1168 pVideoDec
->exynos_codec_bufferProcessRun(pOMXComponent
, INPUT_PORT_INDEX
);
1169 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
].pauseEvent
);
1170 Exynos_OSAL_ThreadTerminate(pVideoDec
->hSrcOutputThread
);
1171 pVideoDec
->hSrcOutputThread
= NULL
;
1173 pVideoDec
->exynos_codec_stop(pOMXComponent
, OUTPUT_PORT_INDEX
);
1174 pVideoDec
->exynos_codec_bufferProcessRun(pOMXComponent
, INPUT_PORT_INDEX
);
1175 Exynos_OSAL_SignalSet(pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
].pauseEvent
);
1176 Exynos_OSAL_ThreadTerminate(pVideoDec
->hDstOutputThread
);
1177 pVideoDec
->hDstOutputThread
= NULL
;
1179 pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
= OMX_FALSE
;
1180 pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
= OMX_FALSE
;
1188 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent
)
1190 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1191 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1192 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1193 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1194 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
1198 if (hComponent
== NULL
) {
1199 ret
= OMX_ErrorBadParameter
;
1202 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1203 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1204 if (ret
!= OMX_ErrorNone
) {
1205 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_Error, Line:%d", __LINE__
);
1209 ret
= Exynos_OMX_BaseComponent_Constructor(pOMXComponent
);
1210 if (ret
!= OMX_ErrorNone
) {
1211 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_Error, Line:%d", __LINE__
);
1215 ret
= Exynos_OMX_Port_Constructor(pOMXComponent
);
1216 if (ret
!= OMX_ErrorNone
) {
1217 Exynos_OMX_BaseComponent_Destructor(pOMXComponent
);
1218 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_Error, Line:%d", __LINE__
);
1222 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1224 pVideoDec
= Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT
));
1225 if (pVideoDec
== NULL
) {
1226 Exynos_OMX_BaseComponent_Destructor(pOMXComponent
);
1227 ret
= OMX_ErrorInsufficientResources
;
1228 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
1232 Exynos_OSAL_Memset(pVideoDec
, 0, sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT
));
1233 pExynosComponent
->hComponentHandle
= (OMX_HANDLETYPE
)pVideoDec
;
1235 pExynosComponent
->bSaveFlagEOS
= OMX_FALSE
;
1236 pExynosComponent
->bBehaviorEOS
= OMX_FALSE
;
1237 pExynosComponent
->bMultiThreadProcess
= OMX_TRUE
;
1240 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
1241 pExynosPort
->portDefinition
.nBufferCountActual
= MAX_VIDEO_INPUTBUFFER_NUM
;
1242 pExynosPort
->portDefinition
.nBufferCountMin
= MAX_VIDEO_INPUTBUFFER_NUM
;
1243 pExynosPort
->portDefinition
.nBufferSize
= 0;
1244 pExynosPort
->portDefinition
.eDomain
= OMX_PortDomainVideo
;
1246 pExynosPort
->portDefinition
.format
.video
.cMIMEType
= Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE
);
1247 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "raw/video");
1248 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
1249 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
1250 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1252 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= 0;
1253 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= 0;
1254 pExynosPort
->portDefinition
.format
.video
.nStride
= 0;
1255 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
1256 pExynosPort
->portDefinition
.format
.video
.nBitrate
= 64000;
1257 pExynosPort
->portDefinition
.format
.video
.xFramerate
= (15 << 16);
1258 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatUnused
;
1259 pExynosPort
->portDefinition
.format
.video
.pNativeWindow
= NULL
;
1262 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1263 pExynosPort
->portDefinition
.nBufferCountActual
= MAX_VIDEO_OUTPUTBUFFER_NUM
;
1264 pExynosPort
->portDefinition
.nBufferCountMin
= MAX_VIDEO_OUTPUTBUFFER_NUM
;
1265 pExynosPort
->portDefinition
.nBufferSize
= DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE
;
1266 pExynosPort
->portDefinition
.eDomain
= OMX_PortDomainVideo
;
1268 pExynosPort
->portDefinition
.format
.video
.cMIMEType
= Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE
);
1269 Exynos_OSAL_Strcpy(pExynosPort
->portDefinition
.format
.video
.cMIMEType
, "raw/video");
1270 pExynosPort
->portDefinition
.format
.video
.pNativeRender
= 0;
1271 pExynosPort
->portDefinition
.format
.video
.bFlagErrorConcealment
= OMX_FALSE
;
1272 pExynosPort
->portDefinition
.format
.video
.eCompressionFormat
= OMX_VIDEO_CodingUnused
;
1274 pExynosPort
->portDefinition
.format
.video
.nFrameWidth
= 0;
1275 pExynosPort
->portDefinition
.format
.video
.nFrameHeight
= 0;
1276 pExynosPort
->portDefinition
.format
.video
.nStride
= 0;
1277 pExynosPort
->portDefinition
.format
.video
.nSliceHeight
= 0;
1278 pExynosPort
->portDefinition
.format
.video
.nBitrate
= 64000;
1279 pExynosPort
->portDefinition
.format
.video
.xFramerate
= (15 << 16);
1280 pExynosPort
->portDefinition
.format
.video
.eColorFormat
= OMX_COLOR_FormatUnused
;
1281 pExynosPort
->portDefinition
.format
.video
.pNativeWindow
= NULL
;
1283 pExynosPort
->processData
.extInfo
= (OMX_PTR
)Exynos_OSAL_Malloc(sizeof(DECODE_CODEC_EXTRA_BUFFERINFO
));
1284 Exynos_OSAL_Memset(((char *)pExynosPort
->processData
.extInfo
), 0, sizeof(DECODE_CODEC_EXTRA_BUFFERINFO
));
1287 DECODE_CODEC_EXTRA_BUFFERINFO
*pBufferInfo
= NULL
;
1288 pBufferInfo
= (DECODE_CODEC_EXTRA_BUFFERINFO
*)(pExynosPort
->processData
.extInfo
);
1289 for (i
= 0; i
< VIDEO_BUFFER_MAX_NUM
; i
++) {
1290 pBufferInfo
->PDSB
.dpbFD
[i
].fd
= -1;
1291 pBufferInfo
->PDSB
.dpbFD
[i
].fd1
= -1;
1292 pBufferInfo
->PDSB
.dpbFD
[i
].fd2
= -1;
1295 pOMXComponent
->UseBuffer
= &Exynos_OMX_UseBuffer
;
1296 pOMXComponent
->AllocateBuffer
= &Exynos_OMX_AllocateBuffer
;
1297 pOMXComponent
->FreeBuffer
= &Exynos_OMX_FreeBuffer
;
1298 pOMXComponent
->ComponentTunnelRequest
= &Exynos_OMX_ComponentTunnelRequest
;
1300 pExynosComponent
->exynos_AllocateTunnelBuffer
= &Exynos_OMX_AllocateTunnelBuffer
;
1301 pExynosComponent
->exynos_FreeTunnelBuffer
= &Exynos_OMX_FreeTunnelBuffer
;
1302 pExynosComponent
->exynos_BufferProcessCreate
= &Exynos_OMX_BufferProcess_Create
;
1303 pExynosComponent
->exynos_BufferProcessTerminate
= &Exynos_OMX_BufferProcess_Terminate
;
1304 pExynosComponent
->exynos_BufferFlush
= &Exynos_OMX_BufferFlush
;
1306 pVideoDec
->hRefHandle
= Exynos_OSAL_RefANB_Create();
1314 OMX_ERRORTYPE
Exynos_OMX_VideoDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent
)
1316 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
1317 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
1318 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
1319 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
1320 EXYNOS_OMX_VIDEODEC_COMPONENT
*pVideoDec
= NULL
;
1325 if (hComponent
== NULL
) {
1326 ret
= OMX_ErrorBadParameter
;
1329 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
1330 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
1331 if (ret
!= OMX_ErrorNone
) {
1335 if (pOMXComponent
->pComponentPrivate
== NULL
) {
1336 ret
= OMX_ErrorBadParameter
;
1339 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
1341 pVideoDec
= (EXYNOS_OMX_VIDEODEC_COMPONENT
*)pExynosComponent
->hComponentHandle
;
1343 Exynos_OSAL_RefANB_Terminate(pVideoDec
->hRefHandle
);
1345 Exynos_OSAL_Free(pVideoDec
);
1346 pExynosComponent
->hComponentHandle
= pVideoDec
= NULL
;
1348 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
1349 if (pExynosPort
->processData
.extInfo
!= NULL
) {
1350 Exynos_OSAL_Free(pExynosPort
->processData
.extInfo
);
1351 pExynosPort
->processData
.extInfo
= NULL
;
1354 for(i
= 0; i
< ALL_PORT_NUM
; i
++) {
1355 pExynosPort
= &pExynosComponent
->pExynosPort
[i
];
1356 Exynos_OSAL_Free(pExynosPort
->portDefinition
.format
.video
.cMIMEType
);
1357 pExynosPort
->portDefinition
.format
.video
.cMIMEType
= NULL
;
1360 ret
= Exynos_OMX_Port_Destructor(pOMXComponent
);
1362 ret
= Exynos_OMX_BaseComponent_Destructor(hComponent
);