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 / Exynos_OMX_Vdec.c
CommitLineData
20d3e6e3
JC
1/*
2 *
38ef2572 3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
20d3e6e3
JC
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18/*
19 * @file Exynos_OMX_Vdec.c
20 * @brief
21 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
22 * HyeYeon Chung (hyeon.chung@samsung.com)
23 * Yunji Kim (yunji.kim@samsung.com)
38ef2572 24 * @version 2.0.0
20d3e6e3 25 * @history
38ef2572 26 * 2012.02.20 : Create
20d3e6e3
JC
27 */
28
29#include <stdio.h>
30#include <stdlib.h>
31#include <string.h>
32#include "Exynos_OMX_Macros.h"
33#include "Exynos_OSAL_Event.h"
34#include "Exynos_OMX_Vdec.h"
38ef2572 35#include "Exynos_OMX_VdecControl.h"
20d3e6e3 36#include "Exynos_OMX_Basecomponent.h"
f8d511af 37#include "Exynos_OSAL_SharedMemory.h"
20d3e6e3
JC
38#include "Exynos_OSAL_Thread.h"
39#include "Exynos_OSAL_Semaphore.h"
40#include "Exynos_OSAL_Mutex.h"
41#include "Exynos_OSAL_ETC.h"
38ef2572 42#include "csc.h"
20d3e6e3
JC
43
44#ifdef USE_ANB
45#include "Exynos_OSAL_Android.h"
46#endif
47
48#undef EXYNOS_LOG_TAG
49#define EXYNOS_LOG_TAG "EXYNOS_VIDEO_DEC"
50#define EXYNOS_LOG_OFF
38ef2572 51//#define EXYNOS_TRACE_ON
20d3e6e3
JC
52#include "Exynos_OSAL_Log.h"
53
54
38ef2572
JC
55int calc_plane(int width, int height)
56{
57 int mbX, mbY;
58
59 mbX = (width + 15)/16;
60 mbY = (height + 15)/16;
61
091c8744
SK
62 /* Alignment for interlaced processing */
63 mbY = (mbY + 1) / 2 * 2;
38ef2572
JC
64
65 return (mbX * 16) * (mbY * 16);
66}
67
20d3e6e3
JC
68inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent)
69{
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];
73
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;
79
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;
88
89 switch(exynosOutputPort->portDefinition.format.video.eColorFormat) {
90 case OMX_COLOR_FormatYUV420Planar:
91 case OMX_COLOR_FormatYUV420SemiPlanar:
92 case OMX_SEC_COLOR_FormatNV12TPhysicalAddress:
20d3e6e3
JC
93 if (width && height)
94 exynosOutputPort->portDefinition.nBufferSize = (width * height * 3) / 2;
95 break;
96 case OMX_SEC_COLOR_FormatNV12Tiled:
97 width = exynosOutputPort->portDefinition.format.video.nFrameWidth;
98 height = exynosOutputPort->portDefinition.format.video.nFrameHeight;
99 if (width && height) {
091c8744
SK
100 int YBufferSize = calc_plane(width, height);
101 int CBufferSize = calc_plane(width, height >> 1);
102 exynosOutputPort->portDefinition.nBufferSize = YBufferSize + CBufferSize;
20d3e6e3
JC
103 }
104 break;
105 default:
106 if (width && height)
107 exynosOutputPort->portDefinition.nBufferSize = width * height * 2;
108 break;
109 }
110 }
111
3e79a27e 112 return;
20d3e6e3
JC
113}
114
f8d511af
SK
115void Exynos_Free_CodecBuffers(
116 OMX_COMPONENTTYPE *pOMXComponent,
117 OMX_U32 nPortIndex)
118{
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;
123
124 OMX_U32 nPlaneCnt = 0;
125 int i, j;
126
127 FunctionIn();
128
129 if (nPortIndex == INPUT_PORT_INDEX) {
130 ppCodecBuffer = &(pVideoDec->pMFCDecInputBuffer[0]);
131 nPlaneCnt = MFC_INPUT_BUFFER_PLANE;
132 } else {
133 ppCodecBuffer = &(pVideoDec->pMFCDecOutputBuffer[0]);
134 nPlaneCnt = MFC_OUTPUT_BUFFER_PLANE;
135 }
136
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]);
142 }
143
144 Exynos_OSAL_Free(ppCodecBuffer[i]);
145 ppCodecBuffer[i] = NULL;
146 }
147 }
148
149 FunctionOut();
150}
151
152OMX_ERRORTYPE Exynos_Allocate_CodecBuffers(
153 OMX_COMPONENTTYPE *pOMXComponent,
154 OMX_U32 nPortIndex,
155 OMX_U32 nBufferCnt,
156 OMX_U32 nPlaneSize[MFC_OUTPUT_BUFFER_PLANE])
157{
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;
163
164 OMX_U32 nPlaneCnt = 0;
165 int i, j;
166
167 FunctionIn();
168
169 if (pVideoDec->bDRMPlayerMode == OMX_TRUE)
170 eMemoryType = SECURE_MEMORY;
171
172 if (nPortIndex == INPUT_PORT_INDEX) {
173 ppCodecBuffer = &(pVideoDec->pMFCDecInputBuffer[0]);
174 nPlaneCnt = MFC_INPUT_BUFFER_PLANE;
175 } else {
176 ppCodecBuffer = &(pVideoDec->pMFCDecOutputBuffer[0]);
177 nPlaneCnt = MFC_OUTPUT_BUFFER_PLANE;
178 }
179
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;
185 goto EXIT;
186 }
187 Exynos_OSAL_Memset(ppCodecBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
188
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;
195 goto EXIT;
196 }
197
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]);
202 }
203
204 ppCodecBuffer[i]->dataSize = 0;
205 }
206
207 return OMX_ErrorNone;
208
209EXIT:
210 Exynos_Free_CodecBuffers(pOMXComponent, nPortIndex);
211
212 FunctionOut();
213
214 return ret;
215}
216
38ef2572 217OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex)
20d3e6e3 218{
38ef2572 219 OMX_BOOL ret = OMX_FALSE;
20d3e6e3 220
38ef2572
JC
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)) {
225 ret = OMX_TRUE;
226 } else {
227 ret = OMX_FALSE;
20d3e6e3
JC
228 }
229
38ef2572
JC
230 return ret;
231}
20d3e6e3 232
81a947ba
SK
233OMX_ERRORTYPE Exynos_ResetAllPortConfig(OMX_COMPONENTTYPE *pOMXComponent)
234{
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];
239
240 /* Input port */
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;
252
253 /* Output 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;
269
270 return ret;
271}
272
38ef2572
JC
273OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData)
274{
275 OMX_ERRORTYPE ret = OMX_ErrorNone;
276 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
ef059a02 277 CODEC_DEC_BUFFER *pInputCodecBuffer = (CODEC_DEC_BUFFER *)codecBuffer;
20d3e6e3 278
ef059a02
SK
279 pData->buffer.singlePlaneBuffer.dataBuffer = pInputCodecBuffer->pVirAddr[0];
280 pData->buffer.singlePlaneBuffer.fd = pInputCodecBuffer->fd[0];
281 pData->allocSize = pInputCodecBuffer->bufferSize[0];
38ef2572
JC
282 pData->dataLen = pInputCodecBuffer->dataSize;
283 pData->usedDataLen = 0;
284 pData->remainDataLen = pInputCodecBuffer->dataSize;
20d3e6e3 285
38ef2572
JC
286 pData->nFlags = 0;
287 pData->timeStamp = 0;
288 pData->pPrivate = codecBuffer;
289 pData->bufferHeader = NULL;
20d3e6e3 290
38ef2572
JC
291 return ret;
292}
20d3e6e3 293
38ef2572
JC
294OMX_ERRORTYPE Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData)
295{
296 OMX_ERRORTYPE ret = OMX_ErrorNone;
297 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
3b1c2e30
SK
298 CODEC_DEC_BUFFER *pCodecBuffer = (CODEC_DEC_BUFFER *)codecBuffer;
299 int i = 0;
300
f8d511af 301 pData->allocSize = 0;
38ef2572
JC
302 pData->dataLen = 0;
303 pData->usedDataLen = 0;
304 pData->remainDataLen = 0;
305
306 pData->nFlags = 0;
307 pData->timeStamp = 0;
308 pData->pPrivate = codecBuffer;
309 pData->bufferHeader = NULL;
20d3e6e3 310
f8d511af
SK
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];
315 }
316
20d3e6e3
JC
317 return ret;
318}
319
38ef2572 320void Exynos_Wait_ProcessPause(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex)
20d3e6e3 321{
38ef2572
JC
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;
20d3e6e3
JC
325
326 FunctionIn();
327
38ef2572 328 exynosOMXPort = &pExynosComponent->pExynosPort[nPortIndex];
20d3e6e3 329
38ef2572
JC
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);
20d3e6e3 338 }
20d3e6e3 339
38ef2572 340 FunctionOut();
20d3e6e3 341
38ef2572
JC
342 return;
343}
800a8d75 344
ef059a02
SK
345OMX_BOOL Exynos_CSC_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *dstOutputData)
346{
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;
354
355 FunctionIn();
356
357 OMX_U32 width = 0, height = 0;
358 int imageSize = 0;
359 OMX_COLOR_FORMATTYPE colorFormat;
360
361 void *pOutputBuf = (void *)outputUseBuffer->bufferHeader->pBuffer;
362 void *pSrcBuf[MAX_BUFFER_PLANE] = {NULL, };
363 void *pYUVBuf[MAX_BUFFER_PLANE] = {NULL, };
364
365 CSC_ERRORCODE cscRet = CSC_ErrorNone;
366 CSC_METHOD csc_method = CSC_METHOD_SW;
367 unsigned int cacheable = 1;
368
369 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)dstOutputData->extInfo;
370
371 width = pBufferInfo->imageWidth;
372 height = pBufferInfo->imageHeight;
373 imageSize = width * height;
374 colorFormat = pBufferInfo->ColorFormat;
375
376 pSrcBuf[0] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[0];
377 pSrcBuf[1] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[1];
378 pSrcBuf[2] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[2];
379
380 pYUVBuf[0] = (unsigned char *)pOutputBuf;
381 pYUVBuf[1] = (unsigned char *)pOutputBuf + imageSize;
382 pYUVBuf[2] = (unsigned char *)pOutputBuf + imageSize + imageSize / 4;
383
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];
389 }
390
391#ifdef USE_ANB
3b1c2e30
SK
392 if ((exynosOutputPort->bIsANBEnabled == OMX_TRUE) ||
393 (exynosOutputPort->bStoreMetaData == OMX_TRUE)) {
ef059a02
SK
394 ExynosVideoPlane planes[MAX_BUFFER_PLANE];
395 OMX_U32 stride;
3b1c2e30
SK
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);
400 }
ef059a02
SK
401 width = stride;
402 outputUseBuffer->dataLen = sizeof(void *);
403
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;
408 } else {
409 pYUVBuf[0] = (unsigned char *)planes[0].fd;
410 pYUVBuf[1] = (unsigned char *)planes[1].fd;
411 pYUVBuf[2] = (unsigned char *)planes[2].fd;
412 }
413 }
414#endif
415 if ((exynosOutputPort->bIsANBEnabled == OMX_FALSE) &&
3b1c2e30 416 (exynosOutputPort->bStoreMetaData == OMX_FALSE) &&
ef059a02
SK
417 (csc_method == CSC_METHOD_HW)) {
418 pYUVBuf[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pOutputBuf);
419 pYUVBuf[1] = NULL;
420 pYUVBuf[2] = NULL;
421 }
422
423 if (pVideoDec->csc_set_format == OMX_FALSE) {
424 csc_set_src_format(
425 pVideoDec->csc_handle, /* handle */
426 width, /* width */
427 height, /* height */
428 0, /* crop_left */
429 0, /* crop_right */
430 width, /* crop_width */
431 height, /* crop_height */
432 omx_2_hal_pixel_format(colorFormat), /* color_format */
433 cacheable); /* cacheable */
434 csc_set_dst_format(
435 pVideoDec->csc_handle, /* handle */
436 width, /* width */
437 height, /* height */
438 0, /* crop_left */
439 0, /* crop_right */
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;
445 }
446 csc_set_src_buffer(
447 pVideoDec->csc_handle, /* handle */
1331dddb 448 pSrcBuf); /* YUV Addr or FD */
ef059a02
SK
449 csc_set_dst_buffer(
450 pVideoDec->csc_handle, /* handle */
1331dddb 451 pYUVBuf); /* YUV Addr or FD */
ef059a02
SK
452 cscRet = csc_convert(pVideoDec->csc_handle);
453 if (cscRet != CSC_ErrorNone)
454 ret = OMX_FALSE;
455 else
456 ret = OMX_TRUE;
457
458#ifdef USE_ANB
459 if (exynosOutputPort->bIsANBEnabled == OMX_TRUE) {
460 Exynos_OSAL_UnlockANB(pOutputBuf);
3b1c2e30
SK
461 } else if (exynosOutputPort->bStoreMetaData == OMX_TRUE) {
462 Exynos_OSAL_UnlockMetaData(pOutputBuf);
ef059a02
SK
463 }
464#endif
465
466EXIT:
467 FunctionOut();
468
469 return ret;
470}
471
38ef2572
JC
472OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *srcInputData)
473{
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;
20d3e6e3 482
38ef2572 483 FunctionIn();
20d3e6e3 484
38ef2572
JC
485 if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
486 if ((srcInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) ||
487 (srcInputData->pPrivate == NULL)) {
488 ret = OMX_FALSE;
20d3e6e3
JC
489 goto EXIT;
490 }
491 }
492
38ef2572
JC
493 if (inputUseBuffer->dataValid == OMX_TRUE) {
494 if (exynosInputPort->bufferProcessType == BUFFER_SHARE) {
495 Exynos_Shared_BufferToData(inputUseBuffer, srcInputData, ONE_PLANE);
20d3e6e3 496
388744c0
SK
497 if (pVideoDec->bDRMPlayerMode == OMX_TRUE) {
498 OMX_PTR dataBuffer = NULL;
499
500 dataBuffer = Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec->hSharedMemory,
501 srcInputData->buffer.singlePlaneBuffer.dataBuffer);
502 if (dataBuffer == NULL) {
503 ret = OMX_FALSE;
504 goto EXIT;
505 }
506
507 srcInputData->buffer.singlePlaneBuffer.dataBuffer = dataBuffer;
508 }
509
38ef2572
JC
510 /* reset dataBuffer */
511 Exynos_ResetDataBuffer(inputUseBuffer);
38ef2572
JC
512 } else if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
513 checkInputStream = inputUseBuffer->bufferHeader->pBuffer + inputUseBuffer->usedDataLen;
514 checkInputStreamLen = inputUseBuffer->remainDataLen;
20d3e6e3 515
38ef2572 516 pExynosComponent->bUseFlagEOF = OMX_TRUE;
20d3e6e3 517
ef059a02
SK
518 copySize = checkInputStreamLen;
519 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_TRUE");
20d3e6e3 520
38ef2572
JC
521 if (((srcInputData->allocSize) - (srcInputData->dataLen)) >= copySize) {
522 if (copySize > 0) {
523 Exynos_OSAL_Memcpy(srcInputData->buffer.singlePlaneBuffer.dataBuffer + srcInputData->dataLen,
524 checkInputStream, copySize);
525 }
20d3e6e3 526
38ef2572
JC
527 inputUseBuffer->dataLen -= copySize;
528 inputUseBuffer->remainDataLen -= copySize;
529 inputUseBuffer->usedDataLen += copySize;
20d3e6e3 530
38ef2572
JC
531 srcInputData->dataLen += copySize;
532 srcInputData->remainDataLen += copySize;
20d3e6e3 533
38ef2572
JC
534 srcInputData->timeStamp = inputUseBuffer->timeStamp;
535 srcInputData->nFlags = inputUseBuffer->nFlags;
536 srcInputData->bufferHeader = inputUseBuffer->bufferHeader;
537 } else {
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);
ef059a02 542 ret = OMX_FALSE;
20d3e6e3 543 }
20d3e6e3 544
f8d511af 545 Exynos_InputBufferReturn(pOMXComponent, inputUseBuffer);
20d3e6e3 546 }
20d3e6e3 547
38ef2572
JC
548 if ((srcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
549 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "bSaveFlagEOS : OMX_TRUE");
38ef2572 550 pExynosComponent->bSaveFlagEOS = OMX_TRUE;
81a947ba
SK
551 if (srcInputData->dataLen != 0)
552 pExynosComponent->bBehaviorEOS = OMX_TRUE;
38ef2572 553 }
20d3e6e3 554
ef059a02
SK
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);
38ef2572 562 }
ef059a02
SK
563
564 ret = OMX_TRUE;
38ef2572 565 }
20d3e6e3 566
20d3e6e3 567EXIT:
20d3e6e3 568
38ef2572 569 FunctionOut();
20d3e6e3 570
20d3e6e3
JC
571 return ret;
572}
573
38ef2572 574OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *dstOutputData)
20d3e6e3 575{
38ef2572
JC
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;
20d3e6e3
JC
583
584 FunctionIn();
585
38ef2572 586 if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
3b1c2e30
SK
587 if ((exynosOutputPort->bIsANBEnabled == OMX_FALSE) &&
588 (exynosOutputPort->bStoreMetaData == OMX_FALSE)) {
38ef2572
JC
589 if (Exynos_Shared_DataToBuffer(dstOutputData, outputUseBuffer) == OMX_ErrorNone)
590 outputUseBuffer->dataValid = OMX_TRUE;
591 } else {
592 if (Exynos_Shared_DataToANBBuffer(dstOutputData, outputUseBuffer, exynosOutputPort) == OMX_ErrorNone) {
593 outputUseBuffer->dataValid = OMX_TRUE;
20d3e6e3 594 } else {
38ef2572
JC
595 ret = OMX_FALSE;
596 goto EXIT;
20d3e6e3
JC
597 }
598 }
20d3e6e3
JC
599 }
600
38ef2572
JC
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;
612 } else {
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);
616 ret = OMX_TRUE;
617 goto EXIT;
618 }
619 } else if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE)) {
620 ret = OMX_TRUE;
621 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "not set check timestame after seeking");
622 goto EXIT;
623 }
20d3e6e3 624
38ef2572
JC
625 if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
626 OMX_U32 width = 0, height = 0;
627 int imageSize = 0;
38ef2572 628 void *pOutputBuf = (void *)outputUseBuffer->bufferHeader->pBuffer;
20d3e6e3 629
38ef2572 630 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)dstOutputData->extInfo;
ef059a02 631
38ef2572
JC
632 width = pBufferInfo->imageWidth;
633 height = pBufferInfo->imageHeight;
634 imageSize = width * height;
20d3e6e3 635
38ef2572
JC
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);
20d3e6e3 640
38ef2572
JC
641 outputUseBuffer->dataLen += copySize;
642 outputUseBuffer->remainDataLen += copySize;
643 outputUseBuffer->nFlags = dstOutputData->nFlags;
644 outputUseBuffer->timeStamp = dstOutputData->timeStamp;
20d3e6e3 645
38ef2572 646 if (outputUseBuffer->remainDataLen > 0) {
ef059a02 647 ret = Exynos_CSC_OutputData(pOMXComponent, dstOutputData);
38ef2572 648 } else {
38ef2572 649 ret = OMX_TRUE;
ef059a02 650 }
20d3e6e3 651
ef059a02 652 if (ret == OMX_TRUE) {
38ef2572
JC
653 if ((outputUseBuffer->remainDataLen > 0) ||
654 ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
655 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
f8d511af 656 Exynos_OutputBufferReturn(pOMXComponent, outputUseBuffer);
38ef2572
JC
657 }
658 } else {
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);
663 ret = OMX_FALSE;
664 }
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;
f8d511af 670 Exynos_OutputBufferReturn(pOMXComponent, outputUseBuffer);
38ef2572
JC
671 } else {
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);
676 ret = OMX_FALSE;
677 }
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)))
f8d511af 682 Exynos_OutputBufferReturn(pOMXComponent, outputUseBuffer);
20d3e6e3 683 }
38ef2572
JC
684 } else {
685 ret = OMX_FALSE;
20d3e6e3 686 }
38ef2572 687
20d3e6e3
JC
688EXIT:
689 FunctionOut();
690
691 return ret;
692}
693
38ef2572 694OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent)
20d3e6e3 695{
38ef2572
JC
696 OMX_ERRORTYPE ret = OMX_ErrorNone;
697 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
20d3e6e3 698 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
38ef2572
JC
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;
20d3e6e3
JC
706
707 FunctionIn();
708
38ef2572
JC
709 while (!pVideoDec->bExitBufferProcessThread) {
710 Exynos_OSAL_SleepMillisec(0);
711 Exynos_Wait_ProcessPause(pExynosComponent, INPUT_PORT_INDEX);
20d3e6e3 712
38ef2572
JC
713 while ((Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) &&
714 (!pVideoDec->bExitBufferProcessThread)) {
715 Exynos_OSAL_SleepMillisec(0);
20d3e6e3 716
38ef2572 717 if ((CHECK_PORT_BEING_FLUSHED(exynosInputPort)) ||
c01f2434 718 ((exynosOutputPort->exceptionFlag != GENERAL_STATE) && (ret == OMX_ErrorInputDataDecodeYet)))
38ef2572
JC
719 break;
720 if (exynosInputPort->portState != OMX_StateIdle)
721 break;
20d3e6e3 722
38ef2572
JC
723 Exynos_OSAL_MutexLock(srcInputUseBuffer->bufferMutex);
724 if (ret != OMX_ErrorInputDataDecodeYet) {
725 if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
726 OMX_PTR codecBuffer;
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);
731 }
732 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
733 break;
734 }
735 }
20d3e6e3 736
38ef2572
JC
737 if (srcInputUseBuffer->dataValid == OMX_TRUE) {
738 bCheckInputData = Exynos_Preprocessor_InputData(pOMXComponent, pSrcInputData);
739 } else {
740 bCheckInputData = OMX_FALSE;
741 }
20d3e6e3 742
38ef2572
JC
743 if ((bCheckInputData == OMX_FALSE) &&
744 (!CHECK_PORT_BEING_FLUSHED(exynosInputPort))) {
745 ret = Exynos_InputBufferGetQueue(pExynosComponent);
746 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
747 break;
748 }
20d3e6e3 749
38ef2572
JC
750 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort)) {
751 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
752 break;
753 }
20d3e6e3
JC
754 }
755
38ef2572
JC
756 ret = pVideoDec->exynos_codec_srcInputProcess(pOMXComponent, pSrcInputData);
757 if (ret != OMX_ErrorInputDataDecodeYet) {
758 Exynos_ResetCodecData(pSrcInputData);
759 }
760 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
761 if (ret == OMX_ErrorCodecInit)
762 pVideoDec->bExitBufferProcessThread = OMX_TRUE;
20d3e6e3 763 }
20d3e6e3 764 }
20d3e6e3 765
38ef2572 766EXIT:
20d3e6e3 767
38ef2572 768 FunctionOut();
20d3e6e3
JC
769
770 return ret;
771}
772
38ef2572 773OMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent)
20d3e6e3
JC
774{
775 OMX_ERRORTYPE ret = OMX_ErrorNone;
38ef2572 776 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
20d3e6e3 777 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
20d3e6e3 778 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
38ef2572
JC
779 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
780 EXYNOS_OMX_DATABUFFER *srcOutputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.outputDataBuffer;
781 EXYNOS_OMX_DATA srcOutputData;
20d3e6e3 782
38ef2572
JC
783 FunctionIn();
784
785 while (!pVideoDec->bExitBufferProcessThread) {
786 Exynos_OSAL_SleepMillisec(0);
20d3e6e3 787
38ef2572
JC
788 while (!pVideoDec->bExitBufferProcessThread) {
789 if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
790 if (Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX) == OMX_FALSE)
791 break;
20d3e6e3 792 }
38ef2572 793 Exynos_OSAL_SleepMillisec(0);
20d3e6e3 794
38ef2572
JC
795 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort))
796 break;
3e79a27e 797
38ef2572
JC
798 Exynos_OSAL_MutexLock(srcOutputUseBuffer->bufferMutex);
799 ret = pVideoDec->exynos_codec_srcOutputProcess(pOMXComponent, &srcOutputData);
800
801 if (ret == OMX_ErrorNone) {
802 if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
803 OMX_PTR codecBuffer;
804 codecBuffer = srcOutputData.pPrivate;
805 if (codecBuffer != NULL)
806 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, codecBuffer);
20d3e6e3 807 }
38ef2572
JC
808 if (exynosInputPort->bufferProcessType == BUFFER_SHARE) {
809 Exynos_Shared_DataToBuffer(&srcOutputData, srcOutputUseBuffer);
f8d511af 810 Exynos_InputBufferReturn(pOMXComponent, srcOutputUseBuffer);
20d3e6e3 811 }
38ef2572 812 Exynos_ResetCodecData(&srcOutputData);
20d3e6e3 813 }
38ef2572 814 Exynos_OSAL_MutexUnlock(srcOutputUseBuffer->bufferMutex);
20d3e6e3 815 }
20d3e6e3
JC
816 }
817
800a8d75 818EXIT:
38ef2572 819
20d3e6e3
JC
820 FunctionOut();
821
822 return ret;
823}
824
38ef2572 825OMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent)
20d3e6e3 826{
38ef2572
JC
827 OMX_ERRORTYPE ret = OMX_ErrorNone;
828 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
20d3e6e3 829 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
38ef2572 830 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
20d3e6e3 831 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
38ef2572
JC
832 EXYNOS_OMX_DATABUFFER *dstInputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.inputDataBuffer;
833 EXYNOS_OMX_DATA dstInputData;
c01f2434 834
20d3e6e3
JC
835 FunctionIn();
836
38ef2572
JC
837 while (!pVideoDec->bExitBufferProcessThread) {
838 Exynos_OSAL_SleepMillisec(0);
20d3e6e3 839
38ef2572
JC
840 while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) &&
841 (!pVideoDec->bExitBufferProcessThread)) {
842 Exynos_OSAL_SleepMillisec(0);
20d3e6e3 843
38ef2572 844 if ((CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) ||
c01f2434
SK
845 (!CHECK_PORT_POPULATED(exynosOutputPort)) ||
846 (exynosOutputPort->exceptionFlag != GENERAL_STATE))
38ef2572
JC
847 break;
848 if (exynosOutputPort->portState != OMX_StateIdle)
849 break;
20d3e6e3 850
38ef2572
JC
851 Exynos_OSAL_MutexLock(dstInputUseBuffer->bufferMutex);
852 if (ret != OMX_ErrorOutputBufferUseYet) {
853 if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
854 OMX_PTR codecBuffer;
855 ret = Exynos_CodecBufferDeQueue(pExynosComponent, OUTPUT_PORT_INDEX, &codecBuffer);
856 if (ret != OMX_ErrorNone) {
857 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
858 break;
859 }
860 Exynos_Output_CodecBufferToData(pExynosComponent, codecBuffer, &dstInputData);
861 }
20d3e6e3 862
38ef2572
JC
863 if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
864 if ((dstInputUseBuffer->dataValid != OMX_TRUE) &&
865 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
866 ret = Exynos_OutputBufferGetQueue(pExynosComponent);
867 if (ret != OMX_ErrorNone) {
868 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
869 break;
870 }
3b1c2e30
SK
871 if ((exynosOutputPort->bIsANBEnabled == OMX_FALSE) &&
872 (exynosOutputPort->bStoreMetaData == OMX_FALSE)) {
38ef2572
JC
873 Exynos_Shared_BufferToData(dstInputUseBuffer, &dstInputData, TWO_PLANE);
874 } else {
875 ret = Exynos_Shared_ANBBufferToData(dstInputUseBuffer, &dstInputData, exynosOutputPort, TWO_PLANE);
876 if (ret != OMX_ErrorNone) {
877 dstInputUseBuffer->dataValid = OMX_FALSE;
878 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
879 break;
880 }
881 }
3b1c2e30 882 Exynos_OSAL_RefANB_Increase(pVideoDec->hRefHandle, dstInputData.bufferHeader->pBuffer);
38ef2572
JC
883 Exynos_ResetDataBuffer(dstInputUseBuffer);
884 }
885 }
20d3e6e3 886
38ef2572
JC
887 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) {
888 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
889 break;
890 }
891 }
20d3e6e3 892
38ef2572
JC
893 ret = pVideoDec->exynos_codec_dstInputProcess(pOMXComponent, &dstInputData);
894 if (ret != OMX_ErrorOutputBufferUseYet) {
895 Exynos_ResetCodecData(&dstInputData);
896 }
897 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
20d3e6e3 898 }
20d3e6e3
JC
899 }
900
901EXIT:
38ef2572 902
20d3e6e3
JC
903 FunctionOut();
904
905 return ret;
906}
907
38ef2572 908OMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent)
20d3e6e3 909{
38ef2572
JC
910 OMX_ERRORTYPE ret = OMX_ErrorNone;
911 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
912 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
20d3e6e3 913 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
38ef2572
JC
914 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
915 EXYNOS_OMX_DATABUFFER *dstOutputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer;
916 EXYNOS_OMX_DATA *pDstOutputData = &exynosOutputPort->processData;
f8d511af 917
20d3e6e3
JC
918 FunctionIn();
919
38ef2572 920 while (!pVideoDec->bExitBufferProcessThread) {
20d3e6e3 921 Exynos_OSAL_SleepMillisec(0);
38ef2572 922 Exynos_Wait_ProcessPause(pExynosComponent, OUTPUT_PORT_INDEX);
20d3e6e3 923
38ef2572
JC
924 while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) &&
925 (!pVideoDec->bExitBufferProcessThread)) {
20d3e6e3
JC
926 Exynos_OSAL_SleepMillisec(0);
927
38ef2572
JC
928 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort))
929 break;
3e79a27e 930
38ef2572
JC
931 Exynos_OSAL_MutexLock(dstOutputUseBuffer->bufferMutex);
932 if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
933 if ((dstOutputUseBuffer->dataValid != OMX_TRUE) &&
934 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
935 ret = Exynos_OutputBufferGetQueue(pExynosComponent);
936 if (ret != OMX_ErrorNone) {
937 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex);
938 break;
20d3e6e3 939 }
20d3e6e3 940 }
38ef2572 941 }
20d3e6e3 942
38ef2572
JC
943 if ((dstOutputUseBuffer->dataValid == OMX_TRUE) ||
944 (exynosOutputPort->bufferProcessType == BUFFER_SHARE))
945 ret = pVideoDec->exynos_codec_dstOutputProcess(pOMXComponent, pDstOutputData);
20d3e6e3 946
38ef2572
JC
947 if (((ret == OMX_ErrorNone) && (dstOutputUseBuffer->dataValid == OMX_TRUE)) ||
948 (exynosOutputPort->bufferProcessType == BUFFER_SHARE)) {
3b1c2e30
SK
949 if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
950 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
951 int i;
952 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
953 for (i = 0; i < VIDEO_BUFFER_MAX_NUM; i++) {
954 if (pBufferInfo->PDSB.dpbFD[i].fd > -1) {
955 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "decRefCnt-FD:%d", pBufferInfo->PDSB.dpbFD[i].fd);
956 Exynos_OSAL_RefANB_Decrease(pVideoDec->hRefHandle, pBufferInfo->PDSB.dpbFD[i].fd);
957 } else {
958 break;
959 }
960 }
961 }
38ef2572 962 Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData);
20d3e6e3
JC
963 }
964
38ef2572 965 if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
3b1c2e30 966 OMX_PTR codecBuffer = pDstOutputData->pPrivate;
38ef2572
JC
967 if (codecBuffer != NULL) {
968 Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, codecBuffer);
969 pDstOutputData->pPrivate = NULL;
970 }
971 }
20d3e6e3 972
38ef2572
JC
973 /* reset outputData */
974 Exynos_ResetCodecData(pDstOutputData);
975 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex);
20d3e6e3
JC
976 }
977 }
978
979EXIT:
980
981 FunctionOut();
982
983 return ret;
984}
985
38ef2572 986static OMX_ERRORTYPE Exynos_OMX_SrcInputProcessThread(OMX_PTR threadData)
20d3e6e3 987{
38ef2572
JC
988 OMX_ERRORTYPE ret = OMX_ErrorNone;
989 OMX_COMPONENTTYPE *pOMXComponent = NULL;
20d3e6e3 990 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
38ef2572 991 EXYNOS_OMX_MESSAGE *message = NULL;
20d3e6e3
JC
992
993 FunctionIn();
994
38ef2572 995 if (threadData == NULL) {
20d3e6e3
JC
996 ret = OMX_ErrorBadParameter;
997 goto EXIT;
998 }
38ef2572 999 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
20d3e6e3
JC
1000 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1001 if (ret != OMX_ErrorNone) {
1002 goto EXIT;
1003 }
20d3e6e3 1004 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
38ef2572 1005 Exynos_OMX_SrcInputBufferProcess(pOMXComponent);
20d3e6e3 1006
38ef2572 1007 Exynos_OSAL_ThreadExit(NULL);
20d3e6e3
JC
1008
1009EXIT:
1010 FunctionOut();
1011
1012 return ret;
1013}
38ef2572
JC
1014
1015static OMX_ERRORTYPE Exynos_OMX_SrcOutputProcessThread(OMX_PTR threadData)
20d3e6e3 1016{
38ef2572
JC
1017 OMX_ERRORTYPE ret = OMX_ErrorNone;
1018 OMX_COMPONENTTYPE *pOMXComponent = NULL;
20d3e6e3 1019 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
38ef2572 1020 EXYNOS_OMX_MESSAGE *message = NULL;
20d3e6e3
JC
1021
1022 FunctionIn();
1023
38ef2572 1024 if (threadData == NULL) {
20d3e6e3
JC
1025 ret = OMX_ErrorBadParameter;
1026 goto EXIT;
1027 }
38ef2572 1028 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
20d3e6e3
JC
1029 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1030 if (ret != OMX_ErrorNone) {
1031 goto EXIT;
1032 }
20d3e6e3 1033 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
38ef2572 1034 Exynos_OMX_SrcOutputBufferProcess(pOMXComponent);
20d3e6e3 1035
38ef2572 1036 Exynos_OSAL_ThreadExit(NULL);
20d3e6e3
JC
1037
1038EXIT:
1039 FunctionOut();
1040
1041 return ret;
1042}
1043
38ef2572 1044static OMX_ERRORTYPE Exynos_OMX_DstInputProcessThread(OMX_PTR threadData)
20d3e6e3 1045{
38ef2572
JC
1046 OMX_ERRORTYPE ret = OMX_ErrorNone;
1047 OMX_COMPONENTTYPE *pOMXComponent = NULL;
20d3e6e3 1048 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
38ef2572 1049 EXYNOS_OMX_MESSAGE *message = NULL;
20d3e6e3
JC
1050
1051 FunctionIn();
1052
38ef2572 1053 if (threadData == NULL) {
20d3e6e3
JC
1054 ret = OMX_ErrorBadParameter;
1055 goto EXIT;
1056 }
38ef2572 1057 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
20d3e6e3
JC
1058 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1059 if (ret != OMX_ErrorNone) {
1060 goto EXIT;
1061 }
20d3e6e3 1062 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
38ef2572 1063 Exynos_OMX_DstInputBufferProcess(pOMXComponent);
20d3e6e3 1064
38ef2572 1065 Exynos_OSAL_ThreadExit(NULL);
20d3e6e3
JC
1066
1067EXIT:
1068 FunctionOut();
1069
1070 return ret;
1071}
1072
38ef2572 1073static OMX_ERRORTYPE Exynos_OMX_DstOutputProcessThread(OMX_PTR threadData)
20d3e6e3 1074{
38ef2572
JC
1075 OMX_ERRORTYPE ret = OMX_ErrorNone;
1076 OMX_COMPONENTTYPE *pOMXComponent = NULL;
20d3e6e3 1077 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
38ef2572 1078 EXYNOS_OMX_MESSAGE *message = NULL;
20d3e6e3
JC
1079
1080 FunctionIn();
1081
38ef2572 1082 if (threadData == NULL) {
20d3e6e3
JC
1083 ret = OMX_ErrorBadParameter;
1084 goto EXIT;
1085 }
38ef2572 1086 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
20d3e6e3
JC
1087 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1088 if (ret != OMX_ErrorNone) {
1089 goto EXIT;
1090 }
20d3e6e3 1091 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
38ef2572 1092 Exynos_OMX_DstOutputBufferProcess(pOMXComponent);
20d3e6e3 1093
38ef2572 1094 Exynos_OSAL_ThreadExit(NULL);
20d3e6e3
JC
1095
1096EXIT:
1097 FunctionOut();
1098
1099 return ret;
1100}
1101
38ef2572 1102OMX_ERRORTYPE Exynos_OMX_BufferProcess_Create(OMX_HANDLETYPE hComponent)
20d3e6e3 1103{
38ef2572
JC
1104 OMX_ERRORTYPE ret = OMX_ErrorNone;
1105 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1106 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1107 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
20d3e6e3
JC
1108
1109 FunctionIn();
1110
38ef2572
JC
1111 pVideoDec->bExitBufferProcessThread = OMX_FALSE;
1112
1113 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hDstOutputThread,
1114 Exynos_OMX_DstOutputProcessThread,
1115 pOMXComponent);
1116 if (ret == OMX_ErrorNone)
1117 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hSrcOutputThread,
1118 Exynos_OMX_SrcOutputProcessThread,
1119 pOMXComponent);
1120 if (ret == OMX_ErrorNone)
1121 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hDstInputThread,
1122 Exynos_OMX_DstInputProcessThread,
1123 pOMXComponent);
1124 if (ret == OMX_ErrorNone)
1125 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hSrcInputThread,
1126 Exynos_OMX_SrcInputProcessThread,
1127 pOMXComponent);
20d3e6e3 1128
38ef2572
JC
1129EXIT:
1130 FunctionOut();
20d3e6e3 1131
38ef2572
JC
1132 return ret;
1133}
20d3e6e3 1134
38ef2572
JC
1135OMX_ERRORTYPE Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent)
1136{
1137 OMX_ERRORTYPE ret = OMX_ErrorNone;
1138 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1139 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1140 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1141 OMX_S32 countValue = 0;
1142 unsigned int i = 0;
1143
1144 FunctionIn();
1145
1146 pVideoDec->bExitBufferProcessThread = OMX_TRUE;
1147
38ef2572
JC
1148 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID, &countValue);
1149 if (countValue == 0)
1150 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID);
1151 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID, &countValue);
1152 if (countValue == 0)
1153 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID);
1154 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent);
1155 Exynos_OSAL_ThreadTerminate(pVideoDec->hSrcInputThread);
1156 pVideoDec->hSrcInputThread = NULL;
1157
38ef2572
JC
1158 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID, &countValue);
1159 if (countValue == 0)
1160 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID);
1161 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID, &countValue);
1162 if (countValue == 0)
1163 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID);
1164 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent);
1165 Exynos_OSAL_ThreadTerminate(pVideoDec->hDstInputThread);
1166 pVideoDec->hDstInputThread = NULL;
1167
38ef2572
JC
1168 pVideoDec->exynos_codec_stop(pOMXComponent, INPUT_PORT_INDEX);
1169 pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX);
1170 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent);
1171 Exynos_OSAL_ThreadTerminate(pVideoDec->hSrcOutputThread);
1172 pVideoDec->hSrcOutputThread = NULL;
1173
38ef2572
JC
1174 pVideoDec->exynos_codec_stop(pOMXComponent, OUTPUT_PORT_INDEX);
1175 pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX);
1176 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent);
1177 Exynos_OSAL_ThreadTerminate(pVideoDec->hDstOutputThread);
1178 pVideoDec->hDstOutputThread = NULL;
1179
81a947ba
SK
1180 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
1181 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
1182
20d3e6e3
JC
1183EXIT:
1184 FunctionOut();
1185
1186 return ret;
1187}
1188
1189OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent)
1190{
38ef2572
JC
1191 OMX_ERRORTYPE ret = OMX_ErrorNone;
1192 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1193 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1194 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
20d3e6e3
JC
1195 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
1196
1197 FunctionIn();
1198
1199 if (hComponent == NULL) {
1200 ret = OMX_ErrorBadParameter;
1201 goto EXIT;
1202 }
1203 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1204 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1205 if (ret != OMX_ErrorNone) {
1206 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1207 goto EXIT;
1208 }
1209
1210 ret = Exynos_OMX_BaseComponent_Constructor(pOMXComponent);
1211 if (ret != OMX_ErrorNone) {
1212 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1213 goto EXIT;
1214 }
1215
1216 ret = Exynos_OMX_Port_Constructor(pOMXComponent);
1217 if (ret != OMX_ErrorNone) {
1218 Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
1219 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1220 goto EXIT;
1221 }
1222
1223 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1224
1225 pVideoDec = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT));
1226 if (pVideoDec == NULL) {
1227 Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
1228 ret = OMX_ErrorInsufficientResources;
1229 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
1230 goto EXIT;
1231 }
1232
1233 Exynos_OSAL_Memset(pVideoDec, 0, sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT));
c01f2434 1234 pVideoDec->bReconfigDPB = OMX_FALSE;
20d3e6e3
JC
1235 pExynosComponent->hComponentHandle = (OMX_HANDLETYPE)pVideoDec;
1236
1237 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
81a947ba 1238 pExynosComponent->bBehaviorEOS = OMX_FALSE;
38ef2572 1239 pExynosComponent->bMultiThreadProcess = OMX_TRUE;
20d3e6e3
JC
1240
1241 /* Input port */
1242 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1243 pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_INPUTBUFFER_NUM;
1244 pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_INPUTBUFFER_NUM;
1245 pExynosPort->portDefinition.nBufferSize = 0;
1246 pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo;
1247
1248 pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
1249 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
1250 pExynosPort->portDefinition.format.video.pNativeRender = 0;
1251 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
1252 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
1253
1254 pExynosPort->portDefinition.format.video.nFrameWidth = 0;
1255 pExynosPort->portDefinition.format.video.nFrameHeight= 0;
1256 pExynosPort->portDefinition.format.video.nStride = 0;
1257 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
1258 pExynosPort->portDefinition.format.video.nBitrate = 64000;
1259 pExynosPort->portDefinition.format.video.xFramerate = (15 << 16);
1260 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
1261 pExynosPort->portDefinition.format.video.pNativeWindow = NULL;
1262
1263 /* Output port */
1264 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1265 pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_OUTPUTBUFFER_NUM;
1266 pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_OUTPUTBUFFER_NUM;
1267 pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
1268 pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo;
1269
1270 pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
1271 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
1272 pExynosPort->portDefinition.format.video.pNativeRender = 0;
1273 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
1274 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
1275
1276 pExynosPort->portDefinition.format.video.nFrameWidth = 0;
1277 pExynosPort->portDefinition.format.video.nFrameHeight= 0;
1278 pExynosPort->portDefinition.format.video.nStride = 0;
1279 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
1280 pExynosPort->portDefinition.format.video.nBitrate = 64000;
1281 pExynosPort->portDefinition.format.video.xFramerate = (15 << 16);
1282 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
1283 pExynosPort->portDefinition.format.video.pNativeWindow = NULL;
1284
38ef2572 1285 pExynosPort->processData.extInfo = (OMX_PTR)Exynos_OSAL_Malloc(sizeof(DECODE_CODEC_EXTRA_BUFFERINFO));
3b1c2e30
SK
1286 Exynos_OSAL_Memset(((char *)pExynosPort->processData.extInfo), 0, sizeof(DECODE_CODEC_EXTRA_BUFFERINFO));
1287{
1288 int i = 0;
1289 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
1290 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)(pExynosPort->processData.extInfo);
1291 for (i = 0; i < VIDEO_BUFFER_MAX_NUM; i++) {
1292 pBufferInfo->PDSB.dpbFD[i].fd = -1;
1293 pBufferInfo->PDSB.dpbFD[i].fd1 = -1;
1294 pBufferInfo->PDSB.dpbFD[i].fd2 = -1;
1295 }
1296}
20d3e6e3
JC
1297 pOMXComponent->UseBuffer = &Exynos_OMX_UseBuffer;
1298 pOMXComponent->AllocateBuffer = &Exynos_OMX_AllocateBuffer;
1299 pOMXComponent->FreeBuffer = &Exynos_OMX_FreeBuffer;
1300 pOMXComponent->ComponentTunnelRequest = &Exynos_OMX_ComponentTunnelRequest;
1301
1302 pExynosComponent->exynos_AllocateTunnelBuffer = &Exynos_OMX_AllocateTunnelBuffer;
1303 pExynosComponent->exynos_FreeTunnelBuffer = &Exynos_OMX_FreeTunnelBuffer;
38ef2572
JC
1304 pExynosComponent->exynos_BufferProcessCreate = &Exynos_OMX_BufferProcess_Create;
1305 pExynosComponent->exynos_BufferProcessTerminate = &Exynos_OMX_BufferProcess_Terminate;
1306 pExynosComponent->exynos_BufferFlush = &Exynos_OMX_BufferFlush;
20d3e6e3 1307
3b1c2e30
SK
1308 pVideoDec->hRefHandle = Exynos_OSAL_RefANB_Create();
1309
20d3e6e3
JC
1310EXIT:
1311 FunctionOut();
1312
1313 return ret;
1314}
1315
1316OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent)
1317{
38ef2572
JC
1318 OMX_ERRORTYPE ret = OMX_ErrorNone;
1319 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1320 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1321 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
20d3e6e3 1322 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
38ef2572 1323 int i = 0;
20d3e6e3
JC
1324
1325 FunctionIn();
1326
1327 if (hComponent == NULL) {
1328 ret = OMX_ErrorBadParameter;
1329 goto EXIT;
1330 }
1331 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1332 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1333 if (ret != OMX_ErrorNone) {
1334 goto EXIT;
1335 }
1336
1337 if (pOMXComponent->pComponentPrivate == NULL) {
1338 ret = OMX_ErrorBadParameter;
1339 goto EXIT;
1340 }
1341 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1342
1343 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
38ef2572 1344
3b1c2e30
SK
1345 Exynos_OSAL_RefANB_Terminate(pVideoDec->hRefHandle);
1346
20d3e6e3
JC
1347 Exynos_OSAL_Free(pVideoDec);
1348 pExynosComponent->hComponentHandle = pVideoDec = NULL;
1349
38ef2572
JC
1350 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1351 if (pExynosPort->processData.extInfo != NULL) {
1352 Exynos_OSAL_Free(pExynosPort->processData.extInfo);
1353 pExynosPort->processData.extInfo = NULL;
1354 }
1355
20d3e6e3
JC
1356 for(i = 0; i < ALL_PORT_NUM; i++) {
1357 pExynosPort = &pExynosComponent->pExynosPort[i];
1358 Exynos_OSAL_Free(pExynosPort->portDefinition.format.video.cMIMEType);
1359 pExynosPort->portDefinition.format.video.cMIMEType = NULL;
1360 }
1361
1362 ret = Exynos_OMX_Port_Destructor(pOMXComponent);
1363
1364 ret = Exynos_OMX_BaseComponent_Destructor(hComponent);
1365
1366EXIT:
1367 FunctionOut();
1368
1369 return ret;
1370}