120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* 220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Copyright 2012 Samsung Electronics S.LSI Co. LTD 420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Licensed under the Apache License, Version 2.0 (the "License"); 620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * you may not use this file except in compliance with the License. 720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * You may obtain a copy of the License at 820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * http://www.apache.org/licenses/LICENSE-2.0 1020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 1120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Unless required by applicable law or agreed to in writing, software 1220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * distributed under the License is distributed on an "AS IS" BASIS, 1320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * See the License for the specific language governing permissions and 1520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * limitations under the License. 1620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 1720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* 1920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @file Exynos_OMX_Venc.c 2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief 2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author SeungBeom Kim (sbcrux.kim@samsung.com) 2220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Yunji Kim (yunji.kim@samsung.com) 2338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version 2.0.0 2420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history 2538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * 2012.02.20 : Create 2620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 2720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 2820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdio.h> 2920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdlib.h> 3020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <string.h> 3120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Macros.h" 3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Event.h" 3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Venc.h" 3438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OMX_VencControl.h" 3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Basecomponent.h" 3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Thread.h" 3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Semaphore.h" 3833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim#include "Exynos_OSAL_SharedMemory.h" 3938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Mutex.h" 4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_ETC.h" 4120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "csc.h" 4220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#ifdef USE_STOREMETADATA 4433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim#include <system/window.h> 4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Android.h" 4620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#endif 4720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef EXYNOS_LOG_TAG 4920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG "EXYNOS_VIDEO_ENC" 5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF 5138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//#define EXYNOS_TRACE_ON 5220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h" 5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changinline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent) 5620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 5720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 5820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((exynosOutputPort->portDefinition.format.video.nFrameWidth != 6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynosInputPort->portDefinition.format.video.nFrameWidth) || 6320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (exynosOutputPort->portDefinition.format.video.nFrameHeight != 6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynosInputPort->portDefinition.format.video.nFrameHeight)) { 6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 width = 0, height = 0; 6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynosOutputPort->portDefinition.format.video.nFrameWidth = 6820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynosInputPort->portDefinition.format.video.nFrameWidth; 6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynosOutputPort->portDefinition.format.video.nFrameHeight = 7020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynosInputPort->portDefinition.format.video.nFrameHeight; 7120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang width = exynosOutputPort->portDefinition.format.video.nStride = 7220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynosInputPort->portDefinition.format.video.nStride; 7320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang height = exynosOutputPort->portDefinition.format.video.nSliceHeight = 7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynosInputPort->portDefinition.format.video.nSliceHeight; 7520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 7620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (width && height) 7720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynosOutputPort->portDefinition.nBufferSize = (width * height * 3) / 2; 7820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 7920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 80d03573a4a182b0a36eaa16fb7638d98429d1c3fbSeungBeom Kim return; 8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 8338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex) 8420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 8538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_BOOL ret = OMX_FALSE; 8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((pExynosComponent->currentState == OMX_StateExecuting) && 8838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosComponent->pExynosPort[nPortIndex].portState == OMX_StateIdle) && 8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) && 9038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToExecuting)) { 9138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_TRUE; 9238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 9338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_FALSE; 9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 9620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 9720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 9820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 9938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData) 10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 10138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 10238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 10391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim CODEC_ENC_BUFFER *pInputCodecBuffer = (CODEC_ENC_BUFFER*)codecBuffer; 10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pData->buffer.multiPlaneBuffer.dataBuffer[0] = pInputCodecBuffer->pVirAddr[0]; 10691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pData->buffer.multiPlaneBuffer.dataBuffer[1] = pInputCodecBuffer->pVirAddr[1]; 10791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pData->allocSize = pInputCodecBuffer->bufferSize[0] + pInputCodecBuffer->bufferSize[1]; 10891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pData->dataLen = pInputCodecBuffer->dataSize; 10938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->usedDataLen = 0; 11091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pData->remainDataLen = pInputCodecBuffer->dataSize; 11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->nFlags = 0; 11338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->timeStamp = 0; 11438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->pPrivate = codecBuffer; 11538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->bufferHeader = NULL; 11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData) 12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 12238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 12338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 12438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PTR pSrcBuf; 12538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 allocSize; 12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_getCodecOutputPrivateData(codecBuffer, &pSrcBuf, &allocSize); 12838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->buffer.singlePlaneBuffer.dataBuffer = pSrcBuf; 12938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->allocSize = allocSize; 13038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->dataLen = 0; 13138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->usedDataLen = 0; 13238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->remainDataLen = 0; 13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->nFlags = 0; 13538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->timeStamp = 0; 13638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->pPrivate = codecBuffer; 13738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pData->bufferHeader = NULL; 13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changvoid Exynos_Wait_ProcessPause(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex) 14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 14438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 14538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 14638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *exynosOMXPort = NULL; 14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 14920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang exynosOMXPort = &pExynosComponent->pExynosPort[nPortIndex]; 15120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (((pExynosComponent->currentState == OMX_StatePause) || 15338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosComponent->currentState == OMX_StateIdle) || 15438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) || 15538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle)) && 1563e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToLoaded) && 15738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(exynosOMXPort))) { 15838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalWait(pExynosComponent->pExynosPort[nPortIndex].pauseEvent, DEF_MAX_WAIT_TIME); 15938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalReset(pExynosComponent->pExynosPort[nPortIndex].pauseEvent); 16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return; 16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom KimOMX_BOOL Exynos_CSC_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *srcInputData) 16891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim{ 16991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim OMX_BOOL ret = OMX_FALSE; 17091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 17191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 17291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 17391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim EXYNOS_OMX_DATABUFFER *inputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer; 17491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim OMX_U32 nFrameWidth = exynosInputPort->portDefinition.format.video.nFrameWidth; 17591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim OMX_U32 nFrameHeight = exynosInputPort->portDefinition.format.video.nFrameHeight; 17691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim OMX_COLOR_FORMATTYPE eColorFormat = exynosInputPort->portDefinition.format.video.eColorFormat; 17791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim OMX_BYTE checkInputStream = NULL; 17891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim OMX_BOOL flagEOS = OMX_FALSE; 17991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 18091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim FunctionIn(); 18191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 18291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim checkInputStream = inputUseBuffer->bufferHeader->pBuffer; 18391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 18491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim CODEC_ENC_BUFFER *codecInputBuffer = (CODEC_ENC_BUFFER *)srcInputData->pPrivate; 18591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim codecInputBuffer->dataSize = ((nFrameWidth * nFrameHeight) * 3) / 2; 18691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 18791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim unsigned int csc_src_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar); 18891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim unsigned int csc_dst_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar); 18991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim CSC_METHOD csc_method = CSC_METHOD_SW; 19091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim unsigned int cacheable = 1; 19191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 19291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim unsigned char *pSrcBuf[3] = {NULL, }; 19391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim unsigned char *pDstBuf[3] = {NULL, }; 19491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 19591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim CSC_ERRORCODE cscRet = CSC_ErrorNone; 19691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 19791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pSrcBuf[0] = checkInputStream; 19891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pSrcBuf[1] = checkInputStream + (nFrameWidth * nFrameHeight); 19991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pSrcBuf[2] = checkInputStream + (((nFrameWidth * nFrameHeight) * 5) / 4); 20091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 20191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pDstBuf[0] = srcInputData->buffer.multiPlaneBuffer.dataBuffer[0]; 20291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pDstBuf[1] = srcInputData->buffer.multiPlaneBuffer.dataBuffer[1]; 20391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pDstBuf[2] = srcInputData->buffer.multiPlaneBuffer.dataBuffer[2]; 20491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 20591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim csc_get_method(pVideoEnc->csc_handle, &csc_method); 20691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim if (csc_method == CSC_METHOD_HW) { 20791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pDstBuf[0] = srcInputData->buffer.multiPlaneBuffer.fd[0]; 20891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pDstBuf[1] = srcInputData->buffer.multiPlaneBuffer.fd[1]; 20991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pDstBuf[2] = srcInputData->buffer.multiPlaneBuffer.fd[2]; 21091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } 21191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 21291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim#ifdef USE_METADATABUFFERTYPE 21391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim OMX_PTR ppBuf[MAX_BUFFER_PLANE]; 21491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 21591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim /* kMetadataBufferTypeGrallocSource */ 21691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim if (exynosInputPort->bStoreMetaData == OMX_TRUE) { 21791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim /* ARGB8888 converted to YUV420SemiPlanar */ 21891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim csc_src_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_Format32bitARGB8888); 21991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim csc_dst_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar); 22091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 22191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)inputUseBuffer->bufferHeader->pBuffer, ppBuf); 22291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim if (eColorFormat == OMX_COLOR_FormatAndroidOpaque) { 22391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim ExynosVideoPlane planes[MAX_BUFFER_PLANE]; 22491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim OMX_U32 stride; 22591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim int imageSize; 22691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 22724eadba90486f04d1755de644e21b4eaeb7afe3eDima Zavin Exynos_OSAL_LockANBHandle((OMX_U32)ppBuf[0], nFrameWidth, nFrameHeight, OMX_COLOR_FormatAndroidOpaque, planes); 22891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim imageSize = nFrameWidth * nFrameHeight * 3; /* RGB888 */ 22991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 23091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim if (csc_method == CSC_METHOD_HW) 23191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pSrcBuf[0] = (unsigned char *)planes[0].fd; 23291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim else 23391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pSrcBuf[0] = planes[0].addr; 23491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pSrcBuf[1] = NULL; 23591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pSrcBuf[2] = NULL; 23691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } 23791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } else 23891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim#endif 23991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim { 24091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim if (csc_method == CSC_METHOD_HW) { 24191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pSrcBuf[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, checkInputStream); 24291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pSrcBuf[1] = NULL; 24391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pSrcBuf[2] = NULL; 24491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } 24591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 24691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim switch (eColorFormat) { 24791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim case OMX_COLOR_FormatYUV420Planar: 24891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim /* YUV420Planar converted to YUV420Semiplanar (interleaved UV plane) as per MFC spec.*/ 24991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim csc_src_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420Planar); 25091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim csc_dst_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar); 25191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim break; 25291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim case OMX_COLOR_FormatYUV420SemiPlanar: 25391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim case OMX_SEC_COLOR_FormatNV12Tiled: 25491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim case OMX_SEC_COLOR_FormatNV21Linear: 25591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim /* Just copied to MFC input buffer */ 25691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim csc_src_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar); 25791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim csc_dst_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar); 25891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim break; 25991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim default: 26091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim break; 26191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } 26291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } 26391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 26491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim csc_set_src_format( 26591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pVideoEnc->csc_handle, /* handle */ 26691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim nFrameWidth, /* width */ 26791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim nFrameHeight, /* height */ 26891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 0, /* crop_left */ 26991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 0, /* crop_right */ 27091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim nFrameWidth, /* crop_width */ 27191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim nFrameHeight, /* crop_height */ 27291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim csc_src_color_format, /* color_format */ 27391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim cacheable); /* cacheable */ 27491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim csc_set_dst_format( 27591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pVideoEnc->csc_handle, /* handle */ 27691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim nFrameWidth, /* width */ 27791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim nFrameHeight, /* height */ 27891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 0, /* crop_left */ 27991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 0, /* crop_right */ 28091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim nFrameWidth, /* crop_width */ 28191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim nFrameHeight, /* crop_height */ 28291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim csc_dst_color_format, /* color_format */ 28391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim cacheable); /* cacheable */ 28491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim csc_set_src_buffer( 28591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pVideoEnc->csc_handle, /* handle */ 2861331dddbbf32812a61ff7e146f977ee0f98b043eSeungBeom Kim pSrcBuf); /* YUV Addr or FD */ 28791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim csc_set_dst_buffer( 28891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim pVideoEnc->csc_handle, /* handle */ 2891331dddbbf32812a61ff7e146f977ee0f98b043eSeungBeom Kim pDstBuf); /* YUV Addr or FD */ 29091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim cscRet = csc_convert(pVideoEnc->csc_handle); 29191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim if (cscRet != CSC_ErrorNone) 29291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim ret = OMX_FALSE; 29391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim else 29491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim ret = OMX_TRUE; 29591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 29691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim#ifdef USE_METADATABUFFERTYPE 29791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim if (exynosInputPort->bStoreMetaData == OMX_TRUE) { 29891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim Exynos_OSAL_UnlockANBHandle((OMX_U32)ppBuf[0]); 29991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } 30091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim#endif 30191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 30291f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim ret = OMX_TRUE; 30391f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 30491f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom KimEXIT: 30591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim FunctionOut(); 30691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 30791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim return ret; 30891f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim} 30991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim 31038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *srcInputData) 31120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 31220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_BOOL ret = OMX_FALSE; 31320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 31420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 31538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 31638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *inputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer; 31738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 nFrameWidth = exynosInputPort->portDefinition.format.video.nFrameWidth; 31838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 nFrameHeight = exynosInputPort->portDefinition.format.video.nFrameHeight; 31938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COLOR_FORMATTYPE eColorFormat = exynosInputPort->portDefinition.format.video.eColorFormat; 32038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 copySize = 0; 32138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_BYTE checkInputStream = NULL; 32238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_U32 checkInputStreamLen = 0; 32338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_BOOL flagEOS = OMX_FALSE; 32420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 32538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 32620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 32738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 32838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((srcInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) || 32938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (srcInputData->pPrivate == NULL)) { 33038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_FALSE; 33138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 33220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 33338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 33420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 33538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (inputUseBuffer->dataValid == OMX_TRUE) { 33638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (exynosInputPort->bufferProcessType == BUFFER_SHARE) { 33738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_Shared_BufferToData(inputUseBuffer, srcInputData, ONE_PLANE); 33838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef USE_METADATABUFFERTYPE 33938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (exynosInputPort->bStoreMetaData == OMX_TRUE) { 34091f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim OMX_PTR ppBuf[MAX_BUFFER_PLANE]; 34191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim OMX_PTR allocSize[MAX_BUFFER_PLANE]; 34233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim int plane = 0; 34333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if (eColorFormat == OMX_COLOR_FormatAndroidOpaque) { 34433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)inputUseBuffer->bufferHeader->pBuffer, ppBuf); 34533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim ExynosVideoPlane planes[MAX_BUFFER_PLANE]; 34633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 34733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_LockANBHandle((OMX_U32)ppBuf[0], nFrameWidth, nFrameHeight, OMX_COLOR_FormatYUV420SemiPlanar, planes); 34833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 34933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim srcInputData->buffer.multiPlaneBuffer.fd[0] = planes[0].fd; 35033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim srcInputData->buffer.multiPlaneBuffer.fd[1] = planes[1].fd; 35133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim allocSize[0] = nFrameWidth * nFrameHeight; 35233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim allocSize[1] = nFrameWidth * nFrameHeight >> 1; 35333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 35433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) { 35591f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] = 35633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc->hSharedMemory, srcInputData->buffer.multiPlaneBuffer.fd[plane]); 35733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if(srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] == NULL) { 35833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] = 35933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_SharedMemory_Map(pVideoEnc->hSharedMemory, allocSize[plane], srcInputData->buffer.multiPlaneBuffer.fd[plane]); 36033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 36191f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } 36233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /* input buffers are 2 plane. */ 36333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim srcInputData->buffer.multiPlaneBuffer.dataBuffer[2] = NULL; 36433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim srcInputData->buffer.multiPlaneBuffer.fd[2] = -1; 36533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s:%d YAddr: 0x%x CbCrAddr: 0x%x", __FUNCTION__, __LINE__, (unsigned int)ppBuf[0], (unsigned int)ppBuf[0]); 36633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } else { 36733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /* kMetadataBufferTypeCameraSource */ 36833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)inputUseBuffer->bufferHeader->pBuffer, ppBuf); 36933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim srcInputData->buffer.multiPlaneBuffer.fd[0] = ppBuf[0]; 37033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim srcInputData->buffer.multiPlaneBuffer.fd[1] = ppBuf[1]; 37133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim allocSize[0] = nFrameWidth * nFrameHeight; 37233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim allocSize[1] = nFrameWidth * nFrameHeight >> 1; 37333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 37433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) { 37533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] = 37633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc->hSharedMemory, srcInputData->buffer.multiPlaneBuffer.fd[plane]); 37733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if(srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] == NULL) { 37833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] = 37933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_SharedMemory_Map(pVideoEnc->hSharedMemory, allocSize[plane], srcInputData->buffer.multiPlaneBuffer.fd[plane]); 38033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 38133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 38233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /* input buffers are 2 plane. */ 38333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim srcInputData->buffer.multiPlaneBuffer.dataBuffer[2] = NULL; 38433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim srcInputData->buffer.multiPlaneBuffer.fd[2] = -1; 38533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s:%d YAddr: 0x%x CbCrAddr: 0x%x", __FUNCTION__, __LINE__, (unsigned int)ppBuf[0], (unsigned int)ppBuf[0]); 38691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim } 38720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 38838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif 38938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* reset dataBuffer */ 39038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_ResetDataBuffer(inputUseBuffer); 39138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 39238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang checkInputStream = inputUseBuffer->bufferHeader->pBuffer + inputUseBuffer->usedDataLen; 39338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang checkInputStreamLen = inputUseBuffer->remainDataLen; 39438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 395833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pExynosComponent->bUseFlagEOF = OMX_TRUE; 39638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 397833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (checkInputStreamLen == 0) { 398833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim inputUseBuffer->nFlags |= OMX_BUFFERFLAG_EOS; 399833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim flagEOS = OMX_TRUE; 40020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 40120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 402833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim copySize = checkInputStreamLen; 403833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_TRUE"); 40420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 40538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (((srcInputData->allocSize) - (srcInputData->dataLen)) >= copySize) { 40691f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim Exynos_CSC_InputData(pOMXComponent, srcInputData); 407833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 40838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputUseBuffer->dataLen -= copySize; 40938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputUseBuffer->remainDataLen -= copySize; 41038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputUseBuffer->usedDataLen += copySize; 41120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 41238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang srcInputData->dataLen += copySize; 41338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang srcInputData->remainDataLen += copySize; 41420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 41538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang srcInputData->timeStamp = inputUseBuffer->timeStamp; 41638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang srcInputData->nFlags = inputUseBuffer->nFlags; 41738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang srcInputData->bufferHeader = inputUseBuffer->bufferHeader; 41838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 41938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "input codec buffer is smaller than decoded input data size Out Length"); 42038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 42138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 42238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, OMX_ErrorUndefined, 0, NULL); 423833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_FALSE; 42420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 42520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 42638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (((exynosInputPort->bStoreMetaData == OMX_TRUE) && (eColorFormat == OMX_COLOR_FormatAndroidOpaque)) || 42738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (exynosInputPort->bStoreMetaData == OMX_FALSE)) { 4283e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_InputBufferReturn(pOMXComponent); 42920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 43038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang inputUseBuffer->dataValid = OMX_TRUE; 43120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 43220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 43320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 43438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((srcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) { 4353e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "bSaveFlagEOS : OMX_TRUE"); 43638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang srcInputData->dataLen = 0; 43738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang srcInputData->remainDataLen = 0; 43838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->bSaveFlagEOS = OMX_TRUE; 43938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 44038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 441833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) { 442833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_TRUE; 443833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pExynosComponent->checkTimeStamp.startTimeStamp = srcInputData->timeStamp; 444833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pExynosComponent->checkTimeStamp.nStartFlags = srcInputData->nFlags; 445833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE; 446833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "first frame timestamp after seeking %lld us (%.2f secs)", 447833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim srcInputData->timeStamp, srcInputData->timeStamp / 1E6); 44820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 449833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim 450833233fa90e887401bbd194a34dd4f1e1428bc03SeungBeom Kim ret = OMX_TRUE; 45120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 45220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 45338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 45438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 45538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 45620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 45720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 45820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 45920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 46038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *dstOutputData) 46120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 46220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_BOOL ret = OMX_FALSE; 46320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 46438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 46538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *outputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer; 46620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_U32 copySize = 0; 46720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 46838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 46938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 47038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) { 47138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (Exynos_Shared_DataToBuffer(dstOutputData, outputUseBuffer) == OMX_ErrorNone) 47238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer->dataValid = OMX_TRUE; 47338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 47438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 47520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (outputUseBuffer->dataValid == OMX_TRUE) { 47620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp == OMX_TRUE) { 47738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (pExynosComponent->checkTimeStamp.startTimeStamp == dstOutputData->timeStamp){ 47820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->checkTimeStamp.startTimeStamp = -19761123; 47920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->checkTimeStamp.nStartFlags = 0x0; 48020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE; 48120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE; 48220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 4830b9f280f1a2ddf2ed7fe5e62adba9251c72ffbe1SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "garbage frame drop after flush"); 48420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_TRUE; 48520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 48620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 48720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) { 48820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_TRUE; 4890b9f280f1a2ddf2ed7fe5e62adba9251c72ffbe1SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input buffer has not come after flush."); 49020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 49120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 49220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 49338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 49438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (dstOutputData->remainDataLen <= (outputUseBuffer->allocSize - outputUseBuffer->dataLen)) { 49538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang copySize = dstOutputData->remainDataLen; 49638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (copySize > 0) 49738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Memcpy((outputUseBuffer->bufferHeader->pBuffer + outputUseBuffer->dataLen), 49838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (dstOutputData->buffer.singlePlaneBuffer.dataBuffer + dstOutputData->usedDataLen), 49938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang copySize); 50038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer->dataLen += copySize; 50138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer->remainDataLen += copySize; 50238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer->nFlags = dstOutputData->nFlags; 50338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang outputUseBuffer->timeStamp = dstOutputData->timeStamp; 50420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 50538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_TRUE; 50620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 50738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((outputUseBuffer->remainDataLen > 0) || 50838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS)) { 50938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OutputBufferReturn(pOMXComponent); 51038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 51138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 51238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "output buffer is smaller than encoded data size Out Length"); 51338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent, 51438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->callbackData, 51538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_EventError, OMX_ErrorUndefined, 0, NULL); 51638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_FALSE; 51738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 51838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) { 51920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((outputUseBuffer->remainDataLen > 0) || 520440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) || 52138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) 52220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OutputBufferReturn(pOMXComponent); 52338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 52438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } else { 52538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_FALSE; 52638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 52738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 52838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 52938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 53038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 53138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 53238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 53338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 53433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim#ifdef USE_METADATABUFFERTYPE 53533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom KimOMX_ERRORTYPE Exynos_OMX_ExtensionSetup(OMX_HANDLETYPE hComponent) 53633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim{ 53733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim OMX_ERRORTYPE ret = OMX_ErrorNone; 53833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 53933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 54033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 54133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 54233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim EXYNOS_OMX_DATABUFFER *srcInputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer; 54333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim EXYNOS_OMX_DATA *pSrcInputData = &exynosInputPort->processData; 54433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim OMX_COLOR_FORMATTYPE eColorFormat = exynosInputPort->portDefinition.format.video.eColorFormat; 54533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 54633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim int i = 0; 54733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim OMX_PTR ppBuf[MAX_BUFFER_PLANE]; 54833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 54933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 55033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /* kMetadataBufferTypeGrallocSource */ 55133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if (exynosInputPort->bStoreMetaData == OMX_TRUE) { 55233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)srcInputUseBuffer->bufferHeader->pBuffer, ppBuf); 55333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if (eColorFormat == OMX_COLOR_FormatAndroidOpaque) { 55433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->ANBColorFormat = Exynos_OSAL_GetANBColorFormat(ppBuf[0]); 55533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if ((pVideoEnc->ANBColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) || 55633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV12Tiled)) { 55733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim exynosInputPort->bufferProcessType = BUFFER_SHARE; 55833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } else { 55933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim exynosInputPort->bufferProcessType = BUFFER_COPY; 56033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 56133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 56233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 56333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_SemaphoreCreate(&exynosInputPort->codecSemID); 56433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_QueueCreate(&exynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); 56533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 56633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) { 56733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER)); 56833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /* Use ION Allocator */ 56933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /*Alloc Y-Buffer */ 57033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_YBUFFER_SIZE, NORMAL_MEMORY); 57133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->fd[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]); 57233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE; 57333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /*Alloc C-Buffer */ 57433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_CBUFFER_SIZE, NORMAL_MEMORY); 57533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->fd[1] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]); 57633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE; 57733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 57833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0; 57933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 58033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if ((pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] == NULL) || 58133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] == NULL)) { 58233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer"); 58333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim ret = OMX_ErrorInsufficientResources; 58433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim goto EXIT; 58533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 58633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 58733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /* MFC input buffers are 1 plane. */ 58833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[2] = NULL; 58933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->fd[2] = -1; 59033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[2] = 0; 59133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 59233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]); 59333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]); 59433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]); 59533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 59633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]); 59733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 59833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } else if (exynosInputPort->bufferProcessType == BUFFER_SHARE) { 59933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /*************/ 60033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /* TBD */ 60133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /*************/ 60233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim /* Does not require any actions. */ 60333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 60433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 60533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 60633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 60733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 60833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom KimEXIT: 60933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 61033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim return ret; 61133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim} 61233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim#endif 61333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim 61438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent) 61538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 61638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 61738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 61838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 61938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 62038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 62138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *srcInputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer; 62238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATA *pSrcInputData = &exynosInputPort->processData; 62338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_BOOL bCheckInputData = OMX_FALSE; 62438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_BOOL bValidCodecData = OMX_FALSE; 62538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 62638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 62738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 62838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (!pVideoEnc->bExitBufferProcessThread) { 62938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 63038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_Wait_ProcessPause(pExynosComponent, INPUT_PORT_INDEX); 63138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 63238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while ((Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) && 63338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!pVideoEnc->bExitBufferProcessThread)) { 63438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 63538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 63638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (CHECK_PORT_BEING_FLUSHED(exynosInputPort)) 63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 63838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (exynosInputPort->portState != OMX_StateIdle) 63938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 64038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 64138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexLock(srcInputUseBuffer->bufferMutex); 64233d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if (pVideoEnc->bFirstInput == OMX_FALSE) { 64333d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 64433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim OMX_PTR codecBuffer; 64533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if ((pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) || (pSrcInputData->pPrivate == NULL)) { 64633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_CodecBufferDeQueue(pExynosComponent, INPUT_PORT_INDEX, &codecBuffer); 64733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if (codecBuffer != NULL) { 64833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_Input_CodecBufferToData(pExynosComponent, codecBuffer, pSrcInputData); 64933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 65033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex); 65133d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim break; 65238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 65338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 65438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 65533d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim if (srcInputUseBuffer->dataValid == OMX_TRUE) { 65633d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim bCheckInputData = Exynos_Preprocessor_InputData(pOMXComponent, pSrcInputData); 65733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } else { 65833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim bCheckInputData = OMX_FALSE; 65933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 66038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 66138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((bCheckInputData == OMX_FALSE) && 66238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(exynosInputPort))) { 66338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_InputBufferGetQueue(pExynosComponent); 66433d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim#ifdef USE_METADATABUFFERTYPE 665af4568d16d0afed7604e9496ad42e2fcf1e44fdeSeungBeom Kim if ((pVideoEnc->bFirstInput == OMX_TRUE) && 666af4568d16d0afed7604e9496ad42e2fcf1e44fdeSeungBeom Kim (!CHECK_PORT_BEING_FLUSHED(exynosInputPort))) { 66733d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim Exynos_OMX_ExtensionSetup(hComponent); 66833d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->bFirstInput = OMX_FALSE; 66933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim } 67033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim#endif 67138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex); 67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 67338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 67438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 67538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (CHECK_PORT_BEING_FLUSHED(exynosInputPort)) { 67638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex); 67738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 67838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 67938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 68038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = pVideoEnc->exynos_codec_srcInputProcess(pOMXComponent, pSrcInputData); 68138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_ResetCodecData(pSrcInputData); 68238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex); 68338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret == OMX_ErrorCodecInit) 68438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->bExitBufferProcessThread = OMX_TRUE; 68538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 68638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 68738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 68838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 68938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 69038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 69138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 69338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 69438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 69538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent) 69638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 69738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 69838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 69938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 70038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 70138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 70238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *srcOutputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.outputDataBuffer; 70338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATA srcOutputData; 70438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 70538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 70638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 70738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (!pVideoEnc->bExitBufferProcessThread) { 70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 71038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (!pVideoEnc->bExitBufferProcessThread) { 71138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 71238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX) == OMX_FALSE) 71338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 71438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 71538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 71638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (CHECK_PORT_BEING_FLUSHED(exynosInputPort)) 71838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 71938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 72038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexLock(srcOutputUseBuffer->bufferMutex); 72138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = pVideoEnc->exynos_codec_srcOutputProcess(pOMXComponent, &srcOutputData); 72220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 72338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret == OMX_ErrorNone) { 72438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 72538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PTR codecBuffer; 72638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang codecBuffer = srcOutputData.pPrivate; 72738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecBuffer != NULL) 72838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, codecBuffer); 72938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (exynosInputPort->bufferProcessType == BUFFER_SHARE) { 73138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_Shared_DataToBuffer(&srcOutputData, srcOutputUseBuffer); 73238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_InputBufferReturn(pOMXComponent); 73338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 73438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_ResetCodecData(&srcOutputData); 73538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 73638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(srcOutputUseBuffer->bufferMutex); 73720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 73820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 73920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 74020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 74138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 74238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 74338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 74420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 74520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 74620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 74738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent) 74820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 74938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 75038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 75138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 75220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 75338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 75438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *dstInputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.inputDataBuffer; 75538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATA dstInputData; 75638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 75720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 75820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 75938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (!pVideoEnc->bExitBufferProcessThread) { 76020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SleepMillisec(0); 76120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 76238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) && 76338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!pVideoEnc->bExitBufferProcessThread)) { 76420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_SleepMillisec(0); 76520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 76638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) || 76738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_POPULATED(exynosOutputPort))) 76838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 76938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (exynosOutputPort->portState != OMX_StateIdle) 77038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 77138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 77238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexLock(dstInputUseBuffer->bufferMutex); 77338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 77438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PTR codecBuffer; 77538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_CodecBufferDeQueue(pExynosComponent, OUTPUT_PORT_INDEX, &codecBuffer); 77638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 77738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex); 77820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang break; 77920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 78038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_Output_CodecBufferToData(pExynosComponent, codecBuffer, &dstInputData); 78120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 78220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 78338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) { 78438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((dstInputUseBuffer->dataValid != OMX_TRUE) && 78538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) { 78638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OutputBufferGetQueue(pExynosComponent); 78738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 78838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex); 789d03573a4a182b0a36eaa16fb7638d98429d1c3fbSeungBeom Kim break; 79020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 79138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_Shared_BufferToData(dstInputUseBuffer, &dstInputData, ONE_PLANE); 79238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_ResetDataBuffer(dstInputUseBuffer); 79320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 79420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 79520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 79638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) { 79738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex); 79838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 79938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 80038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = pVideoEnc->exynos_codec_dstInputProcess(pOMXComponent, &dstInputData); 80120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 80238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_ResetCodecData(&dstInputData); 80338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex); 80420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 80520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 80620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 80720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 80838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 80920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 81020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 81120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 81220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 81320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 81438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent) 81520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 81638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 81738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 81838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 81938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 82038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASEPORT *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATABUFFER *dstOutputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer; 82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_DATA *pDstOutputData = &exynosOutputPort->processData; 82338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 82420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 82520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 82638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (!pVideoEnc->bExitBufferProcessThread) { 82738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_Wait_ProcessPause(pExynosComponent, OUTPUT_PORT_INDEX); 82920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 83038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) && 83138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!pVideoEnc->bExitBufferProcessThread)) { 83238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SleepMillisec(0); 83320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 83438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) 83538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 83620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 83738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexLock(dstOutputUseBuffer->bufferMutex); 83838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 83938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((dstOutputUseBuffer->dataValid != OMX_TRUE) && 84038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) { 84138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OutputBufferGetQueue(pExynosComponent); 84238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 84338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex); 84438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang break; 84538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 84638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 84720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 84820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 84938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((dstOutputUseBuffer->dataValid == OMX_TRUE) || 85038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (exynosOutputPort->bufferProcessType == BUFFER_SHARE)) 85138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = pVideoEnc->exynos_codec_dstOutputProcess(pOMXComponent, pDstOutputData); 85220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 85338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (((ret == OMX_ErrorNone) && (dstOutputUseBuffer->dataValid == OMX_TRUE)) || 85438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang (exynosOutputPort->bufferProcessType == BUFFER_SHARE)) { 85538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData); 85620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 85720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 85838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { 85938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_PTR codecBuffer; 86038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang codecBuffer = pDstOutputData->pPrivate; 86138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (codecBuffer != NULL) { 86238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, codecBuffer); 86338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pDstOutputData->pPrivate = NULL; 86438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 86538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 86620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 86738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang /* reset outputData */ 86838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_ResetCodecData(pDstOutputData); 86938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex); 87020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 87120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 87220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 87320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 87438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 87520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 87620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 87720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 87820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 87938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 88038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic OMX_ERRORTYPE Exynos_OMX_SrcInputProcessThread(OMX_PTR threadData) 88120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 88238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 88338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 88420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 88538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_MESSAGE *message = NULL; 88620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 88720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 88820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 88938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (threadData == NULL) { 89020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 89120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 89220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 89338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)threadData; 89420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 89520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 89620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 89720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 89820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 89938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_SrcInputBufferProcess(pOMXComponent); 90020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 90138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_ThreadExit(NULL); 90220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 90338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 90438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 90520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 90638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 90738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 90820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 90938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic OMX_ERRORTYPE Exynos_OMX_SrcOutputProcessThread(OMX_PTR threadData) 91038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 91138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 91238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 91338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 91438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_MESSAGE *message = NULL; 91520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 91638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 91720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 91838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (threadData == NULL) { 91938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = OMX_ErrorBadParameter; 92038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 92120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 92238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)threadData; 92338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 92438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret != OMX_ErrorNone) { 92538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang goto EXIT; 92620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 92738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 92838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_SrcOutputBufferProcess(pOMXComponent); 92920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 93038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_ThreadExit(NULL); 93120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 93220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 93320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 93420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 93520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 93620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 93720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 93838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic OMX_ERRORTYPE Exynos_OMX_DstInputProcessThread(OMX_PTR threadData) 93920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 94038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 94138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 94220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 94338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_MESSAGE *message = NULL; 94420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 94520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 94620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 94738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (threadData == NULL) { 94820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 94920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 95020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 95138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)threadData; 95220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 95320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 95420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 95520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 95620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 95738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_DstInputBufferProcess(pOMXComponent); 95820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 95938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_ThreadExit(NULL); 96020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 96120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 96220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 96320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 96420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 96520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 96620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 96738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changstatic OMX_ERRORTYPE Exynos_OMX_DstOutputProcessThread(OMX_PTR threadData) 96838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 96938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 97038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 97120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 97238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_MESSAGE *message = NULL; 97320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 97420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 97520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 97638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (threadData == NULL) { 97720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 97820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 97920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 98038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)threadData; 98120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 98220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 98320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 98420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 98520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 98638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_DstOutputBufferProcess(pOMXComponent); 98720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 98838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_ThreadExit(NULL); 98920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 99020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 99120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 99220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 99320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 99420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 99520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 99638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_BufferProcess_Create(OMX_HANDLETYPE hComponent) 99720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 99838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 99938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 100038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 100138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 100220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 100320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 100420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 100538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->bExitBufferProcessThread = OMX_FALSE; 100638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 100738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OSAL_ThreadCreate(&pVideoEnc->hDstOutputThread, 100838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_DstOutputProcessThread, 100938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent); 101038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret == OMX_ErrorNone) 101138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OSAL_ThreadCreate(&pVideoEnc->hSrcOutputThread, 101238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_SrcOutputProcessThread, 101338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent); 101438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret == OMX_ErrorNone) 101538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OSAL_ThreadCreate(&pVideoEnc->hDstInputThread, 101638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_DstInputProcessThread, 101738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent); 101838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (ret == OMX_ErrorNone) 101938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang ret = Exynos_OSAL_ThreadCreate(&pVideoEnc->hSrcInputThread, 102038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OMX_SrcInputProcessThread, 102138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pOMXComponent); 102220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 102338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT: 102438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionOut(); 102520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 102638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return ret; 102738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 102820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 102938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent) 103038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 103138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 103238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 103338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 103438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 103538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang OMX_S32 countValue = 0; 103638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang unsigned int i = 0; 103738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 103838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang FunctionIn(); 103938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 104038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->bExitBufferProcessThread = OMX_TRUE; 104138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 104238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID, &countValue); 104338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (countValue == 0) 104438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID); 104538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID, &countValue); 104638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (countValue == 0) 104738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID); 104838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent); 104938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_ThreadTerminate(pVideoEnc->hSrcInputThread); 105038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->hSrcInputThread = NULL; 105138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 105238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID, &countValue); 105338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (countValue == 0) 105438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID); 105538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID, &countValue); 105638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (countValue == 0) 105738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID); 105838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent); 105938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_ThreadTerminate(pVideoEnc->hDstInputThread); 106038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->hDstInputThread = NULL; 106138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 106238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_stop(pOMXComponent, INPUT_PORT_INDEX); 106338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX); 106438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent); 106538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_ThreadTerminate(pVideoEnc->hSrcOutputThread); 106638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->hSrcOutputThread = NULL; 106738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 106838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_stop(pOMXComponent, OUTPUT_PORT_INDEX); 106938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX); 107038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent); 107138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_ThreadTerminate(pVideoEnc->hDstOutputThread); 107238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->hDstOutputThread = NULL; 107320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 107420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 107520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 107620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 107720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 107820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 107920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 108020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_VideoEncodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent) 108120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 108220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 108320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 108420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 108520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 108620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; 108720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 108820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 108920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 109020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 109120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 109220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 109320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 109420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 109520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 109620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 109720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__); 109820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 109920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 110020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 110120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_BaseComponent_Constructor(pOMXComponent); 110220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 110320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__); 110420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 110520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 110620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 110720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Port_Constructor(pOMXComponent); 110820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 110920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OMX_BaseComponent_Destructor(pOMXComponent); 111020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__); 111120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 111220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 111320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 111420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 111520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 111620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoEnc = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_VIDEOENC_COMPONENT)); 111720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pVideoEnc == NULL) { 111820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OMX_BaseComponent_Destructor(pOMXComponent); 111920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInsufficientResources; 112020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__); 112120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 112220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 112320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 112420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(pVideoEnc, 0, sizeof(EXYNOS_OMX_VIDEOENC_COMPONENT)); 112520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->hComponentHandle = (OMX_HANDLETYPE)pVideoEnc; 112620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 112720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->bSaveFlagEOS = OMX_FALSE; 112820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 112933d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->bFirstInput = OMX_FALSE; 113033d6044e338e2ea5c8580b6a52840808e459d998SeungBeom Kim pVideoEnc->bFirstOutput = OMX_FALSE; 113120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoEnc->configChange = OMX_FALSE; 113238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->quantization.nQpI = 4; // I frame quantization parameter 113338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->quantization.nQpP = 5; // P frame quantization parameter 113438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pVideoEnc->quantization.nQpB = 5; // B frame quantization parameter 113538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 113638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->bMultiThreadProcess = OMX_TRUE; 113720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 113820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Input port */ 113920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; 114020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_INPUTBUFFER_NUM; 114120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_INPUTBUFFER_NUM; 114220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.nBufferSize = 0; 114320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo; 114420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 114520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE); 114620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video"); 114720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.pNativeRender = 0; 114820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE; 114920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 115020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 115120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameWidth = 0; 115220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameHeight= 0; 115320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nStride = 0; 115420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nSliceHeight = 0; 115520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nBitrate = 64000; 115620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.xFramerate = (15 << 16); 115720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused; 115820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.pNativeWindow = NULL; 115920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoEnc->eControlRate[INPUT_PORT_INDEX] = OMX_Video_ControlRateDisable; 116020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 116120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->bStoreMetaData = OMX_FALSE; 116220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 116320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* Output port */ 116420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; 116520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_OUTPUTBUFFER_NUM; 116620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_OUTPUTBUFFER_NUM; 116720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE; 116820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo; 116920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 117020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE); 117120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video"); 117220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.pNativeRender = 0; 117320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE; 117420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused; 117520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 117620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameWidth = 0; 117720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nFrameHeight= 0; 117820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nStride = 0; 117920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nSliceHeight = 0; 118020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.nBitrate = 64000; 118120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.xFramerate = (15 << 16); 118220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused; 118320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.pNativeWindow = NULL; 118420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoEnc->eControlRate[OUTPUT_PORT_INDEX] = OMX_Video_ControlRateDisable; 118520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 118620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->UseBuffer = &Exynos_OMX_UseBuffer; 118720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->AllocateBuffer = &Exynos_OMX_AllocateBuffer; 118820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->FreeBuffer = &Exynos_OMX_FreeBuffer; 118920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->ComponentTunnelRequest = &Exynos_OMX_ComponentTunnelRequest; 119020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 119120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->exynos_AllocateTunnelBuffer = &Exynos_OMX_AllocateTunnelBuffer; 119220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->exynos_FreeTunnelBuffer = &Exynos_OMX_FreeTunnelBuffer; 119338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->exynos_BufferProcessCreate = &Exynos_OMX_BufferProcess_Create; 119438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->exynos_BufferProcessTerminate = &Exynos_OMX_BufferProcess_Terminate; 119538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang pExynosComponent->exynos_BufferFlush = &Exynos_OMX_BufferFlush; 119620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 119720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 119820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 119920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 120020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 120120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 120220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 120320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_VideoEncodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent) 120420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 120520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 120620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 120720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL; 120820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_BASEPORT *pExynosPort = NULL; 120920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL; 121020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int i = 0; 121120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 121220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 121320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 121420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (hComponent == NULL) { 121520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 121620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 121720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 121820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)hComponent; 121920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE)); 122020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 122120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 122220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 122320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 122420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent->pComponentPrivate == NULL) { 122520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 122620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 122720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 122820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; 122920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 123020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle; 123138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 123220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pVideoEnc); 123320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosComponent->hComponentHandle = pVideoEnc = NULL; 123420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 123520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for(i = 0; i < ALL_PORT_NUM; i++) { 123620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort = &pExynosComponent->pExynosPort[i]; 123720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pExynosPort->portDefinition.format.video.cMIMEType); 123820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pExynosPort->portDefinition.format.video.cMIMEType = NULL; 123920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 124020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 124120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_Port_Destructor(pOMXComponent); 124220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 124320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OMX_BaseComponent_Destructor(hComponent); 124420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 124520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 124620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 124720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 124820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 124920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 1250