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