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