exynos_omx: multi_thread: Add crop info update code.
[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;
24b40bec
SK
265 pExynosOutputPort->portDefinition.nBufferCountActual = MAX_VIDEO_OUTPUTBUFFER_NUM;
266 pExynosOutputPort->portDefinition.nBufferCountMin = MAX_VIDEO_OUTPUTBUFFER_NUM;
267 pExynosOutputPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
81a947ba
SK
268 pExynosOutputPort->portDefinition.bEnabled = OMX_TRUE;
269 pExynosOutputPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE;
270 pExynosOutputPort->bIsANBEnabled = OMX_FALSE;
271 pExynosOutputPort->portWayType = WAY2_PORT;
272
273 return ret;
274}
275
38ef2572
JC
276OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData)
277{
278 OMX_ERRORTYPE ret = OMX_ErrorNone;
279 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
ef059a02 280 CODEC_DEC_BUFFER *pInputCodecBuffer = (CODEC_DEC_BUFFER *)codecBuffer;
20d3e6e3 281
ef059a02
SK
282 pData->buffer.singlePlaneBuffer.dataBuffer = pInputCodecBuffer->pVirAddr[0];
283 pData->buffer.singlePlaneBuffer.fd = pInputCodecBuffer->fd[0];
284 pData->allocSize = pInputCodecBuffer->bufferSize[0];
38ef2572
JC
285 pData->dataLen = pInputCodecBuffer->dataSize;
286 pData->usedDataLen = 0;
287 pData->remainDataLen = pInputCodecBuffer->dataSize;
20d3e6e3 288
38ef2572
JC
289 pData->nFlags = 0;
290 pData->timeStamp = 0;
291 pData->pPrivate = codecBuffer;
292 pData->bufferHeader = NULL;
20d3e6e3 293
38ef2572
JC
294 return ret;
295}
20d3e6e3 296
38ef2572
JC
297OMX_ERRORTYPE Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData)
298{
299 OMX_ERRORTYPE ret = OMX_ErrorNone;
300 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
3b1c2e30
SK
301 CODEC_DEC_BUFFER *pCodecBuffer = (CODEC_DEC_BUFFER *)codecBuffer;
302 int i = 0;
303
f8d511af 304 pData->allocSize = 0;
38ef2572
JC
305 pData->dataLen = 0;
306 pData->usedDataLen = 0;
307 pData->remainDataLen = 0;
308
309 pData->nFlags = 0;
310 pData->timeStamp = 0;
311 pData->pPrivate = codecBuffer;
312 pData->bufferHeader = NULL;
20d3e6e3 313
f8d511af
SK
314 for (i = 0; i < MAX_BUFFER_PLANE; i++) {
315 pData->buffer.multiPlaneBuffer.dataBuffer[i] = pCodecBuffer->pVirAddr[i];
316 pData->buffer.multiPlaneBuffer.fd[i] = pCodecBuffer->fd[i];
317 pData->allocSize += pCodecBuffer->bufferSize[i];
318 }
319
20d3e6e3
JC
320 return ret;
321}
322
38ef2572 323void Exynos_Wait_ProcessPause(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex)
20d3e6e3 324{
38ef2572
JC
325 EXYNOS_OMX_BASEPORT *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
326 EXYNOS_OMX_BASEPORT *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
327 EXYNOS_OMX_BASEPORT *exynosOMXPort = NULL;
20d3e6e3
JC
328
329 FunctionIn();
330
38ef2572 331 exynosOMXPort = &pExynosComponent->pExynosPort[nPortIndex];
20d3e6e3 332
38ef2572
JC
333 if (((pExynosComponent->currentState == OMX_StatePause) ||
334 (pExynosComponent->currentState == OMX_StateIdle) ||
335 (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) ||
336 (pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle)) &&
337 (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToLoaded) &&
338 (!CHECK_PORT_BEING_FLUSHED(exynosOMXPort))) {
339 Exynos_OSAL_SignalWait(pExynosComponent->pExynosPort[nPortIndex].pauseEvent, DEF_MAX_WAIT_TIME);
340 Exynos_OSAL_SignalReset(pExynosComponent->pExynosPort[nPortIndex].pauseEvent);
20d3e6e3 341 }
20d3e6e3 342
38ef2572 343 FunctionOut();
20d3e6e3 344
38ef2572
JC
345 return;
346}
800a8d75 347
ef059a02
SK
348OMX_BOOL Exynos_CSC_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *dstOutputData)
349{
350 OMX_BOOL ret = OMX_FALSE;
351 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
352 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
353 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
354 EXYNOS_OMX_DATABUFFER *outputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer;
355 OMX_U32 copySize = 0;
356 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
357
358 FunctionIn();
359
360 OMX_U32 width = 0, height = 0;
361 int imageSize = 0;
362 OMX_COLOR_FORMATTYPE colorFormat;
363
364 void *pOutputBuf = (void *)outputUseBuffer->bufferHeader->pBuffer;
365 void *pSrcBuf[MAX_BUFFER_PLANE] = {NULL, };
366 void *pYUVBuf[MAX_BUFFER_PLANE] = {NULL, };
367
368 CSC_ERRORCODE cscRet = CSC_ErrorNone;
369 CSC_METHOD csc_method = CSC_METHOD_SW;
370 unsigned int cacheable = 1;
371
372 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)dstOutputData->extInfo;
373
374 width = pBufferInfo->imageWidth;
375 height = pBufferInfo->imageHeight;
376 imageSize = width * height;
377 colorFormat = pBufferInfo->ColorFormat;
378
379 pSrcBuf[0] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[0];
380 pSrcBuf[1] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[1];
381 pSrcBuf[2] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[2];
382
383 pYUVBuf[0] = (unsigned char *)pOutputBuf;
384 pYUVBuf[1] = (unsigned char *)pOutputBuf + imageSize;
385 pYUVBuf[2] = (unsigned char *)pOutputBuf + imageSize + imageSize / 4;
386
387 csc_get_method(pVideoDec->csc_handle, &csc_method);
388 if (csc_method == CSC_METHOD_HW) {
389 pSrcBuf[0] = dstOutputData->buffer.multiPlaneBuffer.fd[0];
390 pSrcBuf[1] = dstOutputData->buffer.multiPlaneBuffer.fd[1];
391 pSrcBuf[2] = dstOutputData->buffer.multiPlaneBuffer.fd[2];
392 }
393
394#ifdef USE_ANB
3b1c2e30
SK
395 if ((exynosOutputPort->bIsANBEnabled == OMX_TRUE) ||
396 (exynosOutputPort->bStoreMetaData == OMX_TRUE)) {
ef059a02
SK
397 ExynosVideoPlane planes[MAX_BUFFER_PLANE];
398 OMX_U32 stride;
3b1c2e30 399 if (exynosOutputPort->bIsANBEnabled == OMX_TRUE) {
1e339948 400 Exynos_OSAL_LockANBHandle(pOutputBuf, width, height, exynosOutputPort->portDefinition.format.video.eColorFormat, &stride, planes);
3b1c2e30
SK
401 } else if (exynosOutputPort->bStoreMetaData == OMX_TRUE) {
402 Exynos_OSAL_LockMetaData(pOutputBuf, width, height, exynosOutputPort->portDefinition.format.video.eColorFormat, &stride, planes);
403 }
ef059a02
SK
404 width = stride;
405 outputUseBuffer->dataLen = sizeof(void *);
406
407 if (csc_method == CSC_METHOD_SW) {
408 pYUVBuf[0] = (unsigned char *)planes[0].addr;
409 pYUVBuf[1] = (unsigned char *)planes[1].addr;
410 pYUVBuf[2] = (unsigned char *)planes[2].addr;
411 } else {
412 pYUVBuf[0] = (unsigned char *)planes[0].fd;
413 pYUVBuf[1] = (unsigned char *)planes[1].fd;
414 pYUVBuf[2] = (unsigned char *)planes[2].fd;
415 }
416 }
417#endif
418 if ((exynosOutputPort->bIsANBEnabled == OMX_FALSE) &&
3b1c2e30 419 (exynosOutputPort->bStoreMetaData == OMX_FALSE) &&
ef059a02
SK
420 (csc_method == CSC_METHOD_HW)) {
421 pYUVBuf[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pOutputBuf);
422 pYUVBuf[1] = NULL;
423 pYUVBuf[2] = NULL;
424 }
425
426 if (pVideoDec->csc_set_format == OMX_FALSE) {
427 csc_set_src_format(
428 pVideoDec->csc_handle, /* handle */
429 width, /* width */
430 height, /* height */
431 0, /* crop_left */
432 0, /* crop_right */
433 width, /* crop_width */
434 height, /* crop_height */
435 omx_2_hal_pixel_format(colorFormat), /* color_format */
436 cacheable); /* cacheable */
437 csc_set_dst_format(
438 pVideoDec->csc_handle, /* handle */
439 width, /* width */
440 height, /* height */
441 0, /* crop_left */
442 0, /* crop_right */
443 width, /* crop_width */
444 height, /* crop_height */
445 omx_2_hal_pixel_format(exynosOutputPort->portDefinition.format.video.eColorFormat), /* color_format */
446 cacheable); /* cacheable */
447 pVideoDec->csc_set_format = OMX_TRUE;
448 }
449 csc_set_src_buffer(
450 pVideoDec->csc_handle, /* handle */
1331dddb 451 pSrcBuf); /* YUV Addr or FD */
ef059a02
SK
452 csc_set_dst_buffer(
453 pVideoDec->csc_handle, /* handle */
1331dddb 454 pYUVBuf); /* YUV Addr or FD */
ef059a02
SK
455 cscRet = csc_convert(pVideoDec->csc_handle);
456 if (cscRet != CSC_ErrorNone)
457 ret = OMX_FALSE;
458 else
459 ret = OMX_TRUE;
460
461#ifdef USE_ANB
462 if (exynosOutputPort->bIsANBEnabled == OMX_TRUE) {
1e339948 463 Exynos_OSAL_UnlockANBHandle(pOutputBuf);
3b1c2e30
SK
464 } else if (exynosOutputPort->bStoreMetaData == OMX_TRUE) {
465 Exynos_OSAL_UnlockMetaData(pOutputBuf);
ef059a02
SK
466 }
467#endif
468
469EXIT:
470 FunctionOut();
471
472 return ret;
473}
474
38ef2572
JC
475OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *srcInputData)
476{
477 OMX_BOOL ret = OMX_FALSE;
478 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
479 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
480 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
481 EXYNOS_OMX_DATABUFFER *inputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer;
482 OMX_U32 copySize = 0;
483 OMX_BYTE checkInputStream = NULL;
484 OMX_U32 checkInputStreamLen = 0;
20d3e6e3 485
38ef2572 486 FunctionIn();
20d3e6e3 487
38ef2572
JC
488 if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
489 if ((srcInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) ||
490 (srcInputData->pPrivate == NULL)) {
491 ret = OMX_FALSE;
20d3e6e3
JC
492 goto EXIT;
493 }
494 }
495
38ef2572
JC
496 if (inputUseBuffer->dataValid == OMX_TRUE) {
497 if (exynosInputPort->bufferProcessType == BUFFER_SHARE) {
498 Exynos_Shared_BufferToData(inputUseBuffer, srcInputData, ONE_PLANE);
20d3e6e3 499
388744c0
SK
500 if (pVideoDec->bDRMPlayerMode == OMX_TRUE) {
501 OMX_PTR dataBuffer = NULL;
502
503 dataBuffer = Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec->hSharedMemory,
504 srcInputData->buffer.singlePlaneBuffer.dataBuffer);
505 if (dataBuffer == NULL) {
506 ret = OMX_FALSE;
507 goto EXIT;
508 }
509
510 srcInputData->buffer.singlePlaneBuffer.dataBuffer = dataBuffer;
511 }
512
38ef2572
JC
513 /* reset dataBuffer */
514 Exynos_ResetDataBuffer(inputUseBuffer);
38ef2572
JC
515 } else if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
516 checkInputStream = inputUseBuffer->bufferHeader->pBuffer + inputUseBuffer->usedDataLen;
517 checkInputStreamLen = inputUseBuffer->remainDataLen;
20d3e6e3 518
38ef2572 519 pExynosComponent->bUseFlagEOF = OMX_TRUE;
20d3e6e3 520
ef059a02
SK
521 copySize = checkInputStreamLen;
522 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_TRUE");
20d3e6e3 523
38ef2572
JC
524 if (((srcInputData->allocSize) - (srcInputData->dataLen)) >= copySize) {
525 if (copySize > 0) {
526 Exynos_OSAL_Memcpy(srcInputData->buffer.singlePlaneBuffer.dataBuffer + srcInputData->dataLen,
527 checkInputStream, copySize);
528 }
20d3e6e3 529
38ef2572
JC
530 inputUseBuffer->dataLen -= copySize;
531 inputUseBuffer->remainDataLen -= copySize;
532 inputUseBuffer->usedDataLen += copySize;
20d3e6e3 533
38ef2572
JC
534 srcInputData->dataLen += copySize;
535 srcInputData->remainDataLen += copySize;
20d3e6e3 536
38ef2572
JC
537 srcInputData->timeStamp = inputUseBuffer->timeStamp;
538 srcInputData->nFlags = inputUseBuffer->nFlags;
539 srcInputData->bufferHeader = inputUseBuffer->bufferHeader;
540 } else {
541 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "input codec buffer is smaller than decoded input data size Out Length");
542 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
543 pExynosComponent->callbackData,
544 OMX_EventError, OMX_ErrorUndefined, 0, NULL);
ef059a02 545 ret = OMX_FALSE;
20d3e6e3 546 }
20d3e6e3 547
f8d511af 548 Exynos_InputBufferReturn(pOMXComponent, inputUseBuffer);
20d3e6e3 549 }
20d3e6e3 550
38ef2572
JC
551 if ((srcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
552 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "bSaveFlagEOS : OMX_TRUE");
38ef2572 553 pExynosComponent->bSaveFlagEOS = OMX_TRUE;
81a947ba
SK
554 if (srcInputData->dataLen != 0)
555 pExynosComponent->bBehaviorEOS = OMX_TRUE;
38ef2572 556 }
20d3e6e3 557
ef059a02
SK
558 if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
559 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_TRUE;
560 pExynosComponent->checkTimeStamp.startTimeStamp = srcInputData->timeStamp;
561 pExynosComponent->checkTimeStamp.nStartFlags = srcInputData->nFlags;
562 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
563 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "first frame timestamp after seeking %lld us (%.2f secs)",
564 srcInputData->timeStamp, srcInputData->timeStamp / 1E6);
38ef2572 565 }
ef059a02
SK
566
567 ret = OMX_TRUE;
38ef2572 568 }
20d3e6e3 569
20d3e6e3 570EXIT:
20d3e6e3 571
38ef2572 572 FunctionOut();
20d3e6e3 573
20d3e6e3
JC
574 return ret;
575}
576
38ef2572 577OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *dstOutputData)
20d3e6e3 578{
38ef2572
JC
579 OMX_BOOL ret = OMX_FALSE;
580 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
581 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
582 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
583 EXYNOS_OMX_DATABUFFER *outputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer;
584 OMX_U32 copySize = 0;
585 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
20d3e6e3
JC
586
587 FunctionIn();
588
38ef2572 589 if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
3b1c2e30
SK
590 if ((exynosOutputPort->bIsANBEnabled == OMX_FALSE) &&
591 (exynosOutputPort->bStoreMetaData == OMX_FALSE)) {
38ef2572
JC
592 if (Exynos_Shared_DataToBuffer(dstOutputData, outputUseBuffer) == OMX_ErrorNone)
593 outputUseBuffer->dataValid = OMX_TRUE;
594 } else {
595 if (Exynos_Shared_DataToANBBuffer(dstOutputData, outputUseBuffer, exynosOutputPort) == OMX_ErrorNone) {
596 outputUseBuffer->dataValid = OMX_TRUE;
20d3e6e3 597 } else {
38ef2572
JC
598 ret = OMX_FALSE;
599 goto EXIT;
20d3e6e3
JC
600 }
601 }
20d3e6e3
JC
602 }
603
38ef2572
JC
604 if (outputUseBuffer->dataValid == OMX_TRUE) {
605 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out timestamp after seeking %lld us (%.2f secs)",
606 dstOutputData->timeStamp, dstOutputData->timeStamp / 1E6);
607 if ((pExynosComponent->checkTimeStamp.needCheckStartTimeStamp == OMX_TRUE) &&
608 ((dstOutputData->nFlags & OMX_BUFFERFLAG_EOS) != OMX_BUFFERFLAG_EOS)) {
609 if ((pExynosComponent->checkTimeStamp.startTimeStamp == dstOutputData->timeStamp) &&
610 (pExynosComponent->checkTimeStamp.nStartFlags == dstOutputData->nFlags)){
611 pExynosComponent->checkTimeStamp.startTimeStamp = -19761123;
612 pExynosComponent->checkTimeStamp.nStartFlags = 0x0;
613 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
614 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
615 } else {
616 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "drop frame after seeking", pExynosComponent);
617 if (exynosOutputPort->bufferProcessType == BUFFER_SHARE)
618 Exynos_OMX_FillThisBuffer(pOMXComponent, outputUseBuffer->bufferHeader);
619 ret = OMX_TRUE;
620 goto EXIT;
621 }
622 } else if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE)) {
623 ret = OMX_TRUE;
624 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "not set check timestame after seeking");
625 goto EXIT;
626 }
20d3e6e3 627
38ef2572
JC
628 if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
629 OMX_U32 width = 0, height = 0;
630 int imageSize = 0;
38ef2572 631 void *pOutputBuf = (void *)outputUseBuffer->bufferHeader->pBuffer;
20d3e6e3 632
38ef2572 633 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)dstOutputData->extInfo;
ef059a02 634
38ef2572
JC
635 width = pBufferInfo->imageWidth;
636 height = pBufferInfo->imageHeight;
637 imageSize = width * height;
20d3e6e3 638
38ef2572
JC
639 if ((dstOutputData->remainDataLen <= (outputUseBuffer->allocSize - outputUseBuffer->dataLen)) &&
640 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
641 copySize = dstOutputData->remainDataLen;
642 Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"copySize: %d", copySize);
20d3e6e3 643
38ef2572
JC
644 outputUseBuffer->dataLen += copySize;
645 outputUseBuffer->remainDataLen += copySize;
646 outputUseBuffer->nFlags = dstOutputData->nFlags;
647 outputUseBuffer->timeStamp = dstOutputData->timeStamp;
20d3e6e3 648
38ef2572 649 if (outputUseBuffer->remainDataLen > 0) {
ef059a02 650 ret = Exynos_CSC_OutputData(pOMXComponent, dstOutputData);
38ef2572 651 } else {
38ef2572 652 ret = OMX_TRUE;
ef059a02 653 }
20d3e6e3 654
ef059a02 655 if (ret == OMX_TRUE) {
38ef2572
JC
656 if ((outputUseBuffer->remainDataLen > 0) ||
657 ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
658 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
f8d511af 659 Exynos_OutputBufferReturn(pOMXComponent, outputUseBuffer);
38ef2572
JC
660 }
661 } else {
662 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "csc_convert Error");
663 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
664 pExynosComponent->callbackData,
665 OMX_EventError, OMX_ErrorUndefined, 0, NULL);
666 ret = OMX_FALSE;
667 }
668 } else if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) {
669 outputUseBuffer->dataLen = 0;
670 outputUseBuffer->remainDataLen = 0;
671 outputUseBuffer->nFlags = dstOutputData->nFlags;
672 outputUseBuffer->timeStamp = dstOutputData->timeStamp;
f8d511af 673 Exynos_OutputBufferReturn(pOMXComponent, outputUseBuffer);
38ef2572
JC
674 } else {
675 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "output buffer is smaller than decoded data size Out Length");
676 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
677 pExynosComponent->callbackData,
678 OMX_EventError, OMX_ErrorUndefined, 0, NULL);
679 ret = OMX_FALSE;
680 }
681 } else if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
682 if ((outputUseBuffer->remainDataLen > 0) ||
683 ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
684 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)))
f8d511af 685 Exynos_OutputBufferReturn(pOMXComponent, outputUseBuffer);
20d3e6e3 686 }
38ef2572
JC
687 } else {
688 ret = OMX_FALSE;
20d3e6e3 689 }
38ef2572 690
20d3e6e3
JC
691EXIT:
692 FunctionOut();
693
694 return ret;
695}
696
38ef2572 697OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent)
20d3e6e3 698{
38ef2572
JC
699 OMX_ERRORTYPE ret = OMX_ErrorNone;
700 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
20d3e6e3 701 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
38ef2572
JC
702 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
703 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
704 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
705 EXYNOS_OMX_DATABUFFER *srcInputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer;
706 EXYNOS_OMX_DATA *pSrcInputData = &exynosInputPort->processData;
707 OMX_BOOL bCheckInputData = OMX_FALSE;
708 OMX_BOOL bValidCodecData = OMX_FALSE;
20d3e6e3
JC
709
710 FunctionIn();
711
38ef2572
JC
712 while (!pVideoDec->bExitBufferProcessThread) {
713 Exynos_OSAL_SleepMillisec(0);
714 Exynos_Wait_ProcessPause(pExynosComponent, INPUT_PORT_INDEX);
20d3e6e3 715
38ef2572
JC
716 while ((Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) &&
717 (!pVideoDec->bExitBufferProcessThread)) {
718 Exynos_OSAL_SleepMillisec(0);
20d3e6e3 719
38ef2572 720 if ((CHECK_PORT_BEING_FLUSHED(exynosInputPort)) ||
c01f2434 721 ((exynosOutputPort->exceptionFlag != GENERAL_STATE) && (ret == OMX_ErrorInputDataDecodeYet)))
38ef2572
JC
722 break;
723 if (exynosInputPort->portState != OMX_StateIdle)
724 break;
20d3e6e3 725
38ef2572
JC
726 Exynos_OSAL_MutexLock(srcInputUseBuffer->bufferMutex);
727 if (ret != OMX_ErrorInputDataDecodeYet) {
728 if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
729 OMX_PTR codecBuffer;
730 if ((pSrcInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) || (pSrcInputData->pPrivate == NULL)) {
731 Exynos_CodecBufferDeQueue(pExynosComponent, INPUT_PORT_INDEX, &codecBuffer);
732 if (codecBuffer != NULL) {
733 Exynos_Input_CodecBufferToData(pExynosComponent, codecBuffer, pSrcInputData);
734 }
735 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
736 break;
737 }
738 }
20d3e6e3 739
38ef2572
JC
740 if (srcInputUseBuffer->dataValid == OMX_TRUE) {
741 bCheckInputData = Exynos_Preprocessor_InputData(pOMXComponent, pSrcInputData);
742 } else {
743 bCheckInputData = OMX_FALSE;
744 }
20d3e6e3 745
38ef2572
JC
746 if ((bCheckInputData == OMX_FALSE) &&
747 (!CHECK_PORT_BEING_FLUSHED(exynosInputPort))) {
748 ret = Exynos_InputBufferGetQueue(pExynosComponent);
749 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
750 break;
751 }
20d3e6e3 752
38ef2572
JC
753 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort)) {
754 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
755 break;
756 }
20d3e6e3
JC
757 }
758
38ef2572
JC
759 ret = pVideoDec->exynos_codec_srcInputProcess(pOMXComponent, pSrcInputData);
760 if (ret != OMX_ErrorInputDataDecodeYet) {
761 Exynos_ResetCodecData(pSrcInputData);
762 }
763 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
764 if (ret == OMX_ErrorCodecInit)
765 pVideoDec->bExitBufferProcessThread = OMX_TRUE;
20d3e6e3 766 }
20d3e6e3 767 }
20d3e6e3 768
38ef2572 769EXIT:
20d3e6e3 770
38ef2572 771 FunctionOut();
20d3e6e3
JC
772
773 return ret;
774}
775
38ef2572 776OMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent)
20d3e6e3
JC
777{
778 OMX_ERRORTYPE ret = OMX_ErrorNone;
38ef2572 779 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
20d3e6e3 780 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
20d3e6e3 781 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
38ef2572
JC
782 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
783 EXYNOS_OMX_DATABUFFER *srcOutputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.outputDataBuffer;
784 EXYNOS_OMX_DATA srcOutputData;
20d3e6e3 785
38ef2572
JC
786 FunctionIn();
787
788 while (!pVideoDec->bExitBufferProcessThread) {
789 Exynos_OSAL_SleepMillisec(0);
20d3e6e3 790
38ef2572
JC
791 while (!pVideoDec->bExitBufferProcessThread) {
792 if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
793 if (Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX) == OMX_FALSE)
794 break;
20d3e6e3 795 }
38ef2572 796 Exynos_OSAL_SleepMillisec(0);
20d3e6e3 797
38ef2572
JC
798 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort))
799 break;
3e79a27e 800
38ef2572
JC
801 Exynos_OSAL_MutexLock(srcOutputUseBuffer->bufferMutex);
802 ret = pVideoDec->exynos_codec_srcOutputProcess(pOMXComponent, &srcOutputData);
803
804 if (ret == OMX_ErrorNone) {
805 if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
806 OMX_PTR codecBuffer;
807 codecBuffer = srcOutputData.pPrivate;
808 if (codecBuffer != NULL)
809 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, codecBuffer);
20d3e6e3 810 }
38ef2572
JC
811 if (exynosInputPort->bufferProcessType == BUFFER_SHARE) {
812 Exynos_Shared_DataToBuffer(&srcOutputData, srcOutputUseBuffer);
f8d511af 813 Exynos_InputBufferReturn(pOMXComponent, srcOutputUseBuffer);
20d3e6e3 814 }
38ef2572 815 Exynos_ResetCodecData(&srcOutputData);
20d3e6e3 816 }
38ef2572 817 Exynos_OSAL_MutexUnlock(srcOutputUseBuffer->bufferMutex);
20d3e6e3 818 }
20d3e6e3
JC
819 }
820
800a8d75 821EXIT:
38ef2572 822
20d3e6e3
JC
823 FunctionOut();
824
825 return ret;
826}
827
38ef2572 828OMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent)
20d3e6e3 829{
38ef2572
JC
830 OMX_ERRORTYPE ret = OMX_ErrorNone;
831 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
20d3e6e3 832 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
38ef2572 833 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
20d3e6e3 834 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
38ef2572
JC
835 EXYNOS_OMX_DATABUFFER *dstInputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.inputDataBuffer;
836 EXYNOS_OMX_DATA dstInputData;
c01f2434 837
20d3e6e3
JC
838 FunctionIn();
839
38ef2572
JC
840 while (!pVideoDec->bExitBufferProcessThread) {
841 Exynos_OSAL_SleepMillisec(0);
20d3e6e3 842
38ef2572
JC
843 while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) &&
844 (!pVideoDec->bExitBufferProcessThread)) {
845 Exynos_OSAL_SleepMillisec(0);
20d3e6e3 846
38ef2572 847 if ((CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) ||
c01f2434
SK
848 (!CHECK_PORT_POPULATED(exynosOutputPort)) ||
849 (exynosOutputPort->exceptionFlag != GENERAL_STATE))
38ef2572
JC
850 break;
851 if (exynosOutputPort->portState != OMX_StateIdle)
852 break;
20d3e6e3 853
38ef2572
JC
854 Exynos_OSAL_MutexLock(dstInputUseBuffer->bufferMutex);
855 if (ret != OMX_ErrorOutputBufferUseYet) {
856 if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
857 OMX_PTR codecBuffer;
858 ret = Exynos_CodecBufferDeQueue(pExynosComponent, OUTPUT_PORT_INDEX, &codecBuffer);
859 if (ret != OMX_ErrorNone) {
860 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
861 break;
862 }
863 Exynos_Output_CodecBufferToData(pExynosComponent, codecBuffer, &dstInputData);
864 }
20d3e6e3 865
38ef2572
JC
866 if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
867 if ((dstInputUseBuffer->dataValid != OMX_TRUE) &&
868 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
869 ret = Exynos_OutputBufferGetQueue(pExynosComponent);
870 if (ret != OMX_ErrorNone) {
871 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
872 break;
873 }
3b1c2e30
SK
874 if ((exynosOutputPort->bIsANBEnabled == OMX_FALSE) &&
875 (exynosOutputPort->bStoreMetaData == OMX_FALSE)) {
38ef2572
JC
876 Exynos_Shared_BufferToData(dstInputUseBuffer, &dstInputData, TWO_PLANE);
877 } else {
878 ret = Exynos_Shared_ANBBufferToData(dstInputUseBuffer, &dstInputData, exynosOutputPort, TWO_PLANE);
879 if (ret != OMX_ErrorNone) {
880 dstInputUseBuffer->dataValid = OMX_FALSE;
881 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
882 break;
883 }
884 }
ae68c595
SK
885
886 OMX_PTR pBufferHandle = dstInputData.bufferHeader->pBuffer;
887 if (exynosOutputPort->bStoreMetaData == OMX_TRUE)
888 Exynos_OSAL_GetInfoFromMetaData(dstInputData.bufferHeader->pBuffer, &pBufferHandle);
889 Exynos_OSAL_RefANB_Increase(pVideoDec->hRefHandle, pBufferHandle);
38ef2572
JC
890 Exynos_ResetDataBuffer(dstInputUseBuffer);
891 }
892 }
20d3e6e3 893
38ef2572
JC
894 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) {
895 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
896 break;
897 }
898 }
20d3e6e3 899
38ef2572
JC
900 ret = pVideoDec->exynos_codec_dstInputProcess(pOMXComponent, &dstInputData);
901 if (ret != OMX_ErrorOutputBufferUseYet) {
902 Exynos_ResetCodecData(&dstInputData);
903 }
904 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
20d3e6e3 905 }
20d3e6e3
JC
906 }
907
908EXIT:
38ef2572 909
20d3e6e3
JC
910 FunctionOut();
911
912 return ret;
913}
914
38ef2572 915OMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent)
20d3e6e3 916{
38ef2572
JC
917 OMX_ERRORTYPE ret = OMX_ErrorNone;
918 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
919 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
20d3e6e3 920 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
38ef2572
JC
921 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
922 EXYNOS_OMX_DATABUFFER *dstOutputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer;
923 EXYNOS_OMX_DATA *pDstOutputData = &exynosOutputPort->processData;
f8d511af 924
20d3e6e3
JC
925 FunctionIn();
926
38ef2572 927 while (!pVideoDec->bExitBufferProcessThread) {
20d3e6e3 928 Exynos_OSAL_SleepMillisec(0);
38ef2572 929 Exynos_Wait_ProcessPause(pExynosComponent, OUTPUT_PORT_INDEX);
20d3e6e3 930
38ef2572
JC
931 while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) &&
932 (!pVideoDec->bExitBufferProcessThread)) {
20d3e6e3
JC
933 Exynos_OSAL_SleepMillisec(0);
934
38ef2572
JC
935 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort))
936 break;
3e79a27e 937
38ef2572
JC
938 Exynos_OSAL_MutexLock(dstOutputUseBuffer->bufferMutex);
939 if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
940 if ((dstOutputUseBuffer->dataValid != OMX_TRUE) &&
941 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
942 ret = Exynos_OutputBufferGetQueue(pExynosComponent);
943 if (ret != OMX_ErrorNone) {
944 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex);
945 break;
20d3e6e3 946 }
20d3e6e3 947 }
38ef2572 948 }
20d3e6e3 949
38ef2572
JC
950 if ((dstOutputUseBuffer->dataValid == OMX_TRUE) ||
951 (exynosOutputPort->bufferProcessType == BUFFER_SHARE))
952 ret = pVideoDec->exynos_codec_dstOutputProcess(pOMXComponent, pDstOutputData);
20d3e6e3 953
38ef2572
JC
954 if (((ret == OMX_ErrorNone) && (dstOutputUseBuffer->dataValid == OMX_TRUE)) ||
955 (exynosOutputPort->bufferProcessType == BUFFER_SHARE)) {
3b1c2e30
SK
956 if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
957 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
958 int i;
959 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
960 for (i = 0; i < VIDEO_BUFFER_MAX_NUM; i++) {
961 if (pBufferInfo->PDSB.dpbFD[i].fd > -1) {
962 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "decRefCnt-FD:%d", pBufferInfo->PDSB.dpbFD[i].fd);
963 Exynos_OSAL_RefANB_Decrease(pVideoDec->hRefHandle, pBufferInfo->PDSB.dpbFD[i].fd);
964 } else {
965 break;
966 }
967 }
968 }
38ef2572 969 Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData);
20d3e6e3
JC
970 }
971
38ef2572 972 if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
3b1c2e30 973 OMX_PTR codecBuffer = pDstOutputData->pPrivate;
38ef2572
JC
974 if (codecBuffer != NULL) {
975 Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, codecBuffer);
976 pDstOutputData->pPrivate = NULL;
977 }
978 }
20d3e6e3 979
38ef2572
JC
980 /* reset outputData */
981 Exynos_ResetCodecData(pDstOutputData);
982 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex);
20d3e6e3
JC
983 }
984 }
985
986EXIT:
987
988 FunctionOut();
989
990 return ret;
991}
992
38ef2572 993static OMX_ERRORTYPE Exynos_OMX_SrcInputProcessThread(OMX_PTR threadData)
20d3e6e3 994{
38ef2572
JC
995 OMX_ERRORTYPE ret = OMX_ErrorNone;
996 OMX_COMPONENTTYPE *pOMXComponent = NULL;
20d3e6e3 997 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
38ef2572 998 EXYNOS_OMX_MESSAGE *message = NULL;
20d3e6e3
JC
999
1000 FunctionIn();
1001
38ef2572 1002 if (threadData == NULL) {
20d3e6e3
JC
1003 ret = OMX_ErrorBadParameter;
1004 goto EXIT;
1005 }
38ef2572 1006 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
20d3e6e3
JC
1007 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1008 if (ret != OMX_ErrorNone) {
1009 goto EXIT;
1010 }
20d3e6e3 1011 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
38ef2572 1012 Exynos_OMX_SrcInputBufferProcess(pOMXComponent);
20d3e6e3 1013
38ef2572 1014 Exynos_OSAL_ThreadExit(NULL);
20d3e6e3
JC
1015
1016EXIT:
1017 FunctionOut();
1018
1019 return ret;
1020}
38ef2572
JC
1021
1022static OMX_ERRORTYPE Exynos_OMX_SrcOutputProcessThread(OMX_PTR threadData)
20d3e6e3 1023{
38ef2572
JC
1024 OMX_ERRORTYPE ret = OMX_ErrorNone;
1025 OMX_COMPONENTTYPE *pOMXComponent = NULL;
20d3e6e3 1026 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
38ef2572 1027 EXYNOS_OMX_MESSAGE *message = NULL;
20d3e6e3
JC
1028
1029 FunctionIn();
1030
38ef2572 1031 if (threadData == NULL) {
20d3e6e3
JC
1032 ret = OMX_ErrorBadParameter;
1033 goto EXIT;
1034 }
38ef2572 1035 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
20d3e6e3
JC
1036 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1037 if (ret != OMX_ErrorNone) {
1038 goto EXIT;
1039 }
20d3e6e3 1040 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
38ef2572 1041 Exynos_OMX_SrcOutputBufferProcess(pOMXComponent);
20d3e6e3 1042
38ef2572 1043 Exynos_OSAL_ThreadExit(NULL);
20d3e6e3
JC
1044
1045EXIT:
1046 FunctionOut();
1047
1048 return ret;
1049}
1050
38ef2572 1051static OMX_ERRORTYPE Exynos_OMX_DstInputProcessThread(OMX_PTR threadData)
20d3e6e3 1052{
38ef2572
JC
1053 OMX_ERRORTYPE ret = OMX_ErrorNone;
1054 OMX_COMPONENTTYPE *pOMXComponent = NULL;
20d3e6e3 1055 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
38ef2572 1056 EXYNOS_OMX_MESSAGE *message = NULL;
20d3e6e3
JC
1057
1058 FunctionIn();
1059
38ef2572 1060 if (threadData == NULL) {
20d3e6e3
JC
1061 ret = OMX_ErrorBadParameter;
1062 goto EXIT;
1063 }
38ef2572 1064 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
20d3e6e3
JC
1065 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1066 if (ret != OMX_ErrorNone) {
1067 goto EXIT;
1068 }
20d3e6e3 1069 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
38ef2572 1070 Exynos_OMX_DstInputBufferProcess(pOMXComponent);
20d3e6e3 1071
38ef2572 1072 Exynos_OSAL_ThreadExit(NULL);
20d3e6e3
JC
1073
1074EXIT:
1075 FunctionOut();
1076
1077 return ret;
1078}
1079
38ef2572 1080static OMX_ERRORTYPE Exynos_OMX_DstOutputProcessThread(OMX_PTR threadData)
20d3e6e3 1081{
38ef2572
JC
1082 OMX_ERRORTYPE ret = OMX_ErrorNone;
1083 OMX_COMPONENTTYPE *pOMXComponent = NULL;
20d3e6e3 1084 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
38ef2572 1085 EXYNOS_OMX_MESSAGE *message = NULL;
20d3e6e3
JC
1086
1087 FunctionIn();
1088
38ef2572 1089 if (threadData == NULL) {
20d3e6e3
JC
1090 ret = OMX_ErrorBadParameter;
1091 goto EXIT;
1092 }
38ef2572 1093 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
20d3e6e3
JC
1094 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1095 if (ret != OMX_ErrorNone) {
1096 goto EXIT;
1097 }
20d3e6e3 1098 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
38ef2572 1099 Exynos_OMX_DstOutputBufferProcess(pOMXComponent);
20d3e6e3 1100
38ef2572 1101 Exynos_OSAL_ThreadExit(NULL);
20d3e6e3
JC
1102
1103EXIT:
1104 FunctionOut();
1105
1106 return ret;
1107}
1108
38ef2572 1109OMX_ERRORTYPE Exynos_OMX_BufferProcess_Create(OMX_HANDLETYPE hComponent)
20d3e6e3 1110{
38ef2572
JC
1111 OMX_ERRORTYPE ret = OMX_ErrorNone;
1112 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1113 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1114 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
20d3e6e3
JC
1115
1116 FunctionIn();
1117
38ef2572
JC
1118 pVideoDec->bExitBufferProcessThread = OMX_FALSE;
1119
1120 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hDstOutputThread,
1121 Exynos_OMX_DstOutputProcessThread,
1122 pOMXComponent);
1123 if (ret == OMX_ErrorNone)
1124 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hSrcOutputThread,
1125 Exynos_OMX_SrcOutputProcessThread,
1126 pOMXComponent);
1127 if (ret == OMX_ErrorNone)
1128 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hDstInputThread,
1129 Exynos_OMX_DstInputProcessThread,
1130 pOMXComponent);
1131 if (ret == OMX_ErrorNone)
1132 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hSrcInputThread,
1133 Exynos_OMX_SrcInputProcessThread,
1134 pOMXComponent);
20d3e6e3 1135
38ef2572
JC
1136EXIT:
1137 FunctionOut();
20d3e6e3 1138
38ef2572
JC
1139 return ret;
1140}
20d3e6e3 1141
38ef2572
JC
1142OMX_ERRORTYPE Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent)
1143{
1144 OMX_ERRORTYPE ret = OMX_ErrorNone;
1145 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1146 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1147 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1148 OMX_S32 countValue = 0;
1149 unsigned int i = 0;
1150
1151 FunctionIn();
1152
1153 pVideoDec->bExitBufferProcessThread = OMX_TRUE;
1154
38ef2572
JC
1155 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID, &countValue);
1156 if (countValue == 0)
1157 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID);
1158 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID, &countValue);
1159 if (countValue == 0)
1160 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID);
1161 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent);
1162 Exynos_OSAL_ThreadTerminate(pVideoDec->hSrcInputThread);
1163 pVideoDec->hSrcInputThread = NULL;
1164
38ef2572
JC
1165 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID, &countValue);
1166 if (countValue == 0)
1167 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID);
1168 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID, &countValue);
1169 if (countValue == 0)
1170 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID);
1171 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent);
1172 Exynos_OSAL_ThreadTerminate(pVideoDec->hDstInputThread);
1173 pVideoDec->hDstInputThread = NULL;
1174
38ef2572
JC
1175 pVideoDec->exynos_codec_stop(pOMXComponent, INPUT_PORT_INDEX);
1176 pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX);
1177 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent);
1178 Exynos_OSAL_ThreadTerminate(pVideoDec->hSrcOutputThread);
1179 pVideoDec->hSrcOutputThread = NULL;
1180
38ef2572
JC
1181 pVideoDec->exynos_codec_stop(pOMXComponent, OUTPUT_PORT_INDEX);
1182 pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX);
1183 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent);
1184 Exynos_OSAL_ThreadTerminate(pVideoDec->hDstOutputThread);
1185 pVideoDec->hDstOutputThread = NULL;
1186
81a947ba
SK
1187 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
1188 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
1189
20d3e6e3
JC
1190EXIT:
1191 FunctionOut();
1192
1193 return ret;
1194}
1195
1196OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent)
1197{
38ef2572
JC
1198 OMX_ERRORTYPE ret = OMX_ErrorNone;
1199 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1200 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1201 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
20d3e6e3
JC
1202 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
1203
1204 FunctionIn();
1205
1206 if (hComponent == NULL) {
1207 ret = OMX_ErrorBadParameter;
1208 goto EXIT;
1209 }
1210 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1211 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1212 if (ret != OMX_ErrorNone) {
1213 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1214 goto EXIT;
1215 }
1216
1217 ret = Exynos_OMX_BaseComponent_Constructor(pOMXComponent);
1218 if (ret != OMX_ErrorNone) {
1219 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1220 goto EXIT;
1221 }
1222
1223 ret = Exynos_OMX_Port_Constructor(pOMXComponent);
1224 if (ret != OMX_ErrorNone) {
1225 Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
1226 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1227 goto EXIT;
1228 }
1229
1230 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1231
1232 pVideoDec = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT));
1233 if (pVideoDec == NULL) {
1234 Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
1235 ret = OMX_ErrorInsufficientResources;
1236 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
1237 goto EXIT;
1238 }
1239
1240 Exynos_OSAL_Memset(pVideoDec, 0, sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT));
c01f2434 1241 pVideoDec->bReconfigDPB = OMX_FALSE;
20d3e6e3
JC
1242 pExynosComponent->hComponentHandle = (OMX_HANDLETYPE)pVideoDec;
1243
1244 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
81a947ba 1245 pExynosComponent->bBehaviorEOS = OMX_FALSE;
38ef2572 1246 pExynosComponent->bMultiThreadProcess = OMX_TRUE;
20d3e6e3
JC
1247
1248 /* Input port */
1249 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1250 pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_INPUTBUFFER_NUM;
1251 pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_INPUTBUFFER_NUM;
1252 pExynosPort->portDefinition.nBufferSize = 0;
1253 pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo;
1254
1255 pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
1256 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
1257 pExynosPort->portDefinition.format.video.pNativeRender = 0;
1258 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
1259 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
1260
1261 pExynosPort->portDefinition.format.video.nFrameWidth = 0;
1262 pExynosPort->portDefinition.format.video.nFrameHeight= 0;
1263 pExynosPort->portDefinition.format.video.nStride = 0;
1264 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
1265 pExynosPort->portDefinition.format.video.nBitrate = 64000;
1266 pExynosPort->portDefinition.format.video.xFramerate = (15 << 16);
1267 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
1268 pExynosPort->portDefinition.format.video.pNativeWindow = NULL;
1269
1270 /* Output port */
1271 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1272 pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_OUTPUTBUFFER_NUM;
1273 pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_OUTPUTBUFFER_NUM;
1274 pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
1275 pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo;
1276
1277 pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
1278 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
1279 pExynosPort->portDefinition.format.video.pNativeRender = 0;
1280 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
1281 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
1282
1283 pExynosPort->portDefinition.format.video.nFrameWidth = 0;
1284 pExynosPort->portDefinition.format.video.nFrameHeight= 0;
1285 pExynosPort->portDefinition.format.video.nStride = 0;
1286 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
1287 pExynosPort->portDefinition.format.video.nBitrate = 64000;
1288 pExynosPort->portDefinition.format.video.xFramerate = (15 << 16);
1289 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
1290 pExynosPort->portDefinition.format.video.pNativeWindow = NULL;
1291
38ef2572 1292 pExynosPort->processData.extInfo = (OMX_PTR)Exynos_OSAL_Malloc(sizeof(DECODE_CODEC_EXTRA_BUFFERINFO));
3b1c2e30
SK
1293 Exynos_OSAL_Memset(((char *)pExynosPort->processData.extInfo), 0, sizeof(DECODE_CODEC_EXTRA_BUFFERINFO));
1294{
1295 int i = 0;
1296 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
1297 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)(pExynosPort->processData.extInfo);
1298 for (i = 0; i < VIDEO_BUFFER_MAX_NUM; i++) {
1299 pBufferInfo->PDSB.dpbFD[i].fd = -1;
1300 pBufferInfo->PDSB.dpbFD[i].fd1 = -1;
1301 pBufferInfo->PDSB.dpbFD[i].fd2 = -1;
1302 }
1303}
20d3e6e3
JC
1304 pOMXComponent->UseBuffer = &Exynos_OMX_UseBuffer;
1305 pOMXComponent->AllocateBuffer = &Exynos_OMX_AllocateBuffer;
1306 pOMXComponent->FreeBuffer = &Exynos_OMX_FreeBuffer;
1307 pOMXComponent->ComponentTunnelRequest = &Exynos_OMX_ComponentTunnelRequest;
1308
1309 pExynosComponent->exynos_AllocateTunnelBuffer = &Exynos_OMX_AllocateTunnelBuffer;
1310 pExynosComponent->exynos_FreeTunnelBuffer = &Exynos_OMX_FreeTunnelBuffer;
38ef2572
JC
1311 pExynosComponent->exynos_BufferProcessCreate = &Exynos_OMX_BufferProcess_Create;
1312 pExynosComponent->exynos_BufferProcessTerminate = &Exynos_OMX_BufferProcess_Terminate;
1313 pExynosComponent->exynos_BufferFlush = &Exynos_OMX_BufferFlush;
20d3e6e3 1314
3b1c2e30
SK
1315 pVideoDec->hRefHandle = Exynos_OSAL_RefANB_Create();
1316
20d3e6e3
JC
1317EXIT:
1318 FunctionOut();
1319
1320 return ret;
1321}
1322
1323OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent)
1324{
38ef2572
JC
1325 OMX_ERRORTYPE ret = OMX_ErrorNone;
1326 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1327 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1328 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
20d3e6e3 1329 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
38ef2572 1330 int i = 0;
20d3e6e3
JC
1331
1332 FunctionIn();
1333
1334 if (hComponent == NULL) {
1335 ret = OMX_ErrorBadParameter;
1336 goto EXIT;
1337 }
1338 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1339 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1340 if (ret != OMX_ErrorNone) {
1341 goto EXIT;
1342 }
1343
1344 if (pOMXComponent->pComponentPrivate == NULL) {
1345 ret = OMX_ErrorBadParameter;
1346 goto EXIT;
1347 }
1348 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1349
1350 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
38ef2572 1351
3b1c2e30
SK
1352 Exynos_OSAL_RefANB_Terminate(pVideoDec->hRefHandle);
1353
20d3e6e3
JC
1354 Exynos_OSAL_Free(pVideoDec);
1355 pExynosComponent->hComponentHandle = pVideoDec = NULL;
1356
38ef2572
JC
1357 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1358 if (pExynosPort->processData.extInfo != NULL) {
1359 Exynos_OSAL_Free(pExynosPort->processData.extInfo);
1360 pExynosPort->processData.extInfo = NULL;
1361 }
1362
20d3e6e3
JC
1363 for(i = 0; i < ALL_PORT_NUM; i++) {
1364 pExynosPort = &pExynosComponent->pExynosPort[i];
1365 Exynos_OSAL_Free(pExynosPort->portDefinition.format.video.cMIMEType);
1366 pExynosPort->portDefinition.format.video.cMIMEType = NULL;
1367 }
1368
1369 ret = Exynos_OMX_Port_Destructor(pOMXComponent);
1370
1371 ret = Exynos_OMX_BaseComponent_Destructor(hComponent);
1372
1373EXIT:
1374 FunctionOut();
1375
1376 return ret;
1377}