1962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim/*
2962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim *
3962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * Copyright 2012 Samsung Electronics S.LSI Co. LTD
4962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim *
5962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * Licensed under the Apache License, Version 2.0 (the "License");
6962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * you may not use this file except in compliance with the License.
7962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * You may obtain a copy of the License at
8962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim *
9962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim *      http://www.apache.org/licenses/LICENSE-2.0
10962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim *
11962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * Unless required by applicable law or agreed to in writing, software
12962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * distributed under the License is distributed on an "AS IS" BASIS,
13962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * See the License for the specific language governing permissions and
15962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * limitations under the License.
16962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim */
17962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
18962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim/*
19962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * @file        Exynos_OMX_VencControl.c
20962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * @brief
21962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
22962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * @version     2.0.0
23962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim * @history
24962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim *   2012.02.20 : Create
25962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim */
26962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
27962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include <stdio.h>
28962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include <stdlib.h>
29962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include <string.h>
30962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include "Exynos_OMX_Macros.h"
31962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include "Exynos_OSAL_Event.h"
32962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include "Exynos_OMX_Venc.h"
33962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include "Exynos_OMX_VencControl.h"
34962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include "Exynos_OMX_Basecomponent.h"
35962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include "Exynos_OSAL_Thread.h"
36962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include "Exynos_OSAL_Semaphore.h"
37962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include "Exynos_OSAL_Mutex.h"
38962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include "Exynos_OSAL_ETC.h"
39962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include "Exynos_OSAL_SharedMemory.h"
40962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
41962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#ifdef USE_ANB
42962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include "Exynos_OSAL_Android.h"
43962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#endif
44962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
45962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#undef  EXYNOS_LOG_TAG
46962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#define EXYNOS_LOG_TAG    "EXYNOS_VIDEO_ENCCONTROL"
47962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#define EXYNOS_LOG_OFF
48962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim//#define EXYNOS_TRACE_ON
49962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#include "Exynos_OSAL_Log.h"
50962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
51962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
52962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_UseBuffer(
53962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_HANDLETYPE            hComponent,
54962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,
55962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_U32                   nPortIndex,
56962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_PTR                   pAppPrivate,
57962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_U32                   nSizeBytes,
58962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_U8                   *pBuffer)
59962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
60962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE          ret = OMX_ErrorNone;
61962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
62962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
63962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
64962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
65962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_U32                i = 0;
66962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
67962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
68962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
69962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (hComponent == NULL) {
70962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
71962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
72962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
73962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
74962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
75962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ret != OMX_ErrorNone) {
76962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
77962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
78962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
79962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pOMXComponent->pComponentPrivate == NULL) {
80962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
81962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
82962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
83962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
84962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
85962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (nPortIndex >= pExynosComponent->portParam.nPorts) {
86962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadPortIndex;
87962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
88962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
89f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
90f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim
91962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pExynosPort->portState != OMX_StateIdle) {
92962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorIncorrectStateOperation;
93962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
94962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
95962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
96962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
97962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadPortIndex;
98962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
99962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
100962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
101962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
102962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (temp_bufferHeader == NULL) {
103962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorInsufficientResources;
104962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
105962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
106962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
107962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
108962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
109962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
110962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
111962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ASSIGNED | HEADER_STATE_ALLOCATED);
112962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
113962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            temp_bufferHeader->pBuffer        = pBuffer;
114962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            temp_bufferHeader->nAllocLen      = nSizeBytes;
115962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            temp_bufferHeader->pAppPrivate    = pAppPrivate;
116962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (nPortIndex == INPUT_PORT_INDEX)
117962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
118962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            else
119962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
120962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
121962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort->assignedBufferNum++;
122962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
123962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                pExynosPort->portDefinition.bPopulated = OMX_TRUE;
124962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
125962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
126962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
127962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
128962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            *ppBufferHdr = temp_bufferHeader;
129962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorNone;
130962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
131962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
132962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
133962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
134962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OSAL_Free(temp_bufferHeader);
135962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = OMX_ErrorInsufficientResources;
136962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
137962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
138962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
139962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
140962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
141962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
142962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
143962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
144962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_HANDLETYPE            hComponent,
145962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_INOUT OMX_BUFFERHEADERTYPE **ppBuffer,
146962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_U32                   nPortIndex,
147962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_PTR                   pAppPrivate,
148962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_U32                   nSizeBytes)
149962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
150962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE          ret = OMX_ErrorNone;
151962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
152962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
153954a542741ba9592fd227362612a00dcc2554ee5SeungBeom Kim    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
154962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
155962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
156962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_U8                *temp_buffer = NULL;
15791f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim    int                    temp_buffer_fd = -1;
158962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_U32                i = 0;
15921015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim    MEMORY_TYPE            mem_type;
160962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
161962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
162962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
163962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (hComponent == NULL) {
164962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
165962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
166962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
167962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
168962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
169962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ret != OMX_ErrorNone) {
170962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
171962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
172962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
173962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pOMXComponent->pComponentPrivate == NULL) {
174962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
175962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
176962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
177962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
178954a542741ba9592fd227362612a00dcc2554ee5SeungBeom Kim    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
179962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
180962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (nPortIndex >= pExynosComponent->portParam.nPorts) {
181962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadPortIndex;
182962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
183962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
184f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
185962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim/*
186962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pExynosPort->portState != OMX_StateIdle ) {
187962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorIncorrectStateOperation;
188962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
189962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
190962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim*/
191962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
192962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadPortIndex;
193962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
194962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
195962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
196962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
19721015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim        mem_type = NORMAL_MEMORY;
198962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    } else {
19921015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim        mem_type = SYSTEM_MEMORY;
20021015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim    }
201954a542741ba9592fd227362612a00dcc2554ee5SeungBeom Kim    temp_buffer = Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, nSizeBytes, mem_type);
20221015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim    if (temp_buffer == NULL) {
20321015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim        ret = OMX_ErrorInsufficientResources;
20421015d703f7036313fffc6d5dda821e81ac52a59SeungBeom Kim        goto EXIT;
205962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
206954a542741ba9592fd227362612a00dcc2554ee5SeungBeom Kim    temp_buffer_fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, temp_buffer);
207962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
208962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
209962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (temp_bufferHeader == NULL) {
210954a542741ba9592fd227362612a00dcc2554ee5SeungBeom Kim        Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, temp_buffer);
211962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorInsufficientResources;
212962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
213962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
214962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
215962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
216962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
217962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
218962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
21991f44a5dded6f2b54c919f74d18bc43f86175713SeungBeom Kim            pExynosPort->extendBufferHeader[i].buf_fd[0] = temp_buffer_fd;
220962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED);
221962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
222962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            temp_bufferHeader->pBuffer        = temp_buffer;
223962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            temp_bufferHeader->nAllocLen      = nSizeBytes;
224962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            temp_bufferHeader->pAppPrivate    = pAppPrivate;
225962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (nPortIndex == INPUT_PORT_INDEX)
226962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
227962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            else
228962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
229962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort->assignedBufferNum++;
230962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
231962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                pExynosPort->portDefinition.bPopulated = OMX_TRUE;
232962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
233962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
234962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
235962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
236962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            *ppBuffer = temp_bufferHeader;
237962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorNone;
238962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
239962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
240962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
241962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
242962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OSAL_Free(temp_bufferHeader);
243954a542741ba9592fd227362612a00dcc2554ee5SeungBeom Kim    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, temp_buffer);
244962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
245962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = OMX_ErrorInsufficientResources;
246962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
247962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
248962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
249962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
250962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
251962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
252962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
253962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_FreeBuffer(
254962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_HANDLETYPE hComponent,
255962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_U32        nPortIndex,
256962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr)
257962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
258962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE          ret = OMX_ErrorNone;
259962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
260962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
261954a542741ba9592fd227362612a00dcc2554ee5SeungBeom Kim    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
262962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
263962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
264962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_U8                *temp_buffer = NULL;
265962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_U32                i = 0;
266962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
267962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
268962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
269962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (hComponent == NULL) {
270962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
271962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
272962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
273962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
274962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
275962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ret != OMX_ErrorNone) {
276962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
277962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
278962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
279962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pOMXComponent->pComponentPrivate == NULL) {
280962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
281962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
282962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
283962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
284954a542741ba9592fd227362612a00dcc2554ee5SeungBeom Kim    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
285f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim
286f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim    if (nPortIndex >= pExynosComponent->portParam.nPorts) {
287f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim        ret = OMX_ErrorBadPortIndex;
288f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim        goto EXIT;
289f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim    }
290962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
291962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
292962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
293962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadPortIndex;
294962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
295962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
296962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
297962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if ((pExynosPort->portState != OMX_StateLoaded) && (pExynosPort->portState != OMX_StateInvalid)) {
298962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        (*(pExynosComponent->pCallbacks->EventHandler)) (pOMXComponent,
299962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                        pExynosComponent->callbackData,
300962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                        (OMX_U32)OMX_EventError,
301962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                        (OMX_U32)OMX_ErrorPortUnpopulated,
302962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                        nPortIndex, NULL);
303962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
304962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
3053e79a27e56341c1ae1038773875512dbd37de3b7SeungBeom Kim    for (i = 0; i < /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM; i++) {
306962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (((pExynosPort->bufferStateAllocate[i] | BUFFER_STATE_FREE) != 0) && (pExynosPort->extendBufferHeader[i].OMXBufferHeader != NULL)) {
307962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer == pBufferHdr->pBuffer) {
308962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ALLOCATED) {
309954a542741ba9592fd227362612a00dcc2554ee5SeungBeom Kim                    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
310962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                    pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer = NULL;
311962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                    pBufferHdr->pBuffer = NULL;
312962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                } else if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ASSIGNED) {
313962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                    ; /* None*/
314962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                }
315962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                pExynosPort->assignedBufferNum--;
316962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                if (pExynosPort->bufferStateAllocate[i] & HEADER_STATE_ALLOCATED) {
317962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                    Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader);
318962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                    pExynosPort->extendBufferHeader[i].OMXBufferHeader = NULL;
319962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                    pBufferHdr = NULL;
320962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                }
321962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                pExynosPort->bufferStateAllocate[i] = BUFFER_STATE_FREE;
322962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                ret = OMX_ErrorNone;
323962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                goto EXIT;
324962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
325962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
326962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
327962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
328962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
329962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ret == OMX_ErrorNone) {
330962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (pExynosPort->assignedBufferNum == 0) {
331962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosPort->unloadedResource signal set");
332962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
333962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            Exynos_OSAL_SemaphorePost(pExynosPort->unloadedResource);
334962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
335962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort->portDefinition.bPopulated = OMX_FALSE;
336962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
337962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
338962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
339962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
340962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
341962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
342962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
343962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
344962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
345962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
346962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE                 ret = OMX_ErrorNone;
347962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT             *pExynosPort = NULL;
348962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_BUFFERHEADERTYPE         *temp_bufferHeader = NULL;
349962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_U8                       *temp_buffer = NULL;
350962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_U32                       bufferSize = 0;
351962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_PARAM_PORTDEFINITIONTYPE  portDefinition;
352962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
353962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = OMX_ErrorTunnelingUnsupported;
354962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
355962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
356962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
357962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
358962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
359962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
360962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE ret = OMX_ErrorNone;
361962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT* pExynosPort = NULL;
362962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_BUFFERHEADERTYPE* temp_bufferHeader = NULL;
363962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_U8 *temp_buffer = NULL;
364962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_U32 bufferSize = 0;
365962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
366962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = OMX_ErrorTunnelingUnsupported;
367962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
368962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
369962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
370962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
371962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_ComponentTunnelRequest(
372962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_HANDLETYPE hComp,
373962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_U32        nPort,
374962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_HANDLETYPE hTunneledComp,
375962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_U32        nTunneledPort,
376962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_INOUT OMX_TUNNELSETUPTYPE *pTunnelSetup)
377962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
378962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE ret = OMX_ErrorNone;
379962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
380962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = OMX_ErrorTunnelingUnsupported;
381962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
382962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
383962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
384962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
385962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_GetFlushBuffer(EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_DATABUFFER *pDataBuffer[])
386962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
387962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE ret = OMX_ErrorNone;
388962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
389962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
390962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
391962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    *pDataBuffer = NULL;
392962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
393962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pExynosPort->portWayType == WAY1_PORT) {
394962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        *pDataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
395962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    } else if (pExynosPort->portWayType == WAY2_PORT) {
396962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pDataBuffer[0] = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
397962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pDataBuffer[1] = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
398962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
399962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
400962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
401962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
402962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
403962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
404962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
405962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
406962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_FlushPort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)
407962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
408962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE          ret = OMX_ErrorNone;
409962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
410962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
411962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;
412962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_DATABUFFER    *pDataPortBuffer[2] = {NULL, NULL};
413962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_MESSAGE       *message = NULL;
414962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_U32                flushNum = 0;
415962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_S32                semValue = 0;
416962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    int i = 0, maxBufferNum = 0;
417962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
418962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
419962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosPort = &pExynosComponent->pExynosPort[portIndex];
420962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
421962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
422962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &semValue);
423962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (semValue == 0)
424962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[portIndex].bufferSemID);
425962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
426962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
427962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
428962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((message != NULL) && (message->messageType != EXYNOS_OMX_CommandFakeBuffer)) {
429962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            bufferHeader = (OMX_BUFFERHEADERTYPE *)message->pCmdData;
430962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            bufferHeader->nFilledLen = 0;
431962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
432962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (portIndex == OUTPUT_PORT_INDEX) {
433962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);
434962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            } else if (portIndex == INPUT_PORT_INDEX) {
435962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);
436962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
437962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
438962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_Free(message);
439962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        message = NULL;
440962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
441962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
442962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OMX_GetFlushBuffer(pExynosPort, pDataPortBuffer);
443962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (portIndex == INPUT_PORT_INDEX) {
444962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (pDataPortBuffer[0]->dataValid == OMX_TRUE)
445f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim            Exynos_InputBufferReturn(pOMXComponent, pDataPortBuffer[0]);
446962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (pDataPortBuffer[1]->dataValid == OMX_TRUE)
447f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim            Exynos_InputBufferReturn(pOMXComponent, pDataPortBuffer[1]);
448962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    } else if (portIndex == OUTPUT_PORT_INDEX) {
449962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (pDataPortBuffer[0]->dataValid == OMX_TRUE)
450f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim            Exynos_OutputBufferReturn(pOMXComponent, pDataPortBuffer[0]);
451962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (pDataPortBuffer[1]->dataValid == OMX_TRUE)
452f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim            Exynos_OutputBufferReturn(pOMXComponent, pDataPortBuffer[1]);
453962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
454962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
455962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pExynosComponent->bMultiThreadProcess == OMX_TRUE) {
456962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
457962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (pExynosPort->processData.bufferHeader != NULL) {
458962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                if (portIndex == INPUT_PORT_INDEX) {
459962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                    Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);
460962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                } else if (portIndex == OUTPUT_PORT_INDEX) {
461962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                    Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);
462962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                }
463962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
464962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            Exynos_ResetCodecData(&pExynosPort->processData);
465962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
466962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            maxBufferNum = pExynosPort->portDefinition.nBufferCountActual;
467962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            for (i = 0; i < maxBufferNum; i++) {
468962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                if (pExynosPort->extendBufferHeader[i].bBufferInOMX == OMX_TRUE) {
469962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                    if (portIndex == OUTPUT_PORT_INDEX) {
470962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                        Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);
471962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                    } else if (portIndex == INPUT_PORT_INDEX) {
472962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                        Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);
473962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                    }
474962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                }
475962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
476962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
477962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    } else {
478962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_ResetCodecData(&pExynosPort->processData);
479962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
480962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
481962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    while(1) {
482962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_S32 cnt = 0;
483962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &cnt);
484962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (cnt <= 0)
485962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            break;
486962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
487962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
488962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OSAL_ResetQueue(&pExynosPort->bufferQ);
489962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
490962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
491962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
492962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
493962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
494962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
495962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
496962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent)
497962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
498962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE             ret = OMX_ErrorNone;
499962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
500962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
501962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
502962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_DATABUFFER    *flushPortBuffer[2] = {NULL, NULL};
503962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_U32                   i = 0, cnt = 0;
504962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
505962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
506962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
507962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pOMXComponent == NULL) {
508962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
509962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
510962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
511962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
512962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ret != OMX_ErrorNone) {
513962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
514962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
515962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
516962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pOMXComponent->pComponentPrivate == NULL) {
517962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
518962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
519962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
520962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
521962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
522962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
523962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush start, port:%d", nPortIndex);
524962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
525962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_TRUE;
526962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
527962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
528962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
529962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    } else {
530962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[nPortIndex].pauseEvent);
531962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
532962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
533962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
534962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OMX_GetFlushBuffer(pExynosPort, flushPortBuffer);
535962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
536962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)
537962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);
538962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
539962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
540962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pVideoEnc->exynos_codec_bufferProcessRun(pOMXComponent, nPortIndex);
541962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OSAL_MutexLock(flushPortBuffer[0]->bufferMutex);
542962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pVideoEnc->exynos_codec_stop(pOMXComponent, nPortIndex);
543962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OSAL_MutexLock(flushPortBuffer[1]->bufferMutex);
544962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = Exynos_OMX_FlushPort(pOMXComponent, nPortIndex);
545962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)
546962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        pVideoEnc->exynos_codec_enqueueAllBuffer(pOMXComponent, nPortIndex);
547962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_ResetCodecData(&pExynosPort->processData);
548962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
549962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ret == OMX_ErrorNone) {
550962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (nPortIndex == INPUT_PORT_INDEX) {
551962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_TRUE;
552962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
553962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
554962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
555962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosComponent->getAllDelayBuffer = OMX_FALSE;
556962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosComponent->bSaveFlagEOS = OMX_FALSE;
55781a947bab57706cee77c14a4f47522ae8b400689SeungBeom Kim            pExynosComponent->bBehaviorEOS = OMX_FALSE;
558962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosComponent->reInputData = OMX_FALSE;
559962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
560962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
561962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_FALSE;
562d03573a4a182b0a36eaa16fb7638d98429d1c3fbSeungBeom Kim        Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush EventCmdComplete, port:%d", nPortIndex);
563962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (bEvent == OMX_TRUE)
564962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
565962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                            pExynosComponent->callbackData,
566962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                            OMX_EventCmdComplete,
567962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                            OMX_CommandFlush, nPortIndex, NULL);
568962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
569962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OSAL_MutexUnlock(flushPortBuffer[1]->bufferMutex);
570962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OSAL_MutexUnlock(flushPortBuffer[0]->bufferMutex);
571962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
572962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
573962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
574962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__);
575962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
576962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                        pExynosComponent->callbackData,
577962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                        OMX_EventError,
578962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                        ret, 0, NULL);
579962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
580962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
581962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
582962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
583962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
584962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
585962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
586f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom KimOMX_ERRORTYPE Exynos_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)
587962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
588962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE          ret = OMX_ErrorNone;
589962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
590962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT      *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
591962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_BUFFERHEADERTYPE  *bufferHeader = NULL;
592962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
593962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
594962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
595962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    bufferHeader = dataBuffer->bufferHeader;
596962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
597962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (bufferHeader != NULL) {
598962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) {
599962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            bufferHeader->hMarkTargetComponent      = exynosOMXInputPort->markType.hMarkTargetComponent;
600962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            bufferHeader->pMarkData                 = exynosOMXInputPort->markType.pMarkData;
601962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            exynosOMXInputPort->markType.hMarkTargetComponent = NULL;
602962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            exynosOMXInputPort->markType.pMarkData = NULL;
603962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
604962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
605962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (bufferHeader->hMarkTargetComponent != NULL) {
606962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (bufferHeader->hMarkTargetComponent == pOMXComponent) {
607962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
608962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                                pExynosComponent->callbackData,
609962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                                OMX_EventMark,
610962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                                0, 0, bufferHeader->pMarkData);
611962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            } else {
612962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent;
613962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData;
614962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
615962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
616962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
617962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        bufferHeader->nFilledLen = 0;
618962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        bufferHeader->nOffset = 0;
619962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);
620962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
621962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
622962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    /* reset dataBuffer */
623962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_ResetDataBuffer(dataBuffer);
624962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
625962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
626962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
627962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
628962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
629962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
630962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
631962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
632962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
633440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    OMX_ERRORTYPE          ret = OMX_ErrorUndefined;
634962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
635962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_MESSAGE    *message = NULL;
636962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_DATABUFFER *inputUseBuffer = NULL;
637962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
638962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
639962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
640962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    inputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
641962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
642962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pExynosComponent->currentState != OMX_StateExecuting) {
643962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorUndefined;
644962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
645962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
646962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))) {
647962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
648962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (inputUseBuffer->dataValid != OMX_TRUE) {
649962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
650962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (message == NULL) {
651962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                ret = OMX_ErrorUndefined;
652962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                goto EXIT;
653962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
654962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
655440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim                Exynos_OSAL_Free(message);
656962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                ret = OMX_ErrorCodecFlush;
657962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                goto EXIT;
658962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
659962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
660962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            inputUseBuffer->bufferHeader  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
661962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            inputUseBuffer->allocSize     = inputUseBuffer->bufferHeader->nAllocLen;
662962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            inputUseBuffer->dataLen       = inputUseBuffer->bufferHeader->nFilledLen;
663962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            inputUseBuffer->remainDataLen = inputUseBuffer->dataLen;
664962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            inputUseBuffer->usedDataLen   = 0;
665962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            inputUseBuffer->dataValid     = OMX_TRUE;
666962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            inputUseBuffer->nFlags        = inputUseBuffer->bufferHeader->nFlags;
667962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            inputUseBuffer->timeStamp     = inputUseBuffer->bufferHeader->nTimeStamp;
668962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
669962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            Exynos_OSAL_Free(message);
670962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
671962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (inputUseBuffer->allocSize <= inputUseBuffer->dataLen)
672962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", inputUseBuffer->allocSize, inputUseBuffer->dataLen);
673962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
674962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorNone;
675962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
676962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
677962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
678962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
679962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
680962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
681962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
682f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom KimOMX_ERRORTYPE Exynos_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)
683962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
684962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE          ret = OMX_ErrorNone;
685962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
686962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT      *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
687962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_BUFFERHEADERTYPE  *bufferHeader = NULL;
688962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
689962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
690962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
691962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    bufferHeader = dataBuffer->bufferHeader;
692962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
693962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (bufferHeader != NULL) {
694962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        bufferHeader->nFilledLen = dataBuffer->remainDataLen;
695962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        bufferHeader->nOffset    = 0;
696962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        bufferHeader->nFlags     = dataBuffer->nFlags;
697962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        bufferHeader->nTimeStamp = dataBuffer->timeStamp;
698962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
699962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
700962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
701962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData;
702962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
703962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosComponent->propagateMarkType.pMarkData = NULL;
704962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
705962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
706962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
707962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"event OMX_BUFFERFLAG_EOS!!!");
708962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
709962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                            pExynosComponent->callbackData,
710962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                            OMX_EventBufferFlag,
711962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                            OUTPUT_PORT_INDEX,
712962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                            bufferHeader->nFlags, NULL);
713962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
714962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
715962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);
716962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
717962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
718962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    /* reset dataBuffer */
719962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_ResetDataBuffer(dataBuffer);
720962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
721962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
722962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
723962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
724962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
725962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
726962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
727962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
728962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
729440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim    OMX_ERRORTYPE       ret = OMX_ErrorUndefined;
730962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
731962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_MESSAGE    *message = NULL;
732962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_DATABUFFER *outputUseBuffer = NULL;
733962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
734962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
735962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
736962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
737962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
738962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    } else if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
739962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
740962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
741962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
742962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pExynosComponent->currentState != OMX_StateExecuting) {
743962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorUndefined;
744962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
745962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
746962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){
747962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
748962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (outputUseBuffer->dataValid != OMX_TRUE) {
749962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
750962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (message == NULL) {
751962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                ret = OMX_ErrorUndefined;
752962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                goto EXIT;
753962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
754962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
755440252358aa79ef5e411b8f57c3359376e650e51SeungBeom Kim                Exynos_OSAL_Free(message);
756962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                ret = OMX_ErrorCodecFlush;
757962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                goto EXIT;
758962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
759962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
760962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            outputUseBuffer->bufferHeader  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
761962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            outputUseBuffer->allocSize     = outputUseBuffer->bufferHeader->nAllocLen;
762962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            outputUseBuffer->dataLen       = 0; //dataBuffer->bufferHeader->nFilledLen;
763962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            outputUseBuffer->remainDataLen = outputUseBuffer->dataLen;
764962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            outputUseBuffer->usedDataLen   = 0; //dataBuffer->bufferHeader->nOffset;
765962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            outputUseBuffer->dataValid     = OMX_TRUE;
766962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            /* dataBuffer->nFlags             = dataBuffer->bufferHeader->nFlags; */
767962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            /* dataBuffer->nTimeStamp         = dataBuffer->bufferHeader->nTimeStamp; */
768962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim/*
769962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (pExynosPort->bufferProcessType == BUFFER_SHARE)
770962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                outputUseBuffer->pPrivate      = outputUseBuffer->bufferHeader->pOutputPortPrivate;
771962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            else if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
772962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                pExynosPort->processData.dataBuffer = outputUseBuffer->bufferHeader->pBuffer;
773962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                pExynosPort->processData.allocSize  = outputUseBuffer->bufferHeader->nAllocLen;
774962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
775962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim*/
776962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
777962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            Exynos_OSAL_Free(message);
778962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
779962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorNone;
780962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
781962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
782962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
783962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
784962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
785962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
786962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
787962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
78854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom KimOMX_BUFFERHEADERTYPE *Exynos_OutputBufferGetQueue_Direct(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
78954cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim{
79054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    OMX_BUFFERHEADERTYPE  *retBuffer = NULL;
79154cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
79254cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    EXYNOS_OMX_MESSAGE    *message = NULL;
79354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
79454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    FunctionIn();
79554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
79654cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    if (pExynosComponent->currentState != OMX_StateExecuting) {
79754cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        retBuffer = NULL;
79854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        goto EXIT;
79954cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
80054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){
80154cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
80254cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
80354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
80454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        if (message == NULL) {
80554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim            retBuffer = NULL;
80654cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim            goto EXIT;
80754cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        }
80854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
80954cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim            Exynos_OSAL_Free(message);
81054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim            retBuffer = NULL;
81154cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim            goto EXIT;
81254cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        }
81354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
81454cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        retBuffer  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
81554cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim        Exynos_OSAL_Free(message);
81654cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    }
81754cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
81854cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom KimEXIT:
81954cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    FunctionOut();
82054cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
82154cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim    return retBuffer;
82254cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim}
82354cbf397a1e177ea34b304b6951d4f7eb571c259SeungBeom Kim
824962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR data)
825962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
826962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE       ret = OMX_ErrorNone;
827962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
828962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
829962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
830962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
831962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosPort= &pExynosComponent->pExynosPort[PortIndex];
832962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
833962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (data == NULL) {
834962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorInsufficientResources;
835962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
836962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
837962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
838962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = Exynos_OSAL_Queue(&pExynosPort->codecBufferQ, (void *)data);
839962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ret != 0) {
840962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorUndefined;
841962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
842962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
843962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);
844962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
845962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = OMX_ErrorNone;
846962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
847962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
848962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
849962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
850962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
851962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
852962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
853962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_CodecBufferDeQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR *data)
854962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
855962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE       ret = OMX_ErrorNone;
856962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
857962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_U32 tempData;
858962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
859962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
860962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
861962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosPort = &pExynosComponent->pExynosPort[PortIndex];
862962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);
863962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    tempData = (OMX_U32)Exynos_OSAL_Dequeue(&pExynosPort->codecBufferQ);
864962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (tempData == NULL) {
865962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        *data = NULL;
866962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorUndefined;
867962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
868962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
869962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    *data = (OMX_PTR)tempData;
870962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
871962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = OMX_ErrorNone;
872962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
873962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
874962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
875962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
876962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
877962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
878962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
879962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_CodecBufferReset(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex)
880962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
881962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE       ret = OMX_ErrorNone;
882962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
883962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
884962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
885962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
886962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosPort= &pExynosComponent->pExynosPort[PortIndex];
887962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
888962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = Exynos_OSAL_ResetQueue(&pExynosPort->codecBufferQ);
889962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ret != 0) {
890962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorUndefined;
891962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
892962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
893962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    while (1) {
894962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        int cnt = 0;
895962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_Get_SemaphoreCount(pExynosPort->codecSemID, &cnt);
896962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (cnt > 0)
897962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);
898962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        else
899962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            break;
900962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
901962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = OMX_ErrorNone;
902962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
903962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
904962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
905962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
906962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
907962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
908962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
909962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_VideoEncodeGetParameter(
910962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_HANDLETYPE hComponent,
911962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_INDEXTYPE  nParamIndex,
912962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_INOUT OMX_PTR     ComponentParameterStructure)
913962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
914962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE             ret = OMX_ErrorNone;
915962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
916962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
917962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
918962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
919962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
920962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
921962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (hComponent == NULL) {
922962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
923962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
924962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
925962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
926962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
927962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ret != OMX_ErrorNone) {
928962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
929962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
930962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
931962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pOMXComponent->pComponentPrivate == NULL) {
932962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
933962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
934962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
935962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
936962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
937962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pExynosComponent->currentState == OMX_StateInvalid ) {
938962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorInvalidState;
939962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
940962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
941962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
942962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ComponentParameterStructure == NULL) {
943962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
944962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
945962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
946962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
947962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    switch (nParamIndex) {
948962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexParamVideoInit:
949962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
950962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;
951962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE));
952962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (ret != OMX_ErrorNone) {
953962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
954962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
955962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
956962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        portParam->nPorts           = pExynosComponent->portParam.nPorts;
957962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        portParam->nStartPortNumber = pExynosComponent->portParam.nStartPortNumber;
958962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorNone;
959962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
960962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
961962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexParamVideoPortFormat:
962962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
963962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
964962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                         portIndex = portFormat->nPortIndex;
965962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                         index    = portFormat->nIndex;
966962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_BASEPORT            *pExynosPort = NULL;
967962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_PARAM_PORTDEFINITIONTYPE   *portDefinition = NULL;
968962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                         supportFormatNum = 0;
969962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
970962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
971962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (ret != OMX_ErrorNone) {
972962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
973962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
974962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
975962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((portIndex >= pExynosComponent->portParam.nPorts)) {
976962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
977962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
978962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
979962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
980962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
981962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (portIndex == INPUT_PORT_INDEX) {
982962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
983962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portDefinition = &pExynosPort->portDefinition;
984962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
985962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            switch (index) {
986962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            case supportFormat_0:
987962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
988962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->eColorFormat       = OMX_COLOR_FormatYUV420Planar;
989962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->xFramerate           = portDefinition->format.video.xFramerate;
990962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                break;
991962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            case supportFormat_1:
992962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
993962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->eColorFormat       = OMX_COLOR_FormatYUV420SemiPlanar;
994962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->xFramerate         = portDefinition->format.video.xFramerate;
995962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                break;
996962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            case supportFormat_2:
997962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
998962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->eColorFormat       = OMX_SEC_COLOR_FormatNV12Tiled;
999962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->xFramerate         = portDefinition->format.video.xFramerate;
1000962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                break;
1001962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            case supportFormat_3:
1002962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
1003962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->eColorFormat       = OMX_SEC_COLOR_FormatNV21Linear;
1004962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->xFramerate         = portDefinition->format.video.xFramerate;
1005962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                break;
1006962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            case supportFormat_4:
1007962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
1008962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->eColorFormat       = OMX_COLOR_FormatAndroidOpaque;
1009962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                portFormat->xFramerate         = portDefinition->format.video.xFramerate;
1010962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                break;
1011962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            default:
1012962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                if (index > supportFormat_0) {
1013962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                    ret = OMX_ErrorNoMore;
1014962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                    goto EXIT;
1015962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                }
1016962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                break;
1017962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
1018962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        } else if (portIndex == OUTPUT_PORT_INDEX) {
1019962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            supportFormatNum = OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;
1020962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (index > supportFormatNum) {
1021962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                ret = OMX_ErrorNoMore;
1022962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                goto EXIT;
1023962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
1024962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1025962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1026962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portDefinition = &pExynosPort->portDefinition;
1027962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1028962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portFormat->eCompressionFormat = portDefinition->format.video.eCompressionFormat;
1029962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portFormat->eColorFormat       = portDefinition->format.video.eColorFormat;
1030962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portFormat->xFramerate         = portDefinition->format.video.xFramerate;
1031962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1032962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorNone;
1033962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1034962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1035962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexParamVideoBitrate:
1036962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1037962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_VIDEO_PARAM_BITRATETYPE     *videoRateControl = (OMX_VIDEO_PARAM_BITRATETYPE *)ComponentParameterStructure;
1038962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                          portIndex = videoRateControl->nPortIndex;
1039962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_BASEPORT             *pExynosPort = NULL;
1040962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_VIDEOENC_COMPONENT   *pVideoEnc = NULL;
1041962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_PARAM_PORTDEFINITIONTYPE    *portDefinition = NULL;
1042962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1043962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((portIndex != OUTPUT_PORT_INDEX)) {
1044962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1045962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1046962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        } else {
1047962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1048962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1049962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portDefinition = &pExynosPort->portDefinition;
1050962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1051962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            videoRateControl->eControlRate = pVideoEnc->eControlRate[portIndex];
1052962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            videoRateControl->nTargetBitrate = portDefinition->format.video.nBitrate;
1053962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1054962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorNone;
1055962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1056962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1057962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexParamVideoQuantization:
1058962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1059962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_VIDEO_PARAM_QUANTIZATIONTYPE  *videoQuantizationControl = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)ComponentParameterStructure;
1060962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                            portIndex = videoQuantizationControl->nPortIndex;
1061962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_BASEPORT               *pExynosPort = NULL;
1062962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_VIDEOENC_COMPONENT     *pVideoEnc = NULL;
1063962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_PARAM_PORTDEFINITIONTYPE      *portDefinition = NULL;
1064962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1065962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((portIndex != OUTPUT_PORT_INDEX)) {
1066962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1067962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1068962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        } else {
1069962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1070962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1071962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portDefinition = &pExynosPort->portDefinition;
1072962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1073962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            videoQuantizationControl->nQpI = pVideoEnc->quantization.nQpI;
1074962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            videoQuantizationControl->nQpP = pVideoEnc->quantization.nQpP;
1075962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            videoQuantizationControl->nQpB = pVideoEnc->quantization.nQpB;
1076962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1077962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorNone;
1078962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1079962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1080962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexParamPortDefinition:
1081962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1082962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
1083962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                       portIndex = portDefinition->nPortIndex;
1084962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_BASEPORT          *pExynosPort;
1085962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1086962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (portIndex >= pExynosComponent->portParam.nPorts) {
1087962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1088962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1089962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1090962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = Exynos_OMX_Check_SizeVersion(portDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
1091962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (ret != OMX_ErrorNone) {
1092962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1093962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1094962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1095962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1096962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_Memcpy(portDefinition, &pExynosPort->portDefinition, portDefinition->nSize);
1097962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1098962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#ifdef USE_STOREMETADATA
1099962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((portIndex == 0) && (pExynosPort->bStoreMetaData == OMX_TRUE)) {
1100962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portDefinition->nBufferSize = MAX_INPUT_METADATA_BUFFER_SIZE;
1101962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1102962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#endif
1103962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1104962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1105e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim    case OMX_IndexParamVideoIntraRefresh:
1106e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim    {
1107e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        OMX_VIDEO_PARAM_INTRAREFRESHTYPE *pIntraRefresh = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)ComponentParameterStructure;
1108e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        OMX_U32                           portIndex = pIntraRefresh->nPortIndex;
1109e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        EXYNOS_OMX_VIDEOENC_COMPONENT    *pVideoEnc = NULL;
1110e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim
1111e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        if (portIndex != OUTPUT_PORT_INDEX) {
1112e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1113e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim            goto EXIT;
1114e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        } else {
1115e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1116e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim            pIntraRefresh->eRefreshMode = pVideoEnc->intraRefresh.eRefreshMode;
1117e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim            pIntraRefresh->nAirMBs = pVideoEnc->intraRefresh.nAirMBs;
1118e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim            pIntraRefresh->nAirRef = pVideoEnc->intraRefresh.nAirRef;
1119e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim            pIntraRefresh->nCirMBs = pVideoEnc->intraRefresh.nCirMBs;
1120e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        }
1121e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        ret = OMX_ErrorNone;
1122e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim    }
1123e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        break;
1124962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    default:
1125962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1126962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
1127962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1128962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1129962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1130962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1131962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
1132962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
1133962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1134962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
1135962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
1136962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_VideoEncodeSetParameter(
1137962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_HANDLETYPE hComponent,
1138962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_INDEXTYPE  nIndex,
1139962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_PTR        ComponentParameterStructure)
1140962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
1141962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE             ret = OMX_ErrorNone;
1142962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
1143962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1144962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
1145962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1146962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
1147962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1148962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (hComponent == NULL) {
1149962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
1150962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1151962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1152962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1153962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1154962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ret != OMX_ErrorNone) {
1155962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1156962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1157962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1158962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pOMXComponent->pComponentPrivate == NULL) {
1159962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
1160962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1161962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1162962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1163962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1164962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pExynosComponent->currentState == OMX_StateInvalid ) {
1165962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorInvalidState;
1166962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1167962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1168962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1169962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ComponentParameterStructure == NULL) {
1170962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
1171962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1172962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1173962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1174962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    switch (nIndex) {
1175962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexParamVideoPortFormat:
1176962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1177962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
1178962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                         portIndex = portFormat->nPortIndex;
1179962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                         index    = portFormat->nIndex;
1180962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_BASEPORT            *pExynosPort = NULL;
1181962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_PARAM_PORTDEFINITIONTYPE   *portDefinition = NULL;
1182962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                         supportFormatNum = 0;
1183962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1184962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
1185962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (ret != OMX_ErrorNone) {
1186962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1187962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1188962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1189962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((portIndex >= pExynosComponent->portParam.nPorts)) {
1190962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1191962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1192962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        } else {
1193962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1194962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portDefinition = &pExynosPort->portDefinition;
1195962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1196962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portDefinition->format.video.eColorFormat       = portFormat->eColorFormat;
1197962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portDefinition->format.video.eCompressionFormat = portFormat->eCompressionFormat;
1198962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portDefinition->format.video.xFramerate         = portFormat->xFramerate;
1199962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1200962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1201962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1202962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexParamVideoBitrate:
1203962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1204962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_VIDEO_PARAM_BITRATETYPE     *videoRateControl = (OMX_VIDEO_PARAM_BITRATETYPE *)ComponentParameterStructure;
1205962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                          portIndex = videoRateControl->nPortIndex;
1206962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_BASEPORT             *pExynosPort = NULL;
1207962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_VIDEOENC_COMPONENT   *pVideoEnc = NULL;
1208962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_PARAM_PORTDEFINITIONTYPE    *portDefinition = NULL;
1209962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1210962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((portIndex != OUTPUT_PORT_INDEX)) {
1211962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1212962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1213962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        } else {
1214962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1215962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1216962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portDefinition = &pExynosPort->portDefinition;
1217962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1218962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pVideoEnc->eControlRate[portIndex] = videoRateControl->eControlRate;
1219962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portDefinition->format.video.nBitrate = videoRateControl->nTargetBitrate;
1220962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1221962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorNone;
1222962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1223962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1224962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexParamVideoQuantization:
1225962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1226962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_VIDEO_PARAM_QUANTIZATIONTYPE *videoQuantizationControl = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)ComponentParameterStructure;
1227962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                           portIndex = videoQuantizationControl->nPortIndex;
1228962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_BASEPORT              *pExynosPort = NULL;
1229962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_VIDEOENC_COMPONENT    *pVideoEnc = NULL;
1230962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_PARAM_PORTDEFINITIONTYPE     *portDefinition = NULL;
1231962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1232962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((portIndex != OUTPUT_PORT_INDEX)) {
1233962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1234962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1235962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        } else {
1236962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1237962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1238962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            portDefinition = &pExynosPort->portDefinition;
1239962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1240962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pVideoEnc->quantization.nQpI = videoQuantizationControl->nQpI;
1241962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pVideoEnc->quantization.nQpP = videoQuantizationControl->nQpP;
1242962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pVideoEnc->quantization.nQpB = videoQuantizationControl->nQpB;
1243962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1244962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorNone;
1245962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1246962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1247962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexParamPortDefinition:
1248962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1249962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
1250962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                       portIndex = pPortDefinition->nPortIndex;
1251962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_BASEPORT          *pExynosPort;
1252962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32 width, height, size;
1253962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1254962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (portIndex >= pExynosComponent->portParam.nPorts) {
1255962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1256962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1257962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1258962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = Exynos_OMX_Check_SizeVersion(pPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
1259962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (ret != OMX_ErrorNone) {
1260962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1261962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1262962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1263962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1264962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1265962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1266962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
1267962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                ret = OMX_ErrorIncorrectStateOperation;
1268962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                goto EXIT;
1269962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            }
1270962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1271d03573a4a182b0a36eaa16fb7638d98429d1c3fbSeungBeom Kim        if (pPortDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) {
1272962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadParameter;
1273962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1274962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1275962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1276962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, pPortDefinition, pPortDefinition->nSize);
1277962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if (portIndex == INPUT_PORT_INDEX) {
1278962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
1279962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            Exynos_UpdateFrameSize(pOMXComponent);
1280962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosOutputPort->portDefinition.nBufferSize: %d",
1281962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim                            pExynosOutputPort->portDefinition.nBufferSize);
1282962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1283962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorNone;
1284962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1285962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1286e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim    case OMX_IndexParamVideoIntraRefresh:
1287e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim    {
1288e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        OMX_VIDEO_PARAM_INTRAREFRESHTYPE *pIntraRefresh = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)ComponentParameterStructure;
1289e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        OMX_U32                           portIndex = pIntraRefresh->nPortIndex;
1290e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        EXYNOS_OMX_VIDEOENC_COMPONENT    *pVideoEnc = NULL;
1291e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim
1292e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        if (portIndex != OUTPUT_PORT_INDEX) {
1293e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1294e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim            goto EXIT;
1295e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        } else {
1296e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
1297e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim            if (pIntraRefresh->eRefreshMode == OMX_VIDEO_IntraRefreshCyclic) {
1298e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim                pVideoEnc->intraRefresh.eRefreshMode = pIntraRefresh->eRefreshMode;
1299e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim                pVideoEnc->intraRefresh.nCirMBs = pIntraRefresh->nCirMBs;
1300e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim                Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_VIDEO_IntraRefreshCyclic Enable, nCirMBs: %d",
1301e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim                                pVideoEnc->intraRefresh.nCirMBs);
1302e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim            } else {
1303e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim                ret = OMX_ErrorUnsupportedSetting;
1304e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim                goto EXIT;
1305e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim            }
1306e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        }
1307e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        ret = OMX_ErrorNone;
1308e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim    }
1309e1b99ca8589f7f5bc0b019f7b50b8776a8f85bf0SeungBeom Kim        break;
1310962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#ifdef USE_STOREMETADATA
1311962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexParamStoreMetaDataBuffer:
1312962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1313962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = Exynos_OSAL_SetANBParameter(hComponent, nIndex, ComponentParameterStructure);
1314962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1315962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1316962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#endif
1317962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    default:
1318962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1319962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = Exynos_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure);
1320962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1321962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1322962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1323962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1324962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
1325962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
1326962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1327962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
1328962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
1329962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1330962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_VideoEncodeGetConfig(
1331962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_HANDLETYPE hComponent,
1332962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_INDEXTYPE nIndex,
1333962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_PTR pComponentConfigStructure)
1334962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
1335962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE             ret = OMX_ErrorNone;
1336962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
1337962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1338962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1339962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
1340962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1341962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (hComponent == NULL || pComponentConfigStructure == NULL) {
1342962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
1343962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1344962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1345962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1346962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1347962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ret != OMX_ErrorNone) {
1348962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1349962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1350962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pOMXComponent->pComponentPrivate == NULL) {
1351962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
1352962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1353962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1354962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1355962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pExynosComponent->currentState == OMX_StateInvalid) {
1356962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorInvalidState;
1357962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1358962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1359962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1360962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    switch (nIndex) {
1361962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexConfigVideoBitrate:
1362962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1363962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_VIDEO_CONFIG_BITRATETYPE *pEncodeBitrate = (OMX_VIDEO_CONFIG_BITRATETYPE *)pComponentConfigStructure;
1364962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                       portIndex = pEncodeBitrate->nPortIndex;
1365962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_BASEPORT          *pExynosPort = NULL;
1366962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1367962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((portIndex != OUTPUT_PORT_INDEX)) {
1368962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1369962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1370962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        } else {
1371962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1372962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pEncodeBitrate->nEncodeBitrate = pExynosPort->portDefinition.format.video.nBitrate;
1373962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1374962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1375962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1376962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexConfigVideoFramerate:
1377962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1378962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_CONFIG_FRAMERATETYPE *pFramerate = (OMX_CONFIG_FRAMERATETYPE *)pComponentConfigStructure;
1379962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                   portIndex = pFramerate->nPortIndex;
1380962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
1381962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1382962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((portIndex != OUTPUT_PORT_INDEX)) {
1383962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1384962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1385962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        } else {
1386962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1387962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pFramerate->xEncodeFramerate = pExynosPort->portDefinition.format.video.xFramerate;
1388962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1389962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1390962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1391962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    default:
1392962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = Exynos_OMX_GetConfig(hComponent, nIndex, pComponentConfigStructure);
1393962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1394962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1395962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1396962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
1397962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
1398962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1399962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
1400962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
1401962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1402962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_VideoEncodeSetConfig(
1403962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_HANDLETYPE hComponent,
1404962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_INDEXTYPE nIndex,
1405962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_PTR pComponentConfigStructure)
1406962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1407962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE             ret = OMX_ErrorNone;
1408962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
1409962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1410962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1411962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
1412962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1413962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (hComponent == NULL || pComponentConfigStructure == NULL) {
1414962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
1415962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1416962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1417962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1418962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1419962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ret != OMX_ErrorNone) {
1420962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1421962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1422962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pOMXComponent->pComponentPrivate == NULL) {
1423962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
1424962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1425962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1426962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1427962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pExynosComponent->currentState == OMX_StateInvalid) {
1428962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorInvalidState;
1429962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1430962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1431962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1432962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    switch (nIndex) {
1433962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexConfigVideoBitrate:
1434962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1435962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_VIDEO_CONFIG_BITRATETYPE *pEncodeBitrate = (OMX_VIDEO_CONFIG_BITRATETYPE *)pComponentConfigStructure;
1436962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                       portIndex = pEncodeBitrate->nPortIndex;
1437962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_BASEPORT          *pExynosPort = NULL;
1438962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1439962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((portIndex != OUTPUT_PORT_INDEX)) {
1440962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1441962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1442962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        } else {
1443962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1444962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort->portDefinition.format.video.nBitrate = pEncodeBitrate->nEncodeBitrate;
1445962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1446962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1447962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1448962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexConfigVideoFramerate:
1449962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1450962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_CONFIG_FRAMERATETYPE *pFramerate = (OMX_CONFIG_FRAMERATETYPE *)pComponentConfigStructure;
1451962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32                   portIndex = pFramerate->nPortIndex;
1452962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
1453962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1454962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((portIndex != OUTPUT_PORT_INDEX)) {
1455962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1456962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1457962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        } else {
1458962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1459962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pExynosPort->portDefinition.format.video.xFramerate = pFramerate->xEncodeFramerate;
1460962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1461962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1462962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1463962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    case OMX_IndexConfigVideoIntraVOPRefresh:
1464962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    {
1465962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_CONFIG_INTRAREFRESHVOPTYPE *pIntraRefreshVOP = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)pComponentConfigStructure;
1466962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        EXYNOS_OMX_VIDEOENC_COMPONENT *pVEncBase = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle);
1467962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        OMX_U32 portIndex = pIntraRefreshVOP->nPortIndex;
1468962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1469962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        if ((portIndex != OUTPUT_PORT_INDEX)) {
1470962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            ret = OMX_ErrorBadPortIndex;
1471962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            goto EXIT;
1472962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        } else {
1473962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim            pVEncBase->IntraRefreshVOP = pIntraRefreshVOP->IntraRefreshVOP;
1474962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        }
1475962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1476962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1477962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    default:
1478962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = Exynos_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure);
1479962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        break;
1480962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1481962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1482962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
1483962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
1484962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1485962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
1486962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
1487962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1488962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimOMX_ERRORTYPE Exynos_OMX_VideoEncodeGetExtensionIndex(
1489962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_HANDLETYPE  hComponent,
1490962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_IN OMX_STRING      cParameterName,
1491962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_OUT OMX_INDEXTYPE *pIndexType)
1492962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim{
1493962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_ERRORTYPE             ret = OMX_ErrorNone;
1494962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
1495962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1496962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1497962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionIn();
1498962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1499962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (hComponent == NULL) {
1500962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
1501962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1502962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1503962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1504962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1505962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (ret != OMX_ErrorNone) {
1506962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1507962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1508962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1509962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pOMXComponent->pComponentPrivate == NULL) {
1510962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
1511962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1512962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1513962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1514962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1515962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if ((cParameterName == NULL) || (pIndexType == NULL)) {
1516962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorBadParameter;
1517962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1518962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1519962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (pExynosComponent->currentState == OMX_StateInvalid) {
1520962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = OMX_ErrorInvalidState;
1521962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        goto EXIT;
1522962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1523962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1524962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#ifdef USE_STOREMETADATA
1525962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER) == 0) {
1526962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamStoreMetaDataBuffer;
1527962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    } else {
1528962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim        ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);
1529962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    }
1530962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#else
1531962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);
1532962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim#endif
1533962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1534962568fbba2f0bdf13ccae937238e9e586181241SeungBeom KimEXIT:
1535962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    FunctionOut();
1536962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim
1537962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim    return ret;
1538962568fbba2f0bdf13ccae937238e9e586181241SeungBeom Kim}
1539