138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang/*
238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *
338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Copyright 2012 Samsung Electronics S.LSI Co. LTD
438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *
538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Licensed under the Apache License, Version 2.0 (the "License");
638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * you may not use this file except in compliance with the License.
738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * You may obtain a copy of the License at
838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *
938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *      http://www.apache.org/licenses/LICENSE-2.0
1038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *
1138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Unless required by applicable law or agreed to in writing, software
1238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * distributed under the License is distributed on an "AS IS" BASIS,
1338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * See the License for the specific language governing permissions and
1538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * limitations under the License.
1638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang */
1738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
1838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang/*
1938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @file        Exynos_OMX_VdecControl.c
2038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @brief
2138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
2238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version     2.0.0
2338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @history
2438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *   2012.02.20 : Create
2538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang */
2638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
2738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include <stdio.h>
2838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include <stdlib.h>
2938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include <string.h>
3038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OMX_Macros.h"
3138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Event.h"
3238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OMX_Vdec.h"
3338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OMX_VdecControl.h"
3438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OMX_Basecomponent.h"
3538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Thread.h"
3638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Semaphore.h"
3738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Mutex.h"
3838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_ETC.h"
3938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_SharedMemory.h"
4038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Queue.h"
4138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "csc.h"
4238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
4338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef USE_ANB
4438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Android.h"
4538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif
4638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
4738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#undef  EXYNOS_LOG_TAG
4838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#define EXYNOS_LOG_TAG    "EXYNOS_VIDEO_DECCONTROL"
4938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#define EXYNOS_LOG_OFF
5038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//#define EXYNOS_TRACE_ON
5138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#include "Exynos_OSAL_Log.h"
5238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
5338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
5438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_UseBuffer(
5538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_HANDLETYPE            hComponent,
5638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,
5738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_U32                   nPortIndex,
5838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_PTR                   pAppPrivate,
5938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_U32                   nSizeBytes,
6038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_U8                   *pBuffer)
6138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
6238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
6338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
6438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
6538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
6638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
6738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                i = 0;
6838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
6938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
7038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
7138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (hComponent == NULL) {
7238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
7338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
7438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
7538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
7638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
7738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
7838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
7938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
8038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
8138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
8238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
8338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
8438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
8538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
8638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
8738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
8838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPortIndex >= pExynosComponent->portParam.nPorts) {
8938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadPortIndex;
9038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
9138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
9238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosPort->portState != OMX_StateIdle) {
9338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
9438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
9538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
9638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
9738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
9838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadPortIndex;
9938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
10038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
10138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
10238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
10338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (temp_bufferHeader == NULL) {
10438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
10538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
10638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
10738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
10838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
10938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
11038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
11138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
11238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ASSIGNED | HEADER_STATE_ALLOCATED);
11338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
11438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            temp_bufferHeader->pBuffer        = pBuffer;
11538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            temp_bufferHeader->nAllocLen      = nSizeBytes;
11638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            temp_bufferHeader->pAppPrivate    = pAppPrivate;
11738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (nPortIndex == INPUT_PORT_INDEX)
11838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
11938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            else
12038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
12138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
12238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->assignedBufferNum++;
12338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
12438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosPort->portDefinition.bPopulated = OMX_TRUE;
12538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
12638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
12738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
12838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
12938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            *ppBufferHdr = temp_bufferHeader;
13038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorNone;
13138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
13238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
13338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
13438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
13538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Free(temp_bufferHeader);
13638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorInsufficientResources;
13738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
13838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
13938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
14038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
14138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
14238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
14338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
14438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
14538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_HANDLETYPE            hComponent,
14638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_INOUT OMX_BUFFERHEADERTYPE **ppBuffer,
14738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_U32                   nPortIndex,
14838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_PTR                   pAppPrivate,
14938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_U32                   nSizeBytes)
15038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
15138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
15238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
15338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
15438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
15538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
15638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
15738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U8                *temp_buffer = NULL;
15821015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim    int                    temp_buffer_fd = -1;
15938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                i = 0;
16001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin    MEMORY_TYPE            mem_type;
16138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
16238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
16338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
16438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (hComponent == NULL) {
16538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
16638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
16738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
16838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
16938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
17038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
17138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
17238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
17338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
17438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
17538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
17638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
17738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
17838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
17938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
18038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
18138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
18238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPortIndex >= pExynosComponent->portParam.nPorts) {
18338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadPortIndex;
18438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
18538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
18638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang/*
18738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosPort->portState != OMX_StateIdle ) {
18838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
18938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
19038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
19138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang*/
19238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
19338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadPortIndex;
19438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
19538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
19638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
19738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pVideoDec->bDRMPlayerMode == OMX_TRUE) && (nPortIndex == INPUT_PORT_INDEX)) {
19801fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        mem_type = SECURE_MEMORY;
19938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
20001fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        mem_type = NORMAL_MEMORY;
20138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
20201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        mem_type = SYSTEM_MEMORY;
20301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin    }
20401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin    temp_buffer = Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nSizeBytes, mem_type);
20501fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin    if (temp_buffer == NULL) {
20601fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        ret = OMX_ErrorInsufficientResources;
20701fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        goto EXIT;
20838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
20901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin    temp_buffer_fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, temp_buffer);
21038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
21138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
21238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (temp_bufferHeader == NULL) {
21301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer);
21438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
21538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
21638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
21738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
21838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
21938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
22038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
22138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
22201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin            pExynosPort->extendBufferHeader[i].buf_fd[0] = temp_buffer_fd;
22338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED);
22438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
22521015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim            if (mem_type == SECURE_MEMORY)
22621015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim                temp_bufferHeader->pBuffer = temp_buffer_fd;
22721015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim            else
22821015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim                temp_bufferHeader->pBuffer = temp_buffer;
22938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            temp_bufferHeader->nAllocLen      = nSizeBytes;
23038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            temp_bufferHeader->pAppPrivate    = pAppPrivate;
23138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (nPortIndex == INPUT_PORT_INDEX)
23238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
23338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            else
23438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
23538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->assignedBufferNum++;
23638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
23738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosPort->portDefinition.bPopulated = OMX_TRUE;
23838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
23938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
24038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
24138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
24238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            *ppBuffer = temp_bufferHeader;
24338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorNone;
24438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
24538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
24638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
24738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
24838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Free(temp_bufferHeader);
24901fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer);
25038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
25138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorInsufficientResources;
25238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
25338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
25438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
25538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
25638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
25738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
25838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
25938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_FreeBuffer(
26038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
26138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_U32        nPortIndex,
26238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr)
26338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
26438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
26538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
26638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
26738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
26838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
26938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
27038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U8                *temp_buffer = NULL;
27138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                i = 0;
27238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
27338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
27438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
27538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (hComponent == NULL) {
27638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
27738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
27838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
27938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
28038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
28138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
28238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
28338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
28438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
28538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
28638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
28738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
28838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
28938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
29038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
29138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
29238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
29338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
29438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadPortIndex;
29538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
29638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
29738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
29838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosPort->portState != OMX_StateLoaded) && (pExynosPort->portState != OMX_StateInvalid)) {
29938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (*(pExynosComponent->pCallbacks->EventHandler)) (pOMXComponent,
30038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        pExynosComponent->callbackData,
30138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        (OMX_U32)OMX_EventError,
30238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        (OMX_U32)OMX_ErrorPortUnpopulated,
30338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        nPortIndex, NULL);
30438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
30538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
30638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    for (i = 0; i < /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM; i++) {
30738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (((pExynosPort->bufferStateAllocate[i] | BUFFER_STATE_FREE) != 0) && (pExynosPort->extendBufferHeader[i].OMXBufferHeader != NULL)) {
30838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer == pBufferHdr->pBuffer) {
30938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ALLOCATED) {
31021015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim                    if ((pVideoDec->bDRMPlayerMode == OMX_TRUE) && (nPortIndex == INPUT_PORT_INDEX)) {
31121015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim                        OMX_PTR mapBuffer = Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec->hSharedMemory, (int)pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
31221015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, mapBuffer);
31321015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim                    } else {
31421015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
31521015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim                    }
31638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer = NULL;
31738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pBufferHdr->pBuffer = NULL;
31838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                } else if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ASSIGNED) {
31938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    ; /* None*/
32038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
32138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosPort->assignedBufferNum--;
32238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (pExynosPort->bufferStateAllocate[i] & HEADER_STATE_ALLOCATED) {
32338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader);
32438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pExynosPort->extendBufferHeader[i].OMXBufferHeader = NULL;
32538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    pBufferHdr = NULL;
32638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
32738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosPort->bufferStateAllocate[i] = BUFFER_STATE_FREE;
32838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorNone;
32938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
33038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
33138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
33238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
33338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
33438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
33538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret == OMX_ErrorNone) {
33638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pExynosPort->assignedBufferNum == 0) {
33738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosPort->unloadedResource signal set");
33838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
33938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SemaphorePost(pExynosPort->unloadedResource);
34038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
34138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->portDefinition.bPopulated = OMX_FALSE;
34238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
34338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
34438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
34538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
34638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
34738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
34838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
34938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
35038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
35138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
35238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE                 ret = OMX_ErrorNone;
35338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT             *pExynosPort = NULL;
35438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_BUFFERHEADERTYPE         *temp_bufferHeader = NULL;
35538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U8                       *temp_buffer = NULL;
35638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                       bufferSize = 0;
35738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_PARAM_PORTDEFINITIONTYPE  portDefinition;
35838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
35938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorTunnelingUnsupported;
36038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
36138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
36238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
36338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
36438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
36538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
36638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
36738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT* pExynosPort = NULL;
36838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_BUFFERHEADERTYPE* temp_bufferHeader = NULL;
36938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U8 *temp_buffer = NULL;
37038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32 bufferSize = 0;
37138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
37238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorTunnelingUnsupported;
37338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
37438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
37538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
37638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
37738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentTunnelRequest(
37838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_HANDLETYPE hComp,
37938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_U32        nPort,
38038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_HANDLETYPE hTunneledComp,
38138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_U32        nTunneledPort,
38238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_INOUT OMX_TUNNELSETUPTYPE *pTunnelSetup)
38338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
38438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
38538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
38638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorTunnelingUnsupported;
38738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
38838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
38938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
39038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
39138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_GetFlushBuffer(EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_DATABUFFER *pDataBuffer[])
39238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
39338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
39438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
39538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
39638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
39738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    *pDataBuffer = NULL;
39838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
39938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosPort->portWayType == WAY1_PORT) {
40038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        *pDataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
40138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosPort->portWayType == WAY2_PORT) {
40238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDataBuffer[0] = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
40338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pDataBuffer[1] = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
40438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
40538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
40638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
40738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
40838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
40938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
41038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
41138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
41238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_FlushPort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)
41338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
41438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
41538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
416c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
41738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
41838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;
41938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER    *pDataPortBuffer[2] = {NULL, NULL};
42038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_MESSAGE       *message = NULL;
42138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                flushNum = 0;
42238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_S32                semValue = 0;
42338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    int i = 0, maxBufferNum = 0;
42438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
42538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
42638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[portIndex];
42738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
42838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
42938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &semValue);
43038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (semValue == 0)
43138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[portIndex].bufferSemID);
43238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
43338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
43438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
43538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((message != NULL) && (message->messageType != EXYNOS_OMX_CommandFakeBuffer)) {
43638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            bufferHeader = (OMX_BUFFERHEADERTYPE *)message->pCmdData;
43738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            bufferHeader->nFilledLen = 0;
43838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
43938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (portIndex == OUTPUT_PORT_INDEX) {
44038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);
44138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            } else if (portIndex == INPUT_PORT_INDEX) {
44238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);
44338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
44438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
44538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(message);
44638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        message = NULL;
44738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
44838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
44938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OMX_GetFlushBuffer(pExynosPort, pDataPortBuffer);
45038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (portIndex == INPUT_PORT_INDEX) {
45138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pDataPortBuffer[0]->dataValid == OMX_TRUE)
452f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim            Exynos_InputBufferReturn(pOMXComponent, pDataPortBuffer[0]);
45338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pDataPortBuffer[1]->dataValid == OMX_TRUE)
454f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim            Exynos_InputBufferReturn(pOMXComponent, pDataPortBuffer[1]);
45538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (portIndex == OUTPUT_PORT_INDEX) {
45638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pDataPortBuffer[0]->dataValid == OMX_TRUE)
457f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim            Exynos_OutputBufferReturn(pOMXComponent, pDataPortBuffer[0]);
45838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pDataPortBuffer[1]->dataValid == OMX_TRUE)
459f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim            Exynos_OutputBufferReturn(pOMXComponent, pDataPortBuffer[1]);
46038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
46138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
46238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosComponent->bMultiThreadProcess == OMX_TRUE) {
46338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
46438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosPort->processData.bufferHeader != NULL) {
46538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (portIndex == INPUT_PORT_INDEX) {
46638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);
46738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                } else if (portIndex == OUTPUT_PORT_INDEX) {
46838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);
46938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
47038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
47138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_ResetCodecData(&pExynosPort->processData);
47238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
473bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim            maxBufferNum = pExynosPort->portDefinition.nBufferCountActual;
47438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            for (i = 0; i < maxBufferNum; i++) {
47538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                if (pExynosPort->extendBufferHeader[i].bBufferInOMX == OMX_TRUE) {
47638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    if (portIndex == OUTPUT_PORT_INDEX) {
47738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);
47838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    } else if (portIndex == INPUT_PORT_INDEX) {
47938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);
48038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    }
48138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
48238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
48338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
48438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
48538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_ResetCodecData(&pExynosPort->processData);
48638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
48738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
4883b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim    if ((pExynosPort->bufferProcessType == BUFFER_SHARE) &&
4893b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        (portIndex == OUTPUT_PORT_INDEX)){
4903b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
4913b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim
4923b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        if (pOMXComponent->pComponentPrivate == NULL) {
4933b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim            ret = OMX_ErrorBadParameter;
4943b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim            goto EXIT;
4953b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        }
4963b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
4973b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
4983b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim
4993b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        Exynos_OSAL_RefANB_Reset(pVideoDec->hRefHandle);
5003b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim    }
5013b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim
50238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    while(1) {
50338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_S32 cnt = 0;
50438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &cnt);
50538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (cnt <= 0)
50638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            break;
50738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
50838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
50938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_ResetQueue(&pExynosPort->bufferQ);
51038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
51138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
51238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
51338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
51438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
51538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
51638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
51738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent)
51838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
51938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
52038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
52138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
52238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
52338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER    *flushPortBuffer[2] = {NULL, NULL};
52438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                   i = 0, cnt = 0;
52538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
52638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
52738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
52838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent == NULL) {
52938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
53038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
53138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
53238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
53338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
53438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
53538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
53638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
53738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
53838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
53938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
54038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
54138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
54238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
54338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
54438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush start, port:%d", nPortIndex);
54538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
54638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_TRUE;
54738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
54838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
54938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
55038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
55138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[nPortIndex].pauseEvent);
55238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
55338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
55438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
55538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OMX_GetFlushBuffer(pExynosPort, flushPortBuffer);
55638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
55738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)
55838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);
55938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
56038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
56138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, nPortIndex);
56238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexLock(flushPortBuffer[0]->bufferMutex);
56338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pVideoDec->exynos_codec_stop(pOMXComponent, nPortIndex);
56438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexLock(flushPortBuffer[1]->bufferMutex);
56538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OMX_FlushPort(pOMXComponent, nPortIndex);
566c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim    if (pVideoDec->bReconfigDPB == OMX_TRUE)
567c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim        pVideoDec->exynos_codec_reconfigAllBuffers(pOMXComponent, nPortIndex);
568c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim    else if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)
56938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pVideoDec->exynos_codec_enqueueAllBuffer(pOMXComponent, nPortIndex);
57038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_ResetCodecData(&pExynosPort->processData);
57138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
57238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret == OMX_ErrorNone) {
57338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (nPortIndex == INPUT_PORT_INDEX) {
57438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_TRUE;
57538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
57638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
57738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
57838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->getAllDelayBuffer = OMX_FALSE;
57938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->bSaveFlagEOS = OMX_FALSE;
58081a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim            pExynosComponent->bBehaviorEOS = OMX_FALSE;
58138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->reInputData = OMX_FALSE;
58238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
58338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
58438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_FALSE;
58538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush EventCmdComplete, port:%d", nPortIndex);
58638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (bEvent == OMX_TRUE)
58738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
58838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                            pExynosComponent->callbackData,
58938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                            OMX_EventCmdComplete,
59038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                            OMX_CommandFlush, nPortIndex, NULL);
59138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
59238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexUnlock(flushPortBuffer[1]->bufferMutex);
59338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexUnlock(flushPortBuffer[0]->bufferMutex);
59438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
59538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
59638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
59738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__);
59838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
59938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        pExynosComponent->callbackData,
60038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        OMX_EventError,
60138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        ret, 0, NULL);
60238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
60338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
60438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
60538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
60638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
60738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
60838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
609bd09b8148180c902648b5ac57d024f457f852efaSeungBeom KimOMX_ERRORTYPE Exynos_ResolutionUpdate(OMX_COMPONENTTYPE *pOMXComponent)
610bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim{
611bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    OMX_ERRORTYPE                  ret                = OMX_ErrorNone;
612bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent   = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
613bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec          = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
614bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    EXYNOS_OMX_BASEPORT           *pInputPort         = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
615bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    EXYNOS_OMX_BASEPORT           *pOutputPort        = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
616bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim
617bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    pOutputPort->cropRectangle.nTop     = pOutputPort->newCropRectangle.nTop;
618bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    pOutputPort->cropRectangle.nLeft    = pOutputPort->newCropRectangle.nLeft;
619bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    pOutputPort->cropRectangle.nWidth   = pOutputPort->newCropRectangle.nWidth;
620bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    pOutputPort->cropRectangle.nHeight  = pOutputPort->newCropRectangle.nHeight;
621bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim
622bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    pInputPort->portDefinition.format.video.nFrameWidth     = pInputPort->newPortDefinition.format.video.nFrameWidth;
623bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    pInputPort->portDefinition.format.video.nFrameHeight    = pInputPort->newPortDefinition.format.video.nFrameHeight;
624bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    pInputPort->portDefinition.format.video.nStride         = pInputPort->newPortDefinition.format.video.nStride;
625bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    pInputPort->portDefinition.format.video.nSliceHeight    = pInputPort->newPortDefinition.format.video.nSliceHeight;
626bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim
627bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    pOutputPort->portDefinition.nBufferCountActual  = pOutputPort->newPortDefinition.nBufferCountActual;
628bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    pOutputPort->portDefinition.nBufferCountMin     = pOutputPort->newPortDefinition.nBufferCountMin;
629bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim
630bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    Exynos_UpdateFrameSize(pOMXComponent);
631bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim
632bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim    return ret;
633bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim}
634bd09b8148180c902648b5ac57d024f457f852efaSeungBeom Kim
635f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom KimOMX_ERRORTYPE Exynos_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)
63638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
63838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
63938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
64038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;
64138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
64238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
64338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
64438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    bufferHeader = dataBuffer->bufferHeader;
64538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
64638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (bufferHeader != NULL) {
64738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) {
64838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            bufferHeader->hMarkTargetComponent      = exynosOMXInputPort->markType.hMarkTargetComponent;
64938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            bufferHeader->pMarkData                 = exynosOMXInputPort->markType.pMarkData;
65038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            exynosOMXInputPort->markType.hMarkTargetComponent = NULL;
65138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            exynosOMXInputPort->markType.pMarkData = NULL;
65238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
65338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
65438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (bufferHeader->hMarkTargetComponent != NULL) {
65538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (bufferHeader->hMarkTargetComponent == pOMXComponent) {
65638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
65738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                pExynosComponent->callbackData,
65838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                OMX_EventMark,
65938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                                0, 0, bufferHeader->pMarkData);
66038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            } else {
66138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent;
66238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData;
66338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
66438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
66638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferHeader->nFilledLen = 0;
66738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferHeader->nOffset = 0;
66838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);
66938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
67038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
67138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* reset dataBuffer */
67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_ResetDataBuffer(dataBuffer);
67338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
67438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
67538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
67638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
67738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
67838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
67938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
68038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
68138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
682440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    OMX_ERRORTYPE          ret = OMX_ErrorUndefined;
68338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
68438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_MESSAGE    *message = NULL;
68538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER *inputUseBuffer = NULL;
68638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
68738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
68838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
68938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    inputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
69038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
69138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosComponent->currentState != OMX_StateExecuting) {
69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorUndefined;
69338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
69438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
69538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))) {
69638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
69738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (inputUseBuffer->dataValid != OMX_TRUE) {
69838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
69938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (message == NULL) {
70038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorUndefined;
70138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
70238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
70338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
704440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim                Exynos_OSAL_Free(message);
70538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorCodecFlush;
70638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
70738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            inputUseBuffer->bufferHeader  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
71038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            inputUseBuffer->allocSize     = inputUseBuffer->bufferHeader->nAllocLen;
71138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            inputUseBuffer->dataLen       = inputUseBuffer->bufferHeader->nFilledLen;
71238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            inputUseBuffer->remainDataLen = inputUseBuffer->dataLen;
71338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            inputUseBuffer->usedDataLen   = 0;
71438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            inputUseBuffer->dataValid     = OMX_TRUE;
71538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            inputUseBuffer->nFlags        = inputUseBuffer->bufferHeader->nFlags;
71638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            inputUseBuffer->timeStamp     = inputUseBuffer->bufferHeader->nTimeStamp;
71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
71838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Free(message);
71938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
72038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (inputUseBuffer->allocSize <= inputUseBuffer->dataLen)
72138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", inputUseBuffer->allocSize, inputUseBuffer->dataLen);
72238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
72338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
72438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
72538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
72638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
72738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
72838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
72938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
731f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom KimOMX_ERRORTYPE Exynos_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)
73238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
73338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
73438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
73538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
73638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;
73738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
73838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
73938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
74038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    bufferHeader = dataBuffer->bufferHeader;
74138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
74238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (bufferHeader != NULL) {
74338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferHeader->nFilledLen = dataBuffer->remainDataLen;
74438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferHeader->nOffset    = 0;
74538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferHeader->nFlags     = dataBuffer->nFlags;
74638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        bufferHeader->nTimeStamp = dataBuffer->timeStamp;
74738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
7487987a0882319055826a1426b7c31c9424575d34aSeungBeom Kim        if ((exynosOMXOutputPort->bStoreMetaData == OMX_TRUE) && (bufferHeader->nFilledLen > 0))
7493b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim            bufferHeader->nFilledLen = bufferHeader->nAllocLen;
7503b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim
75138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
75238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
75338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData;
75438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
75538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->propagateMarkType.pMarkData = NULL;
75638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
75738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
75838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
75938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"event OMX_BUFFERFLAG_EOS!!!");
76038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
76138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                            pExynosComponent->callbackData,
76238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                            OMX_EventBufferFlag,
76338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                            OUTPUT_PORT_INDEX,
76438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                            bufferHeader->nFlags, NULL);
76538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
76638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
76738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);
76838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
76938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
77038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    /* reset dataBuffer */
77138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_ResetDataBuffer(dataBuffer);
77238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
77338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
77438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
77538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
77638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
77738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
77838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
77938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
78038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
781440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    OMX_ERRORTYPE       ret = OMX_ErrorUndefined;
78238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
78338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_MESSAGE    *message = NULL;
78438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER *outputUseBuffer = NULL;
78538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
78638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
78738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
78838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
78938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
79038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
79138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
79238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
79338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
79438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosComponent->currentState != OMX_StateExecuting) {
79538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorUndefined;
79638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
79738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
79838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){
79938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
80038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (outputUseBuffer->dataValid != OMX_TRUE) {
80138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
80238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (message == NULL) {
80338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorUndefined;
80438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
80538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
80638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
807440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim                Exynos_OSAL_Free(message);
80838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorCodecFlush;
80938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
81038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
81138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
81238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            outputUseBuffer->bufferHeader  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
81338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            outputUseBuffer->allocSize     = outputUseBuffer->bufferHeader->nAllocLen;
81438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            outputUseBuffer->dataLen       = 0; //dataBuffer->bufferHeader->nFilledLen;
81538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            outputUseBuffer->remainDataLen = outputUseBuffer->dataLen;
81638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            outputUseBuffer->usedDataLen   = 0; //dataBuffer->bufferHeader->nOffset;
81738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            outputUseBuffer->dataValid     = OMX_TRUE;
81838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /* dataBuffer->nFlags             = dataBuffer->bufferHeader->nFlags; */
81938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            /* dataBuffer->nTimeStamp         = dataBuffer->bufferHeader->nTimeStamp; */
82038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang/*
82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosPort->bufferProcessType == BUFFER_SHARE)
82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                outputUseBuffer->pPrivate      = outputUseBuffer->bufferHeader->pOutputPortPrivate;
82338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            else if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
82438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosPort->processData.dataBuffer = outputUseBuffer->bufferHeader->pBuffer;
82538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosPort->processData.allocSize  = outputUseBuffer->bufferHeader->nAllocLen;
82638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
82738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang*/
82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
82938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Free(message);
83038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
83138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
83238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
83338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
83438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
83538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
83638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
83738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
83838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
83938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
84054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom KimOMX_BUFFERHEADERTYPE *Exynos_OutputBufferGetQueue_Direct(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
84154cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim{
84254cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    OMX_BUFFERHEADERTYPE  *retBuffer = NULL;
84354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
84454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    EXYNOS_OMX_MESSAGE    *message = NULL;
84554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
84654cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    FunctionIn();
84754cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
84854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    if (pExynosComponent->currentState != OMX_StateExecuting) {
84954cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        retBuffer = NULL;
85054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        goto EXIT;
85154cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
85254cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){
85354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
85454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
85554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
85654cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        if (message == NULL) {
85754cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim            retBuffer = NULL;
85854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim            goto EXIT;
85954cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        }
86054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
86154cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim            Exynos_OSAL_Free(message);
86254cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim            retBuffer = NULL;
86354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim            goto EXIT;
86454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        }
86554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
86654cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        retBuffer  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
86754cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        Exynos_OSAL_Free(message);
86854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    }
86954cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
87054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom KimEXIT:
87154cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    FunctionOut();
87254cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
87354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    return retBuffer;
87454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim}
87554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
87638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR data)
87738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
87838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE       ret = OMX_ErrorNone;
87938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
88038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
88138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
88238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
88338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort= &pExynosComponent->pExynosPort[PortIndex];
88438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
88538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (data == NULL) {
88638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInsufficientResources;
88738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
88838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
88938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
89038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OSAL_Queue(&pExynosPort->codecBufferQ, (void *)data);
89138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != 0) {
89238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorUndefined;
89338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
89438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
89538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);
89638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
89738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
89838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
89938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
90038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
90138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
90238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
90338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
90438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
90538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_CodecBufferDeQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR *data)
90638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
90738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE       ret = OMX_ErrorNone;
90838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
90938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32 tempData;
91038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
91138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
91238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
91338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[PortIndex];
91438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);
91538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    tempData = (OMX_U32)Exynos_OSAL_Dequeue(&pExynosPort->codecBufferQ);
91638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (tempData == NULL) {
91738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        *data = NULL;
91838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorUndefined;
91938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
92038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
92138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    *data = (OMX_PTR)tempData;
92238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
92338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
92438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
92538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
92638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
92738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
92838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
92938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
93038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
93138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_CodecBufferReset(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex)
93238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
93338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE       ret = OMX_ErrorNone;
93438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
93538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
93638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
93738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
93838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort= &pExynosComponent->pExynosPort[PortIndex];
93938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
94038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OSAL_ResetQueue(&pExynosPort->codecBufferQ);
94138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != 0) {
94238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorUndefined;
94338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
94438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
94538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    while (1) {
94638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        int cnt = 0;
9473e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim        Exynos_OSAL_Get_SemaphoreCount(pExynosPort->codecSemID, &cnt);
94838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (cnt > 0)
94938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);
95038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        else
95138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            break;
95238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
95338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = OMX_ErrorNone;
95438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
95538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
95638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
95738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
95838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
95938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
96038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
96138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_VideoDecodeGetParameter(
96238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
96338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_INDEXTYPE  nParamIndex,
96438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_INOUT OMX_PTR     ComponentParameterStructure)
96538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
96638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
96738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
96838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
96938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
97038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
97138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
97238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
97338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (hComponent == NULL) {
97438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
97538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
97638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
97738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
97838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
97938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
98038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
98138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
98238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
98338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
98438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
98538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
98638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
98738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
98838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
98938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
99038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInvalidState;
99138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
99238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
99338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
99438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ComponentParameterStructure == NULL) {
99538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
99638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
99738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
99838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
99938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    switch (nParamIndex) {
100038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case OMX_IndexParamVideoInit:
100138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    {
100238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;
100338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE));
100438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (ret != OMX_ErrorNone) {
100538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
100638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
100738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
100838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        portParam->nPorts           = pExynosComponent->portParam.nPorts;
100938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        portParam->nStartPortNumber = pExynosComponent->portParam.nStartPortNumber;
101038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
101138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
101238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
101338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case OMX_IndexParamVideoPortFormat:
101438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    {
101538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
101638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_U32                         portIndex = portFormat->nPortIndex;
101738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_U32                         index    = portFormat->nIndex;
101838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        EXYNOS_OMX_BASEPORT               *pExynosPort = NULL;
101938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_PARAM_PORTDEFINITIONTYPE   *portDefinition = NULL;
102038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_U32                         supportFormatNum = 0; /* supportFormatNum = N-1 */
102138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
102238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
102338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (ret != OMX_ErrorNone) {
102438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
102538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
102638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
102738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((portIndex >= pExynosComponent->portParam.nPorts)) {
102838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorBadPortIndex;
102938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
103038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
103138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
103238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
103338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (portIndex == INPUT_PORT_INDEX) {
103438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            supportFormatNum = INPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;
103538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (index > supportFormatNum) {
103638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorNoMore;
103738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
103838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
103938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
104038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
104138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            portDefinition = &pExynosPort->portDefinition;
104238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
104338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            portFormat->eCompressionFormat = portDefinition->format.video.eCompressionFormat;
104438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            portFormat->eColorFormat       = portDefinition->format.video.eColorFormat;
104538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            portFormat->xFramerate           = portDefinition->format.video.xFramerate;
104638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else if (portIndex == OUTPUT_PORT_INDEX) {
104738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
104838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            portDefinition = &pExynosPort->portDefinition;
104938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
10503b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim            if ((pExynosPort->bIsANBEnabled == OMX_FALSE) &&
10513b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim                (pExynosPort->bStoreMetaData == OMX_FALSE)) {
105281a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                switch (index) {
105381a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                case supportFormat_0:
105481a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
105581a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->eColorFormat       = OMX_COLOR_FormatYUV420Planar;
105681a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->xFramerate         = portDefinition->format.video.xFramerate;
105781a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    break;
105881a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                case supportFormat_1:
105981a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
106081a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->eColorFormat       = OMX_COLOR_FormatYUV420SemiPlanar;
106181a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->xFramerate         = portDefinition->format.video.xFramerate;
106281a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    break;
106381a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                case supportFormat_2:
106481a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
106581a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->eColorFormat       = OMX_SEC_COLOR_FormatNV12TPhysicalAddress;
106681a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->xFramerate         = portDefinition->format.video.xFramerate;
106781a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    break;
106881a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                case supportFormat_3:
106981a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
107081a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->eColorFormat       = OMX_SEC_COLOR_FormatNV12Tiled;
107181a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->xFramerate         = portDefinition->format.video.xFramerate;
107281a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    break;
107381a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                default:
107481a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    if (index > supportFormat_0) {
107581a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                        ret = OMX_ErrorNoMore;
107681a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                        goto EXIT;
107781a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    }
107881a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    break;
107981a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                }
108081a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim            } else {
108181a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                switch (index) {
108281a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                case supportFormat_0:
108381a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
108481a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->eColorFormat       = OMX_SEC_COLOR_FormatNV12Tiled;
108581a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    portFormat->xFramerate         = portDefinition->format.video.xFramerate;
108681a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    break;
108781a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                default:
108881a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    if (index > supportFormat_0) {
108981a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                        ret = OMX_ErrorNoMore;
109081a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                        goto EXIT;
109181a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    }
109281a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim                    break;
109338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                }
109438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
109538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
109638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNone;
109738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
109838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
109938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef USE_ANB
110038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case OMX_IndexParamGetAndroidNativeBuffer:
110138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    {
110238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_OSAL_GetANBParameter(hComponent, nParamIndex, ComponentParameterStructure);
110338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
110438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
110538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case OMX_IndexParamPortDefinition:
110638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    {
110738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
110838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_U32                       portIndex = portDefinition->nPortIndex;
110938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        EXYNOS_OMX_BASEPORT             *pExynosPort;
111038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
111138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
111238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (ret != OMX_ErrorNone) {
111338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
111438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
111538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
111638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* at this point, GetParameter has done all the verification, we
111738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang         * just dereference things directly here
111838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang         */
111938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
11203b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        if ((pExynosPort->bIsANBEnabled == OMX_TRUE) ||
11213b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim            (pExynosPort->bStoreMetaData == OMX_TRUE)){
112238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            portDefinition->format.video.eColorFormat =
112338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                (OMX_COLOR_FORMATTYPE)Exynos_OSAL_OMX2HalPixelFormat(portDefinition->format.video.eColorFormat);
11243b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "portDefinition->format.video.eColorFormat:0x%x", portDefinition->format.video.eColorFormat);
112538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
1126bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar
1127bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar        // WORKAROUND provided by Google engineer
1128bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar        if (portIndex == OUTPUT_PORT_INDEX &&
1129bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar                (pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
1130bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar            // Decoder actually uses width and height as stride and slice height for buffer copy.
1131bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar            // Changing only at getParam as the internal value may be used elsewhere
1132bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar            portDefinition->format.video.nStride = portDefinition->format.video.nFrameWidth;
1133bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar            portDefinition->format.video.nSliceHeight = portDefinition->format.video.nFrameHeight;
1134bd42692f6f55b3008bec86c23bbfcec5aecd6681Lajos Molnar        }
113538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
113638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
113738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif
113838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    default:
113938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    {
114038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
114138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
114238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
114338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
114438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
114538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
114638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
114738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
114838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
114938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
115038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_VideoDecodeSetParameter(
115138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_HANDLETYPE hComponent,
115238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_INDEXTYPE  nIndex,
115338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_PTR        ComponentParameterStructure)
115438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
115538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
115638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
115738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
115838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
115938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
116038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
116138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
116238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (hComponent == NULL) {
116338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
116438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
116538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
116638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
116738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
116838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
116938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
117038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
117138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
117238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
117338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
117438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
117538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
117638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
117738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
117838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid ) {
117938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInvalidState;
118038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
118138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
118238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
118338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ComponentParameterStructure == NULL) {
118438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
118538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
118638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
118738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
118838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    switch (nIndex) {
118938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case OMX_IndexParamVideoPortFormat:
119038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    {
119138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
119238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_U32                         portIndex = portFormat->nPortIndex;
119338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_U32                         index    = portFormat->nIndex;
119438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        EXYNOS_OMX_BASEPORT               *pExynosPort = NULL;
119538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_PARAM_PORTDEFINITIONTYPE   *portDefinition = NULL;
119638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_U32                         supportFormatNum = 0;
119738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
119838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
119938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (ret != OMX_ErrorNone) {
120038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
120138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
120238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
120338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((portIndex >= pExynosComponent->portParam.nPorts)) {
120438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorBadPortIndex;
120538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
120638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else {
120738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
120838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            portDefinition = &pExynosPort->portDefinition;
120938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
121038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            portDefinition->format.video.eColorFormat       = portFormat->eColorFormat;
121138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            portDefinition->format.video.eCompressionFormat = portFormat->eCompressionFormat;
121238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            portDefinition->format.video.xFramerate         = portFormat->xFramerate;
12133b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim
12143b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "portIndex:%d, portFormat->eColorFormat:0x%x", portIndex, portFormat->eColorFormat);
121538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
121638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
121738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
121838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case OMX_IndexParamPortDefinition:
121938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    {
1220f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim        OMX_PARAM_PORTDEFINITIONTYPE  *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
1221f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim        EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1222f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim        OMX_U32                        portIndex = pPortDefinition->nPortIndex;
1223f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim        EXYNOS_OMX_BASEPORT           *pExynosPort;
122438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_U32 width, height, size;
122538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        OMX_U32 realWidth, realHeight;
12260b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih        OMX_U32 originalWidth, originalHeight;
122738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
122838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (portIndex >= pExynosComponent->portParam.nPorts) {
122938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorBadPortIndex;
123038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
123138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
123238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_OMX_Check_SizeVersion(pPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
123338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (ret != OMX_ErrorNone) {
123438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
123538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
123638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
123738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
123838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
123938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
124038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
124138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorIncorrectStateOperation;
124238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                goto EXIT;
124338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
124438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
1245f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim        if ((pPortDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) ||
1246f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim            ((pVideoDec->bDRMPlayerMode == OMX_TRUE) &&
1247f9c3e26dcd6362937156814d075edef5dc90a497SeungBeom Kim             (pPortDefinition->nBufferCountActual > (pExynosPort->portDefinition.nBufferCountMin + MAX_DISPLAY_EXTRA_BUFFER)))) {
124838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorBadParameter;
124938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
125038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
125138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
12520b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih        originalWidth = pExynosPort->portDefinition.format.video.nFrameWidth;
12530b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih        originalHeight = pExynosPort->portDefinition.format.video.nFrameHeight;
125438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, pPortDefinition, pPortDefinition->nSize);
125538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
125638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef USE_ANB // Modified by Google engineer
125738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* should not affect the format since in ANB case, the caller
125838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                * is providing us a HAL format */
12593b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        if ((pExynosPort->bIsANBEnabled == OMX_TRUE) ||
12603b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim            (pExynosPort->bStoreMetaData == OMX_TRUE)) {
126138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->portDefinition.format.video.eColorFormat =
126238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Hal2OMXPixelFormat(pExynosPort->portDefinition.format.video.eColorFormat);
126338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
126438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif
126538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
126638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        realWidth = pExynosPort->portDefinition.format.video.nFrameWidth;
126738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        realHeight = pExynosPort->portDefinition.format.video.nFrameHeight;
126838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        width = ((realWidth + 15) & (~15));
126938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        height = ((realHeight + 15) & (~15));
127038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        size = (width * height * 3) / 2;
127138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosPort->portDefinition.format.video.nStride = width;
127238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosPort->portDefinition.format.video.nSliceHeight = height;
127338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosPort->portDefinition.nBufferSize = (size > pExynosPort->portDefinition.nBufferSize) ? size : pExynosPort->portDefinition.nBufferSize;
127438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
12750b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih        if (realWidth != originalWidth || realHeight != originalHeight) {
12760b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih            pExynosPort->cropRectangle.nTop = 0;
12770b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih            pExynosPort->cropRectangle.nLeft = 0;
12780b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih            pExynosPort->cropRectangle.nWidth = realWidth;
12790b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih            pExynosPort->cropRectangle.nHeight = realHeight;
12800b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih        }
128148d08f911e9d5c4380344a53b290a0a37023a831SeungBeom Kim
128238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (portIndex == INPUT_PORT_INDEX) {
128338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
128438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->portDefinition.format.video.nFrameWidth = pExynosPort->portDefinition.format.video.nFrameWidth;
128538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->portDefinition.format.video.nFrameHeight = pExynosPort->portDefinition.format.video.nFrameHeight;
128638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->portDefinition.format.video.nStride = width;
128738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosOutputPort->portDefinition.format.video.nSliceHeight = height;
12880b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih            // if resetting the output port size, also reset the crop size for the output port;
12890b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih            // otherwise, output crop will not be updated when setting up the output port because
12900b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih            // the output size would not have changed after we updated it here
12910b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih            if (realWidth != originalWidth || realHeight != originalHeight) {
12920b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih                pExynosOutputPort->cropRectangle.nTop = 0;
12930b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih                pExynosOutputPort->cropRectangle.nLeft = 0;
12940b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih                pExynosOutputPort->cropRectangle.nWidth = realWidth;
12950b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih                pExynosOutputPort->cropRectangle.nHeight = realHeight;
12960b7b68d5e2898d0a8e199a0b74f0d9c38a6e0c1cRobert Shih            }
129738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
129838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            switch (pExynosOutputPort->portDefinition.format.video.eColorFormat) {
129938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            case OMX_COLOR_FormatYUV420Planar:
130038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            case OMX_COLOR_FormatYUV420SemiPlanar:
130138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            case OMX_SEC_COLOR_FormatNV12TPhysicalAddress:
130238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosOutputPort->portDefinition.nBufferSize = (width * height * 3) / 2;
130338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                break;
130438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            case OMX_SEC_COLOR_FormatNV12Tiled:
130538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosOutputPort->portDefinition.nBufferSize =
130638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) +
130738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1);
130838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                break;
130938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            default:
131038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Color format is not support!! use default YUV size!!");
131138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                ret = OMX_ErrorUnsupportedSetting;
131238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                break;
131338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
131438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
131538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
131638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                pExynosOutputPort->portDefinition.nBufferSize =
131738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) +
131838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                    calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1);
131938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            }
132038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
132138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
132238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
132338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef USE_ANB
132438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case OMX_IndexParamEnableAndroidBuffers:
132538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    case OMX_IndexParamUseAndroidNativeBuffer:
13263b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim    case OMX_IndexParamStoreMetaDataBuffer:
132738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    {
132838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_OSAL_SetANBParameter(hComponent, nIndex, ComponentParameterStructure);
132938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
133038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
133138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif
1332e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim    case OMX_IndexParamEnableThumbnailMode:
1333e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim    {
1334e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        EXYNOS_OMX_VIDEO_THUMBNAILMODE *pThumbnailMode = (EXYNOS_OMX_VIDEO_THUMBNAILMODE *)ComponentParameterStructure;
1335e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
1336e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim
1337e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        ret = Exynos_OMX_Check_SizeVersion(pThumbnailMode, sizeof(EXYNOS_OMX_VIDEO_THUMBNAILMODE));
1338e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        if (ret != OMX_ErrorNone) {
1339e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim            goto EXIT;
1340e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        }
1341e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim
1342e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        pVideoDec->bThumbnailMode = pThumbnailMode->bEnable;
1343e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        if (pVideoDec->bThumbnailMode == OMX_TRUE) {
1344e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim            EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1345e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim            pExynosOutputPort->portDefinition.nBufferCountMin = 1;
1346e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim            pExynosOutputPort->portDefinition.nBufferCountActual = 1;
1347e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        }
1348e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim
1349e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        ret = OMX_ErrorNone;
1350e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim    }
1351e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        break;
135238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    default:
135338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    {
135438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure);
135538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
135638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
135738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
135838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
135938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
136038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
136138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
136238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
136338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
136438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
136538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_VideoDecodeGetConfig(
136638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_HANDLETYPE hComponent,
136738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_INDEXTYPE nIndex,
136838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_PTR pComponentConfigStructure)
136938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
137038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
137138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
137238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
137338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
137438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
137538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
137638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (hComponent == NULL) {
137738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
137838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
137938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
138038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
138138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
138238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
138338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
138438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
138538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
138638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
138738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
138838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
138938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
139038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pComponentConfigStructure == NULL) {
139138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
139238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
139338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
139438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
139538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInvalidState;
139638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
139738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
139838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
139938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    switch (nIndex) {
140038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    default:
140138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_OMX_GetConfig(hComponent, nIndex, pComponentConfigStructure);
140238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
140338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
140438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
140538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
140638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
140738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
140838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
140938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
141038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
141138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_VideoDecodeSetConfig(
141238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_HANDLETYPE hComponent,
141338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_INDEXTYPE nIndex,
141438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_PTR pComponentConfigStructure)
141538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
141638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE           ret = OMX_ErrorNone;
141738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
141838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
141938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
142038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
142138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
142238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (hComponent == NULL) {
142338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
142438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
142538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
142638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
142738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
142838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
142938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
143038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
143138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
143238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
143338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
143438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
143538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
143638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pComponentConfigStructure == NULL) {
143738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
143838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
143938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
144038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
144138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInvalidState;
144238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
144338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
144438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
144538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    switch (nIndex) {
144638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    default:
144738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = Exynos_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure);
144838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        break;
144938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
145038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
145138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
145238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
145338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
145438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
145538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
145638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
145738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_VideoDecodeGetExtensionIndex(
145838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_HANDLETYPE  hComponent,
145938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_IN OMX_STRING      cParameterName,
146038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_OUT OMX_INDEXTYPE *pIndexType)
146138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
146238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE           ret = OMX_ErrorNone;
146338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
146438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
146538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
146638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionIn();
146738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
146838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (hComponent == NULL) {
146938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
147038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
147138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
147238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
147338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
147438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (ret != OMX_ErrorNone) {
147538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
147638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
147738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
147838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
147938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
148038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
148138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
148238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
148338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
148438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((cParameterName == NULL) || (pIndexType == NULL)) {
148538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
148638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
148738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
148838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
148938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorInvalidState;
149038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
149138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
149238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
149338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef USE_ANB
1494e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_ANB) == 0) {
149538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamEnableAndroidBuffers;
1496e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        goto EXIT;
1497e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim    }
1498e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_GET_ANB) == 0) {
149938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamGetAndroidNativeBuffer;
1500e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        goto EXIT;
1501e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim    }
1502e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_USE_ANB) == 0) {
150338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamUseAndroidNativeBuffer;
1504e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        goto EXIT;
1505e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim    }
150638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif
1507e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) {
1508e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        *pIndexType = OMX_IndexParamEnableThumbnailMode;
1509e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim        goto EXIT;
1510e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim    }
15113b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim#ifdef USE_STOREMETADATA
15123b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER) == 0) {
15133b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamStoreMetaDataBuffer;
15143b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        goto EXIT;
15153b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim    }
15163b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim#endif
1517e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim
1518e8aae8edcacf01c588e0bd0ba2c3ca64aa54e107SeungBeom Kim    ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);
151938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
152038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
152138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    FunctionOut();
152238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
152338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
152438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
152538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
152638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#ifdef USE_ANB
152738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Shared_ANBBufferToData(EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_DATA *pData, EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_PLANE nPlane)
152838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
152938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
153038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32 width, height;
153101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin    ExynosVideoPlane planes[MAX_BUFFER_PLANE];
153238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
153301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin    memset(planes, 0, sizeof(planes));
153438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
15353b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim    width = pExynosPort->portDefinition.format.video.nFrameWidth;
15363b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim    height = pExynosPort->portDefinition.format.video.nFrameHeight;
153738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
15383b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim    if ((pExynosPort->bIsANBEnabled == OMX_TRUE) ||
15393b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        (pExynosPort->bStoreMetaData == OMX_TRUE)) {
15403b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        OMX_U32 stride;
154138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if ((pUseBuffer->bufferHeader != NULL) && (pUseBuffer->bufferHeader->pBuffer != NULL)) {
15423b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim            if (pExynosPort->bIsANBEnabled == OMX_TRUE) {
15431e339948fd5bcee9312ea3701e7b9ace092b37dbSeungBeom Kim                Exynos_OSAL_LockANBHandle(pUseBuffer->bufferHeader->pBuffer, width, height, pExynosPort->portDefinition.format.video.eColorFormat, &stride, planes);
15443b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim            } else if (pExynosPort->bStoreMetaData == OMX_TRUE) {
15453b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim                Exynos_OSAL_LockMetaData(pUseBuffer->bufferHeader->pBuffer, width, height, pExynosPort->portDefinition.format.video.eColorFormat, &stride, planes);
15463b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim            }
154738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pUseBuffer->dataLen = sizeof(void *);
154838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        } else {
154938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
155038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            ret = OMX_ErrorBadParameter;
155138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            goto EXIT;
155238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        }
155338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
155438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
155538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
155638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
155738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
155838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
155938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPlane == TWO_PLANE) {
156038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Case of Shared Buffer, Only support two PlaneBuffer */
156101fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        pData->buffer.multiPlaneBuffer.dataBuffer[0] = planes[0].addr;
156201fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        pData->buffer.multiPlaneBuffer.fd[0] = planes[0].fd;
156301fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        pData->buffer.multiPlaneBuffer.dataBuffer[1] = planes[1].addr;
156401fa64f5f096690c95b2fd1d3a875d7a1aeefe53Dima Zavin        pData->buffer.multiPlaneBuffer.fd[1] = planes[1].fd;
156538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
156638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not support plane");
156738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNotImplemented;
156838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
156938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
157038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
157138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->allocSize     = pUseBuffer->allocSize;
157238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->dataLen       = pUseBuffer->dataLen;
157338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->usedDataLen   = pUseBuffer->usedDataLen;
157438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->remainDataLen = pUseBuffer->remainDataLen;
157538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->timeStamp     = pUseBuffer->timeStamp;
157638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->nFlags        = pUseBuffer->nFlags;
157738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->pPrivate      = pUseBuffer->pPrivate;
157838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->bufferHeader  = pUseBuffer->bufferHeader;
157938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
158038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
158138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
158238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
158338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
158438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Shared_DataToANBBuffer(EXYNOS_OMX_DATA *pData, EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_BASEPORT *pExynosPort)
158538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
158638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
158738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
158838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->bufferHeader          = pData->bufferHeader;
158938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->allocSize             = pData->allocSize;
159038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->dataLen               = pData->dataLen;
159138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->usedDataLen           = pData->usedDataLen;
159238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->remainDataLen         = pData->remainDataLen;
159338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->timeStamp             = pData->timeStamp;
159438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->nFlags                = pData->nFlags;
159538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->pPrivate              = pData->pPrivate;
159638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
159738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pUseBuffer->bufferHeader == NULL) ||
159838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        (pUseBuffer->bufferHeader->pBuffer == NULL)) {
159938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorUndefined;
160038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
160138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
160238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
160338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosPort->bIsANBEnabled == OMX_TRUE) {
16041e339948fd5bcee9312ea3701e7b9ace092b37dbSeungBeom Kim        Exynos_OSAL_UnlockANBHandle(pUseBuffer->bufferHeader->pBuffer);
16053b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim    } else if (pExynosPort->bStoreMetaData == OMX_TRUE) {
16063b1c2e30b8c73bb51c3e2c93504e3571ab851268SeungBeom Kim        Exynos_OSAL_UnlockMetaData(pUseBuffer->bufferHeader->pBuffer);
160738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
160838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
160938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
161038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
161138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
161238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
161338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
161438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
161538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
161638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang#endif
1617