3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 * @file Exynos_OMX_Vdec.c
21 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
22 * HyeYeon Chung (hyeon.chung@samsung.com)
23 * Yunji Kim (yunji.kim@samsung.com)
33 #include "Exynos_OMX_Macros.h"
34 #include "Exynos_OSAL_Event.h"
35 #include "Exynos_OMX_Vdec.h"
36 #include "Exynos_OMX_VdecControl.h"
37 #include "Exynos_OMX_Basecomponent.h"
38 #include "Exynos_OMX_Baseport.h"
39 #include "Exynos_OSAL_Thread.h"
40 #include "Exynos_OSAL_Semaphore.h"
41 #include "Exynos_OSAL_Mutex.h"
42 #include "Exynos_OSAL_ETC.h"
43 #include "Exynos_OSAL_SharedMemory.h"
46 #include "Exynos_OSAL_Platform_Specific.h"
49 #include "ExynosVideoApi.h"
53 #define EXYNOS_LOG_TAG "EXYNOS_VIDEO_DEC"
54 #define EXYNOS_LOG_OFF
55 //#define EXYNOS_TRACE_ON
56 #include "Exynos_OSAL_Log.h"
58 int calc_plane(int width, int height)
62 mbX = ALIGN(width, S5P_FIMV_NV12MT_HALIGN);
63 mbY = ALIGN(height, S5P_FIMV_NV12MT_VALIGN);
65 return ALIGN(mbX * mbY, S5P_FIMV_DEC_BUF_ALIGN);
68 int calc_yplane(int width, int height)
72 mbX = ALIGN(width + 24, S5P_FIMV_NV12MT_HALIGN);
73 mbY = ALIGN(height + 16, S5P_FIMV_NV12MT_VALIGN);
75 return ALIGN(mbX * mbY, S5P_FIMV_DEC_BUF_ALIGN);
78 int calc_uvplane(int width, int height)
82 mbX = ALIGN(width + 16, S5P_FIMV_NV12MT_HALIGN);
83 mbY = ALIGN(height + 4, S5P_FIMV_NV12MT_VALIGN);
85 return ALIGN(mbX * mbY, S5P_FIMV_DEC_BUF_ALIGN);
88 void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent)
90 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
91 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
92 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
94 if ((exynosOutputPort->portDefinition.format.video.nFrameWidth !=
95 exynosInputPort->portDefinition.format.video.nFrameWidth) ||
96 (exynosOutputPort->portDefinition.format.video.nFrameHeight !=
97 exynosInputPort->portDefinition.format.video.nFrameHeight)) {
98 OMX_U32 width = 0, height = 0;
100 exynosOutputPort->portDefinition.format.video.nFrameWidth =
101 exynosInputPort->portDefinition.format.video.nFrameWidth;
102 exynosOutputPort->portDefinition.format.video.nFrameHeight =
103 exynosInputPort->portDefinition.format.video.nFrameHeight;
104 width = exynosOutputPort->portDefinition.format.video.nStride =
105 exynosInputPort->portDefinition.format.video.nStride;
106 height = exynosOutputPort->portDefinition.format.video.nSliceHeight =
107 exynosInputPort->portDefinition.format.video.nSliceHeight;
109 switch(exynosOutputPort->portDefinition.format.video.eColorFormat) {
110 case OMX_COLOR_FormatYUV420Planar:
111 case OMX_COLOR_FormatYUV420SemiPlanar:
113 exynosOutputPort->portDefinition.nBufferSize = (width * height * 3) / 2;
115 #ifdef TIZEN_FEATURE_E3250 /* nv12t fd */
116 case OMX_SEC_COLOR_FormatNV12T_DmaBuf_Fd:
118 exynosOutputPort->portDefinition.nBufferSize = sizeof(MMVideoBuffer);
121 case OMX_SEC_COLOR_FormatNV12Tiled:
122 width = exynosOutputPort->portDefinition.format.video.nFrameWidth;
123 height = exynosOutputPort->portDefinition.format.video.nFrameHeight;
124 if (width && height) {
125 int YBufferSize = calc_plane(width, height);
126 int CBufferSize = calc_plane(width, height >> 1);
127 exynosOutputPort->portDefinition.nBufferSize = YBufferSize + CBufferSize;
132 exynosOutputPort->portDefinition.nBufferSize = width * height * 2;
140 OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex)
142 OMX_BOOL ret = OMX_FALSE;
143 #ifdef TIZEN_FEATURE_E3250 /* check state */
144 if (pExynosComponent->currentState != OMX_StateExecuting)
145 Exynos_OSAL_Log(EXYNOS_LOG_VERVOSE, "not OMX_StateExecuting");
147 if (pExynosComponent->pExynosPort[nPortIndex].portState != OMX_StateIdle)
148 Exynos_OSAL_Log(EXYNOS_LOG_VERVOSE, "not OMX_StateIdle");
150 if (pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle)
151 Exynos_OSAL_Log(EXYNOS_LOG_VERVOSE, "EXYNOS_OMX_TransStateExecutingToIdle");
153 if (pExynosComponent->transientState == EXYNOS_OMX_TransStateIdleToExecuting)
154 Exynos_OSAL_Log(EXYNOS_LOG_VERVOSE, "EXYNOS_OMX_TransStateIdleToExecuting");
156 if ((pExynosComponent->currentState == OMX_StateExecuting) &&
157 (pExynosComponent->pExynosPort[nPortIndex].portState == OMX_StateIdle) &&
158 (pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
159 (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToExecuting)) {
162 if ((pExynosComponent->currentState == OMX_StateExecuting) &&
163 (pExynosComponent->pExynosPort[nPortIndex].portState == OMX_StateIdle) &&
164 (pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
165 (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToExecuting)) {
175 OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData)
177 OMX_ERRORTYPE ret = OMX_ErrorNone;
178 CODEC_DEC_BUFFER *pInputCodecBuffer = (CODEC_DEC_BUFFER *)codecBuffer;
180 pData->buffer.singlePlaneBuffer.dataBuffer = pInputCodecBuffer->pVirAddr[0];
181 pData->buffer.singlePlaneBuffer.fd = pInputCodecBuffer->fd[0];
182 pData->allocSize = pInputCodecBuffer->bufferSize[0];
183 pData->dataLen = pInputCodecBuffer->dataSize;
184 pData->usedDataLen = 0;
185 pData->remainDataLen = pInputCodecBuffer->dataSize;
188 pData->timeStamp = 0;
189 pData->pPrivate = codecBuffer;
190 pData->bufferHeader = NULL;
195 OMX_ERRORTYPE Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData)
197 OMX_ERRORTYPE ret = OMX_ErrorNone;
198 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
199 OMX_PTR pSrcBuf[MAX_BUFFER_PLANE];
200 OMX_U32 allocSize[MAX_BUFFER_PLANE];
202 pVideoDec->exynos_codec_getCodecOutputPrivateData(codecBuffer, pSrcBuf, allocSize);
203 pData->buffer.multiPlaneBuffer.dataBuffer[0] = pSrcBuf[0];
204 pData->buffer.multiPlaneBuffer.dataBuffer[1] = pSrcBuf[1];
205 pData->buffer.multiPlaneBuffer.dataBuffer[2] = pSrcBuf[2];
206 pData->allocSize = allocSize[0] + allocSize[1] + allocSize[2];
208 pData->usedDataLen = 0;
209 pData->remainDataLen = 0;
212 pData->timeStamp = 0;
213 pData->pPrivate = codecBuffer;
214 pData->bufferHeader = NULL;
219 void Exynos_Wait_ProcessPause(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex)
221 EXYNOS_OMX_BASEPORT *exynosOMXPort = NULL;
225 exynosOMXPort = &pExynosComponent->pExynosPort[nPortIndex];
227 if (((pExynosComponent->currentState == OMX_StatePause) ||
228 (pExynosComponent->currentState == OMX_StateIdle) ||
229 (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) ||
230 (pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle)) &&
231 (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToLoaded) &&
232 (!CHECK_PORT_BEING_FLUSHED(exynosOMXPort))) {
233 Exynos_OSAL_SignalWait(pExynosComponent->pExynosPort[nPortIndex].pauseEvent, DEF_MAX_WAIT_TIME);
234 Exynos_OSAL_SignalReset(pExynosComponent->pExynosPort[nPortIndex].pauseEvent);
242 OMX_BOOL Exynos_CSC_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *dstOutputData)
244 OMX_BOOL ret = OMX_FALSE;
245 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
246 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
247 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
248 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
250 EXYNOS_OMX_DATABUFFER *outputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer;
251 DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
252 #ifdef TIZEN_FEATURE_E3250
253 MMVideoBuffer *pSlpOutBuf = NULL;
258 OMX_U32 width = 0, height = 0;
260 OMX_COLOR_FORMATTYPE colorFormat;
262 void *pOutputBuf = (void *)outputUseBuffer->bufferHeader->pBuffer;
263 void *pSrcBuf[MAX_BUFFER_PLANE] = {NULL, };
264 void *pYUVBuf[MAX_BUFFER_PLANE] = {NULL, };
266 CSC_ERRORCODE cscRet = CSC_ErrorNone;
267 CSC_METHOD csc_method = CSC_METHOD_SW;
268 unsigned int cacheable = 1;
270 pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)dstOutputData->extInfo;
272 width = pBufferInfo->imageWidth;
273 height = pBufferInfo->imageHeight;
274 imageSize = width * height;
275 colorFormat = pBufferInfo->ColorFormat;
277 #ifdef TIZEN_FEATURE_E3250
278 pSlpOutBuf = (MMVideoBuffer *)pOutputBuf;
279 pSlpOutBuf->width[0] = width;
280 pSlpOutBuf->width[1] = width;
281 pSlpOutBuf->height[0] = height;
282 pSlpOutBuf->height[1] = height/2;
283 pSlpOutBuf->stride_width[0] = width; /* need to check. stride */
284 pSlpOutBuf->stride_width[1] = width;
285 pSlpOutBuf->stride_height[0] = height; /* need to check. elevation */
286 pSlpOutBuf->stride_height[1] = height/2;
288 if (pVideoDec->bDRMPlayerMode == OMX_TRUE) {
289 pSlpOutBuf->data[0] = 0;
290 pSlpOutBuf->data[1] = 0;
292 pSlpOutBuf->data[0] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[0];
293 pSlpOutBuf->data[1] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[1];
295 pSlpOutBuf->data[2] = 0; /* omx do not use this plane */
298 pSlpOutBuf->handle.dmabuf_fd[0] = dstOutputData->buffer.multiPlaneBuffer.fd[0];
299 pSlpOutBuf->handle.dmabuf_fd[1] = dstOutputData->buffer.multiPlaneBuffer.fd[1];
300 pSlpOutBuf->handle.dmabuf_fd[2] = 0; /* omx do not use this plane */
302 pSlpOutBuf->handle.bo[0] = dstOutputData->buffer.multiPlaneBuffer.tbm_bo[0];
303 pSlpOutBuf->handle.bo[1] = dstOutputData->buffer.multiPlaneBuffer.tbm_bo[1];
304 pSlpOutBuf->handle.bo[2] = NULL;
306 //pSlpOutBuf->type = MM_VIDEO_BUFFER_TYPE_DMABUF_FD;
307 dstOutputData->dataLen = sizeof(MMVideoBuffer);
309 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s: using fd instead of csc", __FUNCTION__);
310 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "fd (%d, %d, %d) received from MFC", pSlpOutBuf->handle.dmabuf_fd[0], pSlpOutBuf->handle.dmabuf_fd[1],
311 pSlpOutBuf->handle.dmabuf_fd[2]);
316 pSrcBuf[0] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[0];
317 pSrcBuf[1] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[1];
318 pSrcBuf[2] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[2];
320 pYUVBuf[0] = (unsigned char *)pOutputBuf;
321 pYUVBuf[1] = (unsigned char *)pOutputBuf + imageSize;
322 pYUVBuf[2] = (unsigned char *)pOutputBuf + imageSize + imageSize / 4;
324 csc_get_method(pVideoDec->csc_handle, &csc_method);
326 if (csc_method == CSC_METHOD_HW) {
327 pSrcBuf[0] = (unsigned char *)(&dstOutputData->buffer.multiPlaneBuffer.fd[0]);
328 pSrcBuf[1] = (unsigned char *)(&dstOutputData->buffer.multiPlaneBuffer.fd[1]);
329 pSrcBuf[2] = (unsigned char *)(&dstOutputData->buffer.multiPlaneBuffer.fd[2]);
334 if (exynosOutputPort->bIsPBEnabled == OMX_TRUE) {
335 ExynosVideoPlane planes[MAX_BUFFER_PLANE];
337 Exynos_OSAL_LockPB(pOutputBuf, width, height, exynosOutputPort->portDefinition.format.video.eColorFormat, &stride, planes);
339 outputUseBuffer->dataLen = sizeof(void *);
341 pYUVBuf[0] = (unsigned char *)planes[0].addr;
342 pYUVBuf[1] = (unsigned char *)planes[1].addr;
343 pYUVBuf[2] = (unsigned char *)planes[2].addr;
345 if (csc_method == CSC_METHOD_HW) {
346 pYUVBuf[0] = (unsigned char *)planes[0].fd;
347 pYUVBuf[1] = (unsigned char *)planes[1].fd;
348 pYUVBuf[2] = (unsigned char *)planes[2].fd;
354 if ((exynosOutputPort->bIsPBEnabled == OMX_FALSE) &&
355 (csc_method == CSC_METHOD_HW)) {
356 pYUVBuf[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, (OMX_PTR)pOutputBuf);
362 if (pVideoDec->csc_set_format == OMX_FALSE) {
364 pVideoDec->csc_handle, /* handle */
369 width, /* crop_width */
370 height, /* crop_height */
371 omx_2_hal_pixel_format(colorFormat), /* color_format */
372 cacheable); /* cacheable */
374 pVideoDec->csc_handle, /* handle */
379 width, /* crop_width */
380 height, /* crop_height */
381 omx_2_hal_pixel_format(exynosOutputPort->portDefinition.format.video.eColorFormat), /* color_format */
382 cacheable); /* cacheable */
383 pVideoDec->csc_set_format = OMX_TRUE;
386 pVideoDec->csc_handle, /* handle */
387 pSrcBuf[0], /* y addr */
388 pSrcBuf[1], /* u addr or uv addr */
389 pSrcBuf[2], /* v addr or none */
392 pVideoDec->csc_handle, /* handle */
393 pYUVBuf[0], /* y addr */
394 pYUVBuf[1], /* u addr or uv addr */
395 pYUVBuf[2], /* v addr or none */
397 cscRet = csc_convert(pVideoDec->csc_handle);
398 if (cscRet != CSC_ErrorNone)
404 if (exynosOutputPort->bIsPBEnabled == OMX_TRUE) {
405 #ifdef TIZEN_FEATURE_E3250
406 Exynos_OSAL_UnlockPB(pOutputBuf, dstOutputData, exynosOutputPort, exynosInputPort);
408 Exynos_OSAL_UnlockPB(pOutputBuf, dstOutputData);
419 OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *srcInputData)
421 OMX_BOOL ret = OMX_FALSE;
422 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
423 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
424 EXYNOS_OMX_DATABUFFER *inputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer;
425 OMX_U32 copySize = 0;
426 OMX_BYTE checkInputStream = NULL;
427 OMX_U32 checkInputStreamLen = 0;
431 if (exynosInputPort->bufferProcessType & BUFFER_COPY) {
432 if ((srcInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) ||
433 (srcInputData->pPrivate == NULL)) {
439 if (inputUseBuffer->dataValid == OMX_TRUE) {
440 if (exynosInputPort->bufferProcessType & BUFFER_SHARE) {
441 Exynos_Shared_BufferToData(inputUseBuffer, srcInputData, ONE_PLANE);
443 #ifndef TIZEN_FEATURE_E3250
444 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
445 if (pVideoDec->bDRMPlayerMode == OMX_TRUE) {
446 OMX_PTR dataBuffer = NULL;
448 dataBuffer = Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec->hSharedMemory,
449 srcInputData->buffer.singlePlaneBuffer.dataBuffer);
450 if (dataBuffer == NULL) {
455 srcInputData->buffer.singlePlaneBuffer.dataBuffer = dataBuffer;
458 /* reset dataBuffer */
459 Exynos_ResetDataBuffer(inputUseBuffer);
460 } else if (exynosInputPort->bufferProcessType & BUFFER_COPY) {
461 checkInputStream = inputUseBuffer->bufferHeader->pBuffer + inputUseBuffer->usedDataLen;
462 checkInputStreamLen = inputUseBuffer->remainDataLen;
464 pExynosComponent->bUseFlagEOF = OMX_TRUE;
466 copySize = checkInputStreamLen;
467 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_TRUE");
469 if (((srcInputData->allocSize) - (srcInputData->dataLen)) >= copySize) {
471 Exynos_OSAL_Memcpy(srcInputData->buffer.singlePlaneBuffer.dataBuffer + srcInputData->dataLen,
472 checkInputStream, copySize);
475 inputUseBuffer->dataLen -= copySize;
476 inputUseBuffer->remainDataLen -= copySize;
477 inputUseBuffer->usedDataLen += copySize;
479 srcInputData->dataLen += copySize;
480 srcInputData->remainDataLen += copySize;
482 srcInputData->timeStamp = inputUseBuffer->timeStamp;
483 srcInputData->nFlags = inputUseBuffer->nFlags;
484 srcInputData->bufferHeader = inputUseBuffer->bufferHeader;
486 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "input codec buffer is smaller than decoded input data size Out Length");
487 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
488 pExynosComponent->callbackData,
489 OMX_EventError, OMX_ErrorUndefined, 0, NULL);
493 Exynos_InputBufferReturn(pOMXComponent);
496 if ((srcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
497 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "bSaveFlagEOS : OMX_TRUE");
498 srcInputData->dataLen = 0;
499 srcInputData->remainDataLen = 0;
500 pExynosComponent->bSaveFlagEOS = OMX_TRUE;
503 if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
504 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_TRUE;
505 pExynosComponent->checkTimeStamp.startTimeStamp = srcInputData->timeStamp;
506 pExynosComponent->checkTimeStamp.nStartFlags = srcInputData->nFlags;
507 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
508 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "first frame timestamp after seeking %lld us (%.2f secs)",
509 srcInputData->timeStamp, srcInputData->timeStamp / 1E6);
522 OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *dstOutputData)
524 OMX_BOOL ret = OMX_FALSE;
525 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
526 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
527 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
528 EXYNOS_OMX_DATABUFFER *outputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer;
529 OMX_U32 copySize = 0;
533 if (exynosOutputPort->bufferProcessType & BUFFER_SHARE) {
534 if (exynosOutputPort->bIsPBEnabled == OMX_FALSE) {
535 if (Exynos_Shared_DataToBuffer(dstOutputData, outputUseBuffer) == OMX_ErrorNone)
536 outputUseBuffer->dataValid = OMX_TRUE;
539 #ifdef TIZEN_FEATURE_E3250
540 if (Exynos_Shared_DataToPlatformBuffer(dstOutputData, outputUseBuffer, exynosOutputPort,exynosInputPort) == OMX_ErrorNone) {
542 if (Exynos_Shared_DataToPlatformBuffer(dstOutputData, outputUseBuffer, exynosOutputPort) == OMX_ErrorNone) {
544 outputUseBuffer->dataValid = OMX_TRUE;
550 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s Should not come here", __FUNCTION__);
557 if (outputUseBuffer->dataValid == OMX_TRUE) {
558 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out timestamp after seeking %lld us (%.2f secs)",
559 dstOutputData->timeStamp, dstOutputData->timeStamp / 1E6);
560 if ((pExynosComponent->checkTimeStamp.needCheckStartTimeStamp == OMX_TRUE) &&
561 ((dstOutputData->nFlags & OMX_BUFFERFLAG_EOS) != OMX_BUFFERFLAG_EOS)) {
562 if ((pExynosComponent->checkTimeStamp.startTimeStamp == dstOutputData->timeStamp) &&
563 (pExynosComponent->checkTimeStamp.nStartFlags == dstOutputData->nFlags)){
564 pExynosComponent->checkTimeStamp.startTimeStamp = -19761123;
565 pExynosComponent->checkTimeStamp.nStartFlags = 0x0;
566 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
567 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
568 pExynosComponent->checkTimeStamp.bImmediateDisplay = OMX_FALSE;
570 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "drop frame after seeking", pExynosComponent);
571 if (exynosOutputPort->bufferProcessType & BUFFER_SHARE)
572 Exynos_OMX_FillThisBuffer(pOMXComponent, outputUseBuffer->bufferHeader);
576 } else if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE)) {
578 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "not set check timestame after seeking");
582 if (exynosOutputPort->bufferProcessType & BUFFER_COPY) {
583 //void *pOutputBuf = (void *)outputUseBuffer->bufferHeader->pBuffer;
585 if ((dstOutputData->remainDataLen <= (outputUseBuffer->allocSize - outputUseBuffer->dataLen)) &&
586 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
587 copySize = dstOutputData->remainDataLen;
588 Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"copySize: %d", copySize);
590 outputUseBuffer->dataLen += copySize;
591 outputUseBuffer->remainDataLen += copySize;
592 outputUseBuffer->nFlags = dstOutputData->nFlags;
593 outputUseBuffer->timeStamp = dstOutputData->timeStamp;
595 if (outputUseBuffer->remainDataLen > 0) {
596 ret = Exynos_CSC_OutputData(pOMXComponent, dstOutputData);
601 if (ret == OMX_TRUE) {
602 if ((outputUseBuffer->remainDataLen > 0) ||
603 ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
604 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
605 Exynos_OutputBufferReturn(pOMXComponent);
608 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "csc_convert Error");
609 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
610 pExynosComponent->callbackData,
611 OMX_EventError, OMX_ErrorUndefined, 0, NULL);
614 } else if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) {
615 outputUseBuffer->dataLen = 0;
616 outputUseBuffer->remainDataLen = 0;
617 outputUseBuffer->nFlags = dstOutputData->nFlags;
618 outputUseBuffer->timeStamp = dstOutputData->timeStamp;
619 Exynos_OutputBufferReturn(pOMXComponent);
621 #ifdef TIZEN_FEATURE_E3250
622 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "output buffer is SCMN_IMGB type.");
623 copySize = outputUseBuffer->allocSize - outputUseBuffer->dataLen;
625 outputUseBuffer->dataLen += copySize;
626 outputUseBuffer->remainDataLen += copySize;
627 outputUseBuffer->nFlags = 0; /* need to check */
628 outputUseBuffer->timeStamp = dstOutputData->timeStamp;
630 if (outputUseBuffer->remainDataLen > 0) {
631 ret = Exynos_CSC_OutputData(pOMXComponent, dstOutputData);
636 dstOutputData->remainDataLen -= copySize; /* need to check */
637 dstOutputData->usedDataLen += copySize;
639 Exynos_OutputBufferReturn(pOMXComponent);
641 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "output buffer is smaller than decoded data size Out Length");
642 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
643 pExynosComponent->callbackData,
644 OMX_EventError, OMX_ErrorUndefined, 0, NULL);
648 } else if (exynosOutputPort->bufferProcessType & BUFFER_SHARE) {
649 if ((outputUseBuffer->remainDataLen > 0) ||
650 ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
651 (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)))
652 Exynos_OutputBufferReturn(pOMXComponent);
664 OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent)
666 OMX_ERRORTYPE ret = OMX_ErrorNone;
667 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
668 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
669 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
670 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
671 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
672 EXYNOS_OMX_DATABUFFER *srcInputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer;
673 EXYNOS_OMX_DATA *pSrcInputData = &exynosInputPort->processData;
674 OMX_BOOL bCheckInputData = OMX_FALSE;
675 OMX_BOOL bCodecConfigured = OMX_FALSE;
679 while (!pVideoDec->bExitBufferProcessThread) {
680 Exynos_OSAL_SleepMillisec(0);
681 Exynos_Wait_ProcessPause(pExynosComponent, INPUT_PORT_INDEX);
683 while ((Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) &&
684 (!pVideoDec->bExitBufferProcessThread)) {
685 Exynos_OSAL_SleepMillisec(0);
687 if ((CHECK_PORT_BEING_FLUSHED(exynosInputPort)) ||
688 ((exynosOutputPort->exceptionFlag == NEED_PORT_DISABLE) && (ret == (OMX_ERRORTYPE)OMX_ErrorInputDataDecodeYet)))
690 if (exynosInputPort->portState != OMX_StateIdle)
693 Exynos_OSAL_MutexLock(srcInputUseBuffer->bufferMutex);
694 if (ret != (OMX_ERRORTYPE)OMX_ErrorInputDataDecodeYet) {
695 if (exynosInputPort->bufferProcessType & BUFFER_COPY) {
698 if ((pVideoDec->exynos_process_codecConfigData) && !bCodecConfigured) {
699 EXYNOS_OMX_DATABUFFER *inputUseBuffer = NULL;
700 ret = Exynos_InputBufferGetQueue(pExynosComponent);
702 inputUseBuffer = &(exynosInputPort->way.port2WayDataBuffer.inputDataBuffer);
703 pVideoDec->exynos_process_codecConfigData(pOMXComponent, inputUseBuffer); /* TIZEN_FEATURE_E3250 */
704 // pVideoDec->exynos_process_codecConfigData(pOMXComponent, pSrcInputData);
706 bCodecConfigured = OMX_TRUE;
709 if ((pSrcInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) || (pSrcInputData->pPrivate == NULL)) {
710 Exynos_CodecBufferDeQueue(pExynosComponent, INPUT_PORT_INDEX, &codecBuffer);
711 if (codecBuffer != NULL) {
712 Exynos_Input_CodecBufferToData(pExynosComponent, codecBuffer, pSrcInputData);
714 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
719 if (srcInputUseBuffer->dataValid == OMX_TRUE) {
720 bCheckInputData = Exynos_Preprocessor_InputData(pOMXComponent, pSrcInputData);
722 bCheckInputData = OMX_FALSE;
725 if ((bCheckInputData == OMX_FALSE) &&
726 (!CHECK_PORT_BEING_FLUSHED(exynosInputPort))) {
727 ret = Exynos_InputBufferGetQueue(pExynosComponent);
728 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
732 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort)) {
733 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
738 ret = pVideoDec->exynos_codec_srcInputProcess(pOMXComponent, pSrcInputData);
740 if (ret == (OMX_ERRORTYPE)OMX_ErrorCorruptedFrame) {
741 if (exynosInputPort->bufferProcessType & BUFFER_COPY) {
743 codecBuffer = pSrcInputData->pPrivate;
744 if (codecBuffer != NULL)
745 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, codecBuffer);
748 if (exynosInputPort->bufferProcessType & BUFFER_SHARE) {
749 Exynos_OMX_InputBufferReturn(pOMXComponent, pSrcInputData->bufferHeader);
753 if (ret != (OMX_ERRORTYPE)OMX_ErrorInputDataDecodeYet) {
754 Exynos_ResetCodecData(pSrcInputData);
756 Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
757 if (ret == (OMX_ERRORTYPE)OMX_ErrorCodecInit)
758 pVideoDec->bExitBufferProcessThread = OMX_TRUE;
767 OMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent)
769 OMX_ERRORTYPE ret = OMX_ErrorNone;
770 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
771 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
772 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
773 EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
774 EXYNOS_OMX_DATABUFFER *srcOutputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.outputDataBuffer;
775 EXYNOS_OMX_DATA srcOutputData;
779 while (!pVideoDec->bExitBufferProcessThread) {
780 Exynos_OSAL_SleepMillisec(0);
782 while (!pVideoDec->bExitBufferProcessThread) {
783 if (exynosInputPort->bufferProcessType & BUFFER_COPY) {
784 if (Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX) == OMX_FALSE)
787 Exynos_OSAL_SleepMillisec(0);
789 if (CHECK_PORT_BEING_FLUSHED(exynosInputPort))
792 Exynos_OSAL_MutexLock(srcOutputUseBuffer->bufferMutex);
793 ret = pVideoDec->exynos_codec_srcOutputProcess(pOMXComponent, &srcOutputData);
795 if (ret == OMX_ErrorNone) {
796 if (exynosInputPort->bufferProcessType & BUFFER_COPY) {
798 codecBuffer = srcOutputData.pPrivate;
799 if (codecBuffer != NULL)
800 Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, codecBuffer);
802 if (exynosInputPort->bufferProcessType & BUFFER_SHARE) {
803 Exynos_Shared_DataToBuffer(&srcOutputData, srcOutputUseBuffer);
804 Exynos_InputBufferReturn(pOMXComponent);
806 Exynos_ResetCodecData(&srcOutputData);
808 Exynos_OSAL_MutexUnlock(srcOutputUseBuffer->bufferMutex);
817 OMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent)
819 OMX_ERRORTYPE ret = OMX_ErrorNone;
820 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
821 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
822 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
823 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
824 EXYNOS_OMX_DATABUFFER *dstInputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.inputDataBuffer;
825 EXYNOS_OMX_DATA dstInputData;
829 while (!pVideoDec->bExitBufferProcessThread) {
830 Exynos_OSAL_SleepMillisec(0);
832 while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) &&
833 (!pVideoDec->bExitBufferProcessThread)) {
834 Exynos_OSAL_SleepMillisec(0);
836 if ((CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) ||
837 (!CHECK_PORT_POPULATED(exynosOutputPort)))
839 if (exynosOutputPort->portState != OMX_StateIdle)
842 Exynos_OSAL_MutexLock(dstInputUseBuffer->bufferMutex);
843 if (ret != (OMX_ERRORTYPE)OMX_ErrorOutputBufferUseYet) {
844 if (exynosOutputPort->bufferProcessType & BUFFER_COPY) {
846 ret = Exynos_CodecBufferDeQueue(pExynosComponent, OUTPUT_PORT_INDEX, &codecBuffer);
847 if (ret != OMX_ErrorNone) {
848 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
851 Exynos_Output_CodecBufferToData(pExynosComponent, codecBuffer, &dstInputData);
854 if (exynosOutputPort->bufferProcessType & BUFFER_SHARE) {
855 if ((dstInputUseBuffer->dataValid != OMX_TRUE) &&
856 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
857 ret = Exynos_OutputBufferGetQueue(pExynosComponent);
858 if (ret != OMX_ErrorNone) {
859 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
862 if (exynosOutputPort->bIsPBEnabled == OMX_FALSE) {
863 Exynos_Shared_BufferToData(dstInputUseBuffer, &dstInputData, TWO_PLANE);
866 ret = Exynos_Shared_PlatformBufferToData(dstInputUseBuffer, &dstInputData, exynosOutputPort, TWO_PLANE);
868 if (ret != OMX_ErrorNone) {
869 dstInputUseBuffer->dataValid = OMX_FALSE;
870 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
874 Exynos_ResetDataBuffer(dstInputUseBuffer);
878 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) {
879 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
884 ret = pVideoDec->exynos_codec_dstInputProcess(pOMXComponent, &dstInputData);
885 if (ret != (OMX_ERRORTYPE)OMX_ErrorOutputBufferUseYet) {
886 Exynos_ResetCodecData(&dstInputData);
888 Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
897 OMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent)
899 OMX_ERRORTYPE ret = OMX_ErrorNone;
900 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
901 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
902 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
903 EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
904 EXYNOS_OMX_DATABUFFER *dstOutputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer;
905 EXYNOS_OMX_DATA *pDstOutputData = &exynosOutputPort->processData;
909 while (!pVideoDec->bExitBufferProcessThread) {
910 Exynos_OSAL_SleepMillisec(0);
911 Exynos_Wait_ProcessPause(pExynosComponent, OUTPUT_PORT_INDEX);
913 while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) &&
914 (!pVideoDec->bExitBufferProcessThread)) {
915 Exynos_OSAL_SleepMillisec(0);
917 if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort))
920 Exynos_OSAL_MutexLock(dstOutputUseBuffer->bufferMutex);
921 if (exynosOutputPort->bufferProcessType & BUFFER_COPY) {
922 if ((dstOutputUseBuffer->dataValid != OMX_TRUE) &&
923 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
924 ret = Exynos_OutputBufferGetQueue(pExynosComponent);
925 if (ret != OMX_ErrorNone) {
926 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex);
932 if ((dstOutputUseBuffer->dataValid == OMX_TRUE) ||
933 (exynosOutputPort->bufferProcessType & BUFFER_SHARE))
934 ret = pVideoDec->exynos_codec_dstOutputProcess(pOMXComponent, pDstOutputData);
936 if (((ret == OMX_ErrorNone) && (dstOutputUseBuffer->dataValid == OMX_TRUE)) ||
937 (exynosOutputPort->bufferProcessType & BUFFER_SHARE)) {
938 Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData);
941 if (exynosOutputPort->bufferProcessType & BUFFER_COPY) {
943 codecBuffer = pDstOutputData->pPrivate;
944 if (codecBuffer != NULL) {
945 Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, codecBuffer);
946 pDstOutputData->pPrivate = NULL;
950 /* reset outputData */
951 Exynos_ResetCodecData(pDstOutputData);
952 Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex);
961 static OMX_ERRORTYPE Exynos_OMX_SrcInputProcessThread(OMX_PTR threadData)
963 OMX_ERRORTYPE ret = OMX_ErrorNone;
964 OMX_COMPONENTTYPE *pOMXComponent = NULL;
968 if (threadData == NULL) {
969 ret = OMX_ErrorBadParameter;
972 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
973 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
974 if (ret != OMX_ErrorNone) {
977 Exynos_OMX_SrcInputBufferProcess(pOMXComponent);
979 Exynos_OSAL_ThreadExit(NULL);
987 static OMX_ERRORTYPE Exynos_OMX_SrcOutputProcessThread(OMX_PTR threadData)
989 OMX_ERRORTYPE ret = OMX_ErrorNone;
990 OMX_COMPONENTTYPE *pOMXComponent = NULL;
994 if (threadData == NULL) {
995 ret = OMX_ErrorBadParameter;
998 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
999 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1000 if (ret != OMX_ErrorNone) {
1003 Exynos_OMX_SrcOutputBufferProcess(pOMXComponent);
1005 Exynos_OSAL_ThreadExit(NULL);
1013 static OMX_ERRORTYPE Exynos_OMX_DstInputProcessThread(OMX_PTR threadData)
1015 OMX_ERRORTYPE ret = OMX_ErrorNone;
1016 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1020 if (threadData == NULL) {
1021 ret = OMX_ErrorBadParameter;
1024 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
1025 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1026 if (ret != OMX_ErrorNone) {
1029 Exynos_OMX_DstInputBufferProcess(pOMXComponent);
1031 Exynos_OSAL_ThreadExit(NULL);
1039 static OMX_ERRORTYPE Exynos_OMX_DstOutputProcessThread(OMX_PTR threadData)
1041 OMX_ERRORTYPE ret = OMX_ErrorNone;
1042 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1046 if (threadData == NULL) {
1047 ret = OMX_ErrorBadParameter;
1050 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
1051 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1052 if (ret != OMX_ErrorNone) {
1055 Exynos_OMX_DstOutputBufferProcess(pOMXComponent);
1057 Exynos_OSAL_ThreadExit(NULL);
1065 OMX_ERRORTYPE Exynos_OMX_BufferProcess_Create(OMX_HANDLETYPE hComponent)
1067 OMX_ERRORTYPE ret = OMX_ErrorNone;
1068 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1069 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1070 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1074 pVideoDec->bExitBufferProcessThread = OMX_FALSE;
1076 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hDstOutputThread,
1077 Exynos_OMX_DstOutputProcessThread,
1079 if (ret == OMX_ErrorNone)
1080 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hSrcOutputThread,
1081 Exynos_OMX_SrcOutputProcessThread,
1083 if (ret == OMX_ErrorNone)
1084 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hDstInputThread,
1085 Exynos_OMX_DstInputProcessThread,
1087 if (ret == OMX_ErrorNone)
1088 ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hSrcInputThread,
1089 Exynos_OMX_SrcInputProcessThread,
1097 OMX_ERRORTYPE Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent)
1099 OMX_ERRORTYPE ret = OMX_ErrorNone;
1100 OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1101 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1102 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1103 OMX_S32 countValue = 0;
1107 pVideoDec->bExitBufferProcessThread = OMX_TRUE;
1109 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID, &countValue);
1110 if (countValue == 0)
1111 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID);
1112 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID, &countValue);
1113 if (countValue == 0)
1114 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID);
1115 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent);
1116 Exynos_OSAL_ThreadTerminate(pVideoDec->hSrcInputThread);
1117 pVideoDec->hSrcInputThread = NULL;
1119 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID, &countValue);
1120 if (countValue == 0)
1121 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID);
1122 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID, &countValue);
1123 if (countValue == 0)
1124 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID);
1125 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent);
1126 Exynos_OSAL_ThreadTerminate(pVideoDec->hDstInputThread);
1127 pVideoDec->hDstInputThread = NULL;
1129 pVideoDec->exynos_codec_stop(pOMXComponent, INPUT_PORT_INDEX);
1130 pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX);
1131 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent);
1132 Exynos_OSAL_ThreadTerminate(pVideoDec->hSrcOutputThread);
1133 pVideoDec->hSrcOutputThread = NULL;
1135 pVideoDec->exynos_codec_stop(pOMXComponent, OUTPUT_PORT_INDEX);
1136 pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX);
1137 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent);
1138 Exynos_OSAL_ThreadTerminate(pVideoDec->hDstOutputThread);
1139 pVideoDec->hDstOutputThread = NULL;
1146 OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent)
1148 OMX_ERRORTYPE ret = OMX_ErrorNone;
1149 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1150 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1151 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1152 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
1156 if (hComponent == NULL) {
1157 ret = OMX_ErrorBadParameter;
1160 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1161 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1162 if (ret != OMX_ErrorNone) {
1163 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1167 ret = Exynos_OMX_BaseComponent_Constructor(pOMXComponent);
1168 if (ret != OMX_ErrorNone) {
1169 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1173 ret = Exynos_OMX_Port_Constructor(pOMXComponent);
1174 if (ret != OMX_ErrorNone) {
1175 Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
1176 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
1180 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1182 pVideoDec = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT));
1183 if (pVideoDec == NULL) {
1184 Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
1185 ret = OMX_ErrorInsufficientResources;
1186 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
1190 Exynos_OSAL_Memset(pVideoDec, 0, sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT));
1191 pExynosComponent->hComponentHandle = (OMX_HANDLETYPE)pVideoDec;
1193 pExynosComponent->bSaveFlagEOS = OMX_FALSE;
1194 pExynosComponent->bMultiThreadProcess = OMX_TRUE;
1197 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
1198 pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_INPUTBUFFER_NUM;
1199 pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_INPUTBUFFER_NUM;
1200 pExynosPort->portDefinition.nBufferSize = 0;
1201 pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo;
1203 pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
1204 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
1205 pExynosPort->portDefinition.format.video.pNativeRender = 0;
1206 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
1207 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
1209 pExynosPort->portDefinition.format.video.nFrameWidth = 0;
1210 pExynosPort->portDefinition.format.video.nFrameHeight= 0;
1211 pExynosPort->portDefinition.format.video.nStride = 0;
1212 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
1213 pExynosPort->portDefinition.format.video.nBitrate = 64000;
1214 pExynosPort->portDefinition.format.video.xFramerate = (15 << 16);
1215 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
1216 pExynosPort->portDefinition.format.video.pNativeWindow = NULL;
1219 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1220 pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_OUTPUTBUFFER_NUM;
1221 pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_OUTPUTBUFFER_NUM;
1222 pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
1223 pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo;
1225 pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
1226 Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
1227 pExynosPort->portDefinition.format.video.pNativeRender = 0;
1228 pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
1229 pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
1231 pExynosPort->portDefinition.format.video.nFrameWidth = 0;
1232 pExynosPort->portDefinition.format.video.nFrameHeight= 0;
1233 pExynosPort->portDefinition.format.video.nStride = 0;
1234 pExynosPort->portDefinition.format.video.nSliceHeight = 0;
1235 pExynosPort->portDefinition.format.video.nBitrate = 64000;
1236 pExynosPort->portDefinition.format.video.xFramerate = (15 << 16);
1237 pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
1238 pExynosPort->portDefinition.format.video.pNativeWindow = NULL;
1240 pExynosPort->processData.extInfo = (OMX_PTR)Exynos_OSAL_Malloc(sizeof(DECODE_CODEC_EXTRA_BUFFERINFO));
1242 pOMXComponent->UseBuffer = &Exynos_OMX_UseBuffer;
1243 pOMXComponent->AllocateBuffer = &Exynos_OMX_AllocateBuffer;
1244 pOMXComponent->FreeBuffer = &Exynos_OMX_FreeBuffer;
1245 pOMXComponent->ComponentTunnelRequest = &Exynos_OMX_ComponentTunnelRequest;
1247 pExynosComponent->exynos_AllocateTunnelBuffer = &Exynos_OMX_AllocateTunnelBuffer;
1248 pExynosComponent->exynos_FreeTunnelBuffer = &Exynos_OMX_FreeTunnelBuffer;
1249 pExynosComponent->exynos_BufferProcessCreate = &Exynos_OMX_BufferProcess_Create;
1250 pExynosComponent->exynos_BufferProcessTerminate = &Exynos_OMX_BufferProcess_Terminate;
1251 pExynosComponent->exynos_BufferFlush = &Exynos_OMX_BufferFlush;
1259 OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent)
1261 OMX_ERRORTYPE ret = OMX_ErrorNone;
1262 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1263 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1264 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1265 EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
1270 if (hComponent == NULL) {
1271 ret = OMX_ErrorBadParameter;
1274 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1275 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1276 if (ret != OMX_ErrorNone) {
1280 if (pOMXComponent->pComponentPrivate == NULL) {
1281 ret = OMX_ErrorBadParameter;
1284 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1286 pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1288 Exynos_OSAL_Free(pVideoDec);
1289 pExynosComponent->hComponentHandle = pVideoDec = NULL;
1291 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1292 if (pExynosPort->processData.extInfo != NULL) {
1293 Exynos_OSAL_Free(pExynosPort->processData.extInfo);
1294 pExynosPort->processData.extInfo = NULL;
1297 for(i = 0; i < ALL_PORT_NUM; i++) {
1298 pExynosPort = &pExynosComponent->pExynosPort[i];
1299 Exynos_OSAL_Free(pExynosPort->portDefinition.format.video.cMIMEType);
1300 pExynosPort->portDefinition.format.video.cMIMEType = NULL;
1303 ret = Exynos_OMX_Port_Destructor(pOMXComponent);
1305 ret = Exynos_OMX_BaseComponent_Destructor(hComponent);